lmnr 0.6.8__py3-none-any.whl → 0.6.10__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.
@@ -0,0 +1,60 @@
1
+ import logging
2
+ import traceback
3
+
4
+ import pydantic
5
+ from opentelemetry.trace import Span
6
+ from typing import Any
7
+
8
+
9
+ def set_span_attribute(span: Span, name: str, value: str):
10
+ if value is not None:
11
+ if value != "":
12
+ span.set_attribute(name, value)
13
+ return
14
+
15
+
16
+ def dont_throw(func):
17
+ """
18
+ A decorator that wraps the passed in function and logs exceptions instead of throwing them.
19
+
20
+ @param func: The function to wrap
21
+ @return: The wrapper function
22
+ """
23
+ # Obtain a logger specific to the function's module
24
+ logger = logging.getLogger(func.__module__)
25
+
26
+ def wrapper(*args, **kwargs):
27
+ try:
28
+ return func(*args, **kwargs)
29
+ except Exception:
30
+ logger.debug(
31
+ "Laminar failed to trace in %s, error: %s",
32
+ func.__name__,
33
+ traceback.format_exc(),
34
+ )
35
+
36
+ return wrapper
37
+
38
+
39
+ def to_dict(obj: pydantic.BaseModel | dict) -> dict[str, Any]:
40
+ try:
41
+ if isinstance(obj, pydantic.BaseModel):
42
+ return obj.model_dump()
43
+ elif isinstance(obj, dict):
44
+ return obj
45
+ else:
46
+ return dict(obj)
47
+ except Exception:
48
+ return dict(obj)
49
+
50
+
51
+ def with_tracer_wrapper(func):
52
+ """Helper for providing tracer for wrapper functions."""
53
+
54
+ def _with_tracer(tracer, to_wrap):
55
+ def wrapper(wrapped, instance, args, kwargs):
56
+ return func(tracer, to_wrap, wrapped, instance, args, kwargs)
57
+
58
+ return wrapper
59
+
60
+ return _with_tracer
@@ -1,5 +1,6 @@
1
1
  import atexit
2
2
  import logging
3
+ import threading
3
4
 
4
5
  from lmnr.opentelemetry_lib.tracing.processor import LaminarSpanProcessor
5
6
  from lmnr.sdk.client.asynchronous.async_client import AsyncLaminarClient
@@ -16,12 +17,6 @@ from opentelemetry.sdk.resources import Resource
16
17
  from opentelemetry.sdk.trace import TracerProvider, SpanProcessor
17
18
  from opentelemetry.sdk.trace.export import SpanExporter
18
19
 
19
- module_logger = logging.getLogger(__name__)
20
- console_log_handler = logging.StreamHandler()
21
- console_log_handler.setFormatter(VerboseColorfulFormatter())
22
- module_logger.addHandler(console_log_handler)
23
-
24
-
25
20
  TRACER_NAME = "lmnr.tracer"
26
21
 
27
22
  MAX_EVENTS_OR_ATTRIBUTES_PER_SPAN = 5000
@@ -30,12 +25,13 @@ MAX_EVENTS_OR_ATTRIBUTES_PER_SPAN = 5000
30
25
  class TracerWrapper(object):
31
26
  resource_attributes: dict = {}
32
27
  enable_content_tracing: bool = True
33
- __tracer_provider: TracerProvider | None = None
34
- __logger: logging.Logger
35
- __client: LaminarClient
36
- __async_client: AsyncLaminarClient
37
- __resource: Resource
38
- __span_processor: SpanProcessor
28
+ _lock = threading.Lock()
29
+ _tracer_provider: TracerProvider | None = None
30
+ _logger: logging.Logger
31
+ _client: LaminarClient
32
+ _async_client: AsyncLaminarClient
33
+ _resource: Resource
34
+ _span_processor: SpanProcessor
39
35
 
