diff --git a/src/agents/pi-embedded-runner/run/payloads.ts b/src/agents/pi-embedded-runner/run/payloads.ts index ad5d99d0a8b..d4562db4f77 100644 --- a/src/agents/pi-embedded-runner/run/payloads.ts +++ b/src/agents/pi-embedded-runner/run/payloads.ts @@ -233,7 +233,7 @@ export function buildEmbeddedRunPayloads(params: { const isMutatingToolError = params.lastToolError.mutatingAction ?? isLikelyMutatingToolName(params.lastToolError.toolName); - const shouldShowToolError = isMutatingToolError || (!hasUserFacingReply && !isRecoverableError); + const shouldShowToolError = isMutatingToolError || (!hasUserFacingReply && !isRecoverableError && !params.config?.messages?.suppressToolErrors); // Always surface mutating tool failures so we do not silently confirm actions that did not happen. // Otherwise, keep the previous behavior and only surface non-recoverable failures when no reply exists. diff --git a/src/config/schema.help.ts b/src/config/schema.help.ts index 6bab5950a32..288711004dc 100644 --- a/src/config/schema.help.ts +++ b/src/config/schema.help.ts @@ -325,6 +325,8 @@ export const FIELD_HELP: Record = { "Max reply-back turns between requester and target (0–5).", "channels.telegram.customCommands": "Additional Telegram bot menu commands (merged with native; conflicts ignored).", + "messages.suppressToolErrors": + "When true, suppress ⚠️ tool-error warnings from being shown to the user. The agent already sees errors in context and can retry. Default: false.", "messages.ackReaction": "Emoji reaction used to acknowledge inbound messages (empty disables).", "messages.ackReactionScope": 'When to send ack reactions ("group-mentions", "group-all", "direct", "all").', diff --git a/src/config/schema.labels.ts b/src/config/schema.labels.ts index 60a467fd02c..dda03df3127 100644 --- a/src/config/schema.labels.ts +++ b/src/config/schema.labels.ts @@ -219,6 +219,7 @@ export const FIELD_LABELS: Record = { "browser.remoteCdpHandshakeTimeoutMs": "Remote CDP Handshake Timeout (ms)", "session.dmScope": "DM Session Scope", "session.agentToAgent.maxPingPongTurns": "Agent-to-Agent Ping-Pong Turns", + "messages.suppressToolErrors": "Suppress Tool Error Warnings", "messages.ackReaction": "Ack Reaction Emoji", "messages.ackReactionScope": "Ack Reaction Scope", "messages.inbound.debounceMs": "Inbound Message Debounce (ms)", diff --git a/src/config/types.messages.ts b/src/config/types.messages.ts index 0f197c98e6d..d63eee32d29 100644 --- a/src/config/types.messages.ts +++ b/src/config/types.messages.ts @@ -82,6 +82,8 @@ export type MessagesConfig = { ackReactionScope?: "group-mentions" | "group-all" | "direct" | "all"; /** Remove ack reaction after reply is sent (default: false). */ removeAckAfterReply?: boolean; + /** When true, suppress ⚠️ tool-error warnings from being shown to the user. Default: false. */ + suppressToolErrors?: boolean; /** Text-to-speech settings for outbound replies. */ tts?: TtsConfig; }; diff --git a/src/config/zod-schema.session.ts b/src/config/zod-schema.session.ts index f2b2f3152a2..224632defc9 100644 --- a/src/config/zod-schema.session.ts +++ b/src/config/zod-schema.session.ts @@ -114,6 +114,7 @@ export const MessagesSchema = z ackReaction: z.string().optional(), ackReactionScope: z.enum(["group-mentions", "group-all", "direct", "all"]).optional(), removeAckAfterReply: z.boolean().optional(), + suppressToolErrors: z.boolean().optional(), tts: TtsConfigSchema, }) .strict()