ci: run pi-ai OpenAI e2e through Azure
This commit is contained in:
@@ -167,6 +167,25 @@ 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')
|
||||
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',
|
||||
apiKey: 'test-key',
|
||||
baseURL: `${server.url}/api/projects/openai/openai/`,
|
||||
maxRetries: 0,
|
||||
}],
|
||||
})
|
||||
const result = await assemble(ctx, { provider: 'azure-openai-responses', 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.headers[0]?.['api-key']).toBe('test-key')
|
||||
})
|
||||
|
||||
it.each([
|
||||
[401, 'AUTH'],
|
||||
[400, 'INVALID_REQUEST'],
|
||||
|
||||
@@ -3,22 +3,26 @@ import { Context } from 'cordis'
|
||||
import LlmService, { CallId } from '@deepseek-ai/dsh-llm'
|
||||
import type { Message, ToolSchema } from '@deepseek-ai/dsh-llm'
|
||||
import * as LlmPiAi from '@deepseek-ai/dsh-llm-pi-ai'
|
||||
import type { PiAiReplayState } from '@deepseek-ai/dsh-llm-pi-ai'
|
||||
import type { PiAiReplayState } from '../src/replay.ts'
|
||||
import { assemble, type AssembledResult } from './assemble.ts'
|
||||
|
||||
interface ProviderCase {
|
||||
provider: 'openai' | 'anthropic'
|
||||
api: 'openai-responses' | 'anthropic-messages'
|
||||
provider: 'azure-openai-responses' | 'anthropic'
|
||||
api: 'azure-openai-responses' | 'anthropic-messages'
|
||||
model: string
|
||||
apiKey?: string
|
||||
baseURL?: string
|
||||
}
|
||||
|
||||
const azureOpenAIBaseURL = process.env.DSH_PI_AI_AZURE_OPENAI_BASE_URL ?? process.env.AZURE_OPENAI_BASE_URL
|
||||
|
||||
const providerCases: ProviderCase[] = [
|
||||
{
|
||||
provider: 'openai',
|
||||
api: 'openai-responses',
|
||||
model: process.env.DSH_PI_AI_OPENAI_MODEL ?? 'gpt-5.5',
|
||||
...process.env.OPENAI_API_KEY ? { apiKey: process.env.OPENAI_API_KEY } : {},
|
||||
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: 'anthropic',
|
||||
@@ -38,6 +42,7 @@ async function harness(): Promise<Context> {
|
||||
providers: providerCases.map(profile => ({
|
||||
provider: profile.provider,
|
||||
...profile.apiKey === undefined ? {} : { apiKey: profile.apiKey },
|
||||
...profile.baseURL === undefined ? {} : { baseURL: profile.baseURL },
|
||||
})),
|
||||
})
|
||||
return ctx
|
||||
@@ -90,7 +95,7 @@ for (const profile of providerCases) {
|
||||
provider: profile.provider,
|
||||
model: profile.model,
|
||||
messages: ask('Reply with exactly the word: pong'),
|
||||
maxTokens: 64,
|
||||
maxTokens: 1024,
|
||||
})
|
||||
|
||||
expect(result.finish.kind).toBe('stop')
|
||||
@@ -108,7 +113,7 @@ for (const profile of providerCases) {
|
||||
model: profile.model,
|
||||
messages: prompt,
|
||||
tools: [lookupTool],
|
||||
maxTokens: 256,
|
||||
maxTokens: 2048,
|
||||
})
|
||||
|
||||
expect(first.finish.kind).toBe('tool-calls')
|
||||
@@ -134,7 +139,7 @@ for (const profile of providerCases) {
|
||||
},
|
||||
],
|
||||
tools: [lookupTool],
|
||||
maxTokens: 256,
|
||||
maxTokens: 2048,
|
||||
})
|
||||
|
||||
expect(second.finish.kind).toBe('stop')
|
||||
|
||||
Reference in New Issue
Block a user