fix(azure-openai): normalize Azure endpoint (#12055)

Co-authored-by: William Wang <WilliamOnline1721@hotmail.com>
This commit is contained in:
GeekMr 2025-12-21 17:15:17 +08:00 committed by GitHub
parent 9f948e1ce7
commit a35bf4afa1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 44 additions and 1 deletions

View File

@ -0,0 +1,38 @@
import { describe, expect, it } from 'vitest'
import { normalizeAzureOpenAIEndpoint } from '../openai/azureOpenAIEndpoint'
describe('normalizeAzureOpenAIEndpoint', () => {
it.each([
{
apiHost: 'https://example.openai.azure.com/openai',
expectedEndpoint: 'https://example.openai.azure.com'
},
{
apiHost: 'https://example.openai.azure.com/openai/',
expectedEndpoint: 'https://example.openai.azure.com'
},
{
apiHost: 'https://example.openai.azure.com/openai/v1',
expectedEndpoint: 'https://example.openai.azure.com'
},
{
apiHost: 'https://example.openai.azure.com/openai/v1/',
expectedEndpoint: 'https://example.openai.azure.com'
},
{
apiHost: 'https://example.openai.azure.com',
expectedEndpoint: 'https://example.openai.azure.com'
},
{
apiHost: 'https://example.openai.azure.com/',
expectedEndpoint: 'https://example.openai.azure.com'
},
{
apiHost: 'https://example.openai.azure.com/OPENAI/V1',
expectedEndpoint: 'https://example.openai.azure.com'
}
])('strips trailing /openai from $apiHost', ({ apiHost, expectedEndpoint }) => {
expect(normalizeAzureOpenAIEndpoint(apiHost)).toBe(expectedEndpoint)
})
})

View File

@ -29,6 +29,7 @@ import { withoutTrailingSlash } from '@renderer/utils/api'
import { isOllamaProvider } from '@renderer/utils/provider'
import { BaseApiClient } from '../BaseApiClient'
import { normalizeAzureOpenAIEndpoint } from './azureOpenAIEndpoint'
const logger = loggerService.withContext('OpenAIBaseClient')
@ -213,7 +214,7 @@ export abstract class OpenAIBaseClient<
dangerouslyAllowBrowser: true,
apiKey: apiKeyForSdkInstance,
apiVersion: this.provider.apiVersion,
endpoint: this.provider.apiHost
endpoint: normalizeAzureOpenAIEndpoint(this.provider.apiHost)
}) as TSdkInstance
} else {
this.sdkInstance = new OpenAI({

View File

@ -0,0 +1,4 @@
export function normalizeAzureOpenAIEndpoint(apiHost: string): string {
const normalizedHost = apiHost.replace(/\/+$/, '')
return normalizedHost.replace(/\/openai(?:\/v1)?$/i, '')
}