lmnr 0.6.17__py3-none-any.whl → 0.6.19__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 (82) hide show
  1. lmnr/__init__.py +0 -0
  2. lmnr/cli.py +0 -0
  3. lmnr/opentelemetry_lib/.flake8 +0 -0
  4. lmnr/opentelemetry_lib/__init__.py +0 -0
  5. lmnr/opentelemetry_lib/decorators/__init__.py +0 -0
  6. lmnr/opentelemetry_lib/litellm/__init__.py +0 -0
  7. lmnr/opentelemetry_lib/litellm/utils.py +0 -0
  8. lmnr/opentelemetry_lib/opentelemetry/instrumentation/google_genai/__init__.py +55 -20
  9. lmnr/opentelemetry_lib/opentelemetry/instrumentation/google_genai/config.py +0 -0
  10. lmnr/opentelemetry_lib/opentelemetry/instrumentation/google_genai/schema_utils.py +23 -0
  11. lmnr/opentelemetry_lib/opentelemetry/instrumentation/google_genai/utils.py +0 -0
  12. lmnr/opentelemetry_lib/opentelemetry/instrumentation/langgraph/__init__.py +0 -0
  13. lmnr/opentelemetry_lib/opentelemetry/instrumentation/langgraph/utils.py +0 -0
  14. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/__init__.py +61 -0
  15. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/__init__.py +442 -0
  16. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/chat_wrappers.py +1024 -0
  17. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/completion_wrappers.py +297 -0
  18. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/config.py +16 -0
  19. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/embeddings_wrappers.py +308 -0
  20. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/event_emitter.py +100 -0
  21. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/event_models.py +41 -0
  22. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/image_gen_wrappers.py +68 -0
  23. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/utils.py +185 -0
  24. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v0/__init__.py +176 -0
  25. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v1/__init__.py +358 -0
  26. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v1/assistant_wrappers.py +319 -0
  27. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v1/event_handler_wrapper.py +132 -0
  28. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v1/responses_wrappers.py +626 -0
  29. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/version.py +1 -0
  30. lmnr/opentelemetry_lib/opentelemetry/instrumentation/opentelemetry/__init__.py +69 -0
  31. lmnr/opentelemetry_lib/opentelemetry/instrumentation/skyvern/__init__.py +0 -0
  32. lmnr/opentelemetry_lib/tracing/__init__.py +0 -0
  33. lmnr/opentelemetry_lib/tracing/_instrument_initializers.py +12 -3
  34. lmnr/opentelemetry_lib/tracing/attributes.py +0 -0
  35. lmnr/opentelemetry_lib/tracing/context_properties.py +0 -0
  36. lmnr/opentelemetry_lib/tracing/exporter.py +0 -0
  37. lmnr/opentelemetry_lib/tracing/instruments.py +7 -0
  38. lmnr/opentelemetry_lib/tracing/processor.py +0 -0
  39. lmnr/opentelemetry_lib/tracing/tracer.py +0 -0
  40. lmnr/opentelemetry_lib/utils/__init__.py +0 -0
  41. lmnr/opentelemetry_lib/utils/json_encoder.py +0 -0
  42. lmnr/opentelemetry_lib/utils/package_check.py +0 -0
  43. lmnr/py.typed +0 -0
  44. lmnr/sdk/__init__.py +0 -0
  45. lmnr/sdk/browser/__init__.py +0 -0
  46. lmnr/sdk/browser/browser_use_otel.py +1 -1
  47. lmnr/sdk/browser/patchright_otel.py +0 -14
  48. lmnr/sdk/browser/playwright_otel.py +16 -130
  49. lmnr/sdk/browser/pw_utils.py +45 -31
  50. lmnr/sdk/browser/rrweb/rrweb.umd.min.cjs +0 -0
  51. lmnr/sdk/browser/utils.py +0 -0
  52. lmnr/sdk/client/asynchronous/async_client.py +0 -0
  53. lmnr/sdk/client/asynchronous/resources/__init__.py +0 -0
  54. lmnr/sdk/client/asynchronous/resources/agent.py +0 -0
  55. lmnr/sdk/client/asynchronous/resources/base.py +0 -0
  56. lmnr/sdk/client/asynchronous/resources/browser_events.py +0 -0
  57. lmnr/sdk/client/asynchronous/resources/evals.py +0 -0
  58. lmnr/sdk/client/asynchronous/resources/tags.py +0 -0
  59. lmnr/sdk/client/synchronous/resources/__init__.py +0 -0
  60. lmnr/sdk/client/synchronous/resources/agent.py +0 -0
  61. lmnr/sdk/client/synchronous/resources/base.py +0 -0
  62. lmnr/sdk/client/synchronous/resources/browser_events.py +0 -0
  63. lmnr/sdk/client/synchronous/resources/evals.py +0 -0
  64. lmnr/sdk/client/synchronous/resources/tags.py +0 -0
  65. lmnr/sdk/client/synchronous/sync_client.py +0 -0
  66. lmnr/sdk/datasets.py +0 -0
  67. lmnr/sdk/decorators.py +0 -0
  68. lmnr/sdk/eval_control.py +0 -0
  69. lmnr/sdk/evaluations.py +0 -0
  70. lmnr/sdk/laminar.py +0 -0
  71. lmnr/sdk/log.py +0 -0
  72. lmnr/sdk/types.py +0 -0
  73. lmnr/sdk/utils.py +0 -0
  74. lmnr/version.py +1 -1
  75. {lmnr-0.6.17.dist-info → lmnr-0.6.19.dist-info}/METADATA +70 -80
  76. lmnr-0.6.19.dist-info/RECORD +78 -0
  77. lmnr-0.6.19.dist-info/WHEEL +4 -0
  78. lmnr-0.6.19.dist-info/entry_points.txt +3 -0
  79. lmnr-0.6.17.dist-info/LICENSE +0 -75
  80. lmnr-0.6.17.dist-info/RECORD +0 -61
  81. lmnr-0.6.17.dist-info/WHEEL +0 -4
  82. lmnr-0.6.17.dist-info/entry_points.txt +0 -3
@@ -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)