Files
writing-agent/tests/stream-complete.test.ts
chenmoranzhiandCursor 752eaccefa 增强各厂商思考与采样参数映射,并统一流式推理字段解析。
避免不同接口字段差异导致思考链丢失或采样参数被忽略。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-14 01:14:09 +08:00

41 lines
1.3 KiB
TypeScript

import { describe, expect, it } from "vitest";
import { consumeOpenAiToolStream } from "../src/llm/stream-complete.js";
function sseStream(chunks: string[]): ReadableStream<Uint8Array> {
const encoder = new TextEncoder();
return new ReadableStream({
start(controller) {
for (const chunk of chunks) controller.enqueue(encoder.encode(chunk));
controller.close();
},
});
}
describe("consumeOpenAiToolStream", () => {
it("reads reasoning from reasoning_content and content from delta", async () => {
const parts = await consumeOpenAiToolStream(
sseStream([
'data: {"choices":[{"delta":{"reasoning_content":"想一下"}}]}\n',
'data: {"choices":[{"delta":{"content":"门开了"}}]}\n',
"data: [DONE]\n",
]),
{},
);
expect(parts.reasoning).toBe("想一下");
expect(parts.content).toBe("门开了");
});
it("accepts reasoning / thinking aliases and last-frame message content", async () => {
const parts = await consumeOpenAiToolStream(
sseStream([
'data: {"choices":[{"delta":{"reasoning":"先想"}}]}\n',
'data: {"choices":[{"message":{"content":"她摘下耳机。"}}]}\n',
"data: [DONE]\n",
]),
{},
);
expect(parts.reasoning).toBe("先想");
expect(parts.content).toBe("她摘下耳机。");
});
});