@falai/agent 0.6.9 ā 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 OpenSearch for Persistence with Session
|
|
2
|
+
* Example: Using OpenSearch for Persistence with Session Step
|
|
3
3
|
*
|
|
4
4
|
* OpenSearch provides powerful persistence with:
|
|
5
5
|
* - Full-text search across conversations
|
|
6
|
-
* - Analytics and aggregations on
|
|
6
|
+
* - Analytics and aggregations on collected data
|
|
7
7
|
* - Time-series analysis of sessions
|
|
8
8
|
* - Compatible with Elasticsearch 7.x
|
|
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 { Client } from "@opensearch-project/opensearch";
|
|
@@ -92,7 +92,7 @@ async function example() {
|
|
|
92
92
|
},
|
|
93
93
|
persistence: {
|
|
94
94
|
adapter,
|
|
95
|
-
autoSave: true, // Auto-save session
|
|
95
|
+
autoSave: true, // Auto-save session step with collected data
|
|
96
96
|
userId,
|
|
97
97
|
},
|
|
98
98
|
});
|
|
@@ -106,7 +106,7 @@ async function example() {
|
|
|
106
106
|
"User reports an issue or problem",
|
|
107
107
|
"User is dissatisfied",
|
|
108
108
|
],
|
|
109
|
-
|
|
109
|
+
schema: {
|
|
110
110
|
type: "object",
|
|
111
111
|
properties: {
|
|
112
112
|
category: {
|
|
@@ -136,37 +136,37 @@ async function example() {
|
|
|
136
136
|
},
|
|
137
137
|
});
|
|
138
138
|
|
|
139
|
-
//
|
|
140
|
-
complaintRoute.
|
|
141
|
-
.
|
|
142
|
-
|
|
143
|
-
|
|
139
|
+
// Step flow
|
|
140
|
+
complaintRoute.initialStep
|
|
141
|
+
.nextStep({
|
|
142
|
+
instructions: "Understand the complaint",
|
|
143
|
+
collect: ["category", "severity", "description"],
|
|
144
144
|
skipIf: (data) => !!data.description,
|
|
145
145
|
})
|
|
146
|
-
.
|
|
147
|
-
|
|
148
|
-
|
|
146
|
+
.nextStep({
|
|
147
|
+
instructions: "Identify affected service",
|
|
148
|
+
collect: ["affectedService"],
|
|
149
149
|
skipIf: (data) => !!data.affectedService,
|
|
150
|
-
|
|
150
|
+
requires: ["description"],
|
|
151
151
|
})
|
|
152
|
-
.
|
|
153
|
-
|
|
154
|
-
|
|
152
|
+
.nextStep({
|
|
153
|
+
instructions: "Ask for desired resolution",
|
|
154
|
+
collect: ["requestedResolution"],
|
|
155
155
|
skipIf: (data) => !!data.requestedResolution,
|
|
156
|
-
|
|
156
|
+
requires: ["category", "description"],
|
|
157
157
|
})
|
|
158
|
-
.
|
|
159
|
-
|
|
160
|
-
|
|
158
|
+
.nextStep({
|
|
159
|
+
instructions: "Propose solution and close complaint",
|
|
160
|
+
requires: ["category", "description"],
|
|
161
161
|
})
|
|
162
|
-
.
|
|
162
|
+
.nextStep({ step: END_ROUTE });
|
|
163
163
|
|
|
164
164
|
const persistence = agent.getPersistenceManager();
|
|
165
165
|
if (!persistence) return;
|
|
166
166
|
|
|
167
|
-
// Create session with
|
|
168
|
-
const { sessionData,
|
|
169
|
-
await persistence.
|
|
167
|
+
// Create session with step
|
|
168
|
+
const { sessionData, sessionStep } =
|
|
169
|
+
await persistence.createSessionWithStep<ComplaintData>({
|
|
170
170
|
userId,
|
|
171
171
|
agentName: "Customer Service Agent",
|
|
172
172
|
initialData: {
|
|
@@ -178,7 +178,7 @@ async function example() {
|
|
|
178
178
|
|
|
179
179
|
// Conversation flow
|
|
180
180
|
const history: Event<MessageEventData>[] = [];
|
|
181
|
-
let session =
|
|
181
|
+
let session = sessionStep;
|
|
182
182
|
|
|
183
183
|
// Turn 1
|
|
184
184
|
console.log("\n--- Turn 1 ---");
|
|
@@ -192,7 +192,7 @@ async function example() {
|
|
|
192
192
|
const response1 = await agent.respond({ history, session });
|
|
193
193
|
|
|
194
194
|
console.log("š¤ Agent:", response1.message);
|
|
195
|
-
console.log("š
|
|
195
|
+
console.log("š Data:", response1.session?.data);
|
|
196
196
|
|
|
197
197
|
await persistence.saveMessage({
|
|
198
198
|
sessionId: sessionData.id,
|
|
@@ -206,7 +206,7 @@ async function example() {
|
|
|
206
206
|
role: "agent",
|
|
207
207
|
content: response1.message,
|
|
208
208
|
route: response1.session?.currentRoute?.id,
|
|
209
|
-
|
|
209
|
+
step: response1.session?.currentStep?.id,
|
|
210
210
|
});
|
|
211
211
|
|
|
212
212
|
session = response1.session!;
|
|
@@ -227,7 +227,7 @@ async function example() {
|
|
|
227
227
|
const response2 = await agent.respond({ history, session });
|
|
228
228
|
|
|
229
229
|
console.log("š¤ Agent:", response2.message);
|
|
230
|
-
console.log("š
|
|
230
|
+
console.log("š Data:", response2.session?.data);
|
|
231
231
|
|
|
232
232
|
await persistence.saveMessage({
|
|
233
233
|
sessionId: sessionData.id,
|
|
@@ -243,20 +243,18 @@ async function example() {
|
|
|
243
243
|
|
|
244
244
|
if (response2.isRouteComplete) {
|
|
245
245
|
console.log("\nā
Complaint route complete!");
|
|
246
|
-
await createSupportTicket(
|
|
247
|
-
agent.getExtractedData(session.id) as ComplaintData
|
|
248
|
-
);
|
|
246
|
+
await createSupportTicket(agent.getData(session.id) as ComplaintData);
|
|
249
247
|
}
|
|
250
248
|
|
|
251
249
|
// Load session from OpenSearch
|
|
252
250
|
console.log("\n--- Loading Session from OpenSearch ---");
|
|
253
|
-
const loadedSession = await persistence.
|
|
251
|
+
const loadedSession = await persistence.loadSessionStep<ComplaintData>(
|
|
254
252
|
sessionData.id
|
|
255
253
|
);
|
|
256
254
|
|
|
257
255
|
console.log("š„ Loaded session:", {
|
|
258
256
|
currentRoute: loadedSession?.currentRoute?.title,
|
|
259
|
-
|
|
257
|
+
data: loadedSession?.data,
|
|
260
258
|
});
|
|
261
259
|
|
|
262
260
|
// Demonstrate full-text search
|
|
@@ -306,7 +304,7 @@ async function example() {
|
|
|
306
304
|
}
|
|
307
305
|
|
|
308
306
|
/**
|
|
309
|
-
* Advanced Example: Search and Analytics on
|
|
307
|
+
* Advanced Example: Search and Analytics on Collected data
|
|
310
308
|
*/
|
|
311
309
|
async function analyticsExample() {
|
|
312
310
|
const client = new Client({
|
|
@@ -346,7 +344,7 @@ async function analyticsExample() {
|
|
|
346
344
|
|
|
347
345
|
const ticketRoute = agent.createRoute<TicketData>({
|
|
348
346
|
title: "Analyze Support Ticket",
|
|
349
|
-
|
|
347
|
+
schema: {
|
|
350
348
|
type: "object",
|
|
351
349
|
properties: {
|
|
352
350
|
ticketType: { type: "string" },
|
|
@@ -360,17 +358,17 @@ async function analyticsExample() {
|
|
|
360
358
|
},
|
|
361
359
|
});
|
|
362
360
|
|
|
363
|
-
ticketRoute.
|
|
364
|
-
|
|
365
|
-
|
|
361
|
+
ticketRoute.initialStep.nextStep({
|
|
362
|
+
instructions: "Analyze and categorize ticket",
|
|
363
|
+
collect: ["ticketType", "priority", "tags"],
|
|
366
364
|
});
|
|
367
365
|
|
|
368
366
|
const persistence = agent.getPersistenceManager()!;
|
|
369
367
|
|
|
370
368
|
// Create multiple sessions
|
|
371
369
|
for (let i = 0; i < 3; i++) {
|
|
372
|
-
const { sessionData,
|
|
373
|
-
await persistence.
|
|
370
|
+
const { sessionData, sessionStep } =
|
|
371
|
+
await persistence.createSessionWithStep<TicketData>({
|
|
374
372
|
userId: "analyst_001",
|
|
375
373
|
agentName: "Support Analyzer",
|
|
376
374
|
});
|
|
@@ -385,7 +383,7 @@ async function analyticsExample() {
|
|
|
385
383
|
}`
|
|
386
384
|
),
|
|
387
385
|
],
|
|
388
|
-
session:
|
|
386
|
+
session: sessionStep,
|
|
389
387
|
});
|
|
390
388
|
|
|
391
389
|
await persistence.saveMessage({
|
|
@@ -410,14 +408,14 @@ async function analyticsExample() {
|
|
|
410
408
|
`š Total sessions indexed: ${allSessions.body.hits.total.value}`
|
|
411
409
|
);
|
|
412
410
|
|
|
413
|
-
// Analyze
|
|
414
|
-
console.log("\n--- Analyze
|
|
411
|
+
// Analyze collected data patterns
|
|
412
|
+
console.log("\n--- Analyze Collected data ---");
|
|
415
413
|
const sessions = allSessions.body.hits.hits;
|
|
416
414
|
|
|
417
415
|
sessions.forEach((hit: any) => {
|
|
418
416
|
const collectedData = hit._source.collectedData;
|
|
419
417
|
console.log(`Session ${hit._id}:`, {
|
|
420
|
-
|
|
418
|
+
data: collectedData?.data,
|
|
421
419
|
route: hit._source.currentRoute,
|
|
422
420
|
});
|
|
423
421
|
});
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Persistent multi-turn onboarding agent example
|
|
3
|
-
* Updated for v2 architecture with session
|
|
3
|
+
* Updated for v2 architecture with session step management and schema-first data extraction
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import {
|
|
7
7
|
Agent,
|
|
8
8
|
defineTool,
|
|
9
9
|
GeminiProvider,
|
|
10
|
-
|
|
10
|
+
END_ROUTE,
|
|
11
11
|
EventSource,
|
|
12
12
|
createMessageEvent,
|
|
13
13
|
createSession,
|
|
@@ -100,25 +100,24 @@ async function createPersistentOnboardingAgent(sessionId: string) {
|
|
|
100
100
|
|
|
101
101
|
// Define lifecycle hooks for automatic persistence
|
|
102
102
|
const hooks = {
|
|
103
|
-
// Called after data extraction - validate and enrich
|
|
104
|
-
|
|
105
|
-
console.log("š Processing
|
|
103
|
+
// Called after data extraction - validate and enrich collected data
|
|
104
|
+
onDataUpdate: async (data: Partial<OnboardingData>) => {
|
|
105
|
+
console.log("š Processing collected data...");
|
|
106
106
|
|
|
107
|
-
// Update completed steps based on what's been
|
|
107
|
+
// Update completed steps based on what's been data
|
|
108
108
|
const completedSteps: string[] = [];
|
|
109
|
-
if (
|
|
110
|
-
if (
|
|
111
|
-
|
|
112
|
-
if (
|
|
113
|
-
if (extracted.contactEmail) completedSteps.push("contact");
|
|
109
|
+
if (data.businessName) completedSteps.push("business_info");
|
|
110
|
+
if (data.businessDescription) completedSteps.push("business_description");
|
|
111
|
+
if (data.industry) completedSteps.push("industry");
|
|
112
|
+
if (data.contactEmail) completedSteps.push("contact");
|
|
114
113
|
|
|
115
114
|
// Persist to database
|
|
116
115
|
await db.sessions.update(sessionId, {
|
|
117
|
-
collectedData:
|
|
116
|
+
collectedData: data,
|
|
118
117
|
completedSteps,
|
|
119
118
|
});
|
|
120
119
|
|
|
121
|
-
return
|
|
120
|
+
return data;
|
|
122
121
|
},
|
|
123
122
|
};
|
|
124
123
|
|
|
@@ -244,7 +243,7 @@ async function createPersistentOnboardingAgent(sessionId: string) {
|
|
|
244
243
|
title: "Business Onboarding",
|
|
245
244
|
description: "Guide user through business information collection",
|
|
246
245
|
conditions: ["User is onboarding their business"],
|
|
247
|
-
|
|
246
|
+
schema: {
|
|
248
247
|
type: "object",
|
|
249
248
|
properties: {
|
|
250
249
|
businessName: {
|
|
@@ -266,55 +265,55 @@ async function createPersistentOnboardingAgent(sessionId: string) {
|
|
|
266
265
|
},
|
|
267
266
|
required: ["businessName", "businessDescription"],
|
|
268
267
|
},
|
|
269
|
-
|
|
270
|
-
|
|
268
|
+
endStep: {
|
|
269
|
+
instructions:
|
|
270
|
+
"Summarize all collected information warmly and confirm onboarding is complete",
|
|
271
271
|
},
|
|
272
272
|
});
|
|
273
273
|
|
|
274
|
-
//
|
|
275
|
-
const
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
skipIf: (
|
|
279
|
-
!!extracted.businessName && !!extracted.businessDescription,
|
|
274
|
+
// Step 1: Collect business name and description
|
|
275
|
+
const collectBusinessInfo = onboardingRoute.initialStep.nextStep({
|
|
276
|
+
instructions: "Ask for business name and a brief description",
|
|
277
|
+
collect: ["businessName", "businessDescription"],
|
|
278
|
+
skipIf: (data) => !!data.businessName && !!data.businessDescription,
|
|
280
279
|
condition: "Need to collect basic business information first",
|
|
281
280
|
});
|
|
282
281
|
|
|
283
|
-
//
|
|
284
|
-
const saveBusiness =
|
|
285
|
-
|
|
286
|
-
|
|
282
|
+
// Step 2: Save business info (tool execution)
|
|
283
|
+
const saveBusiness = collectBusinessInfo.nextStep({
|
|
284
|
+
tool: saveBusinessInfo,
|
|
285
|
+
requires: ["businessName", "businessDescription"],
|
|
287
286
|
condition: "Business name and description provided, save to database",
|
|
288
287
|
});
|
|
289
288
|
|
|
290
|
-
//
|
|
291
|
-
const
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
skipIf: (
|
|
289
|
+
// Step 3: Collect industry
|
|
290
|
+
const collectIndustry = saveBusiness.nextStep({
|
|
291
|
+
instructions: "Ask what industry the business operates in",
|
|
292
|
+
collect: ["industry"],
|
|
293
|
+
skipIf: (data) => !!data.industry,
|
|
295
294
|
});
|
|
296
295
|
|
|
297
|
-
//
|
|
298
|
-
const saveIndustryStep =
|
|
299
|
-
|
|
300
|
-
|
|
296
|
+
// Step 4: Save industry (tool execution)
|
|
297
|
+
const saveIndustryStep = collectIndustry.nextStep({
|
|
298
|
+
tool: saveIndustry,
|
|
299
|
+
requires: ["industry"],
|
|
301
300
|
});
|
|
302
301
|
|
|
303
|
-
//
|
|
304
|
-
const
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
skipIf: (
|
|
302
|
+
// Step 5: Collect contact email
|
|
303
|
+
const collectContact = saveIndustryStep.nextStep({
|
|
304
|
+
instructions: "Ask for their contact email",
|
|
305
|
+
collect: ["contactEmail"],
|
|
306
|
+
skipIf: (data) => !!data.contactEmail,
|
|
308
307
|
});
|
|
309
308
|
|
|
310
|
-
//
|
|
311
|
-
const saveContact =
|
|
312
|
-
|
|
313
|
-
|
|
309
|
+
// Step 6: Save contact (tool execution)
|
|
310
|
+
const saveContact = collectContact.nextStep({
|
|
311
|
+
tool: saveContactEmail,
|
|
312
|
+
requires: ["contactEmail"],
|
|
314
313
|
});
|
|
315
314
|
|
|
316
|
-
//
|
|
317
|
-
saveContact.
|
|
315
|
+
// Step 7: Confirmation - uses route-level endStep
|
|
316
|
+
saveContact.nextStep({ step: END_ROUTE });
|
|
318
317
|
|
|
319
318
|
// Guidelines
|
|
320
319
|
onboardingRoute.createGuideline({
|
|
@@ -415,7 +414,7 @@ async function main() {
|
|
|
415
414
|
|
|
416
415
|
console.log("=== MULTI-TURN CONVERSATION SIMULATION ===\n");
|
|
417
416
|
|
|
418
|
-
// Initialize session
|
|
417
|
+
// Initialize session step for multi-turn conversation
|
|
419
418
|
let session = createSession<OnboardingData>();
|
|
420
419
|
|
|
421
420
|
// Turn 1: Start onboarding
|
|
@@ -431,7 +430,7 @@ async function main() {
|
|
|
431
430
|
session,
|
|
432
431
|
});
|
|
433
432
|
console.log("š¤ Bot:", response1.message);
|
|
434
|
-
console.log("š
|
|
433
|
+
console.log("š Data after turn 1:", response1.session?.data);
|
|
435
434
|
console.log("š Route:", response1.session?.currentRoute?.title);
|
|
436
435
|
|
|
437
436
|
// Check route completion after turn 1
|
|
@@ -464,7 +463,7 @@ async function main() {
|
|
|
464
463
|
];
|
|
465
464
|
const response2 = await agent.respond({ history: history2, session });
|
|
466
465
|
console.log("š¤ Bot:", response2.message);
|
|
467
|
-
console.log("š
|
|
466
|
+
console.log("š Data after turn 2:", response2.session?.data);
|
|
468
467
|
|
|
469
468
|
// Check route completion after turn 2
|
|
470
469
|
console.log("š Route Completion Check (Turn 2):");
|
|
@@ -492,7 +491,7 @@ async function main() {
|
|
|
492
491
|
];
|
|
493
492
|
const response3 = await agent.respond({ history: history3, session });
|
|
494
493
|
console.log("š¤ Bot:", response3.message);
|
|
495
|
-
console.log("š
|
|
494
|
+
console.log("š Data after turn 3:", response3.session?.data);
|
|
496
495
|
|
|
497
496
|
// Check route completion after turn 3
|
|
498
497
|
console.log("š Route Completion Check (Turn 3):");
|
|
@@ -520,13 +519,13 @@ async function main() {
|
|
|
520
519
|
];
|
|
521
520
|
const response4 = await agent.respond({ history: history4, session });
|
|
522
521
|
console.log("š¤ Bot:", response4.message);
|
|
523
|
-
console.log("š
|
|
522
|
+
console.log("š Data after turn 4:", response4.session?.data);
|
|
524
523
|
|
|
525
524
|
// Check for route completion
|
|
526
525
|
if (response4.isRouteComplete) {
|
|
527
526
|
console.log("\nā
Onboarding complete!");
|
|
528
527
|
await finalizeOnboarding(
|
|
529
|
-
agent.
|
|
528
|
+
agent.getData(response4.session?.id) as unknown as OnboardingData
|
|
530
529
|
);
|
|
531
530
|
}
|
|
532
531
|
|
|
@@ -544,17 +543,17 @@ async function main() {
|
|
|
544
543
|
// ============================================================================
|
|
545
544
|
|
|
546
545
|
/*
|
|
547
|
-
* ā
PATTERN 1: Session
|
|
548
|
-
* - createSession<T>(): Initialize typed session
|
|
546
|
+
* ā
PATTERN 1: Session Step Management (Core v2 pattern)
|
|
547
|
+
* - createSession<T>(): Initialize typed session step
|
|
549
548
|
* - Pass session to respond() calls
|
|
550
|
-
* - Session tracks
|
|
549
|
+
* - Session tracks collected data across turns
|
|
551
550
|
* - Always-on routing respects intent changes
|
|
552
551
|
*
|
|
553
552
|
* ā
PATTERN 2: Schema-First Data Extraction
|
|
554
|
-
* -
|
|
553
|
+
* - schema: Define data contracts upfront
|
|
555
554
|
* - Type-safe extraction throughout conversation
|
|
556
|
-
* - skipIf functions for deterministic
|
|
557
|
-
* -
|
|
555
|
+
* - skipIf functions for deterministic step logic
|
|
556
|
+
* - requires arrays for prerequisites
|
|
558
557
|
*
|
|
559
558
|
* ā
PATTERN 3: Context Provider (For external data sources)
|
|
560
559
|
* - contextProvider: Load fresh context from database/API
|
|
@@ -562,19 +561,19 @@ async function main() {
|
|
|
562
561
|
* - Perfect for real-time external data
|
|
563
562
|
*
|
|
564
563
|
* ā
PATTERN 4: Lifecycle Hooks (Data validation & enrichment)
|
|
565
|
-
* -
|
|
566
|
-
* - Validate, enrich, and persist
|
|
567
|
-
* - Return modified
|
|
564
|
+
* - onDataUpdate: Process collected data after extraction
|
|
565
|
+
* - Validate, enrich, and persist collected data
|
|
566
|
+
* - Return modified collected data
|
|
568
567
|
*
|
|
569
568
|
* ā
PATTERN 5: Tool Integration (Enhanced context access)
|
|
570
|
-
* - Tools access
|
|
571
|
-
* - Can return
|
|
569
|
+
* - Tools access collected data via context parameter
|
|
570
|
+
* - Can return dataUpdate to modify collected data
|
|
572
571
|
* - Perfect for data validation and enrichment
|
|
573
572
|
*
|
|
574
|
-
* ā
PATTERN 6:
|
|
573
|
+
* ā
PATTERN 6: Step Progression (Code-based logic)
|
|
575
574
|
* - skipIf: Deterministic functions instead of fuzzy conditions
|
|
576
|
-
* -
|
|
577
|
-
* - No more LLM interpretation of
|
|
575
|
+
* - requires: Prerequisites for step transitions
|
|
576
|
+
* - No more LLM interpretation of step logic
|
|
578
577
|
*/
|
|
579
578
|
|
|
580
579
|
/**
|