lmnr 0.6.18__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 (28) hide show
  1. lmnr/opentelemetry_lib/opentelemetry/instrumentation/google_genai/__init__.py +55 -20
  2. lmnr/opentelemetry_lib/opentelemetry/instrumentation/google_genai/schema_utils.py +23 -0
  3. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/__init__.py +61 -0
  4. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/__init__.py +442 -0
  5. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/chat_wrappers.py +1024 -0
  6. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/completion_wrappers.py +297 -0
  7. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/config.py +16 -0
  8. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/embeddings_wrappers.py +308 -0
  9. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/event_emitter.py +100 -0
  10. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/event_models.py +41 -0
  11. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/image_gen_wrappers.py +68 -0
  12. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/utils.py +185 -0
  13. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v0/__init__.py +176 -0
  14. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v1/__init__.py +358 -0
  15. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v1/assistant_wrappers.py +319 -0
  16. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v1/event_handler_wrapper.py +132 -0
  17. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v1/responses_wrappers.py +626 -0
  18. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/version.py +1 -0
  19. lmnr/opentelemetry_lib/tracing/_instrument_initializers.py +1 -3
  20. lmnr/sdk/browser/browser_use_otel.py +1 -1
  21. lmnr/sdk/browser/patchright_otel.py +0 -14
  22. lmnr/sdk/browser/playwright_otel.py +16 -130
  23. lmnr/sdk/browser/pw_utils.py +45 -31
  24. lmnr/version.py +1 -1
  25. {lmnr-0.6.18.dist-info → lmnr-0.6.19.dist-info}/METADATA +2 -5
  26. {lmnr-0.6.18.dist-info → lmnr-0.6.19.dist-info}/RECORD +28 -11
  27. {lmnr-0.6.18.dist-info → lmnr-0.6.19.dist-info}/WHEEL +1 -1
  28. {lmnr-0.6.18.dist-info → lmnr-0.6.19.dist-info}/entry_points.txt +0 -0
@@ -13,12 +13,7 @@ from opentelemetry.instrumentation.utils import unwrap
13
13
  from opentelemetry.trace import (
14
14
  get_tracer,
15
15
  Tracer,
16
- get_current_span,
17
- Span,
18
- INVALID_SPAN,
19
- set_span_in_context,
20
16
  )
21
- from opentelemetry.context import get_current
22
17
  from typing import Collection
23
18
  from wrapt import wrap_function_wrapper
24
19
 
@@ -54,59 +49,37 @@ except ImportError as e:
54
49
  _instruments = ("playwright >= 1.9.0",)
55
50
  logger = logging.getLogger(__name__)
56
51
 
57
- _context_spans: dict[str, Span] = {}
58
-
59
52
 
60
53
  @with_tracer_and_client_wrapper
61
54
  def _wrap_new_page(
62
55
  tracer: Tracer, client: LaminarClient, to_wrap, wrapped, instance, args, kwargs
63
56
  ):
64
- with tracer.start_as_current_span(
65
- f"{to_wrap.get('object')}.{to_wrap.get('method')}"
66
- ) as span:
67
- page = wrapped(*args, **kwargs)
68
- session_id = str(uuid.uuid4().hex)
69
- trace_id = format(get_current_span().get_span_context().trace_id, "032x")
70
- span.set_attribute("lmnr.internal.has_browser_session", True)
71
- handle_navigation_sync(page, session_id, trace_id, client)
72
- return page
57
+ page = wrapped(*args, **kwargs)
58
+ session_id = str(uuid.uuid4().hex)
59
+ handle_navigation_sync(page, session_id, client)
60
+ return page
73
61
 
74
62
 
75
63
  @with_tracer_and_client_wrapper
76
64
  async def _wrap_new_page_async(
77
65
  tracer: Tracer, client: AsyncLaminarClient, to_wrap, wrapped, instance, args, kwargs
78
66
  ):
79
- with tracer.start_as_current_span(
80
- f"{to_wrap.get('object')}.{to_wrap.get('method')}"
81
- ) as span:
82
- page = await wrapped(*args, **kwargs)
83
- session_id = str(uuid.uuid4().hex)
84
- trace_id = format(span.get_span_context().trace_id, "032x")
85
- span.set_attribute("lmnr.internal.has_browser_session", True)
86
- await handle_navigation_async(page, session_id, trace_id, client)
87
- return page
67
+ page = await wrapped(*args, **kwargs)
68
+ session_id = str(uuid.uuid4().hex)
69
+ await handle_navigation_async(page, session_id, client)
70
+ return page
88
71
 
