openlit 1.33.8__py3-none-any.whl → 1.33.10__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 +88 -0
- openlit/__init__.py +4 -3
- openlit/instrumentation/ag2/ag2.py +5 -5
- openlit/instrumentation/ai21/__init__.py +4 -4
- openlit/instrumentation/ai21/ai21.py +370 -319
- openlit/instrumentation/ai21/async_ai21.py +371 -319
- openlit/instrumentation/anthropic/__init__.py +4 -4
- openlit/instrumentation/anthropic/anthropic.py +321 -189
- openlit/instrumentation/anthropic/async_anthropic.py +323 -190
- openlit/instrumentation/assemblyai/__init__.py +1 -1
- openlit/instrumentation/assemblyai/assemblyai.py +59 -43
- openlit/instrumentation/astra/astra.py +9 -9
- openlit/instrumentation/astra/async_astra.py +9 -9
- openlit/instrumentation/azure_ai_inference/__init__.py +4 -4
- openlit/instrumentation/azure_ai_inference/async_azure_ai_inference.py +406 -252
- openlit/instrumentation/azure_ai_inference/azure_ai_inference.py +406 -252
- openlit/instrumentation/bedrock/__init__.py +1 -1
- openlit/instrumentation/bedrock/bedrock.py +115 -58
- openlit/instrumentation/chroma/chroma.py +9 -9
- openlit/instrumentation/cohere/__init__.py +33 -10
- openlit/instrumentation/cohere/async_cohere.py +610 -0
- openlit/instrumentation/cohere/cohere.py +410 -219
- openlit/instrumentation/controlflow/controlflow.py +5 -5
- openlit/instrumentation/crawl4ai/async_crawl4ai.py +5 -5
- openlit/instrumentation/crawl4ai/crawl4ai.py +5 -5
- openlit/instrumentation/crewai/crewai.py +6 -4
- openlit/instrumentation/dynamiq/dynamiq.py +5 -5
- openlit/instrumentation/elevenlabs/async_elevenlabs.py +71 -46
- openlit/instrumentation/elevenlabs/elevenlabs.py +71 -51
- openlit/instrumentation/embedchain/embedchain.py +9 -9
- openlit/instrumentation/firecrawl/firecrawl.py +5 -5
- openlit/instrumentation/google_ai_studio/__init__.py +9 -9
- openlit/instrumentation/google_ai_studio/async_google_ai_studio.py +183 -219
- openlit/instrumentation/google_ai_studio/google_ai_studio.py +183 -220
- openlit/instrumentation/gpt4all/__init__.py +2 -2
- openlit/instrumentation/gpt4all/gpt4all.py +345 -220
- openlit/instrumentation/gpu/__init__.py +5 -5
- openlit/instrumentation/groq/__init__.py +2 -2
- openlit/instrumentation/groq/async_groq.py +356 -240
- openlit/instrumentation/groq/groq.py +356 -240
- openlit/instrumentation/haystack/haystack.py +5 -5
- openlit/instrumentation/julep/async_julep.py +5 -5
- openlit/instrumentation/julep/julep.py +5 -5
- openlit/instrumentation/langchain/__init__.py +13 -7
- openlit/instrumentation/langchain/async_langchain.py +384 -0
- openlit/instrumentation/langchain/langchain.py +105 -492
- openlit/instrumentation/letta/letta.py +11 -9
- openlit/instrumentation/litellm/__init__.py +4 -5
- openlit/instrumentation/litellm/async_litellm.py +318 -247
- openlit/instrumentation/litellm/litellm.py +314 -243
- openlit/instrumentation/llamaindex/llamaindex.py +5 -5
- openlit/instrumentation/mem0/mem0.py +5 -5
- openlit/instrumentation/milvus/milvus.py +9 -9
- openlit/instrumentation/mistral/__init__.py +6 -6
- openlit/instrumentation/mistral/async_mistral.py +423 -250
- openlit/instrumentation/mistral/mistral.py +420 -246
- openlit/instrumentation/multion/async_multion.py +6 -4
- openlit/instrumentation/multion/multion.py +6 -4
- openlit/instrumentation/ollama/__init__.py +8 -30
- openlit/instrumentation/ollama/async_ollama.py +385 -417
- openlit/instrumentation/ollama/ollama.py +384 -417
- openlit/instrumentation/openai/__init__.py +11 -230
- openlit/instrumentation/openai/async_openai.py +433 -410
- openlit/instrumentation/openai/openai.py +414 -394
- openlit/instrumentation/phidata/phidata.py +6 -4
- openlit/instrumentation/pinecone/pinecone.py +9 -9
- openlit/instrumentation/premai/__init__.py +2 -2
- openlit/instrumentation/premai/premai.py +262 -213
- openlit/instrumentation/qdrant/async_qdrant.py +9 -9
- openlit/instrumentation/qdrant/qdrant.py +9 -9
- openlit/instrumentation/reka/__init__.py +2 -2
- openlit/instrumentation/reka/async_reka.py +90 -52
- openlit/instrumentation/reka/reka.py +90 -52
- openlit/instrumentation/together/__init__.py +4 -4
- openlit/instrumentation/together/async_together.py +278 -236
- openlit/instrumentation/together/together.py +278 -236
- openlit/instrumentation/transformers/__init__.py +1 -1
- openlit/instrumentation/transformers/transformers.py +76 -45
- openlit/instrumentation/vertexai/__init__.py +14 -64
- openlit/instrumentation/vertexai/async_vertexai.py +330 -987
- openlit/instrumentation/vertexai/vertexai.py +330 -987
- openlit/instrumentation/vllm/__init__.py +1 -1
- openlit/instrumentation/vllm/vllm.py +66 -36
- openlit/otel/metrics.py +98 -7
- openlit/semcov/__init__.py +113 -80
- {openlit-1.33.8.dist-info → openlit-1.33.10.dist-info}/METADATA +1 -1
- openlit-1.33.10.dist-info/RECORD +122 -0
- {openlit-1.33.8.dist-info → openlit-1.33.10.dist-info}/WHEEL +1 -1
- openlit/instrumentation/openai/async_azure_openai.py +0 -900
- openlit/instrumentation/openai/azure_openai.py +0 -898
- openlit-1.33.8.dist-info/RECORD +0 -122
- {openlit-1.33.8.dist-info → openlit-1.33.10.dist-info}/LICENSE +0 -0
@@ -5,7 +5,7 @@ Module for monitoring controlflow.
|
|
5
5
|
|
6
6
|
import logging
|
7
7
|
from opentelemetry.trace import SpanKind, Status, StatusCode
|
8
|
-
from opentelemetry.sdk.resources import TELEMETRY_SDK_NAME
|
8
|
+
from opentelemetry.sdk.resources import SERVICE_NAME, TELEMETRY_SDK_NAME, DEPLOYMENT_ENVIRONMENT
|
9
9
|
from openlit.__helpers import handle_exception
|
10
10
|
from openlit.semcov import SemanticConvetion
|
11
11
|
|
@@ -64,12 +64,12 @@ def wrap_controlflow(gen_ai_endpoint, version, environment, application_name,
|
|
64
64
|
gen_ai_endpoint)
|
65
65
|
span.set_attribute(SemanticConvetion.GEN_AI_SYSTEM,
|
66
66
|
SemanticConvetion.GEN_AI_SYSTEM_CONTROLFLOW)
|
67
|
-
span.set_attribute(
|
67
|
+
span.set_attribute(DEPLOYMENT_ENVIRONMENT,
|
68
68
|
environment)
|
69
|
-
span.set_attribute(
|
69
|
+
span.set_attribute(SERVICE_NAME,
|
70
70
|
application_name)
|
71
|
-
span.set_attribute(SemanticConvetion.
|
72
|
-
SemanticConvetion.
|
71
|
+
span.set_attribute(SemanticConvetion.GEN_AI_OPERATION,
|
72
|
+
SemanticConvetion.GEN_AI_OPERATION_TYPE_AGENT)
|
73
73
|
|
74
74
|
if gen_ai_endpoint == "controlflow.create_agent":
|
75
75
|
span.set_attribute(SemanticConvetion.GEN_AI_AGENT_ROLE,
|
@@ -5,7 +5,7 @@ Module for monitoring Crawl4AI calls.
|
|
5
5
|
|
6
6
|
import logging
|
7
7
|
from opentelemetry.trace import SpanKind, Status, StatusCode
|
8
|
-
from opentelemetry.sdk.resources import TELEMETRY_SDK_NAME
|
8
|
+
from opentelemetry.sdk.resources import SERVICE_NAME, TELEMETRY_SDK_NAME, DEPLOYMENT_ENVIRONMENT
|
9
9
|
from openlit.__helpers import (
|
10
10
|
handle_exception,
|
11
11
|
)
|
@@ -58,13 +58,13 @@ def async_wrap_crawl(gen_ai_endpoint, version, environment, application_name,
|
|
58
58
|
span.set_attribute(TELEMETRY_SDK_NAME, "openlit")
|
59
59
|
span.set_attribute(SemanticConvetion.GEN_AI_SYSTEM,
|
60
60
|
SemanticConvetion.GEN_AI_SYSTEM_CRAWL4AI)
|
61
|
-
span.set_attribute(SemanticConvetion.
|
62
|
-
SemanticConvetion.
|
61
|
+
span.set_attribute(SemanticConvetion.GEN_AI_OPERATION,
|
62
|
+
SemanticConvetion.GEN_AI_OPERATION_TYPE_AGENT)
|
63
63
|
span.set_attribute(SemanticConvetion.GEN_AI_ENDPOINT,
|
64
64
|
gen_ai_endpoint)
|
65
|
-
span.set_attribute(
|
65
|
+
span.set_attribute(SERVICE_NAME,
|
66
66
|
application_name)
|
67
|
-
span.set_attribute(
|
67
|
+
span.set_attribute(DEPLOYMENT_ENVIRONMENT,
|
68
68
|
environment)
|
69
69
|
span.set_attribute(SemanticConvetion.GEN_AI_AGENT_TYPE,
|
70
70
|
SemanticConvetion.GEN_AI_AGENT_TYPE_BROWSER)
|
@@ -5,7 +5,7 @@ Module for monitoring Crawl4AI calls.
|
|
5
5
|
|
6
6
|
import logging
|
7
7
|
from opentelemetry.trace import SpanKind, Status, StatusCode
|
8
|
-
from opentelemetry.sdk.resources import TELEMETRY_SDK_NAME
|
8
|
+
from opentelemetry.sdk.resources import SERVICE_NAME, TELEMETRY_SDK_NAME, DEPLOYMENT_ENVIRONMENT
|
9
9
|
from openlit.__helpers import (
|
10
10
|
handle_exception,
|
11
11
|
)
|
@@ -58,13 +58,13 @@ def wrap_crawl(gen_ai_endpoint, version, environment, application_name,
|
|
58
58
|
span.set_attribute(TELEMETRY_SDK_NAME, "openlit")
|
59
59
|
span.set_attribute(SemanticConvetion.GEN_AI_SYSTEM,
|
60
60
|
SemanticConvetion.GEN_AI_SYSTEM_CRAWL4AI)
|
61
|
-
span.set_attribute(SemanticConvetion.
|
62
|
-
SemanticConvetion.
|
61
|
+
span.set_attribute(SemanticConvetion.GEN_AI_OPERATION,
|
62
|
+
SemanticConvetion.GEN_AI_OPERATION_TYPE_AGENT)
|
63
63
|
span.set_attribute(SemanticConvetion.GEN_AI_ENDPOINT,
|
64
64
|
gen_ai_endpoint)
|
65
|
-
span.set_attribute(
|
65
|
+
span.set_attribute(SERVICE_NAME,
|
66
66
|
application_name)
|
67
|
-
span.set_attribute(
|
67
|
+
span.set_attribute(DEPLOYMENT_ENVIRONMENT,
|
68
68
|
environment)
|
69
69
|
span.set_attribute(SemanticConvetion.GEN_AI_AGENT_TYPE,
|
70
70
|
SemanticConvetion.GEN_AI_AGENT_TYPE_BROWSER)
|
@@ -6,7 +6,7 @@ Module for monitoring LiteLLM calls.
|
|
6
6
|
import logging
|
7
7
|
import json
|
8
8
|
from opentelemetry.trace import SpanKind, Status, StatusCode
|
9
|
-
from opentelemetry.sdk.resources import TELEMETRY_SDK_NAME
|
9
|
+
from opentelemetry.sdk.resources import SERVICE_NAME, TELEMETRY_SDK_NAME, DEPLOYMENT_ENVIRONMENT
|
10
10
|
from openlit.__helpers import (
|
11
11
|
handle_exception,
|
12
12
|
)
|
@@ -71,12 +71,14 @@ def crew_wrap(gen_ai_endpoint, version, environment, application_name,
|
|
71
71
|
span.set_attribute(TELEMETRY_SDK_NAME, "openlit")
|
72
72
|
span.set_attribute(SemanticConvetion.GEN_AI_SYSTEM,
|
73
73
|
SemanticConvetion.GEN_AI_SYSTEM_CREWAI)
|
74
|
-
span.set_attribute(SemanticConvetion.
|
75
|
-
SemanticConvetion.
|
74
|
+
span.set_attribute(SemanticConvetion.GEN_AI_OPERATION,
|
75
|
+
SemanticConvetion.GEN_AI_OPERATION_TYPE_AGENT)
|
76
76
|
span.set_attribute(SemanticConvetion.GEN_AI_ENDPOINT,
|
77
77
|
gen_ai_endpoint)
|
78
|
-
span.set_attribute(
|
78
|
+
span.set_attribute(SERVICE_NAME,
|
79
79
|
application_name)
|
80
|
+
span.set_attribute(DEPLOYMENT_ENVIRONMENT,
|
81
|
+
environment)
|
80
82
|
|
81
83
|
instance_class = instance.__class__.__name__
|
82
84
|
|
@@ -5,7 +5,7 @@ Module for monitoring Dynamiq calls.
|
|
5
5
|
|
6
6
|
import logging
|
7
7
|
from opentelemetry.trace import SpanKind, Status, StatusCode
|
8
|
-
from opentelemetry.sdk.resources import TELEMETRY_SDK_NAME
|
8
|
+
from opentelemetry.sdk.resources import SERVICE_NAME, TELEMETRY_SDK_NAME, DEPLOYMENT_ENVIRONMENT
|
9
9
|
from openlit.__helpers import (
|
10
10
|
handle_exception,
|
11
11
|
)
|
@@ -58,13 +58,13 @@ def dynamiq_wrap(gen_ai_endpoint, version, environment, application_name,
|
|
58
58
|
span.set_attribute(TELEMETRY_SDK_NAME, "openlit")
|
59
59
|
span.set_attribute(SemanticConvetion.GEN_AI_SYSTEM,
|
60
60
|
SemanticConvetion.GEN_AI_SYSTEM_DYNAMIQ)
|
61
|
-
span.set_attribute(SemanticConvetion.
|
62
|
-
SemanticConvetion.
|
61
|
+
span.set_attribute(SemanticConvetion.GEN_AI_OPERATION,
|
62
|
+
SemanticConvetion.GEN_AI_OPERATION_TYPE_AGENT)
|
63
63
|
span.set_attribute(SemanticConvetion.GEN_AI_ENDPOINT,
|
64
64
|
gen_ai_endpoint)
|
65
|
-
span.set_attribute(
|
65
|
+
span.set_attribute(SERVICE_NAME,
|
66
66
|
application_name)
|
67
|
-
span.set_attribute(
|
67
|
+
span.set_attribute(DEPLOYMENT_ENVIRONMENT,
|
68
68
|
environment)
|
69
69
|
|
70
70
|
if gen_ai_endpoint == "dynamiq.agent_run":
|
@@ -1,13 +1,17 @@
|
|
1
|
-
# pylint: disable=duplicate-code, broad-exception-caught, too-many-statements, unused-argument, possibly-used-before-assignment
|
2
1
|
"""
|
3
2
|
Module for monitoring Ollama API calls.
|
4
3
|
"""
|
5
4
|
|
6
5
|
import logging
|
6
|
+
import time
|
7
|
+
from urllib.parse import urlparse
|
7
8
|
from opentelemetry.trace import SpanKind, Status, StatusCode
|
8
|
-
from opentelemetry.sdk.resources import TELEMETRY_SDK_NAME
|
9
|
-
from openlit.__helpers import
|
10
|
-
|
9
|
+
from opentelemetry.sdk.resources import SERVICE_NAME, TELEMETRY_SDK_NAME, DEPLOYMENT_ENVIRONMENT
|
10
|
+
from openlit.__helpers import (
|
11
|
+
get_audio_model_cost,
|
12
|
+
handle_exception,
|
13
|
+
create_metrics_attributes,
|
14
|
+
)
|
11
15
|
from openlit.semcov import SemanticConvetion
|
12
16
|
|
13
17
|
# Initialize logger for logging potential issues and operations
|
@@ -19,7 +23,6 @@ def async_generate(gen_ai_endpoint, version, environment, application_name,
|
|
19
23
|
Generates a telemetry wrapper for creating speech audio to collect metrics.
|
20
24
|
|
21
25
|
Args:
|
22
|
-
gen_ai_endpoint: Endpoint identifier for logging and tracing.
|
23
26
|
version: Version of the monitoring package.
|
24
27
|
environment: Deployment environment (e.g., production, staging).
|
25
28
|
application_name: Name of the application using the ElevenLabs API.
|
@@ -47,73 +50,95 @@ def async_generate(gen_ai_endpoint, version, environment, application_name,
|
|
47
50
|
Returns:
|
48
51
|
The response from the original 'generate' method.
|
49
52
|
"""
|
53
|
+
url = urlparse(instance._client_wrapper._base_url)
|
54
|
+
server_address, server_port = url.hostname, url.port or 443
|
55
|
+
request_model = kwargs.get('model', kwargs.get('model_id', 'eleven_multilingual_v2'))
|
50
56
|
|
51
|
-
|
57
|
+
span_name = f'{SemanticConvetion.GEN_AI_OPERATION_TYPE_AUDIO} {request_model}'
|
58
|
+
|
59
|
+
with tracer.start_as_current_span(span_name, kind= SpanKind.CLIENT) as span:
|
60
|
+
start_time = time.time()
|
52
61
|
response = await wrapped(*args, **kwargs)
|
62
|
+
end_time = time.time()
|
53
63
|
|
54
64
|
try:
|
55
65
|
# Calculate cost of the operation
|
56
|
-
cost = get_audio_model_cost(
|
57
|
-
pricing_info, kwargs.get(
|
66
|
+
cost = get_audio_model_cost(request_model,
|
67
|
+
pricing_info, kwargs.get('text', ''))
|
58
68
|
|
59
69
|
# Set Span attributes
|
60
|
-
span.set_attribute(TELEMETRY_SDK_NAME,
|
70
|
+
span.set_attribute(TELEMETRY_SDK_NAME, 'openlit')
|
71
|
+
span.set_attribute(SemanticConvetion.GEN_AI_OPERATION,
|
72
|
+
SemanticConvetion.GEN_AI_OPERATION_TYPE_AUDIO)
|
61
73
|
span.set_attribute(SemanticConvetion.GEN_AI_SYSTEM,
|
62
|
-
SemanticConvetion.
|
63
|
-
span.set_attribute(SemanticConvetion.
|
64
|
-
|
65
|
-
span.set_attribute(SemanticConvetion.
|
66
|
-
|
67
|
-
span.set_attribute(SemanticConvetion.
|
68
|
-
|
69
|
-
span.set_attribute(SemanticConvetion.
|
70
|
-
|
74
|
+
SemanticConvetion.GEN_AI_SYSTEM_ASSEMBLYAI)
|
75
|
+
span.set_attribute(SemanticConvetion.GEN_AI_REQUEST_MODEL,
|
76
|
+
request_model)
|
77
|
+
span.set_attribute(SemanticConvetion.SERVER_ADDRESS,
|
78
|
+
server_address)
|
79
|
+
span.set_attribute(SemanticConvetion.SERVER_PORT,
|
80
|
+
server_port)
|
81
|
+
span.set_attribute(SemanticConvetion.GEN_AI_RESPONSE_MODEL,
|
82
|
+
request_model)
|
71
83
|
span.set_attribute(SemanticConvetion.GEN_AI_REQUEST_MODEL,
|
72
|
-
|
73
|
-
|
84
|
+
request_model)
|
85
|
+
span.set_attribute(SemanticConvetion.GEN_AI_OUTPUT_TYPE,
|
86
|
+
'audio')
|
87
|
+
|
88
|
+
# Set Span attributes (Extras)
|
89
|
+
if gen_ai_endpoint == 'elevenlabs.generate':
|
90
|
+
if isinstance(kwargs.get('voice', 'Rachel'), str):
|
91
|
+
span.set_attribute(SemanticConvetion.GEN_AI_REQUEST_AUDIO_VOICE,
|
92
|
+
kwargs.get('voice', 'Rachel'))
|
93
|
+
else:
|
74
94
|
span.set_attribute(SemanticConvetion.GEN_AI_REQUEST_AUDIO_VOICE,
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
95
|
+
kwargs.get('voice_id', ''))
|
96
|
+
span.set_attribute(SemanticConvetion.GEN_AI_REQUEST_AUDIO_RESPONSE_FORMAT,
|
97
|
+
kwargs.get('output_format', 'mp3'))
|
98
|
+
span.set_attribute(SemanticConvetion.GEN_AI_REQUEST_AUDIO_SETTINGS,
|
99
|
+
str(kwargs.get('voice_settings', '')))
|
100
|
+
span.set_attribute(DEPLOYMENT_ENVIRONMENT,
|
101
|
+
environment)
|
102
|
+
span.set_attribute(SERVICE_NAME,
|
103
|
+
application_name)
|
104
|
+
span.set_attribute(SemanticConvetion.GEN_AI_USAGE_COST,
|
105
|
+
cost)
|
106
|
+
span.set_attribute(SemanticConvetion.GEN_AI_SDK_VERSION,
|
107
|
+
version)
|
82
108
|
if trace_content:
|
83
109
|
span.add_event(
|
84
110
|
name=SemanticConvetion.GEN_AI_CONTENT_PROMPT_EVENT,
|
85
111
|
attributes={
|
86
|
-
SemanticConvetion.GEN_AI_CONTENT_PROMPT: str(kwargs.get(
|
112
|
+
SemanticConvetion.GEN_AI_CONTENT_PROMPT: str(kwargs.get('text', '')),
|
87
113
|
},
|
88
114
|
)
|
89
115
|
|
90
116
|
span.set_status(Status(StatusCode.OK))
|
91
117
|
|
92
118
|
if disable_metrics is False:
|
93
|
-
attributes =
|
94
|
-
|
95
|
-
|
96
|
-
SemanticConvetion.
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
metrics[
|
109
|
-
metrics["genai_cost"].record(cost, attributes)
|
119
|
+
attributes = create_metrics_attributes(
|
120
|
+
service_name=application_name,
|
121
|
+
deployment_environment=environment,
|
122
|
+
operation=SemanticConvetion.GEN_AI_OPERATION_TYPE_AUDIO,
|
123
|
+
system=SemanticConvetion.GEN_AI_SYSTEM_ELEVENLABS,
|
124
|
+
request_model=request_model,
|
125
|
+
server_address=server_address,
|
126
|
+
server_port=server_port,
|
127
|
+
response_model=request_model,
|
128
|
+
)
|
129
|
+
|
130
|
+
metrics['genai_client_operation_duration'].record(
|
131
|
+
end_time - start_time, attributes
|
132
|
+
)
|
133
|
+
metrics['genai_requests'].add(1, attributes)
|
134
|
+
metrics['genai_cost'].record(cost, attributes)
|
110
135
|
|
111
136
|
# Return original response
|
112
137
|
return response
|
113
138
|
|
114
139
|
except Exception as e:
|
115
140
|
handle_exception(span, e)
|
116
|
-
logger.error(
|
141
|
+
logger.error('Error in trace creation: %s', e)
|
117
142
|
|
118
143
|
# Return original response
|
119
144
|
return response
|
@@ -1,13 +1,17 @@
|
|
1
|
-
# pylint: disable=duplicate-code, broad-exception-caught, too-many-statements, unused-argument, possibly-used-before-assignment
|
2
1
|
"""
|
3
2
|
Module for monitoring Ollama API calls.
|
4
3
|
"""
|
5
4
|
|
6
5
|
import logging
|
6
|
+
import time
|
7
|
+
from urllib.parse import urlparse
|
7
8
|
from opentelemetry.trace import SpanKind, Status, StatusCode
|
8
|
-
from opentelemetry.sdk.resources import TELEMETRY_SDK_NAME
|
9
|
-
from openlit.__helpers import
|
10
|
-
|
9
|
+
from opentelemetry.sdk.resources import SERVICE_NAME, TELEMETRY_SDK_NAME, DEPLOYMENT_ENVIRONMENT
|
10
|
+
from openlit.__helpers import (
|
11
|
+
get_audio_model_cost,
|
12
|
+
handle_exception,
|
13
|
+
create_metrics_attributes,
|
14
|
+
)
|
11
15
|
from openlit.semcov import SemanticConvetion
|
12
16
|
|
13
17
|
# Initialize logger for logging potential issues and operations
|
@@ -19,7 +23,6 @@ def generate(gen_ai_endpoint, version, environment, application_name,
|
|
19
23
|
Generates a telemetry wrapper for creating speech audio to collect metrics.
|
20
24
|
|
21
25
|
Args:
|
22
|
-
gen_ai_endpoint: Endpoint identifier for logging and tracing.
|
23
26
|
version: Version of the monitoring package.
|
24
27
|
environment: Deployment environment (e.g., production, staging).
|
25
28
|
application_name: Name of the application using the ElevenLabs API.
|
@@ -48,78 +51,95 @@ def generate(gen_ai_endpoint, version, environment, application_name,
|
|
48
51
|
The response from the original 'generate' method.
|
49
52
|
"""
|
50
53
|
|
51
|
-
|
54
|
+
url = urlparse(instance._client_wrapper._base_url)
|
55
|
+
server_address, server_port = url.hostname, url.port or 443
|
56
|
+
request_model = kwargs.get('model', kwargs.get('model_id', 'eleven_multilingual_v2'))
|
57
|
+
|
58
|
+
span_name = f'{SemanticConvetion.GEN_AI_OPERATION_TYPE_AUDIO} {request_model}'
|
59
|
+
|
60
|
+
with tracer.start_as_current_span(span_name, kind= SpanKind.CLIENT) as span:
|
61
|
+
start_time = time.time()
|
52
62
|
response = wrapped(*args, **kwargs)
|
63
|
+
end_time = time.time()
|
53
64
|
|
54
65
|
try:
|
55
66
|
# Calculate cost of the operation
|
56
|
-
cost = get_audio_model_cost(
|
57
|
-
pricing_info, kwargs.get(
|
67
|
+
cost = get_audio_model_cost(request_model,
|
68
|
+
pricing_info, kwargs.get('text', ''))
|
58
69
|
|
59
70
|
# Set Span attributes
|
60
|
-
span.set_attribute(TELEMETRY_SDK_NAME,
|
71
|
+
span.set_attribute(TELEMETRY_SDK_NAME, 'openlit')
|
72
|
+
span.set_attribute(SemanticConvetion.GEN_AI_OPERATION,
|
73
|
+
SemanticConvetion.GEN_AI_OPERATION_TYPE_AUDIO)
|
61
74
|
span.set_attribute(SemanticConvetion.GEN_AI_SYSTEM,
|
62
|
-
SemanticConvetion.
|
63
|
-
span.set_attribute(SemanticConvetion.
|
64
|
-
|
65
|
-
span.set_attribute(SemanticConvetion.
|
66
|
-
|
67
|
-
span.set_attribute(SemanticConvetion.
|
68
|
-
|
69
|
-
span.set_attribute(SemanticConvetion.
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
+
SemanticConvetion.GEN_AI_SYSTEM_ASSEMBLYAI)
|
76
|
+
span.set_attribute(SemanticConvetion.GEN_AI_REQUEST_MODEL,
|
77
|
+
request_model)
|
78
|
+
span.set_attribute(SemanticConvetion.SERVER_ADDRESS,
|
79
|
+
server_address)
|
80
|
+
span.set_attribute(SemanticConvetion.SERVER_PORT,
|
81
|
+
server_port)
|
82
|
+
span.set_attribute(SemanticConvetion.GEN_AI_RESPONSE_MODEL,
|
83
|
+
request_model)
|
84
|
+
span.set_attribute(SemanticConvetion.GEN_AI_REQUEST_MODEL,
|
85
|
+
request_model)
|
86
|
+
span.set_attribute(SemanticConvetion.GEN_AI_OUTPUT_TYPE,
|
87
|
+
'audio')
|
88
|
+
|
89
|
+
# Set Span attributes (Extras)
|
90
|
+
if gen_ai_endpoint == 'elevenlabs.generate':
|
91
|
+
if isinstance(kwargs.get('voice', 'Rachel'), str):
|
75
92
|
span.set_attribute(SemanticConvetion.GEN_AI_REQUEST_AUDIO_VOICE,
|
76
|
-
kwargs.get(
|
93
|
+
kwargs.get('voice', 'Rachel'))
|
77
94
|
else:
|
78
|
-
span.set_attribute(SemanticConvetion.GEN_AI_REQUEST_MODEL,
|
79
|
-
kwargs.get("model_id", "eleven_multilingual_v2"))
|
80
95
|
span.set_attribute(SemanticConvetion.GEN_AI_REQUEST_AUDIO_VOICE,
|
81
|
-
kwargs.get(
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
96
|
+
kwargs.get('voice_id', ''))
|
97
|
+
span.set_attribute(SemanticConvetion.GEN_AI_REQUEST_AUDIO_RESPONSE_FORMAT,
|
98
|
+
kwargs.get('output_format', 'mp3'))
|
99
|
+
span.set_attribute(SemanticConvetion.GEN_AI_REQUEST_AUDIO_SETTINGS,
|
100
|
+
str(kwargs.get('voice_settings', '')))
|
101
|
+
span.set_attribute(DEPLOYMENT_ENVIRONMENT,
|
102
|
+
environment)
|
103
|
+
span.set_attribute(SERVICE_NAME,
|
104
|
+
application_name)
|
105
|
+
span.set_attribute(SemanticConvetion.GEN_AI_USAGE_COST,
|
106
|
+
cost)
|
107
|
+
span.set_attribute(SemanticConvetion.GEN_AI_SDK_VERSION,
|
108
|
+
version)
|
88
109
|
if trace_content:
|
89
110
|
span.add_event(
|
90
111
|
name=SemanticConvetion.GEN_AI_CONTENT_PROMPT_EVENT,
|
91
112
|
attributes={
|
92
|
-
SemanticConvetion.GEN_AI_CONTENT_PROMPT: str(kwargs.get(
|
113
|
+
SemanticConvetion.GEN_AI_CONTENT_PROMPT: str(kwargs.get('text', '')),
|
93
114
|
},
|
94
115
|
)
|
95
116
|
|
96
117
|
span.set_status(Status(StatusCode.OK))
|
97
118
|
|
98
119
|
if disable_metrics is False:
|
99
|
-
attributes =
|
100
|
-
|
101
|
-
|
102
|
-
SemanticConvetion.
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
metrics[
|
115
|
-
metrics["genai_cost"].record(cost, attributes)
|
120
|
+
attributes = create_metrics_attributes(
|
121
|
+
service_name=application_name,
|
122
|
+
deployment_environment=environment,
|
123
|
+
operation=SemanticConvetion.GEN_AI_OPERATION_TYPE_AUDIO,
|
124
|
+
system=SemanticConvetion.GEN_AI_SYSTEM_ELEVENLABS,
|
125
|
+
request_model=request_model,
|
126
|
+
server_address=server_address,
|
127
|
+
server_port=server_port,
|
128
|
+
response_model=request_model,
|
129
|
+
)
|
130
|
+
|
131
|
+
metrics['genai_client_operation_duration'].record(
|
132
|
+
end_time - start_time, attributes
|
133
|
+
)
|
134
|
+
metrics['genai_requests'].add(1, attributes)
|
135
|
+
metrics['genai_cost'].record(cost, attributes)
|
116
136
|
|
117
137
|
# Return original response
|
118
138
|
return response
|
119
139
|
|
120
140
|
except Exception as e:
|
121
141
|
handle_exception(span, e)
|
122
|
-
logger.error(
|
142
|
+
logger.error('Error in trace creation: %s', e)
|
123
143
|
|
124
144
|
# Return original response
|
125
145
|
return response
|
@@ -5,7 +5,7 @@ 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 TELEMETRY_SDK_NAME
|
8
|
+
from opentelemetry.sdk.resources import SERVICE_NAME, TELEMETRY_SDK_NAME, DEPLOYMENT_ENVIRONMENT
|
9
9
|
from openlit.__helpers import handle_exception
|
10
10
|
from openlit.semcov import SemanticConvetion
|
11
11
|
|
@@ -63,11 +63,11 @@ def evaluate(gen_ai_endpoint, version, environment, application_name,
|
|
63
63
|
SemanticConvetion.GEN_AI_SYSTEM_EMBEDCHAIN)
|
64
64
|
span.set_attribute(SemanticConvetion.GEN_AI_ENDPOINT,
|
65
65
|
gen_ai_endpoint)
|
66
|
-
span.set_attribute(
|
66
|
+
span.set_attribute(DEPLOYMENT_ENVIRONMENT,
|
67
67
|
environment)
|
68
|
-
span.set_attribute(SemanticConvetion.
|
69
|
-
SemanticConvetion.
|
70
|
-
span.set_attribute(
|
68
|
+
span.set_attribute(SemanticConvetion.GEN_AI_OPERATION,
|
69
|
+
SemanticConvetion.GEN_AI_OPERATION_TYPE_FRAMEWORK)
|
70
|
+
span.set_attribute(SERVICE_NAME,
|
71
71
|
application_name)
|
72
72
|
span.set_attribute(SemanticConvetion.GEN_AI_EVAL_CONTEXT_RELEVANCY,
|
73
73
|
response["context_relevancy"])
|
@@ -141,11 +141,11 @@ def get_data_sources(gen_ai_endpoint, version, environment, application_name,
|
|
141
141
|
SemanticConvetion.GEN_AI_SYSTEM_EMBEDCHAIN)
|
142
142
|
span.set_attribute(SemanticConvetion.GEN_AI_ENDPOINT,
|
143
143
|
gen_ai_endpoint)
|
144
|
-
span.set_attribute(
|
144
|
+
span.set_attribute(DEPLOYMENT_ENVIRONMENT,
|
145
145
|
environment)
|
146
|
-
span.set_attribute(SemanticConvetion.
|
147
|
-
SemanticConvetion.
|
148
|
-
span.set_attribute(
|
146
|
+
span.set_attribute(SemanticConvetion.GEN_AI_OPERATION,
|
147
|
+
SemanticConvetion.GEN_AI_OPERATION_TYPE_FRAMEWORK)
|
148
|
+
span.set_attribute(SERVICE_NAME,
|
149
149
|
application_name)
|
150
150
|
span.set_attribute(SemanticConvetion.GEN_AI_DATA_SOURCES,
|
151
151
|
len(response))
|
@@ -5,7 +5,7 @@ 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 TELEMETRY_SDK_NAME
|
8
|
+
from opentelemetry.sdk.resources import SERVICE_NAME, TELEMETRY_SDK_NAME, DEPLOYMENT_ENVIRONMENT
|
9
9
|
from openlit.__helpers import (
|
10
10
|
handle_exception,
|
11
11
|
)
|
@@ -58,13 +58,13 @@ def wrap_crawl(gen_ai_endpoint, version, environment, application_name,
|
|
58
58
|
span.set_attribute(TELEMETRY_SDK_NAME, "openlit")
|
59
59
|
span.set_attribute(SemanticConvetion.GEN_AI_SYSTEM,
|
60
60
|
SemanticConvetion.GEN_AI_SYSTEM_FIRECRAWL)
|
61
|
-
span.set_attribute(SemanticConvetion.
|
62
|
-
SemanticConvetion.
|
61
|
+
span.set_attribute(SemanticConvetion.GEN_AI_OPERATION,
|
62
|
+
SemanticConvetion.GEN_AI_OPERATION_TYPE_AGENT)
|
63
63
|
span.set_attribute(SemanticConvetion.GEN_AI_ENDPOINT,
|
64
64
|
gen_ai_endpoint)
|
65
|
-
span.set_attribute(
|
65
|
+
span.set_attribute(SERVICE_NAME,
|
66
66
|
application_name)
|
67
|
-
span.set_attribute(
|
67
|
+
span.set_attribute(DEPLOYMENT_ENVIRONMENT,
|
68
68
|
environment)
|
69
69
|
span.set_attribute(SemanticConvetion.GEN_AI_AGENT_TYPE,
|
70
70
|
SemanticConvetion.GEN_AI_AGENT_TYPE_BROWSER)
|
@@ -14,11 +14,11 @@ from openlit.instrumentation.google_ai_studio.async_google_ai_studio import (
|
|
14
14
|
async_generate
|
15
15
|
)
|
16
16
|
|
17
|
-
_instruments = ("google-
|
17
|
+
_instruments = ("google-genai >= 1.3.0",)
|
18
18
|
|
19
19
|
class GoogleAIStudioInstrumentor(BaseInstrumentor):
|
20
20
|
"""
|
21
|
-
An instrumentor for google-
|
21
|
+
An instrumentor for google-genai's client library.
|
22
22
|
"""
|
23
23
|
|
24
24
|
def instrumentation_dependencies(self) -> Collection[str]:
|
@@ -32,21 +32,21 @@ class GoogleAIStudioInstrumentor(BaseInstrumentor):
|
|
32
32
|
pricing_info = kwargs.get("pricing_info", {})
|
33
33
|
trace_content = kwargs.get("trace_content", False)
|
34
34
|
disable_metrics = kwargs.get("disable_metrics")
|
35
|
-
version = importlib.metadata.version("google-
|
35
|
+
version = importlib.metadata.version("google-genai")
|
36
36
|
|
37
37
|
# sync generate
|
38
38
|
wrap_function_wrapper(
|
39
|
-
"google.
|
40
|
-
"
|
41
|
-
generate(
|
39
|
+
"google.genai.models",
|
40
|
+
"Models.generate_content",
|
41
|
+
generate(version, environment, application_name,
|
42
42
|
tracer, pricing_info, trace_content, metrics, disable_metrics),
|
43
43
|
)
|
44
44
|
|
45
45
|
# async generate
|
46
46
|
wrap_function_wrapper(
|
47
|
-
"google.
|
48
|
-
"
|
49
|
-
async_generate(
|
47
|
+
"google.genai.models",
|
48
|
+
"AsyncModels.generate_content",
|
49
|
+
async_generate(version, environment,
|
50
50
|
application_name, tracer, pricing_info, trace_content, metrics,
|
51
51
|
disable_metrics),
|
52
52
|
)
|