@falai/agent 0.9.0-alpha-1 → 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 (217) hide show
  1. package/README.md +34 -22
  2. package/dist/cjs/src/core/Agent.d.ts +77 -59
  3. package/dist/cjs/src/core/Agent.d.ts.map +1 -1
  4. package/dist/cjs/src/core/Agent.js +284 -1060
  5. package/dist/cjs/src/core/Agent.js.map +1 -1
  6. package/dist/cjs/src/core/PersistenceManager.d.ts.map +1 -1
  7. package/dist/cjs/src/core/PersistenceManager.js +48 -25
  8. package/dist/cjs/src/core/PersistenceManager.js.map +1 -1
  9. package/dist/cjs/src/core/PromptComposer.d.ts +1 -1
  10. package/dist/cjs/src/core/PromptComposer.d.ts.map +1 -1
  11. package/dist/cjs/src/core/PromptComposer.js.map +1 -1
  12. package/dist/cjs/src/core/ResponseEngine.d.ts +13 -12
  13. package/dist/cjs/src/core/ResponseEngine.d.ts.map +1 -1
  14. package/dist/cjs/src/core/ResponseEngine.js +4 -4
  15. package/dist/cjs/src/core/ResponseEngine.js.map +1 -1
  16. package/dist/cjs/src/core/ResponseModal.d.ts +205 -0
  17. package/dist/cjs/src/core/ResponseModal.d.ts.map +1 -0
  18. package/dist/cjs/src/core/ResponseModal.js +1328 -0
  19. package/dist/cjs/src/core/ResponseModal.js.map +1 -0
  20. package/dist/cjs/src/core/ResponsePipeline.d.ts +66 -38
  21. package/dist/cjs/src/core/ResponsePipeline.d.ts.map +1 -1
  22. package/dist/cjs/src/core/ResponsePipeline.js +72 -4
  23. package/dist/cjs/src/core/ResponsePipeline.js.map +1 -1
  24. package/dist/cjs/src/core/Route.d.ts +24 -5
  25. package/dist/cjs/src/core/Route.d.ts.map +1 -1
  26. package/dist/cjs/src/core/Route.js +45 -1
  27. package/dist/cjs/src/core/Route.js.map +1 -1
  28. package/dist/cjs/src/core/RoutingEngine.d.ts +31 -6
  29. package/dist/cjs/src/core/RoutingEngine.d.ts.map +1 -1
  30. package/dist/cjs/src/core/RoutingEngine.js +113 -9
  31. package/dist/cjs/src/core/RoutingEngine.js.map +1 -1
  32. package/dist/cjs/src/core/SessionManager.d.ts +14 -4
  33. package/dist/cjs/src/core/SessionManager.d.ts.map +1 -1
  34. package/dist/cjs/src/core/SessionManager.js +25 -5
  35. package/dist/cjs/src/core/SessionManager.js.map +1 -1
  36. package/dist/cjs/src/core/Step.d.ts +10 -10
  37. package/dist/cjs/src/core/Step.d.ts.map +1 -1
  38. package/dist/cjs/src/core/Step.js.map +1 -1
  39. package/dist/cjs/src/core/ToolExecutor.d.ts +4 -2
  40. package/dist/cjs/src/core/ToolExecutor.d.ts.map +1 -1
  41. package/dist/cjs/src/core/ToolExecutor.js +13 -3
  42. package/dist/cjs/src/core/ToolExecutor.js.map +1 -1
  43. package/dist/cjs/src/index.d.ts +3 -1
  44. package/dist/cjs/src/index.d.ts.map +1 -1
  45. package/dist/cjs/src/index.js +7 -1
  46. package/dist/cjs/src/index.js.map +1 -1
  47. package/dist/cjs/src/types/agent.d.ts +42 -21
  48. package/dist/cjs/src/types/agent.d.ts.map +1 -1
  49. package/dist/cjs/src/types/agent.js.map +1 -1
  50. package/dist/cjs/src/types/ai.d.ts +1 -1
  51. package/dist/cjs/src/types/ai.d.ts.map +1 -1
  52. package/dist/cjs/src/types/index.d.ts +1 -1
  53. package/dist/cjs/src/types/index.d.ts.map +1 -1
  54. package/dist/cjs/src/types/index.js.map +1 -1
  55. package/dist/cjs/src/types/persistence.d.ts +0 -1
  56. package/dist/cjs/src/types/persistence.d.ts.map +1 -1
  57. package/dist/cjs/src/types/route.d.ts +22 -16
  58. package/dist/cjs/src/types/route.d.ts.map +1 -1
  59. package/dist/cjs/src/types/session.d.ts +6 -11
  60. package/dist/cjs/src/types/session.d.ts.map +1 -1
  61. package/dist/cjs/src/types/tool.d.ts +12 -6
  62. package/dist/cjs/src/types/tool.d.ts.map +1 -1
  63. package/dist/cjs/src/utils/clone.d.ts.map +1 -1
  64. package/dist/cjs/src/utils/clone.js +0 -4
  65. package/dist/cjs/src/utils/clone.js.map +1 -1
  66. package/dist/cjs/src/utils/history.d.ts +30 -1
  67. package/dist/cjs/src/utils/history.d.ts.map +1 -1
  68. package/dist/cjs/src/utils/history.js +169 -23
  69. package/dist/cjs/src/utils/history.js.map +1 -1
  70. package/dist/cjs/src/utils/index.d.ts +1 -1
  71. package/dist/cjs/src/utils/index.d.ts.map +1 -1
  72. package/dist/cjs/src/utils/index.js +5 -1
  73. package/dist/cjs/src/utils/index.js.map +1 -1
  74. package/dist/cjs/src/utils/session.d.ts +2 -2
  75. package/dist/cjs/src/utils/session.d.ts.map +1 -1
  76. package/dist/cjs/src/utils/session.js +6 -26
  77. package/dist/cjs/src/utils/session.js.map +1 -1
  78. package/dist/src/core/Agent.d.ts +77 -59
  79. package/dist/src/core/Agent.d.ts.map +1 -1
  80. package/dist/src/core/Agent.js +285 -1061
  81. package/dist/src/core/Agent.js.map +1 -1
  82. package/dist/src/core/PersistenceManager.d.ts.map +1 -1
  83. package/dist/src/core/PersistenceManager.js +48 -25
  84. package/dist/src/core/PersistenceManager.js.map +1 -1
  85. package/dist/src/core/PromptComposer.d.ts +1 -1
  86. package/dist/src/core/PromptComposer.d.ts.map +1 -1
  87. package/dist/src/core/PromptComposer.js.map +1 -1
  88. package/dist/src/core/ResponseEngine.d.ts +13 -12
  89. package/dist/src/core/ResponseEngine.d.ts.map +1 -1
  90. package/dist/src/core/ResponseEngine.js +4 -4
  91. package/dist/src/core/ResponseEngine.js.map +1 -1
  92. package/dist/src/core/ResponseModal.d.ts +205 -0
  93. package/dist/src/core/ResponseModal.d.ts.map +1 -0
  94. package/dist/src/core/ResponseModal.js +1323 -0
  95. package/dist/src/core/ResponseModal.js.map +1 -0
  96. package/dist/src/core/ResponsePipeline.d.ts +66 -38
  97. package/dist/src/core/ResponsePipeline.d.ts.map +1 -1
  98. package/dist/src/core/ResponsePipeline.js +72 -4
  99. package/dist/src/core/ResponsePipeline.js.map +1 -1
  100. package/dist/src/core/Route.d.ts +24 -5
  101. package/dist/src/core/Route.d.ts.map +1 -1
  102. package/dist/src/core/Route.js +45 -1
  103. package/dist/src/core/Route.js.map +1 -1
  104. package/dist/src/core/RoutingEngine.d.ts +31 -6
  105. package/dist/src/core/RoutingEngine.d.ts.map +1 -1
  106. package/dist/src/core/RoutingEngine.js +113 -9
  107. package/dist/src/core/RoutingEngine.js.map +1 -1
  108. package/dist/src/core/SessionManager.d.ts +14 -4
  109. package/dist/src/core/SessionManager.d.ts.map +1 -1
  110. package/dist/src/core/SessionManager.js +25 -5
  111. package/dist/src/core/SessionManager.js.map +1 -1
  112. package/dist/src/core/Step.d.ts +10 -10
  113. package/dist/src/core/Step.d.ts.map +1 -1
  114. package/dist/src/core/Step.js.map +1 -1
  115. package/dist/src/core/ToolExecutor.d.ts +4 -2
  116. package/dist/src/core/ToolExecutor.d.ts.map +1 -1
  117. package/dist/src/core/ToolExecutor.js +13 -3
  118. package/dist/src/core/ToolExecutor.js.map +1 -1
  119. package/dist/src/index.d.ts +3 -1
  120. package/dist/src/index.d.ts.map +1 -1
  121. package/dist/src/index.js +2 -1
  122. package/dist/src/index.js.map +1 -1
  123. package/dist/src/types/agent.d.ts +42 -21
  124. package/dist/src/types/agent.d.ts.map +1 -1
  125. package/dist/src/types/agent.js.map +1 -1
  126. package/dist/src/types/ai.d.ts +1 -1
  127. package/dist/src/types/ai.d.ts.map +1 -1
  128. package/dist/src/types/index.d.ts +1 -1
  129. package/dist/src/types/index.d.ts.map +1 -1
  130. package/dist/src/types/index.js.map +1 -1
  131. package/dist/src/types/persistence.d.ts +0 -1
  132. package/dist/src/types/persistence.d.ts.map +1 -1
  133. package/dist/src/types/route.d.ts +22 -16
  134. package/dist/src/types/route.d.ts.map +1 -1
  135. package/dist/src/types/session.d.ts +6 -11
  136. package/dist/src/types/session.d.ts.map +1 -1
  137. package/dist/src/types/tool.d.ts +12 -6
  138. package/dist/src/types/tool.d.ts.map +1 -1
  139. package/dist/src/utils/clone.d.ts.map +1 -1
  140. package/dist/src/utils/clone.js +0 -4
  141. package/dist/src/utils/clone.js.map +1 -1
  142. package/dist/src/utils/history.d.ts +30 -1
  143. package/dist/src/utils/history.d.ts.map +1 -1
  144. package/dist/src/utils/history.js +165 -23
  145. package/dist/src/utils/history.js.map +1 -1
  146. package/dist/src/utils/index.d.ts +1 -1
  147. package/dist/src/utils/index.d.ts.map +1 -1
  148. package/dist/src/utils/index.js +1 -1
  149. package/dist/src/utils/index.js.map +1 -1
  150. package/dist/src/utils/session.d.ts +2 -2
  151. package/dist/src/utils/session.d.ts.map +1 -1
  152. package/dist/src/utils/session.js +6 -26
  153. package/dist/src/utils/session.js.map +1 -1
  154. package/docs/README.md +5 -4
  155. package/docs/api/README.md +195 -4
  156. package/docs/api/overview.md +232 -13
  157. package/docs/core/agent/README.md +162 -17
  158. package/docs/core/agent/context-management.md +39 -15
  159. package/docs/core/agent/session-management.md +49 -16
  160. package/docs/core/ai-integration/prompt-composition.md +38 -14
  161. package/docs/core/ai-integration/response-processing.md +28 -17
  162. package/docs/core/conversation-flows/data-collection.md +103 -25
  163. package/docs/core/conversation-flows/route-dsl.md +45 -22
  164. package/docs/core/conversation-flows/routes.md +74 -18
  165. package/docs/core/conversation-flows/step-transitions.md +3 -3
  166. package/docs/core/conversation-flows/steps.md +39 -15
  167. package/docs/core/routing/intelligent-routing.md +18 -9
  168. package/docs/core/tools/tool-definition.md +8 -8
  169. package/docs/core/tools/tool-execution.md +26 -26
  170. package/docs/core/tools/tool-scoping.md +5 -5
  171. package/docs/guides/getting-started/README.md +54 -32
  172. package/docs/guides/migration/README.md +72 -0
  173. package/docs/guides/migration/response-modal-refactor.md +518 -0
  174. package/examples/advanced-patterns/knowledge-based-agent.ts +37 -28
  175. package/examples/advanced-patterns/persistent-onboarding.ts +70 -41
  176. package/examples/advanced-patterns/route-lifecycle-hooks.ts +28 -2
  177. package/examples/advanced-patterns/streaming-responses.ts +197 -119
  178. package/examples/ai-providers/anthropic-integration.ts +40 -33
  179. package/examples/ai-providers/openai-integration.ts +25 -25
  180. package/examples/conversation-flows/completion-transitions.ts +36 -32
  181. package/examples/core-concepts/basic-agent.ts +76 -78
  182. package/examples/core-concepts/modern-streaming-api.ts +309 -0
  183. package/examples/core-concepts/schema-driven-extraction.ts +20 -16
  184. package/examples/core-concepts/session-management.ts +65 -53
  185. package/examples/integrations/database-integration.ts +49 -34
  186. package/examples/integrations/healthcare-integration.ts +96 -91
  187. package/examples/integrations/search-integration.ts +79 -82
  188. package/examples/integrations/server-session-management.ts +25 -17
  189. package/examples/persistence/database-persistence.ts +61 -45
  190. package/examples/persistence/memory-sessions.ts +52 -63
  191. package/examples/persistence/redis-persistence.ts +81 -95
  192. package/examples/tools/basic-tools.ts +73 -62
  193. package/examples/tools/data-enrichment-tools.ts +52 -44
  194. package/package.json +1 -1
  195. package/src/core/Agent.ts +396 -1499
  196. package/src/core/PersistenceManager.ts +51 -27
  197. package/src/core/PromptComposer.ts +1 -1
  198. package/src/core/ResponseEngine.ts +21 -19
  199. package/src/core/ResponseModal.ts +1722 -0
  200. package/src/core/ResponsePipeline.ts +175 -60
  201. package/src/core/Route.ts +58 -6
  202. package/src/core/RoutingEngine.ts +174 -27
  203. package/src/core/SessionManager.ts +32 -8
  204. package/src/core/Step.ts +20 -12
  205. package/src/core/ToolExecutor.ts +19 -5
  206. package/src/index.ts +11 -0
  207. package/src/types/agent.ts +47 -23
  208. package/src/types/ai.ts +1 -1
  209. package/src/types/index.ts +2 -0
  210. package/src/types/persistence.ts +0 -1
  211. package/src/types/route.ts +22 -16
  212. package/src/types/session.ts +6 -12
  213. package/src/types/tool.ts +15 -9
  214. package/src/utils/clone.ts +6 -8
  215. package/src/utils/history.ts +190 -27
  216. package/src/utils/index.ts +4 -0
  217. package/src/utils/session.ts +6 -31
