lmnr 0.6.20__py3-none-any.whl → 0.6.21__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 (33) hide show
  1. lmnr/opentelemetry_lib/decorators/__init__.py +188 -138
  2. lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/__init__.py +674 -0
  3. lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/config.py +13 -0
  4. lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/event_emitter.py +211 -0
  5. lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/event_models.py +41 -0
  6. lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/span_utils.py +256 -0
  7. lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/streaming.py +295 -0
  8. lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/utils.py +179 -0
  9. lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/version.py +1 -0
  10. lmnr/opentelemetry_lib/opentelemetry/instrumentation/groq/__init__.py +485 -0
  11. lmnr/opentelemetry_lib/opentelemetry/instrumentation/groq/config.py +8 -0
  12. lmnr/opentelemetry_lib/opentelemetry/instrumentation/groq/event_emitter.py +143 -0
  13. lmnr/opentelemetry_lib/opentelemetry/instrumentation/groq/event_models.py +41 -0
  14. lmnr/opentelemetry_lib/opentelemetry/instrumentation/groq/span_utils.py +229 -0
  15. lmnr/opentelemetry_lib/opentelemetry/instrumentation/groq/utils.py +92 -0
  16. lmnr/opentelemetry_lib/opentelemetry/instrumentation/groq/version.py +1 -0
  17. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/utils.py +3 -3
  18. lmnr/opentelemetry_lib/tracing/__init__.py +1 -1
  19. lmnr/opentelemetry_lib/tracing/_instrument_initializers.py +12 -7
  20. lmnr/opentelemetry_lib/tracing/processor.py +1 -1
  21. lmnr/opentelemetry_lib/utils/package_check.py +9 -0
  22. lmnr/sdk/browser/browser_use_otel.py +4 -2
  23. lmnr/sdk/browser/patchright_otel.py +0 -26
  24. lmnr/sdk/browser/playwright_otel.py +51 -78
  25. lmnr/sdk/browser/pw_utils.py +359 -114
  26. lmnr/sdk/decorators.py +39 -4
  27. lmnr/sdk/evaluations.py +23 -9
  28. lmnr/sdk/laminar.py +75 -48
  29. lmnr/version.py +1 -1
  30. {lmnr-0.6.20.dist-info → lmnr-0.6.21.dist-info}/METADATA +8 -7
  31. {lmnr-0.6.20.dist-info → lmnr-0.6.21.dist-info}/RECORD +33 -18
  32. {lmnr-0.6.20.dist-info → lmnr-0.6.21.dist-info}/WHEEL +1 -1
  33. {lmnr-0.6.20.dist-info → lmnr-0.6.21.dist-info}/entry_points.txt +0 -0
