lmnr 0.7.11__py3-none-any.whl → 0.7.12__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 (24) hide show
  1. lmnr/opentelemetry_lib/__init__.py +6 -0
  2. lmnr/opentelemetry_lib/decorators/__init__.py +1 -1
  3. lmnr/opentelemetry_lib/litellm/__init__.py +277 -32
  4. lmnr/opentelemetry_lib/litellm/utils.py +76 -0
  5. lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/__init__.py +136 -44
  6. lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/span_utils.py +93 -6
  7. lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/utils.py +155 -3
  8. lmnr/opentelemetry_lib/opentelemetry/instrumentation/cua_agent/__init__.py +100 -0
  9. lmnr/opentelemetry_lib/opentelemetry/instrumentation/cua_computer/__init__.py +477 -0
  10. lmnr/opentelemetry_lib/opentelemetry/instrumentation/cua_computer/utils.py +12 -0
  11. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/__init__.py +14 -0
  12. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/utils.py +10 -1
  13. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v1/responses_wrappers.py +100 -8
  14. lmnr/opentelemetry_lib/tracing/__init__.py +9 -0
  15. lmnr/opentelemetry_lib/tracing/_instrument_initializers.py +20 -0
  16. lmnr/opentelemetry_lib/tracing/exporter.py +24 -9
  17. lmnr/opentelemetry_lib/tracing/instruments.py +4 -0
  18. lmnr/opentelemetry_lib/tracing/processor.py +26 -0
  19. lmnr/sdk/laminar.py +14 -0
  20. lmnr/version.py +1 -1
  21. {lmnr-0.7.11.dist-info → lmnr-0.7.12.dist-info}/METADATA +50 -50
  22. {lmnr-0.7.11.dist-info → lmnr-0.7.12.dist-info}/RECORD +24 -21
  23. {lmnr-0.7.11.dist-info → lmnr-0.7.12.dist-info}/WHEEL +0 -0
  24. {lmnr-0.7.11.dist-info → lmnr-0.7.12.dist-info}/entry_points.txt +0 -0
@@ -36,6 +36,7 @@ except ImportError:
36
36
  ResponseOutputMessageParam = Dict[str, Any]
37
37
  RESPONSES_AVAILABLE = False
38
38
 
39
+ from lmnr.opentelemetry_lib.decorators import json_dumps
39
40
  from lmnr.opentelemetry_lib.tracing.context import (
40
41
  get_current_context,
41
42
  get_event_attributes_from_context,
@@ -139,6 +140,10 @@ class TracedData(pydantic.BaseModel):
139
140
  request_model: Optional[str] = pydantic.Field(default=None)
140
141
  response_model: Optional[str] = pydantic.Field(default=None)
141
142
 
143
+ # Reasoning attributes
144
+ request_reasoning_summary: Optional[str] = pydantic.Field(default=None)
145
+ request_reasoning_effort: Optional[str] = pydantic.Field(default=None)
146
+
142
147
 
143
148
  responses: dict[str, TracedData] = {}
144
149
 
@@ -204,7 +209,28 @@ def set_data_attributes(traced_response: TracedData, span: Span):
204
209
  SpanAttributes.LLM_USAGE_CACHE_READ_INPUT_TOKENS,
205
210
  usage.input_tokens_details.cached_tokens,
206
211
  )
207
- # TODO: add reasoning tokens in output token details
212
+
213
+ reasoning_tokens = None
214
+ if usage.output_tokens_details:
215
+ reasoning_tokens = usage.output_tokens_details.reasoning_tokens
216
+
217
+ _set_span_attribute(
218
+ span,
219
+ SpanAttributes.LLM_USAGE_REASONING_TOKENS,
220
+ reasoning_tokens or 0,
221
+ )
222
+
223
+ _set_span_attribute(
224
+ span,
225
+ f"{SpanAttributes.LLM_REQUEST_REASONING_SUMMARY}",
226
+ traced_response.request_reasoning_summary or (),
227
+ )
228
+
229
+ _set_span_attribute(
230
+ span,
231
+ f"{SpanAttributes.LLM_REQUEST_REASONING_EFFORT}",
232
+ traced_response.request_reasoning_effort or (),
233
+ )
208
234
 
209
235
  if should_send_prompts():
210
236
  prompt_index = 0
@@ -275,7 +301,9 @@ def set_data_attributes(traced_response: TracedData, span: Span):
275
301
  prompt_index += 1
276
302
  elif block_dict.get("type") == "computer_call_output":
277
303
  _set_span_attribute(
278
- span, f"{GEN_AI_PROMPT}.{prompt_index}.role", "computer-call"
304
+ span,
305
+ f"{GEN_AI_PROMPT}.{prompt_index}.role",
306
+ "computer_call_output",
279
307
  )
280
308
  output_image_url = block_dict.get("output", {}).get("image_url")
281
309
  if output_image_url:
@@ -299,16 +327,45 @@ def set_data_attributes(traced_response: TracedData, span: Span):
299
327
  call_content = {}
300
328
  if block_dict.get("id"):
301
329
  call_content["id"] = block_dict.get("id")
302
- if block_dict.get("call_id"):
303
- call_content["call_id"] = block_dict.get("call_id")
304
330
  if block_dict.get("action"):
