@falai/agent 0.6.8 → 0.7.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 +62 -59
- package/dist/adapters/MemoryAdapter.js +2 -2
- package/dist/adapters/MemoryAdapter.js.map +1 -1
- package/dist/adapters/MongoAdapter.js +2 -2
- package/dist/adapters/MongoAdapter.js.map +1 -1
- package/dist/adapters/OpenSearchAdapter.js +7 -7
- package/dist/adapters/OpenSearchAdapter.js.map +1 -1
- package/dist/adapters/PostgreSQLAdapter.js +9 -9
- package/dist/adapters/PostgreSQLAdapter.js.map +1 -1
- package/dist/adapters/PrismaAdapter.js +3 -3
- package/dist/adapters/PrismaAdapter.js.map +1 -1
- package/dist/adapters/RedisAdapter.js +2 -2
- package/dist/adapters/RedisAdapter.js.map +1 -1
- package/dist/adapters/SQLiteAdapter.d.ts +3 -3
- package/dist/adapters/SQLiteAdapter.d.ts.map +1 -1
- package/dist/adapters/SQLiteAdapter.js +11 -11
- package/dist/adapters/SQLiteAdapter.js.map +1 -1
- package/dist/adapters/index.d.ts +1 -1
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/cjs/adapters/MemoryAdapter.js +2 -2
- package/dist/cjs/adapters/MemoryAdapter.js.map +1 -1
- package/dist/cjs/adapters/MongoAdapter.js +2 -2
- package/dist/cjs/adapters/MongoAdapter.js.map +1 -1
- package/dist/cjs/adapters/OpenSearchAdapter.js +7 -7
- package/dist/cjs/adapters/OpenSearchAdapter.js.map +1 -1
- package/dist/cjs/adapters/PostgreSQLAdapter.js +9 -9
- package/dist/cjs/adapters/PostgreSQLAdapter.js.map +1 -1
- package/dist/cjs/adapters/PrismaAdapter.js +3 -3
- package/dist/cjs/adapters/PrismaAdapter.js.map +1 -1
- package/dist/cjs/adapters/RedisAdapter.js +2 -2
- package/dist/cjs/adapters/RedisAdapter.js.map +1 -1
- package/dist/cjs/adapters/SQLiteAdapter.d.ts +3 -3
- package/dist/cjs/adapters/SQLiteAdapter.d.ts.map +1 -1
- package/dist/cjs/adapters/SQLiteAdapter.js +11 -11
- package/dist/cjs/adapters/SQLiteAdapter.js.map +1 -1
- package/dist/cjs/adapters/index.d.ts +1 -1
- package/dist/cjs/adapters/index.d.ts.map +1 -1
- package/dist/cjs/constants/index.d.ts +4 -4
- package/dist/cjs/constants/index.js +5 -5
- package/dist/cjs/core/Agent.d.ts +22 -22
- package/dist/cjs/core/Agent.d.ts.map +1 -1
- package/dist/cjs/core/Agent.js +160 -152
- package/dist/cjs/core/Agent.js.map +1 -1
- package/dist/cjs/core/Events.d.ts +6 -6
- package/dist/cjs/core/Events.d.ts.map +1 -1
- package/dist/cjs/core/PersistenceManager.d.ts +13 -13
- package/dist/cjs/core/PersistenceManager.d.ts.map +1 -1
- package/dist/cjs/core/PersistenceManager.js +24 -24
- package/dist/cjs/core/PersistenceManager.js.map +1 -1
- package/dist/cjs/core/ResponseEngine.d.ts +3 -8
- package/dist/cjs/core/ResponseEngine.d.ts.map +1 -1
- package/dist/cjs/core/ResponseEngine.js +8 -8
- package/dist/cjs/core/ResponseEngine.js.map +1 -1
- package/dist/cjs/core/Route.d.ts +17 -17
- package/dist/cjs/core/Route.d.ts.map +1 -1
- package/dist/cjs/core/Route.js +33 -33
- package/dist/cjs/core/Route.js.map +1 -1
- package/dist/cjs/core/RoutingEngine.d.ts +30 -30
- package/dist/cjs/core/RoutingEngine.d.ts.map +1 -1
- package/dist/cjs/core/RoutingEngine.js +192 -192
- package/dist/cjs/core/RoutingEngine.js.map +1 -1
- package/dist/cjs/core/Step.d.ts +72 -0
- package/dist/cjs/core/Step.d.ts.map +1 -0
- package/dist/cjs/core/Step.js +150 -0
- package/dist/cjs/core/Step.js.map +1 -0
- package/dist/cjs/core/ToolExecutor.d.ts +5 -5
- package/dist/cjs/core/ToolExecutor.d.ts.map +1 -1
- package/dist/cjs/core/ToolExecutor.js +8 -8
- package/dist/cjs/core/ToolExecutor.js.map +1 -1
- package/dist/cjs/core/Transition.d.ts +14 -14
- package/dist/cjs/core/Transition.d.ts.map +1 -1
- package/dist/cjs/core/Transition.js +48 -19
- package/dist/cjs/core/Transition.js.map +1 -1
- package/dist/cjs/index.d.ts +7 -7
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +8 -8
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/types/agent.d.ts +8 -8
- package/dist/cjs/types/agent.d.ts.map +1 -1
- package/dist/cjs/types/ai.d.ts +2 -2
- package/dist/cjs/types/ai.d.ts.map +1 -1
- package/dist/cjs/types/history.d.ts +3 -3
- package/dist/cjs/types/history.d.ts.map +1 -1
- package/dist/cjs/types/index.d.ts +1 -1
- package/dist/cjs/types/index.d.ts.map +1 -1
- package/dist/cjs/types/persistence.d.ts +5 -5
- package/dist/cjs/types/persistence.d.ts.map +1 -1
- package/dist/cjs/types/route.d.ts +57 -52
- package/dist/cjs/types/route.d.ts.map +1 -1
- package/dist/cjs/types/session.d.ts +27 -27
- package/dist/cjs/types/session.d.ts.map +1 -1
- package/dist/cjs/types/session.js +48 -50
- package/dist/cjs/types/session.js.map +1 -1
- package/dist/cjs/types/tool.d.ts +13 -13
- package/dist/cjs/types/tool.d.ts.map +1 -1
- package/dist/cjs/utils/id.d.ts +8 -3
- package/dist/cjs/utils/id.d.ts.map +1 -1
- package/dist/cjs/utils/id.js +16 -7
- package/dist/cjs/utils/id.js.map +1 -1
- package/dist/constants/index.d.ts +4 -4
- package/dist/constants/index.js +4 -4
- package/dist/core/Agent.d.ts +22 -22
- package/dist/core/Agent.d.ts.map +1 -1
- package/dist/core/Agent.js +162 -154
- package/dist/core/Agent.js.map +1 -1
- package/dist/core/Events.d.ts +6 -6
- package/dist/core/Events.d.ts.map +1 -1
- package/dist/core/PersistenceManager.d.ts +13 -13
- package/dist/core/PersistenceManager.d.ts.map +1 -1
- package/dist/core/PersistenceManager.js +25 -25
- package/dist/core/PersistenceManager.js.map +1 -1
- package/dist/core/ResponseEngine.d.ts +3 -8
- package/dist/core/ResponseEngine.d.ts.map +1 -1
- package/dist/core/ResponseEngine.js +8 -8
- package/dist/core/ResponseEngine.js.map +1 -1
- package/dist/core/Route.d.ts +17 -17
- package/dist/core/Route.d.ts.map +1 -1
- package/dist/core/Route.js +33 -33
- package/dist/core/Route.js.map +1 -1
- package/dist/core/RoutingEngine.d.ts +30 -30
- package/dist/core/RoutingEngine.d.ts.map +1 -1
- package/dist/core/RoutingEngine.js +193 -193
- package/dist/core/RoutingEngine.js.map +1 -1
- package/dist/core/Step.d.ts +72 -0
- package/dist/core/Step.d.ts.map +1 -0
- package/dist/core/Step.js +146 -0
- package/dist/core/Step.js.map +1 -0
- package/dist/core/ToolExecutor.d.ts +5 -5
- package/dist/core/ToolExecutor.d.ts.map +1 -1
- package/dist/core/ToolExecutor.js +8 -8
- package/dist/core/ToolExecutor.js.map +1 -1
- package/dist/core/Transition.d.ts +14 -14
- package/dist/core/Transition.d.ts.map +1 -1
- package/dist/core/Transition.js +48 -19
- package/dist/core/Transition.js.map +1 -1
- package/dist/index.d.ts +7 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/types/agent.d.ts +8 -8
- package/dist/types/agent.d.ts.map +1 -1
- package/dist/types/ai.d.ts +2 -2
- package/dist/types/ai.d.ts.map +1 -1
- package/dist/types/history.d.ts +3 -3
- package/dist/types/history.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/persistence.d.ts +5 -5
- package/dist/types/persistence.d.ts.map +1 -1
- package/dist/types/route.d.ts +57 -52
- package/dist/types/route.d.ts.map +1 -1
- package/dist/types/session.d.ts +27 -27
- package/dist/types/session.d.ts.map +1 -1
- package/dist/types/session.js +44 -46
- package/dist/types/session.js.map +1 -1
- package/dist/types/tool.d.ts +13 -13
- package/dist/types/tool.d.ts.map +1 -1
- package/dist/utils/id.d.ts +8 -3
- package/dist/utils/id.d.ts.map +1 -1
- package/dist/utils/id.js +14 -6
- package/dist/utils/id.js.map +1 -1
- package/docs/ADAPTERS.md +21 -21
- package/docs/AGENT.md +57 -55
- package/docs/API_REFERENCE.md +218 -220
- package/docs/ARCHITECTURE.md +99 -104
- package/docs/CONTEXT_MANAGEMENT.md +81 -88
- package/docs/DOCS.md +18 -18
- package/docs/DOMAINS.md +16 -16
- package/docs/EXAMPLES.md +43 -43
- package/docs/GETTING_STARTED.md +60 -63
- package/docs/PERSISTENCE.md +66 -70
- package/docs/PROVIDERS.md +2 -2
- package/docs/README.md +6 -6
- package/docs/ROUTES.md +218 -220
- package/docs/STEPS.md +883 -0
- package/examples/business-onboarding.ts +84 -81
- package/examples/company-qna-agent.ts +68 -67
- package/examples/custom-database-persistence.ts +87 -89
- package/examples/declarative-agent.ts +32 -32
- package/examples/domain-scoping.ts +18 -18
- package/examples/extracted-data-modification.ts +92 -97
- package/examples/healthcare-agent.ts +89 -91
- package/examples/openai-agent.ts +29 -32
- package/examples/opensearch-persistence.ts +43 -45
- package/examples/persistent-onboarding.ts +65 -66
- package/examples/prisma-persistence.ts +108 -112
- package/examples/prisma-schema.example.prisma +3 -3
- package/examples/redis-persistence.ts +67 -73
- package/examples/route-transitions.ts +71 -47
- package/examples/rules-prohibitions.ts +28 -28
- package/examples/streaming-agent.ts +24 -24
- package/examples/travel-agent.ts +94 -109
- package/package.json +1 -1
- package/src/adapters/MemoryAdapter.ts +3 -3
- package/src/adapters/MongoAdapter.ts +3 -3
- package/src/adapters/OpenSearchAdapter.ts +8 -8
- package/src/adapters/PostgreSQLAdapter.ts +10 -10
- package/src/adapters/PrismaAdapter.ts +4 -4
- package/src/adapters/RedisAdapter.ts +3 -3
- package/src/adapters/SQLiteAdapter.ts +15 -15
- package/src/adapters/index.ts +1 -1
- package/src/constants/index.ts +4 -4
- package/src/core/Agent.ts +210 -206
- package/src/core/Events.ts +12 -12
- package/src/core/PersistenceManager.ts +32 -36
- package/src/core/ResponseEngine.ts +11 -17
- package/src/core/Route.ts +55 -49
- package/src/core/RoutingEngine.ts +244 -252
- package/src/core/Step.ts +197 -0
- package/src/core/ToolExecutor.ts +11 -11
- package/src/core/Transition.ts +72 -26
- package/src/index.ts +8 -8
- package/src/types/agent.ts +8 -8
- package/src/types/ai.ts +2 -2
- package/src/types/history.ts +3 -3
- package/src/types/index.ts +1 -1
- package/src/types/persistence.ts +6 -6
- package/src/types/route.ts +77 -61
- package/src/types/session.ts +75 -78
- package/src/types/tool.ts +17 -17
- package/src/utils/id.ts +15 -6
- package/dist/cjs/core/State.d.ts +0 -72
- package/dist/cjs/core/State.d.ts.map +0 -1
- package/dist/cjs/core/State.js +0 -148
- package/dist/cjs/core/State.js.map +0 -1
- package/dist/core/State.d.ts +0 -72
- package/dist/core/State.d.ts.map +0 -1
- package/dist/core/State.js +0 -144
- package/dist/core/State.js.map +0 -1
- package/docs/STATES.md +0 -888
- package/src/core/State.ts +0 -212
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Example: Using Redis for Persistence with Session
|
|
2
|
+
* Example: Using Redis for Persistence with Session Step
|
|
3
3
|
*
|
|
4
4
|
* Fast, in-memory persistence perfect for:
|
|
5
5
|
* - High-throughput applications
|
|
6
|
-
* - Session caching with
|
|
6
|
+
* - Session caching with collected data
|
|
7
7
|
* - Real-time chat applications
|
|
8
8
|
* - Temporary conversation storage
|
|
9
9
|
*/
|
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
EventSource,
|
|
17
17
|
MessageEventData,
|
|
18
18
|
Event,
|
|
19
|
-
|
|
19
|
+
END_ROUTE,
|
|
20
20
|
} from "../src/index";
|
|
21
21
|
// @ts-ignore
|
|
22
22
|
import Redis from "ioredis";
|
|
@@ -86,12 +86,12 @@ async function example() {
|
|
|
86
86
|
sessionTTL: 24 * 60 * 60, // 24 hours
|
|
87
87
|
messageTTL: 7 * 24 * 60 * 60, // 7 days
|
|
88
88
|
}),
|
|
89
|
-
autoSave: true, // Auto-save session
|
|
89
|
+
autoSave: true, // Auto-save session step
|
|
90
90
|
userId,
|
|
91
91
|
},
|
|
92
92
|
});
|
|
93
93
|
|
|
94
|
-
// Create support ticket route with data
|
|
94
|
+
// Create support ticket route with data collecting
|
|
95
95
|
const ticketRoute = agent.createRoute<SupportTicketData>({
|
|
96
96
|
title: "Create Support Ticket",
|
|
97
97
|
description: "Help user create and track support tickets",
|
|
@@ -100,7 +100,7 @@ async function example() {
|
|
|
100
100
|
"User wants to report a problem",
|
|
101
101
|
"User mentions support, help, or issue",
|
|
102
102
|
],
|
|
103
|
-
|
|
103
|
+
schema: {
|
|
104
104
|
type: "object",
|
|
105
105
|
properties: {
|
|
106
106
|
issue: {
|
|
@@ -127,37 +127,37 @@ async function example() {
|
|
|
127
127
|
},
|
|
128
128
|
});
|
|
129
129
|
|
|
130
|
-
//
|
|
131
|
-
ticketRoute.
|
|
132
|
-
.
|
|
133
|
-
|
|
134
|
-
|
|
130
|
+
// Step flow
|
|
131
|
+
ticketRoute.initialStep
|
|
132
|
+
.nextStep({
|
|
133
|
+
instructions: "Ask what the issue is",
|
|
134
|
+
collect: ["issue", "category"],
|
|
135
135
|
skipIf: (data) => !!data.issue && !!data.category,
|
|
136
136
|
})
|
|
137
|
-
.
|
|
138
|
-
|
|
139
|
-
|
|
137
|
+
.nextStep({
|
|
138
|
+
instructions: "Ask for priority",
|
|
139
|
+
collect: ["priority"],
|
|
140
140
|
skipIf: (data) => !!data.priority,
|
|
141
|
-
|
|
141
|
+
requires: ["issue", "category"],
|
|
142
142
|
})
|
|
143
|
-
.
|
|
144
|
-
|
|
145
|
-
|
|
143
|
+
.nextStep({
|
|
144
|
+
instructions: "Ask for detailed description",
|
|
145
|
+
collect: ["description"],
|
|
146
146
|
skipIf: (data) => !!data.description,
|
|
147
|
-
|
|
147
|
+
requires: ["issue", "category"],
|
|
148
148
|
})
|
|
149
|
-
.
|
|
150
|
-
|
|
151
|
-
|
|
149
|
+
.nextStep({
|
|
150
|
+
instructions: "Confirm and create ticket",
|
|
151
|
+
requires: ["issue", "category", "description"],
|
|
152
152
|
})
|
|
153
|
-
.
|
|
153
|
+
.nextStep({ step: END_ROUTE });
|
|
154
154
|
|
|
155
155
|
const persistence = agent.getPersistenceManager();
|
|
156
156
|
if (!persistence) return;
|
|
157
157
|
|
|
158
|
-
// Create session with
|
|
159
|
-
const { sessionData,
|
|
160
|
-
await persistence.
|
|
158
|
+
// Create session with step support
|
|
159
|
+
const { sessionData, sessionStep } =
|
|
160
|
+
await persistence.createSessionWithStep<SupportTicketData>({
|
|
161
161
|
userId,
|
|
162
162
|
agentName: "Support Assistant",
|
|
163
163
|
initialData: {
|
|
@@ -166,13 +166,13 @@ async function example() {
|
|
|
166
166
|
});
|
|
167
167
|
|
|
168
168
|
console.log("✨ Session created in Redis:", sessionData.id);
|
|
169
|
-
console.log("📊 Initial
|
|
170
|
-
|
|
169
|
+
console.log("📊 Initial step:", {
|
|
170
|
+
data: sessionStep.data,
|
|
171
171
|
});
|
|
172
172
|
|
|
173
173
|
// Turn 1: User provides issue
|
|
174
174
|
const history: Event<MessageEventData>[] = [];
|
|
175
|
-
let session =
|
|
175
|
+
let session = sessionStep;
|
|
176
176
|
|
|
177
177
|
const message1 = createMessageEvent(
|
|
178
178
|
EventSource.CUSTOMER,
|
|
@@ -188,7 +188,7 @@ async function example() {
|
|
|
188
188
|
|
|
189
189
|
console.log("\n--- Turn 1 ---");
|
|
190
190
|
console.log("🤖 Agent:", response1.message);
|
|
191
|
-
console.log("📊
|
|
191
|
+
console.log("📊 Collected data:", response1.session?.data);
|
|
192
192
|
|
|
193
193
|
// Save messages
|
|
194
194
|
await persistence.saveMessage({
|
|
@@ -202,7 +202,7 @@ async function example() {
|
|
|
202
202
|
role: "agent",
|
|
203
203
|
content: response1.message,
|
|
204
204
|
route: response1.session?.currentRoute?.id,
|
|
205
|
-
|
|
205
|
+
step: response1.session?.currentStep?.id,
|
|
206
206
|
});
|
|
207
207
|
|
|
208
208
|
session = response1.session!;
|
|
@@ -230,7 +230,7 @@ async function example() {
|
|
|
230
230
|
|
|
231
231
|
console.log("\n--- Turn 2 ---");
|
|
232
232
|
console.log("🤖 Agent:", response2.message);
|
|
233
|
-
console.log("📊
|
|
233
|
+
console.log("📊 Collected data:", response2.session?.data);
|
|
234
234
|
|
|
235
235
|
await persistence.saveMessage({
|
|
236
236
|
sessionId: sessionData.id,
|
|
@@ -246,20 +246,18 @@ async function example() {
|
|
|
246
246
|
|
|
247
247
|
if (response2.isRouteComplete) {
|
|
248
248
|
console.log("\n✅ Support ticket route complete!");
|
|
249
|
-
await fileSupportTicket(
|
|
250
|
-
agent.getExtractedData(session.id) as SupportTicketData
|
|
251
|
-
);
|
|
249
|
+
await fileSupportTicket(agent.getData(session.id) as SupportTicketData);
|
|
252
250
|
}
|
|
253
251
|
|
|
254
|
-
// Load session
|
|
252
|
+
// Load session step from Redis (demonstrates persistence)
|
|
255
253
|
console.log("\n--- Loading Session from Redis ---");
|
|
256
|
-
const loadedSession = await persistence.
|
|
254
|
+
const loadedSession = await persistence.loadSessionStep<SupportTicketData>(
|
|
257
255
|
sessionData.id
|
|
258
256
|
);
|
|
259
257
|
|
|
260
258
|
console.log("📥 Loaded session:", {
|
|
261
259
|
currentRoute: loadedSession?.currentRoute?.title,
|
|
262
|
-
|
|
260
|
+
data: loadedSession?.data,
|
|
263
261
|
});
|
|
264
262
|
|
|
265
263
|
// Get messages
|
|
@@ -275,7 +273,7 @@ async function example() {
|
|
|
275
273
|
}
|
|
276
274
|
|
|
277
275
|
/**
|
|
278
|
-
* Advanced Example: High-Throughput Chat with Session
|
|
276
|
+
* Advanced Example: High-Throughput Chat with Session Step
|
|
279
277
|
*/
|
|
280
278
|
async function highThroughputExample() {
|
|
281
279
|
const redis = new Redis();
|
|
@@ -301,7 +299,7 @@ async function highThroughputExample() {
|
|
|
301
299
|
// Simple chat route that extracts topic and sentiment
|
|
302
300
|
const chatRoute = agent.createRoute<QuickChatData>({
|
|
303
301
|
title: "General Chat",
|
|
304
|
-
|
|
302
|
+
schema: {
|
|
305
303
|
type: "object",
|
|
306
304
|
properties: {
|
|
307
305
|
topic: {
|
|
@@ -318,18 +316,18 @@ async function highThroughputExample() {
|
|
|
318
316
|
},
|
|
319
317
|
});
|
|
320
318
|
|
|
321
|
-
chatRoute.
|
|
322
|
-
.
|
|
323
|
-
|
|
324
|
-
|
|
319
|
+
chatRoute.initialStep
|
|
320
|
+
.nextStep({
|
|
321
|
+
instructions: "Chat and extract topic/sentiment",
|
|
322
|
+
collect: ["topic", "sentiment"],
|
|
325
323
|
})
|
|
326
|
-
.
|
|
324
|
+
.nextStep({ step: END_ROUTE });
|
|
327
325
|
|
|
328
326
|
const persistence = agent.getPersistenceManager()!;
|
|
329
327
|
|
|
330
328
|
// Create session
|
|
331
|
-
const { sessionData,
|
|
332
|
-
await persistence.
|
|
329
|
+
const { sessionData, sessionStep } =
|
|
330
|
+
await persistence.createSessionWithStep<QuickChatData>({
|
|
333
331
|
userId: "user_456",
|
|
334
332
|
agentName: "Chat Bot",
|
|
335
333
|
});
|
|
@@ -343,20 +341,18 @@ async function highThroughputExample() {
|
|
|
343
341
|
"I'm loving the new features you added!"
|
|
344
342
|
),
|
|
345
343
|
],
|
|
346
|
-
session:
|
|
344
|
+
session: sessionStep,
|
|
347
345
|
});
|
|
348
346
|
|
|
349
347
|
console.log("🤖 Response:", response.message);
|
|
350
|
-
console.log("📊
|
|
348
|
+
console.log("📊 Data:", response.session?.data);
|
|
351
349
|
|
|
352
350
|
if (response.isRouteComplete) {
|
|
353
351
|
console.log("\n✅ Chat analytics route complete!");
|
|
354
|
-
await logChatAnalytics(
|
|
355
|
-
agent.getExtractedData(sessionData.id) as QuickChatData
|
|
356
|
-
);
|
|
352
|
+
await logChatAnalytics(agent.getData(sessionData.id) as QuickChatData);
|
|
357
353
|
}
|
|
358
354
|
|
|
359
|
-
console.log("💾 Session
|
|
355
|
+
console.log("💾 Session step cached in Redis!");
|
|
360
356
|
|
|
361
357
|
await redis.quit();
|
|
362
358
|
}
|
|
@@ -383,7 +379,7 @@ async function sessionRecoveryExample() {
|
|
|
383
379
|
|
|
384
380
|
const orderRoute = agent.createRoute<OrderData>({
|
|
385
381
|
title: "Place Order",
|
|
386
|
-
|
|
382
|
+
schema: {
|
|
387
383
|
type: "object",
|
|
388
384
|
properties: {
|
|
389
385
|
productId: { type: "string" },
|
|
@@ -394,22 +390,22 @@ async function sessionRecoveryExample() {
|
|
|
394
390
|
},
|
|
395
391
|
});
|
|
396
392
|
|
|
397
|
-
orderRoute.
|
|
398
|
-
.
|
|
399
|
-
|
|
400
|
-
|
|
393
|
+
orderRoute.initialStep
|
|
394
|
+
.nextStep({
|
|
395
|
+
instructions: "Ask what to order",
|
|
396
|
+
collect: ["productId", "quantity"],
|
|
401
397
|
})
|
|
402
|
-
.
|
|
403
|
-
|
|
404
|
-
|
|
398
|
+
.nextStep({
|
|
399
|
+
instructions: "Ask for shipping address",
|
|
400
|
+
collect: ["shippingAddress"],
|
|
405
401
|
})
|
|
406
|
-
.
|
|
402
|
+
.nextStep({ step: END_ROUTE });
|
|
407
403
|
|
|
408
404
|
const persistence = agent.getPersistenceManager()!;
|
|
409
405
|
|
|
410
406
|
// Start a new session
|
|
411
|
-
const { sessionData,
|
|
412
|
-
await persistence.
|
|
407
|
+
const { sessionData, sessionStep } =
|
|
408
|
+
await persistence.createSessionWithStep<OrderData>({
|
|
413
409
|
userId: "user_789",
|
|
414
410
|
agentName: "Order Assistant",
|
|
415
411
|
});
|
|
@@ -427,23 +423,23 @@ async function sessionRecoveryExample() {
|
|
|
427
423
|
"I want to order product ABC123, 2 units"
|
|
428
424
|
),
|
|
429
425
|
],
|
|
430
|
-
session:
|
|
426
|
+
session: sessionStep,
|
|
431
427
|
});
|
|
432
428
|
|
|
433
429
|
console.log("🤖 Response:", response1.message);
|
|
434
|
-
console.log("📊
|
|
430
|
+
console.log("📊 Data so far:", response1.session?.data);
|
|
435
431
|
|
|
436
432
|
// --- Simulate user disconnecting and reconnecting ---
|
|
437
433
|
console.log("\n--- User Reconnects ---");
|
|
438
434
|
|
|
439
435
|
// Load session from Redis
|
|
440
|
-
const recoveredSession = await persistence.
|
|
436
|
+
const recoveredSession = await persistence.loadSessionStep<OrderData>(
|
|
441
437
|
sessionId
|
|
442
438
|
);
|
|
443
439
|
|
|
444
|
-
console.log("📥 Recovered session
|
|
440
|
+
console.log("📥 Recovered session step:", {
|
|
445
441
|
currentRoute: recoveredSession?.currentRoute?.title,
|
|
446
|
-
|
|
442
|
+
data: recoveredSession?.data,
|
|
447
443
|
});
|
|
448
444
|
|
|
449
445
|
// Load message history
|
|
@@ -465,13 +461,11 @@ async function sessionRecoveryExample() {
|
|
|
465
461
|
});
|
|
466
462
|
|
|
467
463
|
console.log("🤖 Response:", response2.message);
|
|
468
|
-
console.log("📊 Final
|
|
464
|
+
console.log("📊 Final collected data:", response2.session?.data);
|
|
469
465
|
|
|
470
466
|
if (response2.isRouteComplete) {
|
|
471
467
|
console.log("\n✅ Order placement complete!");
|
|
472
|
-
await processOrder(
|
|
473
|
-
agent.getExtractedData(sessionId) as unknown as OrderData
|
|
474
|
-
);
|
|
468
|
+
await processOrder(agent.getData(sessionId) as unknown as OrderData);
|
|
475
469
|
}
|
|
476
470
|
|
|
477
471
|
console.log("✅ Order complete with recovered session!");
|
|
@@ -13,8 +13,8 @@ import {
|
|
|
13
13
|
GeminiProvider,
|
|
14
14
|
createMessageEvent,
|
|
15
15
|
EventSource,
|
|
16
|
-
|
|
17
|
-
type
|
|
16
|
+
END_ROUTE,
|
|
17
|
+
type SessionStep,
|
|
18
18
|
} from "../src/index";
|
|
19
19
|
|
|
20
20
|
// Type definitions for our booking data
|
|
@@ -46,7 +46,7 @@ async function main() {
|
|
|
46
46
|
title: "Book Hotel",
|
|
47
47
|
description: "Collects hotel booking information",
|
|
48
48
|
conditions: ["User wants to book a hotel"],
|
|
49
|
-
|
|
49
|
+
schema: {
|
|
50
50
|
type: "object",
|
|
51
51
|
properties: {
|
|
52
52
|
hotelName: { type: "string" },
|
|
@@ -56,46 +56,47 @@ async function main() {
|
|
|
56
56
|
required: ["hotelName", "date", "guests"],
|
|
57
57
|
},
|
|
58
58
|
// Configure completion message at route level
|
|
59
|
-
|
|
60
|
-
|
|
59
|
+
endStep: {
|
|
60
|
+
instructions:
|
|
61
|
+
"Confirm the booking with a summary of the hotel, date, and number of guests. Be enthusiastic!",
|
|
61
62
|
},
|
|
62
63
|
// Option 1: Simple string
|
|
63
64
|
onComplete: "Collect Feedback",
|
|
64
65
|
// Option 2: Object with condition
|
|
65
66
|
// onComplete: {
|
|
66
|
-
//
|
|
67
|
+
// nextStep: "Collect Feedback",
|
|
67
68
|
// condition: "if booking was successful"
|
|
68
69
|
// },
|
|
69
70
|
// Option 3: Function with logic
|
|
70
71
|
// onComplete: (session) => {
|
|
71
|
-
// if (session.
|
|
72
|
+
// if (session.data?.guests && session.data.guests > 5) {
|
|
72
73
|
// return "VIP Feedback"; // Different feedback for large groups
|
|
73
74
|
// }
|
|
74
75
|
// return "Collect Feedback";
|
|
75
76
|
// },
|
|
76
77
|
});
|
|
77
78
|
|
|
78
|
-
const askHotel = bookingRoute.
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
skipIf: (
|
|
79
|
+
const askHotel = bookingRoute.initialStep.nextStep({
|
|
80
|
+
instructions: "Ask which hotel they want to book",
|
|
81
|
+
collect: ["hotelName"],
|
|
82
|
+
skipIf: (data) => !!data.hotelName,
|
|
82
83
|
});
|
|
83
84
|
|
|
84
|
-
const askDate = askHotel.
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
skipIf: (
|
|
85
|
+
const askDate = askHotel.nextStep({
|
|
86
|
+
instructions: "Ask for the booking date",
|
|
87
|
+
collect: ["date"],
|
|
88
|
+
skipIf: (data) => !!data.date,
|
|
88
89
|
});
|
|
89
90
|
|
|
90
|
-
const askGuests = askDate.
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
skipIf: (
|
|
91
|
+
const askGuests = askDate.nextStep({
|
|
92
|
+
instructions: "Ask for the number of guests",
|
|
93
|
+
collect: ["guests"],
|
|
94
|
+
skipIf: (data) => !!data.guests,
|
|
94
95
|
});
|
|
95
96
|
|
|
96
|
-
// No need to specify
|
|
97
|
-
askGuests.
|
|
98
|
-
|
|
97
|
+
// No need to specify instructions here - using route-level endStep configuration
|
|
98
|
+
askGuests.nextStep({
|
|
99
|
+
step: END_ROUTE,
|
|
99
100
|
});
|
|
100
101
|
|
|
101
102
|
// Route 2: Feedback Collection
|
|
@@ -103,7 +104,7 @@ async function main() {
|
|
|
103
104
|
title: "Collect Feedback",
|
|
104
105
|
description: "Collects user feedback after booking",
|
|
105
106
|
conditions: ["User wants to provide feedback"],
|
|
106
|
-
|
|
107
|
+
schema: {
|
|
107
108
|
type: "object",
|
|
108
109
|
properties: {
|
|
109
110
|
rating: { type: "number" },
|
|
@@ -112,31 +113,32 @@ async function main() {
|
|
|
112
113
|
required: ["rating"],
|
|
113
114
|
},
|
|
114
115
|
// Configure completion message for feedback route
|
|
115
|
-
|
|
116
|
-
|
|
116
|
+
endStep: {
|
|
117
|
+
instructions:
|
|
118
|
+
"Thank the user warmly for their feedback and let them know their input is valuable",
|
|
117
119
|
},
|
|
118
120
|
});
|
|
119
121
|
|
|
120
|
-
const askRating = feedbackRoute.
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
skipIf: (
|
|
122
|
+
const askRating = feedbackRoute.initialStep.nextStep({
|
|
123
|
+
instructions: "Ask for rating from 1 to 5",
|
|
124
|
+
collect: ["rating"],
|
|
125
|
+
skipIf: (data) => !!data.rating,
|
|
124
126
|
});
|
|
125
127
|
|
|
126
|
-
const askComments = askRating.
|
|
127
|
-
|
|
128
|
-
|
|
128
|
+
const askComments = askRating.nextStep({
|
|
129
|
+
instructions: "Ask for any additional comments (optional)",
|
|
130
|
+
collect: ["comments"],
|
|
129
131
|
});
|
|
130
132
|
|
|
131
|
-
// No need to specify
|
|
132
|
-
askComments.
|
|
133
|
-
|
|
133
|
+
// No need to specify instructions here - using route-level endStep configuration
|
|
134
|
+
askComments.nextStep({
|
|
135
|
+
step: END_ROUTE,
|
|
134
136
|
});
|
|
135
137
|
|
|
136
138
|
console.log("\n=== Route Transitions Example ===\n");
|
|
137
139
|
|
|
138
140
|
// Conversation 1: User provides all booking info at once
|
|
139
|
-
let session:
|
|
141
|
+
let session: SessionStep | undefined;
|
|
140
142
|
let history = [
|
|
141
143
|
createMessageEvent(
|
|
142
144
|
EventSource.CUSTOMER,
|
|
@@ -155,12 +157,15 @@ async function main() {
|
|
|
155
157
|
"Pending transition?",
|
|
156
158
|
response1.session?.pendingTransition?.targetRouteId
|
|
157
159
|
);
|
|
158
|
-
console.log("
|
|
160
|
+
console.log("Data booking data:", response1.session?.data);
|
|
159
161
|
|
|
160
162
|
session = response1.session;
|
|
161
163
|
history = [
|
|
162
164
|
...history,
|
|
163
|
-
{
|
|
165
|
+
{
|
|
166
|
+
...createMessageEvent(EventSource.AI_AGENT, "Bot", response1.message),
|
|
167
|
+
id: "2",
|
|
168
|
+
},
|
|
164
169
|
];
|
|
165
170
|
|
|
166
171
|
// Second response - should auto-transition to a feedback route
|
|
@@ -178,7 +183,10 @@ async function main() {
|
|
|
178
183
|
session = response2.session;
|
|
179
184
|
history = [
|
|
180
185
|
...history,
|
|
181
|
-
{
|
|
186
|
+
{
|
|
187
|
+
...createMessageEvent(EventSource.AI_AGENT, "Bot", response2.message),
|
|
188
|
+
id: "4",
|
|
189
|
+
},
|
|
182
190
|
];
|
|
183
191
|
|
|
184
192
|
// Third response - provide rating
|
|
@@ -195,13 +203,13 @@ async function main() {
|
|
|
195
203
|
const response3 = await agent.respond({ history, session });
|
|
196
204
|
console.log("\nBot:", response3.message);
|
|
197
205
|
console.log("Current route:", response3.session?.currentRoute?.title);
|
|
198
|
-
console.log("
|
|
206
|
+
console.log("Data feedback data:", response3.session?.data);
|
|
199
207
|
console.log("Route complete?", response3.isRouteComplete);
|
|
200
208
|
|
|
201
209
|
console.log("\n=== Manual Transition Example ===\n");
|
|
202
210
|
|
|
203
|
-
// Demonstrate manual transition using agent.
|
|
204
|
-
let session2:
|
|
211
|
+
// Demonstrate manual transition using agent.nextStepRoute()
|
|
212
|
+
let session2: SessionStep | undefined;
|
|
205
213
|
let history2 = [
|
|
206
214
|
createMessageEvent(
|
|
207
215
|
EventSource.CUSTOMER,
|
|
@@ -212,14 +220,17 @@ async function main() {
|
|
|
212
220
|
|
|
213
221
|
console.log("User:", history2[0].data.message);
|
|
214
222
|
|
|
215
|
-
const manualResponse = await agent.respond({
|
|
223
|
+
const manualResponse = await agent.respond({
|
|
224
|
+
history: history2,
|
|
225
|
+
session: session2,
|
|
226
|
+
});
|
|
216
227
|
console.log("\nBot:", manualResponse.message);
|
|
217
228
|
console.log("Route complete?", manualResponse.isRouteComplete);
|
|
218
229
|
|
|
219
230
|
if (manualResponse.isRouteComplete && manualResponse.session) {
|
|
220
231
|
// Manually trigger transition instead of auto-transition
|
|
221
232
|
console.log("\n[Manually transitioning to feedback route...]");
|
|
222
|
-
session2 = agent.
|
|
233
|
+
session2 = agent.nextStepRoute("Collect Feedback", manualResponse.session);
|
|
223
234
|
console.log(
|
|
224
235
|
"Pending transition set:",
|
|
225
236
|
session2.pendingTransition?.targetRouteId
|
|
@@ -227,13 +238,26 @@ async function main() {
|
|
|
227
238
|
|
|
228
239
|
history2 = [
|
|
229
240
|
...history2,
|
|
230
|
-
{
|
|
241
|
+
{
|
|
242
|
+
...createMessageEvent(
|
|
243
|
+
EventSource.AI_AGENT,
|
|
244
|
+
"Bot",
|
|
245
|
+
manualResponse.message
|
|
246
|
+
),
|
|
247
|
+
id: "2",
|
|
248
|
+
},
|
|
231
249
|
createMessageEvent(EventSource.CUSTOMER, "Bob", "Great!"),
|
|
232
250
|
];
|
|
233
251
|
|
|
234
|
-
const feedbackResponse = await agent.respond({
|
|
252
|
+
const feedbackResponse = await agent.respond({
|
|
253
|
+
history: history2,
|
|
254
|
+
session: session2,
|
|
255
|
+
});
|
|
235
256
|
console.log("\nBot:", feedbackResponse.message);
|
|
236
|
-
console.log(
|
|
257
|
+
console.log(
|
|
258
|
+
"Current route:",
|
|
259
|
+
feedbackResponse.session?.currentRoute?.title
|
|
260
|
+
);
|
|
237
261
|
}
|
|
238
262
|
|
|
239
263
|
console.log("\n=== Done ===\n");
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Rules & Prohibitions Example
|
|
3
|
-
* Updated for v2 architecture with session
|
|
3
|
+
* Updated for v2 architecture with session step management
|
|
4
4
|
*
|
|
5
5
|
* Demonstrates how to use rules and prohibitions to control agent behavior
|
|
6
6
|
* in different conversation routes (e.g., WhatsApp bot with different styles)
|
|
@@ -12,7 +12,7 @@ import {
|
|
|
12
12
|
type MessageEventData,
|
|
13
13
|
EventKind,
|
|
14
14
|
EventSource,
|
|
15
|
-
|
|
15
|
+
END_ROUTE,
|
|
16
16
|
} from "../src";
|
|
17
17
|
import { OpenAIProvider } from "../src/providers/OpenAIProvider";
|
|
18
18
|
|
|
@@ -99,26 +99,26 @@ agent.createRoute({
|
|
|
99
99
|
],
|
|
100
100
|
});
|
|
101
101
|
|
|
102
|
-
// Add a
|
|
102
|
+
// Add a stepful feedback flow to the Technical Support route
|
|
103
103
|
const techSupportRoute = agent
|
|
104
104
|
.getRoutes()
|
|
105
105
|
.find((r) => r.title === "Technical Support")!;
|
|
106
|
-
techSupportRoute.
|
|
107
|
-
.
|
|
108
|
-
|
|
106
|
+
techSupportRoute.initialStep
|
|
107
|
+
.nextStep({
|
|
108
|
+
instructions: "Provide step-by-step technical assistance.",
|
|
109
109
|
})
|
|
110
|
-
.
|
|
111
|
-
|
|
112
|
-
|
|
110
|
+
.nextStep({
|
|
111
|
+
instructions: "Ask for a rating of the support provided (1-5).",
|
|
112
|
+
collect: ["feedbackRating"],
|
|
113
113
|
})
|
|
114
|
-
.
|
|
115
|
-
|
|
116
|
-
|
|
114
|
+
.nextStep({
|
|
115
|
+
instructions: "Ask for any additional comments.",
|
|
116
|
+
collect: ["feedbackComments"],
|
|
117
117
|
})
|
|
118
|
-
.
|
|
119
|
-
|
|
118
|
+
.nextStep({
|
|
119
|
+
instructions: "Thank the user for their feedback.",
|
|
120
120
|
})
|
|
121
|
-
.
|
|
121
|
+
.nextStep({ step: END_ROUTE });
|
|
122
122
|
|
|
123
123
|
agent.createRoute({
|
|
124
124
|
title: "Emergency Support",
|
|
@@ -231,26 +231,26 @@ async function demonstrateRulesAndProhibitions() {
|
|
|
231
231
|
],
|
|
232
232
|
});
|
|
233
233
|
|
|
234
|
-
// Add a
|
|
234
|
+
// Add a stepful feedback flow to the Technical Support route
|
|
235
235
|
const techSupportRoute = agent
|
|
236
236
|
.getRoutes()
|
|
237
237
|
.find((r) => r.title === "Technical Support")!;
|
|
238
|
-
techSupportRoute.
|
|
239
|
-
.
|
|
240
|
-
|
|
238
|
+
techSupportRoute.initialStep
|
|
239
|
+
.nextStep({
|
|
240
|
+
instructions: "Provide step-by-step technical assistance.",
|
|
241
241
|
})
|
|
242
|
-
.
|
|
243
|
-
|
|
244
|
-
|
|
242
|
+
.nextStep({
|
|
243
|
+
instructions: "Ask for a rating of the support provided (1-5).",
|
|
244
|
+
collect: ["feedbackRating"],
|
|
245
245
|
})
|
|
246
|
-
.
|
|
247
|
-
|
|
248
|
-
|
|
246
|
+
.nextStep({
|
|
247
|
+
instructions: "Ask for any additional comments.",
|
|
248
|
+
collect: ["feedbackComments"],
|
|
249
249
|
})
|
|
250
|
-
.
|
|
251
|
-
|
|
250
|
+
.nextStep({
|
|
251
|
+
instructions: "Thank the user for their feedback.",
|
|
252
252
|
})
|
|
253
|
-
.
|
|
253
|
+
.nextStep({ step: END_ROUTE });
|
|
254
254
|
|
|
255
255
|
agent.createRoute({
|
|
256
256
|
title: "Emergency Support",
|