@falai/agent 0.3.10 → 0.3.11

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 (80) hide show
  1. package/README.md +100 -16
  2. package/dist/cjs/core/Agent.d.ts +25 -0
  3. package/dist/cjs/core/Agent.d.ts.map +1 -1
  4. package/dist/cjs/core/Agent.js +130 -0
  5. package/dist/cjs/core/Agent.js.map +1 -1
  6. package/dist/cjs/index.d.ts +2 -0
  7. package/dist/cjs/index.d.ts.map +1 -1
  8. package/dist/cjs/index.js +3 -1
  9. package/dist/cjs/index.js.map +1 -1
  10. package/dist/cjs/providers/AnthropicProvider.d.ts +43 -0
  11. package/dist/cjs/providers/AnthropicProvider.d.ts.map +1 -0
  12. package/dist/cjs/providers/AnthropicProvider.js +328 -0
  13. package/dist/cjs/providers/AnthropicProvider.js.map +1 -0
  14. package/dist/cjs/providers/GeminiProvider.d.ts +4 -1
  15. package/dist/cjs/providers/GeminiProvider.d.ts.map +1 -1
  16. package/dist/cjs/providers/GeminiProvider.js +96 -0
  17. package/dist/cjs/providers/GeminiProvider.js.map +1 -1
  18. package/dist/cjs/providers/OpenAIProvider.d.ts +4 -1
  19. package/dist/cjs/providers/OpenAIProvider.d.ts.map +1 -1
  20. package/dist/cjs/providers/OpenAIProvider.js +115 -0
  21. package/dist/cjs/providers/OpenAIProvider.js.map +1 -1
  22. package/dist/cjs/providers/OpenRouterProvider.d.ts +4 -1
  23. package/dist/cjs/providers/OpenRouterProvider.d.ts.map +1 -1
  24. package/dist/cjs/providers/OpenRouterProvider.js +115 -0
  25. package/dist/cjs/providers/OpenRouterProvider.js.map +1 -1
  26. package/dist/cjs/providers/index.d.ts +13 -0
  27. package/dist/cjs/providers/index.d.ts.map +1 -0
  28. package/dist/cjs/providers/index.js +16 -0
  29. package/dist/cjs/providers/index.js.map +1 -0
  30. package/dist/cjs/types/ai.d.ts +28 -0
  31. package/dist/cjs/types/ai.d.ts.map +1 -1
  32. package/dist/core/Agent.d.ts +25 -0
  33. package/dist/core/Agent.d.ts.map +1 -1
  34. package/dist/core/Agent.js +130 -0
  35. package/dist/core/Agent.js.map +1 -1
  36. package/dist/index.d.ts +2 -0
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +1 -0
  39. package/dist/index.js.map +1 -1
  40. package/dist/providers/AnthropicProvider.d.ts +43 -0
  41. package/dist/providers/AnthropicProvider.d.ts.map +1 -0
  42. package/dist/providers/AnthropicProvider.js +321 -0
  43. package/dist/providers/AnthropicProvider.js.map +1 -0
  44. package/dist/providers/GeminiProvider.d.ts +4 -1
  45. package/dist/providers/GeminiProvider.d.ts.map +1 -1
  46. package/dist/providers/GeminiProvider.js +96 -0
  47. package/dist/providers/GeminiProvider.js.map +1 -1
  48. package/dist/providers/OpenAIProvider.d.ts +4 -1
  49. package/dist/providers/OpenAIProvider.d.ts.map +1 -1
  50. package/dist/providers/OpenAIProvider.js +115 -0
  51. package/dist/providers/OpenAIProvider.js.map +1 -1
  52. package/dist/providers/OpenRouterProvider.d.ts +4 -1
  53. package/dist/providers/OpenRouterProvider.d.ts.map +1 -1
  54. package/dist/providers/OpenRouterProvider.js +115 -0
  55. package/dist/providers/OpenRouterProvider.js.map +1 -1
  56. package/dist/providers/index.d.ts +13 -0
  57. package/dist/providers/index.d.ts.map +1 -0
  58. package/dist/providers/index.js +9 -0
  59. package/dist/providers/index.js.map +1 -0
  60. package/dist/types/ai.d.ts +28 -0
  61. package/dist/types/ai.d.ts.map +1 -1
  62. package/docs/API_REFERENCE.md +260 -2
  63. package/docs/PROVIDERS.md +139 -2
  64. package/examples/business-onboarding.ts +5 -4
  65. package/examples/declarative-agent.ts +1 -1
  66. package/examples/domain-scoping.ts +5 -4
  67. package/examples/healthcare-agent.ts +4 -4
  68. package/examples/openai-agent.ts +6 -4
  69. package/examples/rules-prohibitions.ts +4 -4
  70. package/examples/streaming-agent.ts +371 -0
  71. package/examples/travel-agent.ts +7 -4
  72. package/package.json +2 -1
  73. package/src/core/Agent.ts +174 -0
  74. package/src/index.ts +2 -0
  75. package/src/providers/AnthropicProvider.ts +467 -0
  76. package/src/providers/GeminiProvider.ts +135 -0
  77. package/src/providers/OpenAIProvider.ts +157 -0
  78. package/src/providers/OpenRouterProvider.ts +157 -0
  79. package/src/providers/index.ts +16 -0
  80. package/src/types/ai.ts +32 -0
