Skip to content

Commit 8e34c99

Browse files
refactor: 修复 SSE 流式传输缓冲问题
Co-authored-by: aider (gemini/gemini-2.5-pro) <aider@aider.chat>
1 parent aaeab48 commit 8e34c99

File tree

1 file changed

+20
-9
lines changed

1 file changed

+20
-9
lines changed

packages/mcp-server/src/bridge/openai.ts

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { Router, Request, Response } from 'express';
22
import { type Config } from '@google/gemini-cli-core';
33
import { createOpenAIStreamTransformer } from './stream-transformer.js';
4-
import { WritableStream } from 'node:stream/web';
54
import { GeminiApiClient } from '../gemini-client.js'; // <-- 引入新类
65
import { type OpenAIChatCompletionRequest } from '../types.js'; // <-- 引入新类型
76

@@ -44,15 +43,10 @@ export function createOpenAIRouter(config: Config, debugMode = false): Router {
4443
tool_choice: body.tool_choice,
4544
});
4645

47-
// 3. 创建转换器和写入器
4846
const openAIStream = createOpenAIStreamTransformer(body.model, debugMode);
49-
const writer = new WritableStream({
50-
write(chunk) {
51-
res.write(chunk);
52-
},
53-
});
5447

55-
// 4. 创建 ReadableStream 并通过管道连接
48+
// --- 修正的核心逻辑 ---
49+
// 1. 创建一个 ReadableStream 来包装我们的 Gemini 事件流
5650
const readableStream = new ReadableStream({
5751
async start(controller) {
5852
for await (const value of geminiStream) {
@@ -62,7 +56,24 @@ export function createOpenAIRouter(config: Config, debugMode = false): Router {
6256
},
6357
});
6458

65-
await readableStream.pipeThrough(openAIStream).pipeTo(writer);
59+
// 2. 将我们的流通过转换器
60+
const transformedStream = readableStream.pipeThrough(openAIStream);
61+
const reader = transformedStream.getReader();
62+
63+
// 3. 手动读取每个转换后的块并立即写入响应
64+
try {
65+
while (true) {
66+
const { done, value } = await reader.read();
67+
if (done) {
68+
break;
69+
}
70+
res.write(value);
71+
}
72+
} finally {
73+
reader.releaseLock();
74+
}
75+
// --- 修正结束 ---
76+
6677
res.end();
6778
} catch (error) {
6879
console.error('[OpenAI Bridge] Error:', error);

0 commit comments

Comments
 (0)