langtrace-python-sdk 2.2.31__py3-none-any.whl → 2.3.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/crewai_example/simple_agent/agents.py +27 -4
- examples/crewai_example/simple_agent/main.py +9 -4
- examples/embedchain_example/simple.py +15 -0
- langtrace_python_sdk/constants/instrumentation/common.py +1 -0
- langtrace_python_sdk/constants/instrumentation/embedchain.py +14 -0
- langtrace_python_sdk/instrumentation/__init__.py +2 -0
- langtrace_python_sdk/instrumentation/chroma/patch.py +1 -1
- langtrace_python_sdk/instrumentation/crewai/instrumentation.py +18 -2
- langtrace_python_sdk/instrumentation/crewai/patch.py +70 -84
- langtrace_python_sdk/instrumentation/embedchain/__init__.py +5 -0
- langtrace_python_sdk/instrumentation/embedchain/instrumentation.py +65 -0
- langtrace_python_sdk/instrumentation/embedchain/patch.py +96 -0
- langtrace_python_sdk/instrumentation/langchain/instrumentation.py +62 -49
- langtrace_python_sdk/instrumentation/langchain/patch.py +6 -1
- langtrace_python_sdk/instrumentation/langchain_core/instrumentation.py +2 -0
- langtrace_python_sdk/langtrace.py +2 -0
- langtrace_python_sdk/utils/misc.py +32 -0
- langtrace_python_sdk/version.py +1 -1
- {langtrace_python_sdk-2.2.31.dist-info → langtrace_python_sdk-2.3.1.dist-info}/METADATA +3 -1
- {langtrace_python_sdk-2.2.31.dist-info → langtrace_python_sdk-2.3.1.dist-info}/RECORD +23 -18
- {langtrace_python_sdk-2.2.31.dist-info → langtrace_python_sdk-2.3.1.dist-info}/WHEEL +0 -0
- {langtrace_python_sdk-2.2.31.dist-info → langtrace_python_sdk-2.3.1.dist-info}/entry_points.txt +0 -0
- {langtrace_python_sdk-2.2.31.dist-info → langtrace_python_sdk-2.3.1.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,15 +1,13 @@
|
|
|
1
1
|
from crewai import Agent
|
|
2
|
-
from langchain_openai import ChatOpenAI
|
|
3
2
|
from langchain_anthropic import ChatAnthropic
|
|
4
3
|
from langchain_cohere import ChatCohere
|
|
5
4
|
from langchain_ollama import ChatOllama
|
|
5
|
+
from langchain_openai import ChatOpenAI
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
class PoetryAgents:
|
|
9
9
|
def __init__(self):
|
|
10
|
-
self.open_ai = ChatOpenAI(
|
|
11
|
-
model_name="gpt-4", temperature=0.7, stream_usage=True
|
|
12
|
-
)
|
|
10
|
+
self.open_ai = ChatOpenAI(model_name="gpt-4", temperature=0.7)
|
|
13
11
|
self.anthropic = ChatAnthropic(
|
|
14
12
|
model_name="claude-3-5-sonnet-20240620", temperature=0.7
|
|
15
13
|
)
|
|
@@ -30,3 +28,28 @@ class PoetryAgents:
|
|
|
30
28
|
verbose=True,
|
|
31
29
|
llm=self.open_ai,
|
|
32
30
|
)
|
|
31
|
+
|
|
32
|
+
def poet_agent_2(self):
|
|
33
|
+
return Agent(
|
|
34
|
+
role="Renaissance Poet",
|
|
35
|
+
backstory="""
|
|
36
|
+
I am a Renaissance Poet. I am well-versed in the art of poetry and have a deep appreciation for the beauty of language and expression.
|
|
37
|
+
""",
|
|
38
|
+
goal="""Create a poem that is inspired by the works of the Renaissance poets""",
|
|
39
|
+
allow_delegation=False,
|
|
40
|
+
verbose=True,
|
|
41
|
+
llm=self.open_ai,
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
def poet_agent_3(self):
|
|
45
|
+
return Agent(
|
|
46
|
+
role="William Shakespeare",
|
|
47
|
+
backstory="""
|
|
48
|
+
I am william shakespeare. I am an Expert in poetry writing and creative expression.
|
|
49
|
+
I have been writing poetry for over 10 years and have published several collections.
|
|
50
|
+
""",
|
|
51
|
+
goal="""Create a poem that is inspired by the works of William Shakespeare""",
|
|
52
|
+
allow_delegation=False,
|
|
53
|
+
verbose=True,
|
|
54
|
+
llm=self.open_ai,
|
|
55
|
+
)
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
from agents import PoetryAgents
|
|
1
2
|
from crewai import Crew
|
|
2
|
-
from .agents import PoetryAgents
|
|
3
|
-
from .tasks import PoetryTasks
|
|
4
|
-
from langtrace_python_sdk import langtrace
|
|
5
3
|
from dotenv import load_dotenv
|
|
4
|
+
from tasks import PoetryTasks
|
|
5
|
+
|
|
6
|
+
from langtrace_python_sdk import langtrace
|
|
6
7
|
|
|
7
8
|
load_dotenv()
|
|
8
9
|
langtrace.init()
|
|
@@ -17,10 +18,14 @@ class PoetryCrew:
|
|
|
17
18
|
tasks = PoetryTasks()
|
|
18
19
|
|
|
19
20
|
poetry_agent = agents.create_poet_agent()
|
|
21
|
+
# poetry_agent_2 = agents.poet_agent_2()
|
|
22
|
+
# poetry_agent_3 = agents.poet_agent_3()
|
|
20
23
|
|
|
21
24
|
create_poem = tasks.create_poem(poetry_agent, self.topic)
|
|
25
|
+
# create_poem_2 = tasks.create_poem(poetry_agent_2, self.topic)
|
|
26
|
+
# create_poem_3 = tasks.create_poem(poetry_agent_3, self.topic)
|
|
22
27
|
|
|
23
|
-
crew = Crew(agents=[poetry_agent], tasks=[create_poem], verbose=True)
|
|
28
|
+
crew = Crew(agents=[poetry_agent], tasks=[create_poem], verbose=True, memory=True)
|
|
24
29
|
res = crew.kickoff()
|
|
25
30
|
return res
|
|
26
31
|
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
from dotenv import load_dotenv
|
|
2
|
+
from embedchain import App
|
|
3
|
+
from langtrace_python_sdk import langtrace
|
|
4
|
+
|
|
5
|
+
load_dotenv()
|
|
6
|
+
langtrace.init()
|
|
7
|
+
|
|
8
|
+
app = App()
|
|
9
|
+
app.reset()
|
|
10
|
+
app.add("https://www.forbes.com/profile/elon-musk")
|
|
11
|
+
app.add("https://en.wikipedia.org/wiki/Elon_Musk")
|
|
12
|
+
res = app.query("What is the net worth of Elon Musk today?")
|
|
13
|
+
print(res)
|
|
14
|
+
re2 = app.search("Elon Musk")
|
|
15
|
+
print(re2)
|
|
@@ -17,12 +17,14 @@ from .dspy import DspyInstrumentation
|
|
|
17
17
|
from .vertexai import VertexAIInstrumentation
|
|
18
18
|
from .gemini import GeminiInstrumentation
|
|
19
19
|
from .mistral import MistralInstrumentation
|
|
20
|
+
from .embedchain import EmbedchainInstrumentation
|
|
20
21
|
|
|
21
22
|
__all__ = [
|
|
22
23
|
"AnthropicInstrumentation",
|
|
23
24
|
"ChromaInstrumentation",
|
|
24
25
|
"CohereInstrumentation",
|
|
25
26
|
"CrewAIInstrumentation",
|
|
27
|
+
"EmbedchainInstrumentation",
|
|
26
28
|
"GroqInstrumentation",
|
|
27
29
|
"LangchainInstrumentation",
|
|
28
30
|
"LangchainCommunityInstrumentation",
|
|
@@ -51,7 +51,7 @@ def collection_patch(method, version, tracer):
|
|
|
51
51
|
"langtrace.version": v(LANGTRACE_SDK_NAME),
|
|
52
52
|
"db.system": "chromadb",
|
|
53
53
|
"db.operation": api["OPERATION"],
|
|
54
|
-
"db.query": json.dumps(kwargs
|
|
54
|
+
"db.query": json.dumps(kwargs),
|
|
55
55
|
**(extra_attributes if extra_attributes is not None else {}),
|
|
56
56
|
}
|
|
57
57
|
|
|
@@ -19,7 +19,7 @@ from opentelemetry.trace import get_tracer
|
|
|
19
19
|
from wrapt import wrap_function_wrapper as _W
|
|
20
20
|
from typing import Collection
|
|
21
21
|
from importlib_metadata import version as v
|
|
22
|
-
from .patch import patch_crew
|
|
22
|
+
from .patch import patch_crew, patch_memory
|
|
23
23
|
|
|
24
24
|
|
|
25
25
|
class CrewAIInstrumentation(BaseInstrumentor):
|
|
@@ -49,7 +49,23 @@ class CrewAIInstrumentation(BaseInstrumentor):
|
|
|
49
49
|
"Task.execute_sync",
|
|
50
50
|
patch_crew("Task.execute", version, tracer),
|
|
51
51
|
)
|
|
52
|
-
|
|
52
|
+
_W(
|
|
53
|
+
"crewai.memory.storage.rag_storage",
|
|
54
|
+
"RAGStorage.save",
|
|
55
|
+
patch_memory("RAGStorage.save", version, tracer),
|
|
56
|
+
)
|
|
57
|
+
_W(
|
|
58
|
+
"crewai.memory.storage.rag_storage",
|
|
59
|
+
"RAGStorage.search",
|
|
60
|
+
patch_memory("RAGStorage.search", version, tracer),
|
|
61
|
+
)
|
|
62
|
+
_W(
|
|
63
|
+
"crewai.memory.storage.rag_storage",
|
|
64
|
+
"RAGStorage.reset",
|
|
65
|
+
patch_memory("RAGStorage.reset", version, tracer),
|
|
66
|
+
)
|
|
67
|
+
# pylint: disable=broad-except
|
|
68
|
+
except Exception:
|
|
53
69
|
pass
|
|
54
70
|
|
|
55
71
|
def _uninstrument(self, **kwargs):
|
|
@@ -11,82 +11,56 @@ from opentelemetry import baggage
|
|
|
11
11
|
from langtrace.trace_attributes import FrameworkSpanAttributes
|
|
12
12
|
from opentelemetry.trace import SpanKind, Span, Tracer
|
|
13
13
|
from opentelemetry.trace.status import Status, StatusCode
|
|
14
|
+
from langtrace_python_sdk.utils.misc import serialize_args, serialize_kwargs
|
|
14
15
|
|
|
15
16
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
"formatting_errors": "int",
|
|
64
|
-
"id": "object",
|
|
65
|
-
"role": "str",
|
|
66
|
-
"goal": "str",
|
|
67
|
-
"backstory": "str",
|
|
68
|
-
"cache": "bool",
|
|
69
|
-
"config": "object",
|
|
70
|
-
"max_rpm": "int",
|
|
71
|
-
"verbose": "bool",
|
|
72
|
-
"allow_delegation": "bool",
|
|
73
|
-
"tools": "object",
|
|
74
|
-
"max_iter": "int",
|
|
75
|
-
"max_execution_time": "object",
|
|
76
|
-
"agent_executor": "object",
|
|
77
|
-
"tools_handler": "object",
|
|
78
|
-
"force_answer_max_iterations": "int",
|
|
79
|
-
"crew": "object",
|
|
80
|
-
"cache_handler": "object",
|
|
81
|
-
"step_callback": "object",
|
|
82
|
-
"i18n": "object",
|
|
83
|
-
"llm": "object",
|
|
84
|
-
"function_calling_llm": "object",
|
|
85
|
-
"callbacks": "object",
|
|
86
|
-
"system_template": "object",
|
|
87
|
-
"prompt_template": "object",
|
|
88
|
-
"response_template": "object",
|
|
89
|
-
}
|
|
17
|
+
def patch_memory(operation_name, version, tracer: Tracer):
|
|
18
|
+
def traced_method(wrapped, instance, args, kwargs):
|
|
19
|
+
service_provider = SERVICE_PROVIDERS["CREWAI"]
|
|
20
|
+
extra_attributes = baggage.get_baggage(LANGTRACE_ADDITIONAL_SPAN_ATTRIBUTES_KEY)
|
|
21
|
+
span_attributes = {
|
|
22
|
+
"langtrace.sdk.name": "langtrace-python-sdk",
|
|
23
|
+
"langtrace.service.name": service_provider,
|
|
24
|
+
"langtrace.service.type": "framework",
|
|
25
|
+
"langtrace.service.version": version,
|
|
26
|
+
"langtrace.version": v(LANGTRACE_SDK_NAME),
|
|
27
|
+
**(extra_attributes if extra_attributes is not None else {}),
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
inputs = {}
|
|
31
|
+
if len(args) > 0:
|
|
32
|
+
inputs["args"] = serialize_args(*args)
|
|
33
|
+
if len(kwargs) > 0:
|
|
34
|
+
inputs["kwargs"] = serialize_kwargs(**kwargs)
|
|
35
|
+
span_attributes["crewai.memory.storage.rag_storage.inputs"] = json.dumps(inputs)
|
|
36
|
+
|
|
37
|
+
attributes = FrameworkSpanAttributes(**span_attributes)
|
|
38
|
+
|
|
39
|
+
with tracer.start_as_current_span(
|
|
40
|
+
get_span_name(operation_name), kind=SpanKind.CLIENT
|
|
41
|
+
) as span:
|
|
42
|
+
|
|
43
|
+
try:
|
|
44
|
+
set_span_attributes(span, attributes)
|
|
45
|
+
result = wrapped(*args, **kwargs)
|
|
46
|
+
if result is not None and len(result) > 0:
|
|
47
|
+
set_span_attribute(span, "crewai.memory.storage.rag_storage.outputs", str(result))
|
|
48
|
+
if result:
|
|
49
|
+
span.set_status(Status(StatusCode.OK))
|
|
50
|
+
span.end()
|
|
51
|
+
return result
|
|
52
|
+
|
|
53
|
+
except Exception as err:
|
|
54
|
+
# Record the exception in the span
|
|
55
|
+
span.record_exception(err)
|
|
56
|
+
|
|
57
|
+
# Set the span status to indicate an error
|
|
58
|
+
span.set_status(Status(StatusCode.ERROR, str(err)))
|
|
59
|
+
|
|
60
|
+
# Reraise the exception to ensure it's not swallowed
|
|
61
|
+
raise
|
|
62
|
+
|
|
63
|
+
return traced_method
|
|
90
64
|
|
|
91
65
|
|
|
92
66
|
def patch_crew(operation_name, version, tracer: Tracer):
|
|
@@ -114,12 +88,23 @@ def patch_crew(operation_name, version, tracer: Tracer):
|
|
|
114
88
|
result = wrapped(*args, **kwargs)
|
|
115
89
|
if result:
|
|
116
90
|
span.set_status(Status(StatusCode.OK))
|
|
91
|
+
if instance.__class__.__name__ == "Crew":
|
|
92
|
+
span.set_attribute("crewai.crew.result", str(result))
|
|
93
|
+
if hasattr(result, "tasks_output"):
|
|
94
|
+
span.set_attribute("crewai.crew.tasks_output", str((result.tasks_output)))
|
|
95
|
+
if hasattr(result, "token_usage"):
|
|
96
|
+
span.set_attribute("crewai.crew.token_usage", str((result.token_usage)))
|
|
97
|
+
if hasattr(result, "usage_metrics"):
|
|
98
|
+
span.set_attribute("crewai.crew.usage_metrics", str((result.usage_metrics)))
|
|
99
|
+
elif instance.__class__.__name__ == "Agent":
|
|
100
|
+
span.set_attribute("crewai.agent.result", str(result))
|
|
101
|
+
elif instance.__class__.__name__ == "Task":
|
|
102
|
+
span.set_attribute("crewai.task.result", str(result))
|
|
117
103
|
|
|
118
104
|
span.end()
|
|
119
105
|
return result
|
|
120
106
|
|
|
121
107
|
except Exception as err:
|
|
122
|
-
print("Error", err)
|
|
123
108
|
# Record the exception in the span
|
|
124
109
|
span.record_exception(err)
|
|
125
110
|
|
|
@@ -150,25 +135,26 @@ class CrewAISpanAttributes:
|
|
|
150
135
|
instance_name = self.instance.__class__.__name__
|
|
151
136
|
if instance_name == "Crew":
|
|
152
137
|
self.set_crew_attributes()
|
|
153
|
-
|
|
138
|
+
for key, value in self.crew.items():
|
|
139
|
+
key = f"crewai.crew.{key}"
|
|
140
|
+
set_span_attribute(self.span, key, value)
|
|
154
141
|
|
|
155
142
|
elif instance_name == "Agent":
|
|
156
143
|
agent = self.set_agent_attributes()
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
144
|
+
for key, value in agent.items():
|
|
145
|
+
key = f"crewai.agent.{key}"
|
|
146
|
+
set_span_attribute(self.span, key, value)
|
|
147
|
+
|
|
160
148
|
elif instance_name == "Task":
|
|
161
149
|
task = self.set_task_attributes()
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
set_span_attribute(self.span, "crewai.task.config", json.dumps(task))
|
|
150
|
+
for key, value in task.items():
|
|
151
|
+
key = f"crewai.task.{key}"
|
|
152
|
+
set_span_attribute(self.span, key, value)
|
|
166
153
|
|
|
167
154
|
def set_crew_attributes(self):
|
|
168
155
|
for key, value in self.instance.__dict__.items():
|
|
169
156
|
if key == "tasks":
|
|
170
157
|
self._parse_tasks(value)
|
|
171
|
-
|
|
172
158
|
elif key == "agents":
|
|
173
159
|
self._parse_agents(value)
|
|
174
160
|
else:
|
|
@@ -0,0 +1,65 @@
|
|
|
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
|
+
import importlib.metadata
|
|
18
|
+
import logging
|
|
19
|
+
from typing import Collection
|
|
20
|
+
|
|
21
|
+
from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
|
|
22
|
+
from opentelemetry.trace import get_tracer
|
|
23
|
+
from wrapt import wrap_function_wrapper
|
|
24
|
+
|
|
25
|
+
from langtrace_python_sdk.instrumentation.embedchain.patch import generic_patch
|
|
26
|
+
|
|
27
|
+
logging.basicConfig(level=logging.FATAL)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class EmbedchainInstrumentation(BaseInstrumentor):
|
|
31
|
+
"""
|
|
32
|
+
The EmbedchainInstrumentation class represents the Embedchain instrumentation
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
def instrumentation_dependencies(self) -> Collection[str]:
|
|
36
|
+
return ["embedchain >= 0.1.113"]
|
|
37
|
+
|
|
38
|
+
def _instrument(self, **kwargs):
|
|
39
|
+
tracer_provider = kwargs.get("tracer_provider")
|
|
40
|
+
tracer = get_tracer(__name__, "", tracer_provider)
|
|
41
|
+
version = importlib.metadata.version("embedchain")
|
|
42
|
+
|
|
43
|
+
wrap_function_wrapper(
|
|
44
|
+
"embedchain.embedchain",
|
|
45
|
+
"EmbedChain.add",
|
|
46
|
+
generic_patch("ADD", version, tracer),
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
wrap_function_wrapper(
|
|
50
|
+
"embedchain.embedchain",
|
|
51
|
+
"EmbedChain.query",
|
|
52
|
+
generic_patch("QUERY", version, tracer),
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
wrap_function_wrapper(
|
|
56
|
+
"embedchain.embedchain",
|
|
57
|
+
"EmbedChain.search",
|
|
58
|
+
generic_patch("SEARCH", version, tracer),
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
def _instrument_module(self, module_name):
|
|
62
|
+
pass
|
|
63
|
+
|
|
64
|
+
def _uninstrument(self, **kwargs):
|
|
65
|
+
pass
|
|
@@ -0,0 +1,96 @@
|
|
|
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 langtrace.trace_attributes import FrameworkSpanAttributes
|
|
18
|
+
from langtrace_python_sdk.utils import set_span_attribute
|
|
19
|
+
from langtrace_python_sdk.utils.llm import get_span_name
|
|
20
|
+
from opentelemetry import baggage, trace
|
|
21
|
+
from opentelemetry.trace import SpanKind
|
|
22
|
+
from opentelemetry.trace.status import Status, StatusCode
|
|
23
|
+
from opentelemetry.trace.propagation import set_span_in_context
|
|
24
|
+
from langtrace_python_sdk.constants.instrumentation.embedchain import APIS
|
|
25
|
+
from langtrace_python_sdk.constants.instrumentation.common import (
|
|
26
|
+
LANGTRACE_ADDITIONAL_SPAN_ATTRIBUTES_KEY,
|
|
27
|
+
SERVICE_PROVIDERS,
|
|
28
|
+
)
|
|
29
|
+
import json
|
|
30
|
+
from importlib_metadata import version as v
|
|
31
|
+
|
|
32
|
+
from langtrace_python_sdk.constants import LANGTRACE_SDK_NAME
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def generic_patch(method, version, tracer):
|
|
36
|
+
"""
|
|
37
|
+
A generic patch method that wraps a function with a span
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
def traced_method(wrapped, instance, args, kwargs):
|
|
41
|
+
api = APIS[method]
|
|
42
|
+
service_provider = SERVICE_PROVIDERS["EMBEDCHAIN"]
|
|
43
|
+
extra_attributes = baggage.get_baggage(LANGTRACE_ADDITIONAL_SPAN_ATTRIBUTES_KEY)
|
|
44
|
+
|
|
45
|
+
span_attributes = {
|
|
46
|
+
"langtrace.sdk.name": "langtrace-python-sdk",
|
|
47
|
+
"langtrace.service.name": service_provider,
|
|
48
|
+
"langtrace.service.type": "framework",
|
|
49
|
+
"langtrace.service.version": version,
|
|
50
|
+
"langtrace.version": v(LANGTRACE_SDK_NAME),
|
|
51
|
+
"embedchain.api": api["OPERATION"],
|
|
52
|
+
**(extra_attributes if extra_attributes is not None else {}),
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if hasattr(instance, 'config') and isinstance(instance.config, object):
|
|
56
|
+
config_dict = instance.config.__dict__
|
|
57
|
+
if isinstance(config_dict, dict):
|
|
58
|
+
span_attributes["embedchain.config"] = json.dumps(config_dict)
|
|
59
|
+
|
|
60
|
+
if len(args) > 0:
|
|
61
|
+
span_attributes["embedchain.inputs"] = json.dumps(args)
|
|
62
|
+
|
|
63
|
+
attributes = FrameworkSpanAttributes(**span_attributes)
|
|
64
|
+
|
|
65
|
+
with tracer.start_as_current_span(
|
|
66
|
+
name=get_span_name(api["METHOD"]),
|
|
67
|
+
kind=SpanKind.CLIENT,
|
|
68
|
+
context=set_span_in_context(trace.get_current_span()),
|
|
69
|
+
) as span:
|
|
70
|
+
for field, value in attributes.model_dump(by_alias=True).items():
|
|
71
|
+
if value is not None:
|
|
72
|
+
span.set_attribute(field, value)
|
|
73
|
+
try:
|
|
74
|
+
result = wrapped(*args, **kwargs)
|
|
75
|
+
set_span_attribute(span, "embedchain.outputs", json.dumps(result))
|
|
76
|
+
span.set_status(StatusCode.OK)
|
|
77
|
+
return result
|
|
78
|
+
except Exception as err:
|
|
79
|
+
# Record the exception in the span
|
|
80
|
+
span.record_exception(err)
|
|
81
|
+
|
|
82
|
+
# Set the span status to indicate an error
|
|
83
|
+
span.set_status(Status(StatusCode.ERROR, str(err)))
|
|
84
|
+
|
|
85
|
+
# Reraise the exception to ensure it's not swallowed
|
|
86
|
+
raise
|
|
87
|
+
|
|
88
|
+
return traced_method
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def get_count_or_none(value):
|
|
92
|
+
return len(value) if value is not None else None
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def handle_null_params(param):
|
|
96
|
+
return str(param) if param else None
|
|
@@ -15,7 +15,6 @@ limitations under the License.
|
|
|
15
15
|
"""
|
|
16
16
|
|
|
17
17
|
import importlib.metadata
|
|
18
|
-
import inspect
|
|
19
18
|
import logging
|
|
20
19
|
from typing import Collection
|
|
21
20
|
|
|
@@ -28,46 +27,46 @@ from langtrace_python_sdk.instrumentation.langchain.patch import generic_patch
|
|
|
28
27
|
logging.basicConfig(level=logging.FATAL)
|
|
29
28
|
|
|
30
29
|
|
|
31
|
-
def patch_module_classes(
|
|
32
|
-
|
|
33
|
-
):
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
30
|
+
# def patch_module_classes(
|
|
31
|
+
# module_name, tracer, version, task, trace_output=True, trace_input=True
|
|
32
|
+
# ):
|
|
33
|
+
# """
|
|
34
|
+
# Generic function to patch all public methods of all classes in a given module.
|
|
35
|
+
|
|
36
|
+
# Parameters:
|
|
37
|
+
# - module: The module object containing the classes to patch.
|
|
38
|
+
# - module_name: The name of the module, used in the prefix for `wrap_function_wrapper`.
|
|
39
|
+
# - tracer: The tracer object used in `generic_patch`.
|
|
40
|
+
# - version: The version parameter used in `generic_patch`.
|
|
41
|
+
# - task: The name used to identify the type of task in `generic_patch`.
|
|
42
|
+
# - exclude_private: Whether to exclude private methods (those starting with '_').
|
|
43
|
+
# - trace_output: Whether to trace the output of the patched methods.
|
|
44
|
+
# - trace_input: Whether to trace the input of the patched methods.
|
|
45
|
+
# """
|
|
46
|
+
# # import the module
|
|
47
|
+
# module = importlib.import_module(module_name)
|
|
48
|
+
# # loop through all public classes in the module
|
|
49
|
+
# for name, obj in inspect.getmembers(
|
|
50
|
+
# module,
|
|
51
|
+
# lambda member: inspect.isclass(member) and member.__module__ == module.__name__,
|
|
52
|
+
# ):
|
|
53
|
+
# # loop through all public methods of the class
|
|
54
|
+
# for method_name, _ in inspect.getmembers(obj, predicate=inspect.isfunction):
|
|
55
|
+
# # Skip private methods
|
|
56
|
+
# if method_name.startswith("_"):
|
|
57
|
+
# continue
|
|
58
|
+
# try:
|
|
59
|
+
# method_path = f"{name}.{method_name}"
|
|
60
|
+
# wrap_function_wrapper(
|
|
61
|
+
# module_name,
|
|
62
|
+
# method_path,
|
|
63
|
+
# generic_patch(
|
|
64
|
+
# method_path, task, tracer, version, trace_output, trace_input
|
|
65
|
+
# ),
|
|
66
|
+
# )
|
|
67
|
+
# # pylint: disable=broad-except
|
|
68
|
+
# except Exception:
|
|
69
|
+
# pass
|
|
71
70
|
|
|
72
71
|
|
|
73
72
|
class LangchainInstrumentation(BaseInstrumentor):
|
|
@@ -83,14 +82,28 @@ class LangchainInstrumentation(BaseInstrumentor):
|
|
|
83
82
|
tracer = get_tracer(__name__, "", tracer_provider)
|
|
84
83
|
version = importlib.metadata.version("langchain")
|
|
85
84
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
85
|
+
wrap_function_wrapper(
|
|
86
|
+
"langchain.agents.agent",
|
|
87
|
+
"RunnableAgent.plan",
|
|
88
|
+
generic_patch(
|
|
89
|
+
"RunnableAgent.plan", "plan", tracer, version, True, True
|
|
90
|
+
),
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
wrap_function_wrapper(
|
|
94
|
+
"langchain.agents.agent",
|
|
95
|
+
"RunnableAgent.aplan",
|
|
96
|
+
generic_patch(
|
|
97
|
+
"RunnableAgent.aplan", "plan", tracer, version, True, True
|
|
98
|
+
),
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
# modules_to_patch = []
|
|
102
|
+
|
|
103
|
+
# for module_name, task, trace_output, trace_input in modules_to_patch:
|
|
104
|
+
# patch_module_classes(
|
|
105
|
+
# module_name, tracer, version, task, trace_output, trace_input
|
|
106
|
+
# )
|
|
94
107
|
|
|
95
108
|
def _uninstrument(self, **kwargs):
|
|
96
109
|
pass
|
|
@@ -29,6 +29,7 @@ from langtrace_python_sdk.constants.instrumentation.common import (
|
|
|
29
29
|
SERVICE_PROVIDERS,
|
|
30
30
|
)
|
|
31
31
|
from importlib_metadata import version as v
|
|
32
|
+
from langtrace_python_sdk.utils.misc import serialize_args, serialize_kwargs
|
|
32
33
|
|
|
33
34
|
|
|
34
35
|
def generic_patch(
|
|
@@ -52,8 +53,12 @@ def generic_patch(
|
|
|
52
53
|
**(extra_attributes if extra_attributes is not None else {}),
|
|
53
54
|
}
|
|
54
55
|
|
|
56
|
+
inputs = {}
|
|
55
57
|
if len(args) > 0 and trace_input:
|
|
56
|
-
|
|
58
|
+
inputs["args"] = serialize_args(*args)
|
|
59
|
+
if len(kwargs) > 0 and trace_input:
|
|
60
|
+
inputs["kwargs"] = serialize_kwargs(**kwargs)
|
|
61
|
+
span_attributes["langchain.inputs"] = json.dumps(inputs)
|
|
57
62
|
|
|
58
63
|
attributes = FrameworkSpanAttributes(**span_attributes)
|
|
59
64
|
|
|
@@ -42,6 +42,7 @@ from langtrace_python_sdk.instrumentation import (
|
|
|
42
42
|
ChromaInstrumentation,
|
|
43
43
|
CohereInstrumentation,
|
|
44
44
|
CrewAIInstrumentation,
|
|
45
|
+
EmbedchainInstrumentation,
|
|
45
46
|
GroqInstrumentation,
|
|
46
47
|
LangchainInstrumentation,
|
|
47
48
|
LangchainCommunityInstrumentation,
|
|
@@ -115,6 +116,7 @@ def init(
|
|
|
115
116
|
"pinecone": PineconeInstrumentation(),
|
|
116
117
|
"llamaindex": LlamaindexInstrumentation(),
|
|
117
118
|
"chroma": ChromaInstrumentation(),
|
|
119
|
+
"embedchain": EmbedchainInstrumentation(),
|
|
118
120
|
"qdrant": QdrantInstrumentation(),
|
|
119
121
|
"langchain": LangchainInstrumentation(),
|
|
120
122
|
"langchain_core": LangchainCoreInstrumentation(),
|
|
@@ -28,3 +28,35 @@ def to_iso_format(value):
|
|
|
28
28
|
else None
|
|
29
29
|
)
|
|
30
30
|
)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def serialize_kwargs(**kwargs):
|
|
34
|
+
# Function to check if a value is serializable
|
|
35
|
+
def is_serializable(value):
|
|
36
|
+
try:
|
|
37
|
+
json.dumps(value)
|
|
38
|
+
return True
|
|
39
|
+
except (TypeError, ValueError):
|
|
40
|
+
return False
|
|
41
|
+
|
|
42
|
+
# Filter out non-serializable items
|
|
43
|
+
serializable_kwargs = {k: v for k, v in kwargs.items() if is_serializable(v)}
|
|
44
|
+
|
|
45
|
+
# Convert to string representation
|
|
46
|
+
return json.dumps(serializable_kwargs)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def serialize_args(*args):
|
|
50
|
+
# Function to check if a value is serializable
|
|
51
|
+
def is_serializable(value):
|
|
52
|
+
try:
|
|
53
|
+
json.dumps(value)
|
|
54
|
+
return True
|
|
55
|
+
except (TypeError, ValueError):
|
|
56
|
+
return False
|
|
57
|
+
|
|
58
|
+
# Filter out non-serializable items
|
|
59
|
+
serializable_args = [arg for arg in args if is_serializable(arg)]
|
|
60
|
+
|
|
61
|
+
# Convert to string representation
|
|
62
|
+
return json.dumps(serializable_args)
|
langtrace_python_sdk/version.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
__version__ = "2.
|
|
1
|
+
__version__ = "2.3.1"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: langtrace-python-sdk
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.3.1
|
|
4
4
|
Summary: Python SDK for LangTrace
|
|
5
5
|
Project-URL: Homepage, https://github.com/Scale3-Labs/langtrace-python-sdk
|
|
6
6
|
Author-email: Scale3 Labs <engineering@scale3labs.com>
|
|
@@ -26,6 +26,7 @@ Provides-Extra: dev
|
|
|
26
26
|
Requires-Dist: anthropic; extra == 'dev'
|
|
27
27
|
Requires-Dist: chromadb; extra == 'dev'
|
|
28
28
|
Requires-Dist: cohere; extra == 'dev'
|
|
29
|
+
Requires-Dist: embedchain; extra == 'dev'
|
|
29
30
|
Requires-Dist: google-cloud-aiplatform; extra == 'dev'
|
|
30
31
|
Requires-Dist: google-generativeai; extra == 'dev'
|
|
31
32
|
Requires-Dist: groq; extra == 'dev'
|
|
@@ -302,6 +303,7 @@ Langtrace automatically captures traces from the following vendors:
|
|
|
302
303
|
| Ollama | Framework | :x: | :white_check_mark: |
|
|
303
304
|
| VertexAI | Framework | :x: | :white_check_mark: |
|
|
304
305
|
| Vercel AI SDK| Framework | :white_check_mark: | :x: |
|
|
306
|
+
| EmbedChain | Framework | :x: | :white_check_mark: |
|
|
305
307
|
| Pinecone | Vector Database | :white_check_mark: | :white_check_mark: |
|
|
306
308
|
| ChromaDB | Vector Database | :white_check_mark: | :white_check_mark: |
|
|
307
309
|
| QDrant | Vector Database | :white_check_mark: | :white_check_mark: |
|
|
@@ -12,8 +12,8 @@ examples/cohere_example/tools.py,sha256=a5uvS058tcwU6PJbF9EDO6LPVmPj2LoW4Vn8Web3
|
|
|
12
12
|
examples/crewai_example/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
13
13
|
examples/crewai_example/basic.py,sha256=PBu4f8yQfZO1L_22UDm_ReU9lnEcycjZcGuy5UpgDJM,1948
|
|
14
14
|
examples/crewai_example/simple_agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
15
|
-
examples/crewai_example/simple_agent/agents.py,sha256=
|
|
16
|
-
examples/crewai_example/simple_agent/main.py,sha256=
|
|
15
|
+
examples/crewai_example/simple_agent/agents.py,sha256=IkjRlRZJgrT7fBtth9sSO7OEEs3IAe-tmZey4omedeI,2318
|
|
16
|
+
examples/crewai_example/simple_agent/main.py,sha256=YXWizVK80DTYFYZAIxLwLlVPKTRhaxoNxbZsdOJQAPw,1340
|
|
17
17
|
examples/crewai_example/simple_agent/tasks.py,sha256=JG5kPc9uBkZIDJCp0j3eporf6gnrKG3GZR5edHoeoxw,832
|
|
18
18
|
examples/crewai_example/trip_planner/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
19
19
|
examples/crewai_example/trip_planner/agents.py,sha256=bSmtD83qcB3PF21zjqdvAYe0vVvl0nhGVXX5oPeSGY8,2371
|
|
@@ -26,6 +26,7 @@ examples/dspy_example/math_problems_cot_parallel.py,sha256=5clw-IIVA0mWm0N0xWNDM
|
|
|
26
26
|
examples/dspy_example/program_of_thought_basic.py,sha256=oEbtJdeKENMUbex25-zyStWwurRWW6OdP0KDs-jUkko,984
|
|
27
27
|
examples/dspy_example/quiz_gen.py,sha256=OyGhepeX8meKOtLdmlYUjMD2ECk-ZQuQXUZif1hFQY4,3371
|
|
28
28
|
examples/dspy_example/react.py,sha256=APAnHqgy9w-qY5jnPD_WbBx6bwo9C-DhPnUuhL-t7sg,1376
|
|
29
|
+
examples/embedchain_example/simple.py,sha256=1lwnsh5wVjGjQ18OinID6aJ_itR-x0TOngtNU1E-Emc,373
|
|
29
30
|
examples/fastapi_example/__init__.py,sha256=INIfvJP7zC_KkJCtulS1qbh61-MJTPAHnzAgzeKi0yU,87
|
|
30
31
|
examples/fastapi_example/basic_route.py,sha256=_IRXjkOtJQ-bTIGa1WbvUF_2LF4bjghjyXt4YrHaRvw,1170
|
|
31
32
|
examples/gemini_example/__init__.py,sha256=omVgLyIiLc3c0zwy3vTtYKdeenYEXzEbLZsYiPEvJT4,81
|
|
@@ -78,15 +79,16 @@ examples/vertexai_example/main.py,sha256=gndId5X5ksD-ycxnAWMdEqIDbLc3kz5Vt8vm4YP
|
|
|
78
79
|
examples/weaviate_example/__init__.py,sha256=8JMDBsRSEV10HfTd-YC7xb4txBjD3la56snk-Bbg2Kw,618
|
|
79
80
|
examples/weaviate_example/query_text.py,sha256=wPHQTc_58kPoKTZMygVjTj-2ZcdrIuaausJfMxNQnQc,127162
|
|
80
81
|
langtrace_python_sdk/__init__.py,sha256=VZM6i71NR7pBQK6XvJWRelknuTYUhqwqE7PlicKa5Wg,1166
|
|
81
|
-
langtrace_python_sdk/langtrace.py,sha256=
|
|
82
|
-
langtrace_python_sdk/version.py,sha256=
|
|
82
|
+
langtrace_python_sdk/langtrace.py,sha256=QNqnla5gQhWLDS6-kXPGV-MnqNDp0BQ4zdbkWI8sC50,8290
|
|
83
|
+
langtrace_python_sdk/version.py,sha256=neZxeMmEfjhVZM6xetRikrBdHWt5T5ehL72ZYdPtJ-E,22
|
|
83
84
|
langtrace_python_sdk/constants/__init__.py,sha256=P8QvYwt5czUNDZsKS64vxm9Dc41ptGbuF1TFtAF6nv4,44
|
|
84
85
|
langtrace_python_sdk/constants/exporter/langtrace_exporter.py,sha256=5MNjnAOg-4am78J3gVMH6FSwq5N8TOj72ugkhsw4vi0,46
|
|
85
86
|
langtrace_python_sdk/constants/instrumentation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
86
87
|
langtrace_python_sdk/constants/instrumentation/anthropic.py,sha256=YX3llt3zwDY6XrYk3CB8WEVqgrzRXEw_ffyk56JoF3k,126
|
|
87
88
|
langtrace_python_sdk/constants/instrumentation/chroma.py,sha256=hiPGYdHS0Yj4Kh3eaYBbuCAl_swqIygu80yFqkOgdak,955
|
|
88
89
|
langtrace_python_sdk/constants/instrumentation/cohere.py,sha256=tf9sDfb5K3qOAHChEE5o8eYWPZ1io58VsOjZDCZPxfw,577
|
|
89
|
-
langtrace_python_sdk/constants/instrumentation/common.py,sha256=
|
|
90
|
+
langtrace_python_sdk/constants/instrumentation/common.py,sha256=dbqpfFpkchXn5aNQp07N5emNvsJHiyT6OZA7wIsg4T8,993
|
|
91
|
+
langtrace_python_sdk/constants/instrumentation/embedchain.py,sha256=HodCJvaFjILoOG50OwFObxfVxt_8VUaIAIqvgoN3tzo,278
|
|
90
92
|
langtrace_python_sdk/constants/instrumentation/gemini.py,sha256=UAmfgg9FM7uNeOCdPfWlir6OIH-8BoxFGPRpdBd9ZZs,358
|
|
91
93
|
langtrace_python_sdk/constants/instrumentation/groq.py,sha256=VFXmIl4aqGY_fS0PAmjPj_Qm7Tibxbx7Ur_e7rQpqXc,134
|
|
92
94
|
langtrace_python_sdk/constants/instrumentation/mistral.py,sha256=9PlmcC5P5_BHJ-zsX1xekht6rSm7arTin58HAfdYvLk,730
|
|
@@ -99,22 +101,25 @@ langtrace_python_sdk/constants/instrumentation/weaviate.py,sha256=gtv-JBxvNGClEM
|
|
|
99
101
|
langtrace_python_sdk/extensions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
100
102
|
langtrace_python_sdk/extensions/langtrace_exporter.py,sha256=2ausFBC9JIitnpu1yECPCL0SXg_IvJTQL0MMsuidTo4,4700
|
|
101
103
|
langtrace_python_sdk/extensions/langtrace_filesystem.py,sha256=34fZutG28EJ66l67OvTGsydAH3ZpXgikdE7hVLqBpG4,7863
|
|
102
|
-
langtrace_python_sdk/instrumentation/__init__.py,sha256=
|
|
104
|
+
langtrace_python_sdk/instrumentation/__init__.py,sha256=bkyxh6lq_6dgCdbBseFQEbejRTLZv4s9nLBfNSqL6lk,1548
|
|
103
105
|
langtrace_python_sdk/instrumentation/anthropic/__init__.py,sha256=donrurJAGYlxrSRA3BIf76jGeUcAx9Tq8CVpah68S0Y,101
|
|
104
106
|
langtrace_python_sdk/instrumentation/anthropic/instrumentation.py,sha256=-srgE8qumAn0ulQYZxMa8ch-9IBH0XgBW_rfEnGk6LI,1684
|
|
105
107
|
langtrace_python_sdk/instrumentation/anthropic/patch.py,sha256=i_94sJXURVgKIUVKJ3mMqZydWtlv5BlIRqQEk8utrL4,4546
|
|
106
108
|
langtrace_python_sdk/instrumentation/chroma/__init__.py,sha256=pNZ5UO8Q-d5VkXSobBf79reB6AmEl_usnnTp5Itv818,95
|
|
107
109
|
langtrace_python_sdk/instrumentation/chroma/instrumentation.py,sha256=nT6PS6bsrIOO9kLV5GuUeRjMe6THHHAZGvqWBP1dYog,1807
|
|
108
|
-
langtrace_python_sdk/instrumentation/chroma/patch.py,sha256=
|
|
110
|
+
langtrace_python_sdk/instrumentation/chroma/patch.py,sha256=jYcqBeu-0cYA29PO880oXYRwYh-R1oseXmzfK6UDBps,9074
|
|
109
111
|
langtrace_python_sdk/instrumentation/cohere/__init__.py,sha256=sGUSLdTUyYf36Tm6L5jQflhzCqvmWrhnBOMYHjvp6Hs,95
|
|
110
112
|
langtrace_python_sdk/instrumentation/cohere/instrumentation.py,sha256=YQFHZIBd7SSPD4b6Va-ZR0thf_AuBCqj5yzHLHJVWnM,2121
|
|
111
113
|
langtrace_python_sdk/instrumentation/cohere/patch.py,sha256=Yb0OwxO4gG-WBfGhTFrwUUJEgpnRlyWI_FZveA4T1QU,20972
|
|
112
114
|
langtrace_python_sdk/instrumentation/crewai/__init__.py,sha256=_UBKfvQv7l0g2_wnmA5F6CdSAFH0atNOVPd49zsN3aM,88
|
|
113
|
-
langtrace_python_sdk/instrumentation/crewai/instrumentation.py,sha256=
|
|
114
|
-
langtrace_python_sdk/instrumentation/crewai/patch.py,sha256=
|
|
115
|
+
langtrace_python_sdk/instrumentation/crewai/instrumentation.py,sha256=c7C20ihkIcmuj3vmphCOl50Mj3U9MgCuyOj91wNxHt0,2447
|
|
116
|
+
langtrace_python_sdk/instrumentation/crewai/patch.py,sha256=fLGRTDS9LfuyGwJ6wWZBjCfkKJmJhAu5VcDkPlSjR4o,8404
|
|
115
117
|
langtrace_python_sdk/instrumentation/dspy/__init__.py,sha256=tM1srfi_QgyCzrde4izojMrRq2Wm7Dj5QUvVQXIJzkk,84
|
|
116
118
|
langtrace_python_sdk/instrumentation/dspy/instrumentation.py,sha256=o8URiDvCbZ8LL0I-4xKHkn_Ms2sETBRpn-gOliv3xzQ,2929
|
|
117
119
|
langtrace_python_sdk/instrumentation/dspy/patch.py,sha256=E2P3MJBQ71or4M6BsvZOwYFtJK1UdTsYkdxVj9fSWPs,9869
|
|
120
|
+
langtrace_python_sdk/instrumentation/embedchain/__init__.py,sha256=5L6n8-brMnRWZ0CMmHEuN1mrhIxrYLNtxRy0Ujc-hOY,103
|
|
121
|
+
langtrace_python_sdk/instrumentation/embedchain/instrumentation.py,sha256=dShwm0duy25IvL7g9I_v-2oYuyh2fadeiJqXtXBay-8,1987
|
|
122
|
+
langtrace_python_sdk/instrumentation/embedchain/patch.py,sha256=ovvBrtqUDwGSmSgK_S3pOOrDa4gkPSFG-HvmsxqmJE8,3627
|
|
118
123
|
langtrace_python_sdk/instrumentation/gemini/__init__.py,sha256=ilWmKA4Li-g3DX6R10WQ4v-51VljxToEnJpOQoQB5uQ,88
|
|
119
124
|
langtrace_python_sdk/instrumentation/gemini/instrumentation.py,sha256=eGWr2dy1f_9TVZiXSH_MlNQINyS4I28EsOTKREdMVio,1304
|
|
120
125
|
langtrace_python_sdk/instrumentation/gemini/patch.py,sha256=Zedp4bZH3-45LOaieSGyoTffgWJjqLs1YCDwM53v2CI,6228
|
|
@@ -122,13 +127,13 @@ langtrace_python_sdk/instrumentation/groq/__init__.py,sha256=ZXeq_nrej6Lm_uoMFEg
|
|
|
122
127
|
langtrace_python_sdk/instrumentation/groq/instrumentation.py,sha256=Ttf07XVKhdYY1_fqJc7QWiSdmgEhEVyQB_3Az2_wqYo,1832
|
|
123
128
|
langtrace_python_sdk/instrumentation/groq/patch.py,sha256=SmpsNVQyRcsvdh2fCKHsQ-EWsauMV972s99hznuNOjk,23504
|
|
124
129
|
langtrace_python_sdk/instrumentation/langchain/__init__.py,sha256=-7ZkqQFu64F-cxSFd1ZPrciODKqmUIyUbQQ-eHuQPyM,101
|
|
125
|
-
langtrace_python_sdk/instrumentation/langchain/instrumentation.py,sha256=
|
|
126
|
-
langtrace_python_sdk/instrumentation/langchain/patch.py,sha256=
|
|
130
|
+
langtrace_python_sdk/instrumentation/langchain/instrumentation.py,sha256=Q7rnpB8wlnG2V7KbHWxnNKAKD02ra8sm_q6pr-OPM60,3921
|
|
131
|
+
langtrace_python_sdk/instrumentation/langchain/patch.py,sha256=sjmY-Ciu6G-qRV_mHJ2HFWqbEWXnA75GH_WFK_d_p6o,4410
|
|
127
132
|
langtrace_python_sdk/instrumentation/langchain_community/__init__.py,sha256=mj5RR_cfkjMql7W9OyyhmviT2GZ-4Pv9XJfGwJufp_E,119
|
|
128
133
|
langtrace_python_sdk/instrumentation/langchain_community/instrumentation.py,sha256=TmMRXcaiMR99Qg7r7pT1XunCr_GOQl_Csr6leSKYyTQ,5350
|
|
129
134
|
langtrace_python_sdk/instrumentation/langchain_community/patch.py,sha256=fn-FBbu56ko7XSer0dDdQtIaXcsdZ7L_il_YjnAdL8I,5817
|
|
130
135
|
langtrace_python_sdk/instrumentation/langchain_core/__init__.py,sha256=kumE_reeqgM-ZvEZ6-XxyT-F-HAdKq_v_PKvsLb4EZQ,110
|
|
131
|
-
langtrace_python_sdk/instrumentation/langchain_core/instrumentation.py,sha256=
|
|
136
|
+
langtrace_python_sdk/instrumentation/langchain_core/instrumentation.py,sha256=0Sh-CBXeeMYpK05rS33kCmyjRe6xHuqnbLcBlXpj46I,6342
|
|
132
137
|
langtrace_python_sdk/instrumentation/langchain_core/patch.py,sha256=fNoGSM9Ui1O--5hv6T6Tw1fuWw7IfFVC_7kQL0qERec,10529
|
|
133
138
|
langtrace_python_sdk/instrumentation/langgraph/__init__.py,sha256=eitlHloY-aZ4ZuIEJx61AadEA3G7siyecP-V-lziAr8,101
|
|
134
139
|
langtrace_python_sdk/instrumentation/langgraph/instrumentation.py,sha256=SUZZhWSIbcfsF1S5NtEqW8QzkRM_pKAuXB7pwk5tsOU,2526
|
|
@@ -161,7 +166,7 @@ langtrace_python_sdk/types/__init__.py,sha256=MeGkmoy2OY3V21GErDIdlf_N8Aj7HDld5T
|
|
|
161
166
|
langtrace_python_sdk/utils/__init__.py,sha256=giTHkvDOQdqFqXU4PoGP7DhA9tAteZN-KxX3mEUg6QQ,893
|
|
162
167
|
langtrace_python_sdk/utils/langtrace_sampler.py,sha256=BupNndHbU9IL_wGleKetz8FdcveqHMBVz1bfKTTW80w,1753
|
|
163
168
|
langtrace_python_sdk/utils/llm.py,sha256=7-b3r7NM2WeiVycIy0nmSer9aaVs9x3mIvTGyL7dWps,14590
|
|
164
|
-
langtrace_python_sdk/utils/misc.py,sha256=
|
|
169
|
+
langtrace_python_sdk/utils/misc.py,sha256=7PRJ45BwuwJ6fPAdy1OpBau8QERR2aWaVvzDvZ7JTkE,1729
|
|
165
170
|
langtrace_python_sdk/utils/prompt_registry.py,sha256=n5dQMVLBw8aJZY8Utvf67bncc25ELf6AH9BYw8_hSzo,2619
|
|
166
171
|
langtrace_python_sdk/utils/sdk_version_checker.py,sha256=FzjIWZjn53cX0LEVPdipQd1fO9lG8iGVUEVUs9Hyk6M,1713
|
|
167
172
|
langtrace_python_sdk/utils/silently_fail.py,sha256=F_9EteXCO9Cyq-8MA1OT2Zy_dx8n06nt31I7t7ui24E,478
|
|
@@ -209,8 +214,8 @@ tests/pinecone/cassettes/test_query.yaml,sha256=b5v9G3ssUy00oG63PlFUR3JErF2Js-5A
|
|
|
209
214
|
tests/pinecone/cassettes/test_upsert.yaml,sha256=neWmQ1v3d03V8WoLl8FoFeeCYImb8pxlJBWnFd_lITU,38607
|
|
210
215
|
tests/qdrant/conftest.py,sha256=9n0uHxxIjWk9fbYc4bx-uP8lSAgLBVx-cV9UjnsyCHM,381
|
|
211
216
|
tests/qdrant/test_qdrant.py,sha256=pzjAjVY2kmsmGfrI2Gs2xrolfuaNHz7l1fqGQCjp5_o,3353
|
|
212
|
-
langtrace_python_sdk-2.
|
|
213
|
-
langtrace_python_sdk-2.
|
|
214
|
-
langtrace_python_sdk-2.
|
|
215
|
-
langtrace_python_sdk-2.
|
|
216
|
-
langtrace_python_sdk-2.
|
|
217
|
+
langtrace_python_sdk-2.3.1.dist-info/METADATA,sha256=0Fw1oqbrCzau9d3ug7HFvm2D0tyBRW1OmsDroFDey9U,15011
|
|
218
|
+
langtrace_python_sdk-2.3.1.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
|
|
219
|
+
langtrace_python_sdk-2.3.1.dist-info/entry_points.txt,sha256=1_b9-qvf2fE7uQNZcbUei9vLpFZBbbh9LrtGw95ssAo,70
|
|
220
|
+
langtrace_python_sdk-2.3.1.dist-info/licenses/LICENSE,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
|
|
221
|
+
langtrace_python_sdk-2.3.1.dist-info/RECORD,,
|
|
File without changes
|
{langtrace_python_sdk-2.2.31.dist-info → langtrace_python_sdk-2.3.1.dist-info}/entry_points.txt
RENAMED
|
File without changes
|
{langtrace_python_sdk-2.2.31.dist-info → langtrace_python_sdk-2.3.1.dist-info}/licenses/LICENSE
RENAMED
|
File without changes
|