fix(types): normalize DuckDuckGo request messages (#9847)

Co-authored-by: backryun <bakryun0718@proton.me>
This commit is contained in:
Diego Rodrigues de Sa e Souza
2026-08-09 09:51:22 -03:00
committed by GitHub
parent 2c21f292cd
commit fed05a3207
2 changed files with 33 additions and 4 deletions

View File

@@ -137,8 +137,23 @@ interface DuckDuckGoModelCapabilities {
reasoningEffort: string | null;
}
type DuckDuckGoRequestMessage = Record<string, unknown> & {
role: string;
content: unknown;
};
let durablePublicKey: JsonWebKey | null = null;
export function normalizeDuckDuckGoMessages(value: unknown): DuckDuckGoRequestMessage[] {
if (!Array.isArray(value)) return [];
return value.flatMap((message) => {
if (!message || typeof message !== "object" || Array.isArray(message)) return [];
const record = message as Record<string, unknown>;
if (typeof record.role !== "string") return [];
return [{ ...record, role: record.role, content: record.content }];
});
}
function extractDuckDuckGoContent(data: unknown): string {
if (!data || typeof data !== "object") return "";
const record = data as Record<string, unknown>;
@@ -440,14 +455,12 @@ export class DuckDuckGoWebExecutor extends BaseExecutor {
const { model, body, stream, signal, upstreamExtraHeaders } = input;
const upstreamModel = normalizeDuckDuckGoModel(model);
const bodyObj = (body || {}) as Record<string, unknown>;
const rawMessages = Array.isArray((body as { messages?: unknown[] } | null)?.messages)
? ((body as { messages: unknown[] }).messages as Array<Record<string, unknown>>)
: [];
const rawMessages = normalizeDuckDuckGoMessages(bodyObj.messages);
const { hasTools, requestedTools, effectiveMessages } = prepareToolMessages(
bodyObj,
rawMessages
);
const messages = effectiveMessages as Array<Record<string, unknown>>;
const messages = effectiveMessages;
const isStreaming = stream !== false;
const upstreamHeaders = upstreamExtraHeaders || {};

View File

@@ -4,6 +4,7 @@ import { FETCH_TIMEOUT_MS } from "../../open-sse/config/constants.ts";
import {
DuckDuckGoWebExecutor,
DUCKDUCKGO_BASE,
normalizeDuckDuckGoMessages,
STATUS_URL,
} from "../../open-sse/executors/duckduckgo-web.ts";
@@ -38,6 +39,21 @@ describe("DuckDuckGoWebExecutor", () => {
});
describe("execute method validation", () => {
it("normalizes only role-bearing request messages without dropping metadata", () => {
assert.deepEqual(
normalizeDuckDuckGoMessages([
{ role: "user", content: "hello", name: "caller" },
{ role: "assistant", tool_calls: [{ id: "call-1" }] },
{ content: "missing role" },
null,
]),
[
{ role: "user", content: "hello", name: "caller" },
{ role: "assistant", content: undefined, tool_calls: [{ id: "call-1" }] },
]
);
});
it("should reject empty messages array", async () => {
const executor = new DuckDuckGoWebExecutor();