diff --git a/src/common/stores/llms/llms.parameters.ts b/src/common/stores/llms/llms.parameters.ts index 06e804fa9..fb9977f5c 100644 --- a/src/common/stores/llms/llms.parameters.ts +++ b/src/common/stores/llms/llms.parameters.ts @@ -349,6 +349,15 @@ export const DModelParameterRegistry = { // when undefined, the model chooses automatically }, + // Gemini Interactions API agent_config - per-agent knobs (Deep Research only today) + llmVndGeminiAgentViz: _enumDef({ + label: 'Visualizations', + type: 'enum', + description: 'Charts and images in Deep Research reports. Disable for text-only output (helpful when merging multiple reports).', + values: ['auto', 'off'], + // undefined means upstream default ('auto'); we only forward when explicitly 'off' + }), + // NOTE: we don't have this as a parameter, as for now we use it in tandem with llmVndGeminiGoogleSearch // llmVndGeminiUrlContext: { // label: 'URL Context', diff --git a/src/modules/aix/client/aix.client.ts b/src/modules/aix/client/aix.client.ts index 50248b45b..3dfe23f4d 100644 --- a/src/modules/aix/client/aix.client.ts +++ b/src/modules/aix/client/aix.client.ts @@ -70,7 +70,7 @@ export function aixCreateModelFromLLMOptions( llmVndAntEffort, llmVndGemEffort, llmVndOaiEffort, llmVndMiscEffort, llmVndAnt1MContext, llmVndAntInfSpeed, llmVndAntSkills, llmVndAntThinkingBudget, llmVndAntWebDynamic, llmVndAntWebFetch, llmVndAntWebFetchMaxUses, llmVndAntWebSearch, llmVndAntWebSearchMaxUses, llmVndBedrockAPI, - llmVndGeminiAspectRatio, llmVndGeminiImageSize, llmVndGeminiCodeExecution, llmVndGeminiComputerUse, llmVndGeminiGoogleSearch, llmVndGeminiMediaResolution, llmVndGeminiThinkingBudget, + llmVndGeminiAgentViz, llmVndGeminiAspectRatio, llmVndGeminiImageSize, llmVndGeminiCodeExecution, llmVndGeminiComputerUse, llmVndGeminiGoogleSearch, llmVndGeminiMediaResolution, llmVndGeminiThinkingBudget, // llmVndMoonshotWebSearch, llmVndOaiRestoreMarkdown, llmVndOaiVerbosity, llmVndOaiWebSearchContext, llmVndOaiWebSearchGeolocation, llmVndOaiImageGeneration, llmVndOaiCodeInterpreter, llmVndOrtWebSearch, @@ -143,6 +143,7 @@ export function aixCreateModelFromLLMOptions( // Gemini ...(llmVndGeminiInteractions ? { vndGeminiAPI: 'interactions-agent' } : {}), + ...(llmVndGeminiAgentViz === 'off' ? { vndGeminiAgentViz: 'off' } : {}), // Deep Research agent_config.visualization - only forward when explicitly disabled ...(llmVndGeminiAspectRatio ? { vndGeminiAspectRatio: llmVndGeminiAspectRatio } : {}), ...(llmVndGeminiCodeExecution === 'auto' ? { vndGeminiCodeExecution: llmVndGeminiCodeExecution } : {}), ...(llmVndGeminiComputerUse ? { vndGeminiComputerUse: llmVndGeminiComputerUse } : {}), diff --git a/src/modules/aix/server/api/aix.wiretypes.ts b/src/modules/aix/server/api/aix.wiretypes.ts index e6b67a593..c7b6566fb 100644 --- a/src/modules/aix/server/api/aix.wiretypes.ts +++ b/src/modules/aix/server/api/aix.wiretypes.ts @@ -516,6 +516,7 @@ export namespace AixWire_API { // Gemini vndGeminiAPI: z.enum(['interactions-agent']).optional(), // opt-in per-model API dialect; unset = generateContent + vndGeminiAgentViz: z.enum(['auto', 'off']).optional(), // agent_config.visualization; default 'auto' upstream vndGeminiAspectRatio: z.enum(['1:1', '2:3', '3:2', '3:4', '4:3', '9:16', '16:9', '21:9']).optional(), vndGeminiCodeExecution: z.enum(['auto']).optional(), vndGeminiComputerUse: z.enum(['browser']).optional(), diff --git a/src/modules/aix/server/dispatch/chatGenerate/adapters/gemini.interactionsCreate.ts b/src/modules/aix/server/dispatch/chatGenerate/adapters/gemini.interactionsCreate.ts index 672014cd0..21dffd161 100644 --- a/src/modules/aix/server/dispatch/chatGenerate/adapters/gemini.interactionsCreate.ts +++ b/src/modules/aix/server/dispatch/chatGenerate/adapters/gemini.interactionsCreate.ts @@ -86,7 +86,8 @@ export function aixToGeminiInteractionsCreate(model: AixAPI_Model, chatGenerateR agent_config: { type: 'deep-research', thinking_summaries: 'auto', // Enable thought_summary blocks - without this the API would not emit summaries during streaming - // visualization defaults to 'auto' upstream; leave unset to keep the default (agent may generate charts/images). + // visualization: forwarded only when the client explicitly opts out; 'auto' (default) is left unset so the agent may generate charts/images. + ...(model.vndGeminiAgentViz === 'off' && { visualization: 'off' }), }, }), // non-DR agents: use native system_instruction field (matches gemini.generateContent.ts convention) diff --git a/src/modules/llms/models-modal/LLMParametersEditor.tsx b/src/modules/llms/models-modal/LLMParametersEditor.tsx index c90d58844..06dda6bdc 100644 --- a/src/modules/llms/models-modal/LLMParametersEditor.tsx +++ b/src/modules/llms/models-modal/LLMParametersEditor.tsx @@ -123,6 +123,11 @@ const _geminiGoogleSearchOptions = [ { value: _UNSPECIFIED, label: 'Off', description: 'Default (disabled)' }, ] as const; +const _geminiAgentVizOptions = [ + { value: _UNSPECIFIED, label: 'Auto', description: 'Default - agent may include charts/images' }, + { value: 'off', label: 'Off', description: 'Text only (better when merging multiple reports)' }, +] as const; + const _geminiMediaResolutionOptions = [ { value: 'mr_high', label: 'High', description: 'Best quality' }, { value: 'mr_medium', label: 'Medium', description: 'Balanced' }, @@ -245,6 +250,7 @@ export function LLMParametersEditor(props: { llmVndAntWebSearch, llmVndAntWebSearchMaxUses, llmVndGemEffort, + llmVndGeminiAgentViz, llmVndGeminiAspectRatio, llmVndGeminiCodeExecution, llmVndGeminiGoogleSearch, @@ -687,6 +693,19 @@ export function LLMParametersEditor(props: { /> )} + {showParam('llmVndGeminiAgentViz') && ( + { + if (value === _UNSPECIFIED || !value) onRemoveParameter('llmVndGeminiAgentViz'); + else onChangeParameter({ llmVndGeminiAgentViz: value }); + }} + options={_geminiAgentVizOptions} + /> + )} + {/*{showParam('llmVndMoonshotWebSearch') && (*/} {/*