BYOK Azure: `wire_api: completions` ignored; hardcoded api-version rejected by Azure OpenAI Responses API
- Ngôn ngữ chính
- Shell
- Star
- 11.2k
- Fork
- 1.9k
- Merge trung bình
- 14 giờ 16 phút
- Pull request đã merge (30 ngày)
- 6
Mô tả
### Summary
When the GitHub Copilot CLI is configured (via `github-copilot-sdk`'s
`ProviderConfig`) to use `type: azure` with `wire_api: completions`,
the CLI ignores `wire_api` and sends requests to Azure OpenAI's
**Responses API** endpoint (`/openai/responses`) anyway. It also
appears to use a hardcoded api-version (per `copilot/session.py:819`
SDK docstring, defaults to `2024-10-21`) regardless of what's passed
in `azure.api_version`, which Azure OpenAI rejects for the Responses
API path:
```
400 Azure OpenAI Responses API is enabled only for api-version
2025-03-01-preview and later
```
This makes BYOK against Azure OpenAI / Microsoft Foundry deployments
non-functional today.
### Environment
- `copilot` CLI: `0.0.353` (Commit `f8fd3e3`), installed via Homebrew
- `github-copilot-sdk`: `0.3.0` (Python wrapper)
- Host: macOS 25.4.0 / arm64
- Upstream: Azure OpenAI deployment provisioned through Microsoft
Foundry hub (endpoint `https://.openai.azure.com`)
- Auth: Azure AD bearer token via `az account get-access-token
--resource https://cognitiveservices.azure.com`
### Reproducer
```python
import asyncio
from copilot import CopilotClient, ProviderConfig
async def main() -> None:
client = CopilotClient()
provider = ProviderConfig(
type="azure",
wire_api="completions", # asks for Chat Completions
base_url="https://.openai.azure.com",
bearer_token="",
azure={"api_version": "2025-04-01-preview"}, # explicit modern version
)
session = await client.create_session(
model="gpt-5",
working_directory="/tmp/test",
provider=provider,
on_permission_request=lambda *a, **kw: {"behavior": "allow"},
)
response = await session.send_and_wait("Write hello.py")
print(response)
asyncio.run(main())
```
### Expected behavior
The Copilot CLI sends requests to
`/openai/v1/chat/completions` (Chat Completions endpoint,
no api-version constraint), OR honors the explicit
`azure.api_version` passed in the ProviderConfig.
### Actual behavior
`~/.copilot/logs/process-*.log` shows:
```
[INFO] Using custom provider: type=azure, baseUrl=,
wireApi=responses ← wire_api was set to "completions"
[ERROR] {
"code": "BadRequest",
"message": "Azure OpenAI Responses API is enabled only for
api-version 2025-03-01-preview and later"
}
```
Two distinct issues:
1. **`wire_api: completions` is ignored** — log line shows
`wireApi=responses` even when SDK input was
`wire_api="completions"`.
2. **`azure.api_version` is ignored or overridden** — the request
that reaches Azure OpenAI uses a version older than
`2025-03-01-preview` despite us setting
`azure.api_version="2025-04-01-preview"` in `ProviderConfig`.
The same error reproduces with `wire_api: responses`, `model:
gpt-5.4`, and explicit `azure.api_version` overrides up to
`2026-01-01-preview`.
### Suggested fixes (any one would unblock BYOK Azure paths)
1. **Honor `wire_api: completions` for `type: azure`** — route to
`/openai/v1/chat/completions` instead of
`/openai/responses` when set. (Cleanest; matches the SDK
schema's `wire_api: Literal['completions', 'responses']` typing.)
2. **Honor `azure.api_version`** — pass through to the request URL
query string (`?api-version=...`) so operators can opt into
newer Azure API surfaces.
3. **Bump the hardcoded default to `2025-03-01-preview`** — at
minimum bring the default in line with current Azure OpenAI
Responses API requirements.
---
---
**Possibly related (different concrete symptoms, same general area):**
- #2576 — BYOK azure provider 404 error
- #2710 — Proposal: External model provider API surface for Copilot CLI
- #2755 — CLI headless mode: latency degradation under BYOK
Hướng dẫn đóng góp
Hướng nghiên cứu
Reproduce the Azure provider configuration and inspect copilot/session.py:819 alongside the ProviderConfig handling for wire_api and azure.api_version. Compare the request endpoint, wireApi log value, and API-version sent with the expected configuration. Done means completions routes to /openai/v1/chat/completions or the explicit Azure API version is honored, avoiding the reported rejection.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Đánh giá
- Công nghệ
- azure, python
- Lĩnh vực
- api, backend, cloud
- Loại issue
- Lỗi
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức độ hoạt động
- Ít trao đổi
- Độ rõ ràng
- Khá rõ ràng
- Mức phù hợp với người mới
- 48/100