@@ -124,22 +124,22 @@ describe("session.retry.delay", () => {
124124} )
125125
126126describe ( "session.retry.retryable" , ( ) => {
127- test ( "maps too_many_requests json messages " , ( ) => {
127+ test ( "retries too_many_requests in raw json strings " , ( ) => {
128128 const error = wrap ( JSON . stringify ( { type : "error" , error : { type : "too_many_requests" } } ) )
129- expect ( SessionRetry . retryable ( error ) ) . toBe ( "Too Many Requests" )
129+ expect ( SessionRetry . retryable ( error ) ) . toBe ( JSON . stringify ( { type : "error" , error : { type : "too_many_requests" } } ) )
130130 } )
131131
132- test ( "maps overloaded provider codes" , ( ) => {
132+ test ( "retries exhausted codes in raw json strings " , ( ) => {
133133 const error = wrap ( JSON . stringify ( { code : "resource_exhausted" } ) )
134134 expect ( SessionRetry . retryable ( error ) ) . toBe ( "Provider is overloaded" )
135135 } )
136136
137- test ( "does not retry unknown json messages " , ( ) => {
137+ test ( "does not retry unknown raw json strings " , ( ) => {
138138 const error = wrap ( JSON . stringify ( { error : { message : "no_kv_space" } } ) )
139139 expect ( SessionRetry . retryable ( error ) ) . toBeUndefined ( )
140140 } )
141141
142- test ( "does not throw on numeric error codes" , ( ) => {
142+ test ( "does not throw on numeric codes in raw json strings " , ( ) => {
143143 const error = wrap ( JSON . stringify ( { type : "error" , error : { code : 123 } } ) )
144144 const result = SessionRetry . retryable ( error )
145145 expect ( result ) . toBeUndefined ( )
@@ -169,6 +169,66 @@ describe("session.retry.retryable", () => {
169169 expect ( SessionRetry . retryable ( error ) ) . toBe ( msg )
170170 } )
171171
172+ test ( "retries connection errors in plain text" , ( ) => {
173+ const msg = "Connection refused"
174+ const error = wrap ( msg )
175+ expect ( SessionRetry . retryable ( error ) ) . toBe ( msg )
176+ } )
177+
178+ test ( "retries timeout errors in plain text" , ( ) => {
179+ const msg = "Request timed out"
180+ const error = wrap ( msg )
181+ expect ( SessionRetry . retryable ( error ) ) . toBe ( msg )
182+ } )
183+
184+ test ( "retries 500 errors in plain text" , ( ) => {
185+ const msg = "HTTP 500 Internal Server Error"
186+ const error = wrap ( msg )
187+ expect ( SessionRetry . retryable ( error ) ) . toBe ( msg )
188+ } )
189+
190+ test ( "retries overloaded errors in plain text" , ( ) => {
191+ const msg = "Provider is overloaded"
192+ const error = wrap ( msg )
193+ expect ( SessionRetry . retryable ( error ) ) . toBe ( "Provider is overloaded" )
194+ } )
195+
196+ test ( "retries 429 errors in plain text" , ( ) => {
197+ const msg = "HTTP 429 Too Many Requests"
198+ const error = wrap ( msg )
199+ expect ( SessionRetry . retryable ( error ) ) . toBe ( msg )
200+ } )
201+
202+ test ( "retries provider returned errors" , ( ) => {
203+ const msg = "Provider returned error: something went wrong"
204+ const error = wrap ( msg )
205+ expect ( SessionRetry . retryable ( error ) ) . toBe ( msg )
206+ } )
207+
208+ test ( "retries other side closed errors" , ( ) => {
209+ const msg = "Other side closed connection"
210+ const error = wrap ( msg )
211+ expect ( SessionRetry . retryable ( error ) ) . toBe ( msg )
212+ } )
213+
214+ test ( "retries reset before headers errors" , ( ) => {
215+ const msg = "Connection reset before headers"
216+ const error = wrap ( msg )
217+ expect ( SessionRetry . retryable ( error ) ) . toBe ( msg )
218+ } )
219+
220+ test ( "retries ended without errors" , ( ) => {
221+ const msg = "Request ended without sending chunks"
222+ const error = wrap ( msg )
223+ expect ( SessionRetry . retryable ( error ) ) . toBe ( msg )
224+ } )
225+
226+ test ( "retries retry delay exceeded errors" , ( ) => {
227+ const msg = "Retry delay exceeded"
228+ const error = wrap ( msg )
229+ expect ( SessionRetry . retryable ( error ) ) . toBe ( msg )
230+ } )
231+
172232 test ( "does not retry context overflow errors" , ( ) => {
173233 const error = new MessageV2 . ContextOverflowError ( {
174234 message : "Input exceeds context window of this model" ,
@@ -250,9 +310,14 @@ describe("session.retry.retryable", () => {
250310 expect ( SessionRetry . retryable ( error ) ) . toBe ( "Provider is overloaded" )
251311 } )
252312
253- test ( "maps rate_limit error code in nested json" , ( ) => {
313+ test ( "retries rate_limit codes in raw json strings " , ( ) => {
254314 const error = wrap ( JSON . stringify ( { type : "error" , error : { code : "rate_limit_exceeded" } } ) )
255- expect ( SessionRetry . retryable ( error ) ) . toBe ( "Rate Limited" )
315+ expect ( SessionRetry . retryable ( error ) ) . toBe ( JSON . stringify ( { type : "error" , error : { code : "rate_limit_exceeded" } } ) )
316+ } )
317+
318+ test ( "retries server_error in raw json strings" , ( ) => {
319+ const error = wrap ( JSON . stringify ( { type : "error" , error : { type : "server_error" , code : "server_error" } } ) )
320+ expect ( SessionRetry . retryable ( error ) ) . toBe ( JSON . stringify ( { type : "error" , error : { type : "server_error" , code : "server_error" } } ) )
256321 } )
257322} )
258323
0 commit comments