refactor(agents): share tool call id extraction

This commit is contained in:
Peter Steinberger
2026-02-15 05:11:17 +00:00
parent 186925fdd9
commit 21dfac972c
3 changed files with 54 additions and 88 deletions

View File

@@ -1,11 +1,5 @@
import type { AgentMessage } from "@mariozechner/pi-agent-core";
type ToolCallLike = {
id: string;
name?: string;
};
const TOOL_CALL_TYPES = new Set(["toolCall", "toolUse", "functionCall"]);
import { extractToolCallsFromAssistant, extractToolResultId } from "./tool-call-id.js";
type ToolCallBlock = {
type?: unknown;
@@ -15,40 +9,15 @@ type ToolCallBlock = {
arguments?: unknown;
};
function extractToolCallsFromAssistant(
msg: Extract<AgentMessage, { role: "assistant" }>,
): ToolCallLike[] {
const content = msg.content;
if (!Array.isArray(content)) {
return [];
}
const toolCalls: ToolCallLike[] = [];
for (const block of content) {
if (!block || typeof block !== "object") {
continue;
}
const rec = block as { type?: unknown; id?: unknown; name?: unknown };
if (typeof rec.id !== "string" || !rec.id) {
continue;
}
if (rec.type === "toolCall" || rec.type === "toolUse" || rec.type === "functionCall") {
toolCalls.push({
id: rec.id,
name: typeof rec.name === "string" ? rec.name : undefined,
});
}
}
return toolCalls;
}
function isToolCallBlock(block: unknown): block is ToolCallBlock {
if (!block || typeof block !== "object") {
return false;
}
const type = (block as { type?: unknown }).type;
return typeof type === "string" && TOOL_CALL_TYPES.has(type);
return (
typeof type === "string" &&
(type === "toolCall" || type === "toolUse" || type === "functionCall")
);
}
function hasToolCallInput(block: ToolCallBlock): boolean {
@@ -70,18 +39,6 @@ function hasToolCallName(block: ToolCallBlock): boolean {
return hasNonEmptyStringField(block.name);
}
function extractToolResultId(msg: Extract<AgentMessage, { role: "toolResult" }>): string | null {
const toolCallId = (msg as { toolCallId?: unknown }).toolCallId;
if (typeof toolCallId === "string" && toolCallId) {
return toolCallId;
}
const toolUseId = (msg as { toolUseId?: unknown }).toolUseId;
if (typeof toolUseId === "string" && toolUseId) {
return toolUseId;
}
return null;
}
function makeMissingToolResult(params: {
toolCallId: string;
toolName?: string;