305
331
  call_content["action"] = block_dict.get("action")
306
332
  _set_span_attribute(
307
333
  span,
308
- f"{GEN_AI_PROMPT}.{prompt_index}.content",
334
+ f"{GEN_AI_PROMPT}.{prompt_index}.tool_calls.0.arguments",
309
335
  json.dumps(call_content),
310
336
  )
337
+ _set_span_attribute(
338
+ span,
339
+ f"{GEN_AI_PROMPT}.{prompt_index}.tool_calls.0.id",
340
+ block_dict.get("call_id"),
341
+ )
342
+ _set_span_attribute(
343
+ span,
344
+ f"{GEN_AI_PROMPT}.{prompt_index}.tool_calls.0.name",
345
+ "computer_call",
346
+ )
311
347
  prompt_index += 1
348
+ elif block_dict.get("type") == "reasoning":
349
+ reasoning_summary = block_dict.get("summary")
350
+ if reasoning_summary and isinstance(reasoning_summary, list):
351
+ processed_chunks = [
352
+ {"type": "text", "text": chunk.get("text")}
353
+ for chunk in reasoning_summary
354
+ if isinstance(chunk, dict)
355
+ and chunk.get("type") == "summary_text"
356
+ ]
357
+ _set_span_attribute(
358
+ span,
359
+ f"{GEN_AI_PROMPT}.{prompt_index}.reasoning",
360
+ json_dumps(processed_chunks),
361
+ )
362
+ _set_span_attribute(
363
+ span,
364
+ f"{GEN_AI_PROMPT}.{prompt_index}.role",
365
+ "assistant",
366
+ )
367
+ # reasoning is followed by other content parts in the same messge,
368
+ # so we don't increment the prompt index
312
369
  # TODO: handle other block types
313
370
 
314
371
  _set_span_attribute(span, f"{GEN_AI_COMPLETION}.0.role", "assistant")
@@ -381,9 +438,19 @@ def set_data_attributes(traced_response: TracedData, span: Span):
381
438
  )
382
439
  tool_call_index += 1
383
440
  elif block_dict.get("type") == "reasoning":
384
- _set_span_attribute(
385
- span, f"{GEN_AI_COMPLETION}.0.reasoning", block_dict.get("summary")
386
- )
441
+ reasoning_summary = block_dict.get("summary")
442
+ if reasoning_summary and isinstance(reasoning_summary, list):
443
+ processed_chunks = [
444
+ {"type": "text", "text": chunk.get("text")}
445
+ for chunk in reasoning_summary
446
+ if isinstance(chunk, dict)
447
+ and chunk.get("type") == "summary_text"
448
+ ]
449
+ _set_span_attribute(
450
+ span,
451
+ "gen_ai.completion.0.reasoning",
452
+ json_dumps(processed_chunks),
453
+ )
387
454
  # TODO: handle other block types, in particular other calls
388
455
 
389
456
 
@@ -423,6 +490,12 @@ def responses_get_or_create_wrapper(tracer: Tracer, wrapped, instance, args, kwa
423
490
  "model", existing_data.get("request_model", "")
424
491
  ),
425
492
  response_model=existing_data.get("response_model", ""),
493
+ request_reasoning_summary=kwargs.get("reasoning", {}).get(
494
+ "summary", existing_data.get("request_reasoning_summary")
495
+ ),
496
+ request_reasoning_effort=kwargs.get("reasoning", {}).get(
497
+ "effort", existing_data.get("request_reasoning_effort")
498
+ ),
426
499
  )
427
500
  except Exception:
428
501
  traced_data = None
@@ -469,9 +542,16 @@ def responses_get_or_create_wrapper(tracer: Tracer, wrapped, instance, args, kwa
469
542
  ),
470
543
  request_model=existing_data.get("request_model", kwargs.get("model")),
471
544
  response_model=existing_data.get("response_model", parsed_response.model),
545
+ request_reasoning_summary=existing_data.get(
546
+ "request_reasoning_summary", kwargs.get("reasoning", {}).get("summary")
547
+ ),
548
+ request_reasoning_effort=existing_data.get(
549
+ "request_reasoning_effort", kwargs.get("reasoning", {}).get("effort")
550
+ ),
472
551
  )
473
552
  responses[parsed_response.id] = traced_data
474
553
  except Exception:
554
+ raise
475
555
  return response
476
556
 
477
557
  if parsed_response.status == "completed":
@@ -521,6 +601,12 @@ async def async_responses_get_or_create_wrapper(
521
601
  output_text=kwargs.get("output_text", existing_data.get("output_text")),
522
602
  request_model=kwargs.get("model", existing_data.get("request_model")),
523
603
  response_model=existing_data.get("response_model"),
604
+ request_reasoning_summary=kwargs.get("reasoning", {}).get(
605
+ "summary", existing_data.get("request_reasoning_summary")
606
+ ),
607
+ request_reasoning_effort=kwargs.get("reasoning", {}).get(
608
+ "effort", existing_data.get("request_reasoning_effort")
609
+ ),
524
610
  )
525
611
  except Exception:
526
612
  traced_data = None
@@ -567,6 +653,12 @@ async def async_responses_get_or_create_wrapper(
567
653
  ),
