lmnr 0.4.53.dev0__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 +32 -11
- lmnr/cli/__init__.py +270 -0
- lmnr/cli/datasets.py +371 -0
- lmnr/cli/evals.py +111 -0
- lmnr/cli/rules.py +42 -0
- lmnr/opentelemetry_lib/__init__.py +70 -0
- lmnr/opentelemetry_lib/decorators/__init__.py +337 -0
- lmnr/opentelemetry_lib/litellm/__init__.py +685 -0
- lmnr/opentelemetry_lib/litellm/utils.py +100 -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 +599 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/google_genai/config.py +9 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/google_genai/schema_utils.py +26 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/google_genai/utils.py +330 -0
- 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 +121 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/langgraph/utils.py +60 -0
- 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 +191 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/threading/__init__.py +197 -0
- lmnr/opentelemetry_lib/tracing/__init__.py +263 -0
- lmnr/opentelemetry_lib/tracing/_instrument_initializers.py +516 -0
- lmnr/{openllmetry_sdk → opentelemetry_lib}/tracing/attributes.py +21 -8
- lmnr/opentelemetry_lib/tracing/context.py +200 -0
- lmnr/opentelemetry_lib/tracing/exporter.py +153 -0
- lmnr/opentelemetry_lib/tracing/instruments.py +140 -0
- lmnr/opentelemetry_lib/tracing/processor.py +193 -0
- lmnr/opentelemetry_lib/tracing/span.py +398 -0
- lmnr/opentelemetry_lib/tracing/tracer.py +57 -0
- lmnr/opentelemetry_lib/tracing/utils.py +62 -0
- lmnr/opentelemetry_lib/utils/package_check.py +18 -0
- lmnr/opentelemetry_lib/utils/wrappers.py +11 -0
- lmnr/sdk/browser/__init__.py +0 -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 +142 -0
- 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 +151 -0
- lmnr/sdk/browser/playwright_otel.py +322 -0
- lmnr/sdk/browser/pw_utils.py +363 -0
- lmnr/sdk/browser/recorder/record.umd.min.cjs +84 -0
- lmnr/sdk/browser/utils.py +70 -0
- lmnr/sdk/client/asynchronous/async_client.py +180 -0
- lmnr/sdk/client/asynchronous/resources/__init__.py +6 -0
- lmnr/sdk/client/asynchronous/resources/base.py +32 -0
- lmnr/sdk/client/asynchronous/resources/browser_events.py +41 -0
- lmnr/sdk/client/asynchronous/resources/datasets.py +131 -0
- lmnr/sdk/client/asynchronous/resources/evals.py +266 -0
- lmnr/sdk/client/asynchronous/resources/evaluators.py +85 -0
- lmnr/sdk/client/asynchronous/resources/tags.py +83 -0
- lmnr/sdk/client/synchronous/resources/__init__.py +6 -0
- lmnr/sdk/client/synchronous/resources/base.py +32 -0
- lmnr/sdk/client/synchronous/resources/browser_events.py +40 -0
- lmnr/sdk/client/synchronous/resources/datasets.py +131 -0
- lmnr/sdk/client/synchronous/resources/evals.py +263 -0
- lmnr/sdk/client/synchronous/resources/evaluators.py +85 -0
- lmnr/sdk/client/synchronous/resources/tags.py +83 -0
- lmnr/sdk/client/synchronous/sync_client.py +191 -0
- lmnr/sdk/datasets/__init__.py +94 -0
- lmnr/sdk/datasets/file_utils.py +91 -0
- lmnr/sdk/decorators.py +163 -26
- lmnr/sdk/eval_control.py +3 -2
- lmnr/sdk/evaluations.py +403 -191
- lmnr/sdk/laminar.py +1080 -549
- lmnr/sdk/log.py +7 -2
- lmnr/sdk/types.py +246 -134
- lmnr/sdk/utils.py +151 -7
- lmnr/version.py +46 -0
- {lmnr-0.4.53.dev0.dist-info → lmnr-0.7.26.dist-info}/METADATA +152 -106
- 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/cli.py +0 -101
- lmnr/openllmetry_sdk/.python-version +0 -1
- lmnr/openllmetry_sdk/__init__.py +0 -72
- lmnr/openllmetry_sdk/config/__init__.py +0 -9
- lmnr/openllmetry_sdk/decorators/base.py +0 -185
- lmnr/openllmetry_sdk/instruments.py +0 -38
- lmnr/openllmetry_sdk/tracing/__init__.py +0 -1
- lmnr/openllmetry_sdk/tracing/content_allow_list.py +0 -24
- lmnr/openllmetry_sdk/tracing/context_manager.py +0 -13
- lmnr/openllmetry_sdk/tracing/tracing.py +0 -884
- lmnr/openllmetry_sdk/utils/in_memory_span_exporter.py +0 -61
- lmnr/openllmetry_sdk/utils/package_check.py +0 -7
- lmnr/openllmetry_sdk/version.py +0 -1
- lmnr/sdk/datasets.py +0 -55
- lmnr-0.4.53.dev0.dist-info/LICENSE +0 -75
- lmnr-0.4.53.dev0.dist-info/RECORD +0 -33
- lmnr-0.4.53.dev0.dist-info/WHEEL +0 -4
- lmnr-0.4.53.dev0.dist-info/entry_points.txt +0 -3
- /lmnr/{openllmetry_sdk → opentelemetry_lib}/.flake8 +0 -0
- /lmnr/{openllmetry_sdk → opentelemetry_lib}/utils/__init__.py +0 -0
- /lmnr/{openllmetry_sdk → opentelemetry_lib}/utils/json_encoder.py +0 -0
- /lmnr/{openllmetry_sdk/decorators/__init__.py → py.typed} +0 -0
|
@@ -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)
|