lmnr 0.6.16__py3-none-any.whl → 0.7.26__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/__init__.py +6 -15
- lmnr/cli/__init__.py +270 -0
- lmnr/cli/datasets.py +371 -0
- lmnr/{cli.py → cli/evals.py} +20 -102
- lmnr/cli/rules.py +42 -0
- lmnr/opentelemetry_lib/__init__.py +9 -2
- lmnr/opentelemetry_lib/decorators/__init__.py +274 -168
- lmnr/opentelemetry_lib/litellm/__init__.py +352 -38
- lmnr/opentelemetry_lib/litellm/utils.py +82 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/__init__.py +849 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/config.py +13 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/event_emitter.py +211 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/event_models.py +41 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/span_utils.py +401 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/streaming.py +425 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/utils.py +332 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/version.py +1 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/claude_agent/__init__.py +451 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/claude_agent/proxy.py +144 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/cua_agent/__init__.py +100 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/cua_computer/__init__.py +476 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/cua_computer/utils.py +12 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/google_genai/__init__.py +191 -129
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/google_genai/schema_utils.py +26 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/google_genai/utils.py +126 -41
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/groq/__init__.py +488 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/groq/config.py +8 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/groq/event_emitter.py +143 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/groq/event_models.py +41 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/groq/span_utils.py +229 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/groq/utils.py +92 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/groq/version.py +1 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/kernel/__init__.py +381 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/kernel/utils.py +36 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/langgraph/__init__.py +16 -16
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/__init__.py +61 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/__init__.py +472 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/chat_wrappers.py +1185 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/completion_wrappers.py +305 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/config.py +16 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/embeddings_wrappers.py +312 -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 +197 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v0/__init__.py +176 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v1/__init__.py +368 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v1/assistant_wrappers.py +325 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v1/event_handler_wrapper.py +135 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v1/responses_wrappers.py +786 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/version.py +1 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/openhands_ai/__init__.py +388 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/opentelemetry/__init__.py +69 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/skyvern/__init__.py +59 -61
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/threading/__init__.py +197 -0
- lmnr/opentelemetry_lib/tracing/__init__.py +119 -18
- lmnr/opentelemetry_lib/tracing/_instrument_initializers.py +124 -25
- lmnr/opentelemetry_lib/tracing/attributes.py +4 -0
- lmnr/opentelemetry_lib/tracing/context.py +200 -0
- lmnr/opentelemetry_lib/tracing/exporter.py +109 -15
- lmnr/opentelemetry_lib/tracing/instruments.py +22 -5
- lmnr/opentelemetry_lib/tracing/processor.py +128 -30
- lmnr/opentelemetry_lib/tracing/span.py +398 -0
- lmnr/opentelemetry_lib/tracing/tracer.py +40 -1
- lmnr/opentelemetry_lib/tracing/utils.py +62 -0
- lmnr/opentelemetry_lib/utils/package_check.py +9 -0
- lmnr/opentelemetry_lib/utils/wrappers.py +11 -0
- lmnr/sdk/browser/background_send_events.py +158 -0
- lmnr/sdk/browser/browser_use_cdp_otel.py +100 -0
- lmnr/sdk/browser/browser_use_otel.py +12 -12
- lmnr/sdk/browser/bubus_otel.py +71 -0
- lmnr/sdk/browser/cdp_utils.py +518 -0
- lmnr/sdk/browser/inject_script.js +514 -0
- lmnr/sdk/browser/patchright_otel.py +18 -44
- lmnr/sdk/browser/playwright_otel.py +104 -187
- lmnr/sdk/browser/pw_utils.py +249 -210
- lmnr/sdk/browser/recorder/record.umd.min.cjs +84 -0
- lmnr/sdk/browser/utils.py +1 -1
- lmnr/sdk/client/asynchronous/async_client.py +47 -15
- lmnr/sdk/client/asynchronous/resources/__init__.py +2 -7
- lmnr/sdk/client/asynchronous/resources/browser_events.py +1 -0
- lmnr/sdk/client/asynchronous/resources/datasets.py +131 -0
- lmnr/sdk/client/asynchronous/resources/evals.py +122 -18
- 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 -2
- lmnr/sdk/client/synchronous/resources/datasets.py +131 -0
- lmnr/sdk/client/synchronous/resources/evals.py +83 -17
- 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 +47 -15
- lmnr/sdk/datasets/__init__.py +94 -0
- lmnr/sdk/datasets/file_utils.py +91 -0
- lmnr/sdk/decorators.py +103 -23
- lmnr/sdk/evaluations.py +122 -33
- lmnr/sdk/laminar.py +816 -333
- lmnr/sdk/log.py +7 -2
- lmnr/sdk/types.py +124 -143
- lmnr/sdk/utils.py +115 -2
- lmnr/version.py +1 -1
- {lmnr-0.6.16.dist-info → lmnr-0.7.26.dist-info}/METADATA +71 -78
- lmnr-0.7.26.dist-info/RECORD +116 -0
- lmnr-0.7.26.dist-info/WHEEL +4 -0
- lmnr-0.7.26.dist-info/entry_points.txt +3 -0
- lmnr/opentelemetry_lib/tracing/context_properties.py +0 -65
- lmnr/sdk/browser/rrweb/rrweb.umd.min.cjs +0 -98
- lmnr/sdk/client/asynchronous/resources/agent.py +0 -329
- lmnr/sdk/client/synchronous/resources/agent.py +0 -323
- lmnr/sdk/datasets.py +0 -60
- lmnr-0.6.16.dist-info/LICENSE +0 -75
- lmnr-0.6.16.dist-info/RECORD +0 -61
- lmnr-0.6.16.dist-info/WHEEL +0 -4
- lmnr-0.6.16.dist-info/entry_points.txt +0 -3
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
from lmnr.opentelemetry_lib.tracing.context import get_event_attributes_from_context
|
|
2
|
+
from ..shared import _set_span_attribute
|
|
3
|
+
from ..shared.event_emitter import emit_event
|
|
4
|
+
from ..shared.event_models import ChoiceEvent
|
|
5
|
+
from ..utils import should_emit_events
|
|
6
|
+
from opentelemetry.semconv.attributes.error_attributes import ERROR_TYPE
|
|
7
|
+
from opentelemetry.semconv_ai import SpanAttributes
|
|
8
|
+
from opentelemetry.trace import Status, StatusCode
|
|
9
|
+
from typing_extensions import override
|
|
10
|
+
|
|
11
|
+
from openai import AssistantEventHandler
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class EventHandlerWrapper(AssistantEventHandler):
|
|
15
|
+
_current_text_index = 0
|
|
16
|
+
_prompt_tokens = 0
|
|
17
|
+
_completion_tokens = 0
|
|
18
|
+
|
|
19
|
+
def __init__(self, original_handler, span):
|
|
20
|
+
super().__init__()
|
|
21
|
+
self._original_handler = original_handler
|
|
22
|
+
self._span = span
|
|
23
|
+
|
|
24
|
+
@override
|
|
25
|
+
def on_end(self):
|
|
26
|
+
_set_span_attribute(
|
|
27
|
+
self._span,
|
|
28
|
+
SpanAttributes.LLM_USAGE_PROMPT_TOKENS,
|
|
29
|
+
self._prompt_tokens,
|
|
30
|
+
)
|
|
31
|
+
_set_span_attribute(
|
|
32
|
+
self._span,
|
|
33
|
+
SpanAttributes.LLM_USAGE_COMPLETION_TOKENS,
|
|
34
|
+
self._completion_tokens,
|
|
35
|
+
)
|
|
36
|
+
self._original_handler.on_end()
|
|
37
|
+
self._span.end()
|
|
38
|
+
|
|
39
|
+
@override
|
|
40
|
+
def on_event(self, event):
|
|
41
|
+
self._original_handler.on_event(event)
|
|
42
|
+
|
|
43
|
+
@override
|
|
44
|
+
def on_run_step_created(self, run_step):
|
|
45
|
+
self._original_handler.on_run_step_created(run_step)
|
|
46
|
+
|
|
47
|
+
@override
|
|
48
|
+
def on_run_step_delta(self, delta, snapshot):
|
|
49
|
+
self._original_handler.on_run_step_delta(delta, snapshot)
|
|
50
|
+
|
|
51
|
+
@override
|
|
52
|
+
def on_run_step_done(self, run_step):
|
|
53
|
+
if run_step.usage:
|
|
54
|
+
self._prompt_tokens += run_step.usage.prompt_tokens
|
|
55
|
+
self._completion_tokens += run_step.usage.completion_tokens
|
|
56
|
+
self._original_handler.on_run_step_done(run_step)
|
|
57
|
+
|
|
58
|
+
@override
|
|
59
|
+
def on_tool_call_created(self, tool_call):
|
|
60
|
+
self._original_handler.on_tool_call_created(tool_call)
|
|
61
|
+
|
|
62
|
+
@override
|
|
63
|
+
def on_tool_call_delta(self, delta, snapshot):
|
|
64
|
+
self._original_handler.on_tool_call_delta(delta, snapshot)
|
|
65
|
+
|
|
66
|
+
@override
|
|
67
|
+
def on_tool_call_done(self, tool_call):
|
|
68
|
+
self._original_handler.on_tool_call_done(tool_call)
|
|
69
|
+
|
|
70
|
+
@override
|
|
71
|
+
def on_exception(self, exception: Exception):
|
|
72
|
+
self._span.set_attribute(ERROR_TYPE, exception.__class__.__name__)
|
|
73
|
+
self._span.record_exception(
|
|
74
|
+
exception, attributes=get_event_attributes_from_context()
|
|
75
|
+
)
|
|
76
|
+
self._span.set_status(Status(StatusCode.ERROR, str(exception)))
|
|
77
|
+
self._original_handler.on_exception(exception)
|
|
78
|
+
|
|
79
|
+
@override
|
|
80
|
+
def on_timeout(self):
|
|
81
|
+
self._original_handler.on_timeout()
|
|
82
|
+
|
|
83
|
+
@override
|
|
84
|
+
def on_message_created(self, message):
|
|
85
|
+
self._original_handler.on_message_created(message)
|
|
86
|
+
|
|
87
|
+
@override
|
|
88
|
+
def on_message_delta(self, delta, snapshot):
|
|
89
|
+
self._original_handler.on_message_delta(delta, snapshot)
|
|
90
|
+
|
|
91
|
+
@override
|
|
92
|
+
def on_message_done(self, message):
|
|
93
|
+
_set_span_attribute(
|
|
94
|
+
self._span,
|
|
95
|
+
f"gen_ai.response.{self._current_text_index}.id",
|
|
96
|
+
message.id,
|
|
97
|
+
)
|
|
98
|
+
emit_event(
|
|
99
|
+
ChoiceEvent(
|
|
100
|
+
index=self._current_text_index,
|
|
101
|
+
message={
|
|
102
|
+
"content": [item.model_dump() for item in message.content],
|
|
103
|
+
"role": message.role,
|
|
104
|
+
},
|
|
105
|
+
)
|
|
106
|
+
)
|
|
107
|
+
self._original_handler.on_message_done(message)
|
|
108
|
+
self._current_text_index += 1
|
|
109
|
+
|
|
110
|
+
@override
|
|
111
|
+
def on_text_created(self, text):
|
|
112
|
+
self._original_handler.on_text_created(text)
|
|
113
|
+
|
|
114
|
+
@override
|
|
115
|
+
def on_text_delta(self, delta, snapshot):
|
|
116
|
+
self._original_handler.on_text_delta(delta, snapshot)
|
|
117
|
+
|
|
118
|
+
@override
|
|
119
|
+
def on_text_done(self, text):
|
|
120
|
+
self._original_handler.on_text_done(text)
|
|
121
|
+
if not should_emit_events():
|
|
122
|
+
_set_span_attribute(
|
|
123
|
+
self._span,
|
|
124
|
+
f"{SpanAttributes.LLM_COMPLETIONS}.{self._current_text_index}.role",
|
|
125
|
+
"assistant",
|
|
126
|
+
)
|
|
127
|
+
_set_span_attribute(
|
|
128
|
+
self._span,
|
|
129
|
+
f"{SpanAttributes.LLM_COMPLETIONS}.{self._current_text_index}.content",
|
|
130
|
+
text.value,
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
@override
|
|
134
|
+
def on_image_file_done(self, image_file):
|
|
135
|
+
self._original_handler.on_image_file_done(image_file)
|