






















@@ -663,6 +663,137 @@ describe("createLaneTextDeliverer", () => {
663663expect(harness.sendPayload).toHaveBeenNthCalledWith(2, { text: " again" });
664664});
665665666+it("does not resend a long final when streaming already delivered it", async () => {
667+const fullAnswer = "Hello world again";
668+const answer = createTestDraftStream({ messageId: 999 });
669+answer.lastDeliveredText.mockReturnValue(fullAnswer);
670+const harness = createHarness({
671+answerStream: answer,
672+draftMaxChars: 5,
673+splitFinalTextForStream: () => ["Hello", " world", " again"],
674+});
675+harness.lanes.answer.hasStreamedMessage = true;
676+677+const result = await deliverFinalAnswer(harness, fullAnswer);
678+679+const delivery = expectPreviewFinalized(result);
680+expect(delivery.content).toBe(fullAnswer);
681+expect(delivery.promptContextContent).toBe(fullAnswer);
682+expect(delivery.messageId).toBe(999);
683+expect(answer.update).not.toHaveBeenCalled();
684+expect(harness.stopDraftLane).toHaveBeenCalledTimes(1);
685+expect(harness.clearDraftLane).not.toHaveBeenCalled();
686+expect(harness.sendPayload).not.toHaveBeenCalled();
687+expect(harness.markDelivered).toHaveBeenCalledTimes(1);
688+});
689+690+it("sends only the missing suffix when a long final extends the streamed prefix", async () => {
691+const answer = createTestDraftStream({ messageId: 999 });
692+answer.lastDeliveredText.mockReturnValue("Hello world");
693+const harness = createHarness({
694+answerStream: answer,
695+draftMaxChars: 5,
696+splitFinalTextForStream: (text) =>
697+text === " again" ? [" again"] : ["Hello", " world", " again"],
698+});
699+harness.lanes.answer.hasStreamedMessage = true;
700+701+const result = await deliverFinalAnswer(harness, "Hello world again");
702+703+const delivery = expectPreviewFinalized(result);
704+expect(delivery.content).toBe("Hello world again");
705+expect(delivery.promptContextContent).toBe("Hello world");
706+expect(answer.update).not.toHaveBeenCalled();
707+expect(harness.clearDraftLane).not.toHaveBeenCalled();
708+expect(harness.sendPayload).toHaveBeenCalledTimes(1);
709+expect(harness.sendPayload).toHaveBeenCalledWith({ text: " again" });
710+expect(harness.markDelivered).toHaveBeenCalledTimes(1);
711+});
712+713+it("does not send a suffix already flushed while stopping a long streamed final", async () => {
714+let deliveredText = "Hello world";
715+const answer = createTestDraftStream({
716+messageId: 999,
717+onStop: () => {
718+deliveredText = "Hello world again";
719+},
720+});
721+answer.lastDeliveredText.mockImplementation(() => deliveredText);
722+const harness = createHarness({
723+answerStream: answer,
724+draftMaxChars: 5,
725+splitFinalTextForStream: (text) =>
726+text === " again" ? [" again"] : ["Hello", " world", " again"],
727+});
728+harness.lanes.answer.hasStreamedMessage = true;
729+730+const result = await deliverFinalAnswer(harness, "Hello world again");
731+732+const delivery = expectPreviewFinalized(result);
733+expect(delivery.promptContextContent).toBe("Hello world again");
734+expect(answer.update).not.toHaveBeenCalled();
735+expect(harness.sendPayload).not.toHaveBeenCalled();
736+expect(harness.markDelivered).toHaveBeenCalledTimes(1);
737+});
738+739+it("keeps a long final when stop advances the stream past the first chunk", async () => {
740+let deliveredText = "Hello";
741+const answer = createTestDraftStream({
742+messageId: 999,
743+onStop: () => {
744+deliveredText = "Hello world again";
745+},
746+});
747+answer.lastDeliveredText.mockImplementation(() => deliveredText);
748+const harness = createHarness({
749+answerStream: answer,
750+draftMaxChars: 5,
751+splitFinalTextForStream: (text) =>
752+text === "Hello world again" ? ["Hello", " world", " again"] : ["Hello"],
753+});
754+harness.lanes.answer.hasStreamedMessage = true;
755+756+const result = await deliverFinalAnswer(harness, "Hello world again");
757+758+const delivery = expectPreviewFinalized(result);
759+expect(delivery.promptContextContent).toBe("Hello world again");
760+expect(answer.update).toHaveBeenCalledWith("Hello");
761+expect(harness.clearDraftLane).not.toHaveBeenCalled();
762+expect(harness.sendPayload).not.toHaveBeenCalled();
763+expect(harness.markDelivered).toHaveBeenCalledTimes(1);
764+});
765+766+it("keeps inline buttons on the current chunk of an already-streamed long final", async () => {
767+const buttons = [[{ text: "OK", callback_data: "ok" }]];
768+const fullAnswer = "Hello world again";
769+const answer = createTestDraftStream({ messageId: 999 });
770+answer.lastDeliveredText.mockReturnValue(fullAnswer);
771+const harness = createHarness({
772+answerStream: answer,
773+draftMaxChars: 6,
774+splitFinalTextForStream: () => ["Hello", " world", " again"],
775+});
776+harness.lanes.answer.hasStreamedMessage = true;
777+778+const result = await harness.deliverLaneText({
779+laneName: "answer",
780+text: fullAnswer,
781+payload: { text: fullAnswer, channelData: { telegram: { buttons } } },
782+infoKind: "final",
783+ buttons,
784+});
785+786+const delivery = expectPreviewFinalized(result);
787+expect(delivery.buttonsAttached).toBe(true);
788+expect(harness.editStreamMessage).toHaveBeenCalledWith({
789+laneName: "answer",
790+messageId: 999,
791+text: " again",
792+ buttons,
793+});
794+expect(harness.sendPayload).not.toHaveBeenCalled();
795+});
796+666797it("retains the streamed message when stop may have landed without a message id", async () => {
667798const answer = createTestDraftStream();
668799answer.sendMayHaveLanded.mockReturnValue(true);
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。