openlit 1.34.26__py3-none-any.whl → 1.34.28__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 +38 -0
- openlit/__init__.py +22 -155
- openlit/_instrumentors.py +144 -0
- openlit/guard/all.py +3 -3
- openlit/instrumentation/astra/__init__.py +71 -159
- openlit/instrumentation/astra/astra.py +32 -22
- openlit/instrumentation/astra/async_astra.py +32 -22
- openlit/instrumentation/astra/utils.py +263 -88
- openlit/instrumentation/chroma/utils.py +2 -2
- openlit/instrumentation/controlflow/controlflow.py +2 -2
- openlit/instrumentation/embedchain/embedchain.py +4 -4
- openlit/instrumentation/groq/__init__.py +4 -4
- openlit/instrumentation/haystack/__init__.py +57 -28
- openlit/instrumentation/haystack/async_haystack.py +54 -0
- openlit/instrumentation/haystack/haystack.py +35 -65
- openlit/instrumentation/haystack/utils.py +377 -0
- openlit/instrumentation/julep/async_julep.py +2 -2
- openlit/instrumentation/julep/julep.py +2 -2
- openlit/instrumentation/langchain_community/utils.py +2 -2
- openlit/instrumentation/llamaindex/__init__.py +165 -37
- openlit/instrumentation/llamaindex/async_llamaindex.py +53 -0
- openlit/instrumentation/llamaindex/llamaindex.py +32 -64
- openlit/instrumentation/llamaindex/utils.py +412 -0
- openlit/instrumentation/mem0/mem0.py +2 -2
- openlit/instrumentation/milvus/__init__.py +30 -68
- openlit/instrumentation/milvus/milvus.py +34 -161
- openlit/instrumentation/milvus/utils.py +276 -0
- openlit/instrumentation/openai/__init__.py +24 -24
- openlit/instrumentation/openai/utils.py +10 -4
- openlit/instrumentation/pinecone/utils.py +2 -2
- openlit/instrumentation/qdrant/utils.py +2 -2
- openlit/instrumentation/together/__init__.py +8 -8
- openlit/semcov/__init__.py +79 -0
- {openlit-1.34.26.dist-info → openlit-1.34.28.dist-info}/METADATA +1 -1
- {openlit-1.34.26.dist-info → openlit-1.34.28.dist-info}/RECORD +37 -31
- {openlit-1.34.26.dist-info → openlit-1.34.28.dist-info}/LICENSE +0 -0
- {openlit-1.34.26.dist-info → openlit-1.34.28.dist-info}/WHEEL +0 -0
openlit/__helpers.py
CHANGED
@@ -469,6 +469,44 @@ def common_db_span_attributes(scope, db_system, server_address, server_port,
|
|
469
469
|
scope._span.set_attribute(SERVICE_NAME, application_name)
|
470
470
|
scope._span.set_attribute(SemanticConvention.DB_SDK_VERSION, version)
|
471
471
|
|
472
|
+
def common_framework_span_attributes(scope, framework_system, server_address, server_port,
|
473
|
+
environment, application_name, version, endpoint, instance=None):
|
474
|
+
"""
|
475
|
+
Set common span attributes for GenAI framework operations.
|
476
|
+
"""
|
477
|
+
|
478
|
+
scope._span.set_attribute(TELEMETRY_SDK_NAME, "openlit")
|
479
|
+
scope._span.set_attribute(SemanticConvention.GEN_AI_SDK_VERSION, version)
|
480
|
+
scope._span.set_attribute(SemanticConvention.GEN_AI_SYSTEM, framework_system)
|
481
|
+
scope._span.set_attribute(SemanticConvention.GEN_AI_OPERATION, endpoint)
|
482
|
+
scope._span.set_attribute(SemanticConvention.GEN_AI_REQUEST_MODEL,
|
483
|
+
getattr(instance, "model_name", "unknown") if instance else "unknown")
|
484
|
+
scope._span.set_attribute(SemanticConvention.SERVER_ADDRESS, server_address)
|
485
|
+
scope._span.set_attribute(SemanticConvention.SERVER_PORT, server_port)
|
486
|
+
scope._span.set_attribute(DEPLOYMENT_ENVIRONMENT, environment)
|
487
|
+
scope._span.set_attribute(SERVICE_NAME, application_name)
|
488
|
+
scope._span.set_attribute(SemanticConvention.GEN_AI_CLIENT_OPERATION_DURATION,
|
489
|
+
scope._end_time - scope._start_time)
|
490
|
+
|
491
|
+
def record_framework_metrics(metrics, gen_ai_operation, gen_ai_system, server_address, server_port,
|
492
|
+
environment, application_name, start_time, end_time):
|
493
|
+
"""
|
494
|
+
Record basic framework metrics for the operation (only gen_ai_requests counter).
|
495
|
+
"""
|
496
|
+
|
497
|
+
attributes = create_metrics_attributes(
|
498
|
+
operation=gen_ai_operation,
|
499
|
+
system=gen_ai_system,
|
500
|
+
server_address=server_address,
|
501
|
+
server_port=server_port,
|
502
|
+
request_model="unknown",
|
503
|
+
response_model="unknown",
|
504
|
+
service_name=application_name,
|
505
|
+
deployment_environment=environment,
|
506
|
+
)
|
507
|
+
metrics["genai_requests"].add(1, attributes)
|
508
|
+
metrics["genai_client_operation_duration"].record(end_time - start_time, attributes)
|
509
|
+
|
472
510
|
def record_db_metrics(metrics, db_system, server_address, server_port,
|
473
511
|
environment, application_name, start_time, end_time):
|
474
512
|
"""
|
openlit/__init__.py
CHANGED
@@ -13,7 +13,6 @@ from functools import wraps
|
|
13
13
|
from contextlib import contextmanager
|
14
14
|
import requests
|
15
15
|
|
16
|
-
|
17
16
|
# Import internal modules for setting up tracing and fetching pricing info.
|
18
17
|
from opentelemetry import trace as t
|
19
18
|
from opentelemetry.trace import SpanKind, Status, StatusCode, Span
|
@@ -23,52 +22,12 @@ from openlit.otel.tracing import setup_tracing
|
|
23
22
|
from openlit.otel.metrics import setup_meter
|
24
23
|
from openlit.otel.events import setup_events
|
25
24
|
from openlit.__helpers import fetch_pricing_info, get_env_variable
|
25
|
+
from openlit._instrumentors import MODULE_NAME_MAP, get_all_instrumentors
|
26
26
|
|
27
|
-
#
|
28
|
-
from openlit.instrumentation.openai import OpenAIInstrumentor
|
29
|
-
from openlit.instrumentation.anthropic import AnthropicInstrumentor
|
30
|
-
from openlit.instrumentation.cohere import CohereInstrumentor
|
31
|
-
from openlit.instrumentation.mistral import MistralInstrumentor
|
32
|
-
from openlit.instrumentation.bedrock import BedrockInstrumentor
|
33
|
-
from openlit.instrumentation.vertexai import VertexAIInstrumentor
|
34
|
-
from openlit.instrumentation.groq import GroqInstrumentor
|
35
|
-
from openlit.instrumentation.ollama import OllamaInstrumentor
|
36
|
-
from openlit.instrumentation.gpt4all import GPT4AllInstrumentor
|
37
|
-
from openlit.instrumentation.elevenlabs import ElevenLabsInstrumentor
|
38
|
-
from openlit.instrumentation.vllm import VLLMInstrumentor
|
39
|
-
from openlit.instrumentation.google_ai_studio import GoogleAIStudioInstrumentor
|
40
|
-
from openlit.instrumentation.reka import RekaInstrumentor
|
41
|
-
from openlit.instrumentation.premai import PremAIInstrumentor
|
42
|
-
from openlit.instrumentation.assemblyai import AssemblyAIInstrumentor
|
43
|
-
from openlit.instrumentation.azure_ai_inference import AzureAIInferenceInstrumentor
|
44
|
-
from openlit.instrumentation.langchain import LangChainInstrumentor
|
45
|
-
from openlit.instrumentation.langchain_community import LangChainCommunityInstrumentor
|
46
|
-
from openlit.instrumentation.llamaindex import LlamaIndexInstrumentor
|
47
|
-
from openlit.instrumentation.haystack import HaystackInstrumentor
|
48
|
-
from openlit.instrumentation.embedchain import EmbedChainInstrumentor
|
49
|
-
from openlit.instrumentation.mem0 import Mem0Instrumentor
|
50
|
-
from openlit.instrumentation.chroma import ChromaInstrumentor
|
51
|
-
from openlit.instrumentation.pinecone import PineconeInstrumentor
|
52
|
-
from openlit.instrumentation.qdrant import QdrantInstrumentor
|
53
|
-
from openlit.instrumentation.milvus import MilvusInstrumentor
|
54
|
-
from openlit.instrumentation.astra import AstraInstrumentor
|
55
|
-
from openlit.instrumentation.transformers import TransformersInstrumentor
|
56
|
-
from openlit.instrumentation.litellm import LiteLLMInstrumentor
|
57
|
-
from openlit.instrumentation.together import TogetherInstrumentor
|
58
|
-
from openlit.instrumentation.crewai import CrewAIInstrumentor
|
59
|
-
from openlit.instrumentation.ag2 import AG2Instrumentor
|
60
|
-
from openlit.instrumentation.multion import MultiOnInstrumentor
|
61
|
-
from openlit.instrumentation.dynamiq import DynamiqInstrumentor
|
62
|
-
from openlit.instrumentation.phidata import PhidataInstrumentor
|
63
|
-
from openlit.instrumentation.julep import JulepInstrumentor
|
64
|
-
from openlit.instrumentation.ai21 import AI21Instrumentor
|
65
|
-
from openlit.instrumentation.controlflow import ControlFlowInstrumentor
|
66
|
-
from openlit.instrumentation.crawl4ai import Crawl4AIInstrumentor
|
67
|
-
from openlit.instrumentation.firecrawl import FireCrawlInstrumentor
|
68
|
-
from openlit.instrumentation.letta import LettaInstrumentor
|
69
|
-
from openlit.instrumentation.openai_agents import OpenAIAgentsInstrumentor
|
70
|
-
from openlit.instrumentation.pydantic_ai import PydanticAIInstrumentor
|
27
|
+
# Import GPU instrumentor separately as it doesn't follow the standard pattern
|
71
28
|
from openlit.instrumentation.gpu import GPUInstrumentor
|
29
|
+
|
30
|
+
# Import guards and evals
|
72
31
|
import openlit.guard
|
73
32
|
import openlit.evals
|
74
33
|
|
@@ -93,6 +52,7 @@ class OpenlitConfig:
|
|
93
52
|
otlp_headers (Optional[Dict[str, str]]): Headers for OTLP.
|
94
53
|
disable_batch (bool): Flag to disable batch span processing in tracing.
|
95
54
|
capture_message_content (bool): Flag to enable or disable tracing of content.
|
55
|
+
detailed_tracing (bool): Flag to enable detailed component-level tracing.
|
96
56
|
"""
|
97
57
|
|
98
58
|
_instance = None
|
@@ -118,6 +78,7 @@ class OpenlitConfig:
|
|
118
78
|
cls.disable_batch = False
|
119
79
|
cls.capture_message_content = True
|
120
80
|
cls.disable_metrics = False
|
81
|
+
cls.detailed_tracing = False
|
121
82
|
|
122
83
|
@classmethod
|
123
84
|
def update_config(
|
@@ -133,6 +94,7 @@ class OpenlitConfig:
|
|
133
94
|
metrics_dict,
|
134
95
|
disable_metrics,
|
135
96
|
pricing_json,
|
97
|
+
detailed_tracing,
|
136
98
|
):
|
137
99
|
"""
|
138
100
|
Updates the configuration based on provided parameters.
|
@@ -150,6 +112,7 @@ class OpenlitConfig:
|
|
150
112
|
metrics_dict: Dictionary of metrics.
|
151
113
|
disable_metrics (bool): Flag to disable metrics.
|
152
114
|
pricing_json(str): path or url to the pricing json file
|
115
|
+
detailed_tracing (bool): Flag to enable detailed component-level tracing.
|
153
116
|
"""
|
154
117
|
cls.environment = environment
|
155
118
|
cls.application_name = application_name
|
@@ -162,6 +125,7 @@ class OpenlitConfig:
|
|
162
125
|
cls.disable_batch = disable_batch
|
163
126
|
cls.capture_message_content = capture_message_content
|
164
127
|
cls.disable_metrics = disable_metrics
|
128
|
+
cls.detailed_tracing = detailed_tracing
|
165
129
|
|
166
130
|
|
167
131
|
def module_exists(module_name):
|
@@ -173,20 +137,13 @@ def module_exists(module_name):
|
|
173
137
|
return True
|
174
138
|
|
175
139
|
|
176
|
-
def instrument_if_available(
|
177
|
-
instrumentor_name,
|
178
|
-
instrumentor_instance,
|
179
|
-
config,
|
180
|
-
disabled_instrumentors,
|
181
|
-
module_name_map,
|
182
|
-
):
|
140
|
+
def instrument_if_available(instrumentor_name, instrumentor_instance, config, disabled_instrumentors):
|
183
141
|
"""Instruments the specified instrumentor if its library is available."""
|
184
142
|
if instrumentor_name in disabled_instrumentors:
|
185
143
|
logger.info("Instrumentor %s is disabled", instrumentor_name)
|
186
144
|
return
|
187
145
|
|
188
|
-
module_name =
|
189
|
-
|
146
|
+
module_name = MODULE_NAME_MAP.get(instrumentor_name)
|
190
147
|
if not module_name:
|
191
148
|
logger.error("No module mapping for %s", instrumentor_name)
|
192
149
|
return
|
@@ -202,9 +159,9 @@ def instrument_if_available(
|
|
202
159
|
capture_message_content=config.capture_message_content,
|
203
160
|
metrics_dict=config.metrics_dict,
|
204
161
|
disable_metrics=config.disable_metrics,
|
162
|
+
detailed_tracing=config.detailed_tracing,
|
205
163
|
)
|
206
164
|
else:
|
207
|
-
# pylint: disable=line-too-long
|
208
165
|
logger.info(
|
209
166
|
"Library for %s (%s) not found. Skipping instrumentation",
|
210
167
|
instrumentor_name,
|
@@ -228,6 +185,7 @@ def init(
|
|
228
185
|
disable_metrics=False,
|
229
186
|
pricing_json=None,
|
230
187
|
collect_gpu_stats=False,
|
188
|
+
detailed_tracing=False,
|
231
189
|
):
|
232
190
|
"""
|
233
191
|
Initializes the openLIT configuration and setups tracing.
|
@@ -249,60 +207,15 @@ def init(
|
|
249
207
|
disable_metrics (bool): Flag to disable metrics (Optional).
|
250
208
|
pricing_json(str): File path or url to the pricing json (Optional).
|
251
209
|
collect_gpu_stats (bool): Flag to enable or disable GPU metrics collection.
|
210
|
+
detailed_tracing (bool): Enable detailed component-level tracing for debugging and optimization.
|
211
|
+
Defaults to False to use workflow-level tracing with minimal storage overhead.
|
252
212
|
"""
|
253
213
|
disabled_instrumentors = disabled_instrumentors if disabled_instrumentors else []
|
254
214
|
logger.info("Starting openLIT initialization...")
|
255
215
|
|
256
|
-
|
257
|
-
"openai": "openai",
|
258
|
-
"anthropic": "anthropic",
|
259
|
-
"cohere": "cohere",
|
260
|
-
"mistral": "mistralai",
|
261
|
-
"bedrock": "boto3",
|
262
|
-
"vertexai": "vertexai",
|
263
|
-
"groq": "groq",
|
264
|
-
"ollama": "ollama",
|
265
|
-
"gpt4all": "gpt4all",
|
266
|
-
"elevenlabs": "elevenlabs",
|
267
|
-
"vllm": "vllm",
|
268
|
-
"google-ai-studio": "google.genai",
|
269
|
-
"azure-ai-inference": "azure.ai.inference",
|
270
|
-
"langchain": "langchain",
|
271
|
-
"langchain_community": "langchain_community",
|
272
|
-
"llama_index": "llama_index",
|
273
|
-
"haystack": "haystack",
|
274
|
-
"embedchain": "embedchain",
|
275
|
-
"mem0": "mem0",
|
276
|
-
"chroma": "chromadb",
|
277
|
-
"pinecone": "pinecone",
|
278
|
-
"qdrant": "qdrant_client",
|
279
|
-
"milvus": "pymilvus",
|
280
|
-
"transformers": "transformers",
|
281
|
-
"litellm": "litellm",
|
282
|
-
"crewai": "crewai",
|
283
|
-
"ag2": "ag2",
|
284
|
-
"autogen": "autogen",
|
285
|
-
"pyautogen": "pyautogen",
|
286
|
-
"multion": "multion",
|
287
|
-
"dynamiq": "dynamiq",
|
288
|
-
"phidata": "phi",
|
289
|
-
"reka-api": "reka",
|
290
|
-
"premai": "premai",
|
291
|
-
"julep": "julep",
|
292
|
-
"astra": "astrapy",
|
293
|
-
"ai21": "ai21",
|
294
|
-
"controlflow": "controlflow",
|
295
|
-
"assemblyai": "assemblyai",
|
296
|
-
"crawl4ai": "crawl4ai",
|
297
|
-
"firecrawl": "firecrawl",
|
298
|
-
"letta": "letta",
|
299
|
-
"together": "together",
|
300
|
-
"openai-agents": "agents",
|
301
|
-
"pydantic_ai": "pydantic_ai"
|
302
|
-
}
|
303
|
-
|
216
|
+
# Validate disabled instrumentors
|
304
217
|
invalid_instrumentors = [
|
305
|
-
name for name in disabled_instrumentors if name not in
|
218
|
+
name for name in disabled_instrumentors if name not in MODULE_NAME_MAP
|
306
219
|
]
|
307
220
|
for invalid_name in invalid_instrumentors:
|
308
221
|
logger.warning(
|
@@ -371,63 +284,17 @@ def init(
|
|
371
284
|
metrics_dict,
|
372
285
|
disable_metrics,
|
373
286
|
pricing_json,
|
287
|
+
detailed_tracing,
|
374
288
|
)
|
375
289
|
|
376
|
-
#
|
377
|
-
instrumentor_instances =
|
378
|
-
"openai": OpenAIInstrumentor(),
|
379
|
-
"anthropic": AnthropicInstrumentor(),
|
380
|
-
"cohere": CohereInstrumentor(),
|
381
|
-
"mistral": MistralInstrumentor(),
|
382
|
-
"bedrock": BedrockInstrumentor(),
|
383
|
-
"vertexai": VertexAIInstrumentor(),
|
384
|
-
"groq": GroqInstrumentor(),
|
385
|
-
"ollama": OllamaInstrumentor(),
|
386
|
-
"gpt4all": GPT4AllInstrumentor(),
|
387
|
-
"elevenlabs": ElevenLabsInstrumentor(),
|
388
|
-
"vllm": VLLMInstrumentor(),
|
389
|
-
"google-ai-studio": GoogleAIStudioInstrumentor(),
|
390
|
-
"azure-ai-inference": AzureAIInferenceInstrumentor(),
|
391
|
-
"langchain": LangChainInstrumentor(),
|
392
|
-
"langchain_community": LangChainCommunityInstrumentor(),
|
393
|
-
"llama_index": LlamaIndexInstrumentor(),
|
394
|
-
"haystack": HaystackInstrumentor(),
|
395
|
-
"embedchain": EmbedChainInstrumentor(),
|
396
|
-
"mem0": Mem0Instrumentor(),
|
397
|
-
"chroma": ChromaInstrumentor(),
|
398
|
-
"pinecone": PineconeInstrumentor(),
|
399
|
-
"qdrant": QdrantInstrumentor(),
|
400
|
-
"milvus": MilvusInstrumentor(),
|
401
|
-
"transformers": TransformersInstrumentor(),
|
402
|
-
"litellm": LiteLLMInstrumentor(),
|
403
|
-
"crewai": CrewAIInstrumentor(),
|
404
|
-
"ag2": AG2Instrumentor(),
|
405
|
-
"multion": MultiOnInstrumentor(),
|
406
|
-
"autogen": AG2Instrumentor(),
|
407
|
-
"pyautogen": AG2Instrumentor(),
|
408
|
-
"dynamiq": DynamiqInstrumentor(),
|
409
|
-
"phidata": PhidataInstrumentor(),
|
410
|
-
"reka-api": RekaInstrumentor(),
|
411
|
-
"premai": PremAIInstrumentor(),
|
412
|
-
"julep": JulepInstrumentor(),
|
413
|
-
"astra": AstraInstrumentor(),
|
414
|
-
"ai21": AI21Instrumentor(),
|
415
|
-
"controlflow": ControlFlowInstrumentor(),
|
416
|
-
"assemblyai": AssemblyAIInstrumentor(),
|
417
|
-
"crawl4ai": Crawl4AIInstrumentor(),
|
418
|
-
"firecrawl": FireCrawlInstrumentor(),
|
419
|
-
"letta": LettaInstrumentor(),
|
420
|
-
"together": TogetherInstrumentor(),
|
421
|
-
"openai-agents": OpenAIAgentsInstrumentor(),
|
422
|
-
"pydantic_ai": PydanticAIInstrumentor(),
|
423
|
-
}
|
290
|
+
# Create instrumentor instances dynamically
|
291
|
+
instrumentor_instances = get_all_instrumentors()
|
424
292
|
|
425
293
|
# Initialize and instrument only the enabled instrumentors
|
426
294
|
for name, instrumentor in instrumentor_instances.items():
|
427
|
-
instrument_if_available(
|
428
|
-
name, instrumentor, config, disabled_instrumentors, module_name_map
|
429
|
-
)
|
295
|
+
instrument_if_available(name, instrumentor, config, disabled_instrumentors)
|
430
296
|
|
297
|
+
# Handle GPU instrumentation separately
|
431
298
|
if not disable_metrics and collect_gpu_stats:
|
432
299
|
GPUInstrumentor().instrument(
|
433
300
|
environment=config.environment,
|
@@ -0,0 +1,144 @@
|
|
1
|
+
"""
|
2
|
+
OpenLIT Instrumentors
|
3
|
+
"""
|
4
|
+
import importlib
|
5
|
+
|
6
|
+
# Mapping of instrumentor names to their required Python packages
|
7
|
+
MODULE_NAME_MAP = {
|
8
|
+
"openai": "openai",
|
9
|
+
"anthropic": "anthropic",
|
10
|
+
"cohere": "cohere",
|
11
|
+
"mistral": "mistralai",
|
12
|
+
"bedrock": "boto3",
|
13
|
+
"vertexai": "vertexai",
|
14
|
+
"groq": "groq",
|
15
|
+
"ollama": "ollama",
|
16
|
+
"gpt4all": "gpt4all",
|
17
|
+
"elevenlabs": "elevenlabs",
|
18
|
+
"vllm": "vllm",
|
19
|
+
"google-ai-studio": "google.genai",
|
20
|
+
"azure-ai-inference": "azure.ai.inference",
|
21
|
+
"langchain": "langchain",
|
22
|
+
"langchain_community": "langchain_community",
|
23
|
+
"llama_index": "llama_index",
|
24
|
+
"haystack": "haystack",
|
25
|
+
"embedchain": "embedchain",
|
26
|
+
"mem0": "mem0",
|
27
|
+
"chroma": "chromadb",
|
28
|
+
"pinecone": "pinecone",
|
29
|
+
"qdrant": "qdrant_client",
|
30
|
+
"milvus": "pymilvus",
|
31
|
+
"transformers": "transformers",
|
32
|
+
"litellm": "litellm",
|
33
|
+
"crewai": "crewai",
|
34
|
+
"ag2": "ag2",
|
35
|
+
"autogen": "autogen",
|
36
|
+
"pyautogen": "pyautogen",
|
37
|
+
"multion": "multion",
|
38
|
+
"dynamiq": "dynamiq",
|
39
|
+
"phidata": "phi",
|
40
|
+
"reka-api": "reka",
|
41
|
+
"premai": "premai",
|
42
|
+
"julep": "julep",
|
43
|
+
"astra": "astrapy",
|
44
|
+
"ai21": "ai21",
|
45
|
+
"controlflow": "controlflow",
|
46
|
+
"assemblyai": "assemblyai",
|
47
|
+
"crawl4ai": "crawl4ai",
|
48
|
+
"firecrawl": "firecrawl",
|
49
|
+
"letta": "letta",
|
50
|
+
"together": "together",
|
51
|
+
"openai-agents": "agents",
|
52
|
+
"pydantic_ai": "pydantic_ai"
|
53
|
+
}
|
54
|
+
|
55
|
+
# Dictionary mapping instrumentor names to their full module paths
|
56
|
+
INSTRUMENTOR_MAP = {
|
57
|
+
"openai": "openlit.instrumentation.openai.OpenAIInstrumentor",
|
58
|
+
"anthropic": "openlit.instrumentation.anthropic.AnthropicInstrumentor",
|
59
|
+
"cohere": "openlit.instrumentation.cohere.CohereInstrumentor",
|
60
|
+
"mistral": "openlit.instrumentation.mistral.MistralInstrumentor",
|
61
|
+
"bedrock": "openlit.instrumentation.bedrock.BedrockInstrumentor",
|
62
|
+
"vertexai": "openlit.instrumentation.vertexai.VertexAIInstrumentor",
|
63
|
+
"groq": "openlit.instrumentation.groq.GroqInstrumentor",
|
64
|
+
"ollama": "openlit.instrumentation.ollama.OllamaInstrumentor",
|
65
|
+
"gpt4all": "openlit.instrumentation.gpt4all.GPT4AllInstrumentor",
|
66
|
+
"elevenlabs": "openlit.instrumentation.elevenlabs.ElevenLabsInstrumentor",
|
67
|
+
"vllm": "openlit.instrumentation.vllm.VLLMInstrumentor",
|
68
|
+
"google-ai-studio": "openlit.instrumentation.google_ai_studio.GoogleAIStudioInstrumentor",
|
69
|
+
"azure-ai-inference": "openlit.instrumentation.azure_ai_inference.AzureAIInferenceInstrumentor",
|
70
|
+
"langchain": "openlit.instrumentation.langchain.LangChainInstrumentor",
|
71
|
+
"langchain_community": "openlit.instrumentation.langchain_community.LangChainCommunityInstrumentor",
|
72
|
+
"llama_index": "openlit.instrumentation.llamaindex.LlamaIndexInstrumentor",
|
73
|
+
"haystack": "openlit.instrumentation.haystack.HaystackInstrumentor",
|
74
|
+
"embedchain": "openlit.instrumentation.embedchain.EmbedChainInstrumentor",
|
75
|
+
"mem0": "openlit.instrumentation.mem0.Mem0Instrumentor",
|
76
|
+
"chroma": "openlit.instrumentation.chroma.ChromaInstrumentor",
|
77
|
+
"pinecone": "openlit.instrumentation.pinecone.PineconeInstrumentor",
|
78
|
+
"qdrant": "openlit.instrumentation.qdrant.QdrantInstrumentor",
|
79
|
+
"milvus": "openlit.instrumentation.milvus.MilvusInstrumentor",
|
80
|
+
"transformers": "openlit.instrumentation.transformers.TransformersInstrumentor",
|
81
|
+
"litellm": "openlit.instrumentation.litellm.LiteLLMInstrumentor",
|
82
|
+
"crewai": "openlit.instrumentation.crewai.CrewAIInstrumentor",
|
83
|
+
"ag2": "openlit.instrumentation.ag2.AG2Instrumentor",
|
84
|
+
"multion": "openlit.instrumentation.multion.MultiOnInstrumentor",
|
85
|
+
"autogen": "openlit.instrumentation.ag2.AG2Instrumentor",
|
86
|
+
"pyautogen": "openlit.instrumentation.ag2.AG2Instrumentor",
|
87
|
+
"dynamiq": "openlit.instrumentation.dynamiq.DynamiqInstrumentor",
|
88
|
+
"phidata": "openlit.instrumentation.phidata.PhidataInstrumentor",
|
89
|
+
"reka-api": "openlit.instrumentation.reka.RekaInstrumentor",
|
90
|
+
"premai": "openlit.instrumentation.premai.PremAIInstrumentor",
|
91
|
+
"julep": "openlit.instrumentation.julep.JulepInstrumentor",
|
92
|
+
"astra": "openlit.instrumentation.astra.AstraInstrumentor",
|
93
|
+
"ai21": "openlit.instrumentation.ai21.AI21Instrumentor",
|
94
|
+
"controlflow": "openlit.instrumentation.controlflow.ControlFlowInstrumentor",
|
95
|
+
"assemblyai": "openlit.instrumentation.assemblyai.AssemblyAIInstrumentor",
|
96
|
+
"crawl4ai": "openlit.instrumentation.crawl4ai.Crawl4AIInstrumentor",
|
97
|
+
"firecrawl": "openlit.instrumentation.firecrawl.FireCrawlInstrumentor",
|
98
|
+
"letta": "openlit.instrumentation.letta.LettaInstrumentor",
|
99
|
+
"together": "openlit.instrumentation.together.TogetherInstrumentor",
|
100
|
+
"openai-agents": "openlit.instrumentation.openai_agents.OpenAIAgentsInstrumentor",
|
101
|
+
"pydantic_ai": "openlit.instrumentation.pydantic_ai.PydanticAIInstrumentor",
|
102
|
+
}
|
103
|
+
|
104
|
+
|
105
|
+
def get_instrumentor_class(name):
|
106
|
+
"""
|
107
|
+
Get instrumentor class by name.
|
108
|
+
|
109
|
+
Args:
|
110
|
+
name (str): Name of the instrumentor
|
111
|
+
|
112
|
+
Returns:
|
113
|
+
class: Instrumentor class or None if not found
|
114
|
+
"""
|
115
|
+
if name not in INSTRUMENTOR_MAP:
|
116
|
+
return None
|
117
|
+
|
118
|
+
module_path, class_name = INSTRUMENTOR_MAP[name].rsplit(".", 1)
|
119
|
+
|
120
|
+
try:
|
121
|
+
module = importlib.import_module(module_path)
|
122
|
+
return getattr(module, class_name)
|
123
|
+
except (ImportError, AttributeError):
|
124
|
+
return None
|
125
|
+
|
126
|
+
|
127
|
+
def get_all_instrumentors():
|
128
|
+
"""
|
129
|
+
Get all available instrumentor instances.
|
130
|
+
|
131
|
+
Returns:
|
132
|
+
dict: Dictionary of instrumentor instances
|
133
|
+
"""
|
134
|
+
instances = {}
|
135
|
+
|
136
|
+
for name in INSTRUMENTOR_MAP:
|
137
|
+
instrumentor_class = get_instrumentor_class(name)
|
138
|
+
if instrumentor_class:
|
139
|
+
try:
|
140
|
+
instances[name] = instrumentor_class()
|
141
|
+
except Exception:
|
142
|
+
pass # Skip instrumentors that fail to instantiate
|
143
|
+
|
144
|
+
return instances
|
openlit/guard/all.py
CHANGED
@@ -75,7 +75,7 @@ def get_all_system_prompt(valid_topics: Optional[List[str]] = None, invalid_topi
|
|
75
75
|
|
76
76
|
Output Instructions for Prompt Injection:
|
77
77
|
- If no prompt injection commands are detected, return: {"score": 0.0, "verdict": "no", "guard": "prompt_injection", "classification": "none", "explanation": "none"}.
|
78
|
-
|
78
|
+
|
79
79
|
Categories of Valid Topics:
|
80
80
|
"""
|
81
81
|
|
@@ -103,7 +103,7 @@ def get_all_system_prompt(valid_topics: Optional[List[str]] = None, invalid_topi
|
|
103
103
|
Output Instructions for Valid and Invalid Topics:
|
104
104
|
- If the text fits into one of the valid categories, return: {"score": 0.0, "verdict": "no", "guard": "topic_restriction", "classification": "valid_topic", "explanation": "Fits a valid topic."}.
|
105
105
|
- If the text fits into an invalid category, return: {"score": 1.0, "verdict": "yes", "guard": "topic_restriction", "classification": "invalid_topic", "explanation": "Matches an invalid topic."}.
|
106
|
-
|
106
|
+
|
107
107
|
Categories of Sensitive Topics (Use only these categories):
|
108
108
|
- politics: Discussions or opinions about political figures, parties, or policies.
|
109
109
|
- breakup: Conversations or advice related to relationship breakups or emotional distress.
|
@@ -120,7 +120,7 @@ def get_all_system_prompt(valid_topics: Optional[List[str]] = None, invalid_topi
|
|
120
120
|
base_prompt += f"\n Additional Sensitive Topics Categories:\n{custom_categories_str}"
|
121
121
|
|
122
122
|
base_prompt += """
|
123
|
-
|
123
|
+
|
124
124
|
Output Instructions for Sensitive Topics:
|
125
125
|
- If no sensitive topics are detected, return: {"score": 0.0, "verdict": "no", "guard": "sensitive_topic", "classification": "none", "explanation": "none"}.
|
126
126
|
"""
|