diff --git a/README.md b/README.md index c86ce77..3c17b0e 100644 --- a/README.md +++ b/README.md @@ -127,6 +127,8 @@ della richiesta utente, seguendo le best practice di context engineering: | `contextTokens` | `1500` | Token cap per il contesto iniettato | | `webSearch` | `auto` | Ricerca web Strada A: `auto` \| `on` \| `off` | | `vocalPlanningMode` | `true` | Piano + conferma in overlay dopo il vocale | +| `sttDirectGemini` | `true` | Interpretazione multimodale diretta Gemini (anche con DeepSeek/Claude) | +| `voiceModel` | `gemini-3.7-flash-medium` | Modello Gemini per l'audio | Le variabili d'ambiente (`GEMINI_API_KEY`, `AGY_STT_BACKEND`, ecc.) hanno priorità sul file di config quando impostate. diff --git a/extensions/index.ts b/extensions/index.ts index c793afb..6303533 100644 --- a/extensions/index.ts +++ b/extensions/index.ts @@ -66,6 +66,8 @@ interface AgyConfig { contextTokens?: number; // token cap per il contesto iniettato webSearch?: string; // auto|on|off — Strada A: pi cerca + inietta vocalPlanningMode?: boolean; // Opzione 4: piano + conferma prima di eseguire + sttDirectGemini?: boolean; // Forza l'uso di Gemini multimodale per l'audio anche con modelli non-Gemini (es. DeepSeek) + voiceModel?: string; // Modello per l'elaborazione vocale diretta (default: gemini-3.7-flash-medium) } const CONFIG_DEFAULTS: AgyConfig = { @@ -81,6 +83,8 @@ const CONFIG_DEFAULTS: AgyConfig = { contextTokens: 1500, webSearch: "auto", vocalPlanningMode: true, + sttDirectGemini: true, + voiceModel: "gemini-3.7-flash-medium", }; function loadConfig(): AgyConfig { @@ -111,7 +115,7 @@ function getConfig(key: keyof AgyConfig): string | undefined { function setConfig(key: keyof AgyConfig, value: string) { const cfg = loadConfig(); const numKeys: (keyof AgyConfig)[] = ["sttMaxDuration", "agyTimeoutMs", "contextTokens"]; - const boolKeys: (keyof AgyConfig)[] = ["ttsNotify", "contextInject", "vocalPlanningMode"]; + const boolKeys: (keyof AgyConfig)[] = ["ttsNotify", "contextInject", "vocalPlanningMode", "sttDirectGemini"]; if (numKeys.includes(key)) { (cfg as any)[key] = Number(value); } else if (boolKeys.includes(key)) { @@ -3125,20 +3129,27 @@ export default function agyExtension(pi: ExtensionAPI) { let searchHints: string[] = []; const activeModel = ctx.model; - const useDirectMultimodal = isGeminiModel(activeModel); + const directGeminiConfig = getConfig("sttDirectGemini"); + // Usa la pipeline multimodale diretta con Gemini se abilitata (default: true) o se il modello di chat è Gemini + const useDirectMultimodal = + directGeminiConfig !== "false" ? true : isGeminiModel(activeModel); if (useDirectMultimodal) { // ========================================================================= // Pipeline Multimodale Diretta (Gemini): l'audio viene inviato direttamente - // al modello senza passare per un riconoscitore vocale STT separato. + // a Gemini (gateway Antigravity / Gemini API) senza passare per un STT separato, + // anche se il modello attivo in sessione è DeepSeek, Claude o un modello locale. // ========================================================================= ctx.ui.notify("Interpretazione vocale diretta con Gemini...", "info"); try { + const voiceModelName = + getConfig("voiceModel") || + (isGeminiModel(activeModel) ? activeModel?.id : "gemini-3.7-flash-medium"); const directRes = await interpretAudioDirectGemini( optimized, editorText, context, - activeModel?.id, + voiceModelName, ); transcript = directRes.transcript || directRes.cleanPrompt; finalText = directRes.cleanPrompt; @@ -3360,6 +3371,8 @@ export default function agyExtension(pi: ExtensionAPI) { { key: "contextTokens", desc: "Token cap per il contesto iniettato (default 1500)" }, { key: "webSearch", desc: "Ricerca web Strada A: auto | on | off" }, { key: "vocalPlanningMode", desc: "Opzione 4: piano+conferma dopo il vocale (true|false)" }, + { key: "sttDirectGemini", desc: "Interpretazione vocale diretta Gemini (true|false, default true)" }, + { key: "voiceModel", desc: "Modello Gemini per l'audio (default gemini-3.7-flash-medium)" }, ]; pi.registerCommand("agy:config", {