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.
Files changed (113) hide show
  1. lmnr/__init__.py +6 -15
  2. lmnr/cli/__init__.py +270 -0
  3. lmnr/cli/datasets.py +371 -0
  4. lmnr/{cli.py → cli/evals.py} +20 -102
  5. lmnr/cli/rules.py +42 -0
  6. lmnr/opentelemetry_lib/__init__.py +9 -2
  7. lmnr/opentelemetry_lib/decorators/__init__.py +274 -168
  8. lmnr/opentelemetry_lib/litellm/__init__.py +352 -38
  9. lmnr/opentelemetry_lib/litellm/utils.py +82 -0
  10. lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/__init__.py +849 -0
  11. lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/config.py +13 -0
  12. lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/event_emitter.py +211 -0
  13. lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/event_models.py +41 -0
  14. lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/span_utils.py +401 -0
  15. lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/streaming.py +425 -0
  16. lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/utils.py +332 -0
  17. lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/version.py +1 -0
  18. lmnr/opentelemetry_lib/opentelemetry/instrumentation/claude_agent/__init__.py +451 -0
  19. lmnr/opentelemetry_lib/opentelemetry/instrumentation/claude_agent/proxy.py +144 -0
  20. lmnr/opentelemetry_lib/opentelemetry/instrumentation/cua_agent/__init__.py +100 -0
  21. lmnr/opentelemetry_lib/opentelemetry/instrumentation/cua_computer/__init__.py +476 -0
  22. lmnr/opentelemetry_lib/opentelemetry/instrumentation/cua_computer/utils.py +12 -0
  23. lmnr/opentelemetry_lib/opentelemetry/instrumentation/google_genai/__init__.py +191 -129
  24. lmnr/opentelemetry_lib/opentelemetry/instrumentation/google_genai/schema_utils.py +26 -0
  25. lmnr/opentelemetry_lib/opentelemetry/instrumentation/google_genai/utils.py +126 -41
  26. lmnr/opentelemetry_lib/opentelemetry/instrumentation/groq/__init__.py +488 -0
  27. lmnr/opentelemetry_lib/opentelemetry/instrumentation/groq/config.py +8 -0
  28. lmnr/opentelemetry_lib/opentelemetry/instrumentation/groq/event_emitter.py +143 -0
  29. lmnr/opentelemetry_lib/opentelemetry/instrumentation/groq/event_models.py +41 -0
  30. lmnr/opentelemetry_lib/opentelemetry/instrumentation/groq/span_utils.py +229 -0
  31. lmnr/opentelemetry_lib/opentelemetry/instrumentation/groq/utils.py +92 -0
  32. lmnr/opentelemetry_lib/opentelemetry/instrumentation/groq/version.py +1 -0
  33. lmnr/opentelemetry_lib/opentelemetry/instrumentation/kernel/__init__.py +381 -0
  34. lmnr/opentelemetry_lib/opentelemetry/instrumentation/kernel/utils.py +36 -0
  35. lmnr/opentelemetry_lib/opentelemetry/instrumentation/langgraph/__init__.py +16 -16
  36. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/__init__.py +61 -0
  37. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/__init__.py +472 -0
  38. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/chat_wrappers.py +1185 -0
  39. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/completion_wrappers.py +305 -0
  40. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/config.py +16 -0
  41. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/embeddings_wrappers.py +312 -0
  42. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/event_emitter.py +100 -0
  43. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/event_models.py +41 -0
  44. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/image_gen_wrappers.py +68 -0
  45. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/utils.py +197 -0
  46. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v0/__init__.py +176 -0
  47. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v1/__init__.py +368 -0
  48. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v1/assistant_wrappers.py +325 -0
  49. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v1/event_handler_wrapper.py +135 -0
  50. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v1/responses_wrappers.py +786 -0
  51. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/version.py +1 -0
  52. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openhands_ai/__init__.py +388 -0
  53. lmnr/opentelemetry_lib/opentelemetry/instrumentation/opentelemetry/__init__.py +69 -0
  54. lmnr/opentelemetry_lib/opentelemetry/instrumentation/skyvern/__init__.py +59 -61
  55. lmnr/opentelemetry_lib/opentelemetry/instrumentation/threading/__init__.py +197 -0
  56. lmnr/opentelemetry_lib/tracing/__init__.py +119 -18
  57. lmnr/opentelemetry_lib/tracing/_instrument_initializers.py +124 -25
  58. lmnr/opentelemetry_lib/tracing/attributes.py +4 -0
  59. lmnr/opentelemetry_lib/tracing/context.py +200 -0
  60. lmnr/opentelemetry_lib/tracing/exporter.py +109 -15
  61. lmnr/opentelemetry_lib/tracing/instruments.py +22 -5
  62. lmnr/opentelemetry_lib/tracing/processor.py +128 -30
  63. lmnr/opentelemetry_lib/tracing/span.py +398 -0
  64. lmnr/opentelemetry_lib/tracing/tracer.py +40 -1
  65. lmnr/opentelemetry_lib/tracing/utils.py +62 -0
  66. lmnr/opentelemetry_lib/utils/package_check.py +9 -0
  67. lmnr/opentelemetry_lib/utils/wrappers.py +11 -0
  68. lmnr/sdk/browser/background_send_events.py +158 -0
  69. lmnr/sdk/browser/browser_use_cdp_otel.py +100 -0
  70. lmnr/sdk/browser/browser_use_otel.py +12 -12
  71. lmnr/sdk/browser/bubus_otel.py +71 -0
  72. lmnr/sdk/browser/cdp_utils.py +518 -0
  73. lmnr/sdk/browser/inject_script.js +514 -0
  74. lmnr/sdk/browser/patchright_otel.py +18 -44
  75. lmnr/sdk/browser/playwright_otel.py +104 -187
  76. lmnr/sdk/browser/pw_utils.py +249 -210
  77. lmnr/sdk/browser/recorder/record.umd.min.cjs +84 -0
  78. lmnr/sdk/browser/utils.py +1 -1
  79. lmnr/sdk/client/asynchronous/async_client.py +47 -15
  80. lmnr/sdk/client/asynchronous/resources/__init__.py +2 -7
  81. lmnr/sdk/client/asynchronous/resources/browser_events.py +1 -0
  82. lmnr/sdk/client/asynchronous/resources/datasets.py +131 -0
  83. lmnr/sdk/client/asynchronous/resources/evals.py +122 -18
  84. lmnr/sdk/client/asynchronous/resources/evaluators.py +85 -0
  85. lmnr/sdk/client/asynchronous/resources/tags.py +4 -10
  86. lmnr/sdk/client/synchronous/resources/__init__.py +2 -2
  87. lmnr/sdk/client/synchronous/resources/datasets.py +131 -0
  88. lmnr/sdk/client/synchronous/resources/evals.py +83 -17
  89. lmnr/sdk/client/synchronous/resources/evaluators.py +85 -0
  90. lmnr/sdk/client/synchronous/resources/tags.py +4 -10
  91. lmnr/sdk/client/synchronous/sync_client.py +47 -15
  92. lmnr/sdk/datasets/__init__.py +94 -0
  93. lmnr/sdk/datasets/file_utils.py +91 -0
  94. lmnr/sdk/decorators.py +103 -23
  95. lmnr/sdk/evaluations.py +122 -33
  96. lmnr/sdk/laminar.py +816 -333
  97. lmnr/sdk/log.py +7 -2
  98. lmnr/sdk/types.py +124 -143
  99. lmnr/sdk/utils.py +115 -2
  100. lmnr/version.py +1 -1
  101. {lmnr-0.6.16.dist-info → lmnr-0.7.26.dist-info}/METADATA +71 -78
  102. lmnr-0.7.26.dist-info/RECORD +116 -0
  103. lmnr-0.7.26.dist-info/WHEEL +4 -0
  104. lmnr-0.7.26.dist-info/entry_points.txt +3 -0
  105. lmnr/opentelemetry_lib/tracing/context_properties.py +0 -65
  106. lmnr/sdk/browser/rrweb/rrweb.umd.min.cjs +0 -98
  107. lmnr/sdk/client/asynchronous/resources/agent.py +0 -329
  108. lmnr/sdk/client/synchronous/resources/agent.py +0 -323
  109. lmnr/sdk/datasets.py +0 -60
  110. lmnr-0.6.16.dist-info/LICENSE +0 -75
  111. lmnr-0.6.16.dist-info/RECORD +0 -61
  112. lmnr-0.6.16.dist-info/WHEEL +0 -4
  113. 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)