89
72
 
90
73
  @with_tracer_and_client_wrapper
91
74
  def _wrap_new_browser_sync(
92
75
  tracer: Tracer, client: LaminarClient, to_wrap, wrapped, instance, args, kwargs
93
76
  ):
94
- global _context_spans
95
77
  browser: SyncBrowser = wrapped(*args, **kwargs)
96
78
  session_id = str(uuid.uuid4().hex)
97
79
  for context in browser.contexts:
98
- span = get_current_span()
99
- if span == INVALID_SPAN:
100
- span = tracer.start_span(
101
- name=f"{to_wrap.get('object')}.{to_wrap.get('method')}"
102
- )
103
- set_span_in_context(span, get_current())
104
- _context_spans[id(context)] = span
105
- span.set_attribute("lmnr.internal.has_browser_session", True)
106
- trace_id = format(span.get_span_context().trace_id, "032x")
107
80
 
108
81
  def handle_page_navigation(page: SyncPage):
109
- return handle_navigation_sync(page, session_id, trace_id, client)
82
+ return handle_navigation_sync(page, session_id, client)
110
83
 
111
84
  context.on(
112
85
  "page",
@@ -114,7 +87,7 @@ def _wrap_new_browser_sync(
114
87
  )
115
88
 
116
89
  for page in context.pages:
117
- handle_navigation_sync(page, session_id, trace_id, client)
90
+ handle_navigation_sync(page, session_id, client)
118
91
  return browser
119
92
 
120
93
 
@@ -122,26 +95,16 @@ def _wrap_new_browser_sync(
122
95
  async def _wrap_new_browser_async(
123
96
  tracer: Tracer, client: AsyncLaminarClient, to_wrap, wrapped, instance, args, kwargs
124
97
  ):
125
- global _context_spans
126
98
  browser: Browser = await wrapped(*args, **kwargs)
127
99
  session_id = str(uuid.uuid4().hex)
128
100
  for context in browser.contexts:
129
- span = get_current_span()
130
- if span == INVALID_SPAN:
131
- span = tracer.start_span(
132
- name=f"{to_wrap.get('object')}.{to_wrap.get('method')}"
133
- )
134
- set_span_in_context(span, get_current())
135
- _context_spans[id(context)] = span
136
- span.set_attribute("lmnr.internal.has_browser_session", True)
137
- trace_id = format(span.get_span_context().trace_id, "032x")
138
101
 
139
102
  async def handle_page_navigation(page: Page):
140
- return await handle_navigation_async(page, session_id, trace_id, client)
103
+ return await handle_navigation_async(page, session_id, client)
141
104
 
142
105
  context.on("page", handle_page_navigation)
143
106
  for page in context.pages:
144
- await handle_navigation_async(page, session_id, trace_id, client)
107
+ await handle_navigation_async(page, session_id, client)
145
108
  return browser
146
109
 
147
110
 
@@ -151,25 +114,16 @@ def _wrap_new_context_sync(
151
114
  ):
152
115
  context: SyncBrowserContext = wrapped(*args, **kwargs)
153
116
  session_id = str(uuid.uuid4().hex)
154
- span = get_current_span()
155
- if span == INVALID_SPAN:
156
- span = tracer.start_span(
157
- name=f"{to_wrap.get('object')}.{to_wrap.get('method')}"
158
- )
159
- set_span_in_context(span, get_current())
160
- _context_spans[id(context)] = span
161
- span.set_attribute("lmnr.internal.has_browser_session", True)
162
- trace_id = format(span.get_span_context().trace_id, "032x")
163
117
 
164
118
  def handle_page_navigation(page: SyncPage):
165
- return handle_navigation_sync(page, session_id, trace_id, client)
119
+ return handle_navigation_sync(page, session_id, client)
166
120
 
167
121
  context.on(
168
122
  "page",
169
123
  handle_page_navigation,
170
124
  )
171
125
  for page in context.pages:
172
- handle_navigation_sync(page, session_id, trace_id, client)
126
+ handle_navigation_sync(page, session_id, client)
173
127
  return context
174
128
 
175
129
 
@@ -179,67 +133,16 @@ async def _wrap_new_context_async(
179
133
  ):
180
134
  context: BrowserContext = await wrapped(*args, **kwargs)
181
135
  session_id = str(uuid.uuid4().hex)
182
- span = get_current_span()
183
- if span == INVALID_SPAN:
184
- span = tracer.start_span(
185
- name=f"{to_wrap.get('object')}.{to_wrap.get('method')}"
186
- )
187
- set_span_in_context(span, get_current())
188
- _context_spans[id(context)] = span
189
- span.set_attribute("lmnr.internal.has_browser_session", True)
190
- trace_id = format(span.get_span_context().trace_id, "032x")
191
136
 
192
137
  async def handle_page_navigation(page):
193
- return await handle_navigation_async(page, session_id, trace_id, client)
138
+ return await handle_navigation_async(page, session_id, client)
194
139
 
195
140
  context.on("page", handle_page_navigation)
196
141
  for page in context.pages:
197
- await handle_navigation_async(page, session_id, trace_id, client)
142
+ await handle_navigation_async(page, session_id, client)
198
143
  return context
199
144
 
200
145
 
201
- @with_tracer_and_client_wrapper
202
- def _wrap_close_browser_sync(
203
- tracer: Tracer,
204
- client: LaminarClient,
205
- to_wrap,
206
- wrapped,
207
- instance: SyncBrowser,
208
- args,
209
- kwargs,
210
- ):
211
- global _context_spans
212
- for context in instance.contexts:
213
- key = id(context)
214
- span = _context_spans.get(key)
215
- if span:
216
- if span.is_recording():
217
- span.end()
218
- _context_spans.pop(key)
219
- return wrapped(*args, **kwargs)
220
-
221
-
222
- @with_tracer_and_client_wrapper
223
- async def _wrap_close_browser_async(
224
- tracer: Tracer,
225
- client: AsyncLaminarClient,
226
- to_wrap,
227
- wrapped,
228
- instance: Browser,
229
- args,
230
- kwargs,
231
- ):
232
- global _context_spans
233
- for context in instance.contexts:
234
- key = id(context)
235
- span = _context_spans.get(key)
236
- if span:
237
- if span.is_recording():
238
- span.end()
239
- _context_spans.pop(key)
240
- return await wrapped(*args, **kwargs)
241
-
242
-
243
146
  WRAPPED_METHODS = [
244
147
  {
245
148
  "package": "playwright.sync_api",
@@ -271,12 +174,6 @@ WRAPPED_METHODS = [
271
174
  "method": "connect_over_cdp",
272
175
  "wrapper": _wrap_new_browser_sync,
273
176
  },
274
- {
275
- "package": "playwright.sync_api",
276
- "object": "Browser",
277
- "method": "close",
278
- "wrapper": _wrap_close_browser_sync,
279
- },
280
177
  {
281
178
  "package": "playwright.sync_api",
282
179
  "object": "Browser",
@@ -322,12 +219,6 @@ WRAPPED_METHODS_ASYNC = [
322
219
  "method": "connect_over_cdp",
323
220
  "wrapper": _wrap_new_browser_async,
324
221
  },
325
- {
326
- "package": "playwright.async_api",
327
- "object": "Browser",
328
- "method": "close",
329
- "wrapper": _wrap_close_browser_async,
330
- },
331
222
  {
332
223
  "package": "playwright.async_api",
333
224
  "object": "Browser",
@@ -393,13 +284,8 @@ class PlaywrightInstrumentor(BaseInstrumentor):
393
284
 
394
285
  def _uninstrument(self, **kwargs):
395
286
  # Unwrap methods
396
- global _context_spans
397
287
  for wrapped_method in WRAPPED_METHODS + WRAPPED_METHODS_ASYNC:
398
288
  wrap_package = wrapped_method.get("package")
399
289
  wrap_object = wrapped_method.get("object")
400
290
  wrap_method = wrapped_method.get("method")
401
291
  unwrap(wrap_package, f"{wrap_object}.{wrap_method}")
402
- for span in _context_spans.values():
403
- if span.is_recording():
404
- span.end()
405
- _context_spans = {}
@@ -12,7 +12,6 @@ from lmnr.sdk.browser.utils import retry_sync, retry_async
12
12
  from lmnr.sdk.client.synchronous.sync_client import LaminarClient
13
13
  from lmnr.sdk.client.asynchronous.async_client import AsyncLaminarClient
14
14
 
15
-
16
15
  try:
17
16
  if is_package_installed("playwright"):
18
17
  from playwright.async_api import Page
@@ -110,11 +109,15 @@ async def send_events_async(
110
109
  await client._browser_events.send(session_id, trace_id, events)
111
110
  except Exception as e:
112
111
  if str(e).startswith("Page.evaluate: Execution context was destroyed"):
113
- logger.info("Execution context was destroyed, injecting rrweb again")
114
- await inject_rrweb_async(page)
112
+ await inject_session_recorder_async(page)
115
113
  await send_events_async(page, session_id, trace_id, client)
116
114
  else:
117
- logger.debug(f"Could not send events: {e}")
115
+ # silence the error if the page has been closed, not an issue
116
+ if (
117
+ "Page.evaluate: Target page, context or browser has been closed"
118
+ not in str(e)
119
+ ):
120
+ logger.warning(f"Could not send events: {e}")
118
121
 
119
122
 
120
123
  def send_events_sync(
@@ -139,14 +142,18 @@ def send_events_sync(
139
142
 
140
143
  except Exception as e:
141
144
  if str(e).startswith("Page.evaluate: Execution context was destroyed"):
142
- logger.info("Execution context was destroyed, injecting rrweb again")
143
- inject_rrweb_sync(page)
145
+ inject_session_recorder_sync(page)
144
146
  send_events_sync(page, session_id, trace_id, client)
145
147
  else:
146
- logger.debug(f"Could not send events: {e}")
148
+ # silence the error if the page has been closed, not an issue
149
+ if (
150
+ "Page.evaluate: Target page, context or browser has been closed"
151
+ not in str(e)
152
+ ):
153
+ logger.warning(f"Could not send events: {e}")
147
154
 
148
155
 
149
- def inject_rrweb_sync(page: SyncPage):
156
+ def inject_session_recorder_sync(page: SyncPage):
150
157
  try:
151
158
  page.wait_for_load_state("domcontentloaded")
152
159
 
@@ -156,34 +163,36 @@ def inject_rrweb_sync(page: SyncPage):
156
163
  """() => typeof window.lmnrRrweb !== 'undefined'"""
157
164
  )
158
165
  except Exception as e:
159
- logger.debug(f"Failed to check if rrweb is loaded: {e}")
166
+ logger.debug(f"Failed to check if session recorder is loaded: {e}")
160
167
  is_loaded = False
161
168
 
162
169
  if not is_loaded:
163
170
 
164
- def load_rrweb():
171
+ def load_session_recorder():
165
172
  try:
166
173
  page.evaluate(RRWEB_CONTENT)
167
174
  return True
168
175
  except Exception as e:
169
- logger.debug(f"Failed to load rrweb: {e}")
176
+ logger.debug(f"Failed to load session recorder: {e}")
170
177
  return False
171
178
 
172
179
  if not retry_sync(
173
- load_rrweb, delay=1, error_message="Failed to load rrweb"
180
+ load_session_recorder,
181
+ delay=1,
182
+ error_message="Failed to load session recorder",
174
183
  ):
175
184
  return
176
185
 
177
186
  try:
178
187
  page.evaluate(INJECT_PLACEHOLDER)
179
188
  except Exception as e:
180
- logger.debug(f"Failed to inject rrweb placeholder: {e}")
189
+ logger.debug(f"Failed to inject session recorder: {e}")
181
190
 
182
191
  except Exception as e:
183
- logger.error(f"Error during rrweb injection: {e}")
192
+ logger.error(f"Error during session recorder injection: {e}")
184
193
 
185
194
 
186
- async def inject_rrweb_async(page: Page):
195
+ async def inject_session_recorder_async(page: Page):
187
196
  try:
188
197
  await page.wait_for_load_state("domcontentloaded")
189
198
 
@@ -193,38 +202,40 @@ async def inject_rrweb_async(page: Page):
193
202
  """() => typeof window.lmnrRrweb !== 'undefined'"""
194
203
  )
195
204
  except Exception as e:
196
- logger.debug(f"Failed to check if rrweb is loaded: {e}")
205
+ logger.debug(f"Failed to check if session recorder is loaded: {e}")
197
206
  is_loaded = False
198
207
 
199
208
  if not is_loaded:
200
209
 
201
- async def load_rrweb():
210
+ async def load_session_recorder():
202
211
  try:
203
212
  await page.evaluate(RRWEB_CONTENT)
204
213
  return True
205
214
  except Exception as e:
206
- logger.debug(f"Failed to load rrweb: {e}")
215
+ logger.debug(f"Failed to load session recorder: {e}")
207
216
  return False
208
217
 
209
218
  if not await retry_async(
210
- load_rrweb, delay=1, error_message="Failed to load rrweb"
219
+ load_session_recorder,
220
+ delay=1,
221
+ error_message="Failed to load session recorder",
211
222
  ):
212
223
  return
213
224
 
214
225
  try:
215
226
  await page.evaluate(INJECT_PLACEHOLDER)
216
227
  except Exception as e:
217
- logger.debug(f"Failed to inject rrweb placeholder: {e}")
228
+ logger.debug(f"Failed to inject session recorder placeholder: {e}")
218
229
 
219
230
  except Exception as e:
220
- logger.error(f"Error during rrweb injection: {e}")
231
+ logger.error(f"Error during session recorder injection: {e}")
221
232
 
222
233
 
223
234
  @observe(name="playwright.page", ignore_input=True, ignore_output=True)
224
- def handle_navigation_sync(
225
- page: SyncPage, session_id: str, trace_id: str, client: LaminarClient
226
- ):
227
- trace.get_current_span().set_attribute("lmnr.internal.has_browser_session", True)
235
+ def handle_navigation_sync(page: SyncPage, session_id: str, client: LaminarClient):
236
+ span = trace.get_current_span()
237
+ trace_id = format(span.get_span_context().trace_id, "032x")
238
+ span.set_attribute("lmnr.internal.has_browser_session", True)
228
239
  original_bring_to_front = page.bring_to_front
229
240
 
230
241
  def bring_to_front():
@@ -245,7 +256,7 @@ def handle_navigation_sync(
245
256
 
246
257
  def on_load():
247
258
  try:
248
- inject_rrweb_sync(page)
259
+ inject_session_recorder_sync(page)
249
260
  except Exception as e:
250
261
  logger.error(f"Error in on_load handler: {e}")
251
262
 
@@ -266,14 +277,17 @@ def handle_navigation_sync(
266
277
 
267
278
  page.on("load", on_load)
268
279
  page.on("close", on_close)
269
- inject_rrweb_sync(page)
280
+ inject_session_recorder_sync(page)
270
281
 
271
282
 
272
283
  @observe(name="playwright.page", ignore_input=True, ignore_output=True)
273
284
  async def handle_navigation_async(
274
- page: Page, session_id: str, trace_id: str, client: AsyncLaminarClient
285
+ page: Page, session_id: str, client: AsyncLaminarClient
275
286
  ):
276
- trace.get_current_span().set_attribute("lmnr.internal.has_browser_session", True)
287
+
288
+ span = trace.get_current_span()
289
+ trace_id = format(span.get_span_context().trace_id, "032x")
290
+ span.set_attribute("lmnr.internal.has_browser_session", True)
277
291
 
278
292
  async def collection_loop():
279
293
  try:
@@ -289,7 +303,7 @@ async def handle_navigation_async(
289
303
 
290
304
  async def on_load():
291
305
  try:
292
- await inject_rrweb_async(page)
306
+ await inject_session_recorder_async(page)
293
307
  except Exception as e:
294
308
  logger.error(f"Error in on_load handler: {e}")
295
309
 
@@ -321,4 +335,4 @@ async def handle_navigation_async(
321
335
  )
322
336
 
323
337
  page.bring_to_front = bring_to_front
324
- await inject_rrweb_async(page)
338
+ await inject_session_recorder_async(page)
lmnr/version.py CHANGED
@@ -3,7 +3,7 @@ import httpx
3
3
  from packaging import version
4
4
 
5
5
 
6
- __version__ = "0.6.18"
6
+ __version__ = "0.6.19"
7
7
  PYTHON_VERSION = f"{sys.version_info.major}.{sys.version_info.minor}"
8
8
 
9
9
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lmnr
3
- Version: 0.6.18
3
+ Version: 0.6.19
4
4
  Summary: Python SDK for Laminar
5
5
  Author: lmnr.ai
6
6
  Author-email: lmnr.ai <founders@lmnr.ai>
@@ -12,7 +12,7 @@ Requires-Dist: opentelemetry-sdk>=1.33.0
12
12
  Requires-Dist: opentelemetry-exporter-otlp-proto-http>=1.33.0
13
13
  Requires-Dist: opentelemetry-exporter-otlp-proto-grpc>=1.33.0
14
14
  Requires-Dist: opentelemetry-semantic-conventions>=0.54b0
15
- Requires-Dist: opentelemetry-semantic-conventions-ai>=0.4.8
15
+ Requires-Dist: opentelemetry-semantic-conventions-ai>=0.4.9
16
16
  Requires-Dist: tqdm>=4.0
17
17
  Requires-Dist: tenacity>=8.0
18
18
  Requires-Dist: grpcio>=1
@@ -36,7 +36,6 @@ Requires-Dist: opentelemetry-instrumentation-mcp>=0.40.12 ; extra == 'all'
36
36
  Requires-Dist: opentelemetry-instrumentation-milvus>=0.40.12 ; extra == 'all'
37
37
  Requires-Dist: opentelemetry-instrumentation-mistralai>=0.40.12 ; extra == 'all'
38
38
  Requires-Dist: opentelemetry-instrumentation-ollama>=0.40.12 ; extra == 'all'
39
- Requires-Dist: opentelemetry-instrumentation-openai>=0.40.12 ; extra == 'all'
40
39
  Requires-Dist: opentelemetry-instrumentation-pinecone>=0.40.12 ; extra == 'all'
41
40
  Requires-Dist: opentelemetry-instrumentation-qdrant>=0.40.12 ; extra == 'all'
42
41
  Requires-Dist: opentelemetry-instrumentation-replicate>=0.40.12 ; extra == 'all'
@@ -62,7 +61,6 @@ Requires-Dist: opentelemetry-instrumentation-mcp>=0.40.12 ; extra == 'mcp'
62
61
  Requires-Dist: opentelemetry-instrumentation-milvus>=0.40.12 ; extra == 'milvus'
63
62
  Requires-Dist: opentelemetry-instrumentation-mistralai>=0.40.12 ; extra == 'mistralai'
64
63
  Requires-Dist: opentelemetry-instrumentation-ollama>=0.40.12 ; extra == 'ollama'
65
- Requires-Dist: opentelemetry-instrumentation-openai>=0.40.12 ; extra == 'openai'
66
64
  Requires-Dist: opentelemetry-instrumentation-pinecone>=0.40.12 ; extra == 'pinecone'
67
65
  Requires-Dist: opentelemetry-instrumentation-qdrant>=0.40.12 ; extra == 'qdrant'
68
66
  Requires-Dist: opentelemetry-instrumentation-replicate>=0.40.12 ; extra == 'replicate'
@@ -91,7 +89,6 @@ Provides-Extra: mcp
91
89
  Provides-Extra: milvus
92
90
  Provides-Extra: mistralai
93
91
  Provides-Extra: ollama
94
- Provides-Extra: openai
95
92
  Provides-Extra: pinecone
96
93
  Provides-Extra: qdrant
97
94
  Provides-Extra: replicate
@@ -5,15 +5,32 @@ lmnr/opentelemetry_lib/__init__.py,sha256=6962aca915d485586ed814b9e799ced898594a
5
5
  lmnr/opentelemetry_lib/decorators/__init__.py,sha256=e391d5a189c70b563d0ff552922a036ea0f7826e113c2e6c2a8ceda26048e63f,8496
6
6
  lmnr/opentelemetry_lib/litellm/__init__.py,sha256=c23a38e88b7919d866c4f09a880f2468ac9acf756cb910d1614082b2dbcad3e6,14858
7
7
  lmnr/opentelemetry_lib/litellm/utils.py,sha256=da8cf0553f82dc7203109f117a4c7b4185e8baf34caad12d7823875515201a27,539
8
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/google_genai/__init__.py,sha256=9a5b624c35420b232e85036ea0b1ef6e583d3b95f49dc1bac4dddfd68a527905,18613
8
+ lmnr/opentelemetry_lib/opentelemetry/instrumentation/google_genai/__init__.py,sha256=8eb4abc2a96aa09ab9104d74ae508ea9ea6a6cbf60f8cd333b4c15c425db48e8,20166
9
9
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/google_genai/config.py,sha256=db9cdebc9ee0dccb493ffe608eede3047efec20ed26c3924b72b2e50edbd92c2,245
10
+ lmnr/opentelemetry_lib/opentelemetry/instrumentation/google_genai/schema_utils.py,sha256=857a6bc52f8bfd4da72786173615d31faaf3f9378f8f6150ffe8f6f9c4bb78f9,685
10
11
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/google_genai/utils.py,sha256=f1248196246826d899304e510c4c2df74088d8169d28f1d0aed578a7a6c3cbfd,7669
11
12
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/langgraph/__init__.py,sha256=272bfd92865d180e3ea13681ec04c1ec3697eda34e63edd83862f8c17d1cecf3,3107
12
13
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/langgraph/utils.py,sha256=9dff6c2595e79edb38818668aed1220efc188d8a982594c04f4ceeb6e3ff47a6,1512
14
+ lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/__init__.py,sha256=8b91dc16af927eee75b969c0980c606680b347a87f8533bc0f4a092e5ec6e5c9,2071
15
+ lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/__init__.py,sha256=dcc910aa6df02263cad89c1feac2aa21e316fdd6b491ebca2b93fd24a5149625,14911
16
+ lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/chat_wrappers.py,sha256=15a1236b0b383089f4ddf8bef50ccab48e57d01fa403b1f6008922980d931f46,33422
17
+ lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/completion_wrappers.py,sha256=cb72111e7a5a7a13920b79b6f76bb504e54ece81855dc997978fdbdd11d36f85,9180
18
+ lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/config.py,sha256=8016e4af0291a77484ce88d7d1ca06146b1229ae0e0a0f46e042faf75b456a8f,507
19
+ lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/embeddings_wrappers.py,sha256=345c4c795019418b9c7cbf4e571689b566f2b0e350579b48fd2f5f2535351586,9076
20
+ lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/event_emitter.py,sha256=9c96455b5ca2064dd3a9fb570d78b14ebbdf3d02f8e33255ee9e301c31336c9e,3043
21
+ lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/event_models.py,sha256=3c27c21b1aeb02bc19a91fb8c05717ae1c10ab4b01300c664aba42e0f50cb5a3,876
22
+ lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/image_gen_wrappers.py,sha256=9650a0e4ad2d3bfb2a072590da189bcf4f807aca070945af26a9f9b99d779b77,2021
23
+ lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/utils.py,sha256=88796cca1f8ee07c5face21e1fbe66f572191cecc2c93c62c22f84ee5a47e299,4727
24
+ lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v0/__init__.py,sha256=7f43421e052bd8f64d5d5b03170a3b7187c2ce038362fa15b5d1d0c43bc1a40d,6143
25
+ lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v1/__init__.py,sha256=662afd935c52b42512280614bf502554389c8854ab1256efbfde03fe364dac64,12932
26
+ lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v1/assistant_wrappers.py,sha256=8f36cb3eeeead7abdfa43bca3fdf73fdf2fba562bb1a746225696a2b2dde4f50,10111
27
+ lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v1/event_handler_wrapper.py,sha256=18d106e77f26ebb233bf3379edf3116540891d643be72be73ea47be3724a89b8,4211
28
+ lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v1/responses_wrappers.py,sha256=84842236814038421c7d2fa5bd15361a8c0ad625a81b1cd963a351399fec9efb,23733
29
+ lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/version.py,sha256=4f39aaa913f3e49b0c174bc23028687d00bfaffc745bd3fe241e0ae6b442bed1,24
13
30
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/opentelemetry/__init__.py,sha256=1f86cdf738e2f68586b0a4569bb1e40edddd85c529f511ef49945ddb7b61fab5,2648
14
31
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/skyvern/__init__.py,sha256=764e4fe979fb08d7821419a3cc5c3ae89a6664b626ef928259f8f175c939eaea,6334
15
32
  lmnr/opentelemetry_lib/tracing/__init__.py,sha256=dbb4288007be687cab56be9be7af8376e526d0a104db82b5695d9ed67a2e4cd8,6007
16
- lmnr/opentelemetry_lib/tracing/_instrument_initializers.py,sha256=2feb6f91b08ee9cc74348df113eb5156d45de40d8d0a5c117790c4f7158193ca,15209
33
+ lmnr/opentelemetry_lib/tracing/_instrument_initializers.py,sha256=53444be1c6c1f9c5acc3291a4984222519d3237abf9ed1c9296b438776e7ec36,15110
17
34
  lmnr/opentelemetry_lib/tracing/attributes.py,sha256=32fa30565b977c2a92202dc2bf1ded583a81d02a6bf5ba52958f75a8be08cbbe,1497
18
35
  lmnr/opentelemetry_lib/tracing/context_properties.py,sha256=6966ef31d581e10eeea9cd06192b237115cc4dc3b5f1a58e68865edd0c92fda0,2314
19
36
  lmnr/opentelemetry_lib/tracing/exporter.py,sha256=6af8e61fd873e8f5db315d9b9f1edbf46b860ba7e50140f0bdcc6864c6d35a03,2082
@@ -26,10 +43,10 @@ lmnr/opentelemetry_lib/utils/package_check.py,sha256=493d81bc3c6dd1b6b1fa287d17d
26
43
  lmnr/py.typed,sha256=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855,0
27
44
  lmnr/sdk/__init__.py,sha256=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855,0
28
45
  lmnr/sdk/browser/__init__.py,sha256=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855,0
29
- lmnr/sdk/browser/browser_use_otel.py,sha256=2fc7e6fe93808ba5e4b92103e214c822dcc0fc150c623ed8bcdec1805b076430,5093
30
- lmnr/sdk/browser/patchright_otel.py,sha256=3bb9f5741fccc3efcbef4ce2d33aa99c51622ae4cf104a4eeebcb589ae885d64,5454
31
- lmnr/sdk/browser/playwright_otel.py,sha256=2c58358895db7b3f8112010863d79a3bfd93dae47a4b1c9f14be3a7c7712ecc8,13423
32
- lmnr/sdk/browser/pw_utils.py,sha256=3cf55d784e9157e9fb75edc0a6e115aa34d7adb909c6d18eb19e3b09ef8d9dad,10307
46
+ lmnr/sdk/browser/browser_use_otel.py,sha256=aa7470285eb09648f9bf2f3f8fb4409b0ca68ab1cc545d37914a9ac04cc0048e,5092
47
+ lmnr/sdk/browser/patchright_otel.py,sha256=e72b5c42ffa2fd4107aa630b6d1253f18fbda4cef84396538a3e0ccefaa03e47,5079
48
+ lmnr/sdk/browser/playwright_otel.py,sha256=59f477e921e777d49ccda4ef1017a50bb5584fd901cf7d9ed7889468f0586a16,9470
49
+ lmnr/sdk/browser/pw_utils.py,sha256=81bb14ffc53c47a72961e8d1e231efc473f9b2cb7e2992e97751e8dad0e69184,11009
33
50
  lmnr/sdk/browser/rrweb/rrweb.umd.min.cjs,sha256=2f2da38b00bb85312d8225f3069a09352135564ceed2564f652f1bae3bac016d,260896
34
51
  lmnr/sdk/browser/utils.py,sha256=4a668776d2938108d25fbcecd61c8e1710a4da3e56230d5fefca5964dd09e3c1,2371
35
52
  lmnr/sdk/client/asynchronous/async_client.py,sha256=da621ecd403352baa4e6d0999737e4203e0dcc8cbf26ec8142d0c2013fb632ba,4585
@@ -54,8 +71,8 @@ lmnr/sdk/laminar.py,sha256=a0e55ca3f73d66cb53ef51ecaae1ac81bb45ba65ddd848f3d2b97
54
71
  lmnr/sdk/log.py,sha256=9edfd83263f0d4845b1b2d1beeae2b4ed3f8628de941f371a893d72b79c348d4,2213
55
72
  lmnr/sdk/types.py,sha256=650a7949e609359b0adcaadb49e5cf63fc67ea61a35b9992c3f8b445dfce6b89,12328
56
73
  lmnr/sdk/utils.py,sha256=cab707221a000dff65587f6a25664c9a445662f7740eec4f48b3f7998e98170d,4327
57
- lmnr/version.py,sha256=3439c6e1a1ba1d0ed47daa6f0743e61f79d1a00ecc6864889dc9b73b8291af38,1322
58
- lmnr-0.6.18.dist-info/WHEEL,sha256=607c46fee47e440c91332c738096ff0f5e54ca3b0818ee85462dd5172a38e793,79
59
- lmnr-0.6.18.dist-info/entry_points.txt,sha256=abdf3411b7dd2d7329a241f2da6669bab4e314a747a586ecdb9f888f3035003c,39
60
- lmnr-0.6.18.dist-info/METADATA,sha256=7cd9d0c84424f2ef5bbfc6571ed8725017f141e3e4f0bfe93bd84119ec803ee5,14657
61
- lmnr-0.6.18.dist-info/RECORD,,
74
+ lmnr/version.py,sha256=e1e5a6ad24ee26cbf40f635c206464fb6dd4906e4b8881e03c451796b4b5f843,1322
75
+ lmnr-0.6.19.dist-info/WHEEL,sha256=66530aef82d5020ef5af27ae0123c71abb9261377c5bc519376c671346b12918,79
76
+ lmnr-0.6.19.dist-info/entry_points.txt,sha256=abdf3411b7dd2d7329a241f2da6669bab4e314a747a586ecdb9f888f3035003c,39
77
+ lmnr-0.6.19.dist-info/METADATA,sha256=ecbff9a35e6ae55ded780b747c97344d434f0f4617cf3caf6545fc367f5b932e,14475
78
+ lmnr-0.6.19.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: uv 0.7.19
2
+ Generator: uv 0.7.20
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any