langtrace-python-sdk 2.3.0__py3-none-any.whl → 2.3.2__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/main.py +4 -4
- langtrace_python_sdk/extensions/langtrace_exporter.py +47 -9
- langtrace_python_sdk/instrumentation/crewai/instrumentation.py +18 -2
- langtrace_python_sdk/instrumentation/crewai/patch.py +58 -83
- langtrace_python_sdk/instrumentation/embedchain/patch.py +5 -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 +10 -2
- langtrace_python_sdk/utils/misc.py +32 -0
- langtrace_python_sdk/version.py +1 -1
- {langtrace_python_sdk-2.3.0.dist-info → langtrace_python_sdk-2.3.2.dist-info}/METADATA +1 -1
- {langtrace_python_sdk-2.3.0.dist-info → langtrace_python_sdk-2.3.2.dist-info}/RECORD +16 -16
- {langtrace_python_sdk-2.3.0.dist-info → langtrace_python_sdk-2.3.2.dist-info}/WHEEL +0 -0
- {langtrace_python_sdk-2.3.0.dist-info → langtrace_python_sdk-2.3.2.dist-info}/entry_points.txt +0 -0
- {langtrace_python_sdk-2.3.0.dist-info → langtrace_python_sdk-2.3.2.dist-info}/licenses/LICENSE +0 -0
|
@@ -18,12 +18,12 @@ class PoetryCrew:
|
|
|
18
18
|
tasks = PoetryTasks()
|
|
19
19
|
|
|
20
20
|
poetry_agent = agents.create_poet_agent()
|
|
21
|
-
poetry_agent_2 = agents.poet_agent_2()
|
|
22
|
-
poetry_agent_3 = agents.poet_agent_3()
|
|
21
|
+
# poetry_agent_2 = agents.poet_agent_2()
|
|
22
|
+
# poetry_agent_3 = agents.poet_agent_3()
|
|
23
23
|
|
|
24
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)
|
|
25
|
+
# create_poem_2 = tasks.create_poem(poetry_agent_2, self.topic)
|
|
26
|
+
# create_poem_3 = tasks.create_poem(poetry_agent_3, self.topic)
|
|
27
27
|
|
|
28
28
|
crew = Crew(agents=[poetry_agent], tasks=[create_poem], verbose=True, memory=True)
|
|
29
29
|
res = crew.kickoff()
|
|
@@ -76,7 +76,29 @@ class LangTraceExporter(SpanExporter):
|
|
|
76
76
|
Returns:
|
|
77
77
|
The result of the export SUCCESS or FAILURE
|
|
78
78
|
"""
|
|
79
|
-
|
|
79
|
+
headers = {
|
|
80
|
+
"Content-Type": "application/json",
|
|
81
|
+
"x-api-key": self.api_key,
|
|
82
|
+
"User-Agent": "LangtraceExporter",
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
# Check if the OTEL_EXPORTER_OTLP_HEADERS environment variable is set
|
|
86
|
+
otel_headers = os.getenv("OTEL_EXPORTER_OTLP_HEADERS", None)
|
|
87
|
+
if otel_headers:
|
|
88
|
+
# Parse and add to headers
|
|
89
|
+
for header in otel_headers.split(","):
|
|
90
|
+
key, value = header.split("=")
|
|
91
|
+
headers[key.strip()] = value.strip()
|
|
92
|
+
|
|
93
|
+
# Check if the OTEL_EXPORTER_OTLP_TRACES_HEADERS environment variable is set
|
|
94
|
+
otel_traces_headers = os.getenv("OTEL_EXPORTER_OTLP_TRACES_HEADERS", None)
|
|
95
|
+
if otel_traces_headers:
|
|
96
|
+
# Parse and add to headers
|
|
97
|
+
for header in otel_traces_headers.split(","):
|
|
98
|
+
key, value = header.split("=")
|
|
99
|
+
headers[key.strip()] = value.strip()
|
|
100
|
+
|
|
101
|
+
if not headers["x-api-key"] and not self.disable_logging:
|
|
80
102
|
print(Fore.RED)
|
|
81
103
|
print(
|
|
82
104
|
"Missing Langtrace API key, proceed to https://langtrace.ai to create one"
|
|
@@ -101,11 +123,7 @@ class LangTraceExporter(SpanExporter):
|
|
|
101
123
|
response = requests.post(
|
|
102
124
|
url=f"{self.api_host}",
|
|
103
125
|
data=json.dumps(data),
|
|
104
|
-
headers=
|
|
105
|
-
"Content-Type": "application/json",
|
|
106
|
-
"x-api-key": self.api_key,
|
|
107
|
-
"User-Agent": "LangtraceExporter",
|
|
108
|
-
},
|
|
126
|
+
headers=headers,
|
|
109
127
|
timeout=20,
|
|
110
128
|
)
|
|
111
129
|
|
|
@@ -113,14 +131,34 @@ class LangTraceExporter(SpanExporter):
|
|
|
113
131
|
raise RequestException(response.text)
|
|
114
132
|
if not self.disable_logging:
|
|
115
133
|
print(
|
|
116
|
-
Fore.GREEN
|
|
134
|
+
Fore.GREEN
|
|
135
|
+
+ f"Exported {len(spans)} spans successfully."
|
|
136
|
+
+ Fore.RESET
|
|
117
137
|
)
|
|
118
138
|
return SpanExportResult.SUCCESS
|
|
119
139
|
except RequestException as err:
|
|
120
140
|
if not self.disable_logging:
|
|
121
141
|
print(Fore.RED + "Failed to export spans.")
|
|
122
|
-
print(Fore.RED + f"Error: {err}" + Fore.RESET)
|
|
142
|
+
print(Fore.RED + f"Error: {err}\r\n" + Fore.RESET)
|
|
143
|
+
if (
|
|
144
|
+
"invalid api key" in str(err).lower()
|
|
145
|
+
and self.api_host == f"{LANGTRACE_REMOTE_URL}/api/trace"
|
|
146
|
+
):
|
|
147
|
+
print(
|
|
148
|
+
Fore.YELLOW
|
|
149
|
+
+ "If you're self-hosting Langtrace, make sure to do one of the following to configure your trace endpoint (e.g., http://localhost:3000/api/trace):"
|
|
150
|
+
+ Fore.YELLOW
|
|
151
|
+
)
|
|
152
|
+
print(
|
|
153
|
+
Fore.YELLOW
|
|
154
|
+
+ "1. Set the `LANGTRACE_API_HOST` environment variable, or\r\n2. Pass the `api_host` parameter to the `langtrace.init()` method.\r\n"
|
|
155
|
+
+ Fore.YELLOW
|
|
156
|
+
)
|
|
123
157
|
return SpanExportResult.FAILURE
|
|
124
158
|
|
|
125
159
|
def shutdown(self) -> None:
|
|
126
|
-
print(
|
|
160
|
+
print(
|
|
161
|
+
Fore.WHITE
|
|
162
|
+
+ "⭐ Leave our github a star to stay on top of our updates - https://github.com/Scale3-Labs/langtrace"
|
|
163
|
+
+ Fore.RESET
|
|
164
|
+
)
|
|
@@ -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):
|
|
@@ -161,25 +135,26 @@ class CrewAISpanAttributes:
|
|
|
161
135
|
instance_name = self.instance.__class__.__name__
|
|
162
136
|
if instance_name == "Crew":
|
|
163
137
|
self.set_crew_attributes()
|
|
164
|
-
|
|
138
|
+
for key, value in self.crew.items():
|
|
139
|
+
key = f"crewai.crew.{key}"
|
|
140
|
+
set_span_attribute(self.span, key, value)
|
|
165
141
|
|
|
166
142
|
elif instance_name == "Agent":
|
|
167
143
|
agent = self.set_agent_attributes()
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
144
|
+
for key, value in agent.items():
|
|
145
|
+
key = f"crewai.agent.{key}"
|
|
146
|
+
set_span_attribute(self.span, key, value)
|
|
147
|
+
|
|
171
148
|
elif instance_name == "Task":
|
|
172
149
|
task = self.set_task_attributes()
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
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)
|
|
177
153
|
|
|
178
154
|
def set_crew_attributes(self):
|
|
179
155
|
for key, value in self.instance.__dict__.items():
|
|
180
156
|
if key == "tasks":
|
|
181
157
|
self._parse_tasks(value)
|
|
182
|
-
|
|
183
158
|
elif key == "agents":
|
|
184
159
|
self._parse_agents(value)
|
|
185
160
|
else:
|
|
@@ -52,6 +52,11 @@ def generic_patch(method, version, tracer):
|
|
|
52
52
|
**(extra_attributes if extra_attributes is not None else {}),
|
|
53
53
|
}
|
|
54
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
|
+
|
|
55
60
|
if len(args) > 0:
|
|
56
61
|
span_attributes["embedchain.inputs"] = json.dumps(args)
|
|
57
62
|
|
|
@@ -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
|
|
|
@@ -80,11 +80,19 @@ def init(
|
|
|
80
80
|
sys.stdout = open(os.devnull, "w")
|
|
81
81
|
|
|
82
82
|
host = (
|
|
83
|
-
os.environ.get("LANGTRACE_API_HOST", None)
|
|
83
|
+
os.environ.get("LANGTRACE_API_HOST", None)
|
|
84
|
+
or os.environ.get("OTEL_EXPORTER_OTLP_TRACES_ENDPOINT", None)
|
|
85
|
+
or os.environ.get("OTEL_EXPORTER_OTLP_ENDPOINT", None)
|
|
86
|
+
or api_host
|
|
87
|
+
or LANGTRACE_REMOTE_URL
|
|
84
88
|
)
|
|
85
89
|
check_if_sdk_is_outdated()
|
|
86
90
|
print(Fore.GREEN + "Initializing Langtrace SDK.." + Fore.RESET)
|
|
87
|
-
print(
|
|
91
|
+
print(
|
|
92
|
+
Fore.WHITE
|
|
93
|
+
+ "⭐ Leave our github a star to stay on top of our updates - https://github.com/Scale3-Labs/langtrace"
|
|
94
|
+
+ Fore.RESET
|
|
95
|
+
)
|
|
88
96
|
sampler = LangtraceSampler(disabled_methods=disable_tracing_for_functions)
|
|
89
97
|
resource = Resource.create(
|
|
90
98
|
attributes={
|
|
@@ -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.3.
|
|
1
|
+
__version__ = "2.3.2"
|
|
@@ -13,7 +13,7 @@ examples/crewai_example/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG
|
|
|
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
15
|
examples/crewai_example/simple_agent/agents.py,sha256=IkjRlRZJgrT7fBtth9sSO7OEEs3IAe-tmZey4omedeI,2318
|
|
16
|
-
examples/crewai_example/simple_agent/main.py,sha256=
|
|
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
|
|
@@ -79,8 +79,8 @@ examples/vertexai_example/main.py,sha256=gndId5X5ksD-ycxnAWMdEqIDbLc3kz5Vt8vm4YP
|
|
|
79
79
|
examples/weaviate_example/__init__.py,sha256=8JMDBsRSEV10HfTd-YC7xb4txBjD3la56snk-Bbg2Kw,618
|
|
80
80
|
examples/weaviate_example/query_text.py,sha256=wPHQTc_58kPoKTZMygVjTj-2ZcdrIuaausJfMxNQnQc,127162
|
|
81
81
|
langtrace_python_sdk/__init__.py,sha256=VZM6i71NR7pBQK6XvJWRelknuTYUhqwqE7PlicKa5Wg,1166
|
|
82
|
-
langtrace_python_sdk/langtrace.py,sha256=
|
|
83
|
-
langtrace_python_sdk/version.py,sha256=
|
|
82
|
+
langtrace_python_sdk/langtrace.py,sha256=vtV_sRQfdpdzk4pS2TLZwnsHTpf02kH7peEGyoaumvI,8469
|
|
83
|
+
langtrace_python_sdk/version.py,sha256=J4CRnpR3v72FGOMp8gqSua_XWZpAfXuqgVWiQFB-gTY,22
|
|
84
84
|
langtrace_python_sdk/constants/__init__.py,sha256=P8QvYwt5czUNDZsKS64vxm9Dc41ptGbuF1TFtAF6nv4,44
|
|
85
85
|
langtrace_python_sdk/constants/exporter/langtrace_exporter.py,sha256=5MNjnAOg-4am78J3gVMH6FSwq5N8TOj72ugkhsw4vi0,46
|
|
86
86
|
langtrace_python_sdk/constants/instrumentation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -99,7 +99,7 @@ langtrace_python_sdk/constants/instrumentation/qdrant.py,sha256=yL7BopNQTXW7L7Z-
|
|
|
99
99
|
langtrace_python_sdk/constants/instrumentation/vertexai.py,sha256=0s2vX3Y0iwjOPkUg5lAKi-7o3LaNivDSBBbF-o695Ok,1266
|
|
100
100
|
langtrace_python_sdk/constants/instrumentation/weaviate.py,sha256=gtv-JBxvNGClEMxClmRKzjJ1khgOonsli4D_k9IagSE,2601
|
|
101
101
|
langtrace_python_sdk/extensions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
102
|
-
langtrace_python_sdk/extensions/langtrace_exporter.py,sha256=
|
|
102
|
+
langtrace_python_sdk/extensions/langtrace_exporter.py,sha256=nbDFxDsDRjpi7otiHHnQ3Z9_LYqLCgxdtP4IWnnOuyI,6307
|
|
103
103
|
langtrace_python_sdk/extensions/langtrace_filesystem.py,sha256=34fZutG28EJ66l67OvTGsydAH3ZpXgikdE7hVLqBpG4,7863
|
|
104
104
|
langtrace_python_sdk/instrumentation/__init__.py,sha256=bkyxh6lq_6dgCdbBseFQEbejRTLZv4s9nLBfNSqL6lk,1548
|
|
105
105
|
langtrace_python_sdk/instrumentation/anthropic/__init__.py,sha256=donrurJAGYlxrSRA3BIf76jGeUcAx9Tq8CVpah68S0Y,101
|
|
@@ -112,14 +112,14 @@ langtrace_python_sdk/instrumentation/cohere/__init__.py,sha256=sGUSLdTUyYf36Tm6L
|
|
|
112
112
|
langtrace_python_sdk/instrumentation/cohere/instrumentation.py,sha256=YQFHZIBd7SSPD4b6Va-ZR0thf_AuBCqj5yzHLHJVWnM,2121
|
|
113
113
|
langtrace_python_sdk/instrumentation/cohere/patch.py,sha256=Yb0OwxO4gG-WBfGhTFrwUUJEgpnRlyWI_FZveA4T1QU,20972
|
|
114
114
|
langtrace_python_sdk/instrumentation/crewai/__init__.py,sha256=_UBKfvQv7l0g2_wnmA5F6CdSAFH0atNOVPd49zsN3aM,88
|
|
115
|
-
langtrace_python_sdk/instrumentation/crewai/instrumentation.py,sha256=
|
|
116
|
-
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
|
|
117
117
|
langtrace_python_sdk/instrumentation/dspy/__init__.py,sha256=tM1srfi_QgyCzrde4izojMrRq2Wm7Dj5QUvVQXIJzkk,84
|
|
118
118
|
langtrace_python_sdk/instrumentation/dspy/instrumentation.py,sha256=o8URiDvCbZ8LL0I-4xKHkn_Ms2sETBRpn-gOliv3xzQ,2929
|
|
119
119
|
langtrace_python_sdk/instrumentation/dspy/patch.py,sha256=E2P3MJBQ71or4M6BsvZOwYFtJK1UdTsYkdxVj9fSWPs,9869
|
|
120
120
|
langtrace_python_sdk/instrumentation/embedchain/__init__.py,sha256=5L6n8-brMnRWZ0CMmHEuN1mrhIxrYLNtxRy0Ujc-hOY,103
|
|
121
121
|
langtrace_python_sdk/instrumentation/embedchain/instrumentation.py,sha256=dShwm0duy25IvL7g9I_v-2oYuyh2fadeiJqXtXBay-8,1987
|
|
122
|
-
langtrace_python_sdk/instrumentation/embedchain/patch.py,sha256=
|
|
122
|
+
langtrace_python_sdk/instrumentation/embedchain/patch.py,sha256=ovvBrtqUDwGSmSgK_S3pOOrDa4gkPSFG-HvmsxqmJE8,3627
|
|
123
123
|
langtrace_python_sdk/instrumentation/gemini/__init__.py,sha256=ilWmKA4Li-g3DX6R10WQ4v-51VljxToEnJpOQoQB5uQ,88
|
|
124
124
|
langtrace_python_sdk/instrumentation/gemini/instrumentation.py,sha256=eGWr2dy1f_9TVZiXSH_MlNQINyS4I28EsOTKREdMVio,1304
|
|
125
125
|
langtrace_python_sdk/instrumentation/gemini/patch.py,sha256=Zedp4bZH3-45LOaieSGyoTffgWJjqLs1YCDwM53v2CI,6228
|
|
@@ -127,13 +127,13 @@ langtrace_python_sdk/instrumentation/groq/__init__.py,sha256=ZXeq_nrej6Lm_uoMFEg
|
|
|
127
127
|
langtrace_python_sdk/instrumentation/groq/instrumentation.py,sha256=Ttf07XVKhdYY1_fqJc7QWiSdmgEhEVyQB_3Az2_wqYo,1832
|
|
128
128
|
langtrace_python_sdk/instrumentation/groq/patch.py,sha256=SmpsNVQyRcsvdh2fCKHsQ-EWsauMV972s99hznuNOjk,23504
|
|
129
129
|
langtrace_python_sdk/instrumentation/langchain/__init__.py,sha256=-7ZkqQFu64F-cxSFd1ZPrciODKqmUIyUbQQ-eHuQPyM,101
|
|
130
|
-
langtrace_python_sdk/instrumentation/langchain/instrumentation.py,sha256=
|
|
131
|
-
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
|
|
132
132
|
langtrace_python_sdk/instrumentation/langchain_community/__init__.py,sha256=mj5RR_cfkjMql7W9OyyhmviT2GZ-4Pv9XJfGwJufp_E,119
|
|
133
133
|
langtrace_python_sdk/instrumentation/langchain_community/instrumentation.py,sha256=TmMRXcaiMR99Qg7r7pT1XunCr_GOQl_Csr6leSKYyTQ,5350
|
|
134
134
|
langtrace_python_sdk/instrumentation/langchain_community/patch.py,sha256=fn-FBbu56ko7XSer0dDdQtIaXcsdZ7L_il_YjnAdL8I,5817
|
|
135
135
|
langtrace_python_sdk/instrumentation/langchain_core/__init__.py,sha256=kumE_reeqgM-ZvEZ6-XxyT-F-HAdKq_v_PKvsLb4EZQ,110
|
|
136
|
-
langtrace_python_sdk/instrumentation/langchain_core/instrumentation.py,sha256=
|
|
136
|
+
langtrace_python_sdk/instrumentation/langchain_core/instrumentation.py,sha256=0Sh-CBXeeMYpK05rS33kCmyjRe6xHuqnbLcBlXpj46I,6342
|
|
137
137
|
langtrace_python_sdk/instrumentation/langchain_core/patch.py,sha256=fNoGSM9Ui1O--5hv6T6Tw1fuWw7IfFVC_7kQL0qERec,10529
|
|
138
138
|
langtrace_python_sdk/instrumentation/langgraph/__init__.py,sha256=eitlHloY-aZ4ZuIEJx61AadEA3G7siyecP-V-lziAr8,101
|
|
139
139
|
langtrace_python_sdk/instrumentation/langgraph/instrumentation.py,sha256=SUZZhWSIbcfsF1S5NtEqW8QzkRM_pKAuXB7pwk5tsOU,2526
|
|
@@ -166,7 +166,7 @@ langtrace_python_sdk/types/__init__.py,sha256=MeGkmoy2OY3V21GErDIdlf_N8Aj7HDld5T
|
|
|
166
166
|
langtrace_python_sdk/utils/__init__.py,sha256=giTHkvDOQdqFqXU4PoGP7DhA9tAteZN-KxX3mEUg6QQ,893
|
|
167
167
|
langtrace_python_sdk/utils/langtrace_sampler.py,sha256=BupNndHbU9IL_wGleKetz8FdcveqHMBVz1bfKTTW80w,1753
|
|
168
168
|
langtrace_python_sdk/utils/llm.py,sha256=7-b3r7NM2WeiVycIy0nmSer9aaVs9x3mIvTGyL7dWps,14590
|
|
169
|
-
langtrace_python_sdk/utils/misc.py,sha256=
|
|
169
|
+
langtrace_python_sdk/utils/misc.py,sha256=7PRJ45BwuwJ6fPAdy1OpBau8QERR2aWaVvzDvZ7JTkE,1729
|
|
170
170
|
langtrace_python_sdk/utils/prompt_registry.py,sha256=n5dQMVLBw8aJZY8Utvf67bncc25ELf6AH9BYw8_hSzo,2619
|
|
171
171
|
langtrace_python_sdk/utils/sdk_version_checker.py,sha256=FzjIWZjn53cX0LEVPdipQd1fO9lG8iGVUEVUs9Hyk6M,1713
|
|
172
172
|
langtrace_python_sdk/utils/silently_fail.py,sha256=F_9EteXCO9Cyq-8MA1OT2Zy_dx8n06nt31I7t7ui24E,478
|
|
@@ -214,8 +214,8 @@ tests/pinecone/cassettes/test_query.yaml,sha256=b5v9G3ssUy00oG63PlFUR3JErF2Js-5A
|
|
|
214
214
|
tests/pinecone/cassettes/test_upsert.yaml,sha256=neWmQ1v3d03V8WoLl8FoFeeCYImb8pxlJBWnFd_lITU,38607
|
|
215
215
|
tests/qdrant/conftest.py,sha256=9n0uHxxIjWk9fbYc4bx-uP8lSAgLBVx-cV9UjnsyCHM,381
|
|
216
216
|
tests/qdrant/test_qdrant.py,sha256=pzjAjVY2kmsmGfrI2Gs2xrolfuaNHz7l1fqGQCjp5_o,3353
|
|
217
|
-
langtrace_python_sdk-2.3.
|
|
218
|
-
langtrace_python_sdk-2.3.
|
|
219
|
-
langtrace_python_sdk-2.3.
|
|
220
|
-
langtrace_python_sdk-2.3.
|
|
221
|
-
langtrace_python_sdk-2.3.
|
|
217
|
+
langtrace_python_sdk-2.3.2.dist-info/METADATA,sha256=vgPuuPsZ-0cWK4ubA2roie37BseA7QZE6lpZ51ZaTQU,15011
|
|
218
|
+
langtrace_python_sdk-2.3.2.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
|
|
219
|
+
langtrace_python_sdk-2.3.2.dist-info/entry_points.txt,sha256=1_b9-qvf2fE7uQNZcbUei9vLpFZBbbh9LrtGw95ssAo,70
|
|
220
|
+
langtrace_python_sdk-2.3.2.dist-info/licenses/LICENSE,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
|
|
221
|
+
langtrace_python_sdk-2.3.2.dist-info/RECORD,,
|
|
File without changes
|
{langtrace_python_sdk-2.3.0.dist-info → langtrace_python_sdk-2.3.2.dist-info}/entry_points.txt
RENAMED
|
File without changes
|
{langtrace_python_sdk-2.3.0.dist-info → langtrace_python_sdk-2.3.2.dist-info}/licenses/LICENSE
RENAMED
|
File without changes
|