Skip to content

Commit 41917d6

Browse files
authored
fix(openai): completions.parse out of beta, azure remove double-slash (#3051)
1 parent fac4230 commit 41917d6

19 files changed

+136
-93
lines changed

packages/opentelemetry-instrumentation-openai/opentelemetry/instrumentation/openai/v1/__init__.py

Lines changed: 94 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,22 @@ class OpenAIV1Instrumentor(BaseInstrumentor):
4141
def instrumentation_dependencies(self) -> Collection[str]:
4242
return _instruments
4343

44+
def _try_wrap(self, module, function, wrapper):
45+
"""
46+
Wrap a function if it exists, otherwise do nothing.
47+
This is useful for handling cases where the function is not available in
48+
the older versions of the library.
49+
50+
Args:
51+
module (str): The module to wrap, e.g. "openai.resources.chat.completions"
52+
function (str): "Object.function" to wrap, e.g. "Completions.parse"
53+
wrapper (callable): The wrapper to apply to the function.
54+
"""
55+
try:
56+
wrap_function_wrapper(module, function, wrapper)
57+
except (AttributeError, ModuleNotFoundError):
58+
pass
59+
4460
def _instrument(self, **kwargs):
4561
tracer_provider = kwargs.get("tracer_provider")
4662
tracer = get_tracer(__name__, __version__, tracer_provider)
@@ -179,6 +195,33 @@ def _instrument(self, **kwargs):
179195
embeddings_exception_counter,
180196
),
181197
)
198+
# in newer versions, Completions.parse are out of beta
199+
self._try_wrap(
200+
"openai.resources.chat.completions",
201+
"Completions.parse",
202+
chat_wrapper(
203+
tracer,
204+
tokens_histogram,
205+
chat_choice_counter,
206+
duration_histogram,
207+
chat_exception_counter,
208+
streaming_time_to_first_token,
209+
streaming_time_to_generate,
210+
),
211+
)
212+
self._try_wrap(
213+
"openai.resources.chat.completions",
214+
"AsyncCompletions.parse",
215+
achat_wrapper(
216+
tracer,
217+
tokens_histogram,
218+
chat_choice_counter,
219+
duration_histogram,
220+
chat_exception_counter,
221+
streaming_time_to_first_token,
222+
streaming_time_to_generate,
223+
),
224+
)
182225

183226
if is_metrics_enabled():
184227
image_gen_exception_counter = meter.create_counter(
@@ -196,60 +239,57 @@ def _instrument(self, **kwargs):
196239
)
197240

198241
# Beta APIs may not be available consistently in all versions
199-
try:
200-
wrap_function_wrapper(
201-
"openai.resources.beta.assistants",
202-
"Assistants.create",
203-
assistants_create_wrapper(tracer),
204-
)
205-
wrap_function_wrapper(
206-
"openai.resources.beta.chat.completions",
207-
"Completions.parse",
208-
chat_wrapper(
209-
tracer,
210-
tokens_histogram,
211-
chat_choice_counter,
212-
duration_histogram,
213-
chat_exception_counter,
214-
streaming_time_to_first_token,
215-
streaming_time_to_generate,
216-
),
217-
)
218-
wrap_function_wrapper(
219-
"openai.resources.beta.chat.completions",
220-
"AsyncCompletions.parse",
221-
achat_wrapper(
222-
tracer,
223-
tokens_histogram,
224-
chat_choice_counter,
225-
duration_histogram,
226-
chat_exception_counter,
227-
streaming_time_to_first_token,
228-
streaming_time_to_generate,
229-
),
230-
)
231-
wrap_function_wrapper(
232-
"openai.resources.beta.threads.runs",
233-
"Runs.create",
234-
runs_create_wrapper(tracer),
235-
)
236-
wrap_function_wrapper(
237-
"openai.resources.beta.threads.runs",
238-
"Runs.retrieve",
239-
runs_retrieve_wrapper(tracer),
240-
)
241-
wrap_function_wrapper(
242-
"openai.resources.beta.threads.runs",
243-
"Runs.create_and_stream",
244-
runs_create_and_stream_wrapper(tracer),
245-
)
246-
wrap_function_wrapper(
247-
"openai.resources.beta.threads.messages",
248-
"Messages.list",
249-
messages_list_wrapper(tracer),
250-
)
251-
except (AttributeError, ModuleNotFoundError):
252-
pass
242+
self._try_wrap(
243+
"openai.resources.beta.assistants",
244+
"Assistants.create",
245+
assistants_create_wrapper(tracer),
246+
)
247+
self._try_wrap(
248+
"openai.resources.beta.chat.completions",
249+
"Completions.parse",
250+
chat_wrapper(
251+
tracer,
252+
tokens_histogram,
253+
chat_choice_counter,
254+
duration_histogram,
255+
chat_exception_counter,
256+
streaming_time_to_first_token,
257+
streaming_time_to_generate,
258+
),
259+
)
260+
self._try_wrap(
261+
"openai.resources.beta.chat.completions",
262+
"AsyncCompletions.parse",
263+
achat_wrapper(
264+
tracer,
265+
tokens_histogram,
266+
chat_choice_counter,
267+
duration_histogram,
268+
chat_exception_counter,
269+
streaming_time_to_first_token,
270+
streaming_time_to_generate,
271+
),
272+
)
273+
self._try_wrap(
274+
"openai.resources.beta.threads.runs",
275+
"Runs.create",
276+
runs_create_wrapper(tracer),
277+
)
278+
self._try_wrap(
279+
"openai.resources.beta.threads.runs",
280+
"Runs.retrieve",
281+
runs_retrieve_wrapper(tracer),
282+
)
283+
self._try_wrap(
284+
"openai.resources.beta.threads.runs",
285+
"Runs.create_and_stream",
286+
runs_create_and_stream_wrapper(tracer),
287+
)
288+
self._try_wrap(
289+
"openai.resources.beta.threads.messages",
290+
"Messages.list",
291+
messages_list_wrapper(tracer),
292+
)
253293

