fix: complete extension usage accounting

closes #6509
This commit is contained in:
Mario Zechner
2026-07-20 17:04:12 +02:00
parent 2fd3868401
commit f8b74a4507
20 changed files with 267 additions and 36 deletions
+4
View File
@@ -6,6 +6,10 @@
- Moved the `uuidv7` export to `@earendil-works/pi-ai`.
### Added
- Added usage metadata to tool results, compaction entries, and branch summaries in the agent harness ([#6671](https://github.com/earendil-works/pi/pull/6671) by [@davidbrai](https://github.com/davidbrai)).
## [0.80.10] - 2026-07-16
## [0.80.9] - 2026-07-16
@@ -499,6 +499,30 @@ export async function generateSummary(
customInstructions?: string,
previousSummary?: string,
thinkingLevel?: ThinkingLevel,
): Promise<Result<string, CompactionError>> {
const result = await generateSummaryWithUsage(
currentMessages,
models,
model,
reserveTokens,
signal,
customInstructions,
previousSummary,
thinkingLevel,
);
return result.ok ? ok(result.value.text) : err(result.error);
}
/** Generate or update a conversation summary and return its provider usage. */
export async function generateSummaryWithUsage(
currentMessages: AgentMessage[],
models: Models,
model: Model<any>,
reserveTokens: number,
signal?: AbortSignal,
customInstructions?: string,
previousSummary?: string,
thinkingLevel?: ThinkingLevel,
): Promise<Result<{ text: string; usage: Usage }, CompactionError>> {
const maxTokens = Math.min(
Math.floor(0.8 * reserveTokens),
@@ -687,7 +711,7 @@ export async function compact(
let historyText = "No prior history.";
let historyUsage: Usage | undefined;
if (messagesToSummarize.length > 0) {
const historyResult = await generateSummary(
const historyResult = await generateSummaryWithUsage(
messagesToSummarize,
models,
model,
@@ -715,7 +739,7 @@ export async function compact(
? combineUsage(historyUsage, turnPrefixResult.value.usage)
: turnPrefixResult.value.usage;
} else {
const summaryResult = await generateSummary(
const summaryResult = await generateSummaryWithUsage(
messagesToSummarize,
models,
model,
+1
View File
@@ -20,6 +20,7 @@ export {
findCutPoint,
findTurnStartIndex,
generateSummary,
generateSummaryWithUsage,
getLastAssistantUsage,
prepareCompaction,
serializeConversation,
+10 -1
View File
@@ -20,6 +20,7 @@ import {
findCutPoint,
findTurnStartIndex,
generateSummary,
generateSummaryWithUsage,
getLastAssistantUsage,
prepareCompaction,
serializeConversation,
@@ -510,7 +511,7 @@ describe("harness compaction", () => {
]);
const summary = getOrThrow(
await generateSummary(messages, models, model, 2000, undefined, "focus", "old summary"),
await generateSummaryWithUsage(messages, models, model, 2000, undefined, "focus", "old summary"),
);
expect(summary.text).toContain("Test summary");
@@ -523,6 +524,14 @@ describe("harness compaction", () => {
expect(promptText).toContain("Additional focus: focus");
});
it("preserves the string result from generateSummary", async () => {
const messages: AgentMessage[] = [createUserMessage("Summarize this.")];
const { faux, model } = createFauxModel(false);
faux.setResponses([fauxAssistantMessage("## Goal\nTest summary")]);
expect(getOrThrow(await generateSummary(messages, models, model, 2000))).toBe("## Goal\nTest summary");
});
it("returns error results for failed or aborted summary generations", async () => {
const messages: AgentMessage[] = [createUserMessage("Summarize this.")];
const { faux: errorFaux, model: errorModel } = createFauxModel(false);