





























@@ -767,4 +767,104 @@ describe("google transport stream", () => {
767767thinkingConfig: { includeThoughts: true, thinkingBudget: expectedBudget },
768768});
769769});
770+771+it("emits a thinking_signature event for thoughtSignature-only parts to keep the stream active", async () => {
772+guardedFetchMock.mockResolvedValueOnce(
773+buildSseResponse([
774+{
775+candidates: [
776+{
777+content: {
778+parts: [
779+{ thought: true, text: "draft", thoughtSignature: "sig_1" },
780+{ thoughtSignature: "sig_2" },
781+{ text: "answer" },
782+],
783+},
784+finishReason: "STOP",
785+},
786+],
787+usageMetadata: {
788+promptTokenCount: 10,
789+candidatesTokenCount: 5,
790+thoughtsTokenCount: 3,
791+totalTokenCount: 18,
792+},
793+},
794+]),
795+);
796+797+const model = buildGeminiModel({
798+id: "gemini-3.1-pro-preview",
799+name: "Gemini 3.1 Pro Preview",
800+});
801+802+const streamFn = createGoogleGenerativeAiTransportStreamFn();
803+const stream = await Promise.resolve(
804+streamFn(
805+model,
806+{
807+systemPrompt: "You are a helpful assistant.",
808+messages: [{ role: "user", content: "hello", timestamp: 0 }],
809+} as never,
810+{ reasoning: "high" },
811+),
812+);
813+const result = await stream.result();
814+815+expect(result.content).toEqual([
816+{ type: "thinking", thinking: "draft", thinkingSignature: "sig_2" },
817+{ type: "text", text: "answer" },
818+]);
819+});
820+821+it("starts a thinking block for thoughtSignature-only parts that arrive before any text", async () => {
822+guardedFetchMock.mockResolvedValueOnce(
823+buildSseResponse([
824+{
825+candidates: [
826+{
827+content: {
828+parts: [
829+{ thoughtSignature: "sig_1" },
830+{ thought: true, text: "draft" },
831+{ text: "answer" },
832+],
833+},
834+finishReason: "STOP",
835+},
836+],
837+usageMetadata: {
838+promptTokenCount: 10,
839+candidatesTokenCount: 5,
840+thoughtsTokenCount: 3,
841+totalTokenCount: 18,
842+},
843+},
844+]),
845+);
846+847+const model = buildGeminiModel({
848+id: "gemini-3.1-pro-preview",
849+name: "Gemini 3.1 Pro Preview",
850+});
851+852+const streamFn = createGoogleGenerativeAiTransportStreamFn();
853+const stream = await Promise.resolve(
854+streamFn(
855+model,
856+{
857+systemPrompt: "You are a helpful assistant.",
858+messages: [{ role: "user", content: "hello", timestamp: 0 }],
859+} as never,
860+{ reasoning: "high" },
861+),
862+);
863+const result = await stream.result();
864+865+expect(result.content).toEqual([
866+{ type: "thinking", thinking: "draft", thinkingSignature: "sig_1" },
867+{ type: "text", text: "answer" },
868+]);
869+});
770870});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。