From ee514efa9e6bbf08cfd043d16e4b117b5138d362 Mon Sep 17 00:00:00 2001 From: Dayuan Jiang <34411969+DayuanJiang@users.noreply.github.com> Date: Thu, 11 Dec 2025 13:32:33 +0900 Subject: [PATCH] fix: implement AZURE_RESOURCE_NAME config for Azure OpenAI (#213) Previously AZURE_RESOURCE_NAME was documented in env.example but not actually used in the code. This caused Azure OpenAI configuration to fail when users set AZURE_RESOURCE_NAME instead of AZURE_BASE_URL. Changes: - Read AZURE_RESOURCE_NAME from environment and pass to createAzure() - resourceName constructs endpoint: https://{name}.openai.azure.com/openai/v1 - baseURL takes precedence over resourceName when both are set - Updated env.example with clearer documentation Fixes #208 --- env.example | 6 +++++- lib/ai-providers.ts | 7 ++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/env.example b/env.example index 8ec6d43..616243e 100644 --- a/env.example +++ b/env.example @@ -41,9 +41,13 @@ AI_MODEL=global.anthropic.claude-sonnet-4-5-20250929-v1:0 # GOOGLE_THINKING_LEVEL=high # Optional: Gemini 3 thinking level (low/high) # Azure OpenAI Configuration +# Configure endpoint using ONE of these methods: +# 1. AZURE_RESOURCE_NAME - SDK constructs: https://{name}.openai.azure.com/openai/v1{path} +# 2. AZURE_BASE_URL - SDK appends /v1{path} to your URL +# If both are set, AZURE_BASE_URL takes precedence. # AZURE_RESOURCE_NAME=your-resource-name # AZURE_API_KEY=... -# AZURE_BASE_URL=https://your-resource.openai.azure.com # Optional: Custom endpoint (overrides resourceName) +# AZURE_BASE_URL=https://your-resource.openai.azure.com/openai # Alternative: Custom endpoint # AZURE_REASONING_EFFORT=low # Optional: Azure reasoning effort (low, medium, high) # AZURE_REASONING_SUMMARY=detailed diff --git a/lib/ai-providers.ts b/lib/ai-providers.ts index 3fafe94..b98dc1e 100644 --- a/lib/ai-providers.ts +++ b/lib/ai-providers.ts @@ -572,10 +572,15 @@ export function getAIModel(overrides?: ClientOverrides): ModelConfig { case "azure": { const apiKey = overrides?.apiKey || process.env.AZURE_API_KEY const baseURL = overrides?.baseUrl || process.env.AZURE_BASE_URL - if (baseURL || overrides?.apiKey) { + const resourceName = process.env.AZURE_RESOURCE_NAME + // Azure requires either baseURL or resourceName to construct the endpoint + // resourceName constructs: https://{resourceName}.openai.azure.com/openai/v1{path} + if (baseURL || resourceName || overrides?.apiKey) { const customAzure = createAzure({ apiKey, + // baseURL takes precedence over resourceName per SDK behavior ...(baseURL && { baseURL }), + ...(!baseURL && resourceName && { resourceName }), }) model = customAzure(modelId) } else {