langtrace-python-sdk 3.8.7__py3-none-any.whl → 3.8.9__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/neo4j_example/__init__.py +8 -0
- examples/neo4j_example/basic.py +26 -0
- examples/neo4j_graphrag_example/__init__.py +9 -0
- examples/neo4j_graphrag_example/basic.py +52 -0
- examples/neo4j_graphrag_example/data/abramov.pdf +0 -0
- langtrace_python_sdk/constants/instrumentation/neo4j.py +36 -0
- langtrace_python_sdk/instrumentation/__init__.py +3 -0
- langtrace_python_sdk/instrumentation/neo4j/__init__.py +3 -0
- langtrace_python_sdk/instrumentation/neo4j/instrumentation.py +51 -0
- langtrace_python_sdk/instrumentation/neo4j/patch.py +180 -0
- langtrace_python_sdk/instrumentation/neo4j_graphrag/__init__.py +3 -0
- langtrace_python_sdk/instrumentation/neo4j_graphrag/instrumentation.py +62 -0
- langtrace_python_sdk/instrumentation/neo4j_graphrag/patch.py +229 -0
- langtrace_python_sdk/langtrace.py +5 -3
- langtrace_python_sdk/version.py +1 -1
- {langtrace_python_sdk-3.8.7.dist-info → langtrace_python_sdk-3.8.9.dist-info}/METADATA +2 -2
- {langtrace_python_sdk-3.8.7.dist-info → langtrace_python_sdk-3.8.9.dist-info}/RECORD +20 -8
- {langtrace_python_sdk-3.8.7.dist-info → langtrace_python_sdk-3.8.9.dist-info}/WHEEL +0 -0
- {langtrace_python_sdk-3.8.7.dist-info → langtrace_python_sdk-3.8.9.dist-info}/entry_points.txt +0 -0
- {langtrace_python_sdk-3.8.7.dist-info → langtrace_python_sdk-3.8.9.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,26 @@
|
|
1
|
+
import os
|
2
|
+
from langtrace_python_sdk import langtrace
|
3
|
+
from neo4j import GraphDatabase
|
4
|
+
|
5
|
+
langtrace.init()
|
6
|
+
|
7
|
+
def execute_query():
|
8
|
+
driver = GraphDatabase.driver(
|
9
|
+
os.getenv("NEO4J_URI"),
|
10
|
+
auth=(os.getenv("NEO4J_USERNAME"), os.getenv("NEO4J_PASSWORD"))
|
11
|
+
)
|
12
|
+
|
13
|
+
records, summary, keys = driver.execute_query(
|
14
|
+
"MATCH (p:Person {age: $age}) RETURN p.name AS name",
|
15
|
+
age=42,
|
16
|
+
database_=os.getenv("NEO4J_DATABASE"),
|
17
|
+
)
|
18
|
+
|
19
|
+
# Loop through results and do something with them
|
20
|
+
for person in records:
|
21
|
+
print(person)
|
22
|
+
# Summary information
|
23
|
+
print("The query `{query}` returned {records_count} records in {time} ms.".format(
|
24
|
+
query=summary.query, records_count=len(records),
|
25
|
+
time=summary.result_available_after,
|
26
|
+
))
|
@@ -0,0 +1,52 @@
|
|
1
|
+
import os
|
2
|
+
from langtrace_python_sdk import langtrace
|
3
|
+
from langtrace_python_sdk.utils.with_root_span import with_langtrace_root_span
|
4
|
+
from neo4j import GraphDatabase
|
5
|
+
from neo4j_graphrag.generation import GraphRAG
|
6
|
+
from neo4j_graphrag.indexes import create_vector_index
|
7
|
+
from neo4j_graphrag.llm import OpenAILLM as LLM
|
8
|
+
from neo4j_graphrag.embeddings import OpenAIEmbeddings as Embeddings
|
9
|
+
from neo4j_graphrag.retrievers import VectorRetriever
|
10
|
+
from neo4j_graphrag.experimental.pipeline.kg_builder import SimpleKGPipeline
|
11
|
+
|
12
|
+
langtrace.init()
|
13
|
+
|
14
|
+
neo4j_driver = GraphDatabase.driver(os.getenv("NEO4J_URI"), auth=(os.getenv("NEO4J_USERNAME"), os.getenv("NEO4J_PASSWORD")))
|
15
|
+
|
16
|
+
ex_llm=LLM(
|
17
|
+
model_name="gpt-4o-mini",
|
18
|
+
model_params={
|
19
|
+
"response_format": {"type": "json_object"},
|
20
|
+
"temperature": 0
|
21
|
+
})
|
22
|
+
|
23
|
+
embedder = Embeddings()
|
24
|
+
|
25
|
+
@with_langtrace_root_span("run_neo_rag")
|
26
|
+
async def search():
|
27
|
+
# 1. Build KG and Store in Neo4j Database
|
28
|
+
kg_builder_pdf = SimpleKGPipeline(
|
29
|
+
llm=ex_llm,
|
30
|
+
driver=neo4j_driver,
|
31
|
+
embedder=embedder,
|
32
|
+
from_pdf=True
|
33
|
+
)
|
34
|
+
await kg_builder_pdf.run_async(file_path='src/examples/neo4j_graphrag_example/data/abramov.pdf')
|
35
|
+
|
36
|
+
create_vector_index(neo4j_driver, name="text_embeddings", label="Chunk",
|
37
|
+
embedding_property="embedding", dimensions=1536, similarity_fn="cosine")
|
38
|
+
|
39
|
+
# 2. KG Retriever
|
40
|
+
vector_retriever = VectorRetriever(
|
41
|
+
neo4j_driver,
|
42
|
+
index_name="text_embeddings",
|
43
|
+
embedder=embedder
|
44
|
+
)
|
45
|
+
|
46
|
+
# 3. GraphRAG Class
|
47
|
+
llm = LLM(model_name="gpt-4o")
|
48
|
+
rag = GraphRAG(llm=llm, retriever=vector_retriever)
|
49
|
+
|
50
|
+
# 4. Run
|
51
|
+
response = rag.search("What did the author do in college?")
|
52
|
+
print(response.answer)
|
Binary file
|
@@ -0,0 +1,36 @@
|
|
1
|
+
from langtrace.trace_attributes import Neo4jMethods
|
2
|
+
|
3
|
+
APIS = {
|
4
|
+
"RUN": {
|
5
|
+
"METHOD": Neo4jMethods.RUN.value,
|
6
|
+
"OPERATION": "run",
|
7
|
+
},
|
8
|
+
"BEGIN_TRANSACTION": {
|
9
|
+
"METHOD": Neo4jMethods.BEGIN_TRANSACTION.value,
|
10
|
+
"OPERATION": "begin_transaction",
|
11
|
+
},
|
12
|
+
"READ_TRANSACTION": {
|
13
|
+
"METHOD": Neo4jMethods.READ_TRANSACTION.value,
|
14
|
+
"OPERATION": "read_transaction",
|
15
|
+
},
|
16
|
+
"WRITE_TRANSACTION": {
|
17
|
+
"METHOD": Neo4jMethods.WRITE_TRANSACTION.value,
|
18
|
+
"OPERATION": "write_transaction",
|
19
|
+
},
|
20
|
+
"EXECUTE_READ": {
|
21
|
+
"METHOD": Neo4jMethods.EXECUTE_READ.value,
|
22
|
+
"OPERATION": "execute_read",
|
23
|
+
},
|
24
|
+
"EXECUTE_WRITE": {
|
25
|
+
"METHOD": Neo4jMethods.EXECUTE_WRITE.value,
|
26
|
+
"OPERATION": "execute_write",
|
27
|
+
},
|
28
|
+
"EXECUTE_QUERY": {
|
29
|
+
"METHOD": Neo4jMethods.EXECUTE_QUERY.value,
|
30
|
+
"OPERATION": "execute_query",
|
31
|
+
},
|
32
|
+
"TX_RUN": {
|
33
|
+
"METHOD": Neo4jMethods.TX_RUN.value,
|
34
|
+
"OPERATION": "tx_run",
|
35
|
+
},
|
36
|
+
}
|
@@ -22,6 +22,8 @@ from .litellm import LiteLLMInstrumentation
|
|
22
22
|
from .llamaindex import LlamaindexInstrumentation
|
23
23
|
from .milvus import MilvusInstrumentation
|
24
24
|
from .mistral import MistralInstrumentation
|
25
|
+
from .neo4j import Neo4jInstrumentation
|
26
|
+
from .neo4j_graphrag import Neo4jGraphRAGInstrumentation
|
25
27
|
from .ollama import OllamaInstrumentor
|
26
28
|
from .openai import OpenAIInstrumentation
|
27
29
|
from .openai_agents import OpenAIAgentsInstrumentation
|
@@ -59,6 +61,7 @@ __all__ = [
|
|
59
61
|
"AWSBedrockInstrumentation",
|
60
62
|
"CerebrasInstrumentation",
|
61
63
|
"MilvusInstrumentation",
|
64
|
+
"Neo4jGraphRAGInstrumentation",
|
62
65
|
"GoogleGenaiInstrumentation",
|
63
66
|
"CrewaiToolsInstrumentation",
|
64
67
|
"GraphlitInstrumentation",
|
@@ -0,0 +1,51 @@
|
|
1
|
+
"""
|
2
|
+
Copyright (c) 2025 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.constants.instrumentation.neo4j import APIS
|
26
|
+
from langtrace_python_sdk.instrumentation.neo4j.patch import driver_patch
|
27
|
+
|
28
|
+
logging.basicConfig(level=logging.FATAL)
|
29
|
+
|
30
|
+
|
31
|
+
class Neo4jInstrumentation(BaseInstrumentor):
|
32
|
+
"""
|
33
|
+
The Neo4jInstrumentation class represents the Neo4j graph database instrumentation
|
34
|
+
"""
|
35
|
+
|
36
|
+
def instrumentation_dependencies(self) -> Collection[str]:
|
37
|
+
return ["neo4j >= 5.25.0"]
|
38
|
+
|
39
|
+
def _instrument(self, **kwargs):
|
40
|
+
tracer_provider = kwargs.get("tracer_provider")
|
41
|
+
tracer = get_tracer(__name__, "", tracer_provider)
|
42
|
+
version = importlib.metadata.version("neo4j")
|
43
|
+
|
44
|
+
wrap_function_wrapper(
|
45
|
+
"neo4j._sync.driver",
|
46
|
+
"Driver.execute_query",
|
47
|
+
driver_patch("EXECUTE_QUERY", version, tracer),
|
48
|
+
)
|
49
|
+
|
50
|
+
def _uninstrument(self, **kwargs):
|
51
|
+
pass
|
@@ -0,0 +1,180 @@
|
|
1
|
+
"""
|
2
|
+
Copyright (c) 2025 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 json
|
18
|
+
|
19
|
+
from langtrace_python_sdk.utils.llm import get_span_name
|
20
|
+
from langtrace_python_sdk.utils.silently_fail import silently_fail
|
21
|
+
from langtrace.trace_attributes import DatabaseSpanAttributes
|
22
|
+
from langtrace_python_sdk.utils import set_span_attribute
|
23
|
+
from opentelemetry import baggage, trace
|
24
|
+
from opentelemetry.trace import SpanKind
|
25
|
+
from opentelemetry.trace.status import Status, StatusCode
|
26
|
+
from opentelemetry.trace.propagation import set_span_in_context
|
27
|
+
|
28
|
+
from langtrace_python_sdk.constants.instrumentation.common import (
|
29
|
+
LANGTRACE_ADDITIONAL_SPAN_ATTRIBUTES_KEY,
|
30
|
+
SERVICE_PROVIDERS,
|
31
|
+
)
|
32
|
+
from langtrace_python_sdk.constants.instrumentation.neo4j import APIS
|
33
|
+
from importlib.metadata import version as v
|
34
|
+
|
35
|
+
from langtrace_python_sdk.constants import LANGTRACE_SDK_NAME
|
36
|
+
|
37
|
+
|
38
|
+
def driver_patch(operation_name, version, tracer):
|
39
|
+
def traced_method(wrapped, instance, args, kwargs):
|
40
|
+
|
41
|
+
api = APIS[operation_name]
|
42
|
+
service_provider = SERVICE_PROVIDERS.get("NEO4J", "neo4j")
|
43
|
+
extra_attributes = baggage.get_baggage(LANGTRACE_ADDITIONAL_SPAN_ATTRIBUTES_KEY)
|
44
|
+
span_attributes = {
|
45
|
+
"langtrace.sdk.name": "langtrace-python-sdk",
|
46
|
+
"langtrace.service.name": service_provider,
|
47
|
+
"langtrace.service.type": "vectordb",
|
48
|
+
"langtrace.service.version": version,
|
49
|
+
"langtrace.version": v(LANGTRACE_SDK_NAME),
|
50
|
+
"db.system": "neo4j",
|
51
|
+
"db.operation": api["OPERATION"],
|
52
|
+
"db.query": json.dumps(args[0]) if args and len(args) > 0 else "",
|
53
|
+
**(extra_attributes if extra_attributes is not None else {}),
|
54
|
+
}
|
55
|
+
|
56
|
+
attributes = DatabaseSpanAttributes(**span_attributes)
|
57
|
+
|
58
|
+
with tracer.start_as_current_span(
|
59
|
+
name=get_span_name(api["METHOD"]),
|
60
|
+
kind=SpanKind.CLIENT,
|
61
|
+
context=set_span_in_context(trace.get_current_span()),
|
62
|
+
) as span:
|
63
|
+
for field, value in attributes.model_dump(by_alias=True).items():
|
64
|
+
if value is not None:
|
65
|
+
span.set_attribute(field, value)
|
66
|
+
|
67
|
+
if operation_name == "EXECUTE_QUERY":
|
68
|
+
_set_execute_query_attributes(span, args, kwargs)
|
69
|
+
|
70
|
+
try:
|
71
|
+
result = wrapped(*args, **kwargs)
|
72
|
+
|
73
|
+
if isinstance(result, tuple) and len(result) == 3:
|
74
|
+
records, result_summary, keys = result
|
75
|
+
_set_result_attributes(span, records, result_summary, keys)
|
76
|
+
else:
|
77
|
+
res = json.dumps(result)
|
78
|
+
set_span_attribute(span, "neo4j.result.query_response", res)
|
79
|
+
|
80
|
+
span.set_status(StatusCode.OK)
|
81
|
+
return result
|
82
|
+
except Exception as err:
|
83
|
+
span.record_exception(err)
|
84
|
+
span.set_status(Status(StatusCode.ERROR, str(err)))
|
85
|
+
raise
|
86
|
+
|
87
|
+
return traced_method
|
88
|
+
|
89
|
+
|
90
|
+
@silently_fail
|
91
|
+
def _set_execute_query_attributes(span, args, kwargs):
|
92
|
+
query = args[0] if args else kwargs.get("query_", None)
|
93
|
+
if query:
|
94
|
+
if hasattr(query, "text"):
|
95
|
+
set_span_attribute(span, "db.query", query.text)
|
96
|
+
if hasattr(query, "metadata") and query.metadata:
|
97
|
+
set_span_attribute(span, "db.query.metadata", json.dumps(query.metadata))
|
98
|
+
if hasattr(query, "timeout") and query.timeout:
|
99
|
+
set_span_attribute(span, "db.query.timeout", query.timeout)
|
100
|
+
else:
|
101
|
+
set_span_attribute(span, "db.query", query)
|
102
|
+
|
103
|
+
parameters = kwargs.get("parameters_", None)
|
104
|
+
if parameters:
|
105
|
+
try:
|
106
|
+
set_span_attribute(span, "db.statement.parameters", json.dumps(parameters))
|
107
|
+
except (TypeError, ValueError):
|
108
|
+
pass
|
109
|
+
|
110
|
+
database = kwargs.get("database_", None)
|
111
|
+
if database:
|
112
|
+
set_span_attribute(span, "neo4j.db.name", database)
|
113
|
+
|
114
|
+
routing = kwargs.get("routing_", None)
|
115
|
+
if routing:
|
116
|
+
set_span_attribute(span, "neo4j.db.routing", str(routing))
|
117
|
+
|
118
|
+
|
119
|
+
@silently_fail
|
120
|
+
def _set_result_attributes(span, records, result_summary, keys):
|
121
|
+
"""
|
122
|
+
Set attributes related to the query result and summary
|
123
|
+
"""
|
124
|
+
if records is not None:
|
125
|
+
record_count = len(records)
|
126
|
+
set_span_attribute(span, "neo4j.result.record_count", record_count)
|
127
|
+
if record_count > 0:
|
128
|
+
set_span_attribute(span, "neo4j.result.records", json.dumps(records))
|
129
|
+
|
130
|
+
if keys is not None:
|
131
|
+
set_span_attribute(span, "neo4j.result.keys", json.dumps(keys))
|
132
|
+
|
133
|
+
if result_summary:
|
134
|
+
if hasattr(result_summary, "database") and result_summary.database:
|
135
|
+
set_span_attribute(span, "neo4j.db.name", result_summary.database)
|
136
|
+
|
137
|
+
if hasattr(result_summary, "query_type") and result_summary.query_type:
|
138
|
+
set_span_attribute(span, "neo4j.result.query_type", result_summary.query_type)
|
139
|
+
|
140
|
+
if hasattr(result_summary, "parameters") and result_summary.parameters:
|
141
|
+
try:
|
142
|
+
set_span_attribute(span, "neo4j.result.parameters", json.dumps(result_summary.parameters))
|
143
|
+
except (TypeError, ValueError):
|
144
|
+
pass
|
145
|
+
|
146
|
+
if hasattr(result_summary, "result_available_after") and result_summary.result_available_after is not None:
|
147
|
+
set_span_attribute(span, "neo4j.result.available_after_ms", result_summary.result_available_after)
|
148
|
+
|
149
|
+
if hasattr(result_summary, "result_consumed_after") and result_summary.result_consumed_after is not None:
|
150
|
+
set_span_attribute(span, "neo4j.result.consumed_after_ms", result_summary.result_consumed_after)
|
151
|
+
|
152
|
+
if hasattr(result_summary, "counters") and result_summary.counters:
|
153
|
+
counters = result_summary.counters
|
154
|
+
if hasattr(counters, "nodes_created") and counters.nodes_created:
|
155
|
+
set_span_attribute(span, "neo4j.result.nodes_created", counters.nodes_created)
|
156
|
+
|
157
|
+
if hasattr(counters, "nodes_deleted") and counters.nodes_deleted:
|
158
|
+
set_span_attribute(span, "neo4j.result.nodes_deleted", counters.nodes_deleted)
|
159
|
+
|
160
|
+
if hasattr(counters, "relationships_created") and counters.relationships_created:
|
161
|
+
set_span_attribute(span, "neo4j.result.relationships_created", counters.relationships_created)
|
162
|
+
|
163
|
+
if hasattr(counters, "relationships_deleted") and counters.relationships_deleted:
|
164
|
+
set_span_attribute(span, "neo4j.result.relationships_deleted", counters.relationships_deleted)
|
165
|
+
|
166
|
+
if hasattr(counters, "properties_set") and counters.properties_set:
|
167
|
+
set_span_attribute(span, "neo4j.result.properties_set", counters.properties_set)
|
168
|
+
|
169
|
+
if hasattr(result_summary, "plan") and result_summary.plan:
|
170
|
+
try:
|
171
|
+
set_span_attribute(span, "neo4j.result.plan", json.dumps(result_summary.plan))
|
172
|
+
except (TypeError, ValueError):
|
173
|
+
pass
|
174
|
+
|
175
|
+
if hasattr(result_summary, "notifications") and result_summary.notifications:
|
176
|
+
try:
|
177
|
+
set_span_attribute(span, "neo4j.result.notification_count", len(result_summary.notifications))
|
178
|
+
set_span_attribute(span, "neo4j.result.notifications", json.dumps(result_summary.notifications))
|
179
|
+
except (AttributeError, TypeError):
|
180
|
+
pass
|
@@ -0,0 +1,62 @@
|
|
1
|
+
"""
|
2
|
+
Copyright (c) 2025 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 typing import Collection
|
18
|
+
from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
|
19
|
+
from opentelemetry import trace
|
20
|
+
from wrapt import wrap_function_wrapper as _W
|
21
|
+
from importlib.metadata import version as v
|
22
|
+
from .patch import patch_graphrag_search, patch_kg_pipeline_run, \
|
23
|
+
patch_kg_pipeline_run, patch_retriever_search
|
24
|
+
|
25
|
+
|
26
|
+
class Neo4jGraphRAGInstrumentation(BaseInstrumentor):
|
27
|
+
|
28
|
+
def instrumentation_dependencies(self) -> Collection[str]:
|
29
|
+
return ["neo4j-graphrag>=1.6.0"]
|
30
|
+
|
31
|
+
def _instrument(self, **kwargs):
|
32
|
+
tracer_provider = kwargs.get("tracer_provider")
|
33
|
+
tracer = trace.get_tracer(__name__, "", tracer_provider)
|
34
|
+
graphrag_version = v("neo4j-graphrag")
|
35
|
+
|
36
|
+
try:
|
37
|
+
# instrument kg builder
|
38
|
+
_W(
|
39
|
+
"neo4j_graphrag.experimental.pipeline.kg_builder",
|
40
|
+
"SimpleKGPipeline.run_async",
|
41
|
+
patch_kg_pipeline_run("run_async", graphrag_version, tracer),
|
42
|
+
)
|
43
|
+
|
44
|
+
# Instrument GraphRAG
|
45
|
+
_W(
|
46
|
+
"neo4j_graphrag.generation.graphrag",
|
47
|
+
"GraphRAG.search",
|
48
|
+
patch_graphrag_search("search", graphrag_version, tracer),
|
49
|
+
)
|
50
|
+
|
51
|
+
# Instrument retrievers
|
52
|
+
_W(
|
53
|
+
"neo4j_graphrag.retrievers.vector",
|
54
|
+
"VectorRetriever.get_search_results",
|
55
|
+
patch_retriever_search("vector_search", graphrag_version, tracer),
|
56
|
+
)
|
57
|
+
|
58
|
+
except Exception as e:
|
59
|
+
print(f"Failed to instrument Neo4j GraphRAG: {e}")
|
60
|
+
|
61
|
+
def _uninstrument(self, **kwargs):
|
62
|
+
pass
|
@@ -0,0 +1,229 @@
|
|
1
|
+
"""
|
2
|
+
Copyright (c) 2025 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 json
|
18
|
+
|
19
|
+
from importlib_metadata import version as v
|
20
|
+
from langtrace.trace_attributes import FrameworkSpanAttributes
|
21
|
+
from opentelemetry import baggage
|
22
|
+
from opentelemetry.trace import Span, SpanKind, Tracer
|
23
|
+
from opentelemetry.trace.status import Status, StatusCode
|
24
|
+
|
25
|
+
from langtrace_python_sdk.constants import LANGTRACE_SDK_NAME
|
26
|
+
from langtrace_python_sdk.constants.instrumentation.common import (
|
27
|
+
LANGTRACE_ADDITIONAL_SPAN_ATTRIBUTES_KEY, SERVICE_PROVIDERS)
|
28
|
+
from langtrace_python_sdk.utils.llm import set_span_attributes
|
29
|
+
from langtrace_python_sdk.utils.misc import serialize_args, serialize_kwargs
|
30
|
+
|
31
|
+
|
32
|
+
def patch_kg_pipeline_run(operation_name: str, version: str, tracer: Tracer):
|
33
|
+
|
34
|
+
async def async_traced_method(wrapped, instance, args, kwargs):
|
35
|
+
service_provider = SERVICE_PROVIDERS.get("NEO4J_GRAPHRAG", "neo4j_graphrag")
|
36
|
+
extra_attributes = baggage.get_baggage(LANGTRACE_ADDITIONAL_SPAN_ATTRIBUTES_KEY)
|
37
|
+
|
38
|
+
span_attributes = {
|
39
|
+
"langtrace.sdk.name": "langtrace-python-sdk",
|
40
|
+
"langtrace.service.name": service_provider,
|
41
|
+
"langtrace.service.type": "framework",
|
42
|
+
"langtrace.service.version": version,
|
43
|
+
"langtrace.version": v(LANGTRACE_SDK_NAME),
|
44
|
+
"neo4j.pipeline.type": "SimpleKGPipeline",
|
45
|
+
**(extra_attributes if extra_attributes is not None else {}),
|
46
|
+
}
|
47
|
+
|
48
|
+
if len(args) > 0:
|
49
|
+
span_attributes["neo4j.pipeline.inputs"] = serialize_args(*args)
|
50
|
+
if kwargs:
|
51
|
+
span_attributes["neo4j.pipeline.kwargs"] = serialize_kwargs(**kwargs)
|
52
|
+
|
53
|
+
file_path = kwargs.get("file_path", args[0] if len(args) > 0 else None)
|
54
|
+
text = kwargs.get("text", args[1] if len(args) > 1 else None)
|
55
|
+
if file_path:
|
56
|
+
span_attributes["neo4j.pipeline.file_path"] = file_path
|
57
|
+
if text:
|
58
|
+
span_attributes["neo4j.pipeline.text_length"] = len(text)
|
59
|
+
|
60
|
+
if hasattr(instance, "runner") and hasattr(instance.runner, "config"):
|
61
|
+
config = instance.runner.config
|
62
|
+
if config:
|
63
|
+
span_attributes["neo4j.pipeline.from_pdf"] = getattr(config, "from_pdf", None)
|
64
|
+
span_attributes["neo4j.pipeline.perform_entity_resolution"] = getattr(config, "perform_entity_resolution", None)
|
65
|
+
|
66
|
+
attributes = FrameworkSpanAttributes(**span_attributes)
|
67
|
+
|
68
|
+
with tracer.start_as_current_span(
|
69
|
+
name=f"neo4j.pipeline.{operation_name}",
|
70
|
+
kind=SpanKind.CLIENT,
|
71
|
+
) as span:
|
72
|
+
try:
|
73
|
+
set_span_attributes(span, attributes)
|
74
|
+
|
75
|
+
result = await wrapped(*args, **kwargs)
|
76
|
+
|
77
|
+
if result:
|
78
|
+
try:
|
79
|
+
if hasattr(result, "to_dict"):
|
80
|
+
result_dict = result.to_dict()
|
81
|
+
span.set_attribute("neo4j.pipeline.result", json.dumps(result_dict))
|
82
|
+
elif hasattr(result, "model_dump"):
|
83
|
+
result_dict = result.model_dump()
|
84
|
+
span.set_attribute("neo4j.pipeline.result", json.dumps(result_dict))
|
85
|
+
except Exception as e:
|
86
|
+
span.set_attribute("neo4j.pipeline.result_error", str(e))
|
87
|
+
|
88
|
+
span.set_status(Status(StatusCode.OK))
|
89
|
+
return result
|
90
|
+
|
91
|
+
except Exception as err:
|
92
|
+
span.record_exception(err)
|
93
|
+
span.set_status(Status(StatusCode.ERROR, str(err)))
|
94
|
+
raise
|
95
|
+
|
96
|
+
return async_traced_method
|
97
|
+
|
98
|
+
|
99
|
+
def patch_graphrag_search(operation_name: str, version: str, tracer: Tracer):
|
100
|
+
|
101
|
+
def traced_method(wrapped, instance, args, kwargs):
|
102
|
+
service_provider = SERVICE_PROVIDERS.get("NEO4J_GRAPHRAG", "neo4j_graphrag")
|
103
|
+
extra_attributes = baggage.get_baggage(LANGTRACE_ADDITIONAL_SPAN_ATTRIBUTES_KEY)
|
104
|
+
|
105
|
+
# Basic attributes
|
106
|
+
span_attributes = {
|
107
|
+
"langtrace.sdk.name": "langtrace-python-sdk",
|
108
|
+
"langtrace.service.name": service_provider,
|
109
|
+
"langtrace.service.type": "framework",
|
110
|
+
"langtrace.service.version": version,
|
111
|
+
"langtrace.version": v(LANGTRACE_SDK_NAME),
|
112
|
+
"neo4j_graphrag.operation": operation_name,
|
113
|
+
**(extra_attributes if extra_attributes is not None else {}),
|
114
|
+
}
|
115
|
+
|
116
|
+
query_text = kwargs.get("query_text", args[0] if len(args) > 0 else None)
|
117
|
+
if query_text:
|
118
|
+
span_attributes["neo4j_graphrag.query_text"] = query_text
|
119
|
+
|
120
|
+
retriever_config = kwargs.get("retriever_config", None)
|
121
|
+
if retriever_config:
|
122
|
+
span_attributes["neo4j_graphrag.retriever_config"] = json.dumps(retriever_config)
|
123
|
+
|
124
|
+
if hasattr(instance, "retriever"):
|
125
|
+
span_attributes["neo4j_graphrag.retriever_type"] = instance.retriever.__class__.__name__
|
126
|
+
|
127
|
+
if hasattr(instance, "llm"):
|
128
|
+
span_attributes["neo4j_graphrag.llm_type"] = instance.llm.__class__.__name__
|
129
|
+
|
130
|
+
attributes = FrameworkSpanAttributes(**span_attributes)
|
131
|
+
|
132
|
+
with tracer.start_as_current_span(
|
133
|
+
name=f"neo4j_graphrag.{operation_name}",
|
134
|
+
kind=SpanKind.CLIENT,
|
135
|
+
) as span:
|
136
|
+
try:
|
137
|
+
set_span_attributes(span, attributes)
|
138
|
+
|
139
|
+
result = wrapped(*args, **kwargs)
|
140
|
+
|
141
|
+
if result and hasattr(result, "answer"):
|
142
|
+
span.set_attribute("neo4j_graphrag.answer", result.answer)
|
143
|
+
|
144
|
+
if hasattr(result, "retriever_result") and result.retriever_result:
|
145
|
+
try:
|
146
|
+
retriever_items = len(result.retriever_result.items)
|
147
|
+
span.set_attribute("neo4j_graphrag.context_items", retriever_items)
|
148
|
+
except Exception:
|
149
|
+
pass
|
150
|
+
|
151
|
+
span.set_status(Status(StatusCode.OK))
|
152
|
+
return result
|
153
|
+
|
154
|
+
except Exception as err:
|
155
|
+
span.record_exception(err)
|
156
|
+
span.set_status(Status(StatusCode.ERROR, str(err)))
|
157
|
+
raise
|
158
|
+
|
159
|
+
return traced_method
|
160
|
+
|
161
|
+
|
162
|
+
def patch_retriever_search(operation_name: str, version: str, tracer: Tracer):
|
163
|
+
|
164
|
+
def traced_method(wrapped, instance, args, kwargs):
|
165
|
+
service_provider = SERVICE_PROVIDERS.get("NEO4J_GRAPHRAG", "neo4j_graphrag")
|
166
|
+
extra_attributes = baggage.get_baggage(LANGTRACE_ADDITIONAL_SPAN_ATTRIBUTES_KEY)
|
167
|
+
|
168
|
+
# Basic attributes
|
169
|
+
span_attributes = {
|
170
|
+
"langtrace.sdk.name": "langtrace-python-sdk",
|
171
|
+
"langtrace.service.name": service_provider,
|
172
|
+
"langtrace.service.type": "framework",
|
173
|
+
"langtrace.service.version": version,
|
174
|
+
"langtrace.version": v(LANGTRACE_SDK_NAME),
|
175
|
+
"neo4j.retriever.operation": operation_name,
|
176
|
+
"neo4j.retriever.type": instance.__class__.__name__,
|
177
|
+
**(extra_attributes if extra_attributes is not None else {}),
|
178
|
+
}
|
179
|
+
|
180
|
+
query_text = kwargs.get("query_text", args[0] if len(args) > 0 else None)
|
181
|
+
if query_text:
|
182
|
+
span_attributes["neo4j.retriever.query_text"] = query_text
|
183
|
+
|
184
|
+
if hasattr(instance, "__class__") and hasattr(instance.__class__, "__name__"):
|
185
|
+
retriever_type = instance.__class__.__name__
|
186
|
+
|
187
|
+
if retriever_type == "VectorRetriever" and hasattr(instance, "index_name"):
|
188
|
+
span_attributes["neo4j.vector_retriever.index_name"] = instance.index_name
|
189
|
+
|
190
|
+
if retriever_type == "KnowledgeGraphRetriever" and hasattr(instance, "cypher_query"):
|
191
|
+
span_attributes["neo4j.kg_retriever.cypher_query"] = instance.cypher_query
|
192
|
+
|
193
|
+
for param in ["top_k", "similarity_threshold"]:
|
194
|
+
if param in kwargs:
|
195
|
+
span_attributes[f"neo4j.retriever.{param}"] = kwargs[param]
|
196
|
+
elif hasattr(instance, param):
|
197
|
+
span_attributes[f"neo4j.retriever.{param}"] = getattr(instance, param)
|
198
|
+
|
199
|
+
attributes = FrameworkSpanAttributes(**span_attributes)
|
200
|
+
|
201
|
+
with tracer.start_as_current_span(
|
202
|
+
name=f"neo4j.retriever.{operation_name}",
|
203
|
+
kind=SpanKind.CLIENT,
|
204
|
+
) as span:
|
205
|
+
try:
|
206
|
+
set_span_attributes(span, attributes)
|
207
|
+
|
208
|
+
result = wrapped(*args, **kwargs)
|
209
|
+
|
210
|
+
if result:
|
211
|
+
if hasattr(result, "items") and isinstance(result.items, list):
|
212
|
+
span.set_attribute("neo4j.retriever.items_count", len(result.items))
|
213
|
+
|
214
|
+
try:
|
215
|
+
item_ids = [item.id for item in result.items[:5] if hasattr(item, "id")]
|
216
|
+
if item_ids:
|
217
|
+
span.set_attribute("neo4j.retriever.item_ids", json.dumps(item_ids))
|
218
|
+
except Exception:
|
219
|
+
pass
|
220
|
+
|
221
|
+
span.set_status(Status(StatusCode.OK))
|
222
|
+
return result
|
223
|
+
|
224
|
+
except Exception as err:
|
225
|
+
span.record_exception(err)
|
226
|
+
span.set_status(Status(StatusCode.ERROR, str(err)))
|
227
|
+
raise
|
228
|
+
|
229
|
+
return traced_method
|
@@ -47,9 +47,9 @@ from langtrace_python_sdk.instrumentation import (
|
|
47
47
|
CrewaiToolsInstrumentation, DspyInstrumentation, EmbedchainInstrumentation,
|
48
48
|
GeminiInstrumentation, GoogleGenaiInstrumentation, GraphlitInstrumentation,
|
49
49
|
GroqInstrumentation, LangchainCommunityInstrumentation,
|
50
|
-
LangchainCoreInstrumentation, LangchainInstrumentation,
|
51
|
-
|
52
|
-
|
50
|
+
LangchainCoreInstrumentation, LangchainInstrumentation, LanggraphInstrumentation,
|
51
|
+
LiteLLMInstrumentation, LlamaindexInstrumentation, MilvusInstrumentation,
|
52
|
+
MistralInstrumentation, Neo4jInstrumentation, Neo4jGraphRAGInstrumentation,
|
53
53
|
OllamaInstrumentor, OpenAIAgentsInstrumentation, OpenAIInstrumentation,
|
54
54
|
PhiDataInstrumentation, PineconeInstrumentation, PyMongoInstrumentation,
|
55
55
|
QdrantInstrumentation, VertexAIInstrumentation, WeaviateInstrumentation)
|
@@ -284,6 +284,8 @@ def init(
|
|
284
284
|
"phidata": PhiDataInstrumentation(),
|
285
285
|
"agno": AgnoInstrumentation(),
|
286
286
|
"mistralai": MistralInstrumentation(),
|
287
|
+
"neo4j": Neo4jInstrumentation(),
|
288
|
+
"neo4j-graphrag": Neo4jGraphRAGInstrumentation(),
|
287
289
|
"boto3": AWSBedrockInstrumentation(),
|
288
290
|
"autogen": AutogenInstrumentation(),
|
289
291
|
"pymongo": PyMongoInstrumentation(),
|
langtrace_python_sdk/version.py
CHANGED
@@ -1 +1 @@
|
|
1
|
-
__version__ = "3.8.
|
1
|
+
__version__ = "3.8.9"
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: langtrace-python-sdk
|
3
|
-
Version: 3.8.
|
3
|
+
Version: 3.8.9
|
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>
|
@@ -23,7 +23,7 @@ Requires-Dist: sentry-sdk>=2.14.0
|
|
23
23
|
Requires-Dist: setuptools
|
24
24
|
Requires-Dist: sqlalchemy
|
25
25
|
Requires-Dist: tiktoken>=0.1.1
|
26
|
-
Requires-Dist: trace-attributes==7.2.
|
26
|
+
Requires-Dist: trace-attributes==7.2.1
|
27
27
|
Requires-Dist: transformers>=4.11.3
|
28
28
|
Requires-Dist: ujson>=5.10.0
|
29
29
|
Provides-Extra: dev
|
@@ -83,6 +83,11 @@ examples/mistral_example/complete.py,sha256=Ydf5iOCGM2tySSd5vzGvNh3Qz39aTpxcCItB
|
|
83
83
|
examples/mistral_example/complete_async.py,sha256=-SVOLNLNi5JL3o4obBsCXKOt8A6b61j3otbrrYPOOtM,586
|
84
84
|
examples/mistral_example/embeddings.py,sha256=LKq_k3Y-TS2SCkyFKw2tLiYreVRHqlY6z0Gfh1y_7u0,468
|
85
85
|
examples/mongo_vector_search_example/main.py,sha256=6bHOxR3LfAZwmGmv74jgNCciATS5h5e-Tb5z0cD0z3Q,1542
|
86
|
+
examples/neo4j_example/__init__.py,sha256=YG7-_cQnXt-fJQtH2bJu_uSNyVCmYyUevU4H-GML_Sk,200
|
87
|
+
examples/neo4j_example/basic.py,sha256=xw5fNi5y-U5wzrVIsnvbKBZDURUzoYriawu6nyEXi3o,780
|
88
|
+
examples/neo4j_graphrag_example/__init__.py,sha256=YCXutcM3otTKEff1S3qTciFBxOMrQw7mQ4WGfJ7-mU8,230
|
89
|
+
examples/neo4j_graphrag_example/basic.py,sha256=uYf4O8bT3GkU5Qa-tluEr9sYTm5gjdzHAKf-C8bi5GY,1727
|
90
|
+
examples/neo4j_graphrag_example/data/abramov.pdf,sha256=Fm93bGdz74PJel-Dw_wZeuqqedloTTZiOakIWLzYDPA,46933
|
86
91
|
examples/ollama_example/__init__.py,sha256=qOx0jGCPuSpRCPiqtDVm7F0z8hIZ8C75hDZ_C8Apz-s,399
|
87
92
|
examples/ollama_example/basic.py,sha256=EPbsigOF4xBDBgLgAD0EzPo737ycVm7aXZr7F5Xt-A4,1062
|
88
93
|
examples/openai_example/__init__.py,sha256=6faH7wTegSozKmS89sd1Tgv8AcEH0GfKkC7YaBWA8tg,849
|
@@ -115,8 +120,8 @@ examples/vertexai_example/main.py,sha256=gndId5X5ksD-ycxnAWMdEqIDbLc3kz5Vt8vm4YP
|
|
115
120
|
examples/weaviate_example/__init__.py,sha256=8JMDBsRSEV10HfTd-YC7xb4txBjD3la56snk-Bbg2Kw,618
|
116
121
|
examples/weaviate_example/query_text.py,sha256=wPHQTc_58kPoKTZMygVjTj-2ZcdrIuaausJfMxNQnQc,127162
|
117
122
|
langtrace_python_sdk/__init__.py,sha256=VZM6i71NR7pBQK6XvJWRelknuTYUhqwqE7PlicKa5Wg,1166
|
118
|
-
langtrace_python_sdk/langtrace.py,sha256=
|
119
|
-
langtrace_python_sdk/version.py,sha256=
|
123
|
+
langtrace_python_sdk/langtrace.py,sha256=P7aHGunNP8YQqd2glsVLXhSe4QDeAarfG2eCV9hhAm4,13944
|
124
|
+
langtrace_python_sdk/version.py,sha256=KpxarCD6mNaS0PTJWWJOOJiShAjznuFT62LLRdWsuYI,22
|
120
125
|
langtrace_python_sdk/constants/__init__.py,sha256=3CNYkWMdd1DrkGqzLUgNZXjdAlM6UFMlf_F-odAToyc,146
|
121
126
|
langtrace_python_sdk/constants/exporter/langtrace_exporter.py,sha256=EVCrouYCpY98f0KSaKr4PzNxPULTZZO6dSA_crEOyJU,106
|
122
127
|
langtrace_python_sdk/constants/instrumentation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -131,6 +136,7 @@ langtrace_python_sdk/constants/instrumentation/groq.py,sha256=VFXmIl4aqGY_fS0PAm
|
|
131
136
|
langtrace_python_sdk/constants/instrumentation/litellm.py,sha256=bMAlpY2scFe6Lql0Nl7euGNSO9QEV5Uzne12hnw3mSE,449
|
132
137
|
langtrace_python_sdk/constants/instrumentation/milvus.py,sha256=lnl7RtV2Wc66mEmtVMjV5eWalt-caH4-sQEHpN1LmEE,1029
|
133
138
|
langtrace_python_sdk/constants/instrumentation/mistral.py,sha256=9PlmcC5P5_BHJ-zsX1xekht6rSm7arTin58HAfdYvLk,730
|
139
|
+
langtrace_python_sdk/constants/instrumentation/neo4j.py,sha256=-coUUCiroN2shr_C-HcWPYPmEcjIz1CQpaXtZo2uVFU,1002
|
134
140
|
langtrace_python_sdk/constants/instrumentation/ollama.py,sha256=H_-S0xjqRsi5qSp7mAlK7Y9NlQ3BqOkG6ASogqqgdJY,212
|
135
141
|
langtrace_python_sdk/constants/instrumentation/openai.py,sha256=uEOH5UXapU2DSf2AdgXTRhhJEHGWXUNFkUGD5QafflM,1164
|
136
142
|
langtrace_python_sdk/constants/instrumentation/pinecone.py,sha256=0TityERbGWaHGSN8-vyYZtYCjVj8fQOKae8lng0O0Bk,478
|
@@ -141,7 +147,7 @@ langtrace_python_sdk/constants/instrumentation/weaviate.py,sha256=gtv-JBxvNGClEM
|
|
141
147
|
langtrace_python_sdk/extensions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
142
148
|
langtrace_python_sdk/extensions/langtrace_exporter.py,sha256=ckd8dMmY6h2oxE04p1JFLwUB5PSJX_Cy4eDFEM6aj4Y,6605
|
143
149
|
langtrace_python_sdk/extensions/langtrace_filesystem.py,sha256=34fZutG28EJ66l67OvTGsydAH3ZpXgikdE7hVLqBpG4,7863
|
144
|
-
langtrace_python_sdk/instrumentation/__init__.py,sha256=
|
150
|
+
langtrace_python_sdk/instrumentation/__init__.py,sha256=sUVSZtidQev87AspZmWK4M8J51mBnJXXNDwfBsl_Dcs,2692
|
145
151
|
langtrace_python_sdk/instrumentation/agno/__init__.py,sha256=95fn4oA-CHB0mxc6KnVB20KSbXGl_ZZr9n99EEaXzrY,91
|
146
152
|
langtrace_python_sdk/instrumentation/agno/instrumentation.py,sha256=XUnfvqpp13IgdF03xGKasq7kGjeaN1sXLIwCf-Nt_Nc,2667
|
147
153
|
langtrace_python_sdk/instrumentation/agno/patch.py,sha256=qCUxCkzU9cYu_d8BzLgj_Ss97qib07tRVYpYDiNnNMs,16876
|
@@ -218,6 +224,12 @@ langtrace_python_sdk/instrumentation/milvus/patch.py,sha256=0yY5aQz0x7hpQZ8U-0qf
|
|
218
224
|
langtrace_python_sdk/instrumentation/mistral/__init__.py,sha256=mkGALBQvq0jSfwDl6TU09SFwnVs6O4zkUi-yVmd3SNg,90
|
219
225
|
langtrace_python_sdk/instrumentation/mistral/instrumentation.py,sha256=qtCkHCSOaiicUChbmTID4lcK1rbeW8oRSbpda2ogbgM,2328
|
220
226
|
langtrace_python_sdk/instrumentation/mistral/patch.py,sha256=5EzqMeIEcMUH8P-l9-ijpRNWSc6mYwe9Gz0VY4PLrS0,6559
|
227
|
+
langtrace_python_sdk/instrumentation/neo4j/__init__.py,sha256=6pG7SKOSKENaFEsstMJ4ZUH9wUP53JdQKdjHzJ4Lbko,86
|
228
|
+
langtrace_python_sdk/instrumentation/neo4j/instrumentation.py,sha256=KECuFv7OuVBgh_NTZl4_W18GAGbKnaeQqRZM8NPZgjU,1668
|
229
|
+
langtrace_python_sdk/instrumentation/neo4j/patch.py,sha256=wPAxslFdsHdYU5k1nHzWAqaHxQA-HhxgfVnb_U5qaZ0,7922
|
230
|
+
langtrace_python_sdk/instrumentation/neo4j_graphrag/__init__.py,sha256=K-Qpfh-kn2EPxnYZ_oubLZNqAUO9Cx7mnMrJu_ms3UU,102
|
231
|
+
langtrace_python_sdk/instrumentation/neo4j_graphrag/instrumentation.py,sha256=FLnddPSozuu5puqYD_FnXLMFet8YToVdWP-cY5QZrvM,2216
|
232
|
+
langtrace_python_sdk/instrumentation/neo4j_graphrag/patch.py,sha256=4c7NKcTJeYsbi5V4aSsuPzTiFoBqtlcXmYx2bMlE7qg,9713
|
221
233
|
langtrace_python_sdk/instrumentation/ollama/__init__.py,sha256=g2zJsXnDHinXPzTc-WxDeTtHmr9gmAj3K6l_00kP8c8,82
|
222
234
|
langtrace_python_sdk/instrumentation/ollama/instrumentation.py,sha256=jdsvkqUJAAUNLVPtAkn_rG26HXetVQXWtjn4a6eWZro,2029
|
223
235
|
langtrace_python_sdk/instrumentation/ollama/patch.py,sha256=w99r9wCCVDdJnZQEezYE2lW_iNFEtrldt9vq3ISAsag,5375
|
@@ -300,8 +312,8 @@ tests/pinecone/cassettes/test_query.yaml,sha256=b5v9G3ssUy00oG63PlFUR3JErF2Js-5A
|
|
300
312
|
tests/pinecone/cassettes/test_upsert.yaml,sha256=neWmQ1v3d03V8WoLl8FoFeeCYImb8pxlJBWnFd_lITU,38607
|
301
313
|
tests/qdrant/conftest.py,sha256=9n0uHxxIjWk9fbYc4bx-uP8lSAgLBVx-cV9UjnsyCHM,381
|
302
314
|
tests/qdrant/test_qdrant.py,sha256=pzjAjVY2kmsmGfrI2Gs2xrolfuaNHz7l1fqGQCjp5_o,3353
|
303
|
-
langtrace_python_sdk-3.8.
|
304
|
-
langtrace_python_sdk-3.8.
|
305
|
-
langtrace_python_sdk-3.8.
|
306
|
-
langtrace_python_sdk-3.8.
|
307
|
-
langtrace_python_sdk-3.8.
|
315
|
+
langtrace_python_sdk-3.8.9.dist-info/METADATA,sha256=k-mlsrxBFSyNhSlXR2UkkEpPjIT8YzLHtCG3R82NeL8,15844
|
316
|
+
langtrace_python_sdk-3.8.9.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
317
|
+
langtrace_python_sdk-3.8.9.dist-info/entry_points.txt,sha256=1_b9-qvf2fE7uQNZcbUei9vLpFZBbbh9LrtGw95ssAo,70
|
318
|
+
langtrace_python_sdk-3.8.9.dist-info/licenses/LICENSE,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
|
319
|
+
langtrace_python_sdk-3.8.9.dist-info/RECORD,,
|
File without changes
|
{langtrace_python_sdk-3.8.7.dist-info → langtrace_python_sdk-3.8.9.dist-info}/entry_points.txt
RENAMED
File without changes
|
{langtrace_python_sdk-3.8.7.dist-info → langtrace_python_sdk-3.8.9.dist-info}/licenses/LICENSE
RENAMED
File without changes
|