@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,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Example: Using Prisma ORM for Persistence with Session
|
|
2
|
+
* Example: Using Prisma ORM for Persistence with Session Step
|
|
3
3
|
*
|
|
4
4
|
* This example shows how to use @falai/agent with Prisma for automatic
|
|
5
|
-
* session
|
|
5
|
+
* session step persistence - with the new data-driven architecture!
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import {
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
PrismaAdapter,
|
|
12
12
|
createMessageEvent,
|
|
13
13
|
EventSource,
|
|
14
|
-
|
|
14
|
+
END_ROUTE,
|
|
15
15
|
} from "../src/index";
|
|
16
16
|
|
|
17
17
|
// @ts-ignore
|
|
@@ -48,7 +48,7 @@ interface ConversationContext {
|
|
|
48
48
|
};
|
|
49
49
|
}
|
|
50
50
|
|
|
51
|
-
//
|
|
51
|
+
// Collected data type for flight booking
|
|
52
52
|
interface FlightBookingData {
|
|
53
53
|
destination: string;
|
|
54
54
|
departureDate: string;
|
|
@@ -57,7 +57,7 @@ interface FlightBookingData {
|
|
|
57
57
|
cabinClass: "economy" | "premium" | "business" | "first";
|
|
58
58
|
}
|
|
59
59
|
|
|
60
|
-
//
|
|
60
|
+
// Collected data type for onboarding
|
|
61
61
|
interface OnboardingData {
|
|
62
62
|
fullName: string;
|
|
63
63
|
email: string;
|
|
@@ -65,7 +65,7 @@ interface OnboardingData {
|
|
|
65
65
|
country: string;
|
|
66
66
|
}
|
|
67
67
|
|
|
68
|
-
//
|
|
68
|
+
// Collected data type for contact form
|
|
69
69
|
interface ContactFormData {
|
|
70
70
|
name: string;
|
|
71
71
|
email: string;
|
|
@@ -96,7 +96,7 @@ async function example() {
|
|
|
96
96
|
// ⨠Just pass the adapter - that's it!
|
|
97
97
|
persistence: {
|
|
98
98
|
adapter: new PrismaAdapter({ prisma }),
|
|
99
|
-
autoSave: true, // Auto-saves session
|
|
99
|
+
autoSave: true, // Auto-saves session step after each response
|
|
100
100
|
userId,
|
|
101
101
|
},
|
|
102
102
|
});
|
|
@@ -111,7 +111,7 @@ async function example() {
|
|
|
111
111
|
"User wants to book a flight",
|
|
112
112
|
"User mentions travel, flying, or booking tickets",
|
|
113
113
|
],
|
|
114
|
-
|
|
114
|
+
schema: {
|
|
115
115
|
type: "object",
|
|
116
116
|
properties: {
|
|
117
117
|
destination: {
|
|
@@ -143,45 +143,45 @@ async function example() {
|
|
|
143
143
|
},
|
|
144
144
|
});
|
|
145
145
|
|
|
146
|
-
//
|
|
147
|
-
const askDestination = flightRoute.
|
|
148
|
-
id: "ask_destination", // Custom
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
skipIf: (
|
|
146
|
+
// Step flow with smart data collecting and custom IDs
|
|
147
|
+
const askDestination = flightRoute.initialStep.nextStep({
|
|
148
|
+
id: "ask_destination", // Custom step ID for easier tracking
|
|
149
|
+
instructions: "Ask where they want to fly",
|
|
150
|
+
collect: ["destination"],
|
|
151
|
+
skipIf: (data) => !!data.destination,
|
|
152
152
|
});
|
|
153
153
|
|
|
154
|
-
const askDates = askDestination.
|
|
155
|
-
id: "ask_dates", // Custom
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
skipIf: (
|
|
159
|
-
|
|
154
|
+
const askDates = askDestination.nextStep({
|
|
155
|
+
id: "ask_dates", // Custom step ID
|
|
156
|
+
instructions: "Ask about travel dates",
|
|
157
|
+
collect: ["departureDate", "returnDate"],
|
|
158
|
+
skipIf: (data) => !!data.departureDate,
|
|
159
|
+
requires: ["destination"],
|
|
160
160
|
});
|
|
161
161
|
|
|
162
|
-
const askPassengers = askDates.
|
|
163
|
-
id: "ask_passengers", // Custom
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
skipIf: (
|
|
167
|
-
|
|
162
|
+
const askPassengers = askDates.nextStep({
|
|
163
|
+
id: "ask_passengers", // Custom step ID
|
|
164
|
+
instructions: "Ask how many passengers",
|
|
165
|
+
collect: ["passengers"],
|
|
166
|
+
skipIf: (data) => !!data.passengers,
|
|
167
|
+
requires: ["destination", "departureDate"],
|
|
168
168
|
});
|
|
169
169
|
|
|
170
|
-
const askCabinClass = askPassengers.
|
|
171
|
-
id: "ask_cabin_class", // Custom
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
skipIf: (
|
|
175
|
-
|
|
170
|
+
const askCabinClass = askPassengers.nextStep({
|
|
171
|
+
id: "ask_cabin_class", // Custom step ID
|
|
172
|
+
instructions: "Ask about cabin class preference",
|
|
173
|
+
collect: ["cabinClass"],
|
|
174
|
+
skipIf: (data) => !!data.cabinClass,
|
|
175
|
+
requires: ["destination", "departureDate", "passengers"],
|
|
176
176
|
});
|
|
177
177
|
|
|
178
|
-
const confirmBooking = askCabinClass.
|
|
179
|
-
id: "confirm_booking", // Custom
|
|
180
|
-
|
|
181
|
-
|
|
178
|
+
const confirmBooking = askCabinClass.nextStep({
|
|
179
|
+
id: "confirm_booking", // Custom step ID
|
|
180
|
+
instructions: "Present options and confirm booking details",
|
|
181
|
+
requires: ["destination", "departureDate", "passengers", "cabinClass"],
|
|
182
182
|
});
|
|
183
183
|
|
|
184
|
-
confirmBooking.
|
|
184
|
+
confirmBooking.nextStep({ step: END_ROUTE });
|
|
185
185
|
|
|
186
186
|
/**
|
|
187
187
|
* Get persistence manager from agent
|
|
@@ -196,7 +196,7 @@ async function example() {
|
|
|
196
196
|
* Create or find a session - New Pattern!
|
|
197
197
|
*/
|
|
198
198
|
let sessionResult =
|
|
199
|
-
await persistence.
|
|
199
|
+
await persistence.createSessionWithStep<FlightBookingData>({
|
|
200
200
|
userId,
|
|
201
201
|
agentName: "Travel Assistant",
|
|
202
202
|
initialData: {
|
|
@@ -204,7 +204,7 @@ async function example() {
|
|
|
204
204
|
},
|
|
205
205
|
});
|
|
206
206
|
|
|
207
|
-
let session = sessionResult.
|
|
207
|
+
let session = sessionResult.sessionStep;
|
|
208
208
|
const dbSessionId = sessionResult.sessionData.id;
|
|
209
209
|
|
|
210
210
|
console.log("⨠Created new session:", dbSessionId);
|
|
@@ -212,9 +212,9 @@ async function example() {
|
|
|
212
212
|
sessionId: session.metadata?.sessionId, // Same as dbSessionId
|
|
213
213
|
createdAt: session.metadata?.createdAt,
|
|
214
214
|
});
|
|
215
|
-
console.log("š Initial session
|
|
215
|
+
console.log("š Initial session step:", {
|
|
216
216
|
currentRoute: session.currentRoute,
|
|
217
|
-
|
|
217
|
+
data: session.data,
|
|
218
218
|
});
|
|
219
219
|
|
|
220
220
|
/**
|
|
@@ -237,16 +237,16 @@ async function example() {
|
|
|
237
237
|
|
|
238
238
|
const response1 = await agent.respond({
|
|
239
239
|
history,
|
|
240
|
-
session, // Pass session
|
|
240
|
+
session, // Pass session step
|
|
241
241
|
});
|
|
242
242
|
|
|
243
243
|
console.log("š¤ Agent:", response1.message);
|
|
244
|
-
console.log("š Session
|
|
244
|
+
console.log("š Session step after turn 1:", {
|
|
245
245
|
sessionId: response1.session?.metadata?.sessionId,
|
|
246
246
|
currentRoute: response1.session?.currentRoute?.title,
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
247
|
+
currentStepId: response1.session?.currentStep?.id, // Custom ID like "ask_destination"
|
|
248
|
+
currentStepDescription: response1.session?.currentStep?.description,
|
|
249
|
+
data: response1.session?.data,
|
|
250
250
|
});
|
|
251
251
|
|
|
252
252
|
// Save user message
|
|
@@ -258,14 +258,14 @@ async function example() {
|
|
|
258
258
|
event: userMessage1,
|
|
259
259
|
});
|
|
260
260
|
|
|
261
|
-
// Save agent message (session
|
|
261
|
+
// Save agent message (session step is auto-saved by Agent!)
|
|
262
262
|
await persistence.saveMessage({
|
|
263
263
|
sessionId: dbSessionId,
|
|
264
264
|
userId,
|
|
265
265
|
role: "agent",
|
|
266
266
|
content: response1.message,
|
|
267
267
|
route: response1.session?.currentRoute?.id,
|
|
268
|
-
|
|
268
|
+
step: response1.session?.currentStep?.id,
|
|
269
269
|
});
|
|
270
270
|
|
|
271
271
|
// Update session for next turn
|
|
@@ -296,10 +296,10 @@ async function example() {
|
|
|
296
296
|
});
|
|
297
297
|
|
|
298
298
|
console.log("š¤ Agent:", response2.message);
|
|
299
|
-
console.log("š Session
|
|
299
|
+
console.log("š Session step after turn 2:", {
|
|
300
300
|
currentRoute: response2.session?.currentRoute?.title,
|
|
301
|
-
|
|
302
|
-
|
|
301
|
+
currentStep: response2.session?.currentStep?.id,
|
|
302
|
+
data: response2.session?.data,
|
|
303
303
|
});
|
|
304
304
|
|
|
305
305
|
// Save messages
|
|
@@ -317,7 +317,7 @@ async function example() {
|
|
|
317
317
|
role: "agent",
|
|
318
318
|
content: response2.message,
|
|
319
319
|
route: response2.session?.currentRoute?.id,
|
|
320
|
-
|
|
320
|
+
step: response2.session?.currentStep?.id,
|
|
321
321
|
});
|
|
322
322
|
|
|
323
323
|
session = response2.session!;
|
|
@@ -325,22 +325,22 @@ async function example() {
|
|
|
325
325
|
if (response2.isRouteComplete) {
|
|
326
326
|
console.log("\nā
Flight booking complete!");
|
|
327
327
|
await sendFlightConfirmation(
|
|
328
|
-
agent.
|
|
328
|
+
agent.getData(session.id) as FlightBookingData
|
|
329
329
|
);
|
|
330
330
|
}
|
|
331
331
|
|
|
332
332
|
/**
|
|
333
|
-
* Load session
|
|
333
|
+
* Load session step from database (demonstrates persistence)
|
|
334
334
|
*/
|
|
335
335
|
console.log("\n--- Loading Session from Database ---");
|
|
336
|
-
const loadedSession = await persistence.
|
|
336
|
+
const loadedSession = await persistence.loadSessionStep<FlightBookingData>(
|
|
337
337
|
dbSessionId
|
|
338
338
|
);
|
|
339
339
|
|
|
340
|
-
console.log("š„ Loaded session
|
|
340
|
+
console.log("š„ Loaded session step:", {
|
|
341
341
|
currentRoute: loadedSession?.currentRoute?.title,
|
|
342
|
-
|
|
343
|
-
|
|
342
|
+
currentStep: loadedSession?.currentStep?.id,
|
|
343
|
+
data: loadedSession?.data,
|
|
344
344
|
});
|
|
345
345
|
|
|
346
346
|
/**
|
|
@@ -365,7 +365,7 @@ async function example() {
|
|
|
365
365
|
}
|
|
366
366
|
|
|
367
367
|
/**
|
|
368
|
-
* Advanced Example: Session
|
|
368
|
+
* Advanced Example: Session Step with Lifecycle Hooks
|
|
369
369
|
*/
|
|
370
370
|
async function advancedExample() {
|
|
371
371
|
const prisma = new PrismaClient();
|
|
@@ -395,26 +395,26 @@ async function advancedExample() {
|
|
|
395
395
|
language: "en",
|
|
396
396
|
},
|
|
397
397
|
},
|
|
398
|
-
// Lifecycle hooks for session
|
|
398
|
+
// Lifecycle hooks for session step enrichment
|
|
399
399
|
hooks: {
|
|
400
|
-
// Enrich
|
|
401
|
-
|
|
402
|
-
console.log("š
|
|
400
|
+
// Enrich collected data before saving
|
|
401
|
+
onDataUpdate: async (data, previous) => {
|
|
402
|
+
console.log("š Collected data updated:", { data, previous });
|
|
403
403
|
|
|
404
404
|
// Normalize phone numbers
|
|
405
|
-
if (
|
|
406
|
-
|
|
405
|
+
if (data.phoneNumber) {
|
|
406
|
+
data.phoneNumber = data.phoneNumber.replace(/\D/g, "");
|
|
407
407
|
}
|
|
408
408
|
|
|
409
409
|
// Validate email
|
|
410
|
-
if (
|
|
410
|
+
if (data.email && !data.email.includes("@")) {
|
|
411
411
|
console.warn("ā ļø Invalid email detected");
|
|
412
412
|
}
|
|
413
413
|
|
|
414
|
-
return
|
|
414
|
+
return data;
|
|
415
415
|
},
|
|
416
416
|
|
|
417
|
-
// Update context when session
|
|
417
|
+
// Update context when session step changes
|
|
418
418
|
onContextUpdate: async (newContext, oldContext) => {
|
|
419
419
|
console.log("š Context updated:", { newContext, oldContext });
|
|
420
420
|
},
|
|
@@ -430,7 +430,7 @@ async function advancedExample() {
|
|
|
430
430
|
const onboardingRoute = agent.createRoute<OnboardingData>({
|
|
431
431
|
title: "User Onboarding",
|
|
432
432
|
description: "Collect user information for account setup",
|
|
433
|
-
|
|
433
|
+
schema: {
|
|
434
434
|
type: "object",
|
|
435
435
|
properties: {
|
|
436
436
|
fullName: { type: "string" },
|
|
@@ -442,36 +442,36 @@ async function advancedExample() {
|
|
|
442
442
|
},
|
|
443
443
|
});
|
|
444
444
|
|
|
445
|
-
onboardingRoute.
|
|
446
|
-
.
|
|
447
|
-
|
|
448
|
-
|
|
445
|
+
onboardingRoute.initialStep
|
|
446
|
+
.nextStep({
|
|
447
|
+
instructions: "Welcome and ask for name",
|
|
448
|
+
collect: ["fullName"],
|
|
449
449
|
skipIf: (data) => !!data.fullName,
|
|
450
450
|
})
|
|
451
|
-
.
|
|
452
|
-
|
|
453
|
-
|
|
451
|
+
.nextStep({
|
|
452
|
+
instructions: "Ask for email",
|
|
453
|
+
collect: ["email"],
|
|
454
454
|
skipIf: (data) => !!data.email,
|
|
455
455
|
})
|
|
456
|
-
.
|
|
457
|
-
|
|
458
|
-
|
|
456
|
+
.nextStep({
|
|
457
|
+
instructions: "Ask for phone number (optional)",
|
|
458
|
+
collect: ["phoneNumber"],
|
|
459
459
|
})
|
|
460
|
-
.
|
|
461
|
-
|
|
462
|
-
|
|
460
|
+
.nextStep({
|
|
461
|
+
instructions: "Ask for country",
|
|
462
|
+
collect: ["country"],
|
|
463
463
|
skipIf: (data) => !!data.country,
|
|
464
464
|
})
|
|
465
|
-
.
|
|
466
|
-
|
|
465
|
+
.nextStep({
|
|
466
|
+
instructions: "Confirm and complete onboarding",
|
|
467
467
|
})
|
|
468
|
-
.
|
|
468
|
+
.nextStep({ step: END_ROUTE });
|
|
469
469
|
|
|
470
470
|
const persistence = agent.getPersistenceManager()!;
|
|
471
471
|
|
|
472
|
-
// Create session with
|
|
473
|
-
const { sessionData,
|
|
474
|
-
await persistence.
|
|
472
|
+
// Create session with step
|
|
473
|
+
const { sessionData, sessionStep } =
|
|
474
|
+
await persistence.createSessionWithStep<OnboardingData>({
|
|
475
475
|
userId,
|
|
476
476
|
agentName: "Onboarding Assistant",
|
|
477
477
|
});
|
|
@@ -480,7 +480,7 @@ async function advancedExample() {
|
|
|
480
480
|
|
|
481
481
|
// Simulate conversation
|
|
482
482
|
const history = [];
|
|
483
|
-
let session =
|
|
483
|
+
let session = sessionStep;
|
|
484
484
|
|
|
485
485
|
const response = await agent.respond({
|
|
486
486
|
history: [
|
|
@@ -490,7 +490,7 @@ async function advancedExample() {
|
|
|
490
490
|
});
|
|
491
491
|
|
|
492
492
|
console.log("š¤ Agent:", response.message);
|
|
493
|
-
console.log("š
|
|
493
|
+
console.log("š Data so far:", response.session?.data);
|
|
494
494
|
|
|
495
495
|
await persistence.saveMessage({
|
|
496
496
|
sessionId: sessionData.id,
|
|
@@ -501,12 +501,10 @@ async function advancedExample() {
|
|
|
501
501
|
|
|
502
502
|
if (response.isRouteComplete) {
|
|
503
503
|
console.log("\nā
Onboarding complete!");
|
|
504
|
-
await sendOnboardingEmail(
|
|
505
|
-
agent.getExtractedData(sessionData.id) as OnboardingData
|
|
506
|
-
);
|
|
504
|
+
await sendOnboardingEmail(agent.getData(sessionData.id) as OnboardingData);
|
|
507
505
|
}
|
|
508
506
|
|
|
509
|
-
console.log("ā
Session
|
|
507
|
+
console.log("ā
Session step automatically saved to database!");
|
|
510
508
|
|
|
511
509
|
await prisma.$disconnect();
|
|
512
510
|
}
|
|
@@ -526,14 +524,14 @@ async function quickStart() {
|
|
|
526
524
|
persistence: {
|
|
527
525
|
adapter: new PrismaAdapter({ prisma }),
|
|
528
526
|
userId: "user_789",
|
|
529
|
-
autoSave: true, // ⨠Automatically saves session
|
|
527
|
+
autoSave: true, // ⨠Automatically saves session step!
|
|
530
528
|
},
|
|
531
529
|
});
|
|
532
530
|
|
|
533
531
|
// Create a simple contact form route
|
|
534
532
|
const contactRoute = agent.createRoute<ContactFormData>({
|
|
535
533
|
title: "Contact Form",
|
|
536
|
-
|
|
534
|
+
schema: {
|
|
537
535
|
type: "object",
|
|
538
536
|
properties: {
|
|
539
537
|
name: { type: "string" },
|
|
@@ -544,21 +542,21 @@ async function quickStart() {
|
|
|
544
542
|
},
|
|
545
543
|
});
|
|
546
544
|
|
|
547
|
-
contactRoute.
|
|
548
|
-
.
|
|
549
|
-
|
|
550
|
-
|
|
545
|
+
contactRoute.initialStep
|
|
546
|
+
.nextStep({
|
|
547
|
+
instructions: "Collect all information",
|
|
548
|
+
collect: ["name", "email", "message"],
|
|
551
549
|
})
|
|
552
|
-
.
|
|
553
|
-
|
|
550
|
+
.nextStep({
|
|
551
|
+
instructions: "Confirm submission",
|
|
554
552
|
})
|
|
555
|
-
.
|
|
553
|
+
.nextStep({ step: END_ROUTE });
|
|
556
554
|
|
|
557
555
|
const persistence = agent.getPersistenceManager()!;
|
|
558
556
|
|
|
559
|
-
// Create session with
|
|
560
|
-
const { sessionData,
|
|
561
|
-
await persistence.
|
|
557
|
+
// Create session with step support
|
|
558
|
+
const { sessionData, sessionStep } =
|
|
559
|
+
await persistence.createSessionWithStep<ContactFormData>({
|
|
562
560
|
userId: "user_789",
|
|
563
561
|
agentName: "Support Agent",
|
|
564
562
|
});
|
|
@@ -572,20 +570,18 @@ async function quickStart() {
|
|
|
572
570
|
"I need help, my name is John and my email is john@example.com"
|
|
573
571
|
),
|
|
574
572
|
],
|
|
575
|
-
session:
|
|
573
|
+
session: sessionStep,
|
|
576
574
|
});
|
|
577
575
|
|
|
578
576
|
console.log("ā
Response:", response.message);
|
|
579
|
-
console.log("š
|
|
577
|
+
console.log("š Data:", response.session?.data);
|
|
580
578
|
|
|
581
579
|
if (response.isRouteComplete) {
|
|
582
580
|
console.log("\nā
Contact form submitted!");
|
|
583
|
-
await logContactForm(
|
|
584
|
-
agent.getExtractedData(sessionData.id) as ContactFormData
|
|
585
|
-
);
|
|
581
|
+
await logContactForm(agent.getData(sessionData.id) as ContactFormData);
|
|
586
582
|
}
|
|
587
583
|
|
|
588
|
-
console.log("š¾ Session
|
|
584
|
+
console.log("š¾ Session step auto-saved to Prisma!");
|
|
589
585
|
|
|
590
586
|
await prisma.$disconnect();
|
|
591
587
|
}
|
|
@@ -11,14 +11,14 @@ generator client {
|
|
|
11
11
|
}
|
|
12
12
|
|
|
13
13
|
// Agent Session model
|
|
14
|
-
// Stores conversation session
|
|
14
|
+
// Stores conversation session step
|
|
15
15
|
model AgentSession {
|
|
16
16
|
id String @id @default(cuid())
|
|
17
17
|
userId String? @map("user_id")
|
|
18
18
|
agentName String? @map("agent_name")
|
|
19
19
|
status String @default("active") // "active" | "completed" | "abandoned"
|
|
20
20
|
currentRoute String? @map("current_route")
|
|
21
|
-
|
|
21
|
+
currentStep String? @map("current_step")
|
|
22
22
|
collectedData Json? @map("collected_data")
|
|
23
23
|
messageCount Int @default(0) @map("message_count")
|
|
24
24
|
lastMessageAt DateTime? @map("last_message_at")
|
|
@@ -44,7 +44,7 @@ model AgentMessage {
|
|
|
44
44
|
role String // "user" | "agent" | "system"
|
|
45
45
|
content String @db.Text
|
|
46
46
|
route String?
|
|
47
|
-
|
|
47
|
+
step String?
|
|
48
48
|
toolCalls Json? @map("tool_calls")
|
|
49
49
|
event Json? // Optional: store full event data
|
|
50
50
|
createdAt DateTime @default(now()) @map("created_at")
|