Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 32 additions & 11 deletions agentops/instrumentation/providers/openai/instrumentor.py
Original file line number Diff line number Diff line change
Expand Up @@ -92,11 +92,8 @@ def _initialize(self, **kwargs):
def _custom_wrap(self, **kwargs):
"""Add custom wrappers for streaming functionality."""
if is_openai_v1() and self._tracer:
# from wrapt import wrap_function_wrapper
# # Add streaming wrappers for v1
# Chat completion streaming wrappers (create)
try:
# Chat completion streaming wrappers

wrap_function_wrapper(
"openai.resources.chat.completions",
"Completions.create",
Expand All @@ -108,21 +105,45 @@ def _custom_wrap(self, **kwargs):
"AsyncCompletions.create",
async_chat_completion_stream_wrapper(self._tracer),
)
except Exception as e:
logger.warning(f"[OPENAI INSTRUMENTOR] Error wrapping chat.completions.create: {e}")

# Beta chat completion streaming wrappers
# Chat completion parse wrappers — try the current SDK path first,
# then fall back to the legacy beta path used in openai < 2.0.
_parse_wrapped = False
try:
wrap_function_wrapper(
"openai.resources.beta.chat.completions",
"openai.resources.chat.completions",
"Completions.parse",
chat_completion_stream_wrapper(self._tracer),
)

wrap_function_wrapper(
"openai.resources.beta.chat.completions",
"openai.resources.chat.completions",
"AsyncCompletions.parse",
async_chat_completion_stream_wrapper(self._tracer),
)

# Responses API streaming wrappers
_parse_wrapped = True
except Exception:
pass

if not _parse_wrapped:
# Legacy path: openai < 2.0 exposed .parse() under beta.chat.completions
try:
wrap_function_wrapper(
"openai.resources.beta.chat.completions",
"Completions.parse",
chat_completion_stream_wrapper(self._tracer),
)
wrap_function_wrapper(
"openai.resources.beta.chat.completions",
"AsyncCompletions.parse",
async_chat_completion_stream_wrapper(self._tracer),
)
except Exception as e:
logger.debug(f"[OPENAI INSTRUMENTOR] beta.chat.completions.parse not available: {e}")

# Responses API streaming wrappers
try:
wrap_function_wrapper(
"openai.resources.responses",
"Responses.create",
Expand All @@ -135,7 +156,7 @@ def _custom_wrap(self, **kwargs):
async_responses_stream_wrapper(self._tracer),
)
except Exception as e:
logger.warning(f"[OPENAI INSTRUMENTOR] Error setting up OpenAI streaming wrappers: {e}")
logger.warning(f"[OPENAI INSTRUMENTOR] Error wrapping responses API: {e}")
else:
if not is_openai_v1():
logger.debug("[OPENAI INSTRUMENTOR] Skipping custom wrapping - not using OpenAI v1")
Expand Down