@falai/agent 0.3.10 → 0.3.12
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 +192 -16
- package/dist/adapters/PrismaAdapter.d.ts +115 -0
- package/dist/adapters/PrismaAdapter.d.ts.map +1 -0
- package/dist/adapters/PrismaAdapter.js +331 -0
- package/dist/adapters/PrismaAdapter.js.map +1 -0
- package/dist/adapters/index.d.ts +6 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +5 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/cjs/adapters/PrismaAdapter.d.ts +115 -0
- package/dist/cjs/adapters/PrismaAdapter.d.ts.map +1 -0
- package/dist/cjs/adapters/PrismaAdapter.js +335 -0
- package/dist/cjs/adapters/PrismaAdapter.js.map +1 -0
- package/dist/cjs/adapters/index.d.ts +6 -0
- package/dist/cjs/adapters/index.d.ts.map +1 -0
- package/dist/cjs/adapters/index.js +9 -0
- package/dist/cjs/adapters/index.js.map +1 -0
- package/dist/cjs/core/Agent.d.ts +35 -0
- package/dist/cjs/core/Agent.d.ts.map +1 -1
- package/dist/cjs/core/Agent.js +153 -0
- package/dist/cjs/core/Agent.js.map +1 -1
- package/dist/cjs/core/PersistenceManager.d.ts +77 -0
- package/dist/cjs/core/PersistenceManager.d.ts.map +1 -0
- package/dist/cjs/core/PersistenceManager.js +153 -0
- package/dist/cjs/core/PersistenceManager.js.map +1 -0
- package/dist/cjs/index.d.ts +6 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +8 -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/agent.d.ts +3 -0
- package/dist/cjs/types/agent.d.ts.map +1 -1
- package/dist/cjs/types/agent.js.map +1 -1
- package/dist/cjs/types/ai.d.ts +28 -0
- package/dist/cjs/types/ai.d.ts.map +1 -1
- package/dist/cjs/types/index.d.ts +1 -0
- package/dist/cjs/types/index.d.ts.map +1 -1
- package/dist/cjs/types/persistence.d.ts +194 -0
- package/dist/cjs/types/persistence.d.ts.map +1 -0
- package/dist/cjs/types/persistence.js +7 -0
- package/dist/cjs/types/persistence.js.map +1 -0
- package/dist/core/Agent.d.ts +35 -0
- package/dist/core/Agent.d.ts.map +1 -1
- package/dist/core/Agent.js +153 -0
- package/dist/core/Agent.js.map +1 -1
- package/dist/core/PersistenceManager.d.ts +77 -0
- package/dist/core/PersistenceManager.d.ts.map +1 -0
- package/dist/core/PersistenceManager.js +149 -0
- package/dist/core/PersistenceManager.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -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/agent.d.ts +3 -0
- package/dist/types/agent.d.ts.map +1 -1
- package/dist/types/agent.js.map +1 -1
- package/dist/types/ai.d.ts +28 -0
- package/dist/types/ai.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/persistence.d.ts +194 -0
- package/dist/types/persistence.d.ts.map +1 -0
- package/dist/types/persistence.js +6 -0
- package/dist/types/persistence.js.map +1 -0
- package/docs/API_REFERENCE.md +260 -2
- package/docs/PERSISTENCE.md +419 -0
- 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/prisma-persistence.ts +313 -0
- package/examples/prisma-schema.example.prisma +74 -0
- package/examples/rules-prohibitions.ts +4 -4
- package/examples/streaming-agent.ts +371 -0
- package/examples/travel-agent.ts +7 -4
- package/package.json +10 -1
- package/src/adapters/PrismaAdapter.ts +510 -0
- package/src/adapters/index.ts +10 -0
- package/src/core/Agent.ts +205 -0
- package/src/core/PersistenceManager.ts +222 -0
- package/src/index.ts +23 -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/agent.ts +3 -0
- package/src/types/ai.ts +32 -0
- package/src/types/index.ts +14 -0
- package/src/types/persistence.ts +234 -0
|
@@ -0,0 +1,371 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Example: Streaming Responses
|
|
3
|
+
*
|
|
4
|
+
* This example demonstrates how to use the respondStream method
|
|
5
|
+
* to stream AI responses in real-time for better user experience
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import {
|
|
9
|
+
Agent,
|
|
10
|
+
createMessageEvent,
|
|
11
|
+
EventSource,
|
|
12
|
+
AnthropicProvider,
|
|
13
|
+
OpenAIProvider,
|
|
14
|
+
GeminiProvider,
|
|
15
|
+
} from "../src/index";
|
|
16
|
+
|
|
17
|
+
// Custom context type
|
|
18
|
+
interface ConversationContext {
|
|
19
|
+
userId: string;
|
|
20
|
+
sessionId: string;
|
|
21
|
+
preferences: {
|
|
22
|
+
streamingEnabled: boolean;
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
async function streamingWithAnthropic() {
|
|
27
|
+
console.log("\n🤖 Example 1: Streaming with Anthropic (Claude)\n");
|
|
28
|
+
|
|
29
|
+
// Initialize Anthropic provider
|
|
30
|
+
const provider = new AnthropicProvider({
|
|
31
|
+
apiKey: process.env.ANTHROPIC_API_KEY || "",
|
|
32
|
+
model: "claude-sonnet-4-5",
|
|
33
|
+
config: {
|
|
34
|
+
temperature: 0.7,
|
|
35
|
+
max_tokens: 1000,
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
// Create agent
|
|
40
|
+
const agent = new Agent<ConversationContext>({
|
|
41
|
+
name: "StreamingAssistant",
|
|
42
|
+
description: "An AI assistant that streams responses in real-time",
|
|
43
|
+
goal: "Provide helpful information with streaming responses",
|
|
44
|
+
context: {
|
|
45
|
+
userId: "user123",
|
|
46
|
+
sessionId: "session456",
|
|
47
|
+
preferences: {
|
|
48
|
+
streamingEnabled: true,
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
ai: provider,
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
// Add guidelines
|
|
55
|
+
agent.createGuideline({
|
|
56
|
+
action: "Be concise but informative in your responses",
|
|
57
|
+
enabled: true,
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
// Create conversation history
|
|
61
|
+
const history = [
|
|
62
|
+
createMessageEvent(
|
|
63
|
+
EventSource.CUSTOMER,
|
|
64
|
+
"User",
|
|
65
|
+
"Explain quantum computing in simple terms."
|
|
66
|
+
),
|
|
67
|
+
];
|
|
68
|
+
|
|
69
|
+
try {
|
|
70
|
+
console.log("📤 Streaming response from Claude...\n");
|
|
71
|
+
console.log("Response: ");
|
|
72
|
+
|
|
73
|
+
// Use respondStream for real-time streaming
|
|
74
|
+
let fullMessage = "";
|
|
75
|
+
for await (const chunk of agent.respondStream({ history })) {
|
|
76
|
+
// chunk.delta contains the new text
|
|
77
|
+
// chunk.accumulated contains the full text so far
|
|
78
|
+
// chunk.done indicates if this is the final chunk
|
|
79
|
+
|
|
80
|
+
if (chunk.delta) {
|
|
81
|
+
process.stdout.write(chunk.delta);
|
|
82
|
+
fullMessage += chunk.delta;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
if (chunk.done) {
|
|
86
|
+
console.log("\n\n✅ Stream complete!");
|
|
87
|
+
console.log(`\n📊 Metadata:`);
|
|
88
|
+
console.log(` - Route: ${chunk.route?.title || "None"}`);
|
|
89
|
+
console.log(` - State: ${chunk.state?.description || "None"}`);
|
|
90
|
+
console.log(` - Tool Calls: ${chunk.toolCalls?.length || 0}`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
} catch (error) {
|
|
94
|
+
console.error("❌ Error:", error);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
async function streamingWithOpenAI() {
|
|
99
|
+
console.log("\n🤖 Example 2: Streaming with OpenAI\n");
|
|
100
|
+
|
|
101
|
+
const provider = new OpenAIProvider({
|
|
102
|
+
apiKey: process.env.OPENAI_API_KEY || "",
|
|
103
|
+
model: "gpt-5",
|
|
104
|
+
config: {
|
|
105
|
+
temperature: 0.8,
|
|
106
|
+
},
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
const agent = new Agent<ConversationContext>({
|
|
110
|
+
name: "CreativeAssistant",
|
|
111
|
+
description: "A creative AI assistant",
|
|
112
|
+
context: {
|
|
113
|
+
userId: "user123",
|
|
114
|
+
sessionId: "session789",
|
|
115
|
+
preferences: {
|
|
116
|
+
streamingEnabled: true,
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
ai: provider,
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
const history = [
|
|
123
|
+
createMessageEvent(
|
|
124
|
+
EventSource.CUSTOMER,
|
|
125
|
+
"User",
|
|
126
|
+
"Write a short poem about TypeScript"
|
|
127
|
+
),
|
|
128
|
+
];
|
|
129
|
+
|
|
130
|
+
try {
|
|
131
|
+
console.log("📤 Streaming response from OpenAI...\n");
|
|
132
|
+
console.log("Response: ");
|
|
133
|
+
|
|
134
|
+
for await (const chunk of agent.respondStream({ history })) {
|
|
135
|
+
if (chunk.delta) {
|
|
136
|
+
process.stdout.write(chunk.delta);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
if (chunk.done) {
|
|
140
|
+
console.log("\n\n✅ Stream complete!");
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
} catch (error) {
|
|
144
|
+
console.error("❌ Error:", error);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
async function streamingWithGemini() {
|
|
149
|
+
console.log("\n🤖 Example 3: Streaming with Google Gemini\n");
|
|
150
|
+
|
|
151
|
+
const provider = new GeminiProvider({
|
|
152
|
+
apiKey: process.env.GEMINI_API_KEY || "",
|
|
153
|
+
model: "models/gemini-2.0-flash-exp",
|
|
154
|
+
config: {
|
|
155
|
+
temperature: 0.7,
|
|
156
|
+
},
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
const agent = new Agent<ConversationContext>({
|
|
160
|
+
name: "AnalyticalAssistant",
|
|
161
|
+
description: "An analytical AI assistant",
|
|
162
|
+
context: {
|
|
163
|
+
userId: "user123",
|
|
164
|
+
sessionId: "session101",
|
|
165
|
+
preferences: {
|
|
166
|
+
streamingEnabled: true,
|
|
167
|
+
},
|
|
168
|
+
},
|
|
169
|
+
ai: provider,
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
const history = [
|
|
173
|
+
createMessageEvent(
|
|
174
|
+
EventSource.CUSTOMER,
|
|
175
|
+
"User",
|
|
176
|
+
"What are the key differences between REST and GraphQL?"
|
|
177
|
+
),
|
|
178
|
+
];
|
|
179
|
+
|
|
180
|
+
try {
|
|
181
|
+
console.log("📤 Streaming response from Gemini...\n");
|
|
182
|
+
console.log("Response: ");
|
|
183
|
+
|
|
184
|
+
for await (const chunk of agent.respondStream({ history })) {
|
|
185
|
+
if (chunk.delta) {
|
|
186
|
+
process.stdout.write(chunk.delta);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
if (chunk.done) {
|
|
190
|
+
console.log("\n\n✅ Stream complete!");
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
} catch (error) {
|
|
194
|
+
console.error("❌ Error:", error);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
async function streamingWithRoutes() {
|
|
199
|
+
console.log("\n🤖 Example 4: Streaming with Routes and States\n");
|
|
200
|
+
|
|
201
|
+
const provider = new AnthropicProvider({
|
|
202
|
+
apiKey: process.env.ANTHROPIC_API_KEY || "",
|
|
203
|
+
model: "claude-sonnet-4-5",
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
const agent = new Agent<ConversationContext>({
|
|
207
|
+
name: "SupportAgent",
|
|
208
|
+
description: "A customer support agent with conversation routes",
|
|
209
|
+
context: {
|
|
210
|
+
userId: "user123",
|
|
211
|
+
sessionId: "session202",
|
|
212
|
+
preferences: {
|
|
213
|
+
streamingEnabled: true,
|
|
214
|
+
},
|
|
215
|
+
},
|
|
216
|
+
ai: provider,
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
// Create a route
|
|
220
|
+
const supportRoute = agent.createRoute({
|
|
221
|
+
title: "Product Support",
|
|
222
|
+
description: "Help users with product questions",
|
|
223
|
+
conditions: ["User asks about product features or issues"],
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
supportRoute.initialState.transitionTo({
|
|
227
|
+
chatState: "Understand the user's product question",
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
const history = [
|
|
231
|
+
createMessageEvent(
|
|
232
|
+
EventSource.CUSTOMER,
|
|
233
|
+
"User",
|
|
234
|
+
"How do I reset my password?"
|
|
235
|
+
),
|
|
236
|
+
];
|
|
237
|
+
|
|
238
|
+
try {
|
|
239
|
+
console.log("📤 Streaming response with route detection...\n");
|
|
240
|
+
console.log("Response: ");
|
|
241
|
+
|
|
242
|
+
for await (const chunk of agent.respondStream({ history })) {
|
|
243
|
+
if (chunk.delta) {
|
|
244
|
+
process.stdout.write(chunk.delta);
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
if (chunk.done) {
|
|
248
|
+
console.log("\n\n✅ Stream complete!");
|
|
249
|
+
if (chunk.route) {
|
|
250
|
+
console.log(`\n🗺️ Route detected: ${chunk.route.title}`);
|
|
251
|
+
}
|
|
252
|
+
if (chunk.state) {
|
|
253
|
+
console.log(`📍 State: ${chunk.state.description}`);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
} catch (error) {
|
|
258
|
+
console.error("❌ Error:", error);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
async function streamingWithAbortSignal() {
|
|
263
|
+
console.log("\n🤖 Example 5: Streaming with Abort Control\n");
|
|
264
|
+
|
|
265
|
+
const provider = new AnthropicProvider({
|
|
266
|
+
apiKey: process.env.ANTHROPIC_API_KEY || "",
|
|
267
|
+
model: "claude-sonnet-4-5",
|
|
268
|
+
});
|
|
269
|
+
|
|
270
|
+
const agent = new Agent<ConversationContext>({
|
|
271
|
+
name: "Assistant",
|
|
272
|
+
description: "An assistant that can be interrupted",
|
|
273
|
+
context: {
|
|
274
|
+
userId: "user123",
|
|
275
|
+
sessionId: "session303",
|
|
276
|
+
preferences: {
|
|
277
|
+
streamingEnabled: true,
|
|
278
|
+
},
|
|
279
|
+
},
|
|
280
|
+
ai: provider,
|
|
281
|
+
});
|
|
282
|
+
|
|
283
|
+
const history = [
|
|
284
|
+
createMessageEvent(
|
|
285
|
+
EventSource.CUSTOMER,
|
|
286
|
+
"User",
|
|
287
|
+
"Tell me a very long story about space exploration."
|
|
288
|
+
),
|
|
289
|
+
];
|
|
290
|
+
|
|
291
|
+
// Create an AbortController to cancel the stream
|
|
292
|
+
const abortController = new AbortController();
|
|
293
|
+
|
|
294
|
+
// Automatically abort after 3 seconds
|
|
295
|
+
const timeout = setTimeout(() => {
|
|
296
|
+
console.log("\n\n⚠️ Aborting stream after 3 seconds...");
|
|
297
|
+
abortController.abort();
|
|
298
|
+
}, 3000);
|
|
299
|
+
|
|
300
|
+
try {
|
|
301
|
+
console.log("📤 Streaming response (will abort after 3s)...\n");
|
|
302
|
+
console.log("Response: ");
|
|
303
|
+
|
|
304
|
+
for await (const chunk of agent.respondStream({
|
|
305
|
+
history,
|
|
306
|
+
signal: abortController.signal,
|
|
307
|
+
})) {
|
|
308
|
+
if (chunk.delta) {
|
|
309
|
+
process.stdout.write(chunk.delta);
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
if (chunk.done) {
|
|
313
|
+
console.log("\n\n✅ Stream complete!");
|
|
314
|
+
clearTimeout(timeout);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
} catch (error) {
|
|
318
|
+
if (error instanceof Error && error.name === "AbortError") {
|
|
319
|
+
console.log("\n\n🛑 Stream was aborted successfully!");
|
|
320
|
+
} else {
|
|
321
|
+
console.error("❌ Error:", error);
|
|
322
|
+
}
|
|
323
|
+
clearTimeout(timeout);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
async function main() {
|
|
328
|
+
console.log("🚀 Starting Streaming Examples\n");
|
|
329
|
+
console.log("=".repeat(60));
|
|
330
|
+
|
|
331
|
+
const examples = [
|
|
332
|
+
{ name: "Anthropic Streaming", fn: streamingWithAnthropic },
|
|
333
|
+
{ name: "OpenAI Streaming", fn: streamingWithOpenAI },
|
|
334
|
+
{ name: "Gemini Streaming", fn: streamingWithGemini },
|
|
335
|
+
{ name: "Streaming with Routes", fn: streamingWithRoutes },
|
|
336
|
+
{ name: "Streaming with Abort", fn: streamingWithAbortSignal },
|
|
337
|
+
];
|
|
338
|
+
|
|
339
|
+
console.log("\nAvailable Examples:");
|
|
340
|
+
examples.forEach((ex, i) => {
|
|
341
|
+
console.log(` ${i + 1}. ${ex.name}`);
|
|
342
|
+
});
|
|
343
|
+
|
|
344
|
+
console.log("\n💡 Tips:");
|
|
345
|
+
console.log(" - Set ANTHROPIC_API_KEY, OPENAI_API_KEY, or GEMINI_API_KEY");
|
|
346
|
+
console.log(" - Streaming provides real-time responses for better UX");
|
|
347
|
+
console.log(" - Use AbortSignal to cancel long-running streams");
|
|
348
|
+
console.log(" - Access chunk.route and chunk.state for flow information");
|
|
349
|
+
|
|
350
|
+
console.log("\n" + "=".repeat(60));
|
|
351
|
+
|
|
352
|
+
// Run first example if API key is available
|
|
353
|
+
if (process.env.ANTHROPIC_API_KEY) {
|
|
354
|
+
await streamingWithAnthropic();
|
|
355
|
+
} else if (process.env.OPENAI_API_KEY) {
|
|
356
|
+
await streamingWithOpenAI();
|
|
357
|
+
} else if (process.env.GEMINI_API_KEY) {
|
|
358
|
+
await streamingWithGemini();
|
|
359
|
+
} else {
|
|
360
|
+
console.log(
|
|
361
|
+
"\n⚠️ No API keys found. Set one of the environment variables to run examples."
|
|
362
|
+
);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
// Run if executed directly
|
|
367
|
+
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
368
|
+
main().catch(console.error);
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
export { main };
|
package/examples/travel-agent.ts
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
import {
|
|
7
7
|
Agent,
|
|
8
8
|
defineTool,
|
|
9
|
-
|
|
9
|
+
OpenRouterProvider,
|
|
10
10
|
END_ROUTE,
|
|
11
11
|
EventSource,
|
|
12
12
|
createMessageEvent,
|
|
@@ -113,9 +113,12 @@ const getBookingStatus = defineTool<
|
|
|
113
113
|
|
|
114
114
|
// Initialize agent
|
|
115
115
|
async function createTravelAgent() {
|
|
116
|
-
const provider = new
|
|
117
|
-
apiKey: process.env.
|
|
118
|
-
model: "
|
|
116
|
+
const provider = new OpenRouterProvider({
|
|
117
|
+
apiKey: process.env.OPENROUTER_API_KEY || "test-key",
|
|
118
|
+
model: "google/gemini-2.0-flash-exp",
|
|
119
|
+
backupModels: ["anthropic/claude-sonnet-4-5", "openai/gpt-5"],
|
|
120
|
+
siteUrl: "https://github.com/gusnips/falai",
|
|
121
|
+
siteName: "Falai Travel Agent Example",
|
|
119
122
|
retryConfig: {
|
|
120
123
|
timeout: 60000,
|
|
121
124
|
retries: 3,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@falai/agent",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.12",
|
|
4
4
|
"description": "Standalone, strongly-typed AI Agent framework with route DSL and AI provider strategy",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/cjs/index.js",
|
|
@@ -77,7 +77,16 @@
|
|
|
77
77
|
"typescript-eslint": "^8.18.2"
|
|
78
78
|
},
|
|
79
79
|
"dependencies": {
|
|
80
|
+
"@anthropic-ai/sdk": "^0.65.0",
|
|
80
81
|
"@google/genai": "^0.3.0",
|
|
81
82
|
"openai": "^6.3.0"
|
|
83
|
+
},
|
|
84
|
+
"peerDependencies": {
|
|
85
|
+
"@prisma/client": "^5.0.0 || ^6.0.0"
|
|
86
|
+
},
|
|
87
|
+
"peerDependenciesMeta": {
|
|
88
|
+
"@prisma/client": {
|
|
89
|
+
"optional": true
|
|
90
|
+
}
|
|
82
91
|
}
|
|
83
92
|
}
|