Merge pull request #2681 from afjcjsbx/fix/gemini-mcp-schema-sanitization

fix(mcp): sanitize MCP tool schemas for Gemini function calling
This commit is contained in:
Mauro
2026-05-03 20:25:35 +02:00
committed by GitHub
25 changed files with 1663 additions and 248 deletions
+1
View File
@@ -19,6 +19,7 @@ export interface ModelInfo {
max_tokens_field?: string
request_timeout?: number
thinking_level?: string
tool_schema_transform?: string
extra_body?: Record<string, unknown>
custom_headers?: Record<string, string>
// Meta
@@ -39,6 +39,7 @@ interface AddForm {
maxTokensField: string
requestTimeout: string
thinkingLevel: string
toolSchemaTransform: string
extraBody: string
customHeaders: string
}
@@ -57,6 +58,7 @@ const EMPTY_ADD_FORM: AddForm = {
maxTokensField: "",
requestTimeout: "",
thinkingLevel: "",
toolSchemaTransform: "",
extraBody: "",
customHeaders: "",
}
@@ -144,6 +146,7 @@ export function AddModelSheet({
? Number(form.requestTimeout)
: undefined,
thinking_level: form.thinkingLevel.trim() || undefined,
tool_schema_transform: form.toolSchemaTransform.trim() || undefined,
extra_body: form.extraBody.trim()
? JSON.parse(form.extraBody.trim())
: undefined,
@@ -345,6 +348,17 @@ export function AddModelSheet({
/>
</Field>
<Field
label={t("models.field.toolSchemaTransform")}
hint={t("models.field.toolSchemaTransformHint")}
>
<Input
value={form.toolSchemaTransform}
onChange={setField("toolSchemaTransform")}
placeholder="google"
/>
</Field>
<Field
label={t("models.field.extraBody")}
hint={t("models.field.extraBodyHint")}
@@ -38,6 +38,7 @@ interface EditForm {
maxTokensField: string
requestTimeout: string
thinkingLevel: string
toolSchemaTransform: string
extraBody: string
customHeaders: string
}
@@ -63,6 +64,7 @@ function buildInitialEditForm(model: ModelInfo): EditForm {
maxTokensField: model.max_tokens_field ?? "",
requestTimeout: model.request_timeout ? String(model.request_timeout) : "",
thinkingLevel: model.thinking_level ?? "",
toolSchemaTransform: model.tool_schema_transform ?? "", // <-- AGGIUNGI QUESTA RIGA
extraBody: model.extra_body
? JSON.stringify(model.extra_body, null, 2)
: "",
@@ -92,6 +94,7 @@ export function EditModelSheet({
maxTokensField: "",
requestTimeout: "",
thinkingLevel: "",
toolSchemaTransform: "",
extraBody: "",
customHeaders: "",
})
@@ -105,12 +108,12 @@ export function EditModelSheet({
setAsDefault !== model.is_default)
useEffect(() => {
if (model) {
setForm(buildInitialEditForm(model))
setSetAsDefault(model.is_default)
setError("")
}
}, [model])
if (model) {
setForm(buildInitialEditForm(model))
setSetAsDefault(model.is_default)
setError("")
}
}, [model])
const setField =
(key: keyof EditForm) =>
@@ -142,6 +145,7 @@ export function EditModelSheet({
? Number(form.requestTimeout)
: undefined,
thinking_level: form.thinkingLevel || undefined,
tool_schema_transform: form.toolSchemaTransform.trim() || undefined,
extra_body: form.extraBody.trim()
? JSON.parse(form.extraBody.trim())
: {},
@@ -342,6 +346,17 @@ export function EditModelSheet({
/>
</Field>
<Field
label={t("models.field.toolSchemaTransform")}
hint={t("models.field.toolSchemaTransformHint")}
>
<Input
value={form.toolSchemaTransform}
onChange={setField("toolSchemaTransform")}
placeholder="google"
/>
</Field>
<Field
label={t("models.field.extraBody")}
hint={t("models.field.extraBodyHint")}
+2
View File
@@ -294,6 +294,8 @@
"thinkingLevelHint": "Extended thinking budget: off, low, medium, high, xhigh, adaptive.",
"maxTokensField": "Max Tokens Field",
"maxTokensFieldHint": "Override the request field name for max tokens, e.g. max_completion_tokens.",
"toolSchemaTransform": "Tool Schema Transform",
"toolSchemaTransformHint": "Optional compatibility transform for tool JSON schemas. Leave blank for native behavior. Supported values: simple.",
"extraBody": "Extra Body",
"extraBodyHint": "Additional JSON fields to inject into the request body, e.g. {\"reasoning_split\": true}.",
"customHeaders": "Custom Headers",
+2
View File
@@ -294,6 +294,8 @@
"thinkingLevelHint": "扩展思考预算:off、low、medium、high、xhigh、adaptive。",
"maxTokensField": "Max Tokens 字段名",
"maxTokensFieldHint": "覆盖请求中 max_tokens 的字段名,例如 max_completion_tokens。",
"toolSchemaTransform": "工具 Schema 转换",
"toolSchemaTransformHint": "可选的工具 JSON Schema 兼容性转换。留空表示保持原生行为。当前支持值:simple。",
"extraBody": "Extra Body",
"extraBodyHint": "要注入到请求体中的额外 JSON 字段,例如 {\"reasoning_split\": true}。",
"customHeaders": "Custom Headers",