> ## Documentation Index
> Fetch the complete documentation index at: https://tracevell.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Trace Methods

> [tab] TypeScript
>
> Laminar.setTraceSessionId(sessionId)
>
> Group this trace with others in a session.
>
> **Parameters:**
>
> | Name | Type | Description |
> | - | - | - |
> | `sessionId` | `string` | Session identifier to attach to the trace |
>
> **Returns:** `void`
>
> **Option A: Call inside an active span context**
>
> ```typescript theme={null}
> import { Tracevell, observe } from '@lmnr-ai/lmnr';
>
> await observe({ name: 'handle_message' }, async () => {
>   Laminar.setTraceSessionId('conversation-abc-123');
> });
> ```
>
> **Option B: Pass via `observe` options**
>
> ```typescript theme={null}
> import { observe } from '@lmnr-ai/lmnr';
>
> await observe(
>   { name: 'handle_message', sessionId: 'conversation-abc-123' },
>   async () => {
>     // ...
>   },
> );
> ```
>
> **Notes:**
>
> * Must run within an active span context to attach to the current trace.
> * Prefer setting the session ID at your request/turn entry point so child spans inherit it.
>
> ***
>
> Laminar.setTraceUserId(userId)
>
> Associate trace with a user.
>
> **Parameters:**
>
> | Name | Type | Description |
> | - | - | - |
> | `userId` | `string` | User identifier to attach to the trace |
>
> **Returns:** `void`
>
> **Option A: Call inside an active span context**
>
> ```typescript theme={null}
> import { Tracevell, observe } from '@lmnr-ai/lmnr';
>
> await observe({ name: 'handle_request' }, async () => {
>   Laminar.setTraceUserId('user-456');
> });
> ```
>
> **Option B: Pass via `observe` options**
>
> ```typescript theme={null}
> import { observe } from '@lmnr-ai/lmnr';
>
> await observe(
>   { name: 'handle_request', userId: 'user-456' },
>   async () => {
>     // ...
>   },
> );
> ```
>
> **Notes:**
>
> * Must run within an active span context to attach to the current trace.
> * Prefer pseudonymous IDs (avoid emails, names, phone numbers).
>
> ***
>
> Laminar.setTraceMetadata(metadata)
>
> Add key-value metadata to the trace.
>
> **Parameters:**
>
> | Name | Type | Description |
> | - | - | - |
> | `metadata` | `Record<string, any>` | JSON-serializable key-value pairs |
>
> **Returns:** `void`
>
> **Option A: Call inside an active span context**
>
> ```typescript theme={null}
> import { Tracevell, observe } from '@lmnr-ai/lmnr';
>
> await observe({ name: 'handle_request' }, async () => {
>   Laminar.setTraceMetadata({
>     environment: 'production',
>     region: 'us-west',
>     feature_flag: 'new-model-v2',
>   });
> });
> ```
>
> **Option B: Pass via `observe` options**
>
> ```typescript theme={null}
> import { observe } from '@lmnr-ai/lmnr';
>
> await observe(
>   {
>     name: 'handle_request',
>     metadata: { environment: 'production', region: 'us-west' },
>   },
>   async () => {
>     // ...
>   },
> );
> ```
>
> **Notes:**
>
> * Must run within an active span context to attach to the current trace.
> * A later call overwrites previous trace metadata—set all keys in one call.
> * Values must be JSON-serializable (non-primitive values are JSON-stringified). Stored under `lmnr.association.properties.metadata.*`.
>
> **Overwrite semantics examples**
>
> ```typescript theme={null}
> import { Tracevell, observe } from '@lmnr-ai/lmnr';
>
> // ✅ Good: set all keys in one call
> await observe({ name: 'myFunction' }, async () => {
>   Laminar.setTraceMetadata({ environment: 'production', region: 'us-west' });
> });
> ```
>
> ```typescript theme={null}
> import { Tracevell, observe } from '@lmnr-ai/lmnr';
>
> // ❌ Avoid: second call overwrites the first
> await observe({ name: 'myFunction' }, async () => {
>   Laminar.setTraceMetadata({ environment: 'production' });
>   Laminar.setTraceMetadata({ region: 'us-west' });
> });
> ```
>
> ***
>
> Laminar.getTraceId()
>
> Get the current trace ID.
>
> **Returns:** `string | null` — UUID string or `null` if no active span.
>
> ```typescript theme={null}
> import { Tracevell, observe } from '@lmnr-ai/lmnr';
>
> await observe({ name: 'operation' }, async () => {
>   const traceId = Laminar.getTraceId();
>   console.log('Trace:', traceId);
>   return { traceId, result };
> });
> ```