254294
def _uninstrument(self, **kwargs):
255295
unwrap("openai.resources.chat.completions", "Completions.create")

packages/opentelemetry-instrumentation-openai/poetry.lock

Lines changed: 14 additions & 11 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/opentelemetry-instrumentation-openai/pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ pytest = "^8.2.2"
3939
pytest-sugar = "1.0.0"
4040
vcrpy = "^6.0.1"
4141
pytest-recording = "^0.13.1"
42-
openai = { extras = ["datalib"], version = ">=1.50.0" }
42+
openai = { extras = ["datalib"], version = ">=1.66.0" }
4343
opentelemetry-sdk = "^1.27.0"
4444
pytest-asyncio = "^0.23.7"
4545

packages/opentelemetry-instrumentation-openai/tests/traces/cassettes/test_azure/test_chat.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ interactions:
3232
x-stainless-runtime-version:
3333
- 3.12.1
3434
method: POST
35-
uri: https://traceloop-stg.openai.azure.com//openai/deployments/openllmetry-testing/chat/completions?api-version=2024-02-01
35+
uri: https://traceloop-stg.openai.azure.com/openai/deployments/openllmetry-testing/chat/completions?api-version=2024-02-01
3636
response:
3737
body:
3838
string: '{"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"finish_reason":"stop","index":0,"logprobs":null,"message":{"content":"Why

packages/opentelemetry-instrumentation-openai/tests/traces/cassettes/test_azure/test_chat_async_streaming.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ interactions:
3232
x-stainless-runtime-version:
3333
- 3.12.1
3434
method: POST
35-
uri: https://traceloop-stg.openai.azure.com//openai/deployments/openllmetry-testing/chat/completions?api-version=2024-02-01
35+
uri: https://traceloop-stg.openai.azure.com/openai/deployments/openllmetry-testing/chat/completions?api-version=2024-02-01
3636
response:
3737
body:
3838
string: 'data: {"choices":[],"created":0,"id":"","model":"","object":"","prompt_filter_results":[{"prompt_index":0,"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}}}]}

packages/opentelemetry-instrumentation-openai/tests/traces/cassettes/test_azure/test_chat_async_streaming_with_events_with_content.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ interactions:
3232
x-stainless-runtime-version:
3333
- 3.12.1
3434
method: POST
35-
uri: https://traceloop-stg.openai.azure.com//openai/deployments/openllmetry-testing/chat/completions?api-version=2024-02-01
35+
uri: https://traceloop-stg.openai.azure.com/openai/deployments/openllmetry-testing/chat/completions?api-version=2024-02-01
3636
response:
3737
body:
3838
string: 'data: {"choices":[],"created":0,"id":"","model":"","object":"","prompt_filter_results":[{"prompt_index":0,"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}}}]}

packages/opentelemetry-instrumentation-openai/tests/traces/cassettes/test_azure/test_chat_async_streaming_with_events_with_no_content.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ interactions:
3232
x-stainless-runtime-version:
3333
- 3.12.1
3434
method: POST
35-
uri: https://traceloop-stg.openai.azure.com//openai/deployments/openllmetry-testing/chat/completions?api-version=2024-02-01
35+
uri: https://traceloop-stg.openai.azure.com/openai/deployments/openllmetry-testing/chat/completions?api-version=2024-02-01
3636
response:
3737
body:
3838
string: 'data: {"choices":[],"created":0,"id":"","model":"","object":"","prompt_filter_results":[{"prompt_index":0,"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}}}]}

packages/opentelemetry-instrumentation-openai/tests/traces/cassettes/test_azure/test_chat_content_filtering.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ interactions:
3333
x-stainless-runtime-version:
3434
- 3.12.1
3535
method: POST
36-
uri: https://traceloop-stg.openai.azure.com//openai/deployments/openllmetry-testing/chat/completions?api-version=2024-02-01
36+
uri: https://traceloop-stg.openai.azure.com/openai/deployments/openllmetry-testing/chat/completions?api-version=2024-02-01
3737
response:
3838
body:
3939
string:

packages/opentelemetry-instrumentation-openai/tests/traces/cassettes/test_azure/test_chat_content_filtering_with_events_with_content.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ interactions:
3333
x-stainless-runtime-version:
3434
- 3.12.1
3535
method: POST
36-
uri: https://traceloop-stg.openai.azure.com//openai/deployments/openllmetry-testing/chat/completions?api-version=2024-02-01
36+
uri: https://traceloop-stg.openai.azure.com/openai/deployments/openllmetry-testing/chat/completions?api-version=2024-02-01
3737
response:
3838
body:
3939
string:

packages/opentelemetry-instrumentation-openai/tests/traces/cassettes/test_azure/test_chat_content_filtering_with_events_with_no_content.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ interactions:
3333
x-stainless-runtime-version:
3434
- 3.12.1
3535
method: POST
36-
uri: https://traceloop-stg.openai.azure.com//openai/deployments/openllmetry-testing/chat/completions?api-version=2024-02-01
36+
uri: https://traceloop-stg.openai.azure.com/openai/deployments/openllmetry-testing/chat/completions?api-version=2024-02-01
3737
response:
3838
body:
3939
string:

0 commit comments

Comments
 (0)