40
36
  def __new__(
41
37
  cls,
@@ -57,73 +53,76 @@ class TracerWrapper(object):
57
53
  logging.getLogger("opentelemetry.trace").setLevel(otel_logger_level)
58
54
 
59
55
  base_http_url = f"{base_url}:{http_port}"
60
- cls._initialize_logger(cls)
61
- if not hasattr(cls, "instance"):
62
- obj = cls.instance = super(TracerWrapper, cls).__new__(cls)
63
-
64
- obj.__client = LaminarClient(
65
- base_url=base_http_url,
66
- project_api_key=project_api_key,
67
- )
68
- obj.__async_client = AsyncLaminarClient(
69
- base_url=base_http_url,
70
- project_api_key=project_api_key,
71
- )
72
-
73
- obj.__resource = Resource(attributes=TracerWrapper.resource_attributes)
74
-
75
- obj.__span_processor = LaminarSpanProcessor(
76
- base_url=base_url,
77
- api_key=project_api_key,
78
- port=http_port if force_http else port,
79
- exporter=exporter,
80
- max_export_batch_size=max_export_batch_size,
81
- timeout_seconds=timeout_seconds,
82
- force_http=force_http,
83
- disable_batch=disable_batch,
84
- )
85
-
86
- lmnr_provider = TracerProvider(resource=obj.__resource)
87
- global_provider = trace.get_tracer_provider()
88
- if set_global_tracer_provider and isinstance(
89
- global_provider, trace.ProxyTracerProvider
90
- ):
91
- trace.set_tracer_provider(lmnr_provider)
92
-
93
- obj.__tracer_provider = lmnr_provider
94
-
95
- obj.__tracer_provider.add_span_processor(obj.__span_processor)
96
-
97
- # This is not a real instrumentation and does not generate telemetry
98
- # data, but it is required to ensure that OpenTelemetry context
99
- # propagation is enabled.
100
- # See the README at:
101
- # https://pypi.org/project/opentelemetry-instrumentation-threading/
102
- ThreadingInstrumentor().instrument()
103
-
104
- init_instrumentations(
105
- tracer_provider=obj.__tracer_provider,
106
- instruments=instruments,
107
- block_instruments=block_instruments,
108
- client=obj.__client,
109
- async_client=obj.__async_client,
110
- )
111
-
112
- # Force flushes for debug environments (e.g. local development)
113
- atexit.register(obj.exit_handler)
114
-
115
- return cls.instance
56
+ with cls._lock:
57
+ if not hasattr(cls, "instance"):
58
+ cls._initialize_logger(cls)
59
+ obj = super(TracerWrapper, cls).__new__(cls)
60
+
61
+ obj._client = LaminarClient(
62
+ base_url=base_http_url,
63
+ project_api_key=project_api_key,
64
+ )
65
+ obj._async_client = AsyncLaminarClient(
66
+ base_url=base_http_url,
67
+ project_api_key=project_api_key,
68
+ )
69
+
70
+ obj._resource = Resource(attributes=TracerWrapper.resource_attributes)
71
+
72
+ obj._span_processor = LaminarSpanProcessor(
73
+ base_url=base_url,
74
+ api_key=project_api_key,
75
+ port=http_port if force_http else port,
76
+ exporter=exporter,
77
+ max_export_batch_size=max_export_batch_size,
78
+ timeout_seconds=timeout_seconds,
79
+ force_http=force_http,
80
+ disable_batch=disable_batch,
81
+ )
82
+
83
+ lmnr_provider = TracerProvider(resource=obj._resource)
84
+ global_provider = trace.get_tracer_provider()
85
+ if set_global_tracer_provider and isinstance(
86
+ global_provider, trace.ProxyTracerProvider
87
+ ):
88
+ trace.set_tracer_provider(lmnr_provider)
89
+
90
+ obj._tracer_provider = lmnr_provider
91
+
92
+ obj._tracer_provider.add_span_processor(obj._span_processor)
93
+
94
+ # This is not a real instrumentation and does not generate telemetry
95
+ # data, but it is required to ensure that OpenTelemetry context
96
+ # propagation is enabled.
97
+ # See the README at:
98
+ # https://pypi.org/project/opentelemetry-instrumentation-threading/
99
+ ThreadingInstrumentor().instrument()
100
+
101
+ init_instrumentations(
102
+ tracer_provider=obj._tracer_provider,
103
+ instruments=instruments,
104
+ block_instruments=block_instruments,
105
+ client=obj._client,
106
+ async_client=obj._async_client,
107
+ )
108
+
109
+ cls.instance = obj
110
+
111
+ # Force flushes for debug environments (e.g. local development)
112
+ atexit.register(obj.exit_handler)
113
+
114
+ return cls.instance
116
115
 
117
116
  def exit_handler(self):
118
- if isinstance(self.__span_processor, LaminarSpanProcessor):
119
- self.__span_processor.clear()
117
+ if isinstance(self._span_processor, LaminarSpanProcessor):
118
+ self._span_processor.clear()
120
119
  self.flush()
121
120
 
122
121
  def _initialize_logger(self):
123
- self.__logger = logging.getLogger(__name__)
122
+ self._logger = logging.getLogger(__name__)
124
123
  console_log_handler = logging.StreamHandler()
125
124
  console_log_handler.setFormatter(VerboseColorfulFormatter())
126
- self.__logger.addHandler(console_log_handler)
125
+ self._logger.addHandler(console_log_handler)
127
126
 
128
127
  @staticmethod
129
128
  def set_static_params(
@@ -135,23 +134,29 @@ class TracerWrapper(object):
135
134
 
136
135
  @classmethod
137
136
  def verify_initialized(cls) -> bool:
138
- return hasattr(cls, "instance")
137
+ with cls._lock:
138
+ return hasattr(cls, "instance") and hasattr(cls.instance, "_span_processor")
139
139
 
140
140
  @classmethod
141
141
  def clear(cls):
142
+ if not cls.verify_initialized():
143
+ return
142
144
  # Any state cleanup. Now used in between tests
143
- if isinstance(cls.instance.__span_processor, LaminarSpanProcessor):
144
- cls.instance.__span_processor.clear()
145
+ if isinstance(cls.instance._span_processor, LaminarSpanProcessor):
146
+ cls.instance._span_processor.clear()
145
147
 
146
148
  def shutdown(self):
147
- if self.__tracer_provider is None:
149
+ if self._tracer_provider is None:
148
150
  return
149
- self.__tracer_provider.shutdown()
151
+ self._tracer_provider.shutdown()
150
152
 
151
153
  def flush(self):
152
- return self.__span_processor.force_flush()
154
+ if not hasattr(self, "_span_processor"):
155
+ self._logger.warning("TracerWrapper not fully initialized, cannot flush")
156
+ return False
157
+ return self._span_processor.force_flush()
153
158
 
154
159
  def get_tracer(self):
155
- if self.__tracer_provider is None:
160
+ if self._tracer_provider is None:
156
161
  return trace.get_tracer_provider().get_tracer(TRACER_NAME)
157
- return self.__tracer_provider.get_tracer(TRACER_NAME)
162
+ return self._tracer_provider.get_tracer(TRACER_NAME)
@@ -171,6 +171,18 @@ class LangchainInstrumentorInitializer(InstrumentorInitializer):
171
171
  return LangchainInstrumentor()
172
172
 
173
173
 
174
+ class LanggraphInstrumentorInitializer(InstrumentorInitializer):
175
+ def init_instrumentor(self, *args, **kwargs) -> BaseInstrumentor | None:
176
+ if not is_package_installed("langgraph"):
177
+ return None
178
+ if not is_package_installed("langchain-core"):
179
+ return None
180
+
181
+ from ..opentelemetry.instrumentation.langgraph import LanggraphInstrumentor
182
+
183
+ return LanggraphInstrumentor()
184
+
185
+
174
186
  class LlamaIndexInstrumentorInitializer(InstrumentorInitializer):
175
187
  def init_instrumentor(self, *args, **kwargs) -> BaseInstrumentor | None:
176
188
  if not (
@@ -6,7 +6,7 @@ from lmnr.opentelemetry_lib.tracing.attributes import (
6
6
  )
7
7
 
8
8
  from opentelemetry.context import Context, attach, set_value, get_value
9
- from opentelemetry.trace import Span
9
+ from opentelemetry.sdk.trace import Span
10
10
  from opentelemetry import trace
11
11
 
12
12
 
@@ -51,8 +51,15 @@ def remove_association_properties(properties: dict) -> None:
51
51
 
52
52
 
53
53
  def _set_association_properties_attributes(span: Span, properties: dict) -> None:
54
+ if not span.is_recording():
55
+ return
54
56
  for key, value in properties.items():
55
57
  if key == TRACING_LEVEL:
56
58
  span.set_attribute(f"lmnr.internal.{TRACING_LEVEL}", value)
57
59
  continue
60
+ if (
61
+ key in ["langgraph.edges", "langgraph.nodes"]
62
+ and span.name != "LangGraph.workflow"
63
+ ):
64
+ continue
58
65
  span.set_attribute(f"{ASSOCIATION_PROPERTIES}.{key}", value)
@@ -26,6 +26,7 @@ class Instruments(Enum):
26
26
  HAYSTACK = "haystack"
27
27
  LANCEDB = "lancedb"
28
28
  LANGCHAIN = "langchain"
29
+ LANGGRAPH = "langgraph"
29
30
  LLAMA_INDEX = "llama_index"
30
31
  MARQO = "marqo"
31
32
  MCP = "mcp"
@@ -62,6 +63,7 @@ INSTRUMENTATION_INITIALIZERS: dict[
62
63
  Instruments.HAYSTACK: initializers.HaystackInstrumentorInitializer(),
63
64
  Instruments.LANCEDB: initializers.LanceDBInstrumentorInitializer(),
64
65
  Instruments.LANGCHAIN: initializers.LangchainInstrumentorInitializer(),
66
+ Instruments.LANGGRAPH: initializers.LanggraphInstrumentorInitializer(),
65
67
  Instruments.LLAMA_INDEX: initializers.LlamaIndexInstrumentorInitializer(),
66
68
  Instruments.MARQO: initializers.MarqoInstrumentorInitializer(),
67
69
  Instruments.MCP: initializers.MCPInstrumentorInitializer(),
@@ -6,7 +6,7 @@ from opentelemetry.sdk.trace.export import (
6
6
  BatchSpanProcessor,
7
7
  SimpleSpanProcessor,
8
8
  )
9
- from opentelemetry.trace import Span
9
+ from opentelemetry.sdk.trace import Span
10
10
  from opentelemetry.context import Context, get_value, get_current, set_value
11
11
 
12
12
  from lmnr.opentelemetry_lib.tracing.attributes import (
@@ -33,6 +33,10 @@ class AsyncEvals(BaseAsyncResource):
33
33
  },
34
34
  headers=self._headers(),
35
35
  )
36
+ if response.status_code != 200:
37
+ if response.status_code == 401:
38
+ raise ValueError("Unauthorized. Please check your project API key.")
39
+ raise ValueError(f"Error initializing evaluation: {response.text}")
36
40
  resp_json = response.json()
37
41
  return InitEvaluationResponse.model_validate(resp_json)
38
42
 
@@ -35,6 +35,10 @@ class Evals(BaseResource):
35
35
  },
36
36
  headers=self._headers(),
37
37
  )
38
+ if response.status_code != 200:
39
+ if response.status_code == 401:
40
+ raise ValueError("Unauthorized. Please check your project API key.")
41
+ raise ValueError(f"Error initializing evaluation: {response.text}")
38
42
  resp_json = response.json()
39
43
  return InitEvaluationResponse.model_validate(resp_json)
40
44
 
lmnr/sdk/evaluations.py CHANGED
@@ -199,11 +199,11 @@ class Evaluation:
199
199
  self.base_http_url = f"{base_url}:{http_port or 443}"
200
200
 
201
201
  api_key = project_api_key or from_env("LMNR_PROJECT_API_KEY")
202
- if not api_key:
202
+ if not api_key and not L.is_initialized():
203
203
  raise ValueError(
204
- "Please initialize the Laminar object with"
205
- " your project API key or set the LMNR_PROJECT_API_KEY"
206
- " environment variable in your environment or .env file"
204
+ "Please pass the project API key to `evaluate`"
205
+ " or set the LMNR_PROJECT_API_KEY environment variable"
206
+ " in your environment or .env file"
207
207
  )
208
208
  self.project_api_key = api_key
209
209
 
@@ -212,17 +212,12 @@ class Evaluation:
212
212
  base_url=L.get_base_http_url(),
213
213
  project_api_key=L.get_project_api_key(),
214
214
  )
