openlit 1.34.17__py3-none-any.whl → 1.34.19__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/instrumentation/anthropic/__init__.py +20 -22
- openlit/instrumentation/anthropic/anthropic.py +39 -46
- openlit/instrumentation/anthropic/async_anthropic.py +40 -47
- openlit/instrumentation/anthropic/utils.py +144 -170
- openlit/instrumentation/cohere/__init__.py +42 -28
- openlit/instrumentation/cohere/async_cohere.py +148 -557
- openlit/instrumentation/cohere/cohere.py +147 -556
- openlit/instrumentation/cohere/utils.py +330 -0
- {openlit-1.34.17.dist-info → openlit-1.34.19.dist-info}/METADATA +1 -1
- {openlit-1.34.17.dist-info → openlit-1.34.19.dist-info}/RECORD +12 -11
- {openlit-1.34.17.dist-info → openlit-1.34.19.dist-info}/LICENSE +0 -0
- {openlit-1.34.17.dist-info → openlit-1.34.19.dist-info}/WHEEL +0 -0
@@ -8,7 +8,7 @@ from wrapt import wrap_function_wrapper
|
|
8
8
|
from openlit.instrumentation.anthropic.anthropic import messages
|
9
9
|
from openlit.instrumentation.anthropic.async_anthropic import async_messages
|
10
10
|
|
11
|
-
_instruments = (
|
11
|
+
_instruments = ("anthropic >= 0.21.0",)
|
12
12
|
|
13
13
|
class AnthropicInstrumentor(BaseInstrumentor):
|
14
14
|
"""
|
@@ -19,32 +19,30 @@ class AnthropicInstrumentor(BaseInstrumentor):
|
|
19
19
|
return _instruments
|
20
20
|
|
21
21
|
def _instrument(self, **kwargs):
|
22
|
-
|
23
|
-
environment = kwargs.get(
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
disable_metrics = kwargs.get(
|
30
|
-
|
31
|
-
|
32
|
-
#sync
|
22
|
+
version = importlib.metadata.version("anthropic")
|
23
|
+
environment = kwargs.get("environment", "default")
|
24
|
+
application_name = kwargs.get("application_name", "default")
|
25
|
+
tracer = kwargs.get("tracer")
|
26
|
+
pricing_info = kwargs.get("pricing_info", {})
|
27
|
+
capture_message_content = kwargs.get("capture_message_content", False)
|
28
|
+
metrics = kwargs.get("metrics_dict")
|
29
|
+
disable_metrics = kwargs.get("disable_metrics")
|
30
|
+
|
31
|
+
# sync
|
33
32
|
wrap_function_wrapper(
|
34
|
-
|
35
|
-
|
36
|
-
messages(version, environment, application_name,
|
37
|
-
|
33
|
+
"anthropic.resources.messages",
|
34
|
+
"Messages.create",
|
35
|
+
messages(version, environment, application_name, tracer, pricing_info,
|
36
|
+
capture_message_content, metrics, disable_metrics),
|
38
37
|
)
|
39
38
|
|
40
|
-
#async
|
39
|
+
# async
|
41
40
|
wrap_function_wrapper(
|
42
|
-
|
43
|
-
|
44
|
-
async_messages(version, environment, application_name,
|
45
|
-
|
41
|
+
"anthropic.resources.messages",
|
42
|
+
"AsyncMessages.create",
|
43
|
+
async_messages(version, environment, application_name, tracer, pricing_info,
|
44
|
+
capture_message_content, metrics, disable_metrics),
|
46
45
|
)
|
47
46
|
|
48
47
|
def _uninstrument(self, **kwargs):
|
49
|
-
# Proper uninstrumentation logic to revert patched methods
|
50
48
|
pass
|
@@ -2,7 +2,6 @@
|
|
2
2
|
Module for monitoring Anthropic API calls.
|
3
3
|
"""
|
4
4
|
|
5
|
-
import logging
|
6
5
|
import time
|
7
6
|
from opentelemetry.trace import SpanKind
|
8
7
|
from openlit.__helpers import (
|
@@ -16,13 +15,9 @@ from openlit.instrumentation.anthropic.utils import (
|
|
16
15
|
)
|
17
16
|
from openlit.semcov import SemanticConvention
|
18
17
|
|
19
|
-
|
20
|
-
logger = logging.getLogger(__name__)
|
21
|
-
|
22
|
-
def messages(version, environment, application_name, tracer, event_provider,
|
23
|
-
pricing_info, capture_message_content, metrics, disable_metrics):
|
18
|
+
def messages(version, environment, application_name, tracer, pricing_info, capture_message_content, metrics, disable_metrics):
|
24
19
|
"""
|
25
|
-
Generates a telemetry wrapper for
|
20
|
+
Generates a telemetry wrapper for Anthropic Messages.create calls.
|
26
21
|
"""
|
27
22
|
|
28
23
|
class TracedSyncStream:
|
@@ -38,24 +33,21 @@ def messages(version, environment, application_name, tracer, event_provider,
|
|
38
33
|
kwargs,
|
39
34
|
server_address,
|
40
35
|
server_port,
|
41
|
-
**args,
|
42
36
|
):
|
43
37
|
self.__wrapped__ = wrapped
|
44
38
|
self._span = span
|
45
39
|
self._span_name = span_name
|
46
|
-
self._llmresponse =
|
47
|
-
self._response_id =
|
48
|
-
self._response_model =
|
49
|
-
self._finish_reason =
|
50
|
-
self._input_tokens =
|
51
|
-
self._output_tokens =
|
52
|
-
self._tool_arguments =
|
53
|
-
self._tool_id =
|
54
|
-
self._tool_name =
|
40
|
+
self._llmresponse = ""
|
41
|
+
self._response_id = ""
|
42
|
+
self._response_model = ""
|
43
|
+
self._finish_reason = ""
|
44
|
+
self._input_tokens = 0
|
45
|
+
self._output_tokens = 0
|
46
|
+
self._tool_arguments = ""
|
47
|
+
self._tool_id = ""
|
48
|
+
self._tool_name = ""
|
55
49
|
self._tool_calls = None
|
56
|
-
self._response_role =
|
57
|
-
|
58
|
-
self._args = args
|
50
|
+
self._response_role = ""
|
59
51
|
self._kwargs = kwargs
|
60
52
|
self._start_time = time.time()
|
61
53
|
self._end_time = None
|
@@ -86,34 +78,31 @@ def messages(version, environment, application_name, tracer, event_provider,
|
|
86
78
|
return chunk
|
87
79
|
except StopIteration:
|
88
80
|
try:
|
89
|
-
with
|
81
|
+
with self._span:
|
90
82
|
process_streaming_chat_response(
|
91
83
|
self,
|
92
84
|
pricing_info=pricing_info,
|
93
85
|
environment=environment,
|
94
86
|
application_name=application_name,
|
95
87
|
metrics=metrics,
|
96
|
-
event_provider=event_provider,
|
97
88
|
capture_message_content=capture_message_content,
|
98
89
|
disable_metrics=disable_metrics,
|
99
90
|
version=version
|
100
91
|
)
|
101
|
-
|
102
92
|
except Exception as e:
|
103
93
|
handle_exception(self._span, e)
|
104
|
-
logger.error("Error in trace creation: %s", e)
|
105
94
|
raise
|
106
95
|
|
107
96
|
def wrapper(wrapped, instance, args, kwargs):
|
108
97
|
"""
|
109
|
-
Wraps the
|
98
|
+
Wraps the Anthropic Messages.create call.
|
110
99
|
"""
|
111
100
|
|
112
|
-
streaming = kwargs.get(
|
113
|
-
server_address, server_port = set_server_address_and_port(instance,
|
114
|
-
request_model = kwargs.get(
|
101
|
+
streaming = kwargs.get("stream", False)
|
102
|
+
server_address, server_port = set_server_address_and_port(instance, "api.anthropic.com", 443)
|
103
|
+
request_model = kwargs.get("model", "claude-3-5-sonnet-latest")
|
115
104
|
|
116
|
-
span_name = f
|
105
|
+
span_name = f"{SemanticConvention.GEN_AI_OPERATION_TYPE_CHAT} {request_model}"
|
117
106
|
|
118
107
|
# pylint: disable=no-else-return
|
119
108
|
if streaming:
|
@@ -126,23 +115,27 @@ def messages(version, environment, application_name, tracer, event_provider,
|
|
126
115
|
with tracer.start_as_current_span(span_name, kind=SpanKind.CLIENT) as span:
|
127
116
|
start_time = time.time()
|
128
117
|
response = wrapped(*args, **kwargs)
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
118
|
+
|
119
|
+
try:
|
120
|
+
response = process_chat_response(
|
121
|
+
response=response,
|
122
|
+
request_model=request_model,
|
123
|
+
pricing_info=pricing_info,
|
124
|
+
server_port=server_port,
|
125
|
+
server_address=server_address,
|
126
|
+
environment=environment,
|
127
|
+
application_name=application_name,
|
128
|
+
metrics=metrics,
|
129
|
+
start_time=start_time,
|
130
|
+
span=span,
|
131
|
+
capture_message_content=capture_message_content,
|
132
|
+
disable_metrics=disable_metrics,
|
133
|
+
version=version,
|
134
|
+
**kwargs
|
135
|
+
)
|
136
|
+
|
137
|
+
except Exception as e:
|
138
|
+
handle_exception(span, e)
|
146
139
|
|
147
140
|
return response
|
148
141
|
|
@@ -2,7 +2,6 @@
|
|
2
2
|
Module for monitoring Anthropic API calls.
|
3
3
|
"""
|
4
4
|
|
5
|
-
import logging
|
6
5
|
import time
|
7
6
|
from opentelemetry.trace import SpanKind
|
8
7
|
from openlit.__helpers import (
|
@@ -16,18 +15,14 @@ from openlit.instrumentation.anthropic.utils import (
|
|
16
15
|
)
|
17
16
|
from openlit.semcov import SemanticConvention
|
18
17
|
|
19
|
-
|
20
|
-
logger = logging.getLogger(__name__)
|
21
|
-
|
22
|
-
def async_messages(version, environment, application_name, tracer, event_provider,
|
23
|
-
pricing_info, capture_message_content, metrics, disable_metrics):
|
18
|
+
def async_messages(version, environment, application_name, tracer, pricing_info, capture_message_content, metrics, disable_metrics):
|
24
19
|
"""
|
25
|
-
Generates a telemetry wrapper for
|
20
|
+
Generates a telemetry wrapper for Anthropic AsyncMessages.create calls.
|
26
21
|
"""
|
27
22
|
|
28
23
|
class TracedAsyncStream:
|
29
24
|
"""
|
30
|
-
Wrapper for streaming responses to collect telemetry.
|
25
|
+
Wrapper for async streaming responses to collect telemetry.
|
31
26
|
"""
|
32
27
|
|
33
28
|
def __init__(
|
@@ -38,24 +33,21 @@ def async_messages(version, environment, application_name, tracer, event_provide
|
|
38
33
|
kwargs,
|
39
34
|
server_address,
|
40
35
|
server_port,
|
41
|
-
**args,
|
42
36
|
):
|
43
37
|
self.__wrapped__ = wrapped
|
44
38
|
self._span = span
|
45
39
|
self._span_name = span_name
|
46
|
-
self._llmresponse =
|
47
|
-
self._response_id =
|
48
|
-
self._response_model =
|
49
|
-
self._finish_reason =
|
50
|
-
self._input_tokens =
|
51
|
-
self._output_tokens =
|
52
|
-
self._tool_arguments =
|
53
|
-
self._tool_id =
|
54
|
-
self._tool_name =
|
40
|
+
self._llmresponse = ""
|
41
|
+
self._response_id = ""
|
42
|
+
self._response_model = ""
|
43
|
+
self._finish_reason = ""
|
44
|
+
self._input_tokens = 0
|
45
|
+
self._output_tokens = 0
|
46
|
+
self._tool_arguments = ""
|
47
|
+
self._tool_id = ""
|
48
|
+
self._tool_name = ""
|
55
49
|
self._tool_calls = None
|
56
|
-
self._response_role =
|
57
|
-
|
58
|
-
self._args = args
|
50
|
+
self._response_role = ""
|
59
51
|
self._kwargs = kwargs
|
60
52
|
self._start_time = time.time()
|
61
53
|
self._end_time = None
|
@@ -86,34 +78,31 @@ def async_messages(version, environment, application_name, tracer, event_provide
|
|
86
78
|
return chunk
|
87
79
|
except StopAsyncIteration:
|
88
80
|
try:
|
89
|
-
with
|
81
|
+
with self._span:
|
90
82
|
process_streaming_chat_response(
|
91
83
|
self,
|
92
84
|
pricing_info=pricing_info,
|
93
85
|
environment=environment,
|
94
86
|
application_name=application_name,
|
95
87
|
metrics=metrics,
|
96
|
-
event_provider=event_provider,
|
97
88
|
capture_message_content=capture_message_content,
|
98
89
|
disable_metrics=disable_metrics,
|
99
90
|
version=version
|
100
91
|
)
|
101
|
-
|
102
92
|
except Exception as e:
|
103
93
|
handle_exception(self._span, e)
|
104
|
-
logger.error("Error in trace creation: %s", e)
|
105
94
|
raise
|
106
95
|
|
107
96
|
async def wrapper(wrapped, instance, args, kwargs):
|
108
97
|
"""
|
109
|
-
Wraps the
|
98
|
+
Wraps the Anthropic AsyncMessages.create call.
|
110
99
|
"""
|
111
100
|
|
112
|
-
streaming = kwargs.get(
|
113
|
-
server_address, server_port = set_server_address_and_port(instance,
|
114
|
-
request_model = kwargs.get(
|
101
|
+
streaming = kwargs.get("stream", False)
|
102
|
+
server_address, server_port = set_server_address_and_port(instance, "api.anthropic.com", 443)
|
103
|
+
request_model = kwargs.get("model", "claude-3-5-sonnet-latest")
|
115
104
|
|
116
|
-
span_name = f
|
105
|
+
span_name = f"{SemanticConvention.GEN_AI_OPERATION_TYPE_CHAT} {request_model}"
|
117
106
|
|
118
107
|
# pylint: disable=no-else-return
|
119
108
|
if streaming:
|
@@ -126,23 +115,27 @@ def async_messages(version, environment, application_name, tracer, event_provide
|
|
126
115
|
with tracer.start_as_current_span(span_name, kind=SpanKind.CLIENT) as span:
|
127
116
|
start_time = time.time()
|
128
117
|
response = await wrapped(*args, **kwargs)
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
118
|
+
|
119
|
+
try:
|
120
|
+
response = process_chat_response(
|
121
|
+
response=response,
|
122
|
+
request_model=request_model,
|
123
|
+
pricing_info=pricing_info,
|
124
|
+
server_port=server_port,
|
125
|
+
server_address=server_address,
|
126
|
+
environment=environment,
|
127
|
+
application_name=application_name,
|
128
|
+
metrics=metrics,
|
129
|
+
start_time=start_time,
|
130
|
+
span=span,
|
131
|
+
capture_message_content=capture_message_content,
|
132
|
+
disable_metrics=disable_metrics,
|
133
|
+
version=version,
|
134
|
+
**kwargs
|
135
|
+
)
|
136
|
+
|
137
|
+
except Exception as e:
|
138
|
+
handle_exception(span, e)
|
146
139
|
|
147
140
|
return response
|
148
141
|
|