From 1ea2c61ad40ea2864ada5781f27eb0d0180898f5 Mon Sep 17 00:00:00 2001 From: Jefferson Dantas Date: Wed, 12 Mar 2025 20:52:14 -0300 Subject: [PATCH 1/5] fix: After an API error, all subsequent calls fail with the same error --- src/methods/chat-session.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/methods/chat-session.ts b/src/methods/chat-session.ts index 4022e2e39..91871daa7 100644 --- a/src/methods/chat-session.ts +++ b/src/methods/chat-session.ts @@ -127,7 +127,14 @@ export class ChatSession { } finalResult = result; }); - await this._sendPromise; + + try { + await this._sendPromise; + } catch (error) { + this._sendPromise = Promise.resolve(); + throw error; + } + return finalResult; } From b66813aaae73ad8f8c26db1c863e1a6c2d1778de Mon Sep 17 00:00:00 2001 From: Jefferson Dantas Date: Mon, 24 Mar 2025 20:53:09 -0300 Subject: [PATCH 2/5] Format --- src/methods/chat-session.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/methods/chat-session.ts b/src/methods/chat-session.ts index 91871daa7..5c38ee02a 100644 --- a/src/methods/chat-session.ts +++ b/src/methods/chat-session.ts @@ -127,7 +127,7 @@ export class ChatSession { } finalResult = result; }); - + try { await this._sendPromise; } catch (error) { From 0b1d8941f326f591e394eb89847b176ba2b4a02e Mon Sep 17 00:00:00 2001 From: Jefferson Dantas Date: Tue, 25 Mar 2025 21:04:04 -0300 Subject: [PATCH 3/5] Refactored error handling in _sendPromise, replacing try/catch with .catch() to simplify the code. --- src/methods/chat-session.ts | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/methods/chat-session.ts b/src/methods/chat-session.ts index 5c38ee02a..0fe1590f3 100644 --- a/src/methods/chat-session.ts +++ b/src/methods/chat-session.ts @@ -128,12 +128,11 @@ export class ChatSession { finalResult = result; }); - try { - await this._sendPromise; - } catch (error) { + await this._sendPromise.catch((e) => { + // Resets _sendPromise and re-throws the error if it fails this._sendPromise = Promise.resolve(); - throw error; - } + throw e; + }); return finalResult; } From ec626796193eae8df2b0ee6ab0abb78477093262 Mon Sep 17 00:00:00 2001 From: Jefferson Dantas Date: Wed, 26 Mar 2025 08:58:56 -0300 Subject: [PATCH 4/5] refactor: Move error handling inside promise chain --- src/methods/chat-session.ts | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/methods/chat-session.ts b/src/methods/chat-session.ts index 0fe1590f3..cd303ad62 100644 --- a/src/methods/chat-session.ts +++ b/src/methods/chat-session.ts @@ -126,14 +126,13 @@ export class ChatSession { } } finalResult = result; + }) + .catch((e) => { + // Resets _sendPromise to avoid subsequent calls failing and throw error. + this._sendPromise = Promise.resolve(); + throw e; }); - - await this._sendPromise.catch((e) => { - // Resets _sendPromise and re-throws the error if it fails - this._sendPromise = Promise.resolve(); - throw e; - }); - + await this._sendPromise; return finalResult; } From da4279342841b7dd1786a0a31b21cecb3fb18828 Mon Sep 17 00:00:00 2001 From: Jefferson Dantas Date: Wed, 26 Mar 2025 20:42:12 -0300 Subject: [PATCH 5/5] test: Ensure generateContent errors do not persist across calls --- src/methods/chat-session.test.ts | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/methods/chat-session.test.ts b/src/methods/chat-session.test.ts index c09821030..26ee39c73 100644 --- a/src/methods/chat-session.test.ts +++ b/src/methods/chat-session.test.ts @@ -46,6 +46,27 @@ describe("ChatSession", () => { match.any, ); }); + it("generateContent errors should not persist", async () => { + const generateContentStub = stub( + generateContentMethods, + "generateContent", + ).rejects("generateContent failed"); + const chatSession = new ChatSession("MY_API_KEY", "a-model"); + await expect(chatSession.sendMessage("hello")).to.be.rejected; + expect(generateContentStub).to.be.calledWith( + "MY_API_KEY", + "a-model", + match.any, + ); + restore(); + + // Subsequent call should succeed. + const mockResponse = getMockResponse( + "unary-success-basic-reply-short.json", + ); + stub(request, "makeModelRequest").resolves(mockResponse as Response); + await expect(chatSession.sendMessage("hello")).to.not.be.rejected; + }); }); describe("sendMessageRecitationErrorNotAddingResponseToHistory()", () => { it("generateContent errors should be catchable", async () => {