Skip to content

Commit 742a74f

Browse files
Add dynamic trace metadata updates with context management
Co-authored-by: vinicius <[email protected]>
1 parent 12fe8e3 commit 742a74f

File tree

5 files changed

+612
-2
lines changed

5 files changed

+612
-2
lines changed

CURSOR_MEMORY.md

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
# Cursor Memory - Openlayer Python SDK
2+
3+
## Project Guidelines and Lessons Learned
4+
5+
### Trace Metadata Enhancement Implementation (2025)
6+
7+
**Successfully implemented dynamic trace metadata update functionality allowing users to set trace-level metadata (user_id, session_id, etc.) without passing through function arguments.**
8+
9+
#### Key Implementation Patterns:
10+
11+
1. **Enhanced Trace Class Design**
12+
- Added metadata fields to Trace class: `name`, `tags`, `metadata`, `thread_id`, `user_id`, `input`, `output`, `feedback`, `test_case`
13+
- Created `update_metadata()` method with merge logic for existing metadata
14+
- Used Optional typing for all new fields to maintain backward compatibility
15+
16+
2. **Context Variable Management**
17+
- Leveraged existing `_current_trace` and `_current_step` context variables
18+
- No additional context variables needed - reused existing infrastructure
19+
- Thread-safe by design using Python's contextvars module
20+
21+
3. **Public API Design**
22+
- `update_current_trace()` - Updates trace-level metadata dynamically
23+
- `update_current_span()` - Updates current step/span metadata
24+
- Both functions include comprehensive error handling with meaningful warning messages
25+
- Used Optional parameters with None defaults for clean API
26+
27+
4. **Trace Processing Integration**
28+
- Modified `post_process_trace()` to include trace-level metadata in final trace data
29+
- Trace metadata takes precedence over step metadata in final output
30+
- Maintained backward compatibility with existing trace data structure
31+
32+
5. **Type Safety and Exports**
33+
- Created placeholder types `LLMTestCase` and `Feedback` as `Dict[str, Any]`
34+
- Exported new functions and types through `src/openlayer/lib/__init__.py`
35+
- Used forward references for type annotations to avoid circular imports
36+
37+
#### Critical Design Decisions:
38+
39+
- **Metadata Merging Strategy**: Trace-level metadata overrides step-level metadata in final output
40+
- **Error Handling**: Warning messages instead of exceptions when no active trace/span
41+
- **Type Definitions**: Simple Dict[str, Any] placeholders for extensibility
42+
- **API Naming**: `update_current_trace()` and `update_current_span()` for clarity
43+
44+
#### Usage Pattern:
45+
```python
46+
import openlayer
47+
48+
@openlayer.trace()
49+
def my_function():
50+
# Set trace metadata dynamically
51+
openlayer.update_current_trace(
52+
user_id="user123",
53+
metadata={"session_id": "sess456"}
54+
)
55+
# ... function logic
56+
```
57+
58+
#### Testing Approach:
59+
- All modified files compile successfully with `python3 -m py_compile`
60+
- Created comprehensive example in `examples/tracing/trace_metadata_updates.py`
61+
- Demonstrated error handling, async support, and complex metadata scenarios
62+
63+
#### Key Files Modified:
64+
- `src/openlayer/lib/tracing/traces.py` - Enhanced Trace class
65+
- `src/openlayer/lib/tracing/tracer.py` - Added update functions and trace processing
66+
- `src/openlayer/lib/__init__.py` - Exported new functionality
67+
- `examples/tracing/trace_metadata_updates.py` - Comprehensive usage examples
68+
69+
#### Backward Compatibility:
70+
- All existing functionality preserved
71+
- New fields optional with None defaults
72+
- No breaking changes to existing APIs
73+
- Maintains existing trace data structure compatibility
74+
75+
---
76+
77+
*This implementation successfully addresses the user requirement to dynamically set trace metadata without passing it through function arguments, providing a clean and intuitive API for complex tracing scenarios.*

0 commit comments

Comments
 (0)