fix image model alias compatibility
Some checks failed
Build & Push Docker Image / build-and-push (push) Has been cancelled

This commit is contained in:
2026-04-20 10:39:59 +08:00
parent 022d581c60
commit d2e793c6cf
4 changed files with 240 additions and 15 deletions

View File

@@ -118,7 +118,7 @@ describe('generator-api gateway routing', () => {
expect(result).toEqual({ success: true, imageUrl: 'compat-template-image' })
})
it('normalizes legacy openai-compatible gemini image model ids before template gateway call', async () => {
it('prefers the resolved openai-compatible image model id before trying aliases', async () => {
resolveModelSelectionMock.mockResolvedValueOnce({
provider: 'openai-compatible:oa-1',
modelId: 'gemini-3.1-flash-image',
@@ -137,6 +137,35 @@ describe('generator-api gateway routing', () => {
await generateImage('user-1', 'openai-compatible:oa-1::gemini-3.1-flash-image', 'draw hero')
expect(generateImageViaOpenAICompatTemplateMock).toHaveBeenCalledWith(expect.objectContaining({
modelId: 'gemini-3.1-flash-image',
}))
})
it('retries openai-compatible image generation with a compatible alias after a model-id rejection', async () => {
resolveModelSelectionMock.mockResolvedValueOnce({
provider: 'openai-compatible:oa-1',
modelId: 'gemini-3.1-flash-image',
modelKey: 'openai-compatible:oa-1::gemini-3.1-flash-image',
mediaType: 'image',
compatMediaTemplate: {
version: 1,
mediaType: 'image',
mode: 'sync',
create: { method: 'POST', path: '/v1/images/generations' },
response: { outputUrlPath: '$.data[0].url' },
},
})
resolveModelGatewayRouteMock.mockReturnValueOnce('openai-compat')
generateImageViaOpenAICompatTemplateMock
.mockRejectedValueOnce(new Error('Template request failed with status 400: invalid model'))
.mockResolvedValueOnce({ success: true, imageUrl: 'compat-template-image' })
await generateImage('user-1', 'openai-compatible:oa-1::gemini-3.1-flash-image', 'draw hero')
expect(generateImageViaOpenAICompatTemplateMock).toHaveBeenNthCalledWith(1, expect.objectContaining({
modelId: 'gemini-3.1-flash-image',
}))
expect(generateImageViaOpenAICompatTemplateMock).toHaveBeenNthCalledWith(2, expect.objectContaining({
modelId: 'gemini-3.1-flash-image-preview',
}))
})