Skip to content

Commit 4857ace

Browse files
refactor: enhance input extraction for OpenAI responses API to support messages array format
1 parent d3bb18e commit 4857ace

File tree

1 file changed

+31
-20
lines changed

1 file changed

+31
-20
lines changed

src/openlayer/lib/integrations/openai_tracer.py

Lines changed: 31 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -472,8 +472,7 @@ def stream_responses_chunks(
472472
raw_output=raw_outputs,
473473
id=inference_id,
474474
metadata={
475-
"timeToFirstToken": ((first_token_time - start_time) * 1000 if first_token_time else None),
476-
"api_type": "responses",
475+
"timeToFirstToken": ((first_token_time - start_time) * 1000 if first_token_time else None)
477476
},
478477
)
479478
add_to_trace(
@@ -534,7 +533,6 @@ def handle_responses_non_streaming_create(
534533
model_parameters=get_responses_model_parameters(kwargs),
535534
raw_output=response.model_dump() if hasattr(response, "model_dump") else str(response),
536535
id=inference_id,
537-
metadata={"api_type": "responses"},
538536
)
539537

540538
add_to_trace(
@@ -604,33 +602,46 @@ def extract_responses_chunk_data(chunk: Any) -> Dict[str, Any]:
604602
def extract_responses_inputs(kwargs: Dict[str, Any]) -> Dict[str, Any]:
605603
"""Extract inputs from Responses API parameters.
606604
605+
Formats the input as a messages array similar to Chat Completions API format:
606+
{"prompt": [{"role": "user", "content": "..."}]}
607+
607608
Args:
608609
kwargs: The parameters passed to the Responses API
609610
610611
Returns:
611-
Dictionary with prompt/input data
612+
Dictionary with prompt as a messages array
612613
"""
613-
inputs = {}
614+
messages = []
614615

615616
# Handle different input formats for Responses API
616-
if "input" in kwargs:
617-
inputs["prompt"] = kwargs["input"]
618-
elif "conversation" in kwargs:
619-
inputs["prompt"] = kwargs["conversation"]
620-
elif "instructions" in kwargs:
621-
inputs["prompt"] = kwargs["instructions"]
622-
elif "prompt" in kwargs:
623-
inputs["prompt"] = kwargs["prompt"]
617+
if "conversation" in kwargs:
618+
# Conversation is already in messages format
619+
conversation = kwargs["conversation"]
620+
if isinstance(conversation, list):
621+
messages = conversation
622+
else:
623+
# Single message, wrap it
624+
messages = [{"role": "user", "content": str(conversation)}]
624625
else:
625-
# Fallback: try to construct from available parameters
626-
prompt_parts = []
626+
# Build messages array from available parameters
627627
if "instructions" in kwargs:
628-
prompt_parts.append(f"Instructions: {kwargs['instructions']}")
628+
messages.append({"role": "system", "content": kwargs["instructions"]})
629+
629630
if "input" in kwargs:
630-
prompt_parts.append(f"Input: {kwargs['input']}")
631-
inputs["prompt"] = " | ".join(prompt_parts) if prompt_parts else "No input provided"
631+
messages.append({"role": "user", "content": kwargs["input"]})
632+
elif "prompt" in kwargs:
633+
messages.append({"role": "user", "content": kwargs["prompt"]})
634+
635+
# If no user message was added, create a fallback
636+
if not any(msg.get("role") == "user" for msg in messages):
637+
if messages:
638+
# Only system message, add empty user message
639+
messages.append({"role": "user", "content": ""})
640+
else:
641+
# No messages at all, add placeholder
642+
messages.append({"role": "user", "content": "No input provided"})
632643

633-
return inputs
644+
return {"prompt": messages}
634645

635646

636647
def parse_responses_output_data(response: Any) -> Union[str, Dict[str, Any], None]:
@@ -815,7 +826,7 @@ def trace_openai_assistant_thread_run(client: "openai.OpenAI", run: "openai.type
815826

816827
# pylint: disable=broad-except
817828
except Exception as e:
818-
print(f"Failed to monitor run. {e}") # noqa: T201
829+
logger.error("Failed to monitor run. %s", e)
819830

820831

821832
def _type_check_run(run: "openai.types.beta.threads.run.Run") -> None:

0 commit comments

Comments
 (0)