From 879e4a00c5dd7ca5777e1e08c380f92a9fe42559 Mon Sep 17 00:00:00 2001 From: Austin-Lee02 Date: Mon, 15 Jun 2026 02:20:20 -0400 Subject: [PATCH 1/2] Add retry logic for sendRequest for when an invalid response is recieved in --- src/models/gemini.js | 46 ++++++++++++++++++++++++++++++-------------- 1 file changed, 32 insertions(+), 14 deletions(-) diff --git a/src/models/gemini.js b/src/models/gemini.js index 178ffff37..8727fd575 100644 --- a/src/models/gemini.js +++ b/src/models/gemini.js @@ -46,20 +46,38 @@ export class Gemini { }); } - const result = await this.genAI.models.generateContent({ - model: this.model_name || "gemini-2.5-flash", - contents: contents, - safetySettings: this.safetySettings, - config: { - systemInstruction: systemMessage, - ...(this.params || {}) + + const MAX_RETRIES = 5; + const RETRY_DELAY = 5000; + + for (let attempt = 0; attempt < MAX_RETRIES; attempt++) { + try { + const result = await this.genAI.models.generateContent({ + model: this.model_name || "gemini-2.5-flash", + contents: contents, + safetySettings: this.safetySettings, + config: { + systemInstruction: systemMessage, + ...(this.params || {}) + } + }); + const response = await result.text; + if (!response) { + console.warn(`Gemini returned empty response, retrying in ${RETRY_DELAY/1000}s... (attempt ${attempt + 1}/${MAX_RETRIES})`); + await new Promise(r => setTimeout(r, RETRY_DELAY)); + continue; + } + console.log('Received.'); + return response; + } catch (err) { + if (attempt < MAX_RETRIES - 1 && (err.status === 503 || err.status === 429)) { + console.warn(`Google API error ${err.status}, retrying in ${RETRY_DELAY/1000}s... (attempt ${attempt + 1}/${MAX_RETRIES})`); + await new Promise(r => setTimeout(r, RETRY_DELAY)); + } else { + throw err; + } } - }); - const response = await result.text; - - console.log('Received.'); - - return response; + } } async sendVisionRequest(turns, systemMessage, imageBuffer) { @@ -173,4 +191,4 @@ function createWavHeader(dataLength, sampleRate, channels, bitsPerSample) { export const TTSConfig = { sendAudioRequest: sendAudioRequest, -} \ No newline at end of file +} From e683c542707bc5e9da864df19bfc06121e31e1ac Mon Sep 17 00:00:00 2001 From: Austin-Lee02 Date: Mon, 15 Jun 2026 02:30:57 -0400 Subject: [PATCH 2/2] Implement error handling for item equip Add error handling when equipping items while a window is open. If it still errors, then gracefully fail and log failure. --- src/agent/library/skills.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/agent/library/skills.js b/src/agent/library/skills.js index a875ce782..9ceaf4a2b 100644 --- a/src/agent/library/skills.js +++ b/src/agent/library/skills.js @@ -829,7 +829,14 @@ export async function equip(bot, itemName) { await bot.equip(item, 'off-hand'); } else { - await bot.equip(item, 'hand'); + try { + if (bot.currentWindow) bot.closeWindow(bot.currentWindow); + await bot.equip(item, 'hand'); + } catch (err) { + console.warn('Failed to equip tool, continuing without equip:', err.message); + log(bot, `Failed to equip ${itemName}.`); + return false; + } } log(bot, `Equipped ${itemName}.`); return true;