lmnr 0.6.18__py3-none-any.whl → 0.6.20__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/google_genai/__init__.py +55 -20
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/google_genai/schema_utils.py +23 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/__init__.py +61 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/__init__.py +442 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/chat_wrappers.py +1024 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/completion_wrappers.py +297 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/config.py +16 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/embeddings_wrappers.py +308 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/event_emitter.py +100 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/event_models.py +41 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/image_gen_wrappers.py +68 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/utils.py +185 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v0/__init__.py +176 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v1/__init__.py +358 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v1/assistant_wrappers.py +319 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v1/event_handler_wrapper.py +132 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v1/responses_wrappers.py +626 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/version.py +1 -0
- lmnr/opentelemetry_lib/tracing/_instrument_initializers.py +1 -3
- lmnr/sdk/browser/browser_use_otel.py +1 -1
- lmnr/sdk/browser/patchright_otel.py +0 -14
- lmnr/sdk/browser/playwright_otel.py +16 -130
- lmnr/sdk/browser/pw_utils.py +45 -31
- lmnr/sdk/client/asynchronous/async_client.py +13 -0
- lmnr/sdk/client/asynchronous/resources/__init__.py +2 -0
- lmnr/sdk/client/asynchronous/resources/evaluators.py +85 -0
- lmnr/sdk/client/asynchronous/resources/tags.py +4 -10
- lmnr/sdk/client/synchronous/resources/__init__.py +2 -1
- lmnr/sdk/client/synchronous/resources/evaluators.py +85 -0
- lmnr/sdk/client/synchronous/resources/tags.py +4 -10
- lmnr/sdk/client/synchronous/sync_client.py +14 -0
- lmnr/sdk/utils.py +23 -0
- lmnr/version.py +1 -1
- {lmnr-0.6.18.dist-info → lmnr-0.6.20.dist-info}/METADATA +2 -5
- {lmnr-0.6.18.dist-info → lmnr-0.6.20.dist-info}/RECORD +37 -18
- {lmnr-0.6.18.dist-info → lmnr-0.6.20.dist-info}/WHEEL +1 -1
- {lmnr-0.6.18.dist-info → lmnr-0.6.20.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,132 @@
|
|
1
|
+
from ..shared import _set_span_attribute
|
2
|
+
from ..shared.event_emitter import emit_event
|
3
|
+
from ..shared.event_models import ChoiceEvent
|
4
|
+
from ..utils import should_emit_events
|
5
|
+
from opentelemetry.semconv.attributes.error_attributes import ERROR_TYPE
|
6
|
+
from opentelemetry.semconv_ai import SpanAttributes
|
7
|
+
from opentelemetry.trace import Status, StatusCode
|
8
|
+
from typing_extensions import override
|
9
|
+
|
10
|
+
from openai import AssistantEventHandler
|
11
|
+
|
12
|
+
|
13
|
+
class EventHandlerWrapper(AssistantEventHandler):
|
14
|
+
_current_text_index = 0
|
15
|
+
_prompt_tokens = 0
|
16
|
+
_completion_tokens = 0
|
17
|
+
|
18
|
+
def __init__(self, original_handler, span):
|
19
|
+
super().__init__()
|
20
|
+
self._original_handler = original_handler
|
21
|
+
self._span = span
|
22
|
+
|
23
|
+
@override
|
24
|
+
def on_end(self):
|
25
|
+
_set_span_attribute(
|
26
|
+
self._span,
|
27
|
+
SpanAttributes.LLM_USAGE_PROMPT_TOKENS,
|
28
|
+
self._prompt_tokens,
|
29
|
+
)
|
30
|
+
_set_span_attribute(
|
31
|
+
self._span,
|
32
|
+
SpanAttributes.LLM_USAGE_COMPLETION_TOKENS,
|
33
|
+
self._completion_tokens,
|
34
|
+
)
|
35
|
+
self._original_handler.on_end()
|
36
|
+
self._span.end()
|
37
|
+
|
38
|
+
@override
|
39
|
+
def on_event(self, event):
|
40
|
+
self._original_handler.on_event(event)
|
41
|
+
|
42
|
+
@override
|
43
|
+
def on_run_step_created(self, run_step):
|
44
|
+
self._original_handler.on_run_step_created(run_step)
|
45
|
+
|
46
|
+
@override
|
47
|
+
def on_run_step_delta(self, delta, snapshot):
|
48
|
+
self._original_handler.on_run_step_delta(delta, snapshot)
|
49
|
+
|
50
|
+
@override
|
51
|
+
def on_run_step_done(self, run_step):
|
52
|
+
if run_step.usage:
|
53
|
+
self._prompt_tokens += run_step.usage.prompt_tokens
|
54
|
+
self._completion_tokens += run_step.usage.completion_tokens
|
55
|
+
self._original_handler.on_run_step_done(run_step)
|
56
|
+
|
57
|
+
@override
|
58
|
+
def on_tool_call_created(self, tool_call):
|
59
|
+
self._original_handler.on_tool_call_created(tool_call)
|
60
|
+
|
61
|
+
@override
|
62
|
+
def on_tool_call_delta(self, delta, snapshot):
|
63
|
+
self._original_handler.on_tool_call_delta(delta, snapshot)
|
64
|
+
|
65
|
+
@override
|
66
|
+
def on_tool_call_done(self, tool_call):
|
67
|
+
self._original_handler.on_tool_call_done(tool_call)
|
68
|
+
|
69
|
+
@override
|
70
|
+
def on_exception(self, exception: Exception):
|
71
|
+
self._span.set_attribute(ERROR_TYPE, exception.__class__.__name__)
|
72
|
+
self._span.record_exception(exception)
|
73
|
+
self._span.set_status(Status(StatusCode.ERROR, str(exception)))
|
74
|
+
self._original_handler.on_exception(exception)
|
75
|
+
|
76
|
+
@override
|
77
|
+
def on_timeout(self):
|
78
|
+
self._original_handler.on_timeout()
|
79
|
+
|
80
|
+
@override
|
81
|
+
def on_message_created(self, message):
|
82
|
+
self._original_handler.on_message_created(message)
|
83
|
+
|
84
|
+
@override
|
85
|
+
def on_message_delta(self, delta, snapshot):
|
86
|
+
self._original_handler.on_message_delta(delta, snapshot)
|
87
|
+
|
88
|
+
@override
|
89
|
+
def on_message_done(self, message):
|
90
|
+
_set_span_attribute(
|
91
|
+
self._span,
|
92
|
+
f"gen_ai.response.{self._current_text_index}.id",
|
93
|
+
message.id,
|
94
|
+
)
|
95
|
+
emit_event(
|
96
|
+
ChoiceEvent(
|
97
|
+
index=self._current_text_index,
|
98
|
+
message={
|
99
|
+
"content": [item.model_dump() for item in message.content],
|
100
|
+
"role": message.role,
|
101
|
+
},
|
102
|
+
)
|
103
|
+
)
|
104
|
+
self._original_handler.on_message_done(message)
|
105
|
+
self._current_text_index += 1
|
106
|
+
|
107
|
+
@override
|
108
|
+
def on_text_created(self, text):
|
109
|
+
self._original_handler.on_text_created(text)
|
110
|
+
|
111
|
+
@override
|
112
|
+
def on_text_delta(self, delta, snapshot):
|
113
|
+
self._original_handler.on_text_delta(delta, snapshot)
|
114
|
+
|
115
|
+
@override
|
116
|
+
def on_text_done(self, text):
|
117
|
+
self._original_handler.on_text_done(text)
|
118
|
+
if not should_emit_events():
|
119
|
+
_set_span_attribute(
|
120
|
+
self._span,
|
121
|
+
f"{SpanAttributes.LLM_COMPLETIONS}.{self._current_text_index}.role",
|
122
|
+
"assistant",
|
123
|
+
)
|
124
|
+
_set_span_attribute(
|
125
|
+
self._span,
|
126
|
+
f"{SpanAttributes.LLM_COMPLETIONS}.{self._current_text_index}.content",
|
127
|
+
text.value,
|
128
|
+
)
|
129
|
+
|
130
|
+
@override
|
131
|
+
def on_image_file_done(self, image_file):
|
132
|
+
self._original_handler.on_image_file_done(image_file)
|