215
- if project_api_key and project_api_key != L.get_project_api_key():
216
- self._logger.warning(
217
- "Project API key is different from the one used to initialize"
218
- " Laminar. Ignoring the project API key passed to the evaluation."
219
- )
220
- return
215
+ else:
216
+ self.client = AsyncLaminarClient(
217
+ base_url=self.base_http_url,
218
+ project_api_key=self.project_api_key,
219
+ )
221
220
 
222
- self.client = AsyncLaminarClient(
223
- base_url=self.base_http_url,
224
- project_api_key=self.project_api_key,
225
- )
226
221
  L.initialize(
227
222
  project_api_key=project_api_key,
228
223
  base_url=base_url,
@@ -233,10 +228,10 @@ class Evaluation:
233
228
  export_timeout_seconds=trace_export_timeout_seconds,
234
229
  )
235
230
 
236
- async def run(self) -> Awaitable[None]:
231
+ async def run(self) -> Awaitable[dict[str, int | float]]:
237
232
  return await self._run()
238
233
 
239
- async def _run(self) -> None:
234
+ async def _run(self) -> dict[str, int | float]:
240
235
  if isinstance(self.data, LaminarDataset):
241
236
  self.data.set_client(
242
237
  LaminarClient(
@@ -261,11 +256,12 @@ class Evaluation:
261
256
  except Exception as e:
262
257
  self.reporter.stopWithError(e)
263
258
  await self._shutdown()
264
- return
259
+ raise
265
260
 
266
261
  average_scores = get_average_scores(result_datapoints)
267
262
  self.reporter.stop(average_scores, evaluation.projectId, evaluation.id)
268
263
  await self._shutdown()
264
+ return average_scores
269
265
 
270
266
  async def _shutdown(self):
271
267
  # We use flush() instead of shutdown() because multiple evaluations
lmnr/sdk/laminar.py CHANGED
@@ -114,6 +114,12 @@ class Laminar:
114
114
  Raises:
115
115
  ValueError: If project API key is not set
116
116
  """
117
+ if cls.is_initialized():
118
+ cls.__logger.info(
119
+ "Laminar is already initialized. Skipping initialization."
120
+ )
121
+ return
122
+
117
123
  cls.__project_api_key = project_api_key or from_env("LMNR_PROJECT_API_KEY")
118
124
  if not cls.__project_api_key:
119
125
  raise ValueError(
@@ -691,6 +697,7 @@ class Laminar:
691
697
  def shutdown(cls):
692
698
  if cls.is_initialized():
693
699
  TracerManager.shutdown()
700
+ cls.__initialized = False
694
701
 
695
702
  @classmethod
696
703
  def set_span_tags(cls, tags: list[str]):
lmnr/sdk/types.py CHANGED
@@ -81,7 +81,7 @@ class PartialEvaluationDatapoint(pydantic.BaseModel):
81
81
  "traceId": str(self.trace_id),
82
82
  "executorSpanId": str(self.executor_span_id),
83
83
  "metadata": (
84
- serialize(self.metadata) if self.metadata is not None else None
84
+ serialize(self.metadata) if self.metadata is not None else {}
85
85
  ),
86
86
  }
87
87
  except Exception as e:
@@ -123,7 +123,7 @@ class EvaluationResultDatapoint(pydantic.BaseModel):
123
123
  "executorSpanId": str(self.executor_span_id),
124
124
  "index": self.index,
125
125
  "metadata": (
126
- serialize(self.metadata) if self.metadata is not None else None
126
+ serialize(self.metadata) if self.metadata is not None else {}
127
127
  ),
128
128
  }
129
129
  except Exception as e:
lmnr/version.py CHANGED
@@ -3,7 +3,7 @@ import httpx
3
3
  from packaging import version
4
4
 
5
5
 
6
- __version__ = "0.6.8"
6
+ __version__ = "0.6.10"
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.3
2
2
  Name: lmnr
3
- Version: 0.6.8
3
+ Version: 0.6.10
4
4
  Summary: Python SDK for Laminar
5
5
  License: Apache-2.0
6
6
  Author: lmnr.ai
@@ -46,61 +46,61 @@ Requires-Dist: httpx (>=0.25.0)
46
46
  Requires-Dist: opentelemetry-api (>=1.33.0)
47
47
  Requires-Dist: opentelemetry-exporter-otlp-proto-grpc (>=1.33.0)
48
48
  Requires-Dist: opentelemetry-exporter-otlp-proto-http (>=1.33.0)
49
- Requires-Dist: opentelemetry-instrumentation-alephalpha (>=0.40.5) ; extra == "alephalpha"
50
- Requires-Dist: opentelemetry-instrumentation-alephalpha (>=0.40.5) ; extra == "all"
51
- Requires-Dist: opentelemetry-instrumentation-anthropic (>=0.40.5) ; extra == "all"
52
- Requires-Dist: opentelemetry-instrumentation-anthropic (>=0.40.5) ; extra == "anthropic"
53
- Requires-Dist: opentelemetry-instrumentation-bedrock (>=0.40.5) ; extra == "all"
54
- Requires-Dist: opentelemetry-instrumentation-bedrock (>=0.40.5) ; extra == "bedrock"
55
- Requires-Dist: opentelemetry-instrumentation-chromadb (>=0.40.5) ; extra == "all"
56
- Requires-Dist: opentelemetry-instrumentation-chromadb (>=0.40.5) ; extra == "chromadb"
57
- Requires-Dist: opentelemetry-instrumentation-cohere (>=0.40.5) ; extra == "all"
58
- Requires-Dist: opentelemetry-instrumentation-cohere (>=0.40.5) ; extra == "cohere"
59
- Requires-Dist: opentelemetry-instrumentation-crewai (>=0.40.5) ; extra == "all"
60
- Requires-Dist: opentelemetry-instrumentation-crewai (>=0.40.5) ; extra == "crewai"
61
- Requires-Dist: opentelemetry-instrumentation-google-generativeai (>=0.40.5) ; extra == "all"
62
- Requires-Dist: opentelemetry-instrumentation-google-generativeai (>=0.40.5) ; extra == "google-generativeai"
63
- Requires-Dist: opentelemetry-instrumentation-groq (>=0.40.5) ; extra == "all"
64
- Requires-Dist: opentelemetry-instrumentation-groq (>=0.40.5) ; extra == "groq"
65
- Requires-Dist: opentelemetry-instrumentation-haystack (>=0.40.5) ; extra == "all"
66
- Requires-Dist: opentelemetry-instrumentation-haystack (>=0.40.5) ; extra == "haystack"
67
- Requires-Dist: opentelemetry-instrumentation-lancedb (>=0.40.5) ; extra == "all"
68
- Requires-Dist: opentelemetry-instrumentation-lancedb (>=0.40.5) ; extra == "lancedb"
69
- Requires-Dist: opentelemetry-instrumentation-langchain (>=0.40.5) ; extra == "all"
70
- Requires-Dist: opentelemetry-instrumentation-langchain (>=0.40.5) ; extra == "langchain"
71
- Requires-Dist: opentelemetry-instrumentation-llamaindex (>=0.40.5) ; extra == "all"
72
- Requires-Dist: opentelemetry-instrumentation-llamaindex (>=0.40.5) ; extra == "llamaindex"
73
- Requires-Dist: opentelemetry-instrumentation-marqo (>=0.40.5) ; extra == "all"
74
- Requires-Dist: opentelemetry-instrumentation-marqo (>=0.40.5) ; extra == "marqo"
75
- Requires-Dist: opentelemetry-instrumentation-mcp (>=0.40.5) ; extra == "all"
76
- Requires-Dist: opentelemetry-instrumentation-mcp (>=0.40.5) ; extra == "mcp"
77
- Requires-Dist: opentelemetry-instrumentation-milvus (>=0.40.5) ; extra == "all"
78
- Requires-Dist: opentelemetry-instrumentation-milvus (>=0.40.5) ; extra == "milvus"
79
- Requires-Dist: opentelemetry-instrumentation-mistralai (>=0.40.5) ; extra == "all"
80
- Requires-Dist: opentelemetry-instrumentation-mistralai (>=0.40.5) ; extra == "mistralai"
81
- Requires-Dist: opentelemetry-instrumentation-ollama (>=0.40.5) ; extra == "all"
82
- Requires-Dist: opentelemetry-instrumentation-ollama (>=0.40.5) ; extra == "ollama"
83
- Requires-Dist: opentelemetry-instrumentation-openai (>=0.40.5) ; extra == "all"
84
- Requires-Dist: opentelemetry-instrumentation-openai (>=0.40.5) ; extra == "openai"
85
- Requires-Dist: opentelemetry-instrumentation-pinecone (>=0.40.5) ; extra == "all"
86
- Requires-Dist: opentelemetry-instrumentation-pinecone (>=0.40.5) ; extra == "pinecone"
87
- Requires-Dist: opentelemetry-instrumentation-qdrant (>=0.40.5) ; extra == "all"
88
- Requires-Dist: opentelemetry-instrumentation-qdrant (>=0.40.5) ; extra == "qdrant"
89
- Requires-Dist: opentelemetry-instrumentation-replicate (>=0.40.5) ; extra == "all"
90
- Requires-Dist: opentelemetry-instrumentation-replicate (>=0.40.5) ; extra == "replicate"
91
- Requires-Dist: opentelemetry-instrumentation-sagemaker (>=0.40.5) ; extra == "all"
92
- Requires-Dist: opentelemetry-instrumentation-sagemaker (>=0.40.5) ; extra == "sagemaker"
49
+ Requires-Dist: opentelemetry-instrumentation-alephalpha (>=0.40.8) ; extra == "alephalpha"
50
+ Requires-Dist: opentelemetry-instrumentation-alephalpha (>=0.40.8) ; extra == "all"
51
+ Requires-Dist: opentelemetry-instrumentation-anthropic (>=0.40.8) ; extra == "all"
52
+ Requires-Dist: opentelemetry-instrumentation-anthropic (>=0.40.8) ; extra == "anthropic"
53
+ Requires-Dist: opentelemetry-instrumentation-bedrock (>=0.40.8) ; extra == "all"
54
+ Requires-Dist: opentelemetry-instrumentation-bedrock (>=0.40.8) ; extra == "bedrock"
55
+ Requires-Dist: opentelemetry-instrumentation-chromadb (>=0.40.8) ; extra == "all"
56
+ Requires-Dist: opentelemetry-instrumentation-chromadb (>=0.40.8) ; extra == "chromadb"
57
+ Requires-Dist: opentelemetry-instrumentation-cohere (>=0.40.8) ; extra == "all"
58
+ Requires-Dist: opentelemetry-instrumentation-cohere (>=0.40.8) ; extra == "cohere"
59
+ Requires-Dist: opentelemetry-instrumentation-crewai (>=0.40.8) ; extra == "all"
60
+ Requires-Dist: opentelemetry-instrumentation-crewai (>=0.40.8) ; extra == "crewai"
61
+ Requires-Dist: opentelemetry-instrumentation-google-generativeai (>=0.40.8) ; extra == "all"
62
+ Requires-Dist: opentelemetry-instrumentation-google-generativeai (>=0.40.8) ; extra == "google-generativeai"
63
+ Requires-Dist: opentelemetry-instrumentation-groq (>=0.40.8) ; extra == "all"
64
+ Requires-Dist: opentelemetry-instrumentation-groq (>=0.40.8) ; extra == "groq"
65
+ Requires-Dist: opentelemetry-instrumentation-haystack (>=0.40.8) ; extra == "all"
66
+ Requires-Dist: opentelemetry-instrumentation-haystack (>=0.40.8) ; extra == "haystack"
67
+ Requires-Dist: opentelemetry-instrumentation-lancedb (>=0.40.8) ; extra == "all"
68
+ Requires-Dist: opentelemetry-instrumentation-lancedb (>=0.40.8) ; extra == "lancedb"
69
+ Requires-Dist: opentelemetry-instrumentation-langchain (>=0.40.8) ; extra == "all"
70
+ Requires-Dist: opentelemetry-instrumentation-langchain (>=0.40.8) ; extra == "langchain"
71
+ Requires-Dist: opentelemetry-instrumentation-llamaindex (>=0.40.8) ; extra == "all"
72
+ Requires-Dist: opentelemetry-instrumentation-llamaindex (>=0.40.8) ; extra == "llamaindex"
73
+ Requires-Dist: opentelemetry-instrumentation-marqo (>=0.40.8) ; extra == "all"
74
+ Requires-Dist: opentelemetry-instrumentation-marqo (>=0.40.8) ; extra == "marqo"
75
+ Requires-Dist: opentelemetry-instrumentation-mcp (>=0.40.8) ; extra == "all"
76
+ Requires-Dist: opentelemetry-instrumentation-mcp (>=0.40.8) ; extra == "mcp"
77
+ Requires-Dist: opentelemetry-instrumentation-milvus (>=0.40.8) ; extra == "all"
78
+ Requires-Dist: opentelemetry-instrumentation-milvus (>=0.40.8) ; extra == "milvus"
79
+ Requires-Dist: opentelemetry-instrumentation-mistralai (>=0.40.8) ; extra == "all"
80
+ Requires-Dist: opentelemetry-instrumentation-mistralai (>=0.40.8) ; extra == "mistralai"
81
+ Requires-Dist: opentelemetry-instrumentation-ollama (>=0.40.8) ; extra == "all"
82
+ Requires-Dist: opentelemetry-instrumentation-ollama (>=0.40.8) ; extra == "ollama"
83
+ Requires-Dist: opentelemetry-instrumentation-openai (>=0.40.8) ; extra == "all"
84
+ Requires-Dist: opentelemetry-instrumentation-openai (>=0.40.8) ; extra == "openai"
85
+ Requires-Dist: opentelemetry-instrumentation-pinecone (>=0.40.8) ; extra == "all"
86
+ Requires-Dist: opentelemetry-instrumentation-pinecone (>=0.40.8) ; extra == "pinecone"
87
+ Requires-Dist: opentelemetry-instrumentation-qdrant (>=0.40.8) ; extra == "all"
88
+ Requires-Dist: opentelemetry-instrumentation-qdrant (>=0.40.8) ; extra == "qdrant"
89
+ Requires-Dist: opentelemetry-instrumentation-replicate (>=0.40.8) ; extra == "all"
90
+ Requires-Dist: opentelemetry-instrumentation-replicate (>=0.40.8) ; extra == "replicate"
91
+ Requires-Dist: opentelemetry-instrumentation-sagemaker (>=0.40.8) ; extra == "all"
92
+ Requires-Dist: opentelemetry-instrumentation-sagemaker (>=0.40.8) ; extra == "sagemaker"
93
93
  Requires-Dist: opentelemetry-instrumentation-threading (>=0.54b0)
94
- Requires-Dist: opentelemetry-instrumentation-together (>=0.40.5) ; extra == "all"
95
- Requires-Dist: opentelemetry-instrumentation-together (>=0.40.5) ; extra == "together"
96
- Requires-Dist: opentelemetry-instrumentation-transformers (>=0.40.5) ; extra == "all"
97
- Requires-Dist: opentelemetry-instrumentation-transformers (>=0.40.5) ; extra == "transformers"
98
- Requires-Dist: opentelemetry-instrumentation-vertexai (>=0.40.5) ; extra == "all"
99
- Requires-Dist: opentelemetry-instrumentation-vertexai (>=0.40.5) ; extra == "vertexai"
100
- Requires-Dist: opentelemetry-instrumentation-watsonx (>=0.40.5) ; extra == "all"
101
- Requires-Dist: opentelemetry-instrumentation-watsonx (>=0.40.5) ; extra == "watsonx"
102
- Requires-Dist: opentelemetry-instrumentation-weaviate (>=0.40.5) ; extra == "all"
103
- Requires-Dist: opentelemetry-instrumentation-weaviate (>=0.40.5) ; extra == "weaviate"
94
+ Requires-Dist: opentelemetry-instrumentation-together (>=0.40.8) ; extra == "all"
95
+ Requires-Dist: opentelemetry-instrumentation-together (>=0.40.8) ; extra == "together"
96
+ Requires-Dist: opentelemetry-instrumentation-transformers (>=0.40.8) ; extra == "all"
97
+ Requires-Dist: opentelemetry-instrumentation-transformers (>=0.40.8) ; extra == "transformers"
98
+ Requires-Dist: opentelemetry-instrumentation-vertexai (>=0.40.8) ; extra == "all"
99
+ Requires-Dist: opentelemetry-instrumentation-vertexai (>=0.40.8) ; extra == "vertexai"
100
+ Requires-Dist: opentelemetry-instrumentation-watsonx (>=0.40.8) ; extra == "all"
101
+ Requires-Dist: opentelemetry-instrumentation-watsonx (>=0.40.8) ; extra == "watsonx"
102
+ Requires-Dist: opentelemetry-instrumentation-weaviate (>=0.40.8) ; extra == "all"
103
+ Requires-Dist: opentelemetry-instrumentation-weaviate (>=0.40.8) ; extra == "weaviate"
104
104
  Requires-Dist: opentelemetry-sdk (>=1.33.0)
105
105
  Requires-Dist: opentelemetry-semantic-conventions (>=0.54b0)
106
106
  Requires-Dist: opentelemetry-semantic-conventions-ai (>=0.4.8)