@falai/agent 0.9.0-alpha-2 → 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.
Files changed (75) hide show
  1. package/dist/cjs/src/core/Agent.d.ts +31 -41
  2. package/dist/cjs/src/core/Agent.d.ts.map +1 -1
  3. package/dist/cjs/src/core/Agent.js +72 -1075
  4. package/dist/cjs/src/core/Agent.js.map +1 -1
  5. package/dist/cjs/src/core/ResponseModal.d.ts +205 -0
  6. package/dist/cjs/src/core/ResponseModal.d.ts.map +1 -0
  7. package/dist/cjs/src/core/ResponseModal.js +1328 -0
  8. package/dist/cjs/src/core/ResponseModal.js.map +1 -0
  9. package/dist/cjs/src/core/ResponsePipeline.js +1 -1
  10. package/dist/cjs/src/core/ResponsePipeline.js.map +1 -1
  11. package/dist/cjs/src/index.d.ts +3 -1
  12. package/dist/cjs/src/index.d.ts.map +1 -1
  13. package/dist/cjs/src/index.js +7 -1
  14. package/dist/cjs/src/index.js.map +1 -1
  15. package/dist/cjs/src/types/agent.d.ts +1 -0
  16. package/dist/cjs/src/types/agent.d.ts.map +1 -1
  17. package/dist/cjs/src/types/ai.d.ts +1 -1
  18. package/dist/cjs/src/types/ai.d.ts.map +1 -1
  19. package/dist/cjs/src/utils/clone.d.ts.map +1 -1
  20. package/dist/cjs/src/utils/clone.js +0 -4
  21. package/dist/cjs/src/utils/clone.js.map +1 -1
  22. package/dist/cjs/src/utils/history.d.ts +30 -1
  23. package/dist/cjs/src/utils/history.d.ts.map +1 -1
  24. package/dist/cjs/src/utils/history.js +169 -23
  25. package/dist/cjs/src/utils/history.js.map +1 -1
  26. package/dist/cjs/src/utils/index.d.ts +1 -1
  27. package/dist/cjs/src/utils/index.d.ts.map +1 -1
  28. package/dist/cjs/src/utils/index.js +5 -1
  29. package/dist/cjs/src/utils/index.js.map +1 -1
  30. package/dist/src/core/Agent.d.ts +31 -41
  31. package/dist/src/core/Agent.d.ts.map +1 -1
  32. package/dist/src/core/Agent.js +73 -1076
  33. package/dist/src/core/Agent.js.map +1 -1
  34. package/dist/src/core/ResponseModal.d.ts +205 -0
  35. package/dist/src/core/ResponseModal.d.ts.map +1 -0
  36. package/dist/src/core/ResponseModal.js +1323 -0
  37. package/dist/src/core/ResponseModal.js.map +1 -0
  38. package/dist/src/core/ResponsePipeline.js +1 -1
  39. package/dist/src/core/ResponsePipeline.js.map +1 -1
  40. package/dist/src/index.d.ts +3 -1
  41. package/dist/src/index.d.ts.map +1 -1
  42. package/dist/src/index.js +2 -1
  43. package/dist/src/index.js.map +1 -1
  44. package/dist/src/types/agent.d.ts +1 -0
  45. package/dist/src/types/agent.d.ts.map +1 -1
  46. package/dist/src/types/ai.d.ts +1 -1
  47. package/dist/src/types/ai.d.ts.map +1 -1
  48. package/dist/src/utils/clone.d.ts.map +1 -1
  49. package/dist/src/utils/clone.js +0 -4
  50. package/dist/src/utils/clone.js.map +1 -1
  51. package/dist/src/utils/history.d.ts +30 -1
  52. package/dist/src/utils/history.d.ts.map +1 -1
  53. package/dist/src/utils/history.js +165 -23
  54. package/dist/src/utils/history.js.map +1 -1
  55. package/dist/src/utils/index.d.ts +1 -1
  56. package/dist/src/utils/index.d.ts.map +1 -1
  57. package/dist/src/utils/index.js +1 -1
  58. package/dist/src/utils/index.js.map +1 -1
  59. package/docs/README.md +2 -1
  60. package/docs/api/README.md +160 -0
  61. package/docs/api/overview.md +66 -1
  62. package/docs/guides/migration/README.md +72 -0
  63. package/docs/guides/migration/response-modal-refactor.md +518 -0
  64. package/examples/advanced-patterns/streaming-responses.ts +169 -96
  65. package/examples/core-concepts/modern-streaming-api.ts +309 -0
  66. package/package.json +1 -1
  67. package/src/core/Agent.ts +95 -1488
  68. package/src/core/ResponseModal.ts +1722 -0
  69. package/src/core/ResponsePipeline.ts +1 -1
  70. package/src/index.ts +11 -0
  71. package/src/types/agent.ts +1 -0
  72. package/src/types/ai.ts +1 -1
  73. package/src/utils/clone.ts +6 -8
  74. package/src/utils/history.ts +190 -27
  75. package/src/utils/index.ts +4 -0
