@@ -32,11 +32,13 @@ import {
3232 ensureStructResponse ,
3333 extractAllFunctionCallParts ,
3434 extractTextContent ,
35+ geminiRetryDelayMs ,
3536 mapToThinkingBudget ,
3637 mapToThinkingLevel ,
3738 supportsDisablingGemini25Thinking ,
3839} from '@/providers/google/utils'
3940import { getModelCapabilities , isKnownModelId } from '@/providers/models'
41+ import { withProviderRetry } from '@/providers/retry'
4042import { executeProviderTool } from '@/providers/runtime-context'
4143import { createSettledAgentEventStream } from '@/providers/stream-events'
4244import { createStreamingExecution } from '@/providers/streaming-execution'
@@ -962,6 +964,12 @@ export async function executeGeminiRequest(
962964 }
963965
964966 const logger = createLogger ( providerType === 'google' ? 'GoogleProvider' : 'VertexProvider' )
967+ const retryOptions = {
968+ logger,
969+ label : providerType === 'google' ? 'Gemini' : 'Vertex AI' ,
970+ abortSignal : request . abortSignal ,
971+ retryAfterMs : geminiRetryDelayMs ,
972+ }
965973
966974 logger . info ( `Preparing ${ providerType } Gemini request` , {
967975 model,
@@ -1148,12 +1156,14 @@ export async function executeGeminiRequest(
11481156 if ( shouldStream ) {
11491157 logger . info ( 'Handling Gemini streaming response' )
11501158
1151- const streamGenerator = await ai . models . generateContentStream (
1152- await prepareConversationGeneration ( request , 'gemini' , {
1153- model,
1154- contents,
1155- config : geminiConfig ,
1156- } )
1159+ const streamPayload = await prepareConversationGeneration ( request , 'gemini' , {
1160+ model,
1161+ contents,
1162+ config : geminiConfig ,
1163+ } )
1164+ const streamGenerator = await withProviderRetry (
1165+ ( ) => ai . models . generateContentStream ( streamPayload ) ,
1166+ retryOptions
11571167 )
11581168 const firstResponseTime = Date . now ( ) - initialCallTime
11591169
@@ -1202,12 +1212,14 @@ export async function executeGeminiRequest(
12021212 }
12031213
12041214 // Non-streaming request
1205- const response = await ai . models . generateContent (
1206- await prepareConversationGeneration ( request , 'gemini' , {
1207- model,
1208- contents,
1209- config : geminiConfig ,
1210- } )
1215+ const responsePayload = await prepareConversationGeneration ( request , 'gemini' , {
1216+ model,
1217+ contents,
1218+ config : geminiConfig ,
1219+ } )
1220+ const response = await withProviderRetry (
1221+ ( ) => ai . models . generateContent ( responsePayload ) ,
1222+ retryOptions
12111223 )
12121224 if ( ! extractAllFunctionCallParts ( response . candidates ?. [ 0 ] ) . length ) {
12131225 await captureProviderConversationStep (
@@ -1256,12 +1268,14 @@ export async function executeGeminiRequest(
12561268 }
12571269
12581270 const finalStartTime = Date . now ( )
1259- const finalResponse = await ai . models . generateContent (
1260- await prepareConversationGeneration ( request , 'gemini' , {
1261- model,
1262- contents : currentState . contents ,
1263- config : finalConfig ,
1264- } )
1271+ const finalResponsePayload = await prepareConversationGeneration ( request , 'gemini' , {
1272+ model,
1273+ contents : currentState . contents ,
1274+ config : finalConfig ,
1275+ } )
1276+ const finalResponse = await withProviderRetry (
1277+ ( ) => ai . models . generateContent ( finalResponsePayload ) ,
1278+ retryOptions
12651279 )
12661280 if ( ! extractAllFunctionCallParts ( finalResponse . candidates ?. [ 0 ] ) . length ) {
12671281 await captureProviderConversationStep (
@@ -1375,12 +1389,14 @@ export async function executeGeminiRequest(
13751389
13761390 /** Resolve the final turn, then project its settled answer when streaming was requested. */
13771391 const nextModelStartTime = Date . now ( )
1378- const nextResponse = await ai . models . generateContent (
1379- await prepareConversationGeneration ( request , 'gemini' , {
1380- model,
1381- contents : state . contents ,
1382- config : nextConfig ,
1383- } )
1392+ const nextResponsePayload = await prepareConversationGeneration ( request , 'gemini' , {
1393+ model,
1394+ contents : state . contents ,
1395+ config : nextConfig ,
1396+ } )
1397+ const nextResponse = await withProviderRetry (
1398+ ( ) => ai . models . generateContent ( nextResponsePayload ) ,
1399+ retryOptions
13841400 )
13851401 if ( ! extractAllFunctionCallParts ( nextResponse . candidates ?. [ 0 ] ) . length ) {
13861402 await captureProviderConversationStep (
0 commit comments