fix(openai): Fix Azure OpenAI Responses API model field issue (#32649)

This commit is contained in:
JunHyungKang
2025-09-08 23:08:35 +09:00
committed by GitHub
parent 5b0a55ad35
commit 6ea06ca972
4 changed files with 61 additions and 3 deletions

View File

@@ -754,6 +754,26 @@ class AzureChatOpenAI(BaseChatOpenAI):
return chat_result
def _get_request_payload(
self,
input_: LanguageModelInput,
*,
stop: Optional[list[str]] = None,
**kwargs: Any,
) -> dict:
"""Get the request payload, using deployment name for Azure Responses API."""
payload = super()._get_request_payload(input_, stop=stop, **kwargs)
# For Azure Responses API, use deployment name instead of model name
if (
self._use_responses_api(payload)
and not payload.get("model")
and self.deployment_name
):
payload["model"] = self.deployment_name
return payload
def _stream(self, *args: Any, **kwargs: Any) -> Iterator[ChatGenerationChunk]:
"""Route to Chat Completions or Responses API."""
if self._use_responses_api({**kwargs, **self.model_kwargs}):

View File

@@ -3541,7 +3541,7 @@ def _construct_responses_api_payload(
payload["reasoning"] = {"effort": payload.pop("reasoning_effort")}
# Remove temperature parameter for models that don't support it in responses API
model = payload.get("model", "")
model = payload.get("model") or ""
if model.startswith("gpt-5") and "chat" not in model: # gpt-5-chat supports
payload.pop("temperature", None)

View File

@@ -21,7 +21,6 @@ class TestAzureOpenAIStandard(ChatModelIntegrationTests):
def chat_model_params(self) -> dict:
return {
"deployment_name": os.environ["AZURE_OPENAI_CHAT_DEPLOYMENT_NAME"],
"model": "gpt-4o-mini",
"openai_api_version": OPENAI_API_VERSION,
"azure_endpoint": OPENAI_API_BASE,
"stream_usage": True,
@@ -49,7 +48,6 @@ class TestAzureOpenAIResponses(ChatModelIntegrationTests):
def chat_model_params(self) -> dict:
return {
"deployment_name": os.environ["AZURE_OPENAI_CHAT_DEPLOYMENT_NAME"],
"model": "gpt-4o-mini",
"openai_api_version": OPENAI_API_VERSION,
"azure_endpoint": OPENAI_API_BASE,
"use_responses_api": True,

View File

@@ -5,6 +5,7 @@ from unittest import mock
import pytest
from langchain_core.messages import HumanMessage
from pydantic import SecretStr
from typing_extensions import TypedDict
from langchain_openai import AzureChatOpenAI
@@ -99,3 +100,42 @@ def test_max_completion_tokens_in_payload() -> None:
"stream": False,
"max_completion_tokens": 300,
}
def test_responses_api_uses_deployment_name() -> None:
"""Test that Azure deployment name is used for Responses API."""
llm = AzureChatOpenAI(
azure_deployment="your_deployment",
api_version="2025-04-01-preview",
azure_endpoint="your_endpoint",
api_key=SecretStr("your_api_key"),
# Force Responses API usage by including a Responses-only parameter
use_responses_api=True,
output_version="responses/v1",
)
messages = [HumanMessage("Hello")]
payload = llm._get_request_payload(messages)
# For Responses API, the model field should be the deployment name
assert payload["model"] == "your_deployment"
assert "input" in payload # Responses API uses 'input' instead of 'messages'
def test_chat_completions_api_uses_model_name() -> None:
"""Test that regular Chat Completions API still uses model name."""
llm = AzureChatOpenAI(
azure_deployment="your_deployment",
model="gpt-5", # This is the OpenAI model name
api_version="2025-04-01-preview",
azure_endpoint="your_endpoint",
api_key=SecretStr("your_api_key"),
# No Responses-only parameters, so Chat Completions API will be used
)
messages = [HumanMessage("Hello")]
payload = llm._get_request_payload(messages)
# For Chat Completions API, the model field should still be None/model_name
# Azure Chat Completions uses deployment in the URL, not in the model field
assert payload["model"] == "gpt-5"
assert "messages" in payload # Chat Completions API uses 'messages'
assert "input" not in payload