@@ -0,0 +1,309 @@
1
+ /**
2
+ * Example: Modern Streaming API
3
+ *
4
+ * This example demonstrates the new agent.stream() method introduced in the
5
+ * ResponseModal refactor. The modern API provides automatic session management
6
+ * and a simpler interface compared to the legacy respondStream() method.
7
+ */
8
+
9
+ import {
10
+ Agent,
11
+ AnthropicProvider,
12
+ OpenAIProvider,
13
+ } from "../../src/index";
14
+
15
+ // Context type for our examples
16
+ interface UserContext {
17
+ userId: string;
18
+ preferences: {
19
+ language?: string;
20
+ verbosity: "concise" | "detailed";
21
+ };
22
+ }
23
+
24
+ async function basicModernStreaming() {
25
+ console.log("\nšŸš€ Example 1: Basic Modern Streaming API\n");
26
+
27
+ const provider = new AnthropicProvider({
28
+ apiKey: process.env.ANTHROPIC_API_KEY || "",
29
+ model: "claude-sonnet-4-5",
30
+ });
31
+
32
+ const agent = new Agent<UserContext, unknown>({
33
+ name: "ModernStreamingAgent",
34
+ description: "Demonstrates the new stream() API",
35
+ context: {
36
+ userId: "user123",
37
+ preferences: {
38
+ language: "English",
39
+ verbosity: "concise",
40
+ },
41
+ },
42
+ provider,
43
+ });
44
+
45
+ try {
46
+ console.log("šŸ“¤ Using modern stream() API...\n");
47
+ console.log("Response: ");
48
+
49
+ // NEW: Simple streaming with automatic session management
50
+ for await (const chunk of agent.stream("What is machine learning?")) {
51
+ if (chunk.delta) {
52
+ process.stdout.write(chunk.delta);
53
+ }
54
+
55
+ if (chunk.done) {
56
+ console.log("\n\nāœ… Stream complete!");
57
+ console.log(`šŸ“Š Session has ${agent.session.getHistory().length} messages`);
58
+ console.log("šŸ’” Session history was automatically managed!");
59
+ }
60
+ }
61
+ } catch (error) {
62
+ console.error("āŒ Error:", error);
63
+ }
64
+ }
65
+
66
+ async function streamingWithOptions() {
67
+ console.log("\nšŸš€ Example 2: Streaming with Options\n");
68
+
69
+ const provider = new OpenAIProvider({
70
+ apiKey: process.env.OPENAI_API_KEY || "",
71
+ model: "gpt-4",
72
+ });
73
+
74
+ const agent = new Agent<UserContext, unknown>({
75
+ name: "OptionsStreamingAgent",
76
+ description: "Demonstrates streaming with options",
77
+ context: {
78
+ userId: "user456",
79
+ preferences: {
80
+ language: "English",
81
+ verbosity: "detailed",
82
+ },
83
+ },
84
+ provider,
85
+ });
86
+
87
+ try {
88
+ console.log("šŸ“¤ Streaming with context override and abort signal...\n");
89
+ console.log("Response: ");
90
+
91
+ // Create abort controller for cancellation
92
+ const abortController = new AbortController();
93
+
94
+ // Cancel after 10 seconds
95
+ setTimeout(() => {
96
+ console.log("\nāš ļø Aborting stream...");
97
+ abortController.abort();
98
+ }, 10000);
99
+
100
+ // Stream with options
101
+ for await (const chunk of agent.stream("Explain quantum computing in detail", {
102
+ contextOverride: {
103
+ preferences: { verbosity: "concise" } // Override to be more concise
104
+ },
105
+ signal: abortController.signal
106
+ })) {
107
+ if (chunk.delta) {
108
+ process.stdout.write(chunk.delta);
109
+ }
110
+
111
+ if (chunk.done) {
112
+ console.log("\n\nāœ… Stream complete!");
113
+ console.log("šŸ’” Context was overridden for this response only");
114
+ clearTimeout();
115
+ }
116
+ }
117
+ } catch (error) {
118
+ if (error instanceof Error && error.name === "AbortError") {
119
+ console.log("\nšŸ›‘ Stream was successfully aborted!");
120
+ } else {
121
+ console.error("āŒ Error:", error);
122
+ }
123
+ }
124
+ }
125
+
126
+ async function conversationFlow() {
127
+ console.log("\nšŸš€ Example 3: Multi-turn Conversation Flow\n");
128
+
129
+ const provider = new AnthropicProvider({
130
+ apiKey: process.env.ANTHROPIC_API_KEY || "",
131
+ model: "claude-sonnet-4-5",
132
+ });
133
+
134
+ const agent = new Agent<UserContext, unknown>({
135
+ name: "ConversationAgent",
136
+ description: "Demonstrates multi-turn conversations",
137
+ context: {
138
+ userId: "user789",
139
+ preferences: {
140
+ language: "English",
141
+ verbosity: "detailed",
142
+ },
143
+ },
144
+ provider,
145
+ });
146
+
147
+ const messages = [
148
+ "What is TypeScript?",
149
+ "How is it different from JavaScript?",
150
+ "Can you give me a simple example?",
151
+ "Thank you for the explanation!"
152
+ ];
153
+
154
+ try {
155
+ console.log("šŸ“¤ Multi-turn conversation with automatic session management...\n");
156
+
157
+ for (let i = 0; i < messages.length; i++) {
158
+ console.log(`\n${"=".repeat(60)}`);
159
+ console.log(`šŸ’¬ Turn ${i + 1}: ${messages[i]}`);
160
+ console.log(`${"=".repeat(60)}`);
161
+ console.log("Response: ");
162
+
163
+ // Each stream() call automatically manages the session
164
+ for await (const chunk of agent.stream(messages[i])) {
165
+ if (chunk.delta) {
166
+ process.stdout.write(chunk.delta);
167
+ }
168
+
169
+ if (chunk.done) {
170
+ console.log(`\nšŸ“Š Session now has ${agent.session.getHistory().length} messages`);
171
+ }
172
+ }
173
+ }
174
+
175
+ console.log("\nāœ… Conversation complete!");
176
+ console.log("šŸ’” All session management was handled automatically");
177
+ console.log(`šŸ“Š Final session has ${agent.session.getHistory().length} messages`);
178
+
179
+ } catch (error) {
180
+ console.error("āŒ Error:", error);
181
+ }
182
+ }
183
+
184
+ async function migrationComparison() {
185
+ console.log("\nšŸš€ Example 4: Migration from respondStream() to stream()\n");
186
+
187
+ const provider = new AnthropicProvider({
188
+ apiKey: process.env.ANTHROPIC_API_KEY || "",
189
+ model: "claude-sonnet-4-5",
190
+ });
191
+
192
+ const agent = new Agent<UserContext, unknown>({
193
+ name: "MigrationAgent",
194
+ description: "Shows migration from old to new API",
195
+ context: {
196
+ userId: "migration-user",
197
+ preferences: {
198
+ language: "English",
199
+ verbosity: "concise",
200
+ },
201
+ },
202
+ provider,
203
+ });
204
+
205
+ const userMessage = "What are the benefits of TypeScript?";
206
+
207
+ try {
208
+ // ========================================================================
209
+ // OLD WAY: respondStream() - Manual session management
210
+ // ========================================================================
211
+ console.log("šŸ”ø OLD WAY: Using respondStream() with manual session management");
212
+ console.log("Code: agent.respondStream({ history: agent.session.getHistory() })");
213
+ console.log("Response: ");
214
+
215
+ // Manual session management required
216
+ await agent.session.addMessage("user", userMessage);
217
+
218
+ let oldResponse = "";
219
+ for await (const chunk of agent.respondStream({
220
+ history: agent.session.getHistory()
221
+ })) {
222
+ if (chunk.delta) {
223
+ process.stdout.write(chunk.delta);
224
+ oldResponse += chunk.delta;
225
+ }
226
+
227
+ if (chunk.done) {
228
+ // Manual history update required
229
+ await agent.session.addMessage("assistant", oldResponse);
230
+ console.log("\n āœ… Manual session update completed");
231
+ }
232
+ }
233
+
234
+ console.log("\n" + "=".repeat(60));
235
+
236
+ // ========================================================================
237
+ // NEW WAY: stream() - Automatic session management
238
+ // ========================================================================
239
+ console.log("šŸ”ø NEW WAY: Using stream() with automatic session management");
240
+ console.log("Code: agent.stream('message')");
241
+ console.log("Response: ");
242
+
243
+ // Automatic session management - just pass the message!
244
+ for await (const chunk of agent.stream("Can you elaborate on the type safety benefits?")) {
245
+ if (chunk.delta) {
246
+ process.stdout.write(chunk.delta);
247
+ }
248
+
249
+ if (chunk.done) {
250
+ console.log("\n āœ… Automatic session update - no manual work needed!");
251
+ }
252
+ }
253
+
254
+ console.log("\nšŸ“Š Migration Benefits:");
255
+ console.log(" āœ… Simpler API: agent.stream('message') vs complex parameters");
256
+ console.log(" āœ… Automatic session management - no manual addMessage() calls");
257
+ console.log(" āœ… Same performance and features as respondStream()");
258
+ console.log(" āœ… Backward compatibility - respondStream() still works");
259
+ console.log(" āœ… Consistent with chat() API patterns");
260
+
261
+ console.log(`\nšŸ“Š Final session has ${agent.session.getHistory().length} messages`);
262
+
263
+ } catch (error) {
264
+ console.error("āŒ Error:", error);
265
+ }
266
+ }
267
+
268
+ async function main() {
269
+ console.log("šŸš€ Modern Streaming API Examples");
270
+ console.log("=".repeat(60));
271
+
272
+ const examples = [
273
+ { name: "Basic Modern Streaming", fn: basicModernStreaming },
274
+ { name: "Streaming with Options", fn: streamingWithOptions },
275
+ { name: "Multi-turn Conversation", fn: conversationFlow },
276
+ { name: "Migration Comparison", fn: migrationComparison },
277
+ ];
278
+
279
+ console.log("\nAvailable Examples:");
280
+ examples.forEach((ex, i) => {
281
+ console.log(` ${i + 1}. ${ex.name}`);
282
+ });
283
+
284
+ console.log("\nšŸ’” Key Benefits of Modern stream() API:");
285
+ console.log(" - Simple interface: agent.stream('message')");
286
+ console.log(" - Automatic session management");
287
+ console.log(" - No manual history updates needed");
288
+ console.log(" - Same performance as respondStream()");
289
+ console.log(" - Full backward compatibility maintained");
290
+
291
+ console.log("\n" + "=".repeat(60));
292
+
293
+ // Run examples if API key is available
294
+ if (process.env.ANTHROPIC_API_KEY || process.env.OPENAI_API_KEY) {
295
+ await basicModernStreaming();
296
+ await migrationComparison();
297
+ } else {
298
+ console.log(
299
+ "\nāš ļø Set ANTHROPIC_API_KEY or OPENAI_API_KEY to run examples."
300
+ );
301
+ }
302
+ }
303
+
304
+ // Run if executed directly
305
+ if (import.meta.url === `file://${process.argv[1]}`) {
306
+ main().catch(console.error);
307
+ }
308
+
309
+ export { main };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@falai/agent",
3
- "version": "0.9.0-alpha-2",
3
+ "version": "0.9.0",
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",