Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
15 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions lib/agent/messageMetadata/__tests__/sumLanguageModelUsage.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import { describe, it, expect } from "vitest";
import { sumLanguageModelUsage } from "@/lib/agent/messageMetadata/sumLanguageModelUsage";

describe("sumLanguageModelUsage", () => {
it("returns undefined when both inputs are undefined", () => {
expect(sumLanguageModelUsage(undefined, undefined)).toBeUndefined();
});

it("returns the second input when first is undefined", () => {
const u = { inputTokens: 100, outputTokens: 50 };
expect(sumLanguageModelUsage(undefined, u as never)).toBe(u);
});

it("returns the first input when second is undefined", () => {
const u = { inputTokens: 100, outputTokens: 50 };
expect(sumLanguageModelUsage(u as never, undefined)).toBe(u);
});

it("sums the two inputs pointwise when both are present", () => {
const result = sumLanguageModelUsage(
{ inputTokens: 100, outputTokens: 50 } as never,
{ inputTokens: 200, outputTokens: 75 } as never,
);
expect(result?.inputTokens).toBe(300);
expect(result?.outputTokens).toBe(125);
});
});
21 changes: 21 additions & 0 deletions lib/agent/messageMetadata/sumLanguageModelUsage.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import type { LanguageModelUsage } from "ai";
import { addLanguageModelUsage } from "@/lib/agent/messageMetadata/addLanguageModelUsage";

/**
* Sum two optional `LanguageModelUsage` records. Returns the sum when
* both are defined, the defined one when only one is, or `undefined`
* when neither is. Mirrors open-agents' `sumLanguageModelUsage` in
* `packages/agent/usage.ts`.
*
* Used by the `task` tool's progress streaming to accumulate usage
* across subagent steps without introducing zero-tokens placeholders
* before the first step finishes.
*/
export function sumLanguageModelUsage(
a: LanguageModelUsage | undefined,
b: LanguageModelUsage | undefined,
): LanguageModelUsage | undefined {
if (!a) return b;
if (!b) return a;
return addLanguageModelUsage(a, b);
}
14 changes: 9 additions & 5 deletions lib/agent/tools/__tests__/askUserQuestionTool.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -81,14 +81,16 @@ describe("askUserQuestionTool — server-side wiring", () => {

describe("askUserQuestionTool.toModelOutput", () => {
it("returns a generic message when no output is present", () => {
expect(askUserQuestionTool.toModelOutput!(undefined as never)).toEqual({
expect(askUserQuestionTool.toModelOutput!({ output: undefined } as never)).toEqual({
type: "text",
value: "User did not respond to questions.",
});
});

it("formats `declined: true` as a clear decline message", () => {
const result = askUserQuestionTool.toModelOutput!({ declined: true } as never);
const result = askUserQuestionTool.toModelOutput!({
output: { declined: true },
} as never);
expect(result).toMatchObject({
type: "text",
value: expect.stringMatching(/declined to answer/i),
Expand All @@ -97,9 +99,11 @@ describe("askUserQuestionTool.toModelOutput", () => {

it("formats answered questions as a parseable Q=A summary", () => {
const result = askUserQuestionTool.toModelOutput!({
answers: {
"Which model do you want?": "Haiku",
"Which features?": ["Streaming", "Tools"],
output: {
answers: {
"Which model do you want?": "Haiku",
"Which features?": ["Streaming", "Tools"],
},
},
} as never);
expect(result).toMatchObject({
Expand Down
Loading
Loading