568
654
  request_model=existing_data.get("request_model", kwargs.get("model")),
569
655
  response_model=existing_data.get("response_model", parsed_response.model),
656
+ request_reasoning_summary=existing_data.get(
657
+ "request_reasoning_summary", kwargs.get("reasoning", {}).get("summary")
658
+ ),
659
+ request_reasoning_effort=existing_data.get(
660
+ "request_reasoning_effort", kwargs.get("reasoning", {}).get("effort")
661
+ ),
570
662
  )
571
663
  responses[parsed_response.id] = traced_data
572
664
  except Exception:
@@ -261,6 +261,15 @@ class TracerWrapper(object):
261
261
  return False
262
262
  return self._span_processor.force_flush()
263
263
 
264
+ def force_reinit_processor(self):
265
+ if isinstance(self._span_processor, LaminarSpanProcessor):
266
+ self._span_processor.force_flush()
267
+ self._span_processor.force_reinit()
268
+ else:
269
+ self._logger.warning(
270
+ "Not using LaminarSpanProcessor, cannot force reinit processor"
271
+ )
272
+
264
273
  @classmethod
265
274
  def get_session_recording_options(cls) -> SessionRecordingOptions:
266
275
  """Get the session recording options set during initialization."""
@@ -142,6 +142,26 @@ class CrewAIInstrumentorInitializer(InstrumentorInitializer):
142
142
  return CrewAiInstrumentor()
143
143
 
144
144
 
145
+ class CuaAgentInstrumentorInitializer(InstrumentorInitializer):
146
+ def init_instrumentor(self, *args, **kwargs) -> BaseInstrumentor | None:
147
+ if not is_package_installed("cua-agent"):
148
+ return None
149
+
150
+ from ..opentelemetry.instrumentation.cua_agent import CuaAgentInstrumentor
151
+
152
+ return CuaAgentInstrumentor()
153
+
154
+
155
+ class CuaComputerInstrumentorInitializer(InstrumentorInitializer):
156
+ def init_instrumentor(self, *args, **kwargs) -> BaseInstrumentor | None:
157
+ if not is_package_installed("cua-computer"):
158
+ return None
159
+
160
+ from ..opentelemetry.instrumentation.cua_computer import CuaComputerInstrumentor
161
+
162
+ return CuaComputerInstrumentor()
163
+
164
+
145
165
  class GoogleGenAIInstrumentorInitializer(InstrumentorInitializer):
146
166
  def init_instrumentor(self, *args, **kwargs) -> BaseInstrumentor | None:
147
167
  if not is_package_installed("google-genai"):
@@ -5,7 +5,7 @@ from opentelemetry.sdk.trace import ReadableSpan
5
5
  from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import (
6
6
  OTLPSpanExporter,
7
7
  )
8
- from opentelemetry.exporter.otlp.proto.http import Compression
8
+ from opentelemetry.exporter.otlp.proto.http import Compression as HTTPCompression
9
9
  from opentelemetry.exporter.otlp.proto.http.trace_exporter import (
10
10
  OTLPSpanExporter as HTTPOTLPSpanExporter,
11
11
  )
@@ -15,6 +15,10 @@ from lmnr.sdk.utils import from_env
15
15
 
16
16
  class LaminarSpanExporter(SpanExporter):
17
17
  instance: OTLPSpanExporter | HTTPOTLPSpanExporter
18
+ endpoint: str
19
+ headers: dict[str, str]
20
+ timeout: float
21
+ force_http: bool
18
22
 
