lmnr 0.7.1__py3-none-any.whl → 0.7.2__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.
@@ -29,6 +29,10 @@ from .utils import (
29
29
  shared_metrics_attributes,
30
30
  should_emit_events,
31
31
  )
32
+ from .streaming import (
33
+ WrappedAsyncMessageStreamManager,
34
+ WrappedMessageStreamManager,
35
+ )
32
36
  from .version import __version__
33
37
 
34
38
  from lmnr.opentelemetry_lib.tracing.context import get_current_context
@@ -52,6 +56,7 @@ logger = logging.getLogger(__name__)
52
56
 
53
57
  _instruments = ("anthropic >= 0.3.11",)
54
58
 
59
+
55
60
  WRAPPED_METHODS = [
56
61
  {
57
62
  "package": "anthropic.resources.completions",
@@ -71,6 +76,15 @@ WRAPPED_METHODS = [
71
76
  "method": "stream",
72
77
  "span_name": "anthropic.chat",
73
78
  },
79
+ # This method is on an async resource, but is meant to be called as
80
+ # an async context manager (async with), which we don't need to await;
81
+ # thus, we wrap it with a sync wrapper
82
+ {
83
+ "package": "anthropic.resources.messages",
84
+ "object": "AsyncMessages",
85
+ "method": "stream",
86
+ "span_name": "anthropic.chat",
87
+ },
74
88
  ]
75
89
 
76
90
  WRAPPED_AMETHODS = [
@@ -86,12 +100,6 @@ WRAPPED_AMETHODS = [
86
100
  "method": "create",
87
101
  "span_name": "anthropic.chat",
88
102
  },
89
- {
90
- "package": "anthropic.resources.messages",
91
- "object": "AsyncMessages",
92
- "method": "stream",
93
- "span_name": "anthropic.chat",
94
- },
95
103
  ]
96
104
 
97
105
 
@@ -99,6 +107,23 @@ def is_streaming_response(response):
99
107
  return isinstance(response, Stream) or isinstance(response, AsyncStream)
100
108
 
101
109
 
110
+ def is_stream_manager(response):
111
+ """Check if response is a MessageStreamManager or AsyncMessageStreamManager"""
112
+ try:
113
+ from anthropic.lib.streaming._messages import (
114
+ MessageStreamManager,
115
+ AsyncMessageStreamManager,
116
+ )
117
+
118
+ return isinstance(response, (MessageStreamManager, AsyncMessageStreamManager))
119
+ except ImportError:
120
+ # Check by class name as fallback
121
+ return (
122
+ response.__class__.__name__ == "MessageStreamManager"
123
+ or response.__class__.__name__ == "AsyncMessageStreamManager"
124
+ )
125
+
126
+
102
127
  @dont_throw
103
128
  async def _aset_token_usage(
104
129
  span,
@@ -437,6 +462,33 @@ def _wrap(
437
462
  event_logger,
438
463
  kwargs,
439
464
  )
465
+ elif is_stream_manager(response):
466
+ if response.__class__.__name__ == "AsyncMessageStreamManager":
467
+ return WrappedAsyncMessageStreamManager(
468
+ response,
469
+ span,
470
+ instance._client,
471
+ start_time,
472
+ token_histogram,
473
+ choice_counter,
474
+ duration_histogram,
475
+ exception_counter,
476
+ event_logger,
477
+ kwargs,
478
+ )
479
+ else:
480
+ return WrappedMessageStreamManager(
481
+ response,
482
+ span,
483
+ instance._client,
484
+ start_time,
485
+ token_histogram,
486
+ choice_counter,
487
+ duration_histogram,
488
+ exception_counter,
489
+ event_logger,
490
+ kwargs,
491
+ )
440
492
  elif response:
441
493
  try:
442
494
  metric_attributes = shared_metrics_attributes(response)
@@ -532,6 +584,33 @@ async def _awrap(
532
584
  event_logger,
533
585
  kwargs,
534
586
  )
587
+ elif is_stream_manager(response):
588
+ if response.__class__.__name__ == "AsyncMessageStreamManager":
589
+ return WrappedAsyncMessageStreamManager(
590
+ response,
591
+ span,
592
+ instance._client,
593
+ start_time,
594
+ token_histogram,
595
+ choice_counter,
596
+ duration_histogram,
597
+ exception_counter,
598
+ event_logger,
599
+ kwargs,
600
+ )
601
+ else:
602
+ return WrappedMessageStreamManager(
603
+ response,
604
+ span,
605
+ instance._client,
606
+ start_time,
607
+ token_histogram,
608
+ choice_counter,
609
+ duration_histogram,
610
+ exception_counter,
611
+ event_logger,
612
+ kwargs,
613
+ )
535
614
  elif response:
536
615
  metric_attributes = shared_metrics_attributes(response)
537
616
 
@@ -113,18 +113,43 @@ async def aset_input_attributes(span, kwargs):
113
113
  )
114
114
  for i, message in enumerate(kwargs.get("messages")):
115
115
  prompt_index = i + (1 if has_system_message else 0)
116
+ content = message.get("content")
117
+ tool_use_blocks = []
118
+ other_blocks = []
119
+ if isinstance(content, list):
120
+ for block in content:
121
+ if dict(block).get("type") == "tool_use":
122
+ tool_use_blocks.append(dict(block))
123
+ else:
124
+ other_blocks.append(block)
125
+ content = other_blocks
116
126
  set_span_attribute(
117
127
  span,
118
128
  f"{SpanAttributes.LLM_PROMPTS}.{prompt_index}.content",
119
- await _dump_content(
120
- message_index=i, span=span, content=message.get("content")
121
- ),
129
+ await _dump_content(message_index=i, span=span, content=content),
122
130
  )
123
131
  set_span_attribute(
124
132
  span,
125
133
  f"{SpanAttributes.LLM_PROMPTS}.{prompt_index}.role",
126
134
  message.get("role"),
127
135
  )
136
+ if tool_use_blocks:
137
+ for tool_num, tool_use_block in enumerate(tool_use_blocks):
138
+ set_span_attribute(
139
+ span,
140
+ f"{SpanAttributes.LLM_PROMPTS}.{prompt_index}.tool_calls.{tool_num}.id",
141
+ tool_use_block.get("id"),
142
+ )
143
+ set_span_attribute(
144
+ span,
145
+ f"{SpanAttributes.LLM_PROMPTS}.{prompt_index}.tool_calls.{tool_num}.name",
146
+ tool_use_block.get("name"),
147
+ )
148
+ set_span_attribute(
149
+ span,
150
+ f"{SpanAttributes.LLM_PROMPTS}.{prompt_index}.tool_calls.{tool_num}.arguments",
151
+ json.dumps(tool_use_block.get("input")),
152
+ )
128
153
 
129
154
  if kwargs.get("tools") is not None:
130
155
  for i, tool in enumerate(kwargs.get("tools")):
@@ -160,8 +185,8 @@ def _set_span_completions(span, response):
160
185
  content_block_type = content.type
161
186
  # usually, Antrhopic responds with just one text block,
162
187
  # but the API allows for multiple text blocks, so concatenate them
163
- if content_block_type == "text":
164
- text += content.text
188
+ if content_block_type == "text" and hasattr(content, "text"):
189
+ text += content.text or ""
165
190
  elif content_block_type == "thinking":
166
191
  content = dict(content)
167
192
  # override the role to thinking
@@ -242,15 +267,33 @@ def set_streaming_response_attributes(span, complete_response_events):
242
267
  if not span.is_recording() or not complete_response_events:
243
268
  return
244
269
 
245
- try:
246
- for event in complete_response_events:
247
- index = event.get("index")
248
- prefix = f"{SpanAttributes.LLM_COMPLETIONS}.{index}"
270
+ index = 0
271
+ for event in complete_response_events:
272
+ prefix = f"{SpanAttributes.LLM_COMPLETIONS}.{index}"
273
+ set_span_attribute(span, f"{prefix}.finish_reason", event.get("finish_reason"))
274
+ role = "thinking" if event.get("type") == "thinking" else "assistant"
275
+ # Thinking is added as a separate completion, so we need to increment the index
276
+ if event.get("type") == "thinking":
277
+ index += 1
278
+ set_span_attribute(span, f"{prefix}.role", role)
279
+ if event.get("type") == "tool_use":
280
+ set_span_attribute(
281
+ span,
282
+ f"{prefix}.tool_calls.0.id",
283
+ event.get("id"),
284
+ )
249
285
  set_span_attribute(
250
- span, f"{prefix}.finish_reason", event.get("finish_reason")
286
+ span,
287
+ f"{prefix}.tool_calls.0.name",
288
+ event.get("name"),
251
289
  )
252
- role = "thinking" if event.get("type") == "thinking" else "assistant"
253
- set_span_attribute(span, f"{prefix}.role", role)
290
+ tool_arguments = event.get("input")
291
+ if tool_arguments is not None:
292
+ set_span_attribute(
293
+ span,
294
+ f"{prefix}.tool_calls.0.arguments",
295
+ # already stringified
296
+ tool_arguments,
297
+ )
298
+ else:
254
299
  set_span_attribute(span, f"{prefix}.content", event.get("text"))
255
- except Exception as e:
256
- logger.warning("Failed to set completion attributes, error: %s", str(e))
@@ -40,15 +40,19 @@ def _process_response_item(item, complete_response):
40
40
  complete_response["events"].append(
41
41
  {"index": index, "text": "", "type": item.content_block.type}
42
42
  )
43
- elif item.type == "content_block_delta" and item.delta.type in [
44
- "thinking_delta",
45
- "text_delta",
46
- ]:
43
+ if item.content_block.type == "tool_use":
44
+ complete_response["events"][index]["id"] = item.content_block.id
45
+ complete_response["events"][index]["name"] = item.content_block.name
46
+ complete_response["events"][index]["input"] = ""
47
+
48
+ elif item.type == "content_block_delta":
47
49
  index = item.index
48
50
  if item.delta.type == "thinking_delta":
49
- complete_response["events"][index]["text"] += item.delta.thinking
51
+ complete_response["events"][index]["text"] += item.delta.thinking or ""
50
52
  elif item.delta.type == "text_delta":
51
- complete_response["events"][index]["text"] += item.delta.text
53
+ complete_response["events"][index]["text"] += item.delta.text or ""
54
+ elif item.delta.type == "input_json_delta":
55
+ complete_response["events"][index]["input"] += item.delta.partial_json
52
56
  elif item.type == "message_delta":
53
57
  for event in complete_response.get("events", []):
54
58
  event["finish_reason"] = item.delta.stop_reason
@@ -293,3 +297,99 @@ async def abuild_from_streaming_response(
293
297
  if span.is_recording():
294
298
  span.set_status(Status(StatusCode.OK))
295
299
  span.end()
300
+
301
+
302
+ class WrappedMessageStreamManager:
303
+ """Wrapper for MessageStreamManager that handles instrumentation"""
304
+
305
+ def __init__(
306
+ self,
307
+ stream_manager,
308
+ span,
309
+ instance,
310
+ start_time,
311
+ token_histogram,
312
+ choice_counter,
313
+ duration_histogram,
314
+ exception_counter,
315
+ event_logger,
316
+ kwargs,
317
+ ):
318
+ self._stream_manager = stream_manager
319
+ self._span = span
320
+ self._instance = instance
321
+ self._start_time = start_time
322
+ self._token_histogram = token_histogram
323
+ self._choice_counter = choice_counter
324
+ self._duration_histogram = duration_histogram
325
+ self._exception_counter = exception_counter
326
+ self._event_logger = event_logger
327
+ self._kwargs = kwargs
328
+
329
+ def __enter__(self):
330
+ # Call the original stream manager's __enter__ to get the actual stream
331
+ stream = self._stream_manager.__enter__()
332
+ # Return the wrapped stream
333
+ return build_from_streaming_response(
334
+ self._span,
335
+ stream,
336
+ self._instance,
337
+ self._start_time,
338
+ self._token_histogram,
339
+ self._choice_counter,
340
+ self._duration_histogram,
341
+ self._exception_counter,
342
+ self._event_logger,
343
+ self._kwargs,
344
+ )
345
+
346
+ def __exit__(self, exc_type, exc_val, exc_tb):
347
+ return self._stream_manager.__exit__(exc_type, exc_val, exc_tb)
348
+
349
+
350
+ class WrappedAsyncMessageStreamManager:
351
+ """Wrapper for AsyncMessageStreamManager that handles instrumentation"""
352
+
353
+ def __init__(
354
+ self,
355
+ stream_manager,
356
+ span,
357
+ instance,
358
+ start_time,
359
+ token_histogram,
360
+ choice_counter,
361
+ duration_histogram,
362
+ exception_counter,
363
+ event_logger,
364
+ kwargs,
365
+ ):
366
+ self._stream_manager = stream_manager
367
+ self._span = span
368
+ self._instance = instance
369
+ self._start_time = start_time
370
+ self._token_histogram = token_histogram
371
+ self._choice_counter = choice_counter
372
+ self._duration_histogram = duration_histogram
373
+ self._exception_counter = exception_counter
374
+ self._event_logger = event_logger
375
+ self._kwargs = kwargs
376
+
377
+ async def __aenter__(self):
378
+ # Call the original stream manager's __aenter__ to get the actual stream
379
+ stream = await self._stream_manager.__aenter__()
380
+ # Return the wrapped stream
381
+ return abuild_from_streaming_response(
382
+ self._span,
383
+ stream,
384
+ self._instance,
385
+ self._start_time,
386
+ self._token_histogram,
387
+ self._choice_counter,
388
+ self._duration_histogram,
389
+ self._exception_counter,
390
+ self._event_logger,
391
+ self._kwargs,
392
+ )
393
+
394
+ async def __aexit__(self, exc_type, exc_val, exc_tb):
395
+ return await self._stream_manager.__aexit__(exc_type, exc_val, exc_tb)
@@ -487,12 +487,6 @@ def start_recording_events_sync(page: SyncPage, session_id: str, client: Laminar
487
487
  trace_id = format(span.get_span_context().trace_id, "032x")
488
488
  span.set_attribute("lmnr.internal.has_browser_session", True)
489
489
 
490
- try:
491
- if page.evaluate("""() => typeof window.lmnrSendEvents !== 'undefined'"""):
492
- return
493
- except Exception:
494
- pass
495
-
496
490
  def send_events_from_browser(events):
497
491
  try:
498
492
  if events and len(events) > 0:
@@ -524,14 +518,6 @@ async def start_recording_events_async(
524
518
  span = trace.get_current_span(ctx)
525
519
  trace_id = format(span.get_span_context().trace_id, "032x")
526
520
  span.set_attribute("lmnr.internal.has_browser_session", True)
527
-
528
- try:
529
- if await page.evaluate(
530
- """() => typeof window.lmnrSendEvents !== 'undefined'"""
531
- ):
532
- return
533
- except Exception:
534
- pass
535
521
 
536
522
  async def send_events_from_browser(events):
537
523
  try:
lmnr/version.py CHANGED
@@ -3,7 +3,7 @@ import httpx
3
3
  from packaging import version
4
4
 
5
5
 
6
- __version__ = "0.7.1"
6
+ __version__ = "0.7.2"
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.7.1
3
+ Version: 0.7.2
4
4
  Summary: Python SDK for Laminar
5
5
  Author: lmnr.ai
6
6
  Author-email: lmnr.ai <founders@lmnr.ai>
@@ -19,61 +19,59 @@ Requires-Dist: opentelemetry-exporter-otlp-proto-http>=1.33.0
19
19
  Requires-Dist: opentelemetry-exporter-otlp-proto-grpc>=1.33.0
20
20
  Requires-Dist: opentelemetry-instrumentation>=0.54b0
21
21
  Requires-Dist: opentelemetry-semantic-conventions>=0.54b0
22
- Requires-Dist: opentelemetry-semantic-conventions-ai>=0.4.9
22
+ Requires-Dist: opentelemetry-semantic-conventions-ai>=0.4.11
23
23
  Requires-Dist: tqdm>=4.0
24
24
  Requires-Dist: tenacity>=8.0
25
25
  Requires-Dist: grpcio>=1
26
26
  Requires-Dist: httpx>=0.25.0
27
27
  Requires-Dist: orjson>=3.10.18
28
28
  Requires-Dist: packaging>=22.0
29
- Requires-Dist: opentelemetry-instrumentation-alephalpha>=0.40.12 ; extra == 'alephalpha'
30
- Requires-Dist: opentelemetry-instrumentation-alephalpha>=0.40.12 ; extra == 'all'
31
- Requires-Dist: opentelemetry-instrumentation-bedrock>=0.40.12 ; extra == 'all'
32
- Requires-Dist: opentelemetry-instrumentation-chromadb>=0.40.12 ; extra == 'all'
33
- Requires-Dist: opentelemetry-instrumentation-cohere>=0.40.12 ; extra == 'all'
34
- Requires-Dist: opentelemetry-instrumentation-crewai>=0.40.12 ; extra == 'all'
35
- Requires-Dist: opentelemetry-instrumentation-google-generativeai<0.40.10 ; extra == 'all'
36
- Requires-Dist: opentelemetry-instrumentation-haystack>=0.40.12 ; extra == 'all'
37
- Requires-Dist: opentelemetry-instrumentation-lancedb>=0.40.12 ; extra == 'all'
38
- Requires-Dist: opentelemetry-instrumentation-langchain>=0.40.12 ; extra == 'all'
39
- Requires-Dist: opentelemetry-instrumentation-llamaindex>=0.40.12 ; extra == 'all'
40
- Requires-Dist: opentelemetry-instrumentation-marqo>=0.40.12 ; extra == 'all'
41
- Requires-Dist: opentelemetry-instrumentation-mcp>=0.40.12 ; extra == 'all'
42
- Requires-Dist: opentelemetry-instrumentation-milvus>=0.40.12 ; extra == 'all'
43
- Requires-Dist: opentelemetry-instrumentation-mistralai>=0.40.12 ; extra == 'all'
44
- Requires-Dist: opentelemetry-instrumentation-ollama>=0.40.12 ; extra == 'all'
45
- Requires-Dist: opentelemetry-instrumentation-pinecone>=0.40.12 ; extra == 'all'
46
- Requires-Dist: opentelemetry-instrumentation-qdrant>=0.40.12 ; extra == 'all'
47
- Requires-Dist: opentelemetry-instrumentation-replicate>=0.40.12 ; extra == 'all'
48
- Requires-Dist: opentelemetry-instrumentation-sagemaker>=0.40.12 ; extra == 'all'
49
- Requires-Dist: opentelemetry-instrumentation-together>=0.40.12 ; extra == 'all'
50
- Requires-Dist: opentelemetry-instrumentation-transformers>=0.40.12 ; extra == 'all'
51
- Requires-Dist: opentelemetry-instrumentation-vertexai>=0.40.12 ; extra == 'all'
52
- Requires-Dist: opentelemetry-instrumentation-watsonx>=0.40.12 ; extra == 'all'
53
- Requires-Dist: opentelemetry-instrumentation-weaviate>=0.40.12 ; extra == 'all'
54
- Requires-Dist: opentelemetry-instrumentation-bedrock>=0.40.12 ; extra == 'bedrock'
55
- Requires-Dist: opentelemetry-instrumentation-chromadb>=0.40.12 ; extra == 'chromadb'
56
- Requires-Dist: opentelemetry-instrumentation-cohere>=0.40.12 ; extra == 'cohere'
57
- Requires-Dist: opentelemetry-instrumentation-crewai>=0.40.12 ; extra == 'crewai'
58
- Requires-Dist: opentelemetry-instrumentation-google-generativeai<0.40.10 ; extra == 'google-generativeai'
59
- Requires-Dist: opentelemetry-instrumentation-haystack>=0.40.12 ; extra == 'haystack'
60
- Requires-Dist: opentelemetry-instrumentation-lancedb>=0.40.12 ; extra == 'lancedb'
61
- Requires-Dist: opentelemetry-instrumentation-langchain>=0.40.12 ; extra == 'langchain'
62
- Requires-Dist: opentelemetry-instrumentation-llamaindex>=0.40.12 ; extra == 'llamaindex'
63
- Requires-Dist: opentelemetry-instrumentation-marqo>=0.40.12 ; extra == 'marqo'
64
- Requires-Dist: opentelemetry-instrumentation-mcp>=0.40.12 ; extra == 'mcp'
65
- Requires-Dist: opentelemetry-instrumentation-milvus>=0.40.12 ; extra == 'milvus'
66
- Requires-Dist: opentelemetry-instrumentation-mistralai>=0.40.12 ; extra == 'mistralai'
67
- Requires-Dist: opentelemetry-instrumentation-ollama>=0.40.12 ; extra == 'ollama'
68
- Requires-Dist: opentelemetry-instrumentation-pinecone>=0.40.12 ; extra == 'pinecone'
69
- Requires-Dist: opentelemetry-instrumentation-qdrant>=0.40.12 ; extra == 'qdrant'
70
- Requires-Dist: opentelemetry-instrumentation-replicate>=0.40.12 ; extra == 'replicate'
71
- Requires-Dist: opentelemetry-instrumentation-sagemaker>=0.40.12 ; extra == 'sagemaker'
72
- Requires-Dist: opentelemetry-instrumentation-together>=0.40.12 ; extra == 'together'
73
- Requires-Dist: opentelemetry-instrumentation-transformers>=0.40.12 ; extra == 'transformers'
74
- Requires-Dist: opentelemetry-instrumentation-vertexai>=0.40.12 ; extra == 'vertexai'
75
- Requires-Dist: opentelemetry-instrumentation-watsonx>=0.40.12 ; extra == 'watsonx'
76
- Requires-Dist: opentelemetry-instrumentation-weaviate>=0.40.12 ; extra == 'weaviate'
29
+ Requires-Dist: opentelemetry-instrumentation-alephalpha>=0.44.0 ; extra == 'alephalpha'
30
+ Requires-Dist: opentelemetry-instrumentation-alephalpha>=0.44.0 ; extra == 'all'
31
+ Requires-Dist: opentelemetry-instrumentation-bedrock>=0.44.0 ; extra == 'all'
32
+ Requires-Dist: opentelemetry-instrumentation-chromadb>=0.44.0 ; extra == 'all'
33
+ Requires-Dist: opentelemetry-instrumentation-cohere>=0.44.0 ; extra == 'all'
34
+ Requires-Dist: opentelemetry-instrumentation-crewai>=0.44.0 ; extra == 'all'
35
+ Requires-Dist: opentelemetry-instrumentation-haystack>=0.44.0 ; extra == 'all'
36
+ Requires-Dist: opentelemetry-instrumentation-lancedb>=0.44.0 ; extra == 'all'
37
+ Requires-Dist: opentelemetry-instrumentation-langchain>=0.44.0 ; extra == 'all'
38
+ Requires-Dist: opentelemetry-instrumentation-llamaindex>=0.44.0 ; extra == 'all'
39
+ Requires-Dist: opentelemetry-instrumentation-marqo>=0.44.0 ; extra == 'all'
40
+ Requires-Dist: opentelemetry-instrumentation-mcp>=0.44.0 ; extra == 'all'
41
+ Requires-Dist: opentelemetry-instrumentation-milvus>=0.44.0 ; extra == 'all'
42
+ Requires-Dist: opentelemetry-instrumentation-mistralai>=0.44.0 ; extra == 'all'
43
+ Requires-Dist: opentelemetry-instrumentation-ollama>=0.44.0 ; extra == 'all'
44
+ Requires-Dist: opentelemetry-instrumentation-pinecone>=0.44.0 ; extra == 'all'
45
+ Requires-Dist: opentelemetry-instrumentation-qdrant>=0.44.0 ; extra == 'all'
46
+ Requires-Dist: opentelemetry-instrumentation-replicate>=0.44.0 ; extra == 'all'
47
+ Requires-Dist: opentelemetry-instrumentation-sagemaker>=0.44.0 ; extra == 'all'
48
+ Requires-Dist: opentelemetry-instrumentation-together>=0.44.0 ; extra == 'all'
49
+ Requires-Dist: opentelemetry-instrumentation-transformers>=0.44.0 ; extra == 'all'
50
+ Requires-Dist: opentelemetry-instrumentation-vertexai>=0.44.0 ; extra == 'all'
51
+ Requires-Dist: opentelemetry-instrumentation-watsonx>=0.44.0 ; extra == 'all'
52
+ Requires-Dist: opentelemetry-instrumentation-weaviate>=0.44.0 ; extra == 'all'
53
+ Requires-Dist: opentelemetry-instrumentation-bedrock>=0.44.0 ; extra == 'bedrock'
54
+ Requires-Dist: opentelemetry-instrumentation-chromadb>=0.44.0 ; extra == 'chromadb'
55
+ Requires-Dist: opentelemetry-instrumentation-cohere>=0.44.0 ; extra == 'cohere'
56
+ Requires-Dist: opentelemetry-instrumentation-crewai>=0.44.0 ; extra == 'crewai'
57
+ Requires-Dist: opentelemetry-instrumentation-haystack>=0.44.0 ; extra == 'haystack'
58
+ Requires-Dist: opentelemetry-instrumentation-lancedb>=0.44.0 ; extra == 'lancedb'
59
+ Requires-Dist: opentelemetry-instrumentation-langchain>=0.44.0 ; extra == 'langchain'
60
+ Requires-Dist: opentelemetry-instrumentation-llamaindex>=0.44.0 ; extra == 'llamaindex'
61
+ Requires-Dist: opentelemetry-instrumentation-marqo>=0.44.0 ; extra == 'marqo'
62
+ Requires-Dist: opentelemetry-instrumentation-mcp>=0.44.0 ; extra == 'mcp'
63
+ Requires-Dist: opentelemetry-instrumentation-milvus>=0.44.0 ; extra == 'milvus'
64
+ Requires-Dist: opentelemetry-instrumentation-mistralai>=0.44.0 ; extra == 'mistralai'
65
+ Requires-Dist: opentelemetry-instrumentation-ollama>=0.44.0 ; extra == 'ollama'
66
+ Requires-Dist: opentelemetry-instrumentation-pinecone>=0.44.0 ; extra == 'pinecone'
67
+ Requires-Dist: opentelemetry-instrumentation-qdrant>=0.44.0 ; extra == 'qdrant'
68
+ Requires-Dist: opentelemetry-instrumentation-replicate>=0.44.0 ; extra == 'replicate'
69
+ Requires-Dist: opentelemetry-instrumentation-sagemaker>=0.44.0 ; extra == 'sagemaker'
70
+ Requires-Dist: opentelemetry-instrumentation-together>=0.44.0 ; extra == 'together'
71
+ Requires-Dist: opentelemetry-instrumentation-transformers>=0.44.0 ; extra == 'transformers'
72
+ Requires-Dist: opentelemetry-instrumentation-vertexai>=0.44.0 ; extra == 'vertexai'
73
+ Requires-Dist: opentelemetry-instrumentation-watsonx>=0.44.0 ; extra == 'watsonx'
74
+ Requires-Dist: opentelemetry-instrumentation-weaviate>=0.44.0 ; extra == 'weaviate'
77
75
  Requires-Python: >=3.10, <4
78
76
  Provides-Extra: alephalpha
79
77
  Provides-Extra: all
@@ -81,7 +79,6 @@ Provides-Extra: bedrock
81
79
  Provides-Extra: chromadb
82
80
  Provides-Extra: cohere
83
81
  Provides-Extra: crewai
84
- Provides-Extra: google-generativeai
85
82
  Provides-Extra: haystack
86
83
  Provides-Extra: lancedb
87
84
  Provides-Extra: langchain
@@ -5,12 +5,12 @@ lmnr/opentelemetry_lib/__init__.py,sha256=6962aca915d485586ed814b9e799ced898594a
5
5
  lmnr/opentelemetry_lib/decorators/__init__.py,sha256=216536fb3ac8de18e6dfe4dfb2e571074c727466f97e6dcd609339c8458a345a,11511
6
6
  lmnr/opentelemetry_lib/litellm/__init__.py,sha256=8a3679381ca5660cf53e4b7571850906c6635264129149adebda8f3f7c248f68,15127
7
7
  lmnr/opentelemetry_lib/litellm/utils.py,sha256=da8cf0553f82dc7203109f117a4c7b4185e8baf34caad12d7823875515201a27,539
8
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/__init__.py,sha256=984b8f97eb31d4345ea4c52237451f791af189c4a94aaf2625edfd05107d8a6e,20696
8
+ lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/__init__.py,sha256=2604189b7598edb5404ddbcd0775bdf2dc506dd5e6319eef4e4724e39c420301,23276
9
9
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/config.py,sha256=972919b821b9b7e5dc7cd191ba7e78b30b6efa5d63514e8cb301996d6386392c,369
10
10
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/event_emitter.py,sha256=812b3ea1c5a04412113d4dd770717561861595f9eec5b94dd8174c6ddfb7572a,6831
11
11
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/event_models.py,sha256=3c27c21b1aeb02bc19a91fb8c05717ae1c10ab4b01300c664aba42e0f50cb5a3,876
12
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/span_utils.py,sha256=9d0bb3825a6b5c28ac3778d49b7e67dc829530b2ebe34ef3f0e273f51caebcea,9422
13
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/streaming.py,sha256=e999ad093275c5195b5d31dfea456726afd5f474cd779be7af892f54d7b416b8,10129
12
+ lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/span_utils.py,sha256=6a931571b4a036cd8711419cadad737ec46cc67b4368f2f662f1a565737f9f9b,11403
13
+ lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/streaming.py,sha256=7ca9f49e4d9a3bac292d13a8ee9827fdfb8a46d13ebdcbbfbac9c5584d11eaf3,13441
14
14
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/utils.py,sha256=0044f02da8b99322fdbf3f8f6663f04ff5d1295ddae92a635fd16eb685d5fbb6,5386
15
15
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/version.py,sha256=5aacde4ca55ef50ed07a239ad8a86889e0621b1cc72be19bd93be7c9e20910a9,23
16
16
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/google_genai/__init__.py,sha256=a47d4d1234e0278d1538748130a79c03d6cb3486976cb5d19578fe1b90f28e7b,20524
@@ -62,7 +62,7 @@ lmnr/sdk/browser/__init__.py,sha256=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b
62
62
  lmnr/sdk/browser/browser_use_otel.py,sha256=37d26de1af37f76774af176cb226e0b04988fc3bf419a2fd899ad36e79562fad,5104
63
63
  lmnr/sdk/browser/patchright_otel.py,sha256=9d22ab1f28f1eddbcfd0032a14fe306bfe00bfc7f11128cb99836c4dd15fb7c8,4800
64
64
  lmnr/sdk/browser/playwright_otel.py,sha256=50c0a5a75155a3a7ff5db84790ffb409c9cbd0351eef212d83d923893730223b,9459
65
- lmnr/sdk/browser/pw_utils.py,sha256=f6cb4b7cb59d6b488298f462cf88aa967a424f5bfdfd91c39998df930b212c2c,20420
65
+ lmnr/sdk/browser/pw_utils.py,sha256=c84079f28c268c531ef86ed923028639671bb7c34a364f12f796556faa747393,20096
66
66
  lmnr/sdk/browser/recorder/record.umd.min.cjs,sha256=f09c09052c2fc474efb0405e63d8d26ed2184b994513ce8aee04efdac8be155d,181235
67
67
  lmnr/sdk/browser/utils.py,sha256=4a668776d2938108d25fbcecd61c8e1710a4da3e56230d5fefca5964dd09e3c1,2371
68
68
  lmnr/sdk/client/asynchronous/async_client.py,sha256=e8feae007506cd2e4b08e72706f5f1bb4ea54492b4aa6b68ef184a129de8f466,4948
@@ -89,8 +89,8 @@ lmnr/sdk/laminar.py,sha256=c38590ec5d65d5dedad37258f13f4f88f989e9ae10cbdb30bd1ac
89
89
  lmnr/sdk/log.py,sha256=9edfd83263f0d4845b1b2d1beeae2b4ed3f8628de941f371a893d72b79c348d4,2213
90
90
  lmnr/sdk/types.py,sha256=c4868d7d1df2fbd108fe5990900675bff2e595f6ff207afcf166ad4853f5eb0a,12670
91
91
  lmnr/sdk/utils.py,sha256=4beb884ae6fbbc7d8cf639b036b726ea6a2a658f0a6386faf5735a13d706a2d8,5039
92
- lmnr/version.py,sha256=05f60eaaaa74f6161e0194247bb2244c9a3b5c1176c8902c6075ebef93276235,1321
93
- lmnr-0.7.1.dist-info/WHEEL,sha256=ab6157bc637547491fb4567cd7ddf26b04d63382916ca16c29a5c8e94c9c9ef7,79
94
- lmnr-0.7.1.dist-info/entry_points.txt,sha256=abdf3411b7dd2d7329a241f2da6669bab4e314a747a586ecdb9f888f3035003c,39
95
- lmnr-0.7.1.dist-info/METADATA,sha256=847134a28ee45d56155835c491fbeb4a12cd6650709991550fff10976a328212,14473
96
- lmnr-0.7.1.dist-info/RECORD,,
92
+ lmnr/version.py,sha256=66adfc190221595f22dad751cd9efbdcff5c15c74bfe6929880661e779e139a7,1321
93
+ lmnr-0.7.2.dist-info/WHEEL,sha256=ab6157bc637547491fb4567cd7ddf26b04d63382916ca16c29a5c8e94c9c9ef7,79
94
+ lmnr-0.7.2.dist-info/entry_points.txt,sha256=abdf3411b7dd2d7329a241f2da6669bab4e314a747a586ecdb9f888f3035003c,39
95
+ lmnr-0.7.2.dist-info/METADATA,sha256=dc224f7405f3038e9abb2d6dc0ffc8b06c0824e76e887b95b23f71c8636124f5,14196
96
+ lmnr-0.7.2.dist-info/RECORD,,
File without changes