From 65fe3c2adc651bd1930a8423a0613a5e7d354de0 Mon Sep 17 00:00:00 2001 From: Tom Boucher Date: Wed, 18 Mar 2026 10:25:24 -0400 Subject: [PATCH] fix(google-search): add 30s timeout to Gemini API call (#1139) --- .../extensions/google-search/index.ts | 29 ++++++++++++++----- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/src/resources/extensions/google-search/index.ts b/src/resources/extensions/google-search/index.ts index f06eabd93..3f74fc3e1 100644 --- a/src/resources/extensions/google-search/index.ts +++ b/src/resources/extensions/google-search/index.ts @@ -265,14 +265,27 @@ export default function (pi: ExtensionAPI) { try { if (process.env.GEMINI_API_KEY) { const ai = await getClient(); - const response = await ai.models.generateContent({ - model: process.env.GEMINI_SEARCH_MODEL || "gemini-2.5-flash", - contents: params.query, - config: { - tools: [{ googleSearch: {} }], - abortSignal: signal, - }, - }); + + // Add a 30-second timeout to prevent hanging (#1100) + const timeoutController = new AbortController(); + const timeoutId = setTimeout(() => timeoutController.abort(), 30_000); + const combinedSignal = signal + ? AbortSignal.any([signal, timeoutController.signal]) + : timeoutController.signal; + + let response; + try { + response = await ai.models.generateContent({ + model: process.env.GEMINI_SEARCH_MODEL || "gemini-2.5-flash", + contents: params.query, + config: { + tools: [{ googleSearch: {} }], + abortSignal: combinedSignal, + }, + }); + } finally { + clearTimeout(timeoutId); + } // Extract answer text const answer = response.text ?? "";