Python: [Bug]: AZURE_OPENAI_API_VERSION is ignored by the OpenAI clients on the Azure route
Maintainers usually reply within 1 day
Assessment
This issue has not been assessed yet.
Description
Description
OpenAIChatCompletionClient, OpenAIChatClient and OpenAIEmbeddingClient ignore AZURE_OPENAI_API_VERSION, whether it is set in the environment or in a .env file, and always send their built-in default api-version to Azure. Passing api_version= explicitly works.
The constructors document the opposite. For example, OpenAIChatCompletionClient says: "When not provided explicitly, the constructor reads AZURE_OPENAI_API_VERSION and then uses the Chat Completions default." OpenAIChatClient and OpenAIEmbeddingClient say the same, and the package README lists the variable as the Azure OpenAI API version.
Cause: load_openai_service_settings in agent_framework_openai/_shared.py passes the default into load_settings:
azure_settings = load_settings(
AzureOpenAISettings,
env_prefix="AZURE_OPENAI_",
...
api_version=api_version or default_azure_api_version,
...
)
load_settings gives explicit keyword values priority over .env files and environment variables. Since api_version or default_azure_api_version is never None, the environment value can never win. This looks like a regression from #4925; before it, only the explicit api_version was passed and the default was applied afterwards.
The existing tests miss this because the Azure test fixture sets AZURE_OPENAI_API_VERSION to 2024-12-01-preview, which is also the Chat Completions default.
Expected: an explicit api_version wins, then AZURE_OPENAI_API_VERSION (environment or .env), then the client's default.
Code Sample
import os
for name in ("OPENAI_API_KEY", "AZURE_OPENAI_BASE_URL"):
os.environ.pop(name, None) # make sure the clients take the Azure route
os.environ.update({
"AZURE_OPENAI_ENDPOINT": "https://my-resource.openai.azure.com",
"AZURE_OPENAI_API_KEY": "test-key",
"AZURE_OPENAI_MODEL": "my-deployment",
"AZURE_OPENAI_API_VERSION": "2025-04-01-preview",
})
from agent_framework.openai import OpenAIChatClient, OpenAIChatCompletionClient, OpenAIEmbeddingClient
for client_type in (OpenAIChatCompletionClient, OpenAIChatClient, OpenAIEmbeddingClient):
client = client_type()
print(f"{client_type.__name__:<27} api_version={client.api_version}")
Output on main:
OpenAIChatCompletionClient api_version=2024-12-01-preview
OpenAIChatClient api_version=preview
OpenAIEmbeddingClient api_version=2024-10-21
Every client should report 2025-04-01-preview. The same default also goes out as the api-version query parameter on the request, and setting the variable in a .env file passed via env_file_path behaves the same way.
Error Messages / Stack Traces
None. Requests silently use the default version.
Package Versions
agent-framework-openai: 1.15.0, agent-framework-core: 1.20.0 (source checkout of main at b9d24c8fb)
Python Version
Python 3.13
Additional Context
- Reproduced on Windows and Linux.
- One question for the fix:
OpenAIChatClient(Responses) defaults topreviewon the/openai/v1/path. Once the variable is read again, a dated value set for Chat Completions would also be used by the Responses client. That matches its docstring and the behavior before #4925, but if the Responses client shouldn't pick up the shared variable, its docstring would need to change instead. - Fix: pass only the explicit
api_versiontoload_settings, and apply the client default afterwards when nothing set a version. I'll open a PR with that and regression tests.
- Dominant language
- Python
- Stars
- 13.9k
- Forks
- 2.4k
- Avg merge
- 1d 18h
- Merged PRs (30d)
- 443
Getting set up
Starts the project's dev container in your browser, under your own GitHub account.
- No Dockerfile or Docker Compose file
- Has a pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from microsoft/agent-framework
-
.NET python triage
Difficulty 1/5 Under an hour Newbie friendliness 85/100
microsoft/agent-framework#9092 · 1 comment ·
Maintainers usually reply within 1 day
-
Python: raw-data content mappings lose annotations and attachment metadataPossibly taken @moonbox3 claimed this 8 days ago. Openpython triage
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
microsoft/agent-framework#8632 · 2 comments ·
Maintainers usually reply within 1 day
-
Python: Clarify when to use platformPossibly taken @eavanvalkenburg claimed this 8 days ago. Openpython triage
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
microsoft/agent-framework#8599 · 1 comment ·
Maintainers usually reply within 1 day
-
.NET Compaction - Update docs to refer to `AIContextProvider` deep divePossibly taken A pull request linked to this issue is open or already merged. Open.NET compaction documentation
Difficulty 1/5 Under an hour Newbie friendliness 82/100
microsoft/agent-framework#4629 · 1 comment ·
Maintainers usually reply within 1 day
-
Python: [Bug]: Media type detection documentation examples contain invalid base64Possibly taken @eavanvalkenburg claimed this today. Openagents python reproduced
microsoft/agent-framework#9187 · 1 comment · 1 assignee ·
Maintainers usually reply within 1 day
All issues in microsoft/agent-framework
Similar issues
-
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
rpm-software-management/mock#1824 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
jpata/particleflow#520 ·
Maintainers usually reply within 1 day
-
bug good first issue hacktoberfest
Difficulty 1/5 Under an hour Newbie friendliness 78/100
gridhead/gi-loadouts#699 ·
Maintainers usually reply within 13 days
-
Difficulty 1/5 Under an hour Newbie friendliness 86/100
FinanceFlash/unvibecode#206 ·
Maintainers usually reply within 1 day