Skip to content

Commit 162aacd

Browse files
John-Linclaude
andcommitted
refactor: remove AsyncAzureOpenAI in favor of OpenAI v1 compatible API
Azure OpenAI now supports the standard OpenAI client via the v1 API endpoint (/openai/v1/). Users set OPENAI_BASE_URL and OPENAI_API_KEY instead of Azure-specific environment variables. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 60f2f79 commit 162aacd

3 files changed

Lines changed: 8 additions & 53 deletions

File tree

README.md

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,12 @@ export OPENAI_API_KEY=""
4343
export OPENAI_MODEL="gpt-5.4"
4444
```
4545

46-
If you are using Azure OpenAI, set these instead:
46+
If you are using Azure OpenAI (v1 API), set these instead:
4747

4848
```
49-
export AZURE_OPENAI_API_KEY=""
50-
export AZURE_OPENAI_ENDPOINT="https://<myopenai>.azure.com/"
49+
export OPENAI_API_KEY=""
50+
export OPENAI_BASE_URL="https://<resource-name>.openai.azure.com/openai/v1/"
5151
export OPENAI_MODEL="gpt-5.4"
52-
export OPENAI_API_VERSION="2025-03-01-preview"
5352
```
5453

5554
## MCP Server Configuration (Optional)

bot/agents.py

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
from agents.mcp import MCPServerStreamableHttp
1313
from agents.models.openai_chatcompletions import OpenAIChatCompletionsModel
1414
from agents.models.openai_responses import OpenAIResponsesModel
15-
from openai import AsyncAzureOpenAI
1615
from openai import AsyncOpenAI
1716

1817
DEFAULT_INSTRUCTIONS = (
@@ -29,22 +28,16 @@
2928
def _get_model() -> OpenAIResponsesModel | OpenAIChatCompletionsModel:
3029
"""Create an OpenAI model from environment variables.
3130
31+
Uses the standard OpenAI client, which works with both OpenAI and
32+
Azure OpenAI v1 API (via OPENAI_BASE_URL + OPENAI_API_KEY).
33+
3234
OPENAI_API_TYPE controls which API the model uses:
3335
- "responses" (default): OpenAI Responses API — recommended by the SDK
34-
- "chat_completions": Chat Completions API — use for Azure OpenAI or compatible providers
36+
- "chat_completions": Chat Completions API
3537
"""
3638
model_name = os.getenv("OPENAI_MODEL", "gpt-5.4")
3739
api_type = os.getenv("OPENAI_API_TYPE", "responses")
38-
39-
client: AsyncOpenAI
40-
if os.getenv("AZURE_OPENAI_API_KEY") and os.getenv("AZURE_OPENAI_ENDPOINT"):
41-
client = AsyncAzureOpenAI(
42-
api_key=os.environ["AZURE_OPENAI_API_KEY"],
43-
azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT"],
44-
api_version=os.getenv("OPENAI_API_VERSION", "2025-04-01-preview"),
45-
)
46-
else:
47-
client = AsyncOpenAI()
40+
client = AsyncOpenAI()
4841

4942
if api_type == "chat_completions":
5043
return OpenAIChatCompletionsModel(model=model_name, openai_client=client)

tests/test_agents.py

Lines changed: 0 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -22,59 +22,22 @@ def _mock_model(monkeypatch):
2222

2323

2424
class TestGetModel:
25-
def test_uses_azure_when_both_azure_env_vars_present(self, monkeypatch):
26-
monkeypatch.setenv("AZURE_OPENAI_API_KEY", "azure-key")
27-
monkeypatch.setenv("AZURE_OPENAI_ENDPOINT", "https://my.azure.com")
28-
monkeypatch.delenv("OPENAI_API_VERSION", raising=False)
29-
30-
with patch("bot.agents.AsyncAzureOpenAI") as mock_azure, patch("bot.agents.AsyncOpenAI") as mock_openai:
31-
mock_azure.return_value = MagicMock()
32-
_get_model()
33-
mock_azure.assert_called_once()
34-
mock_openai.assert_not_called()
35-
36-
def test_uses_standard_openai_when_only_api_key_set(self, monkeypatch):
37-
monkeypatch.setenv("AZURE_OPENAI_API_KEY", "azure-key")
38-
monkeypatch.delenv("AZURE_OPENAI_ENDPOINT", raising=False)
39-
40-
with patch("bot.agents.AsyncAzureOpenAI") as mock_azure, patch("bot.agents.AsyncOpenAI") as mock_openai:
41-
mock_openai.return_value = MagicMock()
42-
_get_model()
43-
mock_openai.assert_called_once()
44-
mock_azure.assert_not_called()
45-
46-
def test_uses_standard_openai_when_no_azure_vars(self, monkeypatch):
47-
monkeypatch.delenv("AZURE_OPENAI_API_KEY", raising=False)
48-
monkeypatch.delenv("AZURE_OPENAI_ENDPOINT", raising=False)
49-
50-
with patch("bot.agents.AsyncAzureOpenAI") as mock_azure, patch("bot.agents.AsyncOpenAI") as mock_openai:
51-
mock_openai.return_value = MagicMock()
52-
_get_model()
53-
mock_openai.assert_called_once()
54-
mock_azure.assert_not_called()
55-
5625
def test_returns_responses_model_by_default(self, monkeypatch):
5726
monkeypatch.delenv("OPENAI_API_TYPE", raising=False)
58-
monkeypatch.delenv("AZURE_OPENAI_API_KEY", raising=False)
59-
monkeypatch.delenv("AZURE_OPENAI_ENDPOINT", raising=False)
6027

6128
with patch("bot.agents.AsyncOpenAI", return_value=MagicMock()):
6229
model = _get_model()
6330
assert isinstance(model, OpenAIResponsesModel)
6431

6532
def test_returns_responses_model_when_api_type_is_responses(self, monkeypatch):
6633
monkeypatch.setenv("OPENAI_API_TYPE", "responses")
67-
monkeypatch.delenv("AZURE_OPENAI_API_KEY", raising=False)
68-
monkeypatch.delenv("AZURE_OPENAI_ENDPOINT", raising=False)
6934

7035
with patch("bot.agents.AsyncOpenAI", return_value=MagicMock()):
7136
model = _get_model()
7237
assert isinstance(model, OpenAIResponsesModel)
7338

7439
def test_returns_chat_completions_model_when_api_type_is_chat_completions(self, monkeypatch):
7540
monkeypatch.setenv("OPENAI_API_TYPE", "chat_completions")
76-
monkeypatch.delenv("AZURE_OPENAI_API_KEY", raising=False)
77-
monkeypatch.delenv("AZURE_OPENAI_ENDPOINT", raising=False)
7841

7942
with patch("bot.agents.AsyncOpenAI", return_value=MagicMock()):
8043
model = _get_model()

0 commit comments

Comments
 (0)