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.
- lmnr/cli.py +66 -27
- lmnr/opentelemetry_lib/__init__.py +2 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/google_genai/__init__.py +90 -15
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/google_genai/utils.py +81 -58
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/langgraph/__init__.py +121 -0
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/langgraph/utils.py +60 -0
- lmnr/opentelemetry_lib/tracing/__init__.py +85 -80
- lmnr/opentelemetry_lib/tracing/_instrument_initializers.py +12 -0
- lmnr/opentelemetry_lib/tracing/context_properties.py +8 -1
- lmnr/opentelemetry_lib/tracing/instruments.py +2 -0
- lmnr/opentelemetry_lib/tracing/processor.py +1 -1
- lmnr/sdk/client/asynchronous/resources/evals.py +4 -0
- lmnr/sdk/client/synchronous/resources/evals.py +4 -0
- lmnr/sdk/evaluations.py +13 -17
- lmnr/sdk/laminar.py +7 -0
- lmnr/sdk/types.py +2 -2
- lmnr/version.py +1 -1
- {lmnr-0.6.8.dist-info → lmnr-0.6.10.dist-info}/METADATA +55 -55
- {lmnr-0.6.8.dist-info → lmnr-0.6.10.dist-info}/RECORD +22 -20
- {lmnr-0.6.8.dist-info → lmnr-0.6.10.dist-info}/LICENSE +0 -0
- {lmnr-0.6.8.dist-info → lmnr-0.6.10.dist-info}/WHEEL +0 -0
- {lmnr-0.6.8.dist-info → lmnr-0.6.10.dist-info}/entry_points.txt +0 -0
@@ -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
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
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.
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
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.
|
119
|
-
self.
|
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.
|
122
|
+
self._logger = logging.getLogger(__name__)
|
124
123
|
console_log_handler = logging.StreamHandler()
|
125
124
|
console_log_handler.setFormatter(VerboseColorfulFormatter())
|
126
|
-
self.
|
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
|
-
|
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.
|
144
|
-
cls.instance.
|
145
|
+
if isinstance(cls.instance._span_processor, LaminarSpanProcessor):
|
146
|
+
cls.instance._span_processor.clear()
|
145
147
|
|
146
148
|
def shutdown(self):
|
147
|
-
if self.
|
149
|
+
if self._tracer_provider is None:
|
148
150
|
return
|
149
|
-
self.
|
151
|
+
self._tracer_provider.shutdown()
|
150
152
|
|
151
153
|
def flush(self):
|
152
|
-
|
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.
|
160
|
+
if self._tracer_provider is None:
|
156
161
|
return trace.get_tracer_provider().get_tracer(TRACER_NAME)
|
157
|
-
return self.
|
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
|
205
|
-
"
|
206
|
-
"
|
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
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
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[
|
231
|
+
async def run(self) -> Awaitable[dict[str, int | float]]:
|
237
232
|
return await self._run()
|
238
233
|
|
239
|
-
async def _run(self) ->
|
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
|
-
|
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
|
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
|
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
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.3
|
2
2
|
Name: lmnr
|
3
|
-
Version: 0.6.
|
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.
|
50
|
-
Requires-Dist: opentelemetry-instrumentation-alephalpha (>=0.40.
|
51
|
-
Requires-Dist: opentelemetry-instrumentation-anthropic (>=0.40.
|
52
|
-
Requires-Dist: opentelemetry-instrumentation-anthropic (>=0.40.
|
53
|
-
Requires-Dist: opentelemetry-instrumentation-bedrock (>=0.40.
|
54
|
-
Requires-Dist: opentelemetry-instrumentation-bedrock (>=0.40.
|
55
|
-
Requires-Dist: opentelemetry-instrumentation-chromadb (>=0.40.
|
56
|
-
Requires-Dist: opentelemetry-instrumentation-chromadb (>=0.40.
|
57
|
-
Requires-Dist: opentelemetry-instrumentation-cohere (>=0.40.
|
58
|
-
Requires-Dist: opentelemetry-instrumentation-cohere (>=0.40.
|
59
|
-
Requires-Dist: opentelemetry-instrumentation-crewai (>=0.40.
|
60
|
-
Requires-Dist: opentelemetry-instrumentation-crewai (>=0.40.
|
61
|
-
Requires-Dist: opentelemetry-instrumentation-google-generativeai (>=0.40.
|
62
|
-
Requires-Dist: opentelemetry-instrumentation-google-generativeai (>=0.40.
|
63
|
-
Requires-Dist: opentelemetry-instrumentation-groq (>=0.40.
|
64
|
-
Requires-Dist: opentelemetry-instrumentation-groq (>=0.40.
|
65
|
-
Requires-Dist: opentelemetry-instrumentation-haystack (>=0.40.
|
66
|
-
Requires-Dist: opentelemetry-instrumentation-haystack (>=0.40.
|
67
|
-
Requires-Dist: opentelemetry-instrumentation-lancedb (>=0.40.
|
68
|
-
Requires-Dist: opentelemetry-instrumentation-lancedb (>=0.40.
|
69
|
-
Requires-Dist: opentelemetry-instrumentation-langchain (>=0.40.
|
70
|
-
Requires-Dist: opentelemetry-instrumentation-langchain (>=0.40.
|
71
|
-
Requires-Dist: opentelemetry-instrumentation-llamaindex (>=0.40.
|
72
|
-
Requires-Dist: opentelemetry-instrumentation-llamaindex (>=0.40.
|
73
|
-
Requires-Dist: opentelemetry-instrumentation-marqo (>=0.40.
|
74
|
-
Requires-Dist: opentelemetry-instrumentation-marqo (>=0.40.
|
75
|
-
Requires-Dist: opentelemetry-instrumentation-mcp (>=0.40.
|
76
|
-
Requires-Dist: opentelemetry-instrumentation-mcp (>=0.40.
|
77
|
-
Requires-Dist: opentelemetry-instrumentation-milvus (>=0.40.
|
78
|
-
Requires-Dist: opentelemetry-instrumentation-milvus (>=0.40.
|
79
|
-
Requires-Dist: opentelemetry-instrumentation-mistralai (>=0.40.
|
80
|
-
Requires-Dist: opentelemetry-instrumentation-mistralai (>=0.40.
|
81
|
-
Requires-Dist: opentelemetry-instrumentation-ollama (>=0.40.
|
82
|
-
Requires-Dist: opentelemetry-instrumentation-ollama (>=0.40.
|
83
|
-
Requires-Dist: opentelemetry-instrumentation-openai (>=0.40.
|
84
|
-
Requires-Dist: opentelemetry-instrumentation-openai (>=0.40.
|
85
|
-
Requires-Dist: opentelemetry-instrumentation-pinecone (>=0.40.
|
86
|
-
Requires-Dist: opentelemetry-instrumentation-pinecone (>=0.40.
|
87
|
-
Requires-Dist: opentelemetry-instrumentation-qdrant (>=0.40.
|
88
|
-
Requires-Dist: opentelemetry-instrumentation-qdrant (>=0.40.
|
89
|
-
Requires-Dist: opentelemetry-instrumentation-replicate (>=0.40.
|
90
|
-
Requires-Dist: opentelemetry-instrumentation-replicate (>=0.40.
|
91
|
-
Requires-Dist: opentelemetry-instrumentation-sagemaker (>=0.40.
|
92
|
-
Requires-Dist: opentelemetry-instrumentation-sagemaker (>=0.40.
|
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.
|
95
|
-
Requires-Dist: opentelemetry-instrumentation-together (>=0.40.
|
96
|
-
Requires-Dist: opentelemetry-instrumentation-transformers (>=0.40.
|
97
|
-
Requires-Dist: opentelemetry-instrumentation-transformers (>=0.40.
|
98
|
-
Requires-Dist: opentelemetry-instrumentation-vertexai (>=0.40.
|
99
|
-
Requires-Dist: opentelemetry-instrumentation-vertexai (>=0.40.
|
100
|
-
Requires-Dist: opentelemetry-instrumentation-watsonx (>=0.40.
|
101
|
-
Requires-Dist: opentelemetry-instrumentation-watsonx (>=0.40.
|
102
|
-
Requires-Dist: opentelemetry-instrumentation-weaviate (>=0.40.
|
103
|
-
Requires-Dist: opentelemetry-instrumentation-weaviate (>=0.40.
|
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)
|