@@ -109,6 +109,107 @@ if (response.route?.title === END_ROUTE) {
109
109
  }
110
110
  ```
111
111
 
112
+ ##### `respondStream(input: RespondInput<TContext>): AsyncGenerator<StreamChunk>`
113
+
114
+ Generates an AI response as a real-time stream for better user experience. Provides the same structured output as `respond()` but delivers it incrementally.
115
+
116
+ ```typescript
117
+ interface StreamChunk {
118
+ /** The incremental text delta */
119
+ delta: string;
120
+ /** Full accumulated text so far */
121
+ accumulated: string;
122
+ /** Whether this is the final chunk */
123
+ done: boolean;
124
+ /** Route chosen by the agent (only in final chunk) */
125
+ route?: { id: string; title: string };
126
+ /** Current state within the route (only in final chunk) */
127
+ state?: { id: string; description?: string };
128
+ /** Tool calls requested by the agent (only in final chunk) */
129
+ toolCalls?: Array<{
130
+ toolName: string;
131
+ arguments: Record<string, unknown>;
132
+ }>;
133
+ }
134
+ ```
135
+
136
+ **Key Features:**
137
+
138
+ - 🌊 Real-time streaming for better perceived performance
139
+ - 📊 Access to route, state, and tool information in final chunk
140
+ - 🛑 Cancellable with AbortSignal
141
+ - ✅ Supported by all providers (Anthropic, OpenAI, Gemini, OpenRouter)
142
+
143
+ **Example:**
144
+
145
+ ```typescript
146
+ // Basic streaming
147
+ for await (const chunk of agent.respondStream({ history })) {
148
+ if (chunk.delta) {
149
+ // Display incremental text to user
150
+ process.stdout.write(chunk.delta);
151
+ }
152
+
153
+ if (chunk.done) {
154
+ console.log("\n✅ Complete!");
155
+ // Access final metadata
156
+ if (chunk.route) {
157
+ console.log("Route:", chunk.route.title);
158
+ }
159
+ if (chunk.toolCalls) {
160
+ console.log("Tool calls:", chunk.toolCalls.length);
161
+ }
162
+ }
163
+ }
164
+ ```
165
+
166
+ **With Cancellation:**
167
+
168
+ ```typescript
169
+ const abortController = new AbortController();
170
+
171
+ // Cancel after 5 seconds
172
+ setTimeout(() => abortController.abort(), 5000);
173
+
174
+ try {
175
+ for await (const chunk of agent.respondStream({
176
+ history,
177
+ signal: abortController.signal,
178
+ })) {
179
+ console.log(chunk.delta);
180
+ }
181
+ } catch (error) {
182
+ if (error.name === "AbortError") {
183
+ console.log("Stream cancelled");
184
+ }
185
+ }
186
+ ```
187
+
188
+ **Collecting Full Response:**
189
+
190
+ ```typescript
191
+ let fullMessage = "";
192
+ let finalChunk;
193
+
194
+ for await (const chunk of agent.respondStream({ history })) {
195
+ fullMessage += chunk.delta;
196
+ if (chunk.done) {
197
+ finalChunk = chunk;
198
+ }
199
+ }
200
+
201
+ // Save to database
202
+ await db.agentMessages.create({
203
+ sessionId: session.id,
204
+ role: "agent",
205
+ content: fullMessage,
206
+ route: finalChunk.route?.title,
207
+ toolCalls: finalChunk.toolCalls || [],
208
+ });
209
+ ```
210
+
211
+ **See Also:** [streaming-agent.ts](../examples/streaming-agent.ts) for comprehensive examples.
212
+
112
213
  #### Properties
113
214
 
114
215
  ##### `name: string`
@@ -366,11 +467,15 @@ Returns filtered domains by names. If `allowedNames` is `undefined`, returns all
366
467
  const registry = new DomainRegistry();
367
468
 
368
469
  registry.register("payment", {
369
- processPayment: async (amount: number) => { /* ... */ },
470
+ processPayment: async (amount: number) => {
471
+ /* ... */
472
+ },
370
473
  });
371
474
 
372
475
  registry.register("shipping", {
373
- calculateShipping: (zipCode: string) => { /* ... */ },
476
+ calculateShipping: (zipCode: string) => {
477
+ /* ... */
478
+ },
374
479
  });
375
480
 
376
481
  // Get specific domains
@@ -386,6 +491,61 @@ Returns list of all registered domain names.
386
491
 
387
492
  ---
388
493
 
494
+ ### `AnthropicProvider`
495
+
496
+ AI provider implementation for Anthropic (Claude models).
497
+
498
+ #### Constructor
499
+
500
+ ```typescript
501
+ new AnthropicProvider(options: AnthropicProviderOptions)
502
+
503
+ interface AnthropicProviderOptions {
504
+ apiKey: string;
505
+ model: string; // Required: e.g., "claude-sonnet-4-5"
506
+ backupModels?: string[]; // Fallback models
507
+ config?: Partial<Omit<MessageCreateParamsNonStreaming, "model" | "messages" | "max_tokens">>;
508
+ retryConfig?: {
509
+ timeout?: number; // Default: 60000ms
510
+ retries?: number; // Default: 3
511
+ };
512
+ }
513
+ ```
514
+
515
+ **Note:** `model` is required for AnthropicProvider. Available models include:
516
+
517
+ - `claude-sonnet-4-5` - Latest Claude Sonnet 4.5 (most capable)
518
+ - `claude-opus-4-1` - Claude Opus 4.1 (powerful for complex tasks)
519
+ - `claude-sonnet-4-0` - Claude Sonnet 4.0 (stable, production-ready)
520
+
521
+ #### Methods
522
+
523
+ ##### `generateMessage<TContext>(input: GenerateMessageInput<TContext>): Promise<GenerateMessageOutput>`
524
+
525
+ Generates a message with retry logic and backup models using Anthropic's API.
526
+
527
+ **Example:**
528
+
529
+ ```typescript
530
+ import { AnthropicProvider } from "@falai/agent";
531
+
532
+ const provider = new AnthropicProvider({
533
+ apiKey: process.env.ANTHROPIC_API_KEY!,
534
+ model: "claude-sonnet-4-5",
535
+ backupModels: ["claude-opus-4-1", "claude-sonnet-4-0"],
536
+ config: {
537
+ temperature: 0.7,
538
+ top_p: 0.9,
539
+ },
540
+ retryConfig: {
541
+ timeout: 60000,
542
+ retries: 3,
543
+ },
544
+ });
545
+ ```
546
+
547
+ ---
548
+
389
549
  ### `GeminiProvider`
390
550
 
391
551
  AI provider implementation for Google Gemini.
@@ -414,6 +574,104 @@ Generates a message with retry logic and backup models.
414
574
 
415
575
  ---
416
576
 
577
+ ### `OpenAIProvider`
578
+
579
+ AI provider implementation for OpenAI (GPT models).
580
+
581
+ #### Constructor
582
+
583
+ ```typescript
584
+ new OpenAIProvider(options: OpenAIProviderOptions)
585
+
586
+ interface OpenAIProviderOptions {
587
+ apiKey: string;
588
+ model: string; // Required: e.g., "gpt-4o", "gpt-5"
589
+ backupModels?: string[]; // Fallback models
590
+ retryConfig?: {
591
+ timeout?: number; // Default: 60000ms
592
+ retries?: number; // Default: 3
593
+ };
594
+ }
595
+ ```
596
+
597
+ **Note:** Unlike GeminiProvider, `model` is required for OpenAIProvider. Choose from available OpenAI models like "gpt-4o", "gpt-5", "gpt-4-turbo", etc.
598
+
599
+ #### Methods
600
+
601
+ ##### `generateMessage<TContext>(input: GenerateMessageInput<TContext>): Promise<GenerateMessageOutput>`
602
+
603
+ Generates a message with retry logic and backup models using OpenAI's API.
604
+
605
+ **Example:**
606
+
607
+ ```typescript
608
+ import { OpenAIProvider } from "@falai/agent";
609
+
610
+ const provider = new OpenAIProvider({
611
+ apiKey: process.env.OPENAI_API_KEY!,
612
+ model: "gpt-5",
613
+ backupModels: ["gpt-4o", "gpt-4-turbo"],
614
+ retryConfig: {
615
+ timeout: 60000,
616
+ retries: 3,
617
+ },
618
+ });
619
+ ```
620
+
621
+ ---
622
+
623
+ ### `OpenRouterProvider`
624
+
625
+ AI provider implementation for OpenRouter (access to 200+ models).
626
+
627
+ #### Constructor
628
+
629
+ ```typescript
630
+ new OpenRouterProvider(options: OpenRouterProviderOptions)
631
+
632
+ interface OpenRouterProviderOptions {
633
+ apiKey: string;
634
+ model: string; // Required: e.g., "openai/gpt-5", "anthropic/claude-sonnet-4-5"
635
+ backupModels?: string[]; // Fallback models
636
+ siteUrl?: string; // Optional: your app URL for OpenRouter rankings
637
+ siteName?: string; // Optional: your app name for OpenRouter rankings
638
+ retryConfig?: {
639
+ timeout?: number; // Default: 60000ms
640
+ retries?: number; // Default: 3
641
+ };
642
+ }
643
+ ```
644
+
645
+ **Note:** OpenRouter provides access to models from multiple providers. Model names follow the format `provider/model-name` (e.g., "openai/gpt-5", "anthropic/claude-sonnet-4-5", "google/gemini-pro").
646
+
647
+ #### Methods
648
+
649
+ ##### `generateMessage<TContext>(input: GenerateMessageInput<TContext>): Promise<GenerateMessageOutput>`
650
+
651
+ Generates a message with retry logic and backup models using OpenRouter's API.
652
+
653
+ **Example:**
654
+
655
+ ```typescript
656
+ import { OpenRouterProvider } from "@falai/agent";
657
+
658
+ const provider = new OpenRouterProvider({
659
+ apiKey: process.env.OPENROUTER_API_KEY!,
660
+ model: "openai/gpt-5",
661
+ backupModels: ["anthropic/claude-sonnet-4-5", "google/gemini-pro"],
662
+ siteUrl: "https://yourapp.com",
663
+ siteName: "Your App Name",
664
+ retryConfig: {
665
+ timeout: 60000,
666
+ retries: 3,
667
+ },
668
+ });
669
+ ```
670
+
671
+ **See Also:** [Providers Guide](./PROVIDERS.md) for detailed provider comparison and configuration examples.
672
+
673
+ ---
674
+
417
675
  ### `PromptBuilder`
418
676
 
419
677
  Constructs prompts for AI generation.
package/docs/PROVIDERS.md CHANGED
@@ -10,11 +10,111 @@ This guide covers the available AI providers and how to configure them for optim
10
10
  - ✅ Configure provider-specific settings
11
11
  - ✅ Use backup models for failover
12
12
  - ✅ Customize retry logic and timeouts
13
+ - ⚡ **Stream responses in real-time** (all providers)
14
+
15
+ ## Streaming Support
16
+
17
+ **All providers support real-time streaming** via the `respondStream()` method on the Agent class.
18
+
19
+ Streaming provides:
20
+
21
+ - 🌊 Real-time text generation for better UX
22
+ - 📊 Incremental delivery with `delta` and `accumulated` properties
23
+ - 🛑 Cancellable streams using AbortSignal
24
+ - ✅ Full compatibility with routes, states, and tool calls
25
+
26
+ **Example:**
27
+
28
+ ```typescript
29
+ for await (const chunk of agent.respondStream({ history })) {
30
+ process.stdout.write(chunk.delta); // Print incremental text
31
+
32
+ if (chunk.done) {
33
+ // Access final metadata
34
+ console.log("Route:", chunk.route?.title);
35
+ console.log("Tool calls:", chunk.toolCalls?.length);
36
+ }
37
+ }
38
+ ```
39
+
40
+ See [streaming-agent.ts](../examples/streaming-agent.ts) for comprehensive examples with all providers.
13
41
 
14
42
  ---
15
43
 
16
44
  ## Available Providers
17
45
 
46
+ ### 🤖 Anthropic (Claude)
47
+
48
+ **Package:** `@anthropic-ai/sdk`
49
+
50
+ #### Overview
51
+
52
+ Anthropic's Claude models are known for their exceptional reasoning, analysis, and long context windows. Claude 3.5 Sonnet offers:
53
+
54
+ - State-of-the-art reasoning and analysis
55
+ - 200K context window
56
+ - Excellent at following complex instructions
57
+ - Strong coding and writing capabilities
58
+
59
+ #### Installation
60
+
61
+ ```bash
62
+ bun add @anthropic-ai/sdk
63
+ # or
64
+ npm install @anthropic-ai/sdk
65
+ ```
66
+
67
+ #### Basic Usage
68
+
69
+ ```typescript
70
+ import { AnthropicProvider } from "@falai/agent";
71
+
72
+ const provider = new AnthropicProvider({
73
+ apiKey: process.env.ANTHROPIC_API_KEY!,
74
+ model: "claude-sonnet-4-5", // Latest Claude 4.5 Sonnet
75
+ });
76
+ ```
77
+
78
+ #### Configuration Options
79
+
80
+ All models are specified by the user - see [Anthropic Models](https://docs.anthropic.com/en/docs/models-overview) for available options.
81
+
82
+ ```typescript
83
+ const provider = new AnthropicProvider({
84
+ // Required
85
+ apiKey: string;
86
+ model: string; // e.g., "claude-sonnet-4-5", "claude-opus-4-1", etc.
87
+
88
+ // Optional
89
+ backupModels?: string[]; // Default: []
90
+ config?: Partial<Omit<MessageCreateParamsNonStreaming, "model" | "messages" | "max_tokens">>; // Uses @anthropic-ai/sdk types
91
+ retryConfig?: {
92
+ timeout?: number; // Default: 60000ms (60s)
93
+ retries?: number; // Default: 3
94
+ };
95
+ });
96
+ ```
97
+
98
+ #### Example: Advanced Configuration
99
+
100
+ ```typescript
101
+ const provider = new AnthropicProvider({
102
+ apiKey: process.env.ANTHROPIC_API_KEY!,
103
+ model: "claude-sonnet-4-5",
104
+ backupModels: ["claude-opus-4-1", "claude-sonnet-4-0"],
105
+ config: {
106
+ temperature: 0.7,
107
+ top_p: 0.9,
108
+ },
109
+ retryConfig: {
110
+ timeout: 45000,
111
+ retries: 2,
112
+ },
113
+ });
114
+ ```
115
+
116
+ ---
117
+
18
118
  ### 🌐 OpenRouter (Multi-Model Access)
19
119
 
20
120
  **Package:** `openai` (OpenRouter uses OpenAI-compatible API)
@@ -274,7 +374,22 @@ const provider = new OpenAIProvider({
274
374
  You can easily switch between providers:
275
375
 
276
376
  ```typescript
