langtrace-python-sdk 3.7.0__py3-none-any.whl → 3.8.1__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.
- examples/cleanlab_example/simple.py +18 -0
- langtrace_python_sdk/constants/instrumentation/common.py +3 -1
- langtrace_python_sdk/instrumentation/__init__.py +6 -5
- langtrace_python_sdk/instrumentation/agno/__init__.py +5 -0
- langtrace_python_sdk/instrumentation/agno/instrumentation.py +80 -0
- langtrace_python_sdk/instrumentation/agno/patch.py +261 -0
- langtrace_python_sdk/instrumentation/cleanlab/__init__.py +5 -0
- langtrace_python_sdk/instrumentation/cleanlab/instrumentation.py +62 -0
- langtrace_python_sdk/instrumentation/cleanlab/patch.py +75 -0
- langtrace_python_sdk/instrumentation/graphlit/patch.py +4 -5
- langtrace_python_sdk/langtrace.py +15 -56
- langtrace_python_sdk/version.py +1 -1
- {langtrace_python_sdk-3.7.0.dist-info → langtrace_python_sdk-3.8.1.dist-info}/METADATA +1 -1
- {langtrace_python_sdk-3.7.0.dist-info → langtrace_python_sdk-3.8.1.dist-info}/RECORD +17 -10
- {langtrace_python_sdk-3.7.0.dist-info → langtrace_python_sdk-3.8.1.dist-info}/WHEEL +0 -0
- {langtrace_python_sdk-3.7.0.dist-info → langtrace_python_sdk-3.8.1.dist-info}/entry_points.txt +0 -0
- {langtrace_python_sdk-3.7.0.dist-info → langtrace_python_sdk-3.8.1.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,18 @@
|
|
1
|
+
import os
|
2
|
+
|
3
|
+
from cleanlab_tlm import TLM
|
4
|
+
from dotenv import find_dotenv, load_dotenv
|
5
|
+
|
6
|
+
from langtrace_python_sdk import langtrace
|
7
|
+
|
8
|
+
_ = load_dotenv(find_dotenv())
|
9
|
+
|
10
|
+
langtrace.init()
|
11
|
+
|
12
|
+
api_key = os.getenv("CLEANLAB_API_KEY")
|
13
|
+
tlm = TLM(api_key=api_key, options={"log": ["explanation"], "model": "gpt-4o-mini"}) # GPT, Claude, etc
|
14
|
+
out = tlm.prompt("What's the third month of the year alphabetically?")
|
15
|
+
trustworthiness_score = tlm.get_trustworthiness_score("What's the first month of the year?", response="January")
|
16
|
+
|
17
|
+
print(out)
|
18
|
+
print(trustworthiness_score)
|
@@ -13,6 +13,8 @@ SERVICE_PROVIDERS = {
|
|
13
13
|
"ARCH": "Arch",
|
14
14
|
"AZURE": "Azure",
|
15
15
|
"CHROMA": "Chroma",
|
16
|
+
"CLEANLAB": "CleanLab",
|
17
|
+
"COHERE": "Cohere",
|
16
18
|
"CREWAI": "CrewAI",
|
17
19
|
"DEEPSEEK": "DeepSeek",
|
18
20
|
"DSPY": "DSPy",
|
@@ -25,7 +27,6 @@ SERVICE_PROVIDERS = {
|
|
25
27
|
"LLAMAINDEX": "LlamaIndex",
|
26
28
|
"OPENAI": "OpenAI",
|
27
29
|
"PINECONE": "Pinecone",
|
28
|
-
"COHERE": "Cohere",
|
29
30
|
"PPLX": "Perplexity",
|
30
31
|
"QDRANT": "Qdrant",
|
31
32
|
"WEAVIATE": "Weaviate",
|
@@ -42,6 +43,7 @@ SERVICE_PROVIDERS = {
|
|
42
43
|
"MILVUS": "Milvus",
|
43
44
|
"GRAPHLIT": "Graphlit",
|
44
45
|
"PHIDATA": "Phidata",
|
46
|
+
"AGNO": "Agno",
|
45
47
|
}
|
46
48
|
|
47
49
|
LANGTRACE_ADDITIONAL_SPAN_ATTRIBUTES_KEY = "langtrace_additional_attributes"
|
@@ -1,8 +1,10 @@
|
|
1
|
+
from .agno import AgnoInstrumentation
|
1
2
|
from .anthropic import AnthropicInstrumentation
|
2
3
|
from .autogen import AutogenInstrumentation
|
3
4
|
from .aws_bedrock import AWSBedrockInstrumentation
|
4
5
|
from .cerebras import CerebrasInstrumentation
|
5
6
|
from .chroma import ChromaInstrumentation
|
7
|
+
from .cleanlab import CleanLabInstrumentation
|
6
8
|
from .cohere import CohereInstrumentation
|
7
9
|
from .crewai import CrewAIInstrumentation
|
8
10
|
from .crewai_tools import CrewaiToolsInstrumentation
|
@@ -10,6 +12,7 @@ from .dspy import DspyInstrumentation
|
|
10
12
|
from .embedchain import EmbedchainInstrumentation
|
11
13
|
from .gemini import GeminiInstrumentation
|
12
14
|
from .google_genai import GoogleGenaiInstrumentation
|
15
|
+
from .graphlit import GraphlitInstrumentation
|
13
16
|
from .groq import GroqInstrumentation
|
14
17
|
from .langchain import LangchainInstrumentation
|
15
18
|
from .langchain_community import LangchainCommunityInstrumentation
|
@@ -21,16 +24,12 @@ from .milvus import MilvusInstrumentation
|
|
21
24
|
from .mistral import MistralInstrumentation
|
22
25
|
from .ollama import OllamaInstrumentor
|
23
26
|
from .openai import OpenAIInstrumentation
|
27
|
+
from .phidata import PhiDataInstrumentation
|
24
28
|
from .pinecone import PineconeInstrumentation
|
25
29
|
from .pymongo import PyMongoInstrumentation
|
26
30
|
from .qdrant import QdrantInstrumentation
|
27
31
|
from .vertexai import VertexAIInstrumentation
|
28
32
|
from .weaviate import WeaviateInstrumentation
|
29
|
-
from .cerebras import CerebrasInstrumentation
|
30
|
-
from .milvus import MilvusInstrumentation
|
31
|
-
from .google_genai import GoogleGenaiInstrumentation
|
32
|
-
from .graphlit import GraphlitInstrumentation
|
33
|
-
from .phidata import PhiDataInstrumentation
|
34
33
|
|
35
34
|
__all__ = [
|
36
35
|
"AnthropicInstrumentation",
|
@@ -63,4 +62,6 @@ __all__ = [
|
|
63
62
|
"CrewaiToolsInstrumentation",
|
64
63
|
"GraphlitInstrumentation",
|
65
64
|
"PhiDataInstrumentation",
|
65
|
+
"AgnoInstrumentation",
|
66
|
+
"CleanLabInstrumentation",
|
66
67
|
]
|
@@ -0,0 +1,80 @@
|
|
1
|
+
"""
|
2
|
+
Copyright (c) 2024 Scale3 Labs
|
3
|
+
|
4
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
you may not use this file except in compliance with the License.
|
6
|
+
You may obtain a copy of the License at
|
7
|
+
|
8
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
|
10
|
+
Unless required by applicable law or agreed to in writing, software
|
11
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
See the License for the specific language governing permissions and
|
14
|
+
limitations under the License.
|
15
|
+
"""
|
16
|
+
|
17
|
+
from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
|
18
|
+
from opentelemetry.trace import get_tracer
|
19
|
+
from wrapt import wrap_function_wrapper as _W
|
20
|
+
from typing import Collection
|
21
|
+
from importlib_metadata import version as v
|
22
|
+
from .patch import patch_agent, patch_memory
|
23
|
+
|
24
|
+
class AgnoInstrumentation(BaseInstrumentor):
|
25
|
+
def instrumentation_dependencies(self) -> Collection[str]:
|
26
|
+
return ["agno >= 1.1.4"]
|
27
|
+
|
28
|
+
def _instrument(self, **kwargs):
|
29
|
+
tracer_provider = kwargs.get("tracer_provider")
|
30
|
+
tracer = get_tracer(__name__, "", tracer_provider)
|
31
|
+
version = v("agno")
|
32
|
+
|
33
|
+
try:
|
34
|
+
_W(
|
35
|
+
"agno.agent.agent",
|
36
|
+
"Agent.run",
|
37
|
+
patch_agent("Agent.run", version, tracer),
|
38
|
+
)
|
39
|
+
_W(
|
40
|
+
"agno.agent.agent",
|
41
|
+
"Agent.arun",
|
42
|
+
patch_agent("Agent.arun", version, tracer),
|
43
|
+
)
|
44
|
+
_W(
|
45
|
+
"agno.agent.agent",
|
46
|
+
"Agent._run",
|
47
|
+
patch_agent("Agent._run", version, tracer),
|
48
|
+
)
|
49
|
+
_W(
|
50
|
+
"agno.agent.agent",
|
51
|
+
"Agent._arun",
|
52
|
+
patch_agent("Agent._arun", version, tracer),
|
53
|
+
)
|
54
|
+
|
55
|
+
_W(
|
56
|
+
"agno.memory.agent",
|
57
|
+
"AgentMemory.update_memory",
|
58
|
+
patch_memory("AgentMemory.update_memory", version, tracer),
|
59
|
+
)
|
60
|
+
_W(
|
61
|
+
"agno.memory.agent",
|
62
|
+
"AgentMemory.aupdate_memory",
|
63
|
+
patch_memory("AgentMemory.aupdate_memory", version, tracer),
|
64
|
+
)
|
65
|
+
_W(
|
66
|
+
"agno.memory.agent",
|
67
|
+
"AgentMemory.update_summary",
|
68
|
+
patch_memory("AgentMemory.update_summary", version, tracer),
|
69
|
+
)
|
70
|
+
_W(
|
71
|
+
"agno.memory.agent",
|
72
|
+
"AgentMemory.aupdate_summary",
|
73
|
+
patch_memory("AgentMemory.aupdate_summary", version, tracer),
|
74
|
+
)
|
75
|
+
|
76
|
+
except Exception:
|
77
|
+
pass
|
78
|
+
|
79
|
+
def _uninstrument(self, **kwargs):
|
80
|
+
pass
|
@@ -0,0 +1,261 @@
|
|
1
|
+
import json
|
2
|
+
from importlib_metadata import version as v
|
3
|
+
from langtrace.trace_attributes import FrameworkSpanAttributes
|
4
|
+
from opentelemetry import baggage
|
5
|
+
from opentelemetry.trace import Span, SpanKind, Tracer
|
6
|
+
from opentelemetry.trace.status import Status, StatusCode
|
7
|
+
from typing import Dict, Any, Optional
|
8
|
+
|
9
|
+
from langtrace_python_sdk.constants import LANGTRACE_SDK_NAME
|
10
|
+
from langtrace_python_sdk.constants.instrumentation.common import (
|
11
|
+
LANGTRACE_ADDITIONAL_SPAN_ATTRIBUTES_KEY,
|
12
|
+
SERVICE_PROVIDERS,
|
13
|
+
)
|
14
|
+
from langtrace_python_sdk.utils import set_span_attribute
|
15
|
+
from langtrace_python_sdk.utils.llm import get_span_name, set_span_attributes
|
16
|
+
from langtrace_python_sdk.utils.misc import serialize_args, serialize_kwargs
|
17
|
+
|
18
|
+
def _extract_metrics(metrics: Dict[str, Any]) -> Dict[str, Any]:
|
19
|
+
"""Helper function to extract and format metrics"""
|
20
|
+
formatted_metrics = {}
|
21
|
+
|
22
|
+
# Extract basic metrics
|
23
|
+
for key in ['time', 'time_to_first_token', 'input_tokens', 'output_tokens',
|
24
|
+
'prompt_tokens', 'completion_tokens', 'total_tokens']:
|
25
|
+
if key in metrics:
|
26
|
+
formatted_metrics[key] = metrics[key]
|
27
|
+
|
28
|
+
# Extract nested metric details if present
|
29
|
+
if 'prompt_tokens_details' in metrics:
|
30
|
+
formatted_metrics['prompt_tokens_details'] = metrics['prompt_tokens_details']
|
31
|
+
if 'completion_tokens_details' in metrics:
|
32
|
+
formatted_metrics['completion_tokens_details'] = metrics['completion_tokens_details']
|
33
|
+
if 'tool_call_times' in metrics:
|
34
|
+
formatted_metrics['tool_call_times'] = metrics['tool_call_times']
|
35
|
+
|
36
|
+
return formatted_metrics
|
37
|
+
|
38
|
+
def patch_memory(operation_name, version, tracer: Tracer):
|
39
|
+
def traced_method(wrapped, instance, args, kwargs):
|
40
|
+
service_provider = SERVICE_PROVIDERS["AGNO"]
|
41
|
+
extra_attributes = baggage.get_baggage(LANGTRACE_ADDITIONAL_SPAN_ATTRIBUTES_KEY)
|
42
|
+
span_attributes = {
|
43
|
+
"langtrace.sdk.name": "langtrace-python-sdk",
|
44
|
+
"langtrace.service.name": service_provider,
|
45
|
+
"langtrace.service.type": "framework",
|
46
|
+
"langtrace.service.version": version,
|
47
|
+
"langtrace.version": v(LANGTRACE_SDK_NAME),
|
48
|
+
**(extra_attributes if extra_attributes is not None else {}),
|
49
|
+
}
|
50
|
+
|
51
|
+
span_attributes.update({
|
52
|
+
"agno.memory.type": type(instance).__name__,
|
53
|
+
"agno.memory.create_session_summary": str(instance.create_session_summary),
|
54
|
+
"agno.memory.create_user_memories": str(instance.create_user_memories),
|
55
|
+
"agno.memory.retrieval": str(instance.retrieval)
|
56
|
+
})
|
57
|
+
|
58
|
+
inputs = {}
|
59
|
+
if len(args) > 0:
|
60
|
+
inputs["args"] = serialize_args(*args)
|
61
|
+
if len(kwargs) > 0:
|
62
|
+
inputs["kwargs"] = serialize_kwargs(**kwargs)
|
63
|
+
span_attributes["agno.memory.inputs"] = json.dumps(inputs)
|
64
|
+
|
65
|
+
attributes = FrameworkSpanAttributes(**span_attributes)
|
66
|
+
|
67
|
+
with tracer.start_as_current_span(
|
68
|
+
get_span_name(operation_name), kind=SpanKind.CLIENT
|
69
|
+
) as span:
|
70
|
+
try:
|
71
|
+
set_span_attributes(span, attributes)
|
72
|
+
result = wrapped(*args, **kwargs)
|
73
|
+
|
74
|
+
if result is not None:
|
75
|
+
set_span_attribute(span, "agno.memory.output", str(result))
|
76
|
+
|
77
|
+
if instance.summary is not None:
|
78
|
+
set_span_attribute(span, "agno.memory.summary", str(instance.summary))
|
79
|
+
if instance.memories is not None:
|
80
|
+
set_span_attribute(span, "agno.memory.memories_count", str(len(instance.memories)))
|
81
|
+
|
82
|
+
span.set_status(Status(StatusCode.OK))
|
83
|
+
return result
|
84
|
+
|
85
|
+
except Exception as err:
|
86
|
+
span.record_exception(err)
|
87
|
+
span.set_status(Status(StatusCode.ERROR, str(err)))
|
88
|
+
raise
|
89
|
+
|
90
|
+
return traced_method
|
91
|
+
|
92
|
+
def patch_agent(operation_name, version, tracer: Tracer):
|
93
|
+
def traced_method(wrapped, instance, args, kwargs):
|
94
|
+
service_provider = SERVICE_PROVIDERS["AGNO"]
|
95
|
+
extra_attributes = baggage.get_baggage(LANGTRACE_ADDITIONAL_SPAN_ATTRIBUTES_KEY)
|
96
|
+
span_attributes = {
|
97
|
+
"langtrace.sdk.name": "langtrace-python-sdk",
|
98
|
+
"langtrace.service.name": service_provider,
|
99
|
+
"langtrace.service.type": "framework",
|
100
|
+
"langtrace.service.version": version,
|
101
|
+
"langtrace.version": v(LANGTRACE_SDK_NAME),
|
102
|
+
**(extra_attributes if extra_attributes is not None else {}),
|
103
|
+
}
|
104
|
+
|
105
|
+
attributes = FrameworkSpanAttributes(**span_attributes)
|
106
|
+
|
107
|
+
with tracer.start_as_current_span(
|
108
|
+
get_span_name(operation_name), kind=SpanKind.CLIENT
|
109
|
+
) as span:
|
110
|
+
try:
|
111
|
+
set_span_attributes(span, attributes)
|
112
|
+
AgnoSpanAttributes(span=span, instance=instance)
|
113
|
+
result_generator = wrapped(*args, **kwargs)
|
114
|
+
|
115
|
+
accumulated_content = ""
|
116
|
+
current_tool_call = None
|
117
|
+
response_metadata = None
|
118
|
+
seen_tool_calls = set()
|
119
|
+
|
120
|
+
try:
|
121
|
+
for response in result_generator:
|
122
|
+
if not hasattr(response, 'to_dict'):
|
123
|
+
yield response
|
124
|
+
continue
|
125
|
+
|
126
|
+
if not response_metadata:
|
127
|
+
response_metadata = {
|
128
|
+
"run_id": response.run_id,
|
129
|
+
"agent_id": response.agent_id,
|
130
|
+
"session_id": response.session_id,
|
131
|
+
"model": response.model,
|
132
|
+
"content_type": response.content_type,
|
133
|
+
}
|
134
|
+
for key, value in response_metadata.items():
|
135
|
+
if value is not None:
|
136
|
+
set_span_attribute(span, f"agno.agent.{key}", str(value))
|
137
|
+
|
138
|
+
if response.content:
|
139
|
+
accumulated_content += response.content
|
140
|
+
set_span_attribute(span, "agno.agent.response", accumulated_content)
|
141
|
+
|
142
|
+
if response.messages:
|
143
|
+
for msg in response.messages:
|
144
|
+
if msg.tool_calls:
|
145
|
+
for tool_call in msg.tool_calls:
|
146
|
+
tool_id = tool_call.get('id')
|
147
|
+
if tool_id and tool_id not in seen_tool_calls:
|
148
|
+
seen_tool_calls.add(tool_id)
|
149
|
+
tool_info = {
|
150
|
+
'id': tool_id,
|
151
|
+
'name': tool_call.get('function', {}).get('name'),
|
152
|
+
'arguments': tool_call.get('function', {}).get('arguments'),
|
153
|
+
'start_time': msg.created_at,
|
154
|
+
}
|
155
|
+
current_tool_call = tool_info
|
156
|
+
set_span_attribute(span, f"agno.agent.tool_call.{tool_id}", json.dumps(tool_info))
|
157
|
+
|
158
|
+
if msg.metrics:
|
159
|
+
metrics = _extract_metrics(msg.metrics)
|
160
|
+
role_prefix = f"agno.agent.metrics.{msg.role}"
|
161
|
+
for key, value in metrics.items():
|
162
|
+
set_span_attribute(span, f"{role_prefix}.{key}", str(value))
|
163
|
+
|
164
|
+
if response.tools:
|
165
|
+
for tool in response.tools:
|
166
|
+
tool_id = tool.get('tool_call_id')
|
167
|
+
if tool_id and current_tool_call and current_tool_call['id'] == tool_id:
|
168
|
+
tool_result = {
|
169
|
+
**current_tool_call,
|
170
|
+
'result': tool.get('content'),
|
171
|
+
'error': tool.get('tool_call_error'),
|
172
|
+
'end_time': tool.get('created_at'),
|
173
|
+
'metrics': tool.get('metrics'),
|
174
|
+
}
|
175
|
+
set_span_attribute(span, f"agno.agent.tool_call.{tool_id}", json.dumps(tool_result))
|
176
|
+
current_tool_call = None
|
177
|
+
|
178
|
+
yield response
|
179
|
+
|
180
|
+
except Exception as err:
|
181
|
+
span.record_exception(err)
|
182
|
+
span.set_status(Status(StatusCode.ERROR, str(err)))
|
183
|
+
raise
|
184
|
+
finally:
|
185
|
+
span.set_status(Status(StatusCode.OK))
|
186
|
+
if len(seen_tool_calls) > 0:
|
187
|
+
span.set_attribute("agno.agent.total_tool_calls", len(seen_tool_calls))
|
188
|
+
except Exception as err:
|
189
|
+
span.record_exception(err)
|
190
|
+
span.set_status(Status(StatusCode.ERROR, str(err)))
|
191
|
+
raise
|
192
|
+
|
193
|
+
return traced_method
|
194
|
+
|
195
|
+
class AgnoSpanAttributes:
|
196
|
+
span: Span
|
197
|
+
agent_data: dict
|
198
|
+
|
199
|
+
def __init__(self, span: Span, instance) -> None:
|
200
|
+
self.span = span
|
201
|
+
self.instance = instance
|
202
|
+
self.agent_data = {
|
203
|
+
"memory": {},
|
204
|
+
"model": {},
|
205
|
+
"tools": [],
|
206
|
+
}
|
207
|
+
|
208
|
+
self.run()
|
209
|
+
|
210
|
+
def run(self):
|
211
|
+
instance_attrs = {
|
212
|
+
"agent_id": self.instance.agent_id,
|
213
|
+
"session_id": self.instance.session_id,
|
214
|
+
"name": self.instance.name,
|
215
|
+
"markdown": self.instance.markdown,
|
216
|
+
"reasoning": self.instance.reasoning,
|
217
|
+
"add_references": self.instance.add_references,
|
218
|
+
"show_tool_calls": self.instance.show_tool_calls,
|
219
|
+
"stream": self.instance.stream,
|
220
|
+
"stream_intermediate_steps": self.instance.stream_intermediate_steps,
|
221
|
+
}
|
222
|
+
|
223
|
+
for key, value in instance_attrs.items():
|
224
|
+
if value is not None:
|
225
|
+
set_span_attribute(self.span, f"agno.agent.{key}", str(value))
|
226
|
+
|
227
|
+
if self.instance.model:
|
228
|
+
model_attrs = {
|
229
|
+
"id": self.instance.model.id,
|
230
|
+
"name": self.instance.model.name,
|
231
|
+
"provider": self.instance.model.provider,
|
232
|
+
"structured_outputs": self.instance.model.structured_outputs,
|
233
|
+
"supports_structured_outputs": self.instance.model.supports_structured_outputs,
|
234
|
+
}
|
235
|
+
for key, value in model_attrs.items():
|
236
|
+
if value is not None:
|
237
|
+
set_span_attribute(self.span, f"agno.agent.model.{key}", str(value))
|
238
|
+
|
239
|
+
if hasattr(self.instance.model, 'metrics') and self.instance.model.metrics:
|
240
|
+
metrics = _extract_metrics(self.instance.model.metrics)
|
241
|
+
set_span_attribute(self.span, "agno.agent.model.metrics", json.dumps(metrics))
|
242
|
+
|
243
|
+
if self.instance.tools:
|
244
|
+
tool_list = []
|
245
|
+
for tool in self.instance.tools:
|
246
|
+
if hasattr(tool, "name"):
|
247
|
+
tool_list.append(tool.name)
|
248
|
+
elif hasattr(tool, "__name__"):
|
249
|
+
tool_list.append(tool.__name__)
|
250
|
+
set_span_attribute(self.span, "agno.agent.tools", str(tool_list))
|
251
|
+
|
252
|
+
if self.instance.memory:
|
253
|
+
memory_attrs = {
|
254
|
+
"create_session_summary": self.instance.memory.create_session_summary,
|
255
|
+
"create_user_memories": self.instance.memory.create_user_memories,
|
256
|
+
"update_session_summary_after_run": self.instance.memory.update_session_summary_after_run,
|
257
|
+
"update_user_memories_after_run": self.instance.memory.update_user_memories_after_run,
|
258
|
+
}
|
259
|
+
for key, value in memory_attrs.items():
|
260
|
+
if value is not None:
|
261
|
+
set_span_attribute(self.span, f"agno.agent.memory.{key}", str(value))
|
@@ -0,0 +1,62 @@
|
|
1
|
+
"""
|
2
|
+
Copyright (c) 2025 Scale3 Labs
|
3
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
you may not use this file except in compliance with the License.
|
5
|
+
You may obtain a copy of the License at
|
6
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
7
|
+
Unless required by applicable law or agreed to in writing, software
|
8
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
9
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
10
|
+
See the License for the specific language governing permissions and
|
11
|
+
limitations under the License.
|
12
|
+
"""
|
13
|
+
|
14
|
+
import importlib.metadata
|
15
|
+
import logging
|
16
|
+
from typing import Any, Collection, Optional
|
17
|
+
|
18
|
+
from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
|
19
|
+
from opentelemetry.trace import TracerProvider, get_tracer
|
20
|
+
from wrapt import wrap_function_wrapper
|
21
|
+
|
22
|
+
from langtrace_python_sdk.instrumentation.cleanlab.patch import generic_patch
|
23
|
+
|
24
|
+
logging.basicConfig(level=logging.FATAL)
|
25
|
+
|
26
|
+
|
27
|
+
class CleanLabInstrumentation(BaseInstrumentor): # type: ignore
|
28
|
+
|
29
|
+
def instrumentation_dependencies(self) -> Collection[str]:
|
30
|
+
return ["cleanlab-tlm >= 1.0.7", "trace-attributes >= 4.0.5"]
|
31
|
+
|
32
|
+
def _instrument(self, **kwargs: Any) -> None:
|
33
|
+
tracer_provider: Optional[TracerProvider] = kwargs.get("tracer_provider")
|
34
|
+
tracer = get_tracer(__name__, "", tracer_provider)
|
35
|
+
version: str = importlib.metadata.version("cleanlab_tlm")
|
36
|
+
|
37
|
+
wrap_function_wrapper(
|
38
|
+
"cleanlab_tlm.tlm",
|
39
|
+
"TLM.prompt",
|
40
|
+
generic_patch(version, tracer),
|
41
|
+
)
|
42
|
+
|
43
|
+
wrap_function_wrapper(
|
44
|
+
"cleanlab_tlm.tlm",
|
45
|
+
"TLM.get_trustworthiness_score",
|
46
|
+
generic_patch(version, tracer),
|
47
|
+
)
|
48
|
+
|
49
|
+
wrap_function_wrapper(
|
50
|
+
"cleanlab_tlm.tlm",
|
51
|
+
"TLM.try_prompt",
|
52
|
+
generic_patch(version, tracer),
|
53
|
+
)
|
54
|
+
|
55
|
+
wrap_function_wrapper(
|
56
|
+
"cleanlab_tlm.tlm",
|
57
|
+
"TLM.try_get_trustworthiness_score",
|
58
|
+
generic_patch(version, tracer),
|
59
|
+
)
|
60
|
+
|
61
|
+
def _uninstrument(self, **kwargs: Any) -> None:
|
62
|
+
pass
|
@@ -0,0 +1,75 @@
|
|
1
|
+
import json
|
2
|
+
from typing import Any, Callable, List
|
3
|
+
|
4
|
+
from importlib_metadata import version as v
|
5
|
+
from langtrace.trace_attributes import FrameworkSpanAttributes
|
6
|
+
from opentelemetry import baggage
|
7
|
+
from opentelemetry.trace import SpanKind, Tracer
|
8
|
+
from opentelemetry.trace.status import Status, StatusCode
|
9
|
+
|
10
|
+
from langtrace_python_sdk.constants import LANGTRACE_SDK_NAME
|
11
|
+
from langtrace_python_sdk.constants.instrumentation.common import (
|
12
|
+
LANGTRACE_ADDITIONAL_SPAN_ATTRIBUTES_KEY, SERVICE_PROVIDERS)
|
13
|
+
from langtrace_python_sdk.instrumentation.openai.types import \
|
14
|
+
ChatCompletionsCreateKwargs
|
15
|
+
from langtrace_python_sdk.utils.llm import set_span_attributes
|
16
|
+
from langtrace_python_sdk.utils.misc import serialize_args, serialize_kwargs
|
17
|
+
|
18
|
+
|
19
|
+
def generic_patch(version: str, tracer: Tracer) -> Callable:
|
20
|
+
"""Wrap the `prompt` method of the `TLM` class to trace it."""
|
21
|
+
|
22
|
+
def traced_method(
|
23
|
+
wrapped: Callable,
|
24
|
+
instance: Any,
|
25
|
+
args: List[Any],
|
26
|
+
kwargs: ChatCompletionsCreateKwargs,
|
27
|
+
) -> Any:
|
28
|
+
service_provider = SERVICE_PROVIDERS["CLEANLAB"]
|
29
|
+
extra_attributes = baggage.get_baggage(LANGTRACE_ADDITIONAL_SPAN_ATTRIBUTES_KEY)
|
30
|
+
span_attributes = {
|
31
|
+
"langtrace.sdk.name": "langtrace-python-sdk",
|
32
|
+
"langtrace.service.name": service_provider,
|
33
|
+
"langtrace.service.type": "framework",
|
34
|
+
"langtrace.service.version": version,
|
35
|
+
"langtrace.version": v(LANGTRACE_SDK_NAME),
|
36
|
+
**(extra_attributes if extra_attributes is not None else {}),
|
37
|
+
}
|
38
|
+
|
39
|
+
span_attributes["tlm.metadata"] = serialize_kwargs(**kwargs)
|
40
|
+
span_attributes["tlm.inputs"] = serialize_args(*args)
|
41
|
+
|
42
|
+
attributes = FrameworkSpanAttributes(**span_attributes)
|
43
|
+
|
44
|
+
with tracer.start_as_current_span(
|
45
|
+
name=f"tlm.{wrapped.__name__}", kind=SpanKind.CLIENT
|
46
|
+
) as span:
|
47
|
+
try:
|
48
|
+
set_span_attributes(span, attributes)
|
49
|
+
result = wrapped(*args, **kwargs)
|
50
|
+
if result:
|
51
|
+
# Handle result serialization based on its type
|
52
|
+
if hasattr(result, 'model_dump_json'):
|
53
|
+
# For Pydantic models
|
54
|
+
result_json = json.loads(result.model_dump_json())
|
55
|
+
elif isinstance(result, dict):
|
56
|
+
# For dictionary results
|
57
|
+
result_json = result
|
58
|
+
else:
|
59
|
+
# For other types, try to convert to dict or use string representation
|
60
|
+
try:
|
61
|
+
result_json = json.loads(json.dumps(result, default=str))
|
62
|
+
except Exception: # pylint: disable=W0702, W0718
|
63
|
+
result_json = str(result)
|
64
|
+
|
65
|
+
span.set_attribute("tlm.result", str(result_json))
|
66
|
+
span.set_status(Status(StatusCode.OK))
|
67
|
+
|
68
|
+
return result
|
69
|
+
|
70
|
+
except Exception as err:
|
71
|
+
span.record_exception(err)
|
72
|
+
span.set_status(Status(StatusCode.ERROR, str(err)))
|
73
|
+
raise
|
74
|
+
|
75
|
+
return traced_method
|
@@ -1,4 +1,5 @@
|
|
1
1
|
import json
|
2
|
+
|
2
3
|
from importlib_metadata import version as v
|
3
4
|
from langtrace.trace_attributes import FrameworkSpanAttributes
|
4
5
|
from opentelemetry import baggage
|
@@ -7,9 +8,7 @@ from opentelemetry.trace.status import Status, StatusCode
|
|
7
8
|
|
8
9
|
from langtrace_python_sdk.constants import LANGTRACE_SDK_NAME
|
9
10
|
from langtrace_python_sdk.constants.instrumentation.common import (
|
10
|
-
LANGTRACE_ADDITIONAL_SPAN_ATTRIBUTES_KEY,
|
11
|
-
SERVICE_PROVIDERS,
|
12
|
-
)
|
11
|
+
LANGTRACE_ADDITIONAL_SPAN_ATTRIBUTES_KEY, SERVICE_PROVIDERS)
|
13
12
|
from langtrace_python_sdk.utils.llm import set_span_attributes
|
14
13
|
from langtrace_python_sdk.utils.misc import serialize_args, serialize_kwargs
|
15
14
|
|
@@ -27,8 +26,8 @@ def patch_graphlit_operation(operation_name, version, tracer: Tracer):
|
|
27
26
|
**(extra_attributes if extra_attributes is not None else {}),
|
28
27
|
}
|
29
28
|
|
30
|
-
span_attributes["
|
31
|
-
span_attributes["
|
29
|
+
span_attributes["graphlit.metadata"] = serialize_kwargs(**kwargs)
|
30
|
+
span_attributes["graphlit.inputs"] = serialize_args(*args)
|
32
31
|
|
33
32
|
attributes = FrameworkSpanAttributes(**span_attributes)
|
34
33
|
|
@@ -29,53 +29,9 @@ from opentelemetry.exporter.otlp.proto.http.trace_exporter import \
|
|
29
29
|
from opentelemetry.instrumentation.sqlalchemy import SQLAlchemyInstrumentor
|
30
30
|
from opentelemetry.sdk.resources import SERVICE_NAME, Resource
|
31
31
|
from opentelemetry.sdk.trace import TracerProvider
|
32
|
-
from opentelemetry.sdk.trace.export import (
|
33
|
-
|
34
|
-
|
35
|
-
SimpleSpanProcessor,
|
36
|
-
)
|
37
|
-
|
38
|
-
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import (
|
39
|
-
OTLPSpanExporter as GRPCExporter,
|
40
|
-
)
|
41
|
-
from opentelemetry.exporter.otlp.proto.http.trace_exporter import (
|
42
|
-
OTLPSpanExporter as HTTPExporter,
|
43
|
-
)
|
44
|
-
from langtrace_python_sdk.constants.exporter.langtrace_exporter import (
|
45
|
-
LANGTRACE_REMOTE_URL,
|
46
|
-
LANGTRACE_SESSION_ID_HEADER,
|
47
|
-
)
|
48
|
-
from langtrace_python_sdk.instrumentation import (
|
49
|
-
AnthropicInstrumentation,
|
50
|
-
ChromaInstrumentation,
|
51
|
-
CohereInstrumentation,
|
52
|
-
CrewAIInstrumentation,
|
53
|
-
DspyInstrumentation,
|
54
|
-
EmbedchainInstrumentation,
|
55
|
-
GeminiInstrumentation,
|
56
|
-
GroqInstrumentation,
|
57
|
-
LangchainCommunityInstrumentation,
|
58
|
-
LangchainCoreInstrumentation,
|
59
|
-
LangchainInstrumentation,
|
60
|
-
LanggraphInstrumentation,
|
61
|
-
LiteLLMInstrumentation,
|
62
|
-
LlamaindexInstrumentation,
|
63
|
-
MistralInstrumentation,
|
64
|
-
AWSBedrockInstrumentation,
|
65
|
-
OllamaInstrumentor,
|
66
|
-
OpenAIInstrumentation,
|
67
|
-
PineconeInstrumentation,
|
68
|
-
QdrantInstrumentation,
|
69
|
-
AutogenInstrumentation,
|
70
|
-
VertexAIInstrumentation,
|
71
|
-
WeaviateInstrumentation,
|
72
|
-
PyMongoInstrumentation,
|
73
|
-
CerebrasInstrumentation,
|
74
|
-
MilvusInstrumentation,
|
75
|
-
GoogleGenaiInstrumentation,
|
76
|
-
GraphlitInstrumentation,
|
77
|
-
PhiDataInstrumentation,
|
78
|
-
)
|
32
|
+
from opentelemetry.sdk.trace.export import (BatchSpanProcessor,
|
33
|
+
ConsoleSpanExporter,
|
34
|
+
SimpleSpanProcessor)
|
79
35
|
from opentelemetry.util.re import parse_env_headers
|
80
36
|
from sentry_sdk.types import Event, Hint
|
81
37
|
|
@@ -85,17 +41,18 @@ from langtrace_python_sdk.constants.exporter.langtrace_exporter import (
|
|
85
41
|
from langtrace_python_sdk.extensions.langtrace_exporter import \
|
86
42
|
LangTraceExporter
|
87
43
|
from langtrace_python_sdk.instrumentation import (
|
88
|
-
AnthropicInstrumentation, AutogenInstrumentation,
|
44
|
+
AgnoInstrumentation, AnthropicInstrumentation, AutogenInstrumentation,
|
89
45
|
AWSBedrockInstrumentation, CerebrasInstrumentation, ChromaInstrumentation,
|
90
|
-
CohereInstrumentation, CrewAIInstrumentation,
|
91
|
-
DspyInstrumentation, EmbedchainInstrumentation,
|
92
|
-
GoogleGenaiInstrumentation,
|
93
|
-
|
94
|
-
|
46
|
+
CleanLabInstrumentation, CohereInstrumentation, CrewAIInstrumentation,
|
47
|
+
CrewaiToolsInstrumentation, DspyInstrumentation, EmbedchainInstrumentation,
|
48
|
+
GeminiInstrumentation, GoogleGenaiInstrumentation, GraphlitInstrumentation,
|
49
|
+
GroqInstrumentation, LangchainCommunityInstrumentation,
|
50
|
+
LangchainCoreInstrumentation, LangchainInstrumentation,
|
51
|
+
LanggraphInstrumentation, LiteLLMInstrumentation,
|
95
52
|
LlamaindexInstrumentation, MilvusInstrumentation, MistralInstrumentation,
|
96
|
-
OllamaInstrumentor, OpenAIInstrumentation,
|
97
|
-
PyMongoInstrumentation, QdrantInstrumentation,
|
98
|
-
WeaviateInstrumentation)
|
53
|
+
OllamaInstrumentor, OpenAIInstrumentation, PhiDataInstrumentation,
|
54
|
+
PineconeInstrumentation, PyMongoInstrumentation, QdrantInstrumentation,
|
55
|
+
VertexAIInstrumentation, WeaviateInstrumentation)
|
99
56
|
from langtrace_python_sdk.types import (DisableInstrumentations,
|
100
57
|
InstrumentationMethods)
|
101
58
|
from langtrace_python_sdk.utils import (check_if_sdk_is_outdated,
|
@@ -325,6 +282,7 @@ def init(
|
|
325
282
|
"google-genai": GoogleGenaiInstrumentation(),
|
326
283
|
"graphlit-client": GraphlitInstrumentation(),
|
327
284
|
"phidata": PhiDataInstrumentation(),
|
285
|
+
"agno": AgnoInstrumentation(),
|
328
286
|
"mistralai": MistralInstrumentation(),
|
329
287
|
"boto3": AWSBedrockInstrumentation(),
|
330
288
|
"autogen": AutogenInstrumentation(),
|
@@ -332,6 +290,7 @@ def init(
|
|
332
290
|
"cerebras-cloud-sdk": CerebrasInstrumentation(),
|
333
291
|
"pymilvus": MilvusInstrumentation(),
|
334
292
|
"crewai-tools": CrewaiToolsInstrumentation(),
|
293
|
+
"cleanlab-tlm": CleanLabInstrumentation(),
|
335
294
|
}
|
336
295
|
|
337
296
|
init_instrumentations(config.disable_instrumentations, all_instrumentations)
|
langtrace_python_sdk/version.py
CHANGED
@@ -1 +1 @@
|
|
1
|
-
__version__ = "3.
|
1
|
+
__version__ = "3.8.1"
|
@@ -11,6 +11,7 @@ examples/cerebras_example/__init__.py,sha256=ydfNi0DjFMGVcfo79XVG3VEbzIrHo5wYBgS
|
|
11
11
|
examples/cerebras_example/main.py,sha256=QrzQLTEr0dkrrPrlOPqwXkeeGU4dwc8tPR4LhHPOQ3k,6573
|
12
12
|
examples/chroma_example/__init__.py,sha256=Mrf8KptW1hhzu6WDdRRTxbaB-0kM7x5u-Goc_zR7G5c,203
|
13
13
|
examples/chroma_example/basic.py,sha256=oO7-__8HptnFXLVKbnPgoz02yM-CAPi721xsbUb_gYg,868
|
14
|
+
examples/cleanlab_example/simple.py,sha256=YxKzHikcsTlwWVBtRzhgC35j_XsCGDPgTjzMQQ3PMjQ,548
|
14
15
|
examples/cohere_example/__init__.py,sha256=7Sa0MEQrRU5gBZg31Ao6kXGDC9raHoLU0BxqVWAX8b8,736
|
15
16
|
examples/cohere_example/chat.py,sha256=A1ZSkkPPOj3h27VSSa_o_Thabz08ZUzUgTVgAG0pgcA,901
|
16
17
|
examples/cohere_example/chat_stream.py,sha256=BvhUgBEuyMhyzRZ_2i_SBvO9Ndf0b7-aRDyO399RyFE,664
|
@@ -114,8 +115,8 @@ examples/vertexai_example/main.py,sha256=gndId5X5ksD-ycxnAWMdEqIDbLc3kz5Vt8vm4YP
|
|
114
115
|
examples/weaviate_example/__init__.py,sha256=8JMDBsRSEV10HfTd-YC7xb4txBjD3la56snk-Bbg2Kw,618
|
115
116
|
examples/weaviate_example/query_text.py,sha256=wPHQTc_58kPoKTZMygVjTj-2ZcdrIuaausJfMxNQnQc,127162
|
116
117
|
langtrace_python_sdk/__init__.py,sha256=VZM6i71NR7pBQK6XvJWRelknuTYUhqwqE7PlicKa5Wg,1166
|
117
|
-
langtrace_python_sdk/langtrace.py,sha256=
|
118
|
-
langtrace_python_sdk/version.py,sha256=
|
118
|
+
langtrace_python_sdk/langtrace.py,sha256=L0ktJXsGjvKS0dc6kWGCOUoNsGTERLEmd-1QfzDppq8,13706
|
119
|
+
langtrace_python_sdk/version.py,sha256=kZzGpxWKY4rWDQrrrlM7bN7YKRAjy17Wv4w__djvVYU,22
|
119
120
|
langtrace_python_sdk/constants/__init__.py,sha256=3CNYkWMdd1DrkGqzLUgNZXjdAlM6UFMlf_F-odAToyc,146
|
120
121
|
langtrace_python_sdk/constants/exporter/langtrace_exporter.py,sha256=EVCrouYCpY98f0KSaKr4PzNxPULTZZO6dSA_crEOyJU,106
|
121
122
|
langtrace_python_sdk/constants/instrumentation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -123,7 +124,7 @@ langtrace_python_sdk/constants/instrumentation/anthropic.py,sha256=YX3llt3zwDY6X
|
|
123
124
|
langtrace_python_sdk/constants/instrumentation/aws_bedrock.py,sha256=QwKtO4NBarOZoGkt5cFCcpxAw3zvZxcMMWBbzPPGv-g,422
|
124
125
|
langtrace_python_sdk/constants/instrumentation/chroma.py,sha256=hiPGYdHS0Yj4Kh3eaYBbuCAl_swqIygu80yFqkOgdak,955
|
125
126
|
langtrace_python_sdk/constants/instrumentation/cohere.py,sha256=9yD133VdrYZ5BoJR4nJHlj67gHEImB9-KsD-NkzHW1I,1159
|
126
|
-
langtrace_python_sdk/constants/instrumentation/common.py,sha256=
|
127
|
+
langtrace_python_sdk/constants/instrumentation/common.py,sha256=DxcrwO9iI4Q1-ECTAbfFzY6vjU3K9kyoU54W-I2Ebs0,1326
|
127
128
|
langtrace_python_sdk/constants/instrumentation/embedchain.py,sha256=HodCJvaFjILoOG50OwFObxfVxt_8VUaIAIqvgoN3tzo,278
|
128
129
|
langtrace_python_sdk/constants/instrumentation/gemini.py,sha256=UAmfgg9FM7uNeOCdPfWlir6OIH-8BoxFGPRpdBd9ZZs,358
|
129
130
|
langtrace_python_sdk/constants/instrumentation/groq.py,sha256=VFXmIl4aqGY_fS0PAmjPj_Qm7Tibxbx7Ur_e7rQpqXc,134
|
@@ -140,7 +141,10 @@ langtrace_python_sdk/constants/instrumentation/weaviate.py,sha256=gtv-JBxvNGClEM
|
|
140
141
|
langtrace_python_sdk/extensions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
141
142
|
langtrace_python_sdk/extensions/langtrace_exporter.py,sha256=ckd8dMmY6h2oxE04p1JFLwUB5PSJX_Cy4eDFEM6aj4Y,6605
|
142
143
|
langtrace_python_sdk/extensions/langtrace_filesystem.py,sha256=34fZutG28EJ66l67OvTGsydAH3ZpXgikdE7hVLqBpG4,7863
|
143
|
-
langtrace_python_sdk/instrumentation/__init__.py,sha256=
|
144
|
+
langtrace_python_sdk/instrumentation/__init__.py,sha256=UOtU6nT-ZT-ZvHzOgPNhG_IooMe5jU8lzgdoDCHpeBc,2469
|
145
|
+
langtrace_python_sdk/instrumentation/agno/__init__.py,sha256=95fn4oA-CHB0mxc6KnVB20KSbXGl_ZZr9n99EEaXzrY,91
|
146
|
+
langtrace_python_sdk/instrumentation/agno/instrumentation.py,sha256=CrwHzkzLpdo2m2nBHE69d8MIFMxZuvTsT1LTxqlTWV0,2664
|
147
|
+
langtrace_python_sdk/instrumentation/agno/patch.py,sha256=EOaz3n_FYx7qXtd_liSjvBqjvD5E1ze6FL1K51v8NBc,12060
|
144
148
|
langtrace_python_sdk/instrumentation/anthropic/__init__.py,sha256=donrurJAGYlxrSRA3BIf76jGeUcAx9Tq8CVpah68S0Y,101
|
145
149
|
langtrace_python_sdk/instrumentation/anthropic/instrumentation.py,sha256=ndXdruI0BG7n75rsuEpKjfzePxrZxg40gZ39ONmD_v4,1845
|
146
150
|
langtrace_python_sdk/instrumentation/anthropic/patch.py,sha256=ztPN4VZujoxYOKhTbFnup7Ibms9NAzYCPAJY43NUgKw,4935
|
@@ -159,6 +163,9 @@ langtrace_python_sdk/instrumentation/cerebras/patch.py,sha256=HR4slOrE3pMp0ABafn
|
|
159
163
|
langtrace_python_sdk/instrumentation/chroma/__init__.py,sha256=pNZ5UO8Q-d5VkXSobBf79reB6AmEl_usnnTp5Itv818,95
|
160
164
|
langtrace_python_sdk/instrumentation/chroma/instrumentation.py,sha256=nT6PS6bsrIOO9kLV5GuUeRjMe6THHHAZGvqWBP1dYog,1807
|
161
165
|
langtrace_python_sdk/instrumentation/chroma/patch.py,sha256=jYcqBeu-0cYA29PO880oXYRwYh-R1oseXmzfK6UDBps,9074
|
166
|
+
langtrace_python_sdk/instrumentation/cleanlab/__init__.py,sha256=UuwRiRAPH2i6cucqK8CgNYOGrsG4t_SGAQJSExRuZ1U,99
|
167
|
+
langtrace_python_sdk/instrumentation/cleanlab/instrumentation.py,sha256=CtWdtDUCqh60HU2Vs38O9Y32rlB4jzHIEbVRbwIf_Wg,2088
|
168
|
+
langtrace_python_sdk/instrumentation/cleanlab/patch.py,sha256=aI0QfG9UH5P7OvmzeIdeMhRd28oV4JMuXIkPv8s869s,3138
|
162
169
|
langtrace_python_sdk/instrumentation/cohere/__init__.py,sha256=sGUSLdTUyYf36Tm6L5jQflhzCqvmWrhnBOMYHjvp6Hs,95
|
163
170
|
langtrace_python_sdk/instrumentation/cohere/instrumentation.py,sha256=1wxMhWMfsvKprdV52BIfCZhZS1beRYBW9rUzUDDkyCk,2854
|
164
171
|
langtrace_python_sdk/instrumentation/cohere/patch.py,sha256=q29gJnik8bnJ7fnwaJ8PArHTQbJkWhhwBfDdQOTRBng,25422
|
@@ -182,7 +189,7 @@ langtrace_python_sdk/instrumentation/google_genai/instrumentation.py,sha256=oqKD
|
|
182
189
|
langtrace_python_sdk/instrumentation/google_genai/patch.py,sha256=X0TWY1D4XHweaNu70PlXBDzKEaHIibLpkJiIsp4jF6A,4115
|
183
190
|
langtrace_python_sdk/instrumentation/graphlit/__init__.py,sha256=mkUPwozR-I-D5ZrumJs1gS7sSouY0UN68Ne9LiNEBTs,92
|
184
191
|
langtrace_python_sdk/instrumentation/graphlit/instrumentation.py,sha256=V9GRZ6cj2lt20xCVfL55lGU4p0HlZxAYUqwpWogXDtY,2074
|
185
|
-
langtrace_python_sdk/instrumentation/graphlit/patch.py,sha256=
|
192
|
+
langtrace_python_sdk/instrumentation/graphlit/patch.py,sha256=jVME4xlFTwJRPWOBGUtQiZrGkr1ScR2DSYwcWPd5smk,2921
|
186
193
|
langtrace_python_sdk/instrumentation/groq/__init__.py,sha256=ZXeq_nrej6Lm_uoMFEg8wbSejhjB2UJ5IoHQBPc2-C0,91
|
187
194
|
langtrace_python_sdk/instrumentation/groq/instrumentation.py,sha256=Ttf07XVKhdYY1_fqJc7QWiSdmgEhEVyQB_3Az2_wqYo,1832
|
188
195
|
langtrace_python_sdk/instrumentation/groq/patch.py,sha256=J0h8SXEw2LyMIJhKZTVydEysyKfSLWkCuhEharzDS4w,23161
|
@@ -290,8 +297,8 @@ tests/pinecone/cassettes/test_query.yaml,sha256=b5v9G3ssUy00oG63PlFUR3JErF2Js-5A
|
|
290
297
|
tests/pinecone/cassettes/test_upsert.yaml,sha256=neWmQ1v3d03V8WoLl8FoFeeCYImb8pxlJBWnFd_lITU,38607
|
291
298
|
tests/qdrant/conftest.py,sha256=9n0uHxxIjWk9fbYc4bx-uP8lSAgLBVx-cV9UjnsyCHM,381
|
292
299
|
tests/qdrant/test_qdrant.py,sha256=pzjAjVY2kmsmGfrI2Gs2xrolfuaNHz7l1fqGQCjp5_o,3353
|
293
|
-
langtrace_python_sdk-3.
|
294
|
-
langtrace_python_sdk-3.
|
295
|
-
langtrace_python_sdk-3.
|
296
|
-
langtrace_python_sdk-3.
|
297
|
-
langtrace_python_sdk-3.
|
300
|
+
langtrace_python_sdk-3.8.1.dist-info/METADATA,sha256=ktcD9oBxDhCg6GZuUXQYLAwcvGdo9NvD-QYwlQSaQ2c,15792
|
301
|
+
langtrace_python_sdk-3.8.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
302
|
+
langtrace_python_sdk-3.8.1.dist-info/entry_points.txt,sha256=1_b9-qvf2fE7uQNZcbUei9vLpFZBbbh9LrtGw95ssAo,70
|
303
|
+
langtrace_python_sdk-3.8.1.dist-info/licenses/LICENSE,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
|
304
|
+
langtrace_python_sdk-3.8.1.dist-info/RECORD,,
|
File without changes
|
{langtrace_python_sdk-3.7.0.dist-info → langtrace_python_sdk-3.8.1.dist-info}/entry_points.txt
RENAMED
File without changes
|
{langtrace_python_sdk-3.7.0.dist-info → langtrace_python_sdk-3.8.1.dist-info}/licenses/LICENSE
RENAMED
File without changes
|