@falai/agent 3.3.0 → 3.4.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.
Files changed (62) hide show
  1. package/dist/cjs/index.d.ts +2 -0
  2. package/dist/cjs/index.d.ts.map +1 -1
  3. package/dist/cjs/index.js +4 -2
  4. package/dist/cjs/index.js.map +1 -1
  5. package/dist/cjs/providers/AnthropicProvider.d.ts +6 -2
  6. package/dist/cjs/providers/AnthropicProvider.d.ts.map +1 -1
  7. package/dist/cjs/providers/AnthropicProvider.js +2 -0
  8. package/dist/cjs/providers/AnthropicProvider.js.map +1 -1
  9. package/dist/cjs/providers/FallbackAiProvider.d.ts +26 -0
  10. package/dist/cjs/providers/FallbackAiProvider.d.ts.map +1 -0
  11. package/dist/cjs/providers/FallbackAiProvider.js +54 -0
  12. package/dist/cjs/providers/FallbackAiProvider.js.map +1 -0
  13. package/dist/cjs/providers/GeminiProvider.d.ts +5 -1
  14. package/dist/cjs/providers/GeminiProvider.d.ts.map +1 -1
  15. package/dist/cjs/providers/GeminiProvider.js +2 -0
  16. package/dist/cjs/providers/GeminiProvider.js.map +1 -1
  17. package/dist/cjs/providers/OpenAICompatibleProvider.d.ts.map +1 -1
  18. package/dist/cjs/providers/OpenAICompatibleProvider.js +2 -0
  19. package/dist/cjs/providers/OpenAICompatibleProvider.js.map +1 -1
  20. package/dist/cjs/providers/ProviderAdapter.d.ts +8 -1
  21. package/dist/cjs/providers/ProviderAdapter.d.ts.map +1 -1
  22. package/dist/cjs/providers/ProviderAdapter.js +23 -1
  23. package/dist/cjs/providers/ProviderAdapter.js.map +1 -1
  24. package/dist/cjs/providers/ZaiProvider.d.ts +6 -2
  25. package/dist/cjs/providers/ZaiProvider.d.ts.map +1 -1
  26. package/dist/cjs/providers/ZaiProvider.js +2 -0
  27. package/dist/cjs/providers/ZaiProvider.js.map +1 -1
  28. package/dist/index.d.ts +2 -0
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +1 -0
  31. package/dist/index.js.map +1 -1
  32. package/dist/providers/AnthropicProvider.d.ts +6 -2
  33. package/dist/providers/AnthropicProvider.d.ts.map +1 -1
  34. package/dist/providers/AnthropicProvider.js +2 -0
  35. package/dist/providers/AnthropicProvider.js.map +1 -1
  36. package/dist/providers/FallbackAiProvider.d.ts +26 -0
  37. package/dist/providers/FallbackAiProvider.d.ts.map +1 -0
  38. package/dist/providers/FallbackAiProvider.js +50 -0
  39. package/dist/providers/FallbackAiProvider.js.map +1 -0
  40. package/dist/providers/GeminiProvider.d.ts +5 -1
  41. package/dist/providers/GeminiProvider.d.ts.map +1 -1
  42. package/dist/providers/GeminiProvider.js +2 -0
  43. package/dist/providers/GeminiProvider.js.map +1 -1
  44. package/dist/providers/OpenAICompatibleProvider.d.ts.map +1 -1
  45. package/dist/providers/OpenAICompatibleProvider.js +2 -0
  46. package/dist/providers/OpenAICompatibleProvider.js.map +1 -1
  47. package/dist/providers/ProviderAdapter.d.ts +8 -1
  48. package/dist/providers/ProviderAdapter.d.ts.map +1 -1
  49. package/dist/providers/ProviderAdapter.js +24 -2
  50. package/dist/providers/ProviderAdapter.js.map +1 -1
  51. package/dist/providers/ZaiProvider.d.ts +6 -2
  52. package/dist/providers/ZaiProvider.d.ts.map +1 -1
  53. package/dist/providers/ZaiProvider.js +2 -0
  54. package/dist/providers/ZaiProvider.js.map +1 -1
  55. package/package.json +2 -2
  56. package/src/index.ts +2 -0
  57. package/src/providers/AnthropicProvider.ts +8 -3
  58. package/src/providers/FallbackAiProvider.ts +94 -0
  59. package/src/providers/GeminiProvider.ts +7 -2
  60. package/src/providers/OpenAICompatibleProvider.ts +2 -0
  61. package/src/providers/ProviderAdapter.ts +31 -1
  62. package/src/providers/ZaiProvider.ts +8 -3
