Skip to content

Azure OpenAI - model parameter in request body causes failures when deployment name differs from model name #2892

@gregsmi

Description

@gregsmi

Confirm this is an issue with the Python library and not an underlying OpenAI API

  • This is an issue with the Python library

Describe the bug

When using AzureOpenAI client, the SDK sends the model parameter in the request body even though Azure OpenAI uses URL-based routing (/deployments/{deployment-id}/...). This causes failures when the deployment name doesn't match the model name exactly.

This is particularly problematic for gpt-image-1.5 because:

  1. Azure resource naming rules prohibit periods (dots) in deployment names
  2. The model name contains a dot: gpt-image-1.5
  3. Therefore, deployment name can never match model name (e.g., must use gpt-image-1-5)

The Azure backend validates the body's model field against actual model names, rejecting valid deployment names.

To Reproduce

Steps to Reproduce

from openai import AzureOpenAI

client = AzureOpenAI(
    azure_endpoint="https://<resource>.openai.azure.com/",
    api_key="<key>",
    api_version="2024-10-21"
)

# Deployment name: "gpt-image-1-5" (dashes, due to Azure naming rules)
# Model name: "gpt-image-1.5" (dot)

response = client.images.generate(
    model="gpt-image-1-5",  # deployment name
    prompt="A sunset over mountains",
    size="1024x1024",
    n=1
)

Expected Behavior

Request succeeds because URL routing correctly targets the deployment:

POST /openai/deployments/gpt-image-1-5/images/generations

Actual Behavior

Request fails with:

{
    "error": {
        "message": "Model not supported with Responses API. Supported models are: ['gpt-image-1', 'gpt-image-1-mini', 'gpt-image-1.5']",
        "type": "invalid_request_error"
    }
}

The Azure backend is validating "model": "gpt-image-1-5" in the request body against model names, not deployment names.


Root Cause

In openai/lib/azure.py, the _build_request method uses model from the body to construct the URL but doesn't remove it from the body:

def _build_request(self, options, *, retries_taken=0):
    if options.url in _deployments_endpoints and is_mapping(options.json_data):
        model = options.json_data.get("model")
        if model is not None and "/deployments" not in str(self.base_url.path):
            options.url = f"/deployments/{model}{options.url}"
            # BUG: model is still in options.json_data

    return super()._build_request(options, retries_taken=retries_taken)

The Azure OpenAI REST API spec does not include model in the request body for deployment-based endpoints - model selection is done entirely via the URL path.

Code snippets

OS

Linux (Ubuntu)

Python version

3.12

Library version

2.7.1 (also tested against latest)

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions