fix: bypass multimodal endpoint memory for gemini

This commit is contained in:
Cita
2026-03-21 18:37:36 +08:00
parent 6a19d809f0
commit 500ba25787
4 changed files with 202 additions and 18 deletions
@@ -367,6 +367,11 @@ export async function geminiProxyRoute(app: FastifyInstance) {
const isCountTokensAction = isGeminiCliDownstream
? options?.action === 'countTokens'
: modelActionPath.endsWith(':countTokens');
const rawUrl = request.raw.url || request.url || '';
const wantsSseEnvelope = (
isStreamAction
&& (isGeminiCliDownstream || /(?:^|[?&])alt=sse(?:&|$)/i.test(rawUrl))
);
if (!requestedModel) {
return reply.code(400).send({
error: { message: 'Gemini model path is required', type: 'invalid_request_error' },
@@ -857,11 +862,18 @@ export async function geminiProxyRoute(app: FastifyInstance) {
parsedUsage.completionTokens,
parsedUsage.totalTokens,
);
return reply.code(upstream.status).send(
isGeminiCliDownstream
? { response: geminiResponse }
: geminiResponse,
);
const downstreamPayload = isGeminiCliDownstream
? { response: geminiResponse }
: geminiResponse;
if (wantsSseEnvelope) {
// Some compatibility upstreams finish stream requests with a final JSON payload.
// Preserve Gemini streaming UX by wrapping that terminal payload back into one SSE event.
return reply
.code(upstream.status)
.type('text/event-stream; charset=utf-8')
.send(geminiGenerateContentTransformer.stream.serializeSsePayload(downstreamPayload));
}
return reply.code(upstream.status).send(downstreamPayload);
} catch (error) {
lastStatus = 502;
lastContentType = 'application/json';