






















@@ -58,6 +58,7 @@ import { mergeTransportMetadata, sanitizeTransportPayloadText } from "./transpor
58585959const DEFAULT_AZURE_OPENAI_API_VERSION = "2024-12-01-preview";
6060const OPENAI_CODEX_RESPONSES_EMPTY_INPUT_TEXT = " ";
61+const GEMINI_THOUGHT_SIGNATURE_VALIDATOR_SKIP = "skip_thought_signature_validator";
6162const log = createSubsystemLogger("openai-transport");
62636364type ReplayableResponseOutputMessage = Omit<ResponseOutputMessage, "id"> & { id?: string };
@@ -1800,6 +1801,10 @@ function isGoogleOpenAICompatModel(model: OpenAIModeModel): boolean {
18001801);
18011802}
180218031804+function requiresGoogleCompatToolCallThoughtSignature(model: OpenAIModeModel): boolean {
1805+return model.id.toLowerCase().includes("gemini-3");
1806+}
1807+18031808function injectToolCallThoughtSignatures(
18041809outgoingMessages: unknown[],
18051810context: Context,
@@ -1809,18 +1814,14 @@ function injectToolCallThoughtSignatures(
18091814return;
18101815}
18111816const sigById = new Map<string, string>();
1817+const fallbackSig = requiresGoogleCompatToolCallThoughtSignature(model)
1818+ ? GEMINI_THOUGHT_SIGNATURE_VALIDATOR_SKIP
1819+ : undefined;
18121820for (const msg of context.messages ?? []) {
18131821if ((msg as { role?: string }).role !== "assistant") {
18141822continue;
18151823}
18161824const source = msg as { api?: string; provider?: string; model?: string; content?: unknown };
1817-if (
1818-source.api !== model.api ||
1819-source.provider !== model.provider ||
1820-source.model !== model.id
1821-) {
1822-continue;
1823-}
18241825if (!Array.isArray(source.content)) {
18251826continue;
18261827}
@@ -1831,11 +1832,15 @@ function injectToolCallThoughtSignatures(
18311832const id = block.id;
18321833const sig = block.thoughtSignature;
18331834if (typeof id === "string" && typeof sig === "string" && sig.length > 0) {
1834-sigById.set(id, sig);
1835+const isSameRoute =
1836+source.api === model.api &&
1837+source.provider === model.provider &&
1838+source.model === model.id;
1839+sigById.set(id, isSameRoute ? sig : (fallbackSig ?? sig));
18351840}
18361841}
18371842}
1838-if (sigById.size === 0) {
1843+if (sigById.size === 0 && !fallbackSig) {
18391844return;
18401845}
18411846for (const message of outgoingMessages) {
@@ -1848,7 +1853,7 @@ function injectToolCallThoughtSignatures(
18481853if (typeof id !== "string") {
18491854continue;
18501855}
1851-const sig = sigById.get(id);
1856+const sig = sigById.get(id) ?? fallbackSig;
18521857if (!sig) {
18531858continue;
18541859}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。