lmnr 0.6.18__tar.gz → 0.6.20__tar.gz
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.
- {lmnr-0.6.18 → lmnr-0.6.20}/PKG-INFO +2 -5
- {lmnr-0.6.18 → lmnr-0.6.20}/pyproject.toml +6 -8
- {lmnr-0.6.18 → lmnr-0.6.20}/src/lmnr/opentelemetry_lib/opentelemetry/instrumentation/google_genai/__init__.py +55 -20
- lmnr-0.6.20/src/lmnr/opentelemetry_lib/opentelemetry/instrumentation/google_genai/schema_utils.py +23 -0
- lmnr-0.6.20/src/lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/__init__.py +61 -0
- lmnr-0.6.20/src/lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/__init__.py +442 -0
- lmnr-0.6.20/src/lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/chat_wrappers.py +1024 -0
- lmnr-0.6.20/src/lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/completion_wrappers.py +297 -0
- lmnr-0.6.20/src/lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/config.py +16 -0
- lmnr-0.6.20/src/lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/embeddings_wrappers.py +308 -0
- lmnr-0.6.20/src/lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/event_emitter.py +100 -0
- lmnr-0.6.20/src/lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/event_models.py +41 -0
- lmnr-0.6.20/src/lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/image_gen_wrappers.py +68 -0
- lmnr-0.6.20/src/lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/utils.py +185 -0
- lmnr-0.6.20/src/lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v0/__init__.py +176 -0
- lmnr-0.6.20/src/lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v1/__init__.py +358 -0
- lmnr-0.6.20/src/lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v1/assistant_wrappers.py +319 -0
- lmnr-0.6.20/src/lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v1/event_handler_wrapper.py +132 -0
- lmnr-0.6.20/src/lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v1/responses_wrappers.py +626 -0
- lmnr-0.6.20/src/lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/version.py +1 -0
- {lmnr-0.6.18 → lmnr-0.6.20}/src/lmnr/opentelemetry_lib/tracing/_instrument_initializers.py +1 -3
- {lmnr-0.6.18 → lmnr-0.6.20}/src/lmnr/sdk/browser/browser_use_otel.py +1 -1
- {lmnr-0.6.18 → lmnr-0.6.20}/src/lmnr/sdk/browser/patchright_otel.py +0 -14
- {lmnr-0.6.18 → lmnr-0.6.20}/src/lmnr/sdk/browser/playwright_otel.py +16 -130
- {lmnr-0.6.18 → lmnr-0.6.20}/src/lmnr/sdk/browser/pw_utils.py +45 -31
- {lmnr-0.6.18 → lmnr-0.6.20}/src/lmnr/sdk/client/asynchronous/async_client.py +13 -0
- {lmnr-0.6.18 → lmnr-0.6.20}/src/lmnr/sdk/client/asynchronous/resources/__init__.py +2 -0
- lmnr-0.6.20/src/lmnr/sdk/client/asynchronous/resources/evaluators.py +85 -0
- {lmnr-0.6.18 → lmnr-0.6.20}/src/lmnr/sdk/client/asynchronous/resources/tags.py +4 -10
- {lmnr-0.6.18 → lmnr-0.6.20}/src/lmnr/sdk/client/synchronous/resources/__init__.py +2 -1
- lmnr-0.6.20/src/lmnr/sdk/client/synchronous/resources/evaluators.py +85 -0
- {lmnr-0.6.18 → lmnr-0.6.20}/src/lmnr/sdk/client/synchronous/resources/tags.py +4 -10
- {lmnr-0.6.18 → lmnr-0.6.20}/src/lmnr/sdk/client/synchronous/sync_client.py +14 -0
- {lmnr-0.6.18 → lmnr-0.6.20}/src/lmnr/sdk/utils.py +23 -0
- {lmnr-0.6.18 → lmnr-0.6.20}/src/lmnr/version.py +1 -1
- {lmnr-0.6.18 → lmnr-0.6.20}/README.md +0 -0
- {lmnr-0.6.18 → lmnr-0.6.20}/src/lmnr/__init__.py +0 -0
- {lmnr-0.6.18 → lmnr-0.6.20}/src/lmnr/cli.py +0 -0
- {lmnr-0.6.18 → lmnr-0.6.20}/src/lmnr/opentelemetry_lib/.flake8 +0 -0
- {lmnr-0.6.18 → lmnr-0.6.20}/src/lmnr/opentelemetry_lib/__init__.py +0 -0
- {lmnr-0.6.18 → lmnr-0.6.20}/src/lmnr/opentelemetry_lib/decorators/__init__.py +0 -0
- {lmnr-0.6.18 → lmnr-0.6.20}/src/lmnr/opentelemetry_lib/litellm/__init__.py +0 -0
- {lmnr-0.6.18 → lmnr-0.6.20}/src/lmnr/opentelemetry_lib/litellm/utils.py +0 -0
- {lmnr-0.6.18 → lmnr-0.6.20}/src/lmnr/opentelemetry_lib/opentelemetry/instrumentation/google_genai/config.py +0 -0
- {lmnr-0.6.18 → lmnr-0.6.20}/src/lmnr/opentelemetry_lib/opentelemetry/instrumentation/google_genai/utils.py +0 -0
- {lmnr-0.6.18 → lmnr-0.6.20}/src/lmnr/opentelemetry_lib/opentelemetry/instrumentation/langgraph/__init__.py +0 -0
- {lmnr-0.6.18 → lmnr-0.6.20}/src/lmnr/opentelemetry_lib/opentelemetry/instrumentation/langgraph/utils.py +0 -0
- {lmnr-0.6.18 → lmnr-0.6.20}/src/lmnr/opentelemetry_lib/opentelemetry/instrumentation/opentelemetry/__init__.py +0 -0
- {lmnr-0.6.18 → lmnr-0.6.20}/src/lmnr/opentelemetry_lib/opentelemetry/instrumentation/skyvern/__init__.py +0 -0
- {lmnr-0.6.18 → lmnr-0.6.20}/src/lmnr/opentelemetry_lib/tracing/__init__.py +0 -0
- {lmnr-0.6.18 → lmnr-0.6.20}/src/lmnr/opentelemetry_lib/tracing/attributes.py +0 -0
- {lmnr-0.6.18 → lmnr-0.6.20}/src/lmnr/opentelemetry_lib/tracing/context_properties.py +0 -0
- {lmnr-0.6.18 → lmnr-0.6.20}/src/lmnr/opentelemetry_lib/tracing/exporter.py +0 -0
- {lmnr-0.6.18 → lmnr-0.6.20}/src/lmnr/opentelemetry_lib/tracing/instruments.py +0 -0
- {lmnr-0.6.18 → lmnr-0.6.20}/src/lmnr/opentelemetry_lib/tracing/processor.py +0 -0
- {lmnr-0.6.18 → lmnr-0.6.20}/src/lmnr/opentelemetry_lib/tracing/tracer.py +0 -0
- {lmnr-0.6.18 → lmnr-0.6.20}/src/lmnr/opentelemetry_lib/utils/__init__.py +0 -0
- {lmnr-0.6.18 → lmnr-0.6.20}/src/lmnr/opentelemetry_lib/utils/json_encoder.py +0 -0
- {lmnr-0.6.18 → lmnr-0.6.20}/src/lmnr/opentelemetry_lib/utils/package_check.py +0 -0
- {lmnr-0.6.18 → lmnr-0.6.20}/src/lmnr/py.typed +0 -0
- {lmnr-0.6.18 → lmnr-0.6.20}/src/lmnr/sdk/__init__.py +0 -0
- {lmnr-0.6.18 → lmnr-0.6.20}/src/lmnr/sdk/browser/__init__.py +0 -0
- {lmnr-0.6.18 → lmnr-0.6.20}/src/lmnr/sdk/browser/rrweb/rrweb.umd.min.cjs +0 -0
- {lmnr-0.6.18 → lmnr-0.6.20}/src/lmnr/sdk/browser/utils.py +0 -0
- {lmnr-0.6.18 → lmnr-0.6.20}/src/lmnr/sdk/client/asynchronous/resources/agent.py +0 -0
- {lmnr-0.6.18 → lmnr-0.6.20}/src/lmnr/sdk/client/asynchronous/resources/base.py +0 -0
- {lmnr-0.6.18 → lmnr-0.6.20}/src/lmnr/sdk/client/asynchronous/resources/browser_events.py +0 -0
- {lmnr-0.6.18 → lmnr-0.6.20}/src/lmnr/sdk/client/asynchronous/resources/evals.py +0 -0
- {lmnr-0.6.18 → lmnr-0.6.20}/src/lmnr/sdk/client/synchronous/resources/agent.py +0 -0
- {lmnr-0.6.18 → lmnr-0.6.20}/src/lmnr/sdk/client/synchronous/resources/base.py +0 -0
- {lmnr-0.6.18 → lmnr-0.6.20}/src/lmnr/sdk/client/synchronous/resources/browser_events.py +0 -0
- {lmnr-0.6.18 → lmnr-0.6.20}/src/lmnr/sdk/client/synchronous/resources/evals.py +0 -0
- {lmnr-0.6.18 → lmnr-0.6.20}/src/lmnr/sdk/datasets.py +0 -0
- {lmnr-0.6.18 → lmnr-0.6.20}/src/lmnr/sdk/decorators.py +0 -0
- {lmnr-0.6.18 → lmnr-0.6.20}/src/lmnr/sdk/eval_control.py +0 -0
- {lmnr-0.6.18 → lmnr-0.6.20}/src/lmnr/sdk/evaluations.py +0 -0
- {lmnr-0.6.18 → lmnr-0.6.20}/src/lmnr/sdk/laminar.py +0 -0
- {lmnr-0.6.18 → lmnr-0.6.20}/src/lmnr/sdk/log.py +0 -0
- {lmnr-0.6.18 → lmnr-0.6.20}/src/lmnr/sdk/types.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: lmnr
|
3
|
-
Version: 0.6.
|
3
|
+
Version: 0.6.20
|
4
4
|
Summary: Python SDK for Laminar
|
5
5
|
Author: lmnr.ai
|
6
6
|
Author-email: lmnr.ai <founders@lmnr.ai>
|
@@ -12,7 +12,7 @@ Requires-Dist: opentelemetry-sdk>=1.33.0
|
|
12
12
|
Requires-Dist: opentelemetry-exporter-otlp-proto-http>=1.33.0
|
13
13
|
Requires-Dist: opentelemetry-exporter-otlp-proto-grpc>=1.33.0
|
14
14
|
Requires-Dist: opentelemetry-semantic-conventions>=0.54b0
|
15
|
-
Requires-Dist: opentelemetry-semantic-conventions-ai>=0.4.
|
15
|
+
Requires-Dist: opentelemetry-semantic-conventions-ai>=0.4.9
|
16
16
|
Requires-Dist: tqdm>=4.0
|
17
17
|
Requires-Dist: tenacity>=8.0
|
18
18
|
Requires-Dist: grpcio>=1
|
@@ -36,7 +36,6 @@ Requires-Dist: opentelemetry-instrumentation-mcp>=0.40.12 ; extra == 'all'
|
|
36
36
|
Requires-Dist: opentelemetry-instrumentation-milvus>=0.40.12 ; extra == 'all'
|
37
37
|
Requires-Dist: opentelemetry-instrumentation-mistralai>=0.40.12 ; extra == 'all'
|
38
38
|
Requires-Dist: opentelemetry-instrumentation-ollama>=0.40.12 ; extra == 'all'
|
39
|
-
Requires-Dist: opentelemetry-instrumentation-openai>=0.40.12 ; extra == 'all'
|
40
39
|
Requires-Dist: opentelemetry-instrumentation-pinecone>=0.40.12 ; extra == 'all'
|
41
40
|
Requires-Dist: opentelemetry-instrumentation-qdrant>=0.40.12 ; extra == 'all'
|
42
41
|
Requires-Dist: opentelemetry-instrumentation-replicate>=0.40.12 ; extra == 'all'
|
@@ -62,7 +61,6 @@ Requires-Dist: opentelemetry-instrumentation-mcp>=0.40.12 ; extra == 'mcp'
|
|
62
61
|
Requires-Dist: opentelemetry-instrumentation-milvus>=0.40.12 ; extra == 'milvus'
|
63
62
|
Requires-Dist: opentelemetry-instrumentation-mistralai>=0.40.12 ; extra == 'mistralai'
|
64
63
|
Requires-Dist: opentelemetry-instrumentation-ollama>=0.40.12 ; extra == 'ollama'
|
65
|
-
Requires-Dist: opentelemetry-instrumentation-openai>=0.40.12 ; extra == 'openai'
|
66
64
|
Requires-Dist: opentelemetry-instrumentation-pinecone>=0.40.12 ; extra == 'pinecone'
|
67
65
|
Requires-Dist: opentelemetry-instrumentation-qdrant>=0.40.12 ; extra == 'qdrant'
|
68
66
|
Requires-Dist: opentelemetry-instrumentation-replicate>=0.40.12 ; extra == 'replicate'
|
@@ -91,7 +89,6 @@ Provides-Extra: mcp
|
|
91
89
|
Provides-Extra: milvus
|
92
90
|
Provides-Extra: mistralai
|
93
91
|
Provides-Extra: ollama
|
94
|
-
Provides-Extra: openai
|
95
92
|
Provides-Extra: pinecone
|
96
93
|
Provides-Extra: qdrant
|
97
94
|
Provides-Extra: replicate
|
@@ -6,7 +6,7 @@
|
|
6
6
|
|
7
7
|
[project]
|
8
8
|
name = "lmnr"
|
9
|
-
version = "0.6.
|
9
|
+
version = "0.6.20"
|
10
10
|
description = "Python SDK for Laminar"
|
11
11
|
authors = [
|
12
12
|
{ name = "lmnr.ai", email = "founders@lmnr.ai" }
|
@@ -22,7 +22,7 @@ dependencies = [
|
|
22
22
|
"opentelemetry-exporter-otlp-proto-http (>=1.33.0)",
|
23
23
|
"opentelemetry-exporter-otlp-proto-grpc (>=1.33.0)",
|
24
24
|
"opentelemetry-semantic-conventions (>=0.54b0)",
|
25
|
-
"opentelemetry-semantic-conventions-ai (>=0.4.
|
25
|
+
"opentelemetry-semantic-conventions-ai (>=0.4.9)",
|
26
26
|
"tqdm (>=4.0)",
|
27
27
|
"tenacity (>=8.0)",
|
28
28
|
# Since 1.68.0, grpcio writes a warning message
|
@@ -45,10 +45,10 @@ lmnr = "lmnr.cli:cli"
|
|
45
45
|
[project.optional-dependencies]
|
46
46
|
# List of all possible extras. You can specify one or more of these extras
|
47
47
|
# when installing the package, using any of the following examples:
|
48
|
-
# `pip install 'lmnr[anthropic,
|
49
|
-
# `uv pip install 'lmnr[anthropic,
|
50
|
-
# `uv add lmnr --extra anthropic --extra
|
51
|
-
# `poetry add 'lmnr[anthropic,
|
48
|
+
# `pip install 'lmnr[anthropic,groq]'`
|
49
|
+
# `uv pip install 'lmnr[anthropic,groq]'`
|
50
|
+
# `uv add lmnr --extra anthropic --extra groq`
|
51
|
+
# `poetry add 'lmnr[anthropic,groq]'`
|
52
52
|
|
53
53
|
alephalpha=["opentelemetry-instrumentation-alephalpha>=0.40.12"]
|
54
54
|
anthropic=["opentelemetry-instrumentation-anthropic>=0.40.12"]
|
@@ -73,7 +73,6 @@ mcp=["opentelemetry-instrumentation-mcp>=0.40.12"]
|
|
73
73
|
milvus=["opentelemetry-instrumentation-milvus>=0.40.12"]
|
74
74
|
mistralai=["opentelemetry-instrumentation-mistralai>=0.40.12"]
|
75
75
|
ollama=["opentelemetry-instrumentation-ollama>=0.40.12"]
|
76
|
-
openai=["opentelemetry-instrumentation-openai>=0.40.12"]
|
77
76
|
pinecone=["opentelemetry-instrumentation-pinecone>=0.40.12"]
|
78
77
|
qdrant=["opentelemetry-instrumentation-qdrant>=0.40.12"]
|
79
78
|
replicate=["opentelemetry-instrumentation-replicate>=0.40.12"]
|
@@ -106,7 +105,6 @@ all = [
|
|
106
105
|
"opentelemetry-instrumentation-milvus>=0.40.12",
|
107
106
|
"opentelemetry-instrumentation-mistralai>=0.40.12",
|
108
107
|
"opentelemetry-instrumentation-ollama>=0.40.12",
|
109
|
-
"opentelemetry-instrumentation-openai>=0.40.12",
|
110
108
|
"opentelemetry-instrumentation-pinecone>=0.40.12",
|
111
109
|
"opentelemetry-instrumentation-qdrant>=0.40.12",
|
112
110
|
"opentelemetry-instrumentation-replicate>=0.40.12",
|
@@ -11,6 +11,7 @@ from google.genai import types
|
|
11
11
|
from .config import (
|
12
12
|
Config,
|
13
13
|
)
|
14
|
+
from .schema_utils import SchemaJSONEncoder, process_schema
|
14
15
|
from .utils import (
|
15
16
|
dont_throw,
|
16
17
|
get_content,
|
@@ -24,8 +25,9 @@ from opentelemetry.trace import Tracer
|
|
24
25
|
from wrapt import wrap_function_wrapper
|
25
26
|
|
26
27
|
from opentelemetry import context as context_api
|
27
|
-
from opentelemetry.trace import get_tracer, SpanKind, Span
|
28
|
+
from opentelemetry.trace import get_tracer, SpanKind, Span, Status, StatusCode
|
28
29
|
from opentelemetry.semconv._incubating.attributes import gen_ai_attributes
|
30
|
+
from opentelemetry.semconv.attributes.error_attributes import ERROR_TYPE
|
29
31
|
|
30
32
|
from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
|
31
33
|
from opentelemetry.instrumentation.utils import _SUPPRESS_INSTRUMENTATION_KEY, unwrap
|
@@ -78,7 +80,7 @@ WRAPPED_METHODS = [
|
|
78
80
|
|
79
81
|
def should_send_prompts():
|
80
82
|
return (
|
81
|
-
os.getenv("
|
83
|
+
os.getenv("LAMINAR_TRACE_CONTENT") or "true"
|
82
84
|
).lower() == "true" or context_api.get_value("override_enable_content_tracing")
|
83
85
|
|
84
86
|
|
@@ -128,6 +130,29 @@ def _set_request_attributes(span, args, kwargs):
|
|
128
130
|
span, gen_ai_attributes.GEN_AI_REQUEST_SEED, config_dict.get("seed")
|
129
131
|
)
|
130
132
|
|
133
|
+
if schema := config_dict.get("response_schema"):
|
134
|
+
try:
|
135
|
+
set_span_attribute(
|
136
|
+
span,
|
137
|
+
# TODO: change to SpanAttributes.LLM_REQUEST_STRUCTURED_OUTPUT_SCHEMA
|
138
|
+
# when we upgrade to opentelemetry-semantic-conventions-ai>=0.4.10
|
139
|
+
"gen_ai.request.structured_output_schema",
|
140
|
+
json.dumps(process_schema(schema), cls=SchemaJSONEncoder),
|
141
|
+
)
|
142
|
+
except Exception:
|
143
|
+
pass
|
144
|
+
elif json_schema := config_dict.get("response_json_schema"):
|
145
|
+
try:
|
146
|
+
set_span_attribute(
|
147
|
+
span,
|
148
|
+
# TODO: change to SpanAttributes.LLM_REQUEST_STRUCTURED_OUTPUT_SCHEMA
|
149
|
+
# when we upgrade to opentelemetry-semantic-conventions-ai>=0.4.10
|
150
|
+
"gen_ai.request.structured_output_schema",
|
151
|
+
json.dumps(json_schema),
|
152
|
+
)
|
153
|
+
except Exception:
|
154
|
+
pass
|
155
|
+
|
131
156
|
tools: list[types.FunctionDeclaration] = []
|
132
157
|
arg_tools = config_dict.get("tools", kwargs.get("tools"))
|
133
158
|
if arg_tools:
|
@@ -454,16 +479,20 @@ def _wrap(tracer: Tracer, to_wrap, wrapped, instance, args, kwargs):
|
|
454
479
|
if span.is_recording():
|
455
480
|
_set_request_attributes(span, args, kwargs)
|
456
481
|
|
457
|
-
|
458
|
-
return _build_from_streaming_response(span, wrapped(*args, **kwargs))
|
459
|
-
else:
|
482
|
+
try:
|
460
483
|
response = wrapped(*args, **kwargs)
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
484
|
+
if to_wrap.get("is_streaming"):
|
485
|
+
return _build_from_streaming_response(span, response)
|
486
|
+
if span.is_recording():
|
487
|
+
_set_response_attributes(span, response)
|
488
|
+
span.end()
|
489
|
+
return response
|
490
|
+
except Exception as e:
|
491
|
+
span.set_attribute(ERROR_TYPE, e.__class__.__name__)
|
492
|
+
span.record_exception(e)
|
493
|
+
span.set_status(Status(StatusCode.ERROR, str(e)))
|
494
|
+
span.end()
|
495
|
+
raise e
|
467
496
|
|
468
497
|
|
469
498
|
@with_tracer_wrapper
|
@@ -485,16 +514,22 @@ async def _awrap(tracer: Tracer, to_wrap, wrapped, instance, args, kwargs):
|
|
485
514
|
if span.is_recording():
|
486
515
|
_set_request_attributes(span, args, kwargs)
|
487
516
|
|
488
|
-
|
489
|
-
return _abuild_from_streaming_response(span, await wrapped(*args, **kwargs))
|
490
|
-
else:
|
517
|
+
try:
|
491
518
|
response = await wrapped(*args, **kwargs)
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
|
496
|
-
|
497
|
-
|
519
|
+
if to_wrap.get("is_streaming"):
|
520
|
+
return _abuild_from_streaming_response(span, response)
|
521
|
+
else:
|
522
|
+
if span.is_recording():
|
523
|
+
_set_response_attributes(span, response)
|
524
|
+
|
525
|
+
span.end()
|
526
|
+
return response
|
527
|
+
except Exception as e:
|
528
|
+
span.set_attribute(ERROR_TYPE, e.__class__.__name__)
|
529
|
+
span.record_exception(e)
|
530
|
+
span.set_status(Status(StatusCode.ERROR, str(e)))
|
531
|
+
span.end()
|
532
|
+
raise e
|
498
533
|
|
499
534
|
|
500
535
|
class GoogleGenAiSdkInstrumentor(BaseInstrumentor):
|
lmnr-0.6.20/src/lmnr/opentelemetry_lib/opentelemetry/instrumentation/google_genai/schema_utils.py
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
from typing import Any
|
2
|
+
from google.genai._api_client import BaseApiClient
|
3
|
+
from google.genai._transformers import t_schema
|
4
|
+
from google.genai.types import JSONSchemaType
|
5
|
+
|
6
|
+
import json
|
7
|
+
|
8
|
+
DUMMY_CLIENT = BaseApiClient(api_key="dummy")
|
9
|
+
|
10
|
+
|
11
|
+
def process_schema(schema: Any) -> dict[str, Any]:
|
12
|
+
# The only thing we need from the client is the t_schema function
|
13
|
+
json_schema = t_schema(DUMMY_CLIENT, schema).json_schema.model_dump(
|
14
|
+
exclude_unset=True, exclude_none=True
|
15
|
+
)
|
16
|
+
return json_schema
|
17
|
+
|
18
|
+
|
19
|
+
class SchemaJSONEncoder(json.JSONEncoder):
|
20
|
+
def default(self, o: Any) -> Any:
|
21
|
+
if isinstance(o, JSONSchemaType):
|
22
|
+
return o.value
|
23
|
+
return super().default(o)
|
@@ -0,0 +1,61 @@
|
|
1
|
+
"""
|
2
|
+
Initially copied over from openllmetry, commit
|
3
|
+
b3a18c9f7e6ff2368c8fb0bc35fd9123f11121c4
|
4
|
+
"""
|
5
|
+
|
6
|
+
from typing import Callable, Collection, Optional
|
7
|
+
|
8
|
+
from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
|
9
|
+
from .shared.config import Config
|
10
|
+
from .utils import is_openai_v1
|
11
|
+
from typing_extensions import Coroutine
|
12
|
+
|
13
|
+
_instruments = ("openai >= 0.27.0",)
|
14
|
+
|
15
|
+
|
16
|
+
class OpenAIInstrumentor(BaseInstrumentor):
|
17
|
+
"""An instrumentor for OpenAI's client library."""
|
18
|
+
|
19
|
+
def __init__(
|
20
|
+
self,
|
21
|
+
enrich_assistant: bool = False,
|
22
|
+
enrich_token_usage: bool = False,
|
23
|
+
exception_logger=None,
|
24
|
+
get_common_metrics_attributes: Callable[[], dict] = lambda: {},
|
25
|
+
upload_base64_image: Optional[
|
26
|
+
Callable[[str, str, str, str], Coroutine[None, None, str]]
|
27
|
+
] = lambda *args: "",
|
28
|
+
enable_trace_context_propagation: bool = True,
|
29
|
+
use_legacy_attributes: bool = True,
|
30
|
+
):
|
31
|
+
super().__init__()
|
32
|
+
Config.enrich_assistant = enrich_assistant
|
33
|
+
Config.enrich_token_usage = enrich_token_usage
|
34
|
+
Config.exception_logger = exception_logger
|
35
|
+
Config.get_common_metrics_attributes = get_common_metrics_attributes
|
36
|
+
Config.upload_base64_image = upload_base64_image
|
37
|
+
Config.enable_trace_context_propagation = enable_trace_context_propagation
|
38
|
+
Config.use_legacy_attributes = use_legacy_attributes
|
39
|
+
|
40
|
+
def instrumentation_dependencies(self) -> Collection[str]:
|
41
|
+
return _instruments
|
42
|
+
|
43
|
+
def _instrument(self, **kwargs):
|
44
|
+
if is_openai_v1():
|
45
|
+
from .v1 import OpenAIV1Instrumentor
|
46
|
+
|
47
|
+
OpenAIV1Instrumentor().instrument(**kwargs)
|
48
|
+
else:
|
49
|
+
from .v0 import OpenAIV0Instrumentor
|
50
|
+
|
51
|
+
OpenAIV0Instrumentor().instrument(**kwargs)
|
52
|
+
|
53
|
+
def _uninstrument(self, **kwargs):
|
54
|
+
if is_openai_v1():
|
55
|
+
from .v1 import OpenAIV1Instrumentor
|
56
|
+
|
57
|
+
OpenAIV1Instrumentor().uninstrument(**kwargs)
|
58
|
+
else:
|
59
|
+
from .v0 import OpenAIV0Instrumentor
|
60
|
+
|
61
|
+
OpenAIV0Instrumentor().uninstrument(**kwargs)
|