@@ -27,9 +27,11 @@ import {
27
27
  streamWatch,
28
28
  streamWithBackupModels,
29
29
  watchChunks,
30
+ withFallbackProviders,
30
31
  withStreamRetry,
31
32
  type ChatMessage,
32
33
  type Effort,
34
+ type FallbackOptions,
33
35
  type JsonObjectSchema,
34
36
  type JsonWithToolsProbe,
35
37
  type ProbeOptions,
@@ -119,6 +121,12 @@ export interface ProviderAdapterInit {
119
121
  defaults?: RequestConfig;
120
122
  /** Tried in order after the primary. */
121
123
  backupModels?: string[];
124
+ /**
125
+ * Fallback providers to try if this provider fails/exhausts.
126
+ * Accepts both @falai/agent AiProviders (like ZaiProvider) and @providerkit/core Providers.
127
+ */
128
+ fallbacks?: Array<AiProvider | Provider>;
129
+ fallbackOptions?: FallbackOptions<Provider>;
122
130
  retryConfig?: { timeout?: number; retries?: number };
123
131
  }
124
132
 
@@ -212,6 +220,9 @@ interface Accumulator {
212
220
  }
213
221
 
214
222
  function fold(acc: Accumulator, chunk: ProviderChunk): string {
223
+ if (chunk.source) {
224
+ acc.model = chunk.source.model;
225
+ }
215
226
  if (chunk.usage) {
216
227
  acc.promptTokens = chunk.usage.inputTokens;
217
228
  acc.completionTokens = chunk.usage.outputTokens;
@@ -256,12 +267,31 @@ export abstract class ProviderAdapter implements AiProvider {
256
267
  protected readonly retryConfig: RetryConfig;
257
268
  private readonly defaults: ProviderAdapterInit["defaults"];
258
269
 
270
+ public get coreProvider(): Provider {
271
+ return this.provider;
272
+ }
273
+
259
274
  protected constructor(init: ProviderAdapterInit) {
260
275
  this.defaults = init.defaults;
261
- this.provider = init.provider;
262
276
  this.primaryModel = init.model;
263
277
  this.backupModels = init.backupModels ?? [];
264
278
  this.retryConfig = resolveRetryConfig(init.retryConfig);
279
+
280
+ if (init.fallbacks && init.fallbacks.length > 0) {
281
+ const coreProviders: Provider[] = [
282
+ init.provider,
283
+ ...init.fallbacks.map((f) => {
284
+ if (f instanceof ProviderAdapter) return f.coreProvider;
285
+ if ("coreProvider" in f && (f as { coreProvider: Provider }).coreProvider) {
286
+ return (f as { coreProvider: Provider }).coreProvider;
287
+ }
288
+ return f as Provider;
289
+ }),
290
+ ];
291
+ this.provider = withFallbackProviders(coreProviders, init.fallbackOptions);
292
+ } else {
293
+ this.provider = init.provider;
294
+ }
265
295
  }
266
296
 
267
297
  /**
@@ -12,9 +12,9 @@
12
12
  * which is thinking ON.
13
13
  */
14
14
 
15
- import { createZaiCodingProvider } from "@providerkit/core";
15
+ import { createZaiCodingProvider, type FallbackOptions, type Provider } from "@providerkit/core";
16
16
 
17
- import type { ProviderCapabilities } from "../types/ai.js";
17
+ import type { AiProvider, ProviderCapabilities } from "../types/ai.js";
18
18
  import { ProviderAdapter, type RequestConfig } from "./ProviderAdapter.js";
19
19
 
20
20
  export interface ZaiProviderOptions {
@@ -22,8 +22,11 @@ export interface ZaiProviderOptions {
22
22
  apiKey: string;
23
23
  /** Model to use. Defaults to the fleet workhorse `glm-5.3-flash`. */
24
24
  model?: string;
25
- /** Backup models to try if the primary fails (default: []) */
25
+ /** Backup models to try on this provider if the primary fails (default: []) */
26
26
  backupModels?: string[];
27
+ /** Fallback providers to try if this provider fails/exhausts */
28
+ fallbacks?: Array<AiProvider | Provider>;
29
+ fallbackOptions?: FallbackOptions<Provider>;
27
30
  /** Any endpoint speaking the Anthropic Messages dialect with the plan's
28
31
  * auth. Defaults to the coding endpoint. */
29
32
  baseUrl?: string;
@@ -61,6 +64,8 @@ export class ZaiProvider extends ProviderAdapter {
61
64
  model,
62
65
  ...(options.config ? { defaults: options.config } : {}),
63
66
  ...(options.backupModels ? { backupModels: options.backupModels } : {}),
67
+ ...(options.fallbacks ? { fallbacks: options.fallbacks } : {}),
68
+ ...(options.fallbackOptions ? { fallbackOptions: options.fallbackOptions } : {}),
64
69
  ...(options.retryConfig ? { retryConfig: options.retryConfig } : {}),
65
70
  });
66
71
  }