mirror of
https://github.com/farcasclaudiu/openclaw.git
synced 2026-06-22 07:01:44 +03:00
refactor(agents): share toolResult details stripping
This commit is contained in:
@@ -2,7 +2,7 @@ import type { AgentMessage } from "@mariozechner/pi-agent-core";
|
|||||||
import type { ExtensionContext } from "@mariozechner/pi-coding-agent";
|
import type { ExtensionContext } from "@mariozechner/pi-coding-agent";
|
||||||
import { estimateTokens, generateSummary } from "@mariozechner/pi-coding-agent";
|
import { estimateTokens, generateSummary } from "@mariozechner/pi-coding-agent";
|
||||||
import { DEFAULT_CONTEXT_TOKENS } from "./defaults.js";
|
import { DEFAULT_CONTEXT_TOKENS } from "./defaults.js";
|
||||||
import { repairToolUseResultPairing } from "./session-transcript-repair.js";
|
import { repairToolUseResultPairing, stripToolResultDetails } from "./session-transcript-repair.js";
|
||||||
|
|
||||||
export const BASE_CHUNK_RATIO = 0.4;
|
export const BASE_CHUNK_RATIO = 0.4;
|
||||||
export const MIN_CHUNK_RATIO = 0.15;
|
export const MIN_CHUNK_RATIO = 0.15;
|
||||||
@@ -13,25 +13,6 @@ const MERGE_SUMMARIES_INSTRUCTIONS =
|
|||||||
"Merge these partial summaries into a single cohesive summary. Preserve decisions," +
|
"Merge these partial summaries into a single cohesive summary. Preserve decisions," +
|
||||||
" TODOs, open questions, and any constraints.";
|
" TODOs, open questions, and any constraints.";
|
||||||
|
|
||||||
function stripToolResultDetails(messages: AgentMessage[]): AgentMessage[] {
|
|
||||||
let touched = false;
|
|
||||||
const out: AgentMessage[] = [];
|
|
||||||
for (const msg of messages) {
|
|
||||||
if (!msg || typeof msg !== "object" || (msg as { role?: unknown }).role !== "toolResult") {
|
|
||||||
out.push(msg);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (!("details" in msg)) {
|
|
||||||
out.push(msg);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
const { details: _details, ...rest } = msg as unknown as Record<string, unknown>;
|
|
||||||
touched = true;
|
|
||||||
out.push(rest as unknown as AgentMessage);
|
|
||||||
}
|
|
||||||
return touched ? out : messages;
|
|
||||||
}
|
|
||||||
|
|
||||||
export function estimateMessagesTokens(messages: AgentMessage[]): number {
|
export function estimateMessagesTokens(messages: AgentMessage[]): number {
|
||||||
// SECURITY: toolResult.details can contain untrusted/verbose payloads; never include in LLM-facing compaction.
|
// SECURITY: toolResult.details can contain untrusted/verbose payloads; never include in LLM-facing compaction.
|
||||||
const safe = stripToolResultDetails(messages);
|
const safe = stripToolResultDetails(messages);
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ import {
|
|||||||
import { cleanToolSchemaForGemini } from "../pi-tools.schema.js";
|
import { cleanToolSchemaForGemini } from "../pi-tools.schema.js";
|
||||||
import {
|
import {
|
||||||
sanitizeToolCallInputs,
|
sanitizeToolCallInputs,
|
||||||
|
stripToolResultDetails,
|
||||||
sanitizeToolUseResultPairing,
|
sanitizeToolUseResultPairing,
|
||||||
} from "../session-transcript-repair.js";
|
} from "../session-transcript-repair.js";
|
||||||
import { resolveTranscriptPolicy } from "../transcript-policy.js";
|
import { resolveTranscriptPolicy } from "../transcript-policy.js";
|
||||||
@@ -406,25 +407,6 @@ export function applyGoogleTurnOrderingFix(params: {
|
|||||||
return { messages: sanitized, didPrepend };
|
return { messages: sanitized, didPrepend };
|
||||||
}
|
}
|
||||||
|
|
||||||
function stripToolResultDetails(messages: AgentMessage[]): AgentMessage[] {
|
|
||||||
let touched = false;
|
|
||||||
const out: AgentMessage[] = [];
|
|
||||||
for (const msg of messages) {
|
|
||||||
if (!msg || typeof msg !== "object" || (msg as { role?: unknown }).role !== "toolResult") {
|
|
||||||
out.push(msg);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (!("details" in msg)) {
|
|
||||||
out.push(msg);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
const { details: _details, ...rest } = msg as unknown as Record<string, unknown>;
|
|
||||||
touched = true;
|
|
||||||
out.push(rest as unknown as AgentMessage);
|
|
||||||
}
|
|
||||||
return touched ? out : messages;
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function sanitizeSessionHistory(params: {
|
export async function sanitizeSessionHistory(params: {
|
||||||
messages: AgentMessage[];
|
messages: AgentMessage[];
|
||||||
modelApi?: string | null;
|
modelApi?: string | null;
|
||||||
|
|||||||
@@ -66,6 +66,25 @@ export type ToolCallInputRepairReport = {
|
|||||||
droppedAssistantMessages: number;
|
droppedAssistantMessages: number;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export function stripToolResultDetails(messages: AgentMessage[]): AgentMessage[] {
|
||||||
|
let touched = false;
|
||||||
|
const out: AgentMessage[] = [];
|
||||||
|
for (const msg of messages) {
|
||||||
|
if (!msg || typeof msg !== "object" || (msg as { role?: unknown }).role !== "toolResult") {
|
||||||
|
out.push(msg);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!("details" in msg)) {
|
||||||
|
out.push(msg);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
const { details: _details, ...rest } = msg as unknown as Record<string, unknown>;
|
||||||
|
touched = true;
|
||||||
|
out.push(rest as unknown as AgentMessage);
|
||||||
|
}
|
||||||
|
return touched ? out : messages;
|
||||||
|
}
|
||||||
|
|
||||||
export function repairToolCallInputs(messages: AgentMessage[]): ToolCallInputRepairReport {
|
export function repairToolCallInputs(messages: AgentMessage[]): ToolCallInputRepairReport {
|
||||||
let droppedToolCalls = 0;
|
let droppedToolCalls = 0;
|
||||||
let droppedAssistantMessages = 0;
|
let droppedAssistantMessages = 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user