19
23
  def __init__(
20
24
  self,
@@ -34,19 +38,30 @@ class LaminarSpanExporter(SpanExporter):
34
38
  port = 443 if force_http else 8443
35
39
  final_url = f"{url}:{port or 443}"
36
40
  api_key = api_key or from_env("LMNR_PROJECT_API_KEY")
37
- if force_http:
41
+ self.endpoint = final_url
42
+ self.headers = (
43
+ {"Authorization": f"Bearer {api_key}"}
44
+ if force_http
45
+ else {"authorization": f"Bearer {api_key}"}
46
+ )
47
+ self.timeout = timeout_seconds
48
+ self.force_http = force_http
49
+ self._init_instance()
50
+
51
+ def _init_instance(self):
52
+ if self.force_http:
38
53
  self.instance = HTTPOTLPSpanExporter(
39
- endpoint=f"{final_url}/v1/traces",
40
- headers={"Authorization": f"Bearer {api_key}"},
41
- compression=Compression.Gzip,
42
- timeout=timeout_seconds,
54
+ endpoint=self.endpoint,
55
+ headers=self.headers,
56
+ compression=HTTPCompression.Gzip,
57
+ timeout=self.timeout,
43
58
  )
44
59
  else:
45
60
  self.instance = OTLPSpanExporter(
46
- endpoint=final_url,
47
- headers={"authorization": f"Bearer {api_key}"},
61
+ endpoint=self.endpoint,
62
+ headers=self.headers,
63
+ timeout=self.timeout,
48
64
  compression=grpc.Compression.Gzip,
49
- timeout=timeout_seconds,
50
65
  )
51
66
 
52
67
  def export(self, spans: list[ReadableSpan]) -> SpanExportResult:
@@ -22,6 +22,8 @@ class Instruments(Enum):
22
22
  CHROMA = "chroma"
23
23
  COHERE = "cohere"
24
24
  CREWAI = "crewai"
25
+ CUA_AGENT = "cua_agent"
26
+ CUA_COMPUTER = "cua_computer"
25
27
  GOOGLE_GENAI = "google_genai"
26
28
  GROQ = "groq"
27
29
  HAYSTACK = "haystack"
@@ -67,6 +69,8 @@ INSTRUMENTATION_INITIALIZERS: dict[
67
69
  Instruments.CHROMA: initializers.ChromaInstrumentorInitializer(),
68
70
  Instruments.COHERE: initializers.CohereInstrumentorInitializer(),
69
71
  Instruments.CREWAI: initializers.CrewAIInstrumentorInitializer(),
72
+ Instruments.CUA_AGENT: initializers.CuaAgentInstrumentorInitializer(),
73
+ Instruments.CUA_COMPUTER: initializers.CuaComputerInstrumentorInitializer(),
70
74
  Instruments.GOOGLE_GENAI: initializers.GoogleGenAIInstrumentorInitializer(),
71
75
  Instruments.GROQ: initializers.GroqInstrumentorInitializer(),
72
76
  Instruments.HAYSTACK: initializers.HaystackInstrumentorInitializer(),
@@ -1,3 +1,4 @@
1
+ import logging
1
2
  import uuid
2
3
 
3
4
  from opentelemetry.sdk.trace.export import (
@@ -19,13 +20,16 @@ from lmnr.opentelemetry_lib.tracing.attributes import (
19
20
  SPAN_SDK_VERSION,
20
21
  )
21
22
  from lmnr.opentelemetry_lib.tracing.exporter import LaminarSpanExporter
23
+ from lmnr.sdk.log import get_default_logger
22
24
  from lmnr.version import PYTHON_VERSION, __version__
23
25
 
24
26
 
25
27
  class LaminarSpanProcessor(SpanProcessor):
26
28
  instance: BatchSpanProcessor | SimpleSpanProcessor
29
+ logger: logging.Logger
27
30
  __span_id_to_path: dict[int, list[str]] = {}
28
31
  __span_id_lists: dict[int, list[str]] = {}
32
+ max_export_batch_size: int
29
33
 
30
34
  def __init__(
31
35
  self,
@@ -38,6 +42,8 @@ class LaminarSpanProcessor(SpanProcessor):
38
42
  disable_batch: bool = False,
39
43
  exporter: SpanExporter | None = None,
40
44
  ):
45
+ self.logger = get_default_logger(__name__)
46
+ self.max_export_batch_size = max_export_batch_size
41
47
  self.exporter = exporter or LaminarSpanExporter(
42
48
  base_url=base_url,
43
49
  port=port,
@@ -86,6 +92,26 @@ class LaminarSpanProcessor(SpanProcessor):
86
92
  def force_flush(self, timeout_millis: int = 30000) -> bool:
87
93
  return self.instance.force_flush(timeout_millis)
88
94
 
95
+ def force_reinit(self):
96
+ if not isinstance(self.exporter, LaminarSpanExporter):
97
+ self.logger.warning(
98
+ "LaminarSpanProcessor is not using LaminarSpanExporter, cannot force reinit"
99
+ )
100
+ return
101
+ self.instance.shutdown()
102
+ disable_batch = isinstance(self.instance, SimpleSpanProcessor)
103
+ del self.exporter.instance
104
+ del self.instance
105
+
106
+ self.exporter._init_instance()
107
+ self.instance = (
108
+ SimpleSpanProcessor(self.exporter)
109
+ if disable_batch
110
+ else BatchSpanProcessor(
111
+ self.exporter, max_export_batch_size=self.max_export_batch_size
112
+ )
113
+ )
114
+
89
115
  def shutdown(self):
90
116
  self.instance.shutdown()
91
117
 
lmnr/sdk/laminar.py CHANGED
@@ -773,6 +773,20 @@ class Laminar:
773
773
  return False
774
774
  return TracerManager.flush()
775
775
 
776
+ @classmethod
777
+ def force_flush(cls):
778
+ """Force flush the internal tracer.
779
+
780
+ Actually shuts down the span processor and re-initializes it as long
781
+ as it is a LaminarSpanProcessor. This is not recommended in production
782
+ workflows, but is useful at the end of Lambda functions, where a regular
783
+ flush might be killed by the Lambda runtime, because the actual export
784
+ inside it runs in a background thread.
785
+ """
786
+ if not cls.is_initialized():
787
+ return
788
+ TracerManager.force_reinit_processor()
789
+
776
790
  @classmethod
777
791
  def shutdown(cls):
778
792
  if cls.is_initialized():
lmnr/version.py CHANGED
@@ -3,7 +3,7 @@ import httpx
3
3
  from packaging import version
4
4
 
5
5
 
6
- __version__ = "0.7.11"
6
+ __version__ = "0.7.12"
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.11
3
+ Version: 0.7.12
4
4
  Summary: Python SDK for Laminar
5
5
  Author: lmnr.ai
6
6
  Author-email: lmnr.ai <founders@lmnr.ai>
@@ -19,59 +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.11
22
+ Requires-Dist: opentelemetry-semantic-conventions-ai>=0.4.13
23
23
  Requires-Dist: tqdm>=4.0
24
24
  Requires-Dist: tenacity>=8.0
25
25
  Requires-Dist: grpcio>=1
26
- Requires-Dist: httpx>=0.25.0
27
- Requires-Dist: orjson>=3.10.18
26
+ Requires-Dist: httpx>=0.24.0
27
+ Requires-Dist: orjson>=3.0.0
28
28
  Requires-Dist: packaging>=22.0
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'
29
+ Requires-Dist: opentelemetry-instrumentation-alephalpha>=0.46.2 ; extra == 'alephalpha'
30
+ Requires-Dist: opentelemetry-instrumentation-alephalpha>=0.46.2 ; extra == 'all'
31
+ Requires-Dist: opentelemetry-instrumentation-bedrock>=0.46.2 ; extra == 'all'
32
+ Requires-Dist: opentelemetry-instrumentation-chromadb>=0.46.2 ; extra == 'all'
33
+ Requires-Dist: opentelemetry-instrumentation-cohere>=0.46.2 ; extra == 'all'
34
+ Requires-Dist: opentelemetry-instrumentation-crewai>=0.46.2 ; extra == 'all'
35
+ Requires-Dist: opentelemetry-instrumentation-haystack>=0.46.2 ; extra == 'all'
36
+ Requires-Dist: opentelemetry-instrumentation-lancedb>=0.46.2 ; extra == 'all'
37
+ Requires-Dist: opentelemetry-instrumentation-langchain>=0.46.2 ; extra == 'all'
38
+ Requires-Dist: opentelemetry-instrumentation-llamaindex>=0.46.2 ; extra == 'all'
39
+ Requires-Dist: opentelemetry-instrumentation-marqo>=0.46.2 ; extra == 'all'
40
+ Requires-Dist: opentelemetry-instrumentation-mcp>=0.46.2 ; extra == 'all'
41
+ Requires-Dist: opentelemetry-instrumentation-milvus>=0.46.2 ; extra == 'all'
42
+ Requires-Dist: opentelemetry-instrumentation-mistralai>=0.46.2 ; extra == 'all'
43
+ Requires-Dist: opentelemetry-instrumentation-ollama>=0.46.2 ; extra == 'all'
44
+ Requires-Dist: opentelemetry-instrumentation-pinecone>=0.46.2 ; extra == 'all'
45
+ Requires-Dist: opentelemetry-instrumentation-qdrant>=0.46.2 ; extra == 'all'
46
+ Requires-Dist: opentelemetry-instrumentation-replicate>=0.46.2 ; extra == 'all'
47
+ Requires-Dist: opentelemetry-instrumentation-sagemaker>=0.46.2 ; extra == 'all'
48
+ Requires-Dist: opentelemetry-instrumentation-together>=0.46.2 ; extra == 'all'
49
+ Requires-Dist: opentelemetry-instrumentation-transformers>=0.46.2 ; extra == 'all'
50
+ Requires-Dist: opentelemetry-instrumentation-vertexai>=0.46.2 ; extra == 'all'
51
+ Requires-Dist: opentelemetry-instrumentation-watsonx>=0.46.2 ; extra == 'all'
52
+ Requires-Dist: opentelemetry-instrumentation-weaviate>=0.46.2 ; extra == 'all'
53
+ Requires-Dist: opentelemetry-instrumentation-bedrock>=0.46.2 ; extra == 'bedrock'
54
+ Requires-Dist: opentelemetry-instrumentation-chromadb>=0.46.2 ; extra == 'chromadb'
55
+ Requires-Dist: opentelemetry-instrumentation-cohere>=0.46.2 ; extra == 'cohere'
56
+ Requires-Dist: opentelemetry-instrumentation-crewai>=0.46.2 ; extra == 'crewai'
57
+ Requires-Dist: opentelemetry-instrumentation-haystack>=0.46.2 ; extra == 'haystack'
58
+ Requires-Dist: opentelemetry-instrumentation-lancedb>=0.46.2 ; extra == 'lancedb'
59
+ Requires-Dist: opentelemetry-instrumentation-langchain>=0.46.2 ; extra == 'langchain'
60
+ Requires-Dist: opentelemetry-instrumentation-llamaindex>=0.46.2 ; extra == 'llamaindex'
61
+ Requires-Dist: opentelemetry-instrumentation-marqo>=0.46.2 ; extra == 'marqo'
62
+ Requires-Dist: opentelemetry-instrumentation-mcp>=0.46.2 ; extra == 'mcp'
63
+ Requires-Dist: opentelemetry-instrumentation-milvus>=0.46.2 ; extra == 'milvus'
64
+ Requires-Dist: opentelemetry-instrumentation-mistralai>=0.46.2 ; extra == 'mistralai'
65
+ Requires-Dist: opentelemetry-instrumentation-ollama>=0.46.2 ; extra == 'ollama'
66
+ Requires-Dist: opentelemetry-instrumentation-pinecone>=0.46.2 ; extra == 'pinecone'
67
+ Requires-Dist: opentelemetry-instrumentation-qdrant>=0.46.2 ; extra == 'qdrant'
68
+ Requires-Dist: opentelemetry-instrumentation-replicate>=0.46.2 ; extra == 'replicate'
69
+ Requires-Dist: opentelemetry-instrumentation-sagemaker>=0.46.2 ; extra == 'sagemaker'
70
+ Requires-Dist: opentelemetry-instrumentation-together>=0.46.2 ; extra == 'together'
71
+ Requires-Dist: opentelemetry-instrumentation-transformers>=0.46.2 ; extra == 'transformers'
72
+ Requires-Dist: opentelemetry-instrumentation-vertexai>=0.46.2 ; extra == 'vertexai'
73
+ Requires-Dist: opentelemetry-instrumentation-watsonx>=0.46.2 ; extra == 'watsonx'
74
+ Requires-Dist: opentelemetry-instrumentation-weaviate>=0.46.2 ; extra == 'weaviate'
75
75
  Requires-Python: >=3.10, <4
76
76
  Provides-Extra: alephalpha
77
77
  Provides-Extra: all
@@ -1,18 +1,21 @@
1
1
  lmnr/__init__.py,sha256=8be7b56ab62735fd54ca90a0642784c6153ed1d6e0f12734619ca0618dd9fbdb,1398
2
2
  lmnr/cli.py,sha256=b8780b51f37fe9e20db5495c41d3ad3837f6b48f408b09a58688d017850c0796,6047
3
3
  lmnr/opentelemetry_lib/.flake8,sha256=6c2c6e0e51b1dd8439e501ca3e21899277076a787da868d0254ba37056b79405,150
4
- lmnr/opentelemetry_lib/__init__.py,sha256=1350e8d12ea2f422751ab3a80d7d32d10c27ad8e4c2989407771dc6e544d9c65,2350
5
- lmnr/opentelemetry_lib/decorators/__init__.py,sha256=b9bab9acd44c7d4d98660a8de1f4e42b9387170c62e3239fba174a8461255ead,11795
6
- lmnr/opentelemetry_lib/litellm/__init__.py,sha256=d67d18581b42d7e5d9c724bd201044fb7a04d79e7162f5a47007c0a1f413141a,15852
7
- lmnr/opentelemetry_lib/litellm/utils.py,sha256=da8cf0553f82dc7203109f117a4c7b4185e8baf34caad12d7823875515201a27,539
8
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/__init__.py,sha256=2604189b7598edb5404ddbcd0775bdf2dc506dd5e6319eef4e4724e39c420301,23276
4
+ lmnr/opentelemetry_lib/__init__.py,sha256=abdd649b6c906a7dd2985b5a0903067904a457341d0da28a559c89a9faf939c7,2572
5
+ lmnr/opentelemetry_lib/decorators/__init__.py,sha256=d18206ae4e65147b3101b82b3bb7413f765149c5523616a6a06be1939b0878b8,11793
6
+ lmnr/opentelemetry_lib/litellm/__init__.py,sha256=af1d6c1067c1d30b35f5bdfdbc7ad3565f1178a571fd770974c411fef7b5ff0f,27478
7
+ lmnr/opentelemetry_lib/litellm/utils.py,sha256=642c3857e09d8c8dfc327c23e711687c15cbed6c0ba3f0a7be7751356beb8b43,3427
8
+ lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/__init__.py,sha256=897b1a255ce2370d196018abcaf5942295a374cf367b668a3b418c3bddd29251,26461
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=6a931571b4a036cd8711419cadad737ec46cc67b4368f2f662f1a565737f9f9b,11403
12
+ lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/span_utils.py,sha256=4b52dacf32483bd927ab2c7e895500bbd70c754858c4879984ee48e42a7c9bd7,14912
13
13
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/streaming.py,sha256=7ca9f49e4d9a3bac292d13a8ee9827fdfb8a46d13ebdcbbfbac9c5584d11eaf3,13441
14
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/utils.py,sha256=0044f02da8b99322fdbf3f8f6663f04ff5d1295ddae92a635fd16eb685d5fbb6,5386
14
+ lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/utils.py,sha256=8d59ae659c85b308180cc12ab19dd617c9476475c5f4666e7dcd162050db9141,10413
15
15
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/version.py,sha256=5aacde4ca55ef50ed07a239ad8a86889e0621b1cc72be19bd93be7c9e20910a9,23
16
+ lmnr/opentelemetry_lib/opentelemetry/instrumentation/cua_agent/__init__.py,sha256=48391d935883506fe1dc4f6ace6011ecaed76a8f82f8026ccb553b2180afdb8c,3455
17
+ lmnr/opentelemetry_lib/opentelemetry/instrumentation/cua_computer/__init__.py,sha256=61d2681e99c3084d1bcc27f7ca551f44a70126df6c5f23320c1e9c1654e05c42,15037
18
+ lmnr/opentelemetry_lib/opentelemetry/instrumentation/cua_computer/utils.py,sha256=19090d4d9a0511645f66112ebe6f05a9993905b11d8ae3060dab2dcc4c1a5fb2,329
16
19
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/google_genai/__init__.py,sha256=e0f5283e5d960e91766c2658af12837e43772d7c23f13ee44365a145e891e6c4,19453
17
20
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/google_genai/config.py,sha256=db9cdebc9ee0dccb493ffe608eede3047efec20ed26c3924b72b2e50edbd92c2,245
18
21
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/google_genai/schema_utils.py,sha256=b10619e76e5893f8b891f92531d29dcf6651e8f9a7dcbf81c3f35341ce311f6e,753
@@ -27,7 +30,7 @@ lmnr/opentelemetry_lib/opentelemetry/instrumentation/groq/version.py,sha256=5aac
27
30
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/langgraph/__init__.py,sha256=b77a70771741b95006cb27d7f9fc26e4b79b1f10ca24b93a3160a458c3397a9d,3313
28
31
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/langgraph/utils.py,sha256=9dff6c2595e79edb38818668aed1220efc188d8a982594c04f4ceeb6e3ff47a6,1512
29
32
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/__init__.py,sha256=8b91dc16af927eee75b969c0980c606680b347a87f8533bc0f4a092e5ec6e5c9,2071
30
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/__init__.py,sha256=9d182c8cef5ee1e205dc4c2f7c8e49d8403ee9fee66072c5cfdd29a0d54f61a2,15149
33
+ lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/__init__.py,sha256=626be64cde043335c1d0fea51e0788a8c35ffaed28dae08281e7f750484dfcbc,15597
31
34
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/chat_wrappers.py,sha256=98ebc2a7f7f4774ff4ab1fd1b612a5b049ae6f714bb60cd1c286d3a756ddc083,39056
32
35
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/completion_wrappers.py,sha256=3a45c07d9d0f37baf409a48e2a1b577f28041c623c41f59ada1c87b94285ae3b,9537
33
36
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/config.py,sha256=8016e4af0291a77484ce88d7d1ca06146b1229ae0e0a0f46e042faf75b456a8f,507
@@ -35,24 +38,24 @@ lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/embeddings_wr
35
38
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/event_emitter.py,sha256=9c96455b5ca2064dd3a9fb570d78b14ebbdf3d02f8e33255ee9e301c31336c9e,3043
36
39
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/event_models.py,sha256=3c27c21b1aeb02bc19a91fb8c05717ae1c10ab4b01300c664aba42e0f50cb5a3,876
37
40
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/image_gen_wrappers.py,sha256=9650a0e4ad2d3bfb2a072590da189bcf4f807aca070945af26a9f9b99d779b77,2021
38
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/utils.py,sha256=6b7ebc420e76c266f723248463c09175f536e10166015db12075e5e05f1c0f51,4651
41
+ lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/utils.py,sha256=6369cad1325daf6644dbeb613c6bada21ce8665b9fd25862a47343194fe69469,5015
39
42
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v0/__init__.py,sha256=7f43421e052bd8f64d5d5b03170a3b7187c2ce038362fa15b5d1d0c43bc1a40d,6143
40
43
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v1/__init__.py,sha256=7bdbf691ac89efb42ade686b7dbe69bd139a84f48482a013b7b68d3baa5b9c98,13527
41
44
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v1/assistant_wrappers.py,sha256=558036c734559b3526647c1b18cfb986699e8fb322855af72ea054c2e458f721,10404
42
45
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v1/event_handler_wrapper.py,sha256=4809cde003e5892822828b373aa3e43a8adbaee4ff443f198401003f43c15e8a,4366
43
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v1/responses_wrappers.py,sha256=b3853c60c58a36ba64de184211ac2d112bb8b53c4af62f0fc716fb87d168fd4b,24790
46
+ lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v1/responses_wrappers.py,sha256=e465cd40216e481d7ff533ef077e052c30ce029584320589721148922981db37,28922
44
47
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/version.py,sha256=4f39aaa913f3e49b0c174bc23028687d00bfaffc745bd3fe241e0ae6b442bed1,24
45
48
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/openhands_ai/__init__.py,sha256=8f5f73528e1e0ced28938cbedf5b9774b408e178ae42191284f4630d0aa99beb,13648
46
49
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/opentelemetry/__init__.py,sha256=1f86cdf738e2f68586b0a4569bb1e40edddd85c529f511ef49945ddb7b61fab5,2648
47
50
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/skyvern/__init__.py,sha256=764e4fe979fb08d7821419a3cc5c3ae89a6664b626ef928259f8f175c939eaea,6334
48
51
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/threading/__init__.py,sha256=90aa8558467d7e469fe1a6c75372c113da403557715f03b522b2fab94b287c40,6320
49
- lmnr/opentelemetry_lib/tracing/__init__.py,sha256=69dd8575908cedfebd29cd48c288cbf2cca1f689c469266bcdf79c7351bed99d,10979
50
- lmnr/opentelemetry_lib/tracing/_instrument_initializers.py,sha256=cb2ce23406bdcbcad14489428d8a3438a948299bbb68a179cc3cbd44645154c0,16471
52
+ lmnr/opentelemetry_lib/tracing/__init__.py,sha256=6e29f4d8d7ce1b63567f18f469914c9673594cfbbfb084ebc876fc5443936994,11322
53
+ lmnr/opentelemetry_lib/tracing/_instrument_initializers.py,sha256=4f4447f1eabf8330380b48376e297ae26a2d86f3b56e5824ac0bdbf0e0c1f25a,17166
51
54
  lmnr/opentelemetry_lib/tracing/attributes.py,sha256=a879e337ff4e8569a4454544d303ccbc3b04bd42e1cdb765eb563aeaa08f731d,1653
52
55
  lmnr/opentelemetry_lib/tracing/context.py,sha256=83f842be0fc29a96647cbf005c39ea761b0fb5913c4102f965411f47906a6135,4103
53
- lmnr/opentelemetry_lib/tracing/exporter.py,sha256=6af8e61fd873e8f5db315d9b9f1edbf46b860ba7e50140f0bdcc6864c6d35a03,2082
54
- lmnr/opentelemetry_lib/tracing/instruments.py,sha256=8482c9df1310a47117667469eeeddb60707da484ee7e80b69f506ef1594e380a,5848
55
- lmnr/opentelemetry_lib/tracing/processor.py,sha256=cbc70f138e70c878ef57b02a2c46ef48dd7f694a522623a82dff1623b73d1e1c,3353
56
+ lmnr/opentelemetry_lib/tracing/exporter.py,sha256=a5a1e7627061f30109c0b7c4c951a2a1ed2e346af33c66804b7c981dc3550468,2470
57
+ lmnr/opentelemetry_lib/tracing/instruments.py,sha256=a748249130f8610e9d9f64f90f082e643f300765ebf46899a51bd9b6d6f5a03e,6066
58
+ lmnr/opentelemetry_lib/tracing/processor.py,sha256=74a4c6967c6b0b0672d1292c626fe294375f426a87056362f56c5c4195647d0b,4279
56
59
  lmnr/opentelemetry_lib/tracing/tracer.py,sha256=33769a9a97385f5697eb0e0a6b1813a57ed956c7a8379d7ac2523e700e7dd528,1362
57
60
  lmnr/opentelemetry_lib/utils/__init__.py,sha256=a4d85fd06def4dde5c728734de2d4c5c36eb89c49a8aa09b8b50cb5a149e90af,604
58
61
  lmnr/opentelemetry_lib/utils/json_encoder.py,sha256=74ae9bfdac6bef42182fb56ff9bbb8c27b6f0c3bb29eda2ab0769d76a5fb3f9f,463
@@ -90,12 +93,12 @@ lmnr/sdk/datasets.py,sha256=3fd851c5f97bf88eaa84b1451a053eaff23b4497cbb45eac2f9e
90
93
  lmnr/sdk/decorators.py,sha256=c709b76a814e019c919fd811591850787a2f266b7b6f46123f66ddd92e1092d5,6920
91
94
  lmnr/sdk/eval_control.py,sha256=291394ac385c653ae9b5167e871bebeb4fe8fc6b7ff2ed38e636f87015dcba86,184
92
95
  lmnr/sdk/evaluations.py,sha256=7e55cbca77fa32cb64cb77aed8076a1994258a5b652c7f1d45231928e4aefe26,23885
93
- lmnr/sdk/laminar.py,sha256=199bab54d49f918f110d7b98569551d8ab7ea4e93828af7381ba56b1181e855b,37539
96
+ lmnr/sdk/laminar.py,sha256=1bd434297a1487679093fed27113d4b031a4129d65b0517f6a668dad75f4c4bd,38106
94
97
  lmnr/sdk/log.py,sha256=9edfd83263f0d4845b1b2d1beeae2b4ed3f8628de941f371a893d72b79c348d4,2213
95
98
  lmnr/sdk/types.py,sha256=f8a8368e225c4d2f82df54d92f029065afb60c3eff494c77c6e574963ed524ff,13454
96
99
  lmnr/sdk/utils.py,sha256=0c5a81c305dcd3922f4b31c4f42cf83719c03888725838395adae167de92db76,5019
97
- lmnr/version.py,sha256=52bb47a5d5e8f391c347d7742269dd0b231aa0de29e1ddbac7958d9b94cb47db,1322
98
- lmnr-0.7.11.dist-info/WHEEL,sha256=ab6157bc637547491fb4567cd7ddf26b04d63382916ca16c29a5c8e94c9c9ef7,79
99
- lmnr-0.7.11.dist-info/entry_points.txt,sha256=abdf3411b7dd2d7329a241f2da6669bab4e314a747a586ecdb9f888f3035003c,39
100
- lmnr-0.7.11.dist-info/METADATA,sha256=1beeb3d2258e4416445fea5d6e5d4c788fd5ccabfedb7e814352f78863001cad,14197
101
- lmnr-0.7.11.dist-info/RECORD,,
100
+ lmnr/version.py,sha256=c8627d415d619760cd3a9ef67286da4e10a35e6bf840e9e24f3221987e222aa8,1322
101
+ lmnr-0.7.12.dist-info/WHEEL,sha256=ab6157bc637547491fb4567cd7ddf26b04d63382916ca16c29a5c8e94c9c9ef7,79
102
+ lmnr-0.7.12.dist-info/entry_points.txt,sha256=abdf3411b7dd2d7329a241f2da6669bab4e314a747a586ecdb9f888f3035003c,39
103
+ lmnr-0.7.12.dist-info/METADATA,sha256=a67d7715fe3222f9824606190898cc679ca3d0215851dac36c6a966aa5bb6122,14195
104
+ lmnr-0.7.12.dist-info/RECORD,,
File without changes