























@@ -102,11 +102,18 @@ describe("validateGeminiTurns", () => {
102102103103const result = validateGeminiTurns(msgs);
104104105-expect(result).toHaveLength(3);
106-expect(result[0]).toEqual({ role: "user", content: "Hello" });
107-expect(result[1].role).toBe("assistant");
108-expect((result[1] as { content?: unknown[] }).content).toHaveLength(2);
109-expect(result[2]).toEqual({ role: "user", content: "How are you?" });
105+expect(result).toEqual([
106+{ role: "user", content: "Hello" },
107+{
108+role: "assistant",
109+content: [
110+{ type: "text", text: "Part 1" },
111+{ type: "text", text: "Part 2" },
112+],
113+stopReason: "end_turn",
114+},
115+{ role: "user", content: "How are you?" },
116+]);
110117});
111118112119it("should preserve metadata from later message when merging", () => {
@@ -126,11 +133,17 @@ describe("validateGeminiTurns", () => {
126133127134const result = validateGeminiTurns(msgs);
128135129-expect(result).toHaveLength(1);
130-const merged = result[0] as Extract<AgentMessage, { role: "assistant" }>;
131-expect(merged.usage).toEqual({ input: 10, output: 10 });
132-expect(merged.stopReason).toBe("end_turn");
133-expect(merged.content).toHaveLength(2);
136+expect(result).toEqual([
137+{
138+role: "assistant",
139+content: [
140+{ type: "text", text: "Part 1" },
141+{ type: "text", text: "Part 2" },
142+],
143+usage: { input: 10, output: 10 },
144+stopReason: "end_turn",
145+},
146+]);
134147});
135148136149it("should handle toolResult messages without merging", () => {
@@ -158,12 +171,26 @@ describe("validateGeminiTurns", () => {
158171159172const result = validateGeminiTurns(msgs);
160173161-// Should merge the consecutive assistants
162-expect(result[0].role).toBe("user");
163-expect(result[1].role).toBe("assistant");
164-expect(result[2].role).toBe("toolResult");
165-expect(result[3].role).toBe("assistant");
166-expect(result[4].role).toBe("user");
174+expect(result).toEqual([
175+{ role: "user", content: "Use tool" },
176+{
177+role: "assistant",
178+content: [{ type: "toolUse", id: "tool-1", name: "test", input: {} }],
179+},
180+{
181+role: "toolResult",
182+toolUseId: "tool-1",
183+content: [{ type: "text", text: "Found data" }],
184+},
185+{
186+role: "assistant",
187+content: [
188+{ type: "text", text: "Here's the answer" },
189+{ type: "text", text: "Extra thoughts" },
190+],
191+},
192+{ role: "user", content: "Request 2" },
193+]);
167194});
168195});
169196@@ -197,14 +224,16 @@ describe("validateAnthropicTurns", () => {
197224198225const result = validateAnthropicTurns(msgs);
199226200-expect(result).toHaveLength(1);
201-expect(result[0].role).toBe("user");
202-const content = (result[0] as { content: unknown[] }).content;
203-expect(content).toHaveLength(2);
204-expect(content[0]).toEqual({ type: "text", text: "First message" });
205-expect(content[1]).toEqual({ type: "text", text: "Second message" });
206-// Should take timestamp from the newer message
207-expect((result[0] as { timestamp?: number }).timestamp).toBe(2000);
227+expect(result).toEqual([
228+{
229+role: "user",
230+content: [
231+{ type: "text", text: "First message" },
232+{ type: "text", text: "Second message" },
233+],
234+timestamp: 2000,
235+},
236+]);
208237});
209238210239it("should merge three consecutive user messages", () => {
@@ -216,9 +245,16 @@ describe("validateAnthropicTurns", () => {
216245217246const result = validateAnthropicTurns(msgs);
218247219-expect(result).toHaveLength(1);
220-const content = (result[0] as { content: unknown[] }).content;
221-expect(content).toHaveLength(3);
248+expect(result).toEqual([
249+{
250+role: "user",
251+content: [
252+{ type: "text", text: "One" },
253+{ type: "text", text: "Two" },
254+{ type: "text", text: "Three" },
255+],
256+},
257+]);
222258});
223259224260it("keeps newest metadata when merging consecutive users", () => {
@@ -295,8 +331,7 @@ describe("validateAnthropicTurns", () => {
295331296332const result = validateAnthropicTurns(msgs);
297333298-// validateAnthropicTurns only merges user messages, not assistant
299-expect(result).toHaveLength(3);
334+expect(result).toEqual(msgs);
300335});
301336302337it("should handle mixed scenario with steering messages", () => {
@@ -318,13 +353,22 @@ describe("validateAnthropicTurns", () => {
318353319354const result = validateAnthropicTurns(msgs);
320355321-// The two consecutive user messages at the end should be merged
322-expect(result).toHaveLength(3);
323-expect(result[0].role).toBe("user");
324-expect(result[1].role).toBe("assistant");
325-expect(result[2].role).toBe("user");
326-const lastContent = (result[2] as { content: unknown[] }).content;
327-expect(lastContent).toHaveLength(2);
356+expect(result).toEqual([
357+{ role: "user", content: [{ type: "text", text: "Original question" }] },
358+{
359+role: "assistant",
360+content: [],
361+stopReason: "error",
362+errorMessage: "Overloaded",
363+},
364+expect.objectContaining({
365+role: "user",
366+content: [
367+{ type: "text", text: "Steering: try again" },
368+{ type: "text", text: "Another follow-up" },
369+],
370+}),
371+]);
328372});
329373});
330374此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。