ai-retry 0.8.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -251,12 +251,16 @@ Errors are tracked per unique model (provider + modelId). That means on the firs
251
251
 
252
252
  There are several built-in dynamic retryables available for common use cases:
253
253
 
254
+ > [!TIP]
255
+ > You are missing a retryable for your use case? [Open an issue](https://github.com/zirkelc/ai-retry/issues/new) and let's discuss it!
256
+
254
257
  - [`contentFilterTriggered`](./src/retryables/content-filter-triggered.ts): Content filter was triggered based on the prompt or completion.
255
258
  - [`requestTimeout`](./src/retryables/request-timeout.ts): Request timeout occurred.
256
259
  - [`requestNotRetryable`](./src/retryables/request-not-retryable.ts): Request failed with a non-retryable error.
257
260
  - [`retryAfterDelay`](./src/retryables/retry-after-delay.ts): Retry with delay and exponential backoff and respect `retry-after` headers.
258
261
  - [`serviceOverloaded`](./src/retryables/service-overloaded.ts): Response with status code 529 (service overloaded).
259
262
  - Use this retryable to handle Anthropic's overloaded errors.
263
+ - [`serviceUnavailable`](./src/retryables/service-unavailable.ts): Response with status code 503 (service unavailable).
260
264
 
261
265
  #### Content Filter
262
266
 
@@ -324,6 +328,21 @@ const retryableModel = createRetryable({
324
328
  });
325
329
  ```
326
330
 
331
+ #### Service Unavailable
332
+
333
+ Handle service unavailable errors (status code 503) by switching to a different provider.
334
+
335
+ ```typescript
336
+ import { serviceUnavailable } from 'ai-retry/retryables';
337
+
338
+ const retryableModel = createRetryable({
339
+ model: azure('gpt-4'),
340
+ retries: [
341
+ serviceUnavailable(openai('gpt-4')), // Switch to OpenAI if Azure is unavailable
342
+ ],
343
+ });
344
+ ```
345
+
327
346
  #### Request Not Retryable
328
347
 
329
348
  Handle cases where the base model fails with a non-retryable error.
@@ -39,4 +39,11 @@ declare function retryAfterDelay<MODEL extends LanguageModelV2 | EmbeddingModelV
39
39
  */
40
40
  declare function serviceOverloaded<MODEL extends LanguageModelV2 | EmbeddingModelV2>(model: MODEL, options?: RetryableOptions<MODEL>): Retryable<MODEL>;
41
41
  //#endregion
42
- export { contentFilterTriggered, requestNotRetryable, requestTimeout, retryAfterDelay, serviceOverloaded };
42
+ //#region src/retryables/service-unavailable.d.ts
43
+ /**
44
+ * Fallback to a different model if the provider returns a service unavailable error.
45
+ * This retryable handles HTTP status code 503 (Service Unavailable).
46
+ */
47
+ declare function serviceUnavailable<MODEL extends LanguageModelV2 | EmbeddingModelV2>(model: MODEL, options?: RetryableOptions<MODEL>): Retryable<MODEL>;
48
+ //#endregion
49
+ export { contentFilterTriggered, requestNotRetryable, requestTimeout, retryAfterDelay, serviceOverloaded, serviceUnavailable };
@@ -152,4 +152,24 @@ function serviceOverloaded(model, options) {
152
152
  }
153
153
 
154
154
  //#endregion
155
- export { contentFilterTriggered, requestNotRetryable, requestTimeout, retryAfterDelay, serviceOverloaded };
155
+ //#region src/retryables/service-unavailable.ts
156
+ /**
157
+ * Fallback to a different model if the provider returns a service unavailable error.
158
+ * This retryable handles HTTP status code 503 (Service Unavailable).
159
+ */
160
+ function serviceUnavailable(model, options) {
161
+ return (context) => {
162
+ const { current } = context;
163
+ if (isErrorAttempt(current)) {
164
+ const { error } = current;
165
+ if (APICallError.isInstance(error) && error.statusCode === 503) return {
166
+ model,
167
+ maxAttempts: 1,
168
+ ...options
169
+ };
170
+ }
171
+ };
172
+ }
173
+
174
+ //#endregion
175
+ export { contentFilterTriggered, requestNotRetryable, requestTimeout, retryAfterDelay, serviceOverloaded, serviceUnavailable };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ai-retry",
3
- "version": "0.8.0",
3
+ "version": "0.9.0",
4
4
  "description": "AI SDK Retry",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",