增强各厂商思考与采样参数映射,并统一流式推理字段解析。
避免不同接口字段差异导致思考链丢失或采样参数被忽略。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,40 @@
|
||||
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("她摘下耳机。");
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user