openlit 1.34.30__py3-none-any.whl → 1.34.32__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.
- openlit/__helpers.py +235 -86
- openlit/__init__.py +19 -14
- openlit/_instrumentors.py +2 -1
- openlit/evals/all.py +50 -21
- openlit/evals/bias_detection.py +47 -20
- openlit/evals/hallucination.py +53 -22
- openlit/evals/toxicity.py +50 -21
- openlit/evals/utils.py +54 -30
- openlit/guard/all.py +61 -19
- openlit/guard/prompt_injection.py +34 -14
- openlit/guard/restrict_topic.py +46 -15
- openlit/guard/sensitive_topic.py +34 -14
- openlit/guard/utils.py +58 -22
- openlit/instrumentation/ag2/__init__.py +113 -6
- openlit/instrumentation/ag2/ag2.py +459 -17
- openlit/instrumentation/ag2/async_ag2.py +459 -17
- openlit/instrumentation/ag2/utils.py +475 -31
- openlit/instrumentation/ai21/__init__.py +43 -14
- openlit/instrumentation/ai21/ai21.py +47 -21
- openlit/instrumentation/ai21/async_ai21.py +47 -21
- openlit/instrumentation/ai21/utils.py +299 -78
- openlit/instrumentation/anthropic/__init__.py +21 -4
- openlit/instrumentation/anthropic/anthropic.py +28 -17
- openlit/instrumentation/anthropic/async_anthropic.py +28 -17
- openlit/instrumentation/anthropic/utils.py +145 -35
- openlit/instrumentation/assemblyai/__init__.py +11 -2
- openlit/instrumentation/assemblyai/assemblyai.py +15 -4
- openlit/instrumentation/assemblyai/utils.py +120 -25
- openlit/instrumentation/astra/__init__.py +43 -10
- openlit/instrumentation/astra/astra.py +28 -5
- openlit/instrumentation/astra/async_astra.py +28 -5
- openlit/instrumentation/astra/utils.py +151 -55
- openlit/instrumentation/azure_ai_inference/__init__.py +43 -10
- openlit/instrumentation/azure_ai_inference/async_azure_ai_inference.py +53 -21
- openlit/instrumentation/azure_ai_inference/azure_ai_inference.py +53 -21
- openlit/instrumentation/azure_ai_inference/utils.py +307 -83
- openlit/instrumentation/bedrock/__init__.py +21 -4
- openlit/instrumentation/bedrock/bedrock.py +63 -25
- openlit/instrumentation/bedrock/utils.py +139 -30
- openlit/instrumentation/chroma/__init__.py +89 -16
- openlit/instrumentation/chroma/chroma.py +28 -6
- openlit/instrumentation/chroma/utils.py +167 -51
- openlit/instrumentation/cohere/__init__.py +63 -18
- openlit/instrumentation/cohere/async_cohere.py +63 -24
- openlit/instrumentation/cohere/cohere.py +63 -24
- openlit/instrumentation/cohere/utils.py +286 -73
- openlit/instrumentation/controlflow/__init__.py +35 -9
- openlit/instrumentation/controlflow/controlflow.py +66 -33
- openlit/instrumentation/crawl4ai/__init__.py +25 -10
- openlit/instrumentation/crawl4ai/async_crawl4ai.py +78 -31
- openlit/instrumentation/crawl4ai/crawl4ai.py +78 -31
- openlit/instrumentation/crewai/__init__.py +40 -15
- openlit/instrumentation/crewai/async_crewai.py +32 -7
- openlit/instrumentation/crewai/crewai.py +32 -7
- openlit/instrumentation/crewai/utils.py +159 -56
- openlit/instrumentation/dynamiq/__init__.py +46 -12
- openlit/instrumentation/dynamiq/dynamiq.py +74 -33
- openlit/instrumentation/elevenlabs/__init__.py +23 -4
- openlit/instrumentation/elevenlabs/async_elevenlabs.py +16 -4
- openlit/instrumentation/elevenlabs/elevenlabs.py +16 -4
- openlit/instrumentation/elevenlabs/utils.py +128 -25
- openlit/instrumentation/embedchain/__init__.py +11 -2
- openlit/instrumentation/embedchain/embedchain.py +68 -35
- openlit/instrumentation/firecrawl/__init__.py +24 -7
- openlit/instrumentation/firecrawl/firecrawl.py +46 -20
- openlit/instrumentation/google_ai_studio/__init__.py +45 -10
- openlit/instrumentation/google_ai_studio/async_google_ai_studio.py +67 -44
- openlit/instrumentation/google_ai_studio/google_ai_studio.py +67 -44
- openlit/instrumentation/google_ai_studio/utils.py +180 -67
- openlit/instrumentation/gpt4all/__init__.py +22 -7
- openlit/instrumentation/gpt4all/gpt4all.py +67 -29
- openlit/instrumentation/gpt4all/utils.py +285 -61
- openlit/instrumentation/gpu/__init__.py +128 -47
- openlit/instrumentation/groq/__init__.py +21 -4
- openlit/instrumentation/groq/async_groq.py +33 -21
- openlit/instrumentation/groq/groq.py +33 -21
- openlit/instrumentation/groq/utils.py +192 -55
- openlit/instrumentation/haystack/__init__.py +70 -24
- openlit/instrumentation/haystack/async_haystack.py +28 -6
- openlit/instrumentation/haystack/haystack.py +28 -6
- openlit/instrumentation/haystack/utils.py +196 -74
- openlit/instrumentation/julep/__init__.py +69 -19
- openlit/instrumentation/julep/async_julep.py +53 -27
- openlit/instrumentation/julep/julep.py +53 -28
- openlit/instrumentation/langchain/__init__.py +74 -63
- openlit/instrumentation/langchain/callback_handler.py +1100 -0
- openlit/instrumentation/langchain_community/__init__.py +13 -2
- openlit/instrumentation/langchain_community/async_langchain_community.py +23 -5
- openlit/instrumentation/langchain_community/langchain_community.py +23 -5
- openlit/instrumentation/langchain_community/utils.py +35 -9
- openlit/instrumentation/letta/__init__.py +68 -15
- openlit/instrumentation/letta/letta.py +99 -54
- openlit/instrumentation/litellm/__init__.py +43 -14
- openlit/instrumentation/litellm/async_litellm.py +51 -26
- openlit/instrumentation/litellm/litellm.py +51 -26
- openlit/instrumentation/litellm/utils.py +304 -102
- openlit/instrumentation/llamaindex/__init__.py +267 -90
- openlit/instrumentation/llamaindex/async_llamaindex.py +28 -6
- openlit/instrumentation/llamaindex/llamaindex.py +28 -6
- openlit/instrumentation/llamaindex/utils.py +204 -91
- openlit/instrumentation/mem0/__init__.py +11 -2
- openlit/instrumentation/mem0/mem0.py +50 -29
- openlit/instrumentation/milvus/__init__.py +10 -2
- openlit/instrumentation/milvus/milvus.py +31 -6
- openlit/instrumentation/milvus/utils.py +166 -67
- openlit/instrumentation/mistral/__init__.py +63 -18
- openlit/instrumentation/mistral/async_mistral.py +63 -24
- openlit/instrumentation/mistral/mistral.py +63 -24
- openlit/instrumentation/mistral/utils.py +277 -69
- openlit/instrumentation/multion/__init__.py +69 -19
- openlit/instrumentation/multion/async_multion.py +57 -26
- openlit/instrumentation/multion/multion.py +57 -26
- openlit/instrumentation/ollama/__init__.py +39 -18
- openlit/instrumentation/ollama/async_ollama.py +57 -26
- openlit/instrumentation/ollama/ollama.py +57 -26
- openlit/instrumentation/ollama/utils.py +226 -50
- openlit/instrumentation/openai/__init__.py +156 -32
- openlit/instrumentation/openai/async_openai.py +147 -67
- openlit/instrumentation/openai/openai.py +150 -67
- openlit/instrumentation/openai/utils.py +657 -185
- openlit/instrumentation/openai_agents/__init__.py +5 -1
- openlit/instrumentation/openai_agents/processor.py +110 -90
- openlit/instrumentation/phidata/__init__.py +13 -5
- openlit/instrumentation/phidata/phidata.py +67 -32
- openlit/instrumentation/pinecone/__init__.py +48 -9
- openlit/instrumentation/pinecone/async_pinecone.py +27 -5
- openlit/instrumentation/pinecone/pinecone.py +27 -5
- openlit/instrumentation/pinecone/utils.py +153 -47
- openlit/instrumentation/premai/__init__.py +22 -7
- openlit/instrumentation/premai/premai.py +51 -26
- openlit/instrumentation/premai/utils.py +246 -59
- openlit/instrumentation/pydantic_ai/__init__.py +49 -22
- openlit/instrumentation/pydantic_ai/pydantic_ai.py +69 -16
- openlit/instrumentation/pydantic_ai/utils.py +89 -24
- openlit/instrumentation/qdrant/__init__.py +19 -4
- openlit/instrumentation/qdrant/async_qdrant.py +33 -7
- openlit/instrumentation/qdrant/qdrant.py +33 -7
- openlit/instrumentation/qdrant/utils.py +228 -93
- openlit/instrumentation/reka/__init__.py +23 -10
- openlit/instrumentation/reka/async_reka.py +17 -11
- openlit/instrumentation/reka/reka.py +17 -11
- openlit/instrumentation/reka/utils.py +138 -36
- openlit/instrumentation/together/__init__.py +44 -12
- openlit/instrumentation/together/async_together.py +50 -27
- openlit/instrumentation/together/together.py +50 -27
- openlit/instrumentation/together/utils.py +301 -71
- openlit/instrumentation/transformers/__init__.py +2 -1
- openlit/instrumentation/transformers/transformers.py +13 -3
- openlit/instrumentation/transformers/utils.py +139 -36
- openlit/instrumentation/vertexai/__init__.py +81 -16
- openlit/instrumentation/vertexai/async_vertexai.py +33 -15
- openlit/instrumentation/vertexai/utils.py +123 -27
- openlit/instrumentation/vertexai/vertexai.py +33 -15
- openlit/instrumentation/vllm/__init__.py +12 -5
- openlit/instrumentation/vllm/utils.py +121 -31
- openlit/instrumentation/vllm/vllm.py +16 -10
- openlit/otel/events.py +35 -10
- openlit/otel/metrics.py +32 -24
- openlit/otel/tracing.py +24 -9
- openlit/semcov/__init__.py +82 -6
- {openlit-1.34.30.dist-info → openlit-1.34.32.dist-info}/METADATA +2 -1
- openlit-1.34.32.dist-info/RECORD +166 -0
- openlit/instrumentation/langchain/async_langchain.py +0 -102
- openlit/instrumentation/langchain/langchain.py +0 -102
- openlit/instrumentation/langchain/utils.py +0 -252
- openlit-1.34.30.dist-info/RECORD +0 -168
- {openlit-1.34.30.dist-info → openlit-1.34.32.dist-info}/LICENSE +0 -0
- {openlit-1.34.30.dist-info → openlit-1.34.32.dist-info}/WHEEL +0 -0
@@ -5,15 +5,27 @@ Module for monitoring EmbedChain applications.
|
|
5
5
|
|
6
6
|
import logging
|
7
7
|
from opentelemetry.trace import SpanKind, Status, StatusCode
|
8
|
-
from opentelemetry.sdk.resources import
|
8
|
+
from opentelemetry.sdk.resources import (
|
9
|
+
SERVICE_NAME,
|
10
|
+
TELEMETRY_SDK_NAME,
|
11
|
+
DEPLOYMENT_ENVIRONMENT,
|
12
|
+
)
|
9
13
|
from openlit.__helpers import handle_exception
|
10
14
|
from openlit.semcov import SemanticConvention
|
11
15
|
|
12
16
|
# Initialize logger for logging potential issues and operations
|
13
17
|
logger = logging.getLogger(__name__)
|
14
18
|
|
15
|
-
|
16
|
-
|
19
|
+
|
20
|
+
def evaluate(
|
21
|
+
gen_ai_endpoint,
|
22
|
+
version,
|
23
|
+
environment,
|
24
|
+
application_name,
|
25
|
+
tracer,
|
26
|
+
pricing_info,
|
27
|
+
capture_message_content,
|
28
|
+
):
|
17
29
|
"""
|
18
30
|
Creates a wrapper around a function call to trace and log its execution metrics.
|
19
31
|
|
@@ -54,27 +66,36 @@ def evaluate(gen_ai_endpoint, version, environment, application_name,
|
|
54
66
|
on the span based on the function's execution and response, and ensures
|
55
67
|
errors are handled and logged appropriately.
|
56
68
|
"""
|
57
|
-
with tracer.start_as_current_span(
|
69
|
+
with tracer.start_as_current_span(
|
70
|
+
gen_ai_endpoint, kind=SpanKind.CLIENT
|
71
|
+
) as span:
|
58
72
|
response = wrapped(*args, **kwargs)
|
59
73
|
|
60
74
|
try:
|
61
75
|
span.set_attribute(TELEMETRY_SDK_NAME, "openlit")
|
62
|
-
span.set_attribute(
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
span.set_attribute(
|
67
|
-
|
68
|
-
span.set_attribute(
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
span.set_attribute(
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
76
|
+
span.set_attribute(
|
77
|
+
SemanticConvention.GEN_AI_SYSTEM,
|
78
|
+
SemanticConvention.GEN_AI_SYSTEM_EMBEDCHAIN,
|
79
|
+
)
|
80
|
+
span.set_attribute(SemanticConvention.GEN_AI_ENDPOINT, gen_ai_endpoint)
|
81
|
+
span.set_attribute(DEPLOYMENT_ENVIRONMENT, environment)
|
82
|
+
span.set_attribute(
|
83
|
+
SemanticConvention.GEN_AI_OPERATION,
|
84
|
+
SemanticConvention.GEN_AI_OPERATION_TYPE_FRAMEWORK,
|
85
|
+
)
|
86
|
+
span.set_attribute(SERVICE_NAME, application_name)
|
87
|
+
span.set_attribute(
|
88
|
+
SemanticConvention.GEN_AI_EVAL_CONTEXT_RELEVANCY,
|
89
|
+
response["context_relevancy"],
|
90
|
+
)
|
91
|
+
span.set_attribute(
|
92
|
+
SemanticConvention.GEN_AI_EVAL_ANSWER_RELEVANCY,
|
93
|
+
response["answer_relevancy"],
|
94
|
+
)
|
95
|
+
span.set_attribute(
|
96
|
+
SemanticConvention.GEN_AI_EVAL_GROUNDEDNESS,
|
97
|
+
response["groundedness"],
|
98
|
+
)
|
78
99
|
|
79
100
|
span.set_status(Status(StatusCode.OK))
|
80
101
|
|
@@ -90,8 +111,16 @@ def evaluate(gen_ai_endpoint, version, environment, application_name,
|
|
90
111
|
|
91
112
|
return wrapper
|
92
113
|
|
93
|
-
|
94
|
-
|
114
|
+
|
115
|
+
def get_data_sources(
|
116
|
+
gen_ai_endpoint,
|
117
|
+
version,
|
118
|
+
environment,
|
119
|
+
application_name,
|
120
|
+
tracer,
|
121
|
+
pricing_info,
|
122
|
+
capture_message_content,
|
123
|
+
):
|
95
124
|
"""
|
96
125
|
Creates a wrapper around a function call to trace and log its execution metrics.
|
97
126
|
|
@@ -132,23 +161,27 @@ def get_data_sources(gen_ai_endpoint, version, environment, application_name,
|
|
132
161
|
on the span based on the function's execution and response, and ensures
|
133
162
|
errors are handled and logged appropriately.
|
134
163
|
"""
|
135
|
-
with tracer.start_as_current_span(
|
164
|
+
with tracer.start_as_current_span(
|
165
|
+
gen_ai_endpoint, kind=SpanKind.CLIENT
|
166
|
+
) as span:
|
136
167
|
response = wrapped(*args, **kwargs)
|
137
168
|
|
138
169
|
try:
|
139
170
|
span.set_attribute(TELEMETRY_SDK_NAME, "openlit")
|
140
|
-
span.set_attribute(
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
span.set_attribute(
|
145
|
-
|
146
|
-
span.set_attribute(
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
span.set_attribute(
|
151
|
-
|
171
|
+
span.set_attribute(
|
172
|
+
SemanticConvention.GEN_AI_SYSTEM,
|
173
|
+
SemanticConvention.GEN_AI_SYSTEM_EMBEDCHAIN,
|
174
|
+
)
|
175
|
+
span.set_attribute(SemanticConvention.GEN_AI_ENDPOINT, gen_ai_endpoint)
|
176
|
+
span.set_attribute(DEPLOYMENT_ENVIRONMENT, environment)
|
177
|
+
span.set_attribute(
|
178
|
+
SemanticConvention.GEN_AI_OPERATION,
|
179
|
+
SemanticConvention.GEN_AI_OPERATION_TYPE_FRAMEWORK,
|
180
|
+
)
|
181
|
+
span.set_attribute(SERVICE_NAME, application_name)
|
182
|
+
span.set_attribute(
|
183
|
+
SemanticConvention.GEN_AI_DATA_SOURCES, len(response)
|
184
|
+
)
|
152
185
|
|
153
186
|
span.set_status(Status(StatusCode.OK))
|
154
187
|
|
@@ -6,12 +6,11 @@ import importlib.metadata
|
|
6
6
|
from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
|
7
7
|
from wrapt import wrap_function_wrapper
|
8
8
|
|
9
|
-
from openlit.instrumentation.firecrawl.firecrawl import
|
10
|
-
wrap_crawl
|
11
|
-
)
|
9
|
+
from openlit.instrumentation.firecrawl.firecrawl import wrap_crawl
|
12
10
|
|
13
11
|
_instruments = ("firecrawl-py >= 1.6.3",)
|
14
12
|
|
13
|
+
|
15
14
|
class FireCrawlInstrumentor(BaseInstrumentor):
|
16
15
|
"""
|
17
16
|
An instrumentor for firecrawl's client library.
|
@@ -33,15 +32,33 @@ class FireCrawlInstrumentor(BaseInstrumentor):
|
|
33
32
|
wrap_function_wrapper(
|
34
33
|
"firecrawl.firecrawl",
|
35
34
|
"FirecrawlApp.scrape_url",
|
36
|
-
wrap_crawl(
|
37
|
-
|
35
|
+
wrap_crawl(
|
36
|
+
"firecrawl.scrape_url",
|
37
|
+
version,
|
38
|
+
environment,
|
39
|
+
application_name,
|
40
|
+
tracer,
|
41
|
+
pricing_info,
|
42
|
+
capture_message_content,
|
43
|
+
metrics,
|
44
|
+
disable_metrics,
|
45
|
+
),
|
38
46
|
)
|
39
47
|
|
40
48
|
wrap_function_wrapper(
|
41
49
|
"firecrawl.firecrawl",
|
42
50
|
"FirecrawlApp.crawl_url",
|
43
|
-
wrap_crawl(
|
44
|
-
|
51
|
+
wrap_crawl(
|
52
|
+
"firecrawl.crawl_url",
|
53
|
+
version,
|
54
|
+
environment,
|
55
|
+
application_name,
|
56
|
+
tracer,
|
57
|
+
pricing_info,
|
58
|
+
capture_message_content,
|
59
|
+
metrics,
|
60
|
+
disable_metrics,
|
61
|
+
),
|
45
62
|
)
|
46
63
|
|
47
64
|
def _uninstrument(self, **kwargs):
|
@@ -5,7 +5,11 @@ Module for monitoring FireCrawl calls.
|
|
5
5
|
|
6
6
|
import logging
|
7
7
|
from opentelemetry.trace import SpanKind, Status, StatusCode
|
8
|
-
from opentelemetry.sdk.resources import
|
8
|
+
from opentelemetry.sdk.resources import (
|
9
|
+
SERVICE_NAME,
|
10
|
+
TELEMETRY_SDK_NAME,
|
11
|
+
DEPLOYMENT_ENVIRONMENT,
|
12
|
+
)
|
9
13
|
from openlit.__helpers import (
|
10
14
|
handle_exception,
|
11
15
|
)
|
@@ -14,8 +18,18 @@ from openlit.semcov import SemanticConvention
|
|
14
18
|
# Initialize logger for logging potential issues and operations
|
15
19
|
logger = logging.getLogger(__name__)
|
16
20
|
|
17
|
-
|
18
|
-
|
21
|
+
|
22
|
+
def wrap_crawl(
|
23
|
+
gen_ai_endpoint,
|
24
|
+
version,
|
25
|
+
environment,
|
26
|
+
application_name,
|
27
|
+
tracer,
|
28
|
+
pricing_info,
|
29
|
+
capture_message_content,
|
30
|
+
metrics,
|
31
|
+
disable_metrics,
|
32
|
+
):
|
19
33
|
"""
|
20
34
|
Generates a telemetry wrapper for chat completions to collect metrics.
|
21
35
|
|
@@ -50,28 +64,40 @@ def wrap_crawl(gen_ai_endpoint, version, environment, application_name,
|
|
50
64
|
"""
|
51
65
|
|
52
66
|
# pylint: disable=line-too-long
|
53
|
-
with tracer.start_as_current_span(
|
67
|
+
with tracer.start_as_current_span(
|
68
|
+
gen_ai_endpoint, kind=SpanKind.CLIENT
|
69
|
+
) as span:
|
54
70
|
response = wrapped(*args, **kwargs)
|
55
71
|
|
56
72
|
try:
|
57
73
|
# Set base span attribues
|
58
74
|
span.set_attribute(TELEMETRY_SDK_NAME, "openlit")
|
59
|
-
span.set_attribute(
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
span.set_attribute(
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
span.set_attribute(
|
68
|
-
|
69
|
-
span.set_attribute(
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
+
span.set_attribute(
|
76
|
+
SemanticConvention.GEN_AI_SYSTEM,
|
77
|
+
SemanticConvention.GEN_AI_SYSTEM_FIRECRAWL,
|
78
|
+
)
|
79
|
+
span.set_attribute(
|
80
|
+
SemanticConvention.GEN_AI_OPERATION,
|
81
|
+
SemanticConvention.GEN_AI_OPERATION_TYPE_AGENT,
|
82
|
+
)
|
83
|
+
span.set_attribute(SemanticConvention.GEN_AI_ENDPOINT, gen_ai_endpoint)
|
84
|
+
span.set_attribute(SERVICE_NAME, application_name)
|
85
|
+
span.set_attribute(DEPLOYMENT_ENVIRONMENT, environment)
|
86
|
+
span.set_attribute(
|
87
|
+
SemanticConvention.GEN_AI_AGENT_TYPE,
|
88
|
+
SemanticConvention.GEN_AI_AGENT_TYPE_BROWSER,
|
89
|
+
)
|
90
|
+
span.set_attribute(
|
91
|
+
SemanticConvention.GEN_AI_AGENT_PARAMS, str(kwargs.get("params"))
|
92
|
+
)
|
93
|
+
|
94
|
+
url = (
|
95
|
+
kwargs.get("url")
|
96
|
+
if "url" in kwargs
|
97
|
+
else str(args[0])
|
98
|
+
if args
|
99
|
+
else None
|
100
|
+
)
|
75
101
|
if url is not None:
|
76
102
|
span.set_attribute(SemanticConvention.GEN_AI_AGENT_BROWSE_URL, url)
|
77
103
|
|
@@ -6,15 +6,18 @@ from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
|
|
6
6
|
from wrapt import wrap_function_wrapper
|
7
7
|
|
8
8
|
from openlit.instrumentation.google_ai_studio.google_ai_studio import (
|
9
|
-
generate,
|
9
|
+
generate,
|
10
|
+
generate_stream,
|
10
11
|
)
|
11
12
|
|
12
13
|
from openlit.instrumentation.google_ai_studio.async_google_ai_studio import (
|
13
|
-
async_generate,
|
14
|
+
async_generate,
|
15
|
+
async_generate_stream,
|
14
16
|
)
|
15
17
|
|
16
18
|
_instruments = ("google-genai >= 1.3.0",)
|
17
19
|
|
20
|
+
|
18
21
|
class GoogleAIStudioInstrumentor(BaseInstrumentor):
|
19
22
|
"""
|
20
23
|
An instrumentor for google-genai's client library.
|
@@ -37,32 +40,64 @@ class GoogleAIStudioInstrumentor(BaseInstrumentor):
|
|
37
40
|
wrap_function_wrapper(
|
38
41
|
"google.genai.models",
|
39
42
|
"Models.generate_content",
|
40
|
-
generate(
|
41
|
-
|
43
|
+
generate(
|
44
|
+
version,
|
45
|
+
environment,
|
46
|
+
application_name,
|
47
|
+
tracer,
|
48
|
+
pricing_info,
|
49
|
+
capture_message_content,
|
50
|
+
metrics,
|
51
|
+
disable_metrics,
|
52
|
+
),
|
42
53
|
)
|
43
54
|
|
44
55
|
# sync stream generate
|
45
56
|
wrap_function_wrapper(
|
46
57
|
"google.genai.models",
|
47
58
|
"Models.generate_content_stream",
|
48
|
-
generate_stream(
|
49
|
-
|
59
|
+
generate_stream(
|
60
|
+
version,
|
61
|
+
environment,
|
62
|
+
application_name,
|
63
|
+
tracer,
|
64
|
+
pricing_info,
|
65
|
+
capture_message_content,
|
66
|
+
metrics,
|
67
|
+
disable_metrics,
|
68
|
+
),
|
50
69
|
)
|
51
70
|
|
52
71
|
# async generate
|
53
72
|
wrap_function_wrapper(
|
54
73
|
"google.genai.models",
|
55
74
|
"AsyncModels.generate_content",
|
56
|
-
async_generate(
|
57
|
-
|
75
|
+
async_generate(
|
76
|
+
version,
|
77
|
+
environment,
|
78
|
+
application_name,
|
79
|
+
tracer,
|
80
|
+
pricing_info,
|
81
|
+
capture_message_content,
|
82
|
+
metrics,
|
83
|
+
disable_metrics,
|
84
|
+
),
|
58
85
|
)
|
59
86
|
|
60
87
|
# async stream generate
|
61
88
|
wrap_function_wrapper(
|
62
89
|
"google.genai.models",
|
63
90
|
"AsyncModels.generate_content_stream",
|
64
|
-
async_generate_stream(
|
65
|
-
|
91
|
+
async_generate_stream(
|
92
|
+
version,
|
93
|
+
environment,
|
94
|
+
application_name,
|
95
|
+
tracer,
|
96
|
+
pricing_info,
|
97
|
+
capture_message_content,
|
98
|
+
metrics,
|
99
|
+
disable_metrics,
|
100
|
+
),
|
66
101
|
)
|
67
102
|
|
68
103
|
def _uninstrument(self, **kwargs):
|
@@ -4,19 +4,25 @@ Module for monitoring Google AI Studio API calls.
|
|
4
4
|
|
5
5
|
import time
|
6
6
|
from opentelemetry.trace import SpanKind
|
7
|
-
from openlit.__helpers import
|
8
|
-
handle_exception,
|
9
|
-
set_server_address_and_port
|
10
|
-
)
|
7
|
+
from openlit.__helpers import handle_exception, set_server_address_and_port
|
11
8
|
from openlit.instrumentation.google_ai_studio.utils import (
|
12
9
|
process_chat_response,
|
13
10
|
process_chunk,
|
14
|
-
process_streaming_chat_response
|
11
|
+
process_streaming_chat_response,
|
15
12
|
)
|
16
13
|
from openlit.semcov import SemanticConvention
|
17
14
|
|
18
|
-
|
19
|
-
|
15
|
+
|
16
|
+
def async_generate(
|
17
|
+
version,
|
18
|
+
environment,
|
19
|
+
application_name,
|
20
|
+
tracer,
|
21
|
+
pricing_info,
|
22
|
+
capture_message_content,
|
23
|
+
metrics,
|
24
|
+
disable_metrics,
|
25
|
+
):
|
20
26
|
"""
|
21
27
|
Generates a telemetry wrapper for GenAI function call
|
22
28
|
"""
|
@@ -26,7 +32,9 @@ def async_generate(version, environment, application_name,
|
|
26
32
|
Wraps the GenAI function call.
|
27
33
|
"""
|
28
34
|
|
29
|
-
server_address, server_port = set_server_address_and_port(
|
35
|
+
server_address, server_port = set_server_address_and_port(
|
36
|
+
instance, "generativelanguage.googleapis.com", 443
|
37
|
+
)
|
30
38
|
request_model = kwargs.get("model", "gemini-2.0-flash")
|
31
39
|
|
32
40
|
span_name = f"{SemanticConvention.GEN_AI_OPERATION_TYPE_CHAT} {request_model}"
|
@@ -37,22 +45,22 @@ def async_generate(version, environment, application_name,
|
|
37
45
|
|
38
46
|
try:
|
39
47
|
response = process_chat_response(
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
48
|
+
instance=instance,
|
49
|
+
response=response,
|
50
|
+
request_model=request_model,
|
51
|
+
pricing_info=pricing_info,
|
52
|
+
server_port=server_port,
|
53
|
+
server_address=server_address,
|
54
|
+
environment=environment,
|
55
|
+
application_name=application_name,
|
56
|
+
metrics=metrics,
|
57
|
+
start_time=start_time,
|
58
|
+
span=span,
|
59
|
+
args=args,
|
60
|
+
kwargs=kwargs,
|
61
|
+
capture_message_content=capture_message_content,
|
62
|
+
disable_metrics=disable_metrics,
|
63
|
+
version=version,
|
56
64
|
)
|
57
65
|
|
58
66
|
except Exception as e:
|
@@ -63,8 +71,17 @@ def async_generate(version, environment, application_name,
|
|
63
71
|
|
64
72
|
return wrapper
|
65
73
|
|
66
|
-
|
67
|
-
|
74
|
+
|
75
|
+
def async_generate_stream(
|
76
|
+
version,
|
77
|
+
environment,
|
78
|
+
application_name,
|
79
|
+
tracer,
|
80
|
+
pricing_info,
|
81
|
+
capture_message_content,
|
82
|
+
metrics,
|
83
|
+
disable_metrics,
|
84
|
+
):
|
68
85
|
"""
|
69
86
|
Generates a telemetry wrapper for GenAI function call
|
70
87
|
"""
|
@@ -75,23 +92,23 @@ def async_generate_stream(version, environment, application_name,
|
|
75
92
|
"""
|
76
93
|
|
77
94
|
def __init__(
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
95
|
+
self,
|
96
|
+
wrapped,
|
97
|
+
span,
|
98
|
+
span_name,
|
99
|
+
kwargs,
|
100
|
+
server_address,
|
101
|
+
server_port,
|
102
|
+
**args,
|
103
|
+
):
|
87
104
|
self.__wrapped__ = wrapped
|
88
105
|
self._span = span
|
89
106
|
self._span_name = span_name
|
90
|
-
self._llmresponse =
|
91
|
-
self._finish_reason =
|
92
|
-
self._output_tokens =
|
93
|
-
self._input_tokens =
|
94
|
-
self._response_model =
|
107
|
+
self._llmresponse = ""
|
108
|
+
self._finish_reason = ""
|
109
|
+
self._output_tokens = ""
|
110
|
+
self._input_tokens = ""
|
111
|
+
self._response_model = ""
|
95
112
|
self._tools = None
|
96
113
|
|
97
114
|
self._args = args
|
@@ -125,7 +142,9 @@ def async_generate_stream(version, environment, application_name,
|
|
125
142
|
return chunk
|
126
143
|
except StopAsyncIteration:
|
127
144
|
try:
|
128
|
-
with tracer.start_as_current_span(
|
145
|
+
with tracer.start_as_current_span(
|
146
|
+
self._span_name, kind=SpanKind.CLIENT
|
147
|
+
) as self._span:
|
129
148
|
process_streaming_chat_response(
|
130
149
|
self,
|
131
150
|
pricing_info=pricing_info,
|
@@ -134,7 +153,7 @@ def async_generate_stream(version, environment, application_name,
|
|
134
153
|
metrics=metrics,
|
135
154
|
capture_message_content=capture_message_content,
|
136
155
|
disable_metrics=disable_metrics,
|
137
|
-
version=version
|
156
|
+
version=version,
|
138
157
|
)
|
139
158
|
|
140
159
|
except Exception as e:
|
@@ -146,7 +165,9 @@ def async_generate_stream(version, environment, application_name,
|
|
146
165
|
Wraps the GenAI function call.
|
147
166
|
"""
|
148
167
|
|
149
|
-
server_address, server_port = set_server_address_and_port(
|
168
|
+
server_address, server_port = set_server_address_and_port(
|
169
|
+
instance, "generativelanguage.googleapis.com", 443
|
170
|
+
)
|
150
171
|
request_model = kwargs.get("model", "gemini-2.0-flash")
|
151
172
|
|
152
173
|
span_name = f"{SemanticConvention.GEN_AI_OPERATION_TYPE_CHAT} {request_model}"
|
@@ -154,6 +175,8 @@ def async_generate_stream(version, environment, application_name,
|
|
154
175
|
awaited_wrapped = await wrapped(*args, **kwargs)
|
155
176
|
span = tracer.start_as_current_span(span_name, kind=SpanKind.CLIENT)
|
156
177
|
|
157
|
-
return TracedAsyncStream(
|
178
|
+
return TracedAsyncStream(
|
179
|
+
awaited_wrapped, span, span_name, kwargs, server_address, server_port
|
180
|
+
)
|
158
181
|
|
159
182
|
return wrapper
|