From 17a42811176b91e4e6f625d5df75fb00aa729314 Mon Sep 17 00:00:00 2001 From: ciat-777 Date: Sat, 21 Mar 2026 14:03:35 +0800 Subject: [PATCH] fix: avoid messages fallback for generic file uploads --- .../conversationFileCapabilities.test.ts | 12 ++++++++- .../conversationFileCapabilities.ts | 27 ++++++++++++------- .../routes/proxy/upstreamEndpoint.test.ts | 4 +-- 3 files changed, 30 insertions(+), 13 deletions(-) diff --git a/src/server/proxy-core/capabilities/conversationFileCapabilities.test.ts b/src/server/proxy-core/capabilities/conversationFileCapabilities.test.ts index ae8992b..5cd663c 100644 --- a/src/server/proxy-core/capabilities/conversationFileCapabilities.test.ts +++ b/src/server/proxy-core/capabilities/conversationFileCapabilities.test.ts @@ -60,6 +60,16 @@ describe('conversationFileCapabilities', () => { document: 'inline_only', preservesRemoteDocumentUrl: false, }); + + expect(resolveConversationFileEndpointCapability({ + sitePlatform: 'new-api', + endpoint: 'messages', + })).toMatchObject({ + image: 'native', + audio: 'unsupported', + document: 'unsupported', + preservesRemoteDocumentUrl: false, + }); }); it('ranks document-capable endpoints ahead of lossy fallbacks', () => { @@ -74,6 +84,6 @@ describe('conversationFileCapabilities', () => { }, }); - expect(ranked).toEqual(['responses', 'messages', 'chat']); + expect(ranked).toEqual(['responses', 'chat']); }); }); diff --git a/src/server/proxy-core/capabilities/conversationFileCapabilities.ts b/src/server/proxy-core/capabilities/conversationFileCapabilities.ts index 38a7cfc..44536e1 100644 --- a/src/server/proxy-core/capabilities/conversationFileCapabilities.ts +++ b/src/server/proxy-core/capabilities/conversationFileCapabilities.ts @@ -218,7 +218,7 @@ export function resolveConversationFileEndpointCapability(input: { return { image: 'native', audio: 'unsupported', - document: 'inline_only', + document: 'unsupported', preservesRemoteDocumentUrl: false, }; } @@ -241,27 +241,34 @@ export function rankConversationFileEndpoints(input: { return [...input.requestedOrder]; } + const isDocumentCompatible = (endpoint: ConversationFileEndpoint) => { + const capability = resolveConversationFileEndpointCapability({ + sitePlatform: input.sitePlatform, + endpoint, + }); + if (capability.document === 'unsupported') return false; + if (input.summary.hasRemoteDocumentUrl && !capability.preservesRemoteDocumentUrl) return false; + return true; + }; + const preferredDocumentOrder = input.preferMessagesForClaudeModel === true ? ['messages', 'responses', 'chat'] : ['responses', 'messages', 'chat']; const supportedDocumentEndpoints = preferredDocumentOrder.filter((endpoint) => { if (!input.requestedOrder.includes(endpoint as ConversationFileEndpoint)) return false; - const capability = resolveConversationFileEndpointCapability({ - sitePlatform: input.sitePlatform, - endpoint: endpoint as ConversationFileEndpoint, - }); - if (capability.document === 'unsupported') return false; - if (input.summary.hasRemoteDocumentUrl && !capability.preservesRemoteDocumentUrl) return false; - return true; + return isDocumentCompatible(endpoint as ConversationFileEndpoint); }) as ConversationFileEndpoint[]; if (supportedDocumentEndpoints.length <= 0) { - return [...input.requestedOrder]; + return []; } return [ ...supportedDocumentEndpoints, - ...input.requestedOrder.filter((endpoint) => !supportedDocumentEndpoints.includes(endpoint)), + ...input.requestedOrder.filter((endpoint) => ( + !supportedDocumentEndpoints.includes(endpoint) + && isDocumentCompatible(endpoint) + )), ]; } diff --git a/src/server/routes/proxy/upstreamEndpoint.test.ts b/src/server/routes/proxy/upstreamEndpoint.test.ts index 3b52b2f..cd1193b 100644 --- a/src/server/routes/proxy/upstreamEndpoint.test.ts +++ b/src/server/routes/proxy/upstreamEndpoint.test.ts @@ -193,7 +193,7 @@ describe('resolveUpstreamEndpointCandidates', () => { }, ); - expect(order).toEqual(['responses', 'messages', 'chat']); + expect(order).toEqual(['responses', 'chat']); }); it('remembers the last successful endpoint per site capability profile', async () => { @@ -252,7 +252,7 @@ describe('resolveUpstreamEndpointCandidates', () => { }, ); - expect(order).toEqual(['responses', 'messages', 'chat']); + expect(order).toEqual(['responses']); }); it('does not remember messages fallback success for generic /v1/responses requests', async () => {