> [tab] Python
>
> Laminar.set\_trace\_session\_id(session\_id=None)
>
> Group this trace with others in a session.
>
> **Parameters:**
>
> | Name | Type | Default | Description |
> | - | - | - | - |
> | `session_id` | `str` \| `None` | `None` | Session identifier to attach to the trace |
>
> **Returns:** `None`
>
> **Option A: Call inside an active span context**
>
> ```python theme={null}
> from lmnr import Tracevell, observe
>
> @observe()
> def handle_message():
>     Laminar.set_trace_session_id("conversation-abc-123")
> ```
>
> **Option B: Pass via `@observe(...)`**
>
> ```python theme={null}
> from lmnr import observe
>
> @observe(session_id="conversation-abc-123")
> def handle_message():
>     # ...
>     pass
> ```
>
> **Notes:**
>
> * Warns if called outside span context.
> * For dynamic session IDs, set `session_id` inside the function body.
>
> ***
>
> Laminar.set\_trace\_user\_id(user\_id=None)
>
> Associate trace with a user.
>
> **Parameters:**
>
> | Name | Type | Default | Description |
> | - | - | - | - |
> | `user_id` | `str` \| `None` | `None` | User identifier to attach to the trace |
>
> **Returns:** `None`
>
> **Option A: Call inside an active span context**
>
> ```python theme={null}
> from lmnr import Tracevell, observe
>
> @observe()
> def handle_request():
>     Laminar.set_trace_user_id("user-456")
> ```
>
> **Option B: Pass via `@observe(...)`**
>
> ```python theme={null}
> from lmnr import observe
>
> @observe(user_id="user-456")
> def handle_request():
>     # ...
>     pass
> ```
>
> **Notes:**
>
> * Warns if called outside span context.
> * Prefer pseudonymous IDs (avoid emails, names, phone numbers).
>
> ***
>
> Laminar.set\_trace\_metadata(metadata)
>
> Add key-value metadata to the trace.
>
> **Option A: Call inside an active span context**
>
> ```python theme={null}
> from lmnr import Tracevell, observe
>
> @observe()
> def handle_request():
>     Laminar.set_trace_metadata({
>         "environment": "production",
>         "region": "us-west",
>         "feature_flag": "new-model-v2",
>     })
> ```
>
> **Option B: Pass via `@observe(...)`**
>
> ```python theme={null}
> from lmnr import observe
>
> @observe(metadata={"environment": "production", "region": "us-west"})
> def handle_request():
>     # ...
>     pass
> ```
>
> **Parameters:**
>
> | Name | Type | Description |
> | - | - | - |
> | `metadata` | `dict[str, AttributeValue]` | Key-value pairs. Non-primitive values JSON-serialized. |
>
> **Returns:** `None`
>
> **Notes:**
>
> * Calling again overwrites previous metadata. Set all keys in one call.
> * Warns if called outside span context.
>
> **Overwrite semantics examples**
>
> ```python theme={null}
> from lmnr import Tracevell, observe
>
> # ✅ Good: set all keys in one call
> @observe()
> def my_function():
>     Laminar.set_trace_metadata({"environment": "production", "region": "us-west"})
> ```
>
> ```python theme={null}
> from lmnr import Tracevell, observe
>
> # ❌ Avoid: second call overwrites the first
> @observe()
> def my_function():
>     Laminar.set_trace_metadata({"environment": "production"})
>     Laminar.set_trace_metadata({"region": "us-west"})
> ```
>
> ***
>
> Laminar.get\_trace\_id()
>
> Get the current trace ID.
>
> **Returns:** `uuid.UUID | None` — Returns `None` if called outside span context or invalid trace.
>
> ```python theme={null}
> from lmnr import Tracevell, observe
>
> @observe()
> def operation():
>     trace_id = Laminar.get_trace_id()
>     return {"trace_id": trace_id, "result": result}
> ```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.