fix: preserve protocol parity across compatibility hops (#259)

* wip: preserve local changes before upstream merge

* Improve proxy routing stability and add stable-first strategy

* Sync explicit-group routing strategy to eligible source routes

* Fix proxy retry and runtime health review issues

* fix: make proxy channel retry attempts configurable

* fix: harden proxy retry recovery and bookkeeping

* fix: address pr 257 review comments

* fix: preserve oe tool_result structure

* fix: preserve protocol parity across compatibility hops

* fix: satisfy server build and typecheck

* fix: preserve codex and mcp fallback semantics

* fix: address ci and review follow-ups

---------

Co-authored-by: bnvnvnv <bnvnvnv@gmail.com>
This commit is contained in:
Cita
2026-03-23 20:25:20 +08:00
committed by GitHub
parent b3869c4f55
commit 4a3b4a8bb6
25 changed files with 985 additions and 136 deletions
@@ -1,4 +1,8 @@
import { canonicalRequestFromOpenAiBody } from '../../canonical/request.js';
import {
canonicalRequestFromOpenAiBody,
isCanonicalFunctionTool,
isCanonicalNamedToolChoice,
} from '../../canonical/request.js';
import type { CanonicalContentPart, CanonicalRequestEnvelope } from '../../canonical/types.js';
import type { ProtocolBuildContext, ProtocolParseContext } from '../../contracts.js';
import {
@@ -218,13 +222,16 @@ function buildGeminiRequestFromCanonical(request: CanonicalRequestEnvelope): Rec
}
if (Array.isArray(request.tools) && request.tools.length > 0) {
payload.tools = [{
functionDeclarations: request.tools.map((tool) => ({
name: tool.name,
...(tool.description ? { description: tool.description } : {}),
...(tool.inputSchema ? { parameters: tool.inputSchema } : {}),
})),
}];
const functionTools = request.tools.filter(isCanonicalFunctionTool);
if (functionTools.length > 0) {
payload.tools = [{
functionDeclarations: functionTools.map((tool) => ({
name: tool.name,
...(tool.description ? { description: tool.description } : {}),
...(tool.inputSchema ? { parameters: tool.inputSchema } : {}),
})),
}];
}
}
if (request.toolChoice) {
@@ -234,7 +241,7 @@ function buildGeminiRequestFromCanonical(request: CanonicalRequestEnvelope): Rec
payload.toolConfig = { functionCallingConfig: { mode: 'AUTO' } };
} else if (request.toolChoice === 'required') {
payload.toolConfig = { functionCallingConfig: { mode: 'ANY' } };
} else {
} else if (isCanonicalNamedToolChoice(request.toolChoice)) {
payload.toolConfig = {
functionCallingConfig: {
mode: 'ANY',