mirror of
https://github.com/moltbot/moltbot.git
synced 2026-04-24 07:01:49 +00:00
fix(agents): land #31002 from @yfge
Co-authored-by: yfge <geyunfei@gmail.com>
This commit is contained in:
60
src/agents/pi-embedded-helpers/thinking.test.ts
Normal file
60
src/agents/pi-embedded-helpers/thinking.test.ts
Normal file
@@ -0,0 +1,60 @@
|
||||
import { describe, expect, it } from "vitest";
|
||||
import { pickFallbackThinkingLevel } from "./thinking.js";
|
||||
|
||||
describe("pickFallbackThinkingLevel", () => {
|
||||
it("returns undefined for empty message", () => {
|
||||
expect(pickFallbackThinkingLevel({ message: "", attempted: new Set() })).toBeUndefined();
|
||||
});
|
||||
|
||||
it("returns undefined for undefined message", () => {
|
||||
expect(pickFallbackThinkingLevel({ message: undefined, attempted: new Set() })).toBeUndefined();
|
||||
});
|
||||
|
||||
it("extracts supported values from error message", () => {
|
||||
const result = pickFallbackThinkingLevel({
|
||||
message: 'Supported values are: "high", "medium"',
|
||||
attempted: new Set(),
|
||||
});
|
||||
expect(result).toBe("high");
|
||||
});
|
||||
|
||||
it("skips already attempted values", () => {
|
||||
const result = pickFallbackThinkingLevel({
|
||||
message: 'Supported values are: "high", "medium"',
|
||||
attempted: new Set(["high"]),
|
||||
});
|
||||
expect(result).toBe("medium");
|
||||
});
|
||||
|
||||
it('falls back to "off" when error says "not supported" without listing values', () => {
|
||||
const result = pickFallbackThinkingLevel({
|
||||
message: '400 think value "low" is not supported for this model',
|
||||
attempted: new Set(),
|
||||
});
|
||||
expect(result).toBe("off");
|
||||
});
|
||||
|
||||
it('falls back to "off" for generic not-supported messages', () => {
|
||||
const result = pickFallbackThinkingLevel({
|
||||
message: "thinking level not supported by this provider",
|
||||
attempted: new Set(),
|
||||
});
|
||||
expect(result).toBe("off");
|
||||
});
|
||||
|
||||
it('returns undefined if "off" was already attempted', () => {
|
||||
const result = pickFallbackThinkingLevel({
|
||||
message: '400 think value "low" is not supported for this model',
|
||||
attempted: new Set(["off"]),
|
||||
});
|
||||
expect(result).toBeUndefined();
|
||||
});
|
||||
|
||||
it("returns undefined for unrelated error messages", () => {
|
||||
const result = pickFallbackThinkingLevel({
|
||||
message: "rate limit exceeded, please retry after 30 seconds",
|
||||
attempted: new Set(),
|
||||
});
|
||||
expect(result).toBeUndefined();
|
||||
});
|
||||
});
|
||||
@@ -29,6 +29,14 @@ export function pickFallbackThinkingLevel(params: {
|
||||
}
|
||||
const supported = extractSupportedValues(raw);
|
||||
if (supported.length === 0) {
|
||||
// When the error clearly indicates the thinking level is unsupported but doesn't
|
||||
// list supported values (e.g. OpenAI's "think value \"low\" is not supported for
|
||||
// this model"), fall back to "off" to allow the request to succeed.
|
||||
// This commonly happens during model fallback when switching from Anthropic
|
||||
// (which supports thinking levels) to providers that don't.
|
||||
if (/not supported/i.test(raw) && !params.attempted.has("off")) {
|
||||
return "off";
|
||||
}
|
||||
return undefined;
|
||||
}
|
||||
for (const entry of supported) {
|
||||
|
||||
Reference in New Issue
Block a user