Merge e5547294f3 into 09be5d45d5
This commit is contained in:
commit
c31a34c288
@ -148,7 +148,7 @@ describe("buildEmbeddedRunPayloads", () => {
|
|||||||
expect(payloads[0]?.text).toBe("All good");
|
expect(payloads[0]?.text).toBe("All good");
|
||||||
});
|
});
|
||||||
|
|
||||||
it("adds tool error fallback when the assistant only invoked tools", () => {
|
it("suppresses exit code errors as internal (model sees them in context)", () => {
|
||||||
const payloads = buildEmbeddedRunPayloads({
|
const payloads = buildEmbeddedRunPayloads({
|
||||||
assistantTexts: [],
|
assistantTexts: [],
|
||||||
toolMetas: [],
|
toolMetas: [],
|
||||||
@ -171,10 +171,9 @@ describe("buildEmbeddedRunPayloads", () => {
|
|||||||
toolResultFormat: "plain",
|
toolResultFormat: "plain",
|
||||||
});
|
});
|
||||||
|
|
||||||
expect(payloads).toHaveLength(1);
|
// Exit code errors should be treated as internal - the model sees them in context
|
||||||
expect(payloads[0]?.isError).toBe(true);
|
// and can decide how to proceed. Users shouldn't see "grep returned exit code 1" etc.
|
||||||
expect(payloads[0]?.text).toContain("Exec");
|
expect(payloads).toHaveLength(0);
|
||||||
expect(payloads[0]?.text).toContain("code 1");
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it("suppresses recoverable tool errors containing 'required'", () => {
|
it("suppresses recoverable tool errors containing 'required'", () => {
|
||||||
@ -226,6 +225,22 @@ describe("buildEmbeddedRunPayloads", () => {
|
|||||||
expect(payloads).toHaveLength(0);
|
expect(payloads).toHaveLength(0);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("suppresses aborted command errors", () => {
|
||||||
|
const payloads = buildEmbeddedRunPayloads({
|
||||||
|
assistantTexts: [],
|
||||||
|
toolMetas: [],
|
||||||
|
lastAssistant: undefined,
|
||||||
|
lastToolError: { toolName: "exec", error: "Command aborted by signal SIGTERM" },
|
||||||
|
sessionKey: "session:telegram",
|
||||||
|
inlineToolResultsAllowed: false,
|
||||||
|
verboseLevel: "off",
|
||||||
|
reasoningLevel: "off",
|
||||||
|
toolResultFormat: "plain",
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(payloads).toHaveLength(0);
|
||||||
|
});
|
||||||
|
|
||||||
it("shows non-recoverable tool errors to the user", () => {
|
it("shows non-recoverable tool errors to the user", () => {
|
||||||
const payloads = buildEmbeddedRunPayloads({
|
const payloads = buildEmbeddedRunPayloads({
|
||||||
assistantTexts: [],
|
assistantTexts: [],
|
||||||
|
|||||||
@ -189,7 +189,12 @@ export function buildEmbeddedRunPayloads(params: {
|
|||||||
errorLower.includes("must be") ||
|
errorLower.includes("must be") ||
|
||||||
errorLower.includes("must have") ||
|
errorLower.includes("must have") ||
|
||||||
errorLower.includes("needs") ||
|
errorLower.includes("needs") ||
|
||||||
errorLower.includes("requires");
|
errorLower.includes("requires") ||
|
||||||
|
// Treat command exit codes as internal - the model sees them and can decide how to proceed.
|
||||||
|
// Exit code 1 from grep/find/etc. just means "no matches", not a real error.
|
||||||
|
errorLower.includes("exited with code") ||
|
||||||
|
errorLower.includes("exit code") ||
|
||||||
|
errorLower.includes("aborted");
|
||||||
|
|
||||||
// Show tool errors only when:
|
// Show tool errors only when:
|
||||||
// 1. There's no user-facing reply AND the error is not recoverable
|
// 1. There's no user-facing reply AND the error is not recoverable
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user