277
- import { Agent, GeminiProvider, OpenAIProvider } from "@falai/agent";
377
+ import {
378
+ Agent,
379
+ AnthropicProvider,
380
+ GeminiProvider,
381
+ OpenAIProvider,
382
+ OpenRouterProvider,
383
+ } from "@falai/agent";
384
+
385
+ // Use Anthropic (Claude)
386
+ const claudeAgent = new Agent({
387
+ name: "Claude Assistant",
388
+ ai: new AnthropicProvider({
389
+ apiKey: process.env.ANTHROPIC_API_KEY!,
390
+ model: "claude-sonnet-4-5",
391
+ }),
392
+ });
278
393
 
279
394
  // Use Gemini
280
395
  const geminiAgent = new Agent({
@@ -290,10 +405,20 @@ const openaiAgent = new Agent({
290
405
  name: "OpenAI Assistant",
291
406
  ai: new OpenAIProvider({
292
407
  apiKey: process.env.OPENAI_API_KEY!,
408
+ model: "gpt-5",
293
409
  }),
294
410
  });
295
411
 
296
- // Both agents have the same interface!
412
+ // Use OpenRouter (access to 200+ models)
413
+ const openrouterAgent = new Agent({
414
+ name: "OpenRouter Assistant",
415
+ ai: new OpenRouterProvider({
416
+ apiKey: process.env.OPENROUTER_API_KEY!,
417
+ model: "anthropic/claude-sonnet-4-5",
418
+ }),
419
+ });
420
+
421
+ // All agents have the same interface!
297
422
  ```
298
423
 
299
424
  ---
@@ -304,8 +429,10 @@ It's recommended to store API keys in environment variables:
304
429
 
305
430
  ```bash
306
431
  # .env
432
+ ANTHROPIC_API_KEY=your-anthropic-api-key-here
307
433
  GEMINI_API_KEY=your-gemini-api-key-here
308
434
  OPENAI_API_KEY=your-openai-api-key-here
435
+ OPENROUTER_API_KEY=your-openrouter-api-key-here
309
436
  ```
310
437
 
311
438
  Then load them:
@@ -314,6 +441,11 @@ Then load them:
314
441
  import { config } from "dotenv";
315
442
  config();
316
443
 
444
+ const anthropicProvider = new AnthropicProvider({
445
+ apiKey: process.env.ANTHROPIC_API_KEY!,
446
+ model: "claude-sonnet-4-5",
447
+ });
448
+
317
449
  const geminiProvider = new GeminiProvider({
318
450
  apiKey: process.env.GEMINI_API_KEY!,
319
451
  model: "models/gemini-2.5-flash",
@@ -323,6 +455,11 @@ const openaiProvider = new OpenAIProvider({
323
455
  apiKey: process.env.OPENAI_API_KEY!,
324
456
  model: "gpt-5",
325
457
  });
458
+
459
+ const openrouterProvider = new OpenRouterProvider({
460
+ apiKey: process.env.OPENROUTER_API_KEY!,
461
+ model: "anthropic/claude-sonnet-4-5",
462
+ });
326
463
  ```
327
464
 
328
465
  ---
@@ -13,10 +13,10 @@
13
13
  import {
14
14
  Agent,
15
15
  defineTool,
16
- GeminiProvider,
17
16
  END_ROUTE,
18
17
  EventSource,
19
18
  createMessageEvent,
19
+ OpenAIProvider,
20
20
  type ToolContext,
21
21
  } from "../src/index";
22
22
 
@@ -362,9 +362,10 @@ async function createBusinessOnboardingAgent(
362
362
  sessionId: string,
363
363
  initialData: OnboardingData = { routes: [] }
364
364
  ): Promise<Agent<OnboardingContext>> {
365
- const provider = new GeminiProvider({
366
- apiKey: process.env.GEMINI_API_KEY || "test-key",
367
- model: "models/gemini-2.0-flash-exp",
365
+ const provider = new OpenAIProvider({
366
+ apiKey: process.env.OPENAI_API_KEY || "test-key",
367
+ model: "gpt-5",
368
+ backupModels: ["gpt-5-mini"],
368
369
  retryConfig: {
369
370
  timeout: 60000,
370
371
  retries: 3,
@@ -13,10 +13,10 @@
13
13
 
14
14
  import {
15
15
  Agent,
16
- GeminiProvider,
17
16
  defineTool,
18
17
  createMessageEvent,
19
18
  EventSource,
19
+ GeminiProvider,
20
20
  type Term,
21
21
  type Guideline,
22
22
  type Capability,
@@ -6,12 +6,13 @@
6
6
  */
7
7
 
8
8
  import { Agent, createMessageEvent, EventSource } from "../src/index";
9
- import { GeminiProvider } from "../src/providers/GeminiProvider";
9
+ import { OpenRouterProvider } from "../src/providers";
10
10
 
11
11
  // Initialize AI provider
12
- const ai = new GeminiProvider({
13
- apiKey: process.env.GEMINI_API_KEY || "your-api-key-here",
14
- model: "gemini-2.0-flash-exp",
12
+ const ai = new OpenRouterProvider({
13
+ apiKey: process.env.OPENROUTER_API_KEY || "your-api-key-here",
14
+ model: "google/gemini-2.0-flash-exp",
15
+ backupModels: ["anthropic/claude-sonnet-4-5"],
15
16
  });
16
17
 
17
18
  // Create agent
@@ -5,7 +5,7 @@
5
5
  import {
6
6
  Agent,
7
7
  defineTool,
8
- GeminiProvider,
8
+ AnthropicProvider,
9
9
  END_ROUTE,
10
10
  EventSource,
11
11
  createMessageEvent,
@@ -63,9 +63,9 @@ const getLabResults = defineTool<HealthcareContext, [], object>(
63
63
  );
64
64
 
65
65
  async function createHealthcareAgent() {
66
- const provider = new GeminiProvider({
67
- apiKey: process.env.GEMINI_API_KEY || "test-key",
68
- model: "models/gemini-2.5-flash",
66
+ const provider = new AnthropicProvider({
67
+ apiKey: process.env.ANTHROPIC_API_KEY || "test-key",
68
+ model: "claude-sonnet-4-5",
69
69
  });
70
70
 
71
71
  const agent = new Agent<HealthcareContext>({
@@ -108,10 +108,12 @@ async function main() {
108
108
  chatState: "Ask which city they want weather for",
109
109
  });
110
110
 
111
- const fetchWeather = askLocation.transitionTo({
112
- toolState: getWeather,
113
- condition: "User provides a city name",
114
- });
111
+ const fetchWeather = askLocation.transitionTo(
112
+ {
113
+ toolState: getWeather,
114
+ },
115
+ "User provides a city name"
116
+ );
115
117
 
116
118
  const showWeather = fetchWeather.transitionTo({
117
119
  chatState:
@@ -6,12 +6,12 @@
6
6
  */
7
7
 
8
8
  import { Agent, createMessageEvent, EventSource } from "../src/index";
9
- import { GeminiProvider } from "../src/providers/GeminiProvider";
9
+ import { AnthropicProvider } from "../src/providers";
10
10
 
11
11
  // Initialize AI provider
12
- const ai = new GeminiProvider({
13
- apiKey: process.env.GEMINI_API_KEY || "your-api-key-here",
14
- model: "gemini-2.0-flash-exp",
12
+ const ai = new AnthropicProvider({
13
+ apiKey: process.env.ANTHROPIC_API_KEY || "your-api-key-here",
14
+ model: "claude-sonnet-4-5",
15
15
  });
16
16
 
17
17
  // Create WhatsApp support bot with different styles per route