@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.
- package/README.md +34 -22
- package/dist/cjs/src/core/Agent.d.ts +77 -59
- package/dist/cjs/src/core/Agent.d.ts.map +1 -1
- package/dist/cjs/src/core/Agent.js +284 -1060
- package/dist/cjs/src/core/Agent.js.map +1 -1
- package/dist/cjs/src/core/PersistenceManager.d.ts.map +1 -1
- package/dist/cjs/src/core/PersistenceManager.js +48 -25
- package/dist/cjs/src/core/PersistenceManager.js.map +1 -1
- package/dist/cjs/src/core/PromptComposer.d.ts +1 -1
- package/dist/cjs/src/core/PromptComposer.d.ts.map +1 -1
- package/dist/cjs/src/core/PromptComposer.js.map +1 -1
- package/dist/cjs/src/core/ResponseEngine.d.ts +13 -12
- package/dist/cjs/src/core/ResponseEngine.d.ts.map +1 -1
- package/dist/cjs/src/core/ResponseEngine.js +4 -4
- package/dist/cjs/src/core/ResponseEngine.js.map +1 -1
- package/dist/cjs/src/core/ResponseModal.d.ts +205 -0
- package/dist/cjs/src/core/ResponseModal.d.ts.map +1 -0
- package/dist/cjs/src/core/ResponseModal.js +1328 -0
- package/dist/cjs/src/core/ResponseModal.js.map +1 -0
- package/dist/cjs/src/core/ResponsePipeline.d.ts +66 -38
- package/dist/cjs/src/core/ResponsePipeline.d.ts.map +1 -1
- package/dist/cjs/src/core/ResponsePipeline.js +72 -4
- package/dist/cjs/src/core/ResponsePipeline.js.map +1 -1
- package/dist/cjs/src/core/Route.d.ts +24 -5
- package/dist/cjs/src/core/Route.d.ts.map +1 -1
- package/dist/cjs/src/core/Route.js +45 -1
- package/dist/cjs/src/core/Route.js.map +1 -1
- package/dist/cjs/src/core/RoutingEngine.d.ts +31 -6
- package/dist/cjs/src/core/RoutingEngine.d.ts.map +1 -1
- package/dist/cjs/src/core/RoutingEngine.js +113 -9
- package/dist/cjs/src/core/RoutingEngine.js.map +1 -1
- package/dist/cjs/src/core/SessionManager.d.ts +14 -4
- package/dist/cjs/src/core/SessionManager.d.ts.map +1 -1
- package/dist/cjs/src/core/SessionManager.js +25 -5
- package/dist/cjs/src/core/SessionManager.js.map +1 -1
- package/dist/cjs/src/core/Step.d.ts +10 -10
- package/dist/cjs/src/core/Step.d.ts.map +1 -1
- package/dist/cjs/src/core/Step.js.map +1 -1
- package/dist/cjs/src/core/ToolExecutor.d.ts +4 -2
- package/dist/cjs/src/core/ToolExecutor.d.ts.map +1 -1
- package/dist/cjs/src/core/ToolExecutor.js +13 -3
- package/dist/cjs/src/core/ToolExecutor.js.map +1 -1
- package/dist/cjs/src/index.d.ts +3 -1
- package/dist/cjs/src/index.d.ts.map +1 -1
- package/dist/cjs/src/index.js +7 -1
- package/dist/cjs/src/index.js.map +1 -1
- package/dist/cjs/src/types/agent.d.ts +42 -21
- package/dist/cjs/src/types/agent.d.ts.map +1 -1
- package/dist/cjs/src/types/agent.js.map +1 -1
- package/dist/cjs/src/types/ai.d.ts +1 -1
- package/dist/cjs/src/types/ai.d.ts.map +1 -1
- package/dist/cjs/src/types/index.d.ts +1 -1
- package/dist/cjs/src/types/index.d.ts.map +1 -1
- package/dist/cjs/src/types/index.js.map +1 -1
- package/dist/cjs/src/types/persistence.d.ts +0 -1
- package/dist/cjs/src/types/persistence.d.ts.map +1 -1
- package/dist/cjs/src/types/route.d.ts +22 -16
- package/dist/cjs/src/types/route.d.ts.map +1 -1
- package/dist/cjs/src/types/session.d.ts +6 -11
- package/dist/cjs/src/types/session.d.ts.map +1 -1
- package/dist/cjs/src/types/tool.d.ts +12 -6
- package/dist/cjs/src/types/tool.d.ts.map +1 -1
- package/dist/cjs/src/utils/clone.d.ts.map +1 -1
- package/dist/cjs/src/utils/clone.js +0 -4
- package/dist/cjs/src/utils/clone.js.map +1 -1
- package/dist/cjs/src/utils/history.d.ts +30 -1
- package/dist/cjs/src/utils/history.d.ts.map +1 -1
- package/dist/cjs/src/utils/history.js +169 -23
- package/dist/cjs/src/utils/history.js.map +1 -1
- package/dist/cjs/src/utils/index.d.ts +1 -1
- package/dist/cjs/src/utils/index.d.ts.map +1 -1
- package/dist/cjs/src/utils/index.js +5 -1
- package/dist/cjs/src/utils/index.js.map +1 -1
- package/dist/cjs/src/utils/session.d.ts +2 -2
- package/dist/cjs/src/utils/session.d.ts.map +1 -1
- package/dist/cjs/src/utils/session.js +6 -26
- package/dist/cjs/src/utils/session.js.map +1 -1
- package/dist/src/core/Agent.d.ts +77 -59
- package/dist/src/core/Agent.d.ts.map +1 -1
- package/dist/src/core/Agent.js +285 -1061
- package/dist/src/core/Agent.js.map +1 -1
- package/dist/src/core/PersistenceManager.d.ts.map +1 -1
- package/dist/src/core/PersistenceManager.js +48 -25
- package/dist/src/core/PersistenceManager.js.map +1 -1
- package/dist/src/core/PromptComposer.d.ts +1 -1
- package/dist/src/core/PromptComposer.d.ts.map +1 -1
- package/dist/src/core/PromptComposer.js.map +1 -1
- package/dist/src/core/ResponseEngine.d.ts +13 -12
- package/dist/src/core/ResponseEngine.d.ts.map +1 -1
- package/dist/src/core/ResponseEngine.js +4 -4
- package/dist/src/core/ResponseEngine.js.map +1 -1
- package/dist/src/core/ResponseModal.d.ts +205 -0
- package/dist/src/core/ResponseModal.d.ts.map +1 -0
- package/dist/src/core/ResponseModal.js +1323 -0
- package/dist/src/core/ResponseModal.js.map +1 -0
- package/dist/src/core/ResponsePipeline.d.ts +66 -38
- package/dist/src/core/ResponsePipeline.d.ts.map +1 -1
- package/dist/src/core/ResponsePipeline.js +72 -4
- package/dist/src/core/ResponsePipeline.js.map +1 -1
- package/dist/src/core/Route.d.ts +24 -5
- package/dist/src/core/Route.d.ts.map +1 -1
- package/dist/src/core/Route.js +45 -1
- package/dist/src/core/Route.js.map +1 -1
- package/dist/src/core/RoutingEngine.d.ts +31 -6
- package/dist/src/core/RoutingEngine.d.ts.map +1 -1
- package/dist/src/core/RoutingEngine.js +113 -9
- package/dist/src/core/RoutingEngine.js.map +1 -1
- package/dist/src/core/SessionManager.d.ts +14 -4
- package/dist/src/core/SessionManager.d.ts.map +1 -1
- package/dist/src/core/SessionManager.js +25 -5
- package/dist/src/core/SessionManager.js.map +1 -1
- package/dist/src/core/Step.d.ts +10 -10
- package/dist/src/core/Step.d.ts.map +1 -1
- package/dist/src/core/Step.js.map +1 -1
- package/dist/src/core/ToolExecutor.d.ts +4 -2
- package/dist/src/core/ToolExecutor.d.ts.map +1 -1
- package/dist/src/core/ToolExecutor.js +13 -3
- package/dist/src/core/ToolExecutor.js.map +1 -1
- package/dist/src/index.d.ts +3 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/types/agent.d.ts +42 -21
- package/dist/src/types/agent.d.ts.map +1 -1
- package/dist/src/types/agent.js.map +1 -1
- package/dist/src/types/ai.d.ts +1 -1
- package/dist/src/types/ai.d.ts.map +1 -1
- package/dist/src/types/index.d.ts +1 -1
- package/dist/src/types/index.d.ts.map +1 -1
- package/dist/src/types/index.js.map +1 -1
- package/dist/src/types/persistence.d.ts +0 -1
- package/dist/src/types/persistence.d.ts.map +1 -1
- package/dist/src/types/route.d.ts +22 -16
- package/dist/src/types/route.d.ts.map +1 -1
- package/dist/src/types/session.d.ts +6 -11
- package/dist/src/types/session.d.ts.map +1 -1
- package/dist/src/types/tool.d.ts +12 -6
- package/dist/src/types/tool.d.ts.map +1 -1
- package/dist/src/utils/clone.d.ts.map +1 -1
- package/dist/src/utils/clone.js +0 -4
- package/dist/src/utils/clone.js.map +1 -1
- package/dist/src/utils/history.d.ts +30 -1
- package/dist/src/utils/history.d.ts.map +1 -1
- package/dist/src/utils/history.js +165 -23
- package/dist/src/utils/history.js.map +1 -1
- package/dist/src/utils/index.d.ts +1 -1
- package/dist/src/utils/index.d.ts.map +1 -1
- package/dist/src/utils/index.js +1 -1
- package/dist/src/utils/index.js.map +1 -1
- package/dist/src/utils/session.d.ts +2 -2
- package/dist/src/utils/session.d.ts.map +1 -1
- package/dist/src/utils/session.js +6 -26
- package/dist/src/utils/session.js.map +1 -1
- package/docs/README.md +5 -4
- package/docs/api/README.md +195 -4
- package/docs/api/overview.md +232 -13
- package/docs/core/agent/README.md +162 -17
- package/docs/core/agent/context-management.md +39 -15
- package/docs/core/agent/session-management.md +49 -16
- package/docs/core/ai-integration/prompt-composition.md +38 -14
- package/docs/core/ai-integration/response-processing.md +28 -17
- package/docs/core/conversation-flows/data-collection.md +103 -25
- package/docs/core/conversation-flows/route-dsl.md +45 -22
- package/docs/core/conversation-flows/routes.md +74 -18
- package/docs/core/conversation-flows/step-transitions.md +3 -3
- package/docs/core/conversation-flows/steps.md +39 -15
- package/docs/core/routing/intelligent-routing.md +18 -9
- package/docs/core/tools/tool-definition.md +8 -8
- package/docs/core/tools/tool-execution.md +26 -26
- package/docs/core/tools/tool-scoping.md +5 -5
- package/docs/guides/getting-started/README.md +54 -32
- package/docs/guides/migration/README.md +72 -0
- package/docs/guides/migration/response-modal-refactor.md +518 -0
- package/examples/advanced-patterns/knowledge-based-agent.ts +37 -28
- package/examples/advanced-patterns/persistent-onboarding.ts +70 -41
- package/examples/advanced-patterns/route-lifecycle-hooks.ts +28 -2
- package/examples/advanced-patterns/streaming-responses.ts +197 -119
- package/examples/ai-providers/anthropic-integration.ts +40 -33
- package/examples/ai-providers/openai-integration.ts +25 -25
- package/examples/conversation-flows/completion-transitions.ts +36 -32
- package/examples/core-concepts/basic-agent.ts +76 -78
- package/examples/core-concepts/modern-streaming-api.ts +309 -0
- package/examples/core-concepts/schema-driven-extraction.ts +20 -16
- package/examples/core-concepts/session-management.ts +65 -53
- package/examples/integrations/database-integration.ts +49 -34
- package/examples/integrations/healthcare-integration.ts +96 -91
- package/examples/integrations/search-integration.ts +79 -82
- package/examples/integrations/server-session-management.ts +25 -17
- package/examples/persistence/database-persistence.ts +61 -45
- package/examples/persistence/memory-sessions.ts +52 -63
- package/examples/persistence/redis-persistence.ts +81 -95
- package/examples/tools/basic-tools.ts +73 -62
- package/examples/tools/data-enrichment-tools.ts +52 -44
- package/package.json +1 -1
- package/src/core/Agent.ts +396 -1499
- package/src/core/PersistenceManager.ts +51 -27
- package/src/core/PromptComposer.ts +1 -1
- package/src/core/ResponseEngine.ts +21 -19
- package/src/core/ResponseModal.ts +1722 -0
- package/src/core/ResponsePipeline.ts +175 -60
- package/src/core/Route.ts +58 -6
- package/src/core/RoutingEngine.ts +174 -27
- package/src/core/SessionManager.ts +32 -8
- package/src/core/Step.ts +20 -12
- package/src/core/ToolExecutor.ts +19 -5
- package/src/index.ts +11 -0
- package/src/types/agent.ts +47 -23
- package/src/types/ai.ts +1 -1
- package/src/types/index.ts +2 -0
- package/src/types/persistence.ts +0 -1
- package/src/types/route.ts +22 -16
- package/src/types/session.ts +6 -12
- package/src/types/tool.ts +15 -9
- package/src/utils/clone.ts +6 -8
- package/src/utils/history.ts +190 -27
- package/src/utils/index.ts +4 -0
- package/src/utils/session.ts +6 -31
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Example: Streaming Responses
|
|
3
|
-
* Updated for
|
|
3
|
+
* Updated for ResponseModal architecture with modern streaming APIs
|
|
4
4
|
*
|
|
5
|
-
* This example demonstrates
|
|
6
|
-
*
|
|
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
|
|
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
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
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("📤
|
|
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
|
-
//
|
|
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
|
-
//
|
|
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
|
|
113
|
-
console.log("\n🤖 Example
|
|
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-
|
|
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("📤
|
|
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
|
-
//
|
|
152
|
-
await agent.
|
|
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
|
-
//
|
|
169
|
-
|
|
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
|
|
178
|
-
console.log("\n🤖 Example
|
|
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: "
|
|
190
|
-
description: "
|
|
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
|
|
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("📤
|
|
211
|
-
console.log("Response: ");
|
|
260
|
+
console.log("📤 Comparing old vs new streaming APIs...\n");
|
|
212
261
|
|
|
213
|
-
//
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
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
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
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
|
-
|
|
234
|
-
|
|
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
|
|
243
|
-
console.log("\n🤖 Example
|
|
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
|
-
|
|
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
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
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
|
-
//
|
|
321
|
-
await agent.
|
|
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
|
|
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
|
|
360
|
-
console.log("\n🤖 Example
|
|
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
|
-
//
|
|
405
|
-
await agent.
|
|
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
|
-
//
|
|
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: "
|
|
462
|
-
{ name: "
|
|
463
|
-
{ name: "
|
|
464
|
-
{ name: "
|
|
465
|
-
{ name: "Streaming with
|
|
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
|
|
559
|
+
// Run modern streaming example if API key is available
|
|
482
560
|
if (process.env.ANTHROPIC_API_KEY) {
|
|
483
|
-
await
|
|
561
|
+
await modernStreamingWithAnthropic();
|
|
484
562
|
} else if (process.env.OPENAI_API_KEY) {
|
|
485
|
-
await
|
|
563
|
+
await modernStreamingWithOpenAI();
|
|
486
564
|
} else if (process.env.GEMINI_API_KEY) {
|
|
487
|
-
await
|
|
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
|
|
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 ${
|
|
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 ${
|
|
46
|
-
|
|
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
|
|
110
|
+
const researchRoute = agent.createRoute({
|
|
82
111
|
title: "Research Assistant",
|
|
83
112
|
description: "Conduct research using Claude's analytical capabilities",
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
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.`,
|