Bläddra i källkod

fix(ci): target Azure Foundry OpenAI v1 route

Yichen Jiang 1 månad sedan
förälder
incheckning
39dea6107e

+ 2 - 3
.github/workflows/pi-ai-provider-e2e.yml

@@ -68,10 +68,9 @@ jobs:
       - name: E2E tests (real Azure OpenAI and Anthropic APIs)
         env:
           AZURE_OPENAI_API_KEY: ${{ secrets.AZURE_OPENAI_API_KEY_EXTERNAL }}
-          AZURE_OPENAI_API_VERSION: v1
           ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY_EXTERNAL }}
-          DSH_PI_AI_AZURE_OPENAI_MODEL: ${{ inputs.azure_openai_model }}
-          DSH_PI_AI_AZURE_OPENAI_BASE_URL: https://openai-routerhub-resource.services.ai.azure.com/api/projects/openai/openai/
+          DSH_PI_AI_OPENAI_MODEL: ${{ inputs.azure_openai_model }}
+          DSH_PI_AI_OPENAI_BASE_URL: https://openai-routerhub-resource.services.ai.azure.com/api/projects/openai/openai/v1
           DSH_PI_AI_ANTHROPIC_MODEL: ${{ inputs.anthropic_model }}
           DSH_E2E_MAX_WORKERS: 2
         run: >-

+ 6 - 6
packages/llm/llm-pi-ai/tests/adapter.spec.ts

@@ -167,22 +167,22 @@ describe('PiAiAdapter provider routing', () => {
     expect(server.paths).toEqual(['/v1/responses'])
   })
 
-  it('uses Azure OpenAI Responses with the configured project base path and API key', async () => {
-    vi.stubEnv('AZURE_OPENAI_API_VERSION', 'v1')
+  it('uses OpenAI Responses against an Azure project v1 path with its API key header', async () => {
     const server = await mockServer([{ status: 401, body: JSON.stringify({ error: { message: 'expected mock failure' } }) }])
     const ctx = new Context()
     await ctx.plugin(LlmService)
     await ctx.plugin(LlmPiAi, {
       providers: [{
-        provider: 'azure-openai-responses',
+        provider: 'openai',
         apiKey: 'test-key',
-        baseURL: `${server.url}/api/projects/openai/openai/`,
+        baseURL: `${server.url}/api/projects/openai/openai/v1`,
+        headers: { 'api-key': 'test-key' },
         maxRetries: 0,
       }],
     })
-    const result = await assemble(ctx, { provider: 'azure-openai-responses', model: 'gpt-5.5', messages: [] })
+    const result = await assemble(ctx, { provider: 'openai', model: 'gpt-5.5', messages: [] })
     expect(result.finish.kind).toBe('error')
-    expect(server.paths).toEqual(['/api/projects/openai/openai/responses?api-version=v1'])
+    expect(server.paths).toEqual(['/api/projects/openai/openai/v1/responses'])
     expect(server.headers[0]?.['api-key']).toBe('test-key')
   })
 

+ 11 - 8
packages/llm/llm-pi-ai/tests/provider-apis.e2e.ts

@@ -7,22 +7,24 @@ import type { PiAiReplayState } from '../src/replay.ts'
 import { assemble, type AssembledResult } from './assemble.ts'
 
 interface ProviderCase {
-  provider: 'azure-openai-responses' | 'anthropic'
-  api: 'azure-openai-responses' | 'anthropic-messages'
+  provider: 'openai' | 'anthropic'
+  api: 'openai-responses' | 'anthropic-messages'
   model: string
   apiKey?: string
   baseURL?: string
+  headers?: Record<string, string>
 }
 
-const azureOpenAIBaseURL = process.env.DSH_PI_AI_AZURE_OPENAI_BASE_URL ?? process.env.AZURE_OPENAI_BASE_URL
+const openAIBaseURL = process.env.DSH_PI_AI_OPENAI_BASE_URL
+const azureOpenAIKey = process.env.AZURE_OPENAI_API_KEY
 
 const providerCases: ProviderCase[] = [
   {
-    provider: 'azure-openai-responses',
-    api: 'azure-openai-responses',
-    model: process.env.DSH_PI_AI_AZURE_OPENAI_MODEL ?? 'gpt-5.5',
-    ...process.env.AZURE_OPENAI_API_KEY ? { apiKey: process.env.AZURE_OPENAI_API_KEY } : {},
-    ...azureOpenAIBaseURL ? { baseURL: azureOpenAIBaseURL } : {},
+    provider: 'openai',
+    api: 'openai-responses',
+    model: process.env.DSH_PI_AI_OPENAI_MODEL ?? 'gpt-5.5',
+    ...azureOpenAIKey ? { apiKey: azureOpenAIKey, headers: { 'api-key': azureOpenAIKey } } : {},
+    ...openAIBaseURL ? { baseURL: openAIBaseURL } : {},
   },
   {
     provider: 'anthropic',
@@ -43,6 +45,7 @@ async function harness(): Promise<Context> {
       provider: profile.provider,
       ...profile.apiKey === undefined ? {} : { apiKey: profile.apiKey },
       ...profile.baseURL === undefined ? {} : { baseURL: profile.baseURL },
+      ...profile.headers === undefined ? {} : { headers: profile.headers },
     })),
   })
   return ctx