lmnr/sdk/evaluations.py CHANGED
@@ -57,7 +57,7 @@ def get_average_scores(results: list[EvaluationResultDatapoint]) -> dict[str, Nu
57
57
  average_scores = {}
58
58
  for key, values in per_score_values.items():
59
59
  scores = [v for v in values if v is not None]
60
-
60
+
61
61
  # If there are no scores, we don't want to include the key in the average scores
62
62
  if len(scores) > 0:
63
63
  average_scores[key] = sum(scores) / len(scores)
@@ -108,6 +108,7 @@ class Evaluation:
108
108
  concurrency_limit: int = DEFAULT_BATCH_SIZE,
109
109
  project_api_key: str | None = None,
110
110
  base_url: str | None = None,
111
+ base_http_url: str | None = None,
111
112
  http_port: int | None = None,
112
113
  grpc_port: int | None = None,
113
114
  instruments: set[Instruments] | None = None,
@@ -157,6 +158,10 @@ class Evaluation:
157
158
  Useful if self-hosted. Do NOT include the port, use `http_port`\
158
159
  and `grpc_port` instead.
159
160
  Defaults to "https://api.lmnr.ai".
161
+ base_http_url (str | None, optional): The base HTTP URL for Laminar API.\
162
+ Only set this if your Laminar backend HTTP is proxied\
163
+ through a different host. If not specified, defaults\
164
+ to https://api.lmnr.ai.
160
165
  http_port (int | None, optional): The port for Laminar API\
161
166
  HTTP service. Defaults to 443 if not specified.
162
167
  grpc_port (int | None, optional): The port for Laminar API\
@@ -199,7 +204,7 @@ class Evaluation:
199
204
  self.batch_size = concurrency_limit
200
205
  self._logger = get_default_logger(self.__class__.__name__)
201
206
  self.upload_tasks = []
202
- self.base_http_url = f"{base_url}:{http_port or 443}"
207
+ self.base_http_url = f"{base_http_url or base_url}:{http_port or 443}"
203
208
 
204
209
  api_key = project_api_key or from_env("LMNR_PROJECT_API_KEY")
205
210
  if not api_key and not L.is_initialized():
@@ -224,6 +229,7 @@ class Evaluation:
224
229
  L.initialize(
225
230
  project_api_key=project_api_key,
226
231
  base_url=base_url,
232
+ base_http_url=self.base_http_url,
227
233
  http_port=http_port,
228
234
  grpc_port=grpc_port,
229
235
  instruments=instruments,
@@ -352,22 +358,24 @@ class Evaluation:
352
358
  if isinstance(evaluator, HumanEvaluator):
353
359
  # Create an empty span for human evaluators
354
360
  with L.start_as_current_span(
355
- evaluator_name,
356
- input={"output": output, "target": target}
361
+ evaluator_name, input={"output": output, "target": target}
357
362
  ) as human_evaluator_span:
358
- human_evaluator_span.set_attribute(SPAN_TYPE, SpanType.HUMAN_EVALUATOR.value)
363
+ human_evaluator_span.set_attribute(
364
+ SPAN_TYPE, SpanType.HUMAN_EVALUATOR.value
365
+ )
359
366
  # Human evaluators don't execute automatically, just create the span
360
367
  L.set_span_output(None)
361
-
368
+
362
369
  # We don't want to save the score for human evaluators
363
370
  scores[evaluator_name] = None
364
371
  else:
365
372
  # Regular evaluator function
366
373
  with L.start_as_current_span(
367
- evaluator_name,
368
- input={"output": output, "target": target}
374
+ evaluator_name, input={"output": output, "target": target}
369
375
  ) as evaluator_span:
370
- evaluator_span.set_attribute(SPAN_TYPE, SpanType.EVALUATOR.value)
376
+ evaluator_span.set_attribute(
377
+ SPAN_TYPE, SpanType.EVALUATOR.value
378
+ )
371
379
  if is_async(evaluator):
372
380
  value = await evaluator(output, target)
373
381
  else:
@@ -416,6 +424,7 @@ def evaluate(
416
424
  concurrency_limit: int = DEFAULT_BATCH_SIZE,
417
425
  project_api_key: str | None = None,
418
426
  base_url: str | None = None,
427
+ base_http_url: str | None = None,
419
428
  http_port: int | None = None,
420
429
  grpc_port: int | None = None,
421
430
  instruments: set[Instruments] | None = None,
@@ -465,6 +474,10 @@ def evaluate(
465
474
  Useful if self-hosted elsewhere. Do NOT include the\
466
475
  port, use `http_port` and `grpc_port` instead.
467
476
  Defaults to "https://api.lmnr.ai".
477
+ base_http_url (str | None, optional): The base HTTP URL for Laminar API.\
478
+ Only set this if your Laminar backend HTTP is proxied\
479
+ through a different host. If not specified, defaults\
480
+ to https://api.lmnr.ai.
468
481
  http_port (int | None, optional): The port for Laminar API's HTTP\
469
482
  service. 443 is used if not specified.
470
483
  Defaults to None.
@@ -488,6 +501,7 @@ def evaluate(
488
501
  concurrency_limit=concurrency_limit,
489
502
  project_api_key=project_api_key,
490
503
  base_url=base_url,
504
+ base_http_url=base_http_url,
491
505
  http_port=http_port,
492
506
  grpc_port=grpc_port,
493
507
  instruments=instruments,
lmnr/sdk/laminar.py CHANGED
@@ -60,10 +60,15 @@ class Laminar:
60
60
  cls,
61
61
  project_api_key: str | None = None,
62
62
  base_url: str | None = None,
63
+ base_http_url: str | None = None,
63
64
  http_port: int | None = None,
64
65
  grpc_port: int | None = None,
65
- instruments: set[Instruments] | None = None,
66
- disabled_instruments: set[Instruments] | None = None,
66
+ instruments: (
67
+ list[Instruments] | set[Instruments] | tuple[Instruments] | None
68
+ ) = None,
69
+ disabled_instruments: (
70
+ list[Instruments] | set[Instruments] | tuple[Instruments] | None
71
+ ) = None,
67
72
  disable_batch: bool = False,
68
73
  max_export_batch_size: int | None = None,
69
74
  export_timeout_seconds: int | None = None,
@@ -76,40 +81,45 @@ class Laminar:
76
81
 
77
82
  Args:
78
83
  project_api_key (str | None, optional): Laminar project api key.\
79
- You can generate one by going to the projects\
80
- settings page on the Laminar dashboard.\
81
- If not specified, it will try to read from the\
82
- LMNR_PROJECT_API_KEY environment variable\
83
- in os.environ or in .env file.
84
- Defaults to None.
84
+ You can generate one by going to the projects settings page on\
85
+ the Laminar dashboard. If not specified, we will try to read\
86
+ from the LMNR_PROJECT_API_KEY environment variable in os.environ\
87
+ or in .env file. Defaults to None.
85
88
  base_url (str | None, optional): Laminar API url. Do NOT include\
86
- the port number, use `http_port` and `grpc_port`.\
87
- If not specified, defaults to https://api.lmnr.ai.
88
- http_port (int | None, optional): Laminar API http port.\
89
- If not specified, defaults to 443.
90
- grpc_port (int | None, optional): Laminar API grpc port.\
91
- If not specified, defaults to 8443.
92
- instruments (set[Instruments] | None, optional): Instruments to\
93
- enable. Defaults to all instruments. You can pass\
94
- an empty set to disable all instruments. Read more:\
95
- https://docs.lmnr.ai/tracing/automatic-instrumentation
96
- disabled_instruments (set[Instruments] | None, optional): Instruments to\
97
- disable. Defaults to None.
89
+ the port number, use `http_port` and `grpc_port`. If not\
90
+ specified, defaults to https://api.lmnr.ai.
91
+ base_http_url (str | None, optional): Laminar API http url. Only\
92
+ set this if your Laminar backend HTTP is proxied through a\
93
+ different host. If not specified, defaults to\
94
+ https://api.lmnr.ai.
95
+ http_port (int | None, optional): Laminar API http port. If not\
96
+ specified, defaults to 443.
97
+ grpc_port (int | None, optional): Laminar API grpc port. If not\
98
+ specified, defaults to 8443.
99
+ instruments (set[Instruments] | list[Instruments] | tuple[Instruments] | None, optional):
100
+ Instruments to enable. Defaults to all instruments. You can pass\
101
+ an empty set to disable all instruments. Read more:\
102
+ https://docs.lmnr.ai/tracing/automatic-instrumentation
103
+ disabled_instruments (set[Instruments] | list[Instruments] | tuple[Instruments] | None, optional):
104
+ Instruments to disable. Defaults to None.
98
105
  disable_batch (bool, optional): If set to True, spans will be sent\
99
- immediately to the backend. Useful for debugging, but\
100
- may cause performance overhead in production.
101
- Defaults to False.
106
+ immediately to the backend. Useful for debugging, but may cause\
107
+ performance overhead in production. Defaults to False.
108
+ max_export_batch_size (int | None, optional): Maximum number of spans\
109
+ to export in a single batch. If not specified, defaults to 64\
110
+ (lower than the OpenTelemetry default of 512). If you see\
111
+ `DEADLINE_EXCEEDED` errors, try reducing this value.
102
112
  export_timeout_seconds (int | None, optional): Timeout for the OTLP\
103
- exporter. Defaults to 30 seconds (unlike the\
104
- OpenTelemetry default of 10 seconds).
105
- Defaults to None.
113
+ exporter. Defaults to 30 seconds (unlike the OpenTelemetry\
114
+ default of 10 seconds). Defaults to None.
106
115
  set_global_tracer_provider (bool, optional): If set to True, the\
107
- Laminar tracer provider will be set as the global\
108
- tracer provider. OpenTelemetry allows only one tracer\
109
- provider per app, so set this to False, if you are using\
110
- another tracing library. Setting this to False may break\
111
- some external instrumentations, e.g. LiteLLM.
112
- Defaults to True.
116
+ Laminar tracer provider will be set as the global tracer provider.\
117
+ OpenTelemetry allows only one tracer provider per app, so set this\
118
+ to False, if you are using another tracing library. Setting this to\
119
+ False may break some external instrumentations, e.g. LiteLLM.\
120
+ Defaults to True.
121
+ otel_logger_level (int, optional): OpenTelemetry logger level. Defaults\
122
+ to logging.ERROR.
113
123
 
114
124
  Raises:
115
125
  ValueError: If project API key is not set
@@ -132,10 +142,17 @@ class Laminar:
132
142
 
133
143
  url = base_url or from_env("LMNR_BASE_URL") or "https://api.lmnr.ai"
134
144
  url = url.rstrip("/")
135
- if not url.startswith("http"):
145
+ if not url.startswith("http:") and not url.startswith("https:"):
136
146
  url = f"https://{url}"
137
147
  if match := re.search(r":(\d{1,5})$", url):
138
148
  url = url[: -len(match.group(0))]
149
+ cls.__logger.info(f"Ignoring port in base URL: {match.group(1)}")
150
+
151
+ http_url = base_http_url or url
152
+ if not http_url.startswith("http:") and not http_url.startswith("https:"):
153
+ http_url = f"https://{http_url}"
154
+ if match := re.search(r":(\d{1,5})$", http_url):
155
+ http_url = http_url[: -len(match.group(0))]
139
156
  if http_port is None:
140
157
  cls.__logger.info(f"Using HTTP port from base URL: {match.group(1)}")
141
158
  http_port = int(match.group(1))
@@ -143,7 +160,7 @@ class Laminar:
143
160
  cls.__logger.info(f"Using HTTP port passed as an argument: {http_port}")
144
161
 
145
162
  cls.__initialized = True
146
- cls.__base_http_url = f"{url}:{http_port or 443}"
163
+ cls.__base_http_url = f"{http_url}:{http_port or 443}"
147
164
 
148
165
  if not os.getenv("OTEL_ATTRIBUTE_COUNT_LIMIT"):
149
166
  # each message is at least 2 attributes: role and content,
@@ -155,8 +172,10 @@ class Laminar:
155
172
  http_port=http_port or 443,
156
173
  port=grpc_port or 8443,
157
174
  project_api_key=cls.__project_api_key,
158
- instruments=instruments,
159
- block_instruments=disabled_instruments,
175
+ instruments=set(instruments) if instruments else None,
176
+ block_instruments=(
177
+ set(disabled_instruments) if disabled_instruments else None
178
+ ),
160
179
  disable_batch=disable_batch,
161
180
  max_export_batch_size=max_export_batch_size,
162
181
  timeout_seconds=export_timeout_seconds,
@@ -202,6 +221,9 @@ class Laminar:
202
221
  be epoch nanoseconds. If not specified, relies on the underlying\
203
222
  OpenTelemetry implementation. Defaults to None.
204
223
  """
224
+ if not cls.is_initialized():
225
+ return
226
+
205
227
  if timestamp and isinstance(timestamp, datetime.datetime):
206
228
  timestamp = int(timestamp.timestamp() * 1e9)
207
229
 
@@ -577,7 +599,7 @@ class Laminar:
577
599
  @classmethod
578
600
  def set_span_attributes(
579
601
  cls,
580
- attributes: dict[Attributes, Any],
602
+ attributes: dict[Attributes | str, Any],
581
603
  ):
582
604
  """Set attributes for the current span. Useful for manual
583
605
  instrumentation.
@@ -599,24 +621,19 @@ class Laminar:
599
621
  ```
600
622
 
601
623
  Args:
602
- attributes (dict[ATTRIBUTES, Any]): attributes to set for the span
624
+ attributes (dict[Attributes | str, Any]): attributes to set for the span
603
625
  """
604
626
  span = trace.get_current_span()
605
627
  if span == trace.INVALID_SPAN:
606
628
  return
607
629
 
608
630
  for key, value in attributes.items():
609
- # Python 3.12+ should do: if key not in Attributes:
610
- try:
611
- Attributes(key.value)
612
- except (TypeError, AttributeError):
613
- cls.__logger.warning(
614
- f"Attribute {key} is not a valid Laminar attribute."
615
- )
616
- if not isinstance(value, (str, int, float, bool)):
617
- span.set_attribute(key.value, json_dumps(value))
631
+ if isinstance(key, Attributes):
632
+ key = key.value
633
+ if not is_otel_attribute_value_type(value):
634
+ span.set_attribute(key, json_dumps(value))
618
635
  else:
619
- span.set_attribute(key.value, value)
636
+ span.set_attribute(key, value)
620
637
 
621
638
  @classmethod
622
639
  def get_laminar_span_context(
@@ -706,6 +723,8 @@ class Laminar:
706
723
  Args:
707
724
  tags (list[str]): Tags to set for the span.
708
725
  """
726
+ if not cls.is_initialized():
727
+ return
709
728
  span = trace.get_current_span()
710
729
  if span == trace.INVALID_SPAN:
711
730
  cls.__logger.warning("No active span to set tags on")
@@ -756,6 +775,8 @@ class Laminar:
756
775
  Args:
757
776
  session_id (str | None, optional): Custom session id. Defaults to None.
758
777
  """
778
+ if not cls.is_initialized():
779
+ return
759
780
  span = trace.get_current_span()
760
781
  if span == trace.INVALID_SPAN:
761
782
  cls.__logger.warning("No active span to set session id on")
@@ -771,6 +792,8 @@ class Laminar:
771
792
  Args:
772
793
  user_id (str | None, optional): Custom user id. Defaults to None.
773
794
  """
795
+ if not cls.is_initialized():
796
+ return
774
797
  span = trace.get_current_span()
775
798
  if span == trace.INVALID_SPAN:
776
799
  cls.__logger.warning("No active span to set user id on")
@@ -807,6 +830,8 @@ class Laminar:
807
830
  Args:
808
831
  metadata (dict[str, AttributeValue]): Metadata to set for the trace.
809
832
  """
833
+ if not cls.is_initialized():
834
+ return
810
835
  span = trace.get_current_span()
811
836
  if span == trace.INVALID_SPAN:
812
837
  cls.__logger.warning("No active span to set metadata on")
@@ -858,6 +883,8 @@ class Laminar:
858
883
  Args:
859
884
  trace_type (TraceType): Type of the trace
860
885
  """
886
+ if not cls.is_initialized():
887
+ return
861
888
  span = trace.get_current_span()
862
889
  if span == trace.INVALID_SPAN:
863
890
  cls.__logger.warning("No active span to set trace type on")
lmnr/version.py CHANGED
@@ -3,7 +3,7 @@ import httpx
3
3
  from packaging import version
4
4
 
5
5
 
6
- __version__ = "0.6.20"
6
+ __version__ = "0.6.21"
7
7
  PYTHON_VERSION = f"{sys.version_info.major}.{sys.version_info.minor}"
8
8
 
9
9
 
@@ -1,10 +1,16 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lmnr
3
- Version: 0.6.20
3
+ Version: 0.6.21
4
4
  Summary: Python SDK for Laminar
5
5
  Author: lmnr.ai
6
6
  Author-email: lmnr.ai <founders@lmnr.ai>
7
7
  License-Expression: Apache-2.0
8
+ Classifier: License :: OSI Approved :: Apache Software License
9
+ Classifier: Programming Language :: Python :: 3
10
+ Classifier: Programming Language :: Python :: 3.10
11
+ Classifier: Programming Language :: Python :: 3.11
12
+ Classifier: Programming Language :: Python :: 3.12
13
+ Classifier: Programming Language :: Python :: 3.13
8
14
  Requires-Dist: pydantic>=2.0.3,<3.0.0
9
15
  Requires-Dist: python-dotenv>=1.0
10
16
  Requires-Dist: opentelemetry-api>=1.33.0
@@ -18,15 +24,14 @@ Requires-Dist: tenacity>=8.0
18
24
  Requires-Dist: grpcio>=1
19
25
  Requires-Dist: httpx>=0.25.0
20
26
  Requires-Dist: opentelemetry-instrumentation-threading>=0.54b0
27
+ Requires-Dist: orjson>=3.10.18
21
28
  Requires-Dist: opentelemetry-instrumentation-alephalpha>=0.40.12 ; extra == 'alephalpha'
22
29
  Requires-Dist: opentelemetry-instrumentation-alephalpha>=0.40.12 ; extra == 'all'
23
- Requires-Dist: opentelemetry-instrumentation-anthropic>=0.40.12 ; extra == 'all'
24
30
  Requires-Dist: opentelemetry-instrumentation-bedrock>=0.40.12 ; extra == 'all'
25
31
  Requires-Dist: opentelemetry-instrumentation-chromadb>=0.40.12 ; extra == 'all'
26
32
  Requires-Dist: opentelemetry-instrumentation-cohere>=0.40.12 ; extra == 'all'
27
33
  Requires-Dist: opentelemetry-instrumentation-crewai>=0.40.12 ; extra == 'all'
28
34
  Requires-Dist: opentelemetry-instrumentation-google-generativeai<0.40.10 ; extra == 'all'
29
- Requires-Dist: opentelemetry-instrumentation-groq>=0.40.12 ; extra == 'all'
30
35
  Requires-Dist: opentelemetry-instrumentation-haystack>=0.40.12 ; extra == 'all'
31
36
  Requires-Dist: opentelemetry-instrumentation-lancedb>=0.40.12 ; extra == 'all'
32
37
  Requires-Dist: opentelemetry-instrumentation-langchain>=0.40.12 ; extra == 'all'
@@ -45,13 +50,11 @@ Requires-Dist: opentelemetry-instrumentation-transformers>=0.40.12 ; extra == 'a
45
50
  Requires-Dist: opentelemetry-instrumentation-vertexai>=0.40.12 ; extra == 'all'
46
51
  Requires-Dist: opentelemetry-instrumentation-watsonx>=0.40.12 ; extra == 'all'
47
52
  Requires-Dist: opentelemetry-instrumentation-weaviate>=0.40.12 ; extra == 'all'
48
- Requires-Dist: opentelemetry-instrumentation-anthropic>=0.40.12 ; extra == 'anthropic'
49
53
  Requires-Dist: opentelemetry-instrumentation-bedrock>=0.40.12 ; extra == 'bedrock'
50
54
  Requires-Dist: opentelemetry-instrumentation-chromadb>=0.40.12 ; extra == 'chromadb'
51
55
  Requires-Dist: opentelemetry-instrumentation-cohere>=0.40.12 ; extra == 'cohere'
52
56
  Requires-Dist: opentelemetry-instrumentation-crewai>=0.40.12 ; extra == 'crewai'
53
57
  Requires-Dist: opentelemetry-instrumentation-google-generativeai<0.40.10 ; extra == 'google-generativeai'
54
- Requires-Dist: opentelemetry-instrumentation-groq>=0.40.12 ; extra == 'groq'
55
58
  Requires-Dist: opentelemetry-instrumentation-haystack>=0.40.12 ; extra == 'haystack'
56
59
  Requires-Dist: opentelemetry-instrumentation-lancedb>=0.40.12 ; extra == 'lancedb'
57
60
  Requires-Dist: opentelemetry-instrumentation-langchain>=0.40.12 ; extra == 'langchain'
@@ -73,13 +76,11 @@ Requires-Dist: opentelemetry-instrumentation-weaviate>=0.40.12 ; extra == 'weavi
73
76
  Requires-Python: >=3.10, <4
74
77
  Provides-Extra: alephalpha
75
78
  Provides-Extra: all
76
- Provides-Extra: anthropic
77
79
  Provides-Extra: bedrock
78
80
  Provides-Extra: chromadb
79
81
  Provides-Extra: cohere
80
82
  Provides-Extra: crewai
81
83
  Provides-Extra: google-generativeai
82
- Provides-Extra: groq
83
84
  Provides-Extra: haystack
84
85
  Provides-Extra: lancedb
85
86
  Provides-Extra: langchain
@@ -2,13 +2,28 @@ lmnr/__init__.py,sha256=81183c3dbfb45d5cc2f979a22e51c8f41af9c80257c13eacacf1715c
2
2
  lmnr/cli.py,sha256=b8780b51f37fe9e20db5495c41d3ad3837f6b48f408b09a58688d017850c0796,6047
3
3
  lmnr/opentelemetry_lib/.flake8,sha256=6c2c6e0e51b1dd8439e501ca3e21899277076a787da868d0254ba37056b79405,150
4
4
  lmnr/opentelemetry_lib/__init__.py,sha256=6962aca915d485586ed814b9e799ced898594ac2bc6d35329405705b26eab861,2160
5
- lmnr/opentelemetry_lib/decorators/__init__.py,sha256=e391d5a189c70b563d0ff552922a036ea0f7826e113c2e6c2a8ceda26048e63f,8496
5
+ lmnr/opentelemetry_lib/decorators/__init__.py,sha256=4846f7ae441a3995811c01c9d3cbb8e6e17d6511adf6e5cd295e02832faab4bb,9131
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/anthropic/__init__.py,sha256=92cbf8c59d467b33c01d5fd1c8d5694186c688b2b2e52e6e737f0464a133ceb4,20546
9
+ lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/config.py,sha256=972919b821b9b7e5dc7cd191ba7e78b30b6efa5d63514e8cb301996d6386392c,369
10
+ lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/event_emitter.py,sha256=812b3ea1c5a04412113d4dd770717561861595f9eec5b94dd8174c6ddfb7572a,6831
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
14
+ lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/utils.py,sha256=0044f02da8b99322fdbf3f8f6663f04ff5d1295ddae92a635fd16eb685d5fbb6,5386
15
+ lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/version.py,sha256=5aacde4ca55ef50ed07a239ad8a86889e0621b1cc72be19bd93be7c9e20910a9,23
8
16
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/google_genai/__init__.py,sha256=8eb4abc2a96aa09ab9104d74ae508ea9ea6a6cbf60f8cd333b4c15c425db48e8,20166
9
17
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/google_genai/config.py,sha256=db9cdebc9ee0dccb493ffe608eede3047efec20ed26c3924b72b2e50edbd92c2,245
10
18
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/google_genai/schema_utils.py,sha256=857a6bc52f8bfd4da72786173615d31faaf3f9378f8f6150ffe8f6f9c4bb78f9,685
11
19
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/google_genai/utils.py,sha256=f1248196246826d899304e510c4c2df74088d8169d28f1d0aed578a7a6c3cbfd,7669
20
+ lmnr/opentelemetry_lib/opentelemetry/instrumentation/groq/__init__.py,sha256=0ac77d492cb7de9d15e70d93ef965f4702295fae49a0c85d1da0cf260ec8ae7e,14837
21
+ lmnr/opentelemetry_lib/opentelemetry/instrumentation/groq/config.py,sha256=29d557d9dee56354e89634bdc3f4795f346ee67bbfec56184b4fb394e45a7e03,203
22
+ lmnr/opentelemetry_lib/opentelemetry/instrumentation/groq/event_emitter.py,sha256=1f07d78bf360832951c708fcb3737718e50d39ce05beb8adbf57e818b4873703,4481
23
+ lmnr/opentelemetry_lib/opentelemetry/instrumentation/groq/event_models.py,sha256=3c27c21b1aeb02bc19a91fb8c05717ae1c10ab4b01300c664aba42e0f50cb5a3,876
24
+ lmnr/opentelemetry_lib/opentelemetry/instrumentation/groq/span_utils.py,sha256=7a1cd03539ff2c9e5114a26483dc50066cd5f1b7283e584431dd036949e1f31b,7461
25
+ lmnr/opentelemetry_lib/opentelemetry/instrumentation/groq/utils.py,sha256=139f085a337ae321f68822bbbd2400bfc008c4d6a706ab319e522bef6b91e552,2360
26
+ lmnr/opentelemetry_lib/opentelemetry/instrumentation/groq/version.py,sha256=5aacde4ca55ef50ed07a239ad8a86889e0621b1cc72be19bd93be7c9e20910a9,23
12
27
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/langgraph/__init__.py,sha256=272bfd92865d180e3ea13681ec04c1ec3697eda34e63edd83862f8c17d1cecf3,3107
13
28
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/langgraph/utils.py,sha256=9dff6c2595e79edb38818668aed1220efc188d8a982594c04f4ceeb6e3ff47a6,1512
14
29
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/__init__.py,sha256=8b91dc16af927eee75b969c0980c606680b347a87f8533bc0f4a092e5ec6e5c9,2071
@@ -20,7 +35,7 @@ lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/embeddings_wr
20
35
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/event_emitter.py,sha256=9c96455b5ca2064dd3a9fb570d78b14ebbdf3d02f8e33255ee9e301c31336c9e,3043
21
36
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/event_models.py,sha256=3c27c21b1aeb02bc19a91fb8c05717ae1c10ab4b01300c664aba42e0f50cb5a3,876
22
37
  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
38
+ lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/utils.py,sha256=541e94d60c94b8a8035ee74cda00ca3576a3f50a215df03d948de58665dbc25b,4649
24
39
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v0/__init__.py,sha256=7f43421e052bd8f64d5d5b03170a3b7187c2ce038362fa15b5d1d0c43bc1a40d,6143
25
40
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v1/__init__.py,sha256=662afd935c52b42512280614bf502554389c8854ab1256efbfde03fe364dac64,12932
26
41
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v1/assistant_wrappers.py,sha256=8f36cb3eeeead7abdfa43bca3fdf73fdf2fba562bb1a746225696a2b2dde4f50,10111
@@ -29,24 +44,24 @@ lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v1/responses_wrapper
29
44
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/version.py,sha256=4f39aaa913f3e49b0c174bc23028687d00bfaffc745bd3fe241e0ae6b442bed1,24
30
45
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/opentelemetry/__init__.py,sha256=1f86cdf738e2f68586b0a4569bb1e40edddd85c529f511ef49945ddb7b61fab5,2648
31
46
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/skyvern/__init__.py,sha256=764e4fe979fb08d7821419a3cc5c3ae89a6664b626ef928259f8f175c939eaea,6334
32
- lmnr/opentelemetry_lib/tracing/__init__.py,sha256=dbb4288007be687cab56be9be7af8376e526d0a104db82b5695d9ed67a2e4cd8,6007
33
- lmnr/opentelemetry_lib/tracing/_instrument_initializers.py,sha256=53444be1c6c1f9c5acc3291a4984222519d3237abf9ed1c9296b438776e7ec36,15110
47
+ lmnr/opentelemetry_lib/tracing/__init__.py,sha256=906aca320649cb59fb5ba05c6ddba914daae46d615da38dc399bd62b17262002,6007
48
+ lmnr/opentelemetry_lib/tracing/_instrument_initializers.py,sha256=a15a46a0515462319195a96f7cdb695e72a1559c3212964f5883ab824031bf70,15125
34
49
  lmnr/opentelemetry_lib/tracing/attributes.py,sha256=32fa30565b977c2a92202dc2bf1ded583a81d02a6bf5ba52958f75a8be08cbbe,1497
35
50
  lmnr/opentelemetry_lib/tracing/context_properties.py,sha256=6966ef31d581e10eeea9cd06192b237115cc4dc3b5f1a58e68865edd0c92fda0,2314
36
51
  lmnr/opentelemetry_lib/tracing/exporter.py,sha256=6af8e61fd873e8f5db315d9b9f1edbf46b860ba7e50140f0bdcc6864c6d35a03,2082
37
52
  lmnr/opentelemetry_lib/tracing/instruments.py,sha256=e3c12315bda301416d1f3bc8d354ad16d4da211e2ecfa019265f4b565307c118,5655
38
- lmnr/opentelemetry_lib/tracing/processor.py,sha256=609ff68f4da853f6190fc72e0e5b5790253f7cdd61700088eb55f9aa009977bb,3441
53
+ lmnr/opentelemetry_lib/tracing/processor.py,sha256=ed46599411de041b802e53e777d23fb2851913df185cb0facf001d0b49a5a8e3,3440
39
54
  lmnr/opentelemetry_lib/tracing/tracer.py,sha256=a0d0ba57c785bee2b78b92165ec2838c43052ff6b1792a2fdcbd5f3debf0b963,476
40
55
  lmnr/opentelemetry_lib/utils/__init__.py,sha256=a4d85fd06def4dde5c728734de2d4c5c36eb89c49a8aa09b8b50cb5a149e90af,604
41
56
  lmnr/opentelemetry_lib/utils/json_encoder.py,sha256=74ae9bfdac6bef42182fb56ff9bbb8c27b6f0c3bb29eda2ab0769d76a5fb3f9f,463
42
- lmnr/opentelemetry_lib/utils/package_check.py,sha256=493d81bc3c6dd1b6b1fa287d17d59fd2394a004ae6ced6f12a639c15fef5deb2,265
57
+ lmnr/opentelemetry_lib/utils/package_check.py,sha256=f8274186c96815c996a25fae06bf913f0bb7c835507739949f37c03bbe5d9ca9,527
43
58
  lmnr/py.typed,sha256=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855,0
44
59
  lmnr/sdk/__init__.py,sha256=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855,0
45
60
  lmnr/sdk/browser/__init__.py,sha256=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855,0
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
61
+ lmnr/sdk/browser/browser_use_otel.py,sha256=0de6b4e41a08cc953f53c386c45fd1bc8bad229b4c6fbd69459e3fab0b073b4c,5109
62
+ lmnr/sdk/browser/patchright_otel.py,sha256=dd13d0555c0b1187d6130b403cc21e54e0c7bfa5163090232d4f0ba1b4ff13c2,4409
63
+ lmnr/sdk/browser/playwright_otel.py,sha256=b45cc4bed5c0029976ffbd01ad46e52cef21f5dafda8679f3a68f438733b86ec,8697
64
+ lmnr/sdk/browser/pw_utils.py,sha256=2e711cef6a60cffe48005838245053ecc7e1f1bda77fe3518f61c19b10ebed0d,19599
50
65
  lmnr/sdk/browser/rrweb/rrweb.umd.min.cjs,sha256=2f2da38b00bb85312d8225f3069a09352135564ceed2564f652f1bae3bac016d,260896
51
66
  lmnr/sdk/browser/utils.py,sha256=4a668776d2938108d25fbcecd61c8e1710a4da3e56230d5fefca5964dd09e3c1,2371
52
67
  lmnr/sdk/client/asynchronous/async_client.py,sha256=e8feae007506cd2e4b08e72706f5f1bb4ea54492b4aa6b68ef184a129de8f466,4948
@@ -66,15 +81,15 @@ lmnr/sdk/client/synchronous/resources/evaluators.py,sha256=3cd6a17e7a9cc0441c2d2
66
81
  lmnr/sdk/client/synchronous/resources/tags.py,sha256=123deec43128662c21cb275b2df6a102372f875315b0bd36806555394c1d4b5b,2270
67
82
  lmnr/sdk/client/synchronous/sync_client.py,sha256=0bebe88e3aed689505e9ed3d32036f76df4c3496e4d659162bd41abedc026f16,5299
68
83
  lmnr/sdk/datasets.py,sha256=3fd851c5f97bf88eaa84b1451a053eaff23b4497cbb45eac2f9ea0e5f2886c00,1708
69
- lmnr/sdk/decorators.py,sha256=d6ebbdc7105881b945aa5850a87d7b71962aedb69b026075944b6f0604ec3f41,4468
84
+ lmnr/sdk/decorators.py,sha256=0c6b95b92ec8023f28cd15ddc47849888fa91f2534d575f626e3557f5f0a0c02,6451
70
85
  lmnr/sdk/eval_control.py,sha256=291394ac385c653ae9b5167e871bebeb4fe8fc6b7ff2ed38e636f87015dcba86,184
71
- lmnr/sdk/evaluations.py,sha256=ad40c6a48d5e34aa33f3d9ad80514f2055e7eb360b820697bd6cb828a6364625,21806
72
- lmnr/sdk/laminar.py,sha256=a0e55ca3f73d66cb53ef51ecaae1ac81bb45ba65ddd848f3d2b97faa998c9535,33996
86
+ lmnr/sdk/evaluations.py,sha256=b41f7737b084dc5b64b2952659b729622e0918fd492bfcddde7177d1a1c690ae,22572
87
+ lmnr/sdk/laminar.py,sha256=c782ee6e5dcb3acada5fd30ccc85cea2d28d59a99af86c14161806f0e85a207f,35208
73
88
  lmnr/sdk/log.py,sha256=9edfd83263f0d4845b1b2d1beeae2b4ed3f8628de941f371a893d72b79c348d4,2213
74
89
  lmnr/sdk/types.py,sha256=650a7949e609359b0adcaadb49e5cf63fc67ea61a35b9992c3f8b445dfce6b89,12328
75
90
  lmnr/sdk/utils.py,sha256=4beb884ae6fbbc7d8cf639b036b726ea6a2a658f0a6386faf5735a13d706a2d8,5039
76
- lmnr/version.py,sha256=fec940af89e4f538f3f2c79e3670aaf085c8fa8edd10da2a292bcd224a3f2a26,1322
77
- lmnr-0.6.20.dist-info/WHEEL,sha256=66530aef82d5020ef5af27ae0123c71abb9261377c5bc519376c671346b12918,79
78
- lmnr-0.6.20.dist-info/entry_points.txt,sha256=abdf3411b7dd2d7329a241f2da6669bab4e314a747a586ecdb9f888f3035003c,39
79
- lmnr-0.6.20.dist-info/METADATA,sha256=dd5758deaf108a40ec4b216482914e90f414199c716887e94af4328b74a32878,14475
80
- lmnr-0.6.20.dist-info/RECORD,,
91
+ lmnr/version.py,sha256=54a1b533e429edeb5cd515149160e8f8e9ee1d29bc2a9154070f57ecfef74fed,1322
92
+ lmnr-0.6.21.dist-info/WHEEL,sha256=cc8ae5806c5874a696cde0fcf78fdf73db4982e7c824f3ceab35e2b65182fa1a,79
93
+ lmnr-0.6.21.dist-info/entry_points.txt,sha256=abdf3411b7dd2d7329a241f2da6669bab4e314a747a586ecdb9f888f3035003c,39
94
+ lmnr-0.6.21.dist-info/METADATA,sha256=3dc12230601db748dea1bda0cbb285741f5de3c3db8a4e889deed362b28b0757,14453
95
+ lmnr-0.6.21.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: uv 0.7.20
2
+ Generator: uv 0.7.21
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any