@@ -1,9 +1,12 @@
1
1
  /**
2
2
  * Example: Streaming Responses
3
- * Updated for v2 architecture with session step management
3
+ * Updated for ResponseModal architecture with modern streaming APIs
4
4
  *
5
- * This example demonstrates how to use the respondStream method
6
- * to stream AI responses in real-time for better user experience
5
+ * This example demonstrates both the new modern stream() API and the legacy
6
+ * respondStream() method for streaming AI responses in real-time.
7
+ *
8
+ * NEW: The modern stream() API provides automatic session management and
9
+ * a simpler interface similar to chat() but with streaming.
7
10
  */
8
11
 
9
12
  import {
@@ -22,8 +25,8 @@ interface ConversationContext {
22
25
  };
23
26
  }
24
27
 
25
- async function streamingWithAnthropic() {
26
- console.log("\n🤖 Example 1: Streaming with Anthropic (Claude)\n");
28
+ async function modernStreamingWithAnthropic() {
29
+ console.log("\n🤖 Example 1: Modern Streaming API with Anthropic (Claude)\n");
27
30
 
28
31
  // Initialize Anthropic provider
29
32
  const provider = new AnthropicProvider({
@@ -36,7 +39,7 @@ async function streamingWithAnthropic() {
36
39
  });
37
40
 
38
41
  // Create agent
39
- const agent = new Agent<ConversationContext>({
42
+ const agent = new Agent<ConversationContext, unknown>({
40
43
  name: "StreamingAssistant",
41
44
  description: "An AI assistant that streams responses in real-time",
42
45
  goal: "Provide helpful information with streaming responses",
@@ -56,34 +59,91 @@ async function streamingWithAnthropic() {
56
59
  enabled: true,
57
60
  });
58
61
 
59
- // Create conversation history
60
- const history = [
61
- {
62
- role: "user" as const,
63
- content: "Explain quantum computing in simple terms.",
64
- name: "User",
62
+ try {
63
+ console.log("📤 Modern streaming API - automatic session management...\n");
64
+ console.log("Response: ");
65
+
66
+ // Session is automatically managed by the agent
67
+ console.log("✨ Session ready:", agent.session.id);
68
+
69
+ // NEW: Modern stream() API - automatically manages session history
70
+ for await (const chunk of agent.stream("Explain quantum computing in simple terms.")) {
71
+ // chunk.delta contains the new text
72
+ // chunk.accumulated contains the full text so far
73
+ // chunk.done indicates if this is the final chunk
74
+
75
+ if (chunk.delta) {
76
+ process.stdout.write(chunk.delta);
77
+ }
78
+
79
+ if (chunk.done) {
80
+ console.log("\n\n✅ Stream complete!");
81
+ console.log(`\n📊 Metadata:`);
82
+ console.log(
83
+ ` - Route: ${chunk.session?.currentRoute?.title || "None"}`
84
+ );
85
+ console.log(` - Data:`, agent.session.getData() || "None");
86
+ console.log(` - Tool Calls: ${chunk.toolCalls?.length || 0}`);
87
+
88
+ // Session history is automatically updated - no manual management needed!
89
+ console.log(` - Session Messages: ${agent.session.getHistory().length}`);
90
+ }
91
+ }
92
+
93
+ console.log("\n💡 Benefits of modern stream() API:");
94
+ console.log(" - Automatic session management");
95
+ console.log(" - Simple interface: agent.stream('message')");
96
+ console.log(" - No need to manually manage history");
97
+ console.log(" - Same performance as respondStream()");
98
+
99
+ } catch (error) {
100
+ console.error("❌ Error:", error);
101
+ }
102
+ }
103
+
104
+ async function legacyStreamingWithAnthropic() {
105
+ console.log("\n🤖 Example 2: Legacy Streaming API (respondStream) - Still Supported\n");
106
+
107
+ // Initialize Anthropic provider
108
+ const provider = new AnthropicProvider({
109
+ apiKey: process.env.ANTHROPIC_API_KEY || "",
110
+ model: "claude-sonnet-4-5",
111
+ config: {
112
+ temperature: 0.7,
113
+ max_tokens: 1000,
65
114
  },
66
- ];
115
+ });
116
+
117
+ // Create agent
118
+ const agent = new Agent<ConversationContext, unknown>({
119
+ name: "LegacyStreamingAssistant",
120
+ description: "An AI assistant using legacy streaming API",
121
+ goal: "Demonstrate backward compatibility",
122
+ context: {
123
+ userId: "user123",
124
+ sessionId: "session456-legacy",
125
+ preferences: {
126
+ streamingEnabled: true,
127
+ },
128
+ },
129
+ provider: provider,
130
+ });
67
131
 
68
132
  try {
69
- console.log("📤 Streaming response from Claude...\n");
133
+ console.log("📤 Legacy respondStream API - manual session management...\n");
70
134
  console.log("Response: ");
71
135
 
72
136
  // Session is automatically managed by the agent
73
137
  console.log("✨ Session ready:", agent.session.id);
74
138
 
75
- // Add user message to session history
139
+ // Add user message to session history manually
76
140
  await agent.session.addMessage("user", "What's the weather like today?");
77
141
 
78
- // Use respondStream for real-time streaming with session history
142
+ // Legacy respondStream API - requires manual session management
79
143
  let fullMessage = "";
80
144
  for await (const chunk of agent.respondStream({
81
145
  history: agent.session.getHistory()
82
146
  })) {
83
- // chunk.delta contains the new text
84
- // chunk.accumulated contains the full text so far
85
- // chunk.done indicates if this is the final chunk
86
-
87
147
  if (chunk.delta) {
88
148
  process.stdout.write(chunk.delta);
89
149
  fullMessage += chunk.delta;
@@ -97,30 +157,36 @@ async function streamingWithAnthropic() {
97
157
  );
98
158
  console.log(` - Data:`, agent.session.getData() || "None");
99
159
  console.log(` - Tool Calls: ${chunk.toolCalls?.length || 0}`);
100
-
101
- console.log(` - Full Message: ${fullMessage}`);
102
160
 
103
- // Add assistant response to session history
161
+ // Manual session history management required
104
162
  await agent.session.addMessage("assistant", fullMessage);
163
+ console.log(` - Session Messages: ${agent.session.getHistory().length}`);
105
164
  }
106
165
  }
166
+
167
+ console.log("\n💡 Legacy respondStream() API characteristics:");
168
+ console.log(" - Manual session management required");
169
+ console.log(" - More complex parameter structure");
170
+ console.log(" - Full backward compatibility maintained");
171
+ console.log(" - Still fully supported for existing code");
172
+
107
173
  } catch (error) {
108
174
  console.error("❌ Error:", error);
109
175
  }
110
176
  }
111
177
 
112
- async function streamingWithOpenAI() {
113
- console.log("\n🤖 Example 2: Streaming with OpenAI\n");
178
+ async function modernStreamingWithOpenAI() {
179
+ console.log("\n🤖 Example 3: Modern Streaming with OpenAI\n");
114
180
 
115
181
  const provider = new OpenAIProvider({
116
182
  apiKey: process.env.OPENAI_API_KEY || "",
117
- model: "gpt-5",
183
+ model: "gpt-4",
118
184
  config: {
119
185
  temperature: 0.8,
120
186
  },
121
187
  });
122
188
 
123
- const agent = new Agent<ConversationContext>({
189
+ const agent = new Agent<ConversationContext, unknown>({
124
190
  name: "CreativeAssistant",
125
191
  description: "A creative AI assistant",
126
192
  context: {
@@ -133,26 +199,16 @@ async function streamingWithOpenAI() {
133
199
  provider: provider,
134
200
  });
135
201
 
136
- const history = [
137
- {
138
- role: "user" as const,
139
- content: "Write a short poem about TypeScript",
140
- name: "User",
141
- },
142
- ];
143
-
144
202
  try {
145
- console.log("📤 Streaming response from OpenAI...\n");
203
+ console.log("📤 Modern streaming with OpenAI...\n");
146
204
  console.log("Response: ");
147
205
 
148
206
  // Session is automatically managed by the agent
149
207
  console.log("✨ Session ready:", agent.session.id);
150
208
 
151
- // Add user message to session history
152
- await agent.session.addMessage("user", "What's the weather like today?");
153
-
154
- for await (const chunk of agent.respondStream({
155
- history: agent.session.getHistory()
209
+ // NEW: Modern stream() API with context override
210
+ for await (const chunk of agent.stream("Write a short poem about TypeScript", {
211
+ contextOverride: { preferences: { streamingEnabled: true } }
156
212
  })) {
157
213
  if (chunk.delta) {
158
214
  process.stdout.write(chunk.delta);
@@ -164,9 +220,9 @@ async function streamingWithOpenAI() {
164
220
  ` - Route: ${chunk.session?.currentRoute?.title || "None"}`
165
221
  );
166
222
  console.log(` - Data:`, agent.session.getData() || "None");
167
-
168
- // Add assistant response to session history
169
- await agent.session.addMessage("assistant", chunk.accumulated || "");
223
+
224
+ // Session automatically updated - no manual work needed!
225
+ console.log(` - Session Messages: ${agent.session.getHistory().length}`);
170
226
  }
171
227
  }
172
228
  } catch (error) {
@@ -174,8 +230,8 @@ async function streamingWithOpenAI() {
174
230
  }
175
231
  }
176
232
 
177
- async function streamingWithGemini() {
178
- console.log("\n🤖 Example 3: Streaming with Google Gemini\n");
233
+ async function modernStreamingComparison() {
234
+ console.log("\n🤖 Example 4: Side-by-Side API Comparison\n");
179
235
 
180
236
  const provider = new GeminiProvider({
181
237
  apiKey: process.env.GEMINI_API_KEY || "",
@@ -185,9 +241,9 @@ async function streamingWithGemini() {
185
241
  },
186
242
  });
187
243
 
188
- const agent = new Agent<ConversationContext>({
189
- name: "AnalyticalAssistant",
190
- description: "An analytical AI assistant",
244
+ const agent = new Agent<ConversationContext, unknown>({
245
+ name: "ComparisonAssistant",
246
+ description: "Demonstrates API differences",
191
247
  context: {
192
248
  userId: "user123",
193
249
  sessionId: "session101",
@@ -198,56 +254,95 @@ async function streamingWithGemini() {
198
254
  provider: provider,
199
255
  });
200
256
 
201
- const history = [
202
- {
203
- role: "user" as const,
204
- content: "What are the key differences between REST and GraphQL?",
205
- name: "User",
206
- },
207
- ];
257
+ const userMessage = "What are the key differences between REST and GraphQL?";
208
258
 
209
259
  try {
210
- console.log("📤 Streaming response from Gemini...\n");
211
- console.log("Response: ");
260
+ console.log("📤 Comparing old vs new streaming APIs...\n");
212
261
 
213
- // Session is automatically managed by the agent
214
- console.log("✨ Session ready:", agent.session.id);
215
-
216
- // Add user message to session history
217
- await agent.session.addMessage("user", "What are the key differences between REST and GraphQL?");
262
+ // ========================================================================
263
+ // OLD WAY: respondStream() - Manual session management
264
+ // ========================================================================
265
+ console.log("🔸 OLD WAY: respondStream() with manual session management");
266
+ console.log("Response: ");
218
267
 
268
+ // Manual session management
269
+ await agent.session.addMessage("user", userMessage);
270
+
271
+ let oldWayMessage = "";
219
272
  for await (const chunk of agent.respondStream({
220
273
  history: agent.session.getHistory()
221
274
  })) {
222
275
  if (chunk.delta) {
223
276
  process.stdout.write(chunk.delta);
277
+ oldWayMessage += chunk.delta;
224
278
  }
225
279
 
226
280
  if (chunk.done) {
227
- console.log("\n\n✅ Stream complete!");
228
- console.log(
229
- ` - Route: ${chunk.session?.currentRoute?.title || "None"}`
230
- );
231
- console.log(` - Data:`, agent.session.getData() || "None");
281
+ // Manual history update required
282
+ await agent.session.addMessage("assistant", oldWayMessage);
283
+ console.log("\n Manual session update completed");
284
+ }
285
+ }
286
+
287
+ console.log("\n" + "=".repeat(60));
232
288
 
233
- // Add assistant response to session history
234
- await agent.session.addMessage("assistant", chunk.accumulated || "");
289
+ // ========================================================================
290
+ // NEW WAY: stream() - Automatic session management
291
+ // ========================================================================
292
+ console.log("🔸 NEW WAY: stream() with automatic session management");
293
+ console.log("Response: ");
294
+
295
+ // Automatic session management - just pass the message!
296
+ for await (const chunk of agent.stream("Can you explain that in more detail?")) {
297
+ if (chunk.delta) {
298
+ process.stdout.write(chunk.delta);
299
+ }
300
+
301
+ if (chunk.done) {
302
+ console.log("\n ✅ Automatic session update - no manual work needed!");
303
+ console.log(` 📊 Total messages in session: ${agent.session.getHistory().length}`);
235
304
  }
236
305
  }
306
+
307
+ console.log("\n💡 Key Differences:");
308
+ console.log(" OLD: agent.respondStream({ history: agent.session.getHistory() })");
309
+ console.log(" NEW: agent.stream('message')");
310
+ console.log(" ");
311
+ console.log(" OLD: Manual session.addMessage() calls required");
312
+ console.log(" NEW: Automatic session management");
313
+ console.log(" ");
314
+ console.log(" OLD: Complex parameter structure");
315
+ console.log(" NEW: Simple message + optional options");
316
+
237
317
  } catch (error) {
238
318
  console.error("❌ Error:", error);
239
319
  }
240
320
  }
241
321
 
242
- async function streamingWithRoutes() {
243
- console.log("\n🤖 Example 4: Streaming with Routes and Steps\n");
322
+ async function modernStreamingWithRoutes() {
323
+ console.log("\n🤖 Example 5: Modern Streaming with Routes and Steps\n");
244
324
 
245
325
  const provider = new AnthropicProvider({
246
326
  apiKey: process.env.ANTHROPIC_API_KEY || "",
247
327
  model: "claude-sonnet-4-5",
248
328
  });
249
329
 
250
- const agent = new Agent<ConversationContext>({
330
+ // Define feedback data schema
331
+ interface FeedbackData {
332
+ rating: number;
333
+ comments: string;
334
+ }
335
+
336
+ const feedbackSchema = {
337
+ type: "object",
338
+ properties: {
339
+ rating: { type: "number", minimum: 1, maximum: 5 },
340
+ comments: { type: "string" },
341
+ },
342
+ required: ["rating"],
343
+ };
344
+
345
+ const agent = new Agent<ConversationContext, FeedbackData>({
251
346
  name: "SupportAgent",
252
347
  description: "A customer support agent with conversation routes",
253
348
  context: {
@@ -258,6 +353,8 @@ async function streamingWithRoutes() {
258
353
  },
259
354
  },
260
355
  provider: provider,
356
+ // NEW: Agent-level schema
357
+ schema: feedbackSchema,
261
358
  });
262
359
 
263
360
  // Create a route
@@ -272,21 +369,14 @@ async function streamingWithRoutes() {
272
369
  });
273
370
 
274
371
  // Create a feedback route
275
- agent.createRoute<{
276
- rating: number;
277
- comments: string;
278
- }>({
372
+ agent.createRoute({
279
373
  title: "Collect Feedback",
280
374
  description: "Collect user feedback on their support experience",
281
375
  conditions: ["User wants to provide feedback"],
282
- schema: {
283
- type: "object",
284
- properties: {
285
- rating: { type: "number", minimum: 1, maximum: 5 },
286
- comments: { type: "string" },
287
- },
288
- required: ["rating"],
289
- },
376
+ // NEW: Required fields for route completion
377
+ requiredFields: ["rating"],
378
+ // NEW: Optional fields
379
+ optionalFields: ["comments"],
290
380
  steps: [
291
381
  {
292
382
  prompt: "How would you rate your support experience from 1 to 5?",
@@ -317,12 +407,8 @@ async function streamingWithRoutes() {
317
407
  // Session is automatically managed by the agent
318
408
  console.log("✨ Session ready:", agent.session.id);
319
409
 
320
- // Add user message to session history
321
- await agent.session.addMessage("user", "How do I reset my password?");
322
-
323
- for await (const chunk of agent.respondStream({
324
- history: agent.session.getHistory()
325
- })) {
410
+ // NEW: Modern stream() API with routes - automatic session management
411
+ for await (const chunk of agent.stream("How do I reset my password?")) {
326
412
  if (chunk.delta) {
327
413
  process.stdout.write(chunk.delta);
328
414
  }
@@ -339,16 +425,11 @@ async function streamingWithRoutes() {
339
425
  if (chunk.isRouteComplete) {
340
426
  console.log("\n✅ Route complete!");
341
427
  if (chunk.session?.currentRoute?.title === "Collect Feedback") {
342
- await logFeedback(
343
- agent.session.getData() as {
344
- rating: number;
345
- comments: string;
346
- }
347
- );
428
+ await logFeedback(agent.session.getData() as FeedbackData);
348
429
  }
349
430
  }
350
431
 
351
- // Session is automatically updated by the agent
432
+ // Session is automatically updated by the modern stream() API
352
433
  }
353
434
  }
354
435
  } catch (error) {
@@ -356,15 +437,15 @@ async function streamingWithRoutes() {
356
437
  }
357
438
  }
358
439
 
359
- async function streamingWithAbortSignal() {
360
- console.log("\n🤖 Example 5: Streaming with Abort Control\n");
440
+ async function modernStreamingWithAbortSignal() {
441
+ console.log("\n🤖 Example 6: Modern Streaming with Abort Control\n");
361
442
 
362
443
  const provider = new AnthropicProvider({
363
444
  apiKey: process.env.ANTHROPIC_API_KEY || "",
364
445
  model: "claude-sonnet-4-5",
365
446
  });
366
447
 
367
- const agent = new Agent<ConversationContext>({
448
+ const agent = new Agent<ConversationContext, unknown>({
368
449
  name: "Assistant",
369
450
  description: "An assistant that can be interrupted",
370
451
  context: {
@@ -401,11 +482,8 @@ async function streamingWithAbortSignal() {
401
482
  // Session is automatically managed by the agent
402
483
  console.log("✨ Session ready:", agent.session.id);
403
484
 
404
- // Add user message to session history
405
- await agent.session.addMessage("user", "Tell me a very long story about space exploration.");
406
-
407
- for await (const chunk of agent.respondStream({
408
- history: agent.session.getHistory(),
485
+ // NEW: Modern stream() API with abort signal
486
+ for await (const chunk of agent.stream("Tell me a very long story about space exploration.", {
409
487
  signal: abortController.signal,
410
488
  })) {
411
489
  if (chunk.delta) {
@@ -420,10 +498,7 @@ async function streamingWithAbortSignal() {
420
498
  );
421
499
  console.log(` - Data:`, agent.session.getData() || "None");
422
500
 
423
- // Add assistant response to session history
424
- await agent.session.addMessage("assistant", chunk.accumulated || "");
425
-
426
- // Session is automatically updated by the agent
501
+ // Session is automatically updated by the modern stream() API - no manual work needed!
427
502
 
428
503
  clearTimeout(timeout);
429
504
  }
@@ -458,11 +533,12 @@ async function main() {
458
533
  console.log("=".repeat(60));
459
534
 
460
535
  const examples = [
461
- { name: "Anthropic Streaming", fn: streamingWithAnthropic },
462
- { name: "OpenAI Streaming", fn: streamingWithOpenAI },
463
- { name: "Gemini Streaming", fn: streamingWithGemini },
464
- { name: "Streaming with Routes", fn: streamingWithRoutes },
465
- { name: "Streaming with Abort", fn: streamingWithAbortSignal },
536
+ { name: "Modern Streaming API (Anthropic)", fn: modernStreamingWithAnthropic },
537
+ { name: "Legacy Streaming API (Anthropic)", fn: legacyStreamingWithAnthropic },
538
+ { name: "Modern Streaming (OpenAI)", fn: modernStreamingWithOpenAI },
539
+ { name: "API Comparison (Gemini)", fn: modernStreamingComparison },
540
+ { name: "Modern Streaming with Routes", fn: modernStreamingWithRoutes },
541
+ { name: "Modern Streaming with Abort", fn: modernStreamingWithAbortSignal },
466
542
  ];
467
543
 
468
544
  console.log("\nAvailable Examples:");
@@ -472,19 +548,21 @@ async function main() {
472
548
 
473
549
  console.log("\n💡 Tips:");
474
550
  console.log(" - Set ANTHROPIC_API_KEY, OPENAI_API_KEY, or GEMINI_API_KEY");
551
+ console.log(" - NEW: Use agent.stream('message') for automatic session management");
552
+ console.log(" - OLD: agent.respondStream() still supported for backward compatibility");
475
553
  console.log(" - Streaming provides real-time responses for better UX");
476
554
  console.log(" - Use AbortSignal to cancel long-running streams");
477
555
  console.log(" - Access chunk.route and chunk.step for flow information");
478
556
 
479
557
  console.log("\n" + "=".repeat(60));
480
558
 
481
- // Run first example if API key is available
559
+ // Run modern streaming example if API key is available
482
560
  if (process.env.ANTHROPIC_API_KEY) {
483
- await streamingWithAnthropic();
561
+ await modernStreamingWithAnthropic();
484
562
  } else if (process.env.OPENAI_API_KEY) {
485
- await streamingWithOpenAI();
563
+ await modernStreamingWithOpenAI();
486
564
  } else if (process.env.GEMINI_API_KEY) {
487
- await streamingWithGemini();
565
+ await modernStreamingComparison();
488
566
  } else {
489
567
  console.log(
490
568
  "\n⚠️ No API keys found. Set one of the environment variables to run examples."
@@ -25,7 +25,7 @@ interface ResearchData {
25
25
  }
26
26
 
27
27
  // Research tool that Claude can use
28
- const conductResearch: Tool<unknown, unknown[], unknown, ResearchData> = {
28
+ const conductResearch: Tool<unknown, ResearchData, unknown[], unknown> = {
29
29
  id: "conduct_research",
30
30
  description: "Conduct comprehensive research on a given topic",
31
31
  parameters: {
@@ -33,17 +33,16 @@ const conductResearch: Tool<unknown, unknown[], unknown, ResearchData> = {
33
33
  properties: {},
34
34
  },
35
35
  handler: async ({ data }) => {
36
- const researchData = data as Partial<ResearchData>;
37
36
  console.log(
38
- `Conducting ${researchData?.depth} research on: ${researchData?.topic}`
37
+ `Conducting ${data?.depth} research on: ${data?.topic}`
39
38
  );
40
39
 
41
40
  const researchId = `RES-${Date.now()}`;
42
41
 
43
42
  // Simulate research process
44
43
  const findings = {
45
- overview: `Found ${researchData?.sources || 3} sources about ${
46
- researchData?.topic
44
+ overview: `Found ${data?.sources || 3} sources about ${
45
+ data?.topic
47
46
  }`,
48
47
  key_points: [
49
48
  "Latest developments in the field",
@@ -62,8 +61,36 @@ const conductResearch: Tool<unknown, unknown[], unknown, ResearchData> = {
62
61
  },
63
62
  };
64
63
 
64
+ // Define research schema
65
+ const researchSchema = {
66
+ type: "object",
67
+ properties: {
68
+ topic: { type: "string", description: "The research topic" },
69
+ depth: {
70
+ type: "string",
71
+ enum: ["overview", "detailed", "comprehensive"],
72
+ default: "detailed",
73
+ },
74
+ sources: {
75
+ type: "number",
76
+ minimum: 1,
77
+ maximum: 20,
78
+ default: 5,
79
+ description: "Number of sources to analyze",
80
+ },
81
+ format: {
82
+ type: "string",
83
+ enum: ["summary", "bullet_points", "structured"],
84
+ default: "structured",
85
+ description: "Output format preference",
86
+ },
87
+ researchId: { type: "string" },
88
+ },
89
+ required: ["topic"],
90
+ };
91
+
65
92
  // Create agent with Anthropic provider
66
- const agent = new Agent({
93
+ const agent = new Agent<unknown, ResearchData>({
67
94
  name: "ClaudeResearcher",
68
95
  description: "A research assistant powered by Claude",
69
96
  provider: new AnthropicProvider({
@@ -75,38 +102,18 @@ const agent = new Agent({
75
102
  top_p: 0.9,
76
103
  },
77
104
  }),
105
+ // NEW: Agent-level schema
106
+ schema: researchSchema,
78
107
  });
79
108
 
80
109
  // Create research route
81
- const researchRoute = agent.createRoute<ResearchData>({
110
+ const researchRoute = agent.createRoute({
82
111
  title: "Research Assistant",
83
112
  description: "Conduct research using Claude's analytical capabilities",
84
- schema: {
85
- type: "object",
86
- properties: {
87
- topic: { type: "string", description: "The research topic" },
88
- depth: {
89
- type: "string",
90
- enum: ["overview", "detailed", "comprehensive"],
91
- default: "detailed",
92
- },
93
- sources: {
94
- type: "number",
95
- minimum: 1,
96
- maximum: 20,
97
- default: 5,
98
- description: "Number of sources to analyze",
99
- },
100
- format: {
101
- type: "string",
102
- enum: ["summary", "bullet_points", "structured"],
103
- default: "structured",
104
- description: "Output format preference",
105
- },
106
- researchId: { type: "string" },
107
- },
108
- required: ["topic"],
109
- },
113
+ // NEW: Required fields for route completion
114
+ requiredFields: ["topic"],
115
+ // NEW: Optional fields that enhance the experience
116
+ optionalFields: ["depth", "sources", "format", "researchId"],
110
117
  identity: `You are Claude, an AI research assistant created by Anthropic.
111
118
  You have access to extensive knowledge and can conduct thorough research.
112
119
  Always be helpful, truthful, and provide well-reasoned analysis.`,