From 2b0423c33763e107008fd4822877a603dca1dd38 Mon Sep 17 00:00:00 2001 From: Omar Abdelwahab Date: Fri, 7 Nov 2025 11:06:24 -0800 Subject: [PATCH] refactor: move Authorization validation to correct handler file Per reviewer feedback, validation should be in the openai_responses.py handler, not the streaming.py file. Moved validation logic to create_openai_response() method which is the main entry point for response creation. - Added validation in create_openai_response() before processing - Removed duplicate validation from _process_mcp_tool() in streaming.py - Validation runs early and rejects malformed requests immediately - Maintains same security check: rejects Authorization in headers dict --- .../meta_reference/responses/openai_responses.py | 13 +++++++++++++ .../agents/meta_reference/responses/streaming.py | 9 --------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/llama_stack/providers/inline/agents/meta_reference/responses/openai_responses.py b/src/llama_stack/providers/inline/agents/meta_reference/responses/openai_responses.py index 933cfe963..c8d3cbbd7 100644 --- a/src/llama_stack/providers/inline/agents/meta_reference/responses/openai_responses.py +++ b/src/llama_stack/providers/inline/agents/meta_reference/responses/openai_responses.py @@ -259,6 +259,19 @@ class OpenAIResponsesImpl: stream = bool(stream) text = OpenAIResponseText(format=OpenAIResponseTextFormat(type="text")) if text is None else text + # Validate MCP tools: ensure Authorization header is not passed via headers dict + if tools: + from llama_stack.apis.agents.openai_responses import OpenAIResponseInputToolMCP + + for tool in tools: + if isinstance(tool, OpenAIResponseInputToolMCP) and tool.headers: + for key in tool.headers.keys(): + if key.lower() == "authorization": + raise ValueError( + "Authorization header cannot be passed via 'headers'. " + "Please use the 'authorization' parameter instead." + ) + guardrail_ids = extract_guardrail_ids(guardrails) if guardrails else [] if conversation is not None: diff --git a/src/llama_stack/providers/inline/agents/meta_reference/responses/streaming.py b/src/llama_stack/providers/inline/agents/meta_reference/responses/streaming.py index c9657e361..ea98d19cd 100644 --- a/src/llama_stack/providers/inline/agents/meta_reference/responses/streaming.py +++ b/src/llama_stack/providers/inline/agents/meta_reference/responses/streaming.py @@ -1055,15 +1055,6 @@ class StreamingResponseOrchestrator: """Process an MCP tool configuration and emit appropriate streaming events.""" from llama_stack.providers.utils.tools.mcp import list_mcp_tools - # Validate that Authorization header is not passed via headers dict - if mcp_tool.headers: - for key in mcp_tool.headers.keys(): - if key.lower() == "authorization": - raise ValueError( - "Authorization header cannot be passed via 'headers'. " - "Please use the 'authorization' parameter instead." - ) - # Emit mcp_list_tools.in_progress self.sequence_number += 1 yield OpenAIResponseObjectStreamResponseMcpListToolsInProgress(