diff --git a/packages/cli/src/config/config.ts b/packages/cli/src/config/config.ts index 5ad97ea48c..fab5517e2a 100755 --- a/packages/cli/src/config/config.ts +++ b/packages/cli/src/config/config.ts @@ -80,6 +80,7 @@ export interface CliArgs { model: string | undefined; sandbox: boolean | string | undefined; debug: boolean | undefined; + disableStreaming?: boolean; prompt: string | undefined; promptInteractive: string | undefined; worktree?: string; @@ -466,6 +467,10 @@ export async function parseArguments( type: 'boolean', description: 'Enable screen reader mode for accessibility.', }) + .option('disable-streaming', { + type: 'boolean', + description: 'Disable streaming responses from the model', + }) .option('output-format', { alias: 'o', type: 'string', @@ -973,6 +978,7 @@ export async function loadCliConfig( return new Config({ acpMode: isAcpMode, clientName, + disableStreaming: argv.disableStreaming, sessionId, clientVersion: await getVersion(), embeddingModel: DEFAULT_GEMINI_EMBEDDING_MODEL, diff --git a/packages/cli/src/services/UserSimulator.ts b/packages/cli/src/services/UserSimulator.ts index 204f15b1bf..96a7d49324 100644 --- a/packages/cli/src/services/UserSimulator.ts +++ b/packages/cli/src/services/UserSimulator.ts @@ -57,7 +57,7 @@ export class UserSimulator { } this.interactionsFile = `interactions_${Date.now()}.txt`; this.isRunning = true; - this.timer = setInterval(() => this.tick(), 3000); + this.timer = setInterval(() => this.tick(), 1000); } stop() { diff --git a/packages/core/src/config/config.ts b/packages/core/src/config/config.ts index d9e1b61a6f..c3d6d9af3a 100644 --- a/packages/core/src/config/config.ts +++ b/packages/core/src/config/config.ts @@ -639,6 +639,7 @@ export interface ConfigParameters { bugCommand?: BugCommandSettings; model: string; disableLoopDetection?: boolean; + disableStreaming?: boolean; maxSessionTurns?: number; acpMode?: boolean; listSessions?: boolean; @@ -986,6 +987,7 @@ export class Config implements McpContext, AgentLoopContext { private approvedPlanPath: string | undefined; private readonly simulateUser: boolean; private readonly knowledgeSource?: string; + private readonly disableStreaming: boolean; constructor(params: ConfigParameters) { this._sessionId = params.sessionId; @@ -1316,6 +1318,7 @@ export class Config implements McpContext, AgentLoopContext { this.enableConseca = params.enableConseca ?? false; this.simulateUser = params.simulateUser ?? false; this.knowledgeSource = params.knowledgeSource; + this.disableStreaming = params.disableStreaming ?? false; // Initialize Safety Infrastructure const contextBuilder = new ContextBuilder(this); @@ -3033,6 +3036,10 @@ export class Config implements McpContext, AgentLoopContext { return this.simulateUser; } + getDisableStreaming(): boolean { + return this.disableStreaming; + } + getKnowledgeSource(): string | undefined { return this.knowledgeSource; } diff --git a/packages/core/src/core/geminiChat.ts b/packages/core/src/core/geminiChat.ts index 414484d158..71d24820b8 100644 --- a/packages/core/src/core/geminiChat.ts +++ b/packages/core/src/core/geminiChat.ts @@ -850,6 +850,23 @@ export class GeminiChat { const finalContents = stripToolCallIdPrefixes(contentsToUse); + if (this.context.config.getDisableStreaming()) { + const response = await this.context.config + .getContentGenerator() + .generateContent( + { + model: modelToUse, + contents: finalContents, + config, + }, + prompt_id, + role, + ); + return (async function* () { + yield response; + })(); + } + return this.context.config.getContentGenerator().generateContentStream( { model: modelToUse,