diff --git a/integration/typescript/tutorials/semantic-conventions.mdx b/integration/typescript/tutorials/semantic-conventions.mdx
index c487e78..b842b76 100644
--- a/integration/typescript/tutorials/semantic-conventions.mdx
+++ b/integration/typescript/tutorials/semantic-conventions.mdx
@@ -84,7 +84,7 @@ span.setType("llm");
span.setAttributes({
"langwatch.user.id": "user-123",
"langwatch.thread.id": "thread-456",
- "langwatch.streaming": false,
+ "langwatch.gen_ai.streaming": false,
});
```
@@ -109,7 +109,7 @@ await tracer.withActiveSpan("llm-operation", async (span) => {
"langwatch.span.type": "llm",
"langwatch.user.id": "user-123",
"langwatch.thread.id": "thread-456",
- "langwatch.streaming": false,
+ "langwatch.gen_ai.streaming": false,
// ... more attributes with autocomplete
});
});
@@ -144,11 +144,11 @@ LangWatch provides a comprehensive set of custom attributes for LLM-specific obs
| `langwatch.user.id` | string | User identifier | `"user-123"` |
| `langwatch.thread.id` | string | Conversation thread identifier | `"thread-456"` |
| `langwatch.customer.id` | string | Customer identifier | `"customer-789"` |
-| `langwatch.streaming` | boolean | Whether the operation involves streaming | `true`, `false` |
+| `langwatch.gen_ai.streaming` | boolean | Whether the operation involves streaming | `true`, `false` |
| `langwatch.input` | string/object | Input data for the span | `"Hello, how are you?"` |
| `langwatch.output` | string/object | Output data from the span | `"I'm doing well, thank you!"` |
| `langwatch.contexts` | array | RAG contexts for retrieval-augmented generation | Array of document contexts |
-| `langwatch.tags` | array | Tags for categorizing spans | `["chat", "greeting"]` |
+| `langwatch.labels` | array | Labels for categorizing spans | `["chat", "greeting"]` |
| `langwatch.params` | object | Parameter data for operations | `{ temperature: 0.7 }` |
| `langwatch.metrics` | object | Custom metrics data | `{ response_time: 1250 }` |
| `langwatch.timestamps` | object | Timing information for events | `{ start: 1234567890 }` |
@@ -186,6 +186,90 @@ LangWatch provides a comprehensive set of custom attributes for LLM-specific obs
| `langwatch.langchain.run.tags` | array | Run-specific tags | `["production", "chain"]` |
| `langwatch.langchain.tags` | array | LangChain operation tags | `["langchain", "llm"]` |
+### Using SDK Constants
+
+Instead of using raw attribute strings, both SDKs provide typed constants you can import:
+
+
+
+```typescript TypeScript
+import { attributes } from "langwatch";
+
+span.setAttributes({
+ [attributes.ATTR_LANGWATCH_SPAN_TYPE]: "llm",
+ [attributes.ATTR_LANGWATCH_USER_ID]: "user-123",
+ [attributes.ATTR_LANGWATCH_THREAD_ID]: "thread-456",
+ [attributes.ATTR_LANGWATCH_LABELS]: ["chat", "greeting"],
+ [attributes.ATTR_LANGWATCH_STREAMING]: false,
+});
+```
+
+```python Python
+from langwatch.attributes import AttributeKey
+
+span.set_attribute(AttributeKey.LangWatchSpanType, "llm")
+span.set_attribute(AttributeKey.LangWatchCustomerId, "customer-789")
+span.set_attribute(AttributeKey.LangWatchThreadId, "thread-456")
+span.set_attribute(AttributeKey.LangWatchPromptHandle, "customer-support-greeting")
+```
+
+
+
+
+
+**TypeScript** — `import { attributes } from "langwatch"`
+
+| Constant | Value |
+|----------|-------|
+| `ATTR_LANGWATCH_INPUT` | `langwatch.input` |
+| `ATTR_LANGWATCH_OUTPUT` | `langwatch.output` |
+| `ATTR_LANGWATCH_SPAN_TYPE` | `langwatch.span.type` |
+| `ATTR_LANGWATCH_RAG_CONTEXTS` | `langwatch.contexts` |
+| `ATTR_LANGWATCH_METRICS` | `langwatch.metrics` |
+| `ATTR_LANGWATCH_SDK_VERSION` | `langwatch.sdk.version` |
+| `ATTR_LANGWATCH_SDK_NAME` | `langwatch.sdk.name` |
+| `ATTR_LANGWATCH_SDK_LANGUAGE` | `langwatch.sdk.language` |
+| `ATTR_LANGWATCH_TIMESTAMPS` | `langwatch.timestamps` |
+| `ATTR_LANGWATCH_EVALUATION_CUSTOM` | `langwatch.evaluation.custom` |
+| `ATTR_LANGWATCH_PARAMS` | `langwatch.params` |
+| `ATTR_LANGWATCH_CUSTOMER_ID` | `langwatch.customer.id` |
+| `ATTR_LANGWATCH_THREAD_ID` | `langwatch.thread.id` |
+| `ATTR_LANGWATCH_USER_ID` | `langwatch.user.id` |
+| `ATTR_LANGWATCH_LABELS` | `langwatch.labels` |
+| `ATTR_LANGWATCH_STREAMING` | `langwatch.gen_ai.streaming` |
+| `ATTR_LANGWATCH_PROMPT_ID` | `langwatch.prompt.id` |
+| `ATTR_LANGWATCH_PROMPT_HANDLE` | `langwatch.prompt.handle` |
+| `ATTR_LANGWATCH_PROMPT_VERSION_ID` | `langwatch.prompt.version.id` |
+| `ATTR_LANGWATCH_PROMPT_VERSION_NUMBER` | `langwatch.prompt.version.number` |
+| `ATTR_LANGWATCH_PROMPT_SELECTED_ID` | `langwatch.prompt.selected.id` |
+| `ATTR_LANGWATCH_PROMPT_VARIABLES` | `langwatch.prompt.variables` |
+
+**Python** — `from langwatch.attributes import AttributeKey`
+
+| Constant | Value |
+|----------|-------|
+| `AttributeKey.LangWatchInput` | `langwatch.input` |
+| `AttributeKey.LangWatchOutput` | `langwatch.output` |
+| `AttributeKey.LangWatchSpanType` | `langwatch.span.type` |
+| `AttributeKey.LangWatchRAGContexts` | `langwatch.rag_contexts` |
+| `AttributeKey.LangWatchMetrics` | `langwatch.metrics` |
+| `AttributeKey.LangWatchSDKVersion` | `langwatch.sdk.version` |
+| `AttributeKey.LangWatchSDKName` | `langwatch.sdk.name` |
+| `AttributeKey.LangWatchSDKLanguage` | `langwatch.sdk.language` |
+| `AttributeKey.LangWatchTimestamps` | `langwatch.timestamps` |
+| `AttributeKey.LangWatchEventEvaluationCustom` | `langwatch.evaluation.custom` |
+| `AttributeKey.LangWatchParams` | `langwatch.params` |
+| `AttributeKey.LangWatchCustomerId` | `langwatch.customer.id` |
+| `AttributeKey.LangWatchThreadId` | `langwatch.thread.id` |
+| `AttributeKey.LangWatchPromptId` | `langwatch.prompt.id` |
+| `AttributeKey.LangWatchPromptHandle` | `langwatch.prompt.handle` |
+| `AttributeKey.LangWatchPromptVersionId` | `langwatch.prompt.version.id` |
+| `AttributeKey.LangWatchPromptVersionNumber` | `langwatch.prompt.version.number` |
+| `AttributeKey.LangWatchPromptSelectedId` | `langwatch.prompt.selected.id` |
+| `AttributeKey.LangWatchPromptVariables` | `langwatch.prompt.variables` |
+
+
+
## Best Practices
### Attribute Naming
@@ -214,15 +298,15 @@ Use appropriate data types and formats:
```typescript
// ✅ Good: Proper data types
span.setAttributes({
- "langwatch.streaming": false, // boolean
+ "langwatch.gen_ai.streaming": false, // boolean
"langwatch.user.id": "user-123", // string
"langwatch.prompt.version.number": 2, // number
- "langwatch.tags": ["chat", "greeting"], // array
+ "langwatch.labels": ["chat", "greeting"], // array
});
// ❌ Avoid: Inconsistent data types
span.setAttributes({
- "langwatch.streaming": "false", // string instead of boolean
+ "langwatch.gen_ai.streaming": "false", // string instead of boolean
"langwatch.prompt.version.number": "2", // string instead of number
});
```