@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.
- package/README.md +100 -16
- package/dist/cjs/core/Agent.d.ts +25 -0
- package/dist/cjs/core/Agent.d.ts.map +1 -1
- package/dist/cjs/core/Agent.js +130 -0
- package/dist/cjs/core/Agent.js.map +1 -1
- package/dist/cjs/index.d.ts +2 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +3 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/providers/AnthropicProvider.d.ts +43 -0
- package/dist/cjs/providers/AnthropicProvider.d.ts.map +1 -0
- package/dist/cjs/providers/AnthropicProvider.js +328 -0
- package/dist/cjs/providers/AnthropicProvider.js.map +1 -0
- package/dist/cjs/providers/GeminiProvider.d.ts +4 -1
- package/dist/cjs/providers/GeminiProvider.d.ts.map +1 -1
- package/dist/cjs/providers/GeminiProvider.js +96 -0
- package/dist/cjs/providers/GeminiProvider.js.map +1 -1
- package/dist/cjs/providers/OpenAIProvider.d.ts +4 -1
- package/dist/cjs/providers/OpenAIProvider.d.ts.map +1 -1
- package/dist/cjs/providers/OpenAIProvider.js +115 -0
- package/dist/cjs/providers/OpenAIProvider.js.map +1 -1
- package/dist/cjs/providers/OpenRouterProvider.d.ts +4 -1
- package/dist/cjs/providers/OpenRouterProvider.d.ts.map +1 -1
- package/dist/cjs/providers/OpenRouterProvider.js +115 -0
- package/dist/cjs/providers/OpenRouterProvider.js.map +1 -1
- package/dist/cjs/providers/index.d.ts +13 -0
- package/dist/cjs/providers/index.d.ts.map +1 -0
- package/dist/cjs/providers/index.js +16 -0
- package/dist/cjs/providers/index.js.map +1 -0
- package/dist/cjs/types/ai.d.ts +28 -0
- package/dist/cjs/types/ai.d.ts.map +1 -1
- package/dist/core/Agent.d.ts +25 -0
- package/dist/core/Agent.d.ts.map +1 -1
- package/dist/core/Agent.js +130 -0
- package/dist/core/Agent.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/providers/AnthropicProvider.d.ts +43 -0
- package/dist/providers/AnthropicProvider.d.ts.map +1 -0
- package/dist/providers/AnthropicProvider.js +321 -0
- package/dist/providers/AnthropicProvider.js.map +1 -0
- package/dist/providers/GeminiProvider.d.ts +4 -1
- package/dist/providers/GeminiProvider.d.ts.map +1 -1
- package/dist/providers/GeminiProvider.js +96 -0
- package/dist/providers/GeminiProvider.js.map +1 -1
- package/dist/providers/OpenAIProvider.d.ts +4 -1
- package/dist/providers/OpenAIProvider.d.ts.map +1 -1
- package/dist/providers/OpenAIProvider.js +115 -0
- package/dist/providers/OpenAIProvider.js.map +1 -1
- package/dist/providers/OpenRouterProvider.d.ts +4 -1
- package/dist/providers/OpenRouterProvider.d.ts.map +1 -1
- package/dist/providers/OpenRouterProvider.js +115 -0
- package/dist/providers/OpenRouterProvider.js.map +1 -1
- package/dist/providers/index.d.ts +13 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +9 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/types/ai.d.ts +28 -0
- package/dist/types/ai.d.ts.map +1 -1
- package/docs/API_REFERENCE.md +260 -2
- package/docs/PROVIDERS.md +139 -2
- package/examples/business-onboarding.ts +5 -4
- package/examples/declarative-agent.ts +1 -1
- package/examples/domain-scoping.ts +5 -4
- package/examples/healthcare-agent.ts +4 -4
- package/examples/openai-agent.ts +6 -4
- package/examples/rules-prohibitions.ts +4 -4
- package/examples/streaming-agent.ts +371 -0
- package/examples/travel-agent.ts +7 -4
- package/package.json +2 -1
- package/src/core/Agent.ts +174 -0
- package/src/index.ts +2 -0
- package/src/providers/AnthropicProvider.ts +467 -0
- package/src/providers/GeminiProvider.ts +135 -0
- package/src/providers/OpenAIProvider.ts +157 -0
- package/src/providers/OpenRouterProvider.ts +157 -0
- package/src/providers/index.ts +16 -0
- package/src/types/ai.ts +32 -0
package/docs/API_REFERENCE.md
CHANGED
|
@@ -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 {
|
|
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
|
-
//
|
|
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
|
|
366
|
-
apiKey: process.env.
|
|
367
|
-
model: "
|
|
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,
|
|
@@ -6,12 +6,13 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import { Agent, createMessageEvent, EventSource } from "../src/index";
|
|
9
|
-
import {
|
|
9
|
+
import { OpenRouterProvider } from "../src/providers";
|
|
10
10
|
|
|
11
11
|
// Initialize AI provider
|
|
12
|
-
const ai = new
|
|
13
|
-
apiKey: process.env.
|
|
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
|
-
|
|
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
|
|
67
|
-
apiKey: process.env.
|
|
68
|
-
model: "
|
|
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>({
|
package/examples/openai-agent.ts
CHANGED
|
@@ -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
|
-
|
|
113
|
-
|
|
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 {
|
|
9
|
+
import { AnthropicProvider } from "../src/providers";
|
|
10
10
|
|
|
11
11
|
// Initialize AI provider
|
|
12
|
-
const ai = new
|
|
13
|
-
apiKey: process.env.
|
|
14
|
-
model: "
|
|
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
|