@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
package/docs/PERSISTENCE.md
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
# Persistence with @falai/agent
|
|
2
2
|
|
|
3
|
-
The `@falai/agent` framework provides optional, flexible persistence for automatically saving conversation sessions,
|
|
3
|
+
The `@falai/agent` framework provides optional, flexible persistence for automatically saving conversation sessions, collected data, and messages to your database.
|
|
4
4
|
|
|
5
5
|
## Features
|
|
6
6
|
|
|
7
7
|
- ✅ **Optional** - Persistence is completely optional
|
|
8
8
|
- ✅ **Provider Pattern** - Simple API like AI providers (`new PrismaAdapter({ prisma })`)
|
|
9
9
|
- ✅ **Type-safe** - Full TypeScript support with generics
|
|
10
|
-
- ✅ **Session
|
|
10
|
+
- ✅ **Session Step Integration** - Automatic saving of collected data and conversation progress
|
|
11
11
|
- ✅ **Multiple Adapters** - Prisma, Redis, MongoDB, PostgreSQL, SQLite, OpenSearch, Memory
|
|
12
12
|
- ✅ **Extensible** - Create adapters for any database
|
|
13
|
-
- ✅ **Auto-save** - Automatic session
|
|
13
|
+
- ✅ **Auto-save** - Automatic session step and message persistence
|
|
14
14
|
|
|
15
15
|
## Quick Start with Prisma
|
|
16
16
|
|
|
@@ -41,7 +41,7 @@ model AgentSession {
|
|
|
41
41
|
agentName String? @map("agent_name")
|
|
42
42
|
status String @default("active")
|
|
43
43
|
currentRoute String? @map("current_route")
|
|
44
|
-
|
|
44
|
+
currentStep String? @map("current_step")
|
|
45
45
|
collectedData Json? @map("collected_data")
|
|
46
46
|
messageCount Int @default(0) @map("message_count")
|
|
47
47
|
lastMessageAt DateTime? @map("last_message_at")
|
|
@@ -62,7 +62,7 @@ model AgentMessage {
|
|
|
62
62
|
role String
|
|
63
63
|
content String @db.Text
|
|
64
64
|
route String?
|
|
65
|
-
|
|
65
|
+
step String?
|
|
66
66
|
toolCalls Json? @map("tool_calls")
|
|
67
67
|
event Json?
|
|
68
68
|
createdAt DateTime @default(now()) @map("created_at")
|
|
@@ -81,7 +81,7 @@ npx prisma generate
|
|
|
81
81
|
npx prisma migrate dev --name init
|
|
82
82
|
```
|
|
83
83
|
|
|
84
|
-
### 4. Use in Your Agent with Session
|
|
84
|
+
### 4. Use in Your Agent with Session Step (That's it!)
|
|
85
85
|
|
|
86
86
|
```typescript
|
|
87
87
|
import { Agent, PrismaAdapter, GeminiProvider } from "@falai/agent";
|
|
@@ -89,7 +89,7 @@ import { PrismaClient } from "@prisma/client";
|
|
|
89
89
|
|
|
90
90
|
const prisma = new PrismaClient();
|
|
91
91
|
|
|
92
|
-
// Define your
|
|
92
|
+
// Define your collected data type
|
|
93
93
|
interface BookingData {
|
|
94
94
|
destination: string;
|
|
95
95
|
date: string;
|
|
@@ -103,14 +103,14 @@ const agent = new Agent({
|
|
|
103
103
|
persistence: {
|
|
104
104
|
adapter: new PrismaAdapter({ prisma }),
|
|
105
105
|
userId: "user_123",
|
|
106
|
-
autoSave: true, // Auto-saves session
|
|
106
|
+
autoSave: true, // Auto-saves session step!
|
|
107
107
|
},
|
|
108
108
|
});
|
|
109
109
|
|
|
110
110
|
// Create a route with data extraction
|
|
111
111
|
const bookingRoute = agent.createRoute<BookingData>({
|
|
112
112
|
title: "Book Flight",
|
|
113
|
-
|
|
113
|
+
schema: {
|
|
114
114
|
type: "object",
|
|
115
115
|
properties: {
|
|
116
116
|
destination: { type: "string" },
|
|
@@ -121,45 +121,45 @@ const bookingRoute = agent.createRoute<BookingData>({
|
|
|
121
121
|
},
|
|
122
122
|
});
|
|
123
123
|
|
|
124
|
-
// Define
|
|
125
|
-
bookingRoute.
|
|
126
|
-
.
|
|
127
|
-
id: "collect_details", // ✅ Custom
|
|
128
|
-
|
|
129
|
-
|
|
124
|
+
// Define steps with smart data collecting and custom IDs
|
|
125
|
+
bookingRoute.initialStep
|
|
126
|
+
.nextStep({
|
|
127
|
+
id: "collect_details", // ✅ Custom step ID for easier tracking
|
|
128
|
+
instructions: "Collect booking details",
|
|
129
|
+
collect: ["destination", "date", "passengers"],
|
|
130
130
|
})
|
|
131
|
-
.
|
|
132
|
-
id: "confirm_booking", // ✅ Custom
|
|
133
|
-
|
|
134
|
-
|
|
131
|
+
.nextStep({
|
|
132
|
+
id: "confirm_booking", // ✅ Custom step ID
|
|
133
|
+
instructions: "Confirm all details",
|
|
134
|
+
requires: ["destination", "date", "passengers"],
|
|
135
135
|
});
|
|
136
136
|
|
|
137
137
|
// Access persistence methods
|
|
138
138
|
const persistence = agent.getPersistenceManager();
|
|
139
139
|
|
|
140
|
-
// Create a session with
|
|
141
|
-
const { sessionData,
|
|
142
|
-
await persistence.
|
|
140
|
+
// Create a session with step support
|
|
141
|
+
const { sessionData, sessionStep } =
|
|
142
|
+
await persistence.createSessionWithStep<BookingData>({
|
|
143
143
|
userId: "user_123",
|
|
144
144
|
agentName: "My Agent",
|
|
145
145
|
});
|
|
146
146
|
|
|
147
147
|
// Session ID is automatically set in metadata
|
|
148
|
-
console.log("Session ID:",
|
|
148
|
+
console.log("Session ID:", sessionStep.metadata?.sessionId);
|
|
149
149
|
// Outputs: sessionData.id (e.g., "cuid_abc123")
|
|
150
150
|
|
|
151
151
|
// Load history
|
|
152
152
|
const history = await persistence.loadSessionHistory(sessionData.id);
|
|
153
153
|
|
|
154
|
-
// Generate response with session
|
|
154
|
+
// Generate response with session step
|
|
155
155
|
const response = await agent.respond({
|
|
156
156
|
history,
|
|
157
|
-
session:
|
|
157
|
+
session: sessionStep, // Pass session step with ID
|
|
158
158
|
});
|
|
159
159
|
|
|
160
|
-
// Session
|
|
161
|
-
console.log("
|
|
162
|
-
console.log("Current
|
|
160
|
+
// Session step is auto-saved! ✨
|
|
161
|
+
console.log("Collected data:", response.session?.data);
|
|
162
|
+
console.log("Current step ID:", response.session?.currentStep?.id); // Custom or auto-generated ID
|
|
163
163
|
|
|
164
164
|
// Save message
|
|
165
165
|
await persistence.saveMessage({
|
|
@@ -268,26 +268,26 @@ const agent = new Agent({
|
|
|
268
268
|
await agent.updateContext({ preferences: { theme: "dark" } });
|
|
269
269
|
```
|
|
270
270
|
|
|
271
|
-
## Session
|
|
271
|
+
## Session Step Integration
|
|
272
272
|
|
|
273
|
-
The new architecture automatically saves and loads `
|
|
273
|
+
The new architecture automatically saves and loads `SessionStep<TData>` which includes:
|
|
274
274
|
|
|
275
|
-
- **Current route and
|
|
276
|
-
- **
|
|
275
|
+
- **Current route and step** - Track conversation progress
|
|
276
|
+
- **Collected data** - All data collected via `schema` and `collect` fields
|
|
277
277
|
- **Route history** - History of route transitions
|
|
278
278
|
- **Metadata** - Session timestamps and custom data
|
|
279
279
|
|
|
280
280
|
### How It Works
|
|
281
281
|
|
|
282
|
-
1. **Auto-Save**: When `autoSave: true`, session
|
|
283
|
-
2. **Conversion**: `
|
|
284
|
-
3. **Recovery**: Load session
|
|
282
|
+
1. **Auto-Save**: When `autoSave: true`, session step is automatically persisted after each `respond()` call
|
|
283
|
+
2. **Conversion**: `SessionStep` is automatically converted to `SessionData` for storage
|
|
284
|
+
3. **Recovery**: Load session step from database to resume conversations
|
|
285
285
|
|
|
286
|
-
### Create Session with
|
|
286
|
+
### Create Session with Step
|
|
287
287
|
|
|
288
288
|
```typescript
|
|
289
|
-
const { sessionData,
|
|
290
|
-
await persistence.
|
|
289
|
+
const { sessionData, sessionStep } =
|
|
290
|
+
await persistence.createSessionWithStep<YourDataType>({
|
|
291
291
|
userId: "user_123",
|
|
292
292
|
agentName: "My Agent",
|
|
293
293
|
initialData: {
|
|
@@ -296,23 +296,21 @@ const { sessionData, sessionState } =
|
|
|
296
296
|
});
|
|
297
297
|
|
|
298
298
|
// sessionData: Database record
|
|
299
|
-
//
|
|
299
|
+
// sessionStep: In-memory session step ready to use
|
|
300
300
|
```
|
|
301
301
|
|
|
302
|
-
### Save Session
|
|
302
|
+
### Save Session Step
|
|
303
303
|
|
|
304
304
|
```typescript
|
|
305
305
|
// Manual save (not needed if autoSave: true)
|
|
306
|
-
await persistence.
|
|
306
|
+
await persistence.saveSessionStep(sessionId, sessionStep);
|
|
307
307
|
```
|
|
308
308
|
|
|
309
|
-
### Load Session
|
|
309
|
+
### Load Session Step
|
|
310
310
|
|
|
311
311
|
```typescript
|
|
312
|
-
// Load session
|
|
313
|
-
const
|
|
314
|
-
sessionId
|
|
315
|
-
);
|
|
312
|
+
// Load session step from database
|
|
313
|
+
const sessionStep = await persistence.loadSessionStep<YourDataType>(sessionId);
|
|
316
314
|
|
|
317
315
|
// Load message history
|
|
318
316
|
const history = await persistence.loadSessionHistory(sessionId);
|
|
@@ -320,13 +318,13 @@ const history = await persistence.loadSessionHistory(sessionId);
|
|
|
320
318
|
// Resume conversation
|
|
321
319
|
const response = await agent.respond({
|
|
322
320
|
history,
|
|
323
|
-
session:
|
|
321
|
+
session: sessionStep,
|
|
324
322
|
});
|
|
325
323
|
```
|
|
326
324
|
|
|
327
325
|
### What Gets Persisted
|
|
328
326
|
|
|
329
|
-
The session
|
|
327
|
+
The session step stores:
|
|
330
328
|
|
|
331
329
|
```typescript
|
|
332
330
|
{
|
|
@@ -335,12 +333,12 @@ The session state stores:
|
|
|
335
333
|
title: "Book a Flight",
|
|
336
334
|
enteredAt: Date
|
|
337
335
|
},
|
|
338
|
-
|
|
336
|
+
currentStep: {
|
|
339
337
|
id: "ask_dates",
|
|
340
338
|
description: "Ask about travel dates",
|
|
341
339
|
enteredAt: Date
|
|
342
340
|
},
|
|
343
|
-
|
|
341
|
+
data: {
|
|
344
342
|
destination: "Paris",
|
|
345
343
|
departureDate: "2025-06-15",
|
|
346
344
|
passengers: 2
|
|
@@ -365,9 +363,9 @@ Access via `agent.getPersistenceManager()`:
|
|
|
365
363
|
### Session Methods
|
|
366
364
|
|
|
367
365
|
```typescript
|
|
368
|
-
// Create session with
|
|
369
|
-
const { sessionData,
|
|
370
|
-
await persistence.
|
|
366
|
+
// Create session with step support (NEW!)
|
|
367
|
+
const { sessionData, sessionStep } =
|
|
368
|
+
await persistence.createSessionWithStep<YourDataType>({
|
|
371
369
|
userId: "user_123",
|
|
372
370
|
agentName: "My Agent",
|
|
373
371
|
initialData: {
|
|
@@ -375,13 +373,11 @@ const { sessionData, sessionState } =
|
|
|
375
373
|
},
|
|
376
374
|
});
|
|
377
375
|
|
|
378
|
-
// Save session
|
|
379
|
-
await persistence.
|
|
376
|
+
// Save session step (NEW!)
|
|
377
|
+
await persistence.saveSessionStep(sessionId, sessionStep);
|
|
380
378
|
|
|
381
|
-
// Load session
|
|
382
|
-
const
|
|
383
|
-
sessionId
|
|
384
|
-
);
|
|
379
|
+
// Load session step (NEW!)
|
|
380
|
+
const sessionStep = await persistence.loadSessionStep<YourDataType>(sessionId);
|
|
385
381
|
|
|
386
382
|
// Create session (legacy)
|
|
387
383
|
await persistence.createSession({
|
|
@@ -402,7 +398,7 @@ await persistence.getUserSessions(userId);
|
|
|
402
398
|
// Update session
|
|
403
399
|
await persistence.updateSessionStatus(sessionId, "completed");
|
|
404
400
|
await persistence.updateCollectedData(sessionId, { key: "value" });
|
|
405
|
-
await persistence.
|
|
401
|
+
await persistence.updateRouteStep(sessionId, routeId, stepId);
|
|
406
402
|
|
|
407
403
|
// Complete/abandon session
|
|
408
404
|
await persistence.completeSession(sessionId);
|
|
@@ -422,7 +418,7 @@ await persistence.saveMessage({
|
|
|
422
418
|
role: "user" | "agent" | "system",
|
|
423
419
|
content: "Hello!",
|
|
424
420
|
route: "route_id",
|
|
425
|
-
|
|
421
|
+
step: "step_id",
|
|
426
422
|
toolCalls: [...],
|
|
427
423
|
});
|
|
428
424
|
|
|
@@ -508,7 +504,7 @@ await persistence.saveMessage({
|
|
|
508
504
|
- `agentName`: Name of the agent
|
|
509
505
|
- `status`: `"active" | "completed" | "abandoned"`
|
|
510
506
|
- `currentRoute`: Current route ID
|
|
511
|
-
- `
|
|
507
|
+
- `currentStep`: Current step ID
|
|
512
508
|
- `collectedData`: JSON object for custom data
|
|
513
509
|
- `messageCount`: Number of messages in session
|
|
514
510
|
- `lastMessageAt`: Timestamp of last message
|
|
@@ -524,19 +520,19 @@ await persistence.saveMessage({
|
|
|
524
520
|
- `role`: `"user" | "agent" | "system"`
|
|
525
521
|
- `content`: Message text
|
|
526
522
|
- `route`: Route ID when message was sent
|
|
527
|
-
- `
|
|
523
|
+
- `step`: Step ID when message was sent
|
|
528
524
|
- `toolCalls`: Array of tool calls (if any)
|
|
529
525
|
- `event`: Full event data (optional)
|
|
530
526
|
- `createdAt`: Message creation time
|
|
531
527
|
|
|
532
528
|
## Best Practices
|
|
533
529
|
|
|
534
|
-
1. ✅ **Use `
|
|
535
|
-
2. ✅ **Enable `autoSave: true`** - Automatically persist session
|
|
536
|
-
3. ✅ **Define extraction schemas** - Use `
|
|
537
|
-
4. ✅ **Pass session
|
|
538
|
-
5. ✅ **Load session
|
|
539
|
-
6. ✅ **Store
|
|
530
|
+
1. ✅ **Use `createSessionWithStep()`** - Get both database record and session step in one call
|
|
531
|
+
2. ✅ **Enable `autoSave: true`** - Automatically persist session step after each response
|
|
532
|
+
3. ✅ **Define extraction schemas** - Use `schema` in routes for structured data collection
|
|
533
|
+
4. ✅ **Pass session step** - Always pass `session` parameter to `agent.respond()`
|
|
534
|
+
5. ✅ **Load session step** - Use `loadSessionStep()` to resume conversations
|
|
535
|
+
6. ✅ **Store collected data** - Leverage `collectedData.data` for user input tracking
|
|
540
536
|
7. ✅ **Index frequently queried fields** - Add database indexes on `userId`, `status`, etc.
|
|
541
537
|
8. ✅ **Use cascading deletes** - Clean up messages automatically when deleting sessions
|
|
542
538
|
9. ✅ **Complete sessions** - Mark sessions as completed when conversation ends
|
|
@@ -802,7 +798,7 @@ describe("Agent persistence", () => {
|
|
|
802
798
|
const adapter = new MemoryAdapter();
|
|
803
799
|
|
|
804
800
|
afterEach(() => {
|
|
805
|
-
adapter.clear(); // Clean
|
|
801
|
+
adapter.clear(); // Clean step between tests
|
|
806
802
|
});
|
|
807
803
|
|
|
808
804
|
it("should save session", async () => {
|
package/docs/PROVIDERS.md
CHANGED
|
@@ -21,7 +21,7 @@ Streaming provides:
|
|
|
21
21
|
- 🌊 Real-time text generation for better UX
|
|
22
22
|
- 📊 Incremental delivery with `delta` and `accumulated` properties
|
|
23
23
|
- 🛑 Cancellable streams using AbortSignal
|
|
24
|
-
- ✅ Full compatibility with routes,
|
|
24
|
+
- ✅ Full compatibility with routes, steps, and tool calls
|
|
25
25
|
|
|
26
26
|
**Example:**
|
|
27
27
|
|
|
@@ -51,7 +51,7 @@ See [streaming-agent.ts](../examples/streaming-agent.ts) for comprehensive examp
|
|
|
51
51
|
|
|
52
52
|
Anthropic's Claude models are known for their exceptional reasoning, analysis, and long context windows. Claude 3.5 Sonnet offers:
|
|
53
53
|
|
|
54
|
-
-
|
|
54
|
+
- Step-of-the-art reasoning and analysis
|
|
55
55
|
- 200K context window
|
|
56
56
|
- Excellent at following complex instructions
|
|
57
57
|
- Strong coding and writing capabilities
|
package/docs/README.md
CHANGED
|
@@ -14,12 +14,12 @@ Welcome to the `@falai/agent` documentation!
|
|
|
14
14
|
|
|
15
15
|
- **[Architecture](./ARCHITECTURE.md)** - Design principles & philosophy (Data-driven sessions) ⭐ **UPDATED**
|
|
16
16
|
- **[Agent](./AGENT.md)** - Comprehensive guide to declarative vs fluent configuration ⭐ **UPDATED**
|
|
17
|
-
- **[Context Management](./CONTEXT_MANAGEMENT.md)** - Session
|
|
17
|
+
- **[Context Management](./CONTEXT_MANAGEMENT.md)** - Session step & data extraction patterns ⭐ **UPDATED**
|
|
18
18
|
|
|
19
19
|
### Conversational Flows
|
|
20
20
|
|
|
21
21
|
- **[Routes Guide](./ROUTES.md)** - Complete guide to creating and managing conversational routes ⭐ **NEW**
|
|
22
|
-
- **[
|
|
22
|
+
- **[Steps Guide](./STEPS.md)** - Complete guide to creating and managing steps ⭐ **NEW**
|
|
23
23
|
|
|
24
24
|
### Reference
|
|
25
25
|
|
|
@@ -48,7 +48,7 @@ Welcome to the `@falai/agent` documentation!
|
|
|
48
48
|
→ Check [Agent](./AGENT.md)
|
|
49
49
|
|
|
50
50
|
**Creating conversational flows?**
|
|
51
|
-
→ See [Routes Guide](./ROUTES.md) and [
|
|
51
|
+
→ See [Routes Guide](./ROUTES.md) and [Steps Guide](./STEPS.md)
|
|
52
52
|
|
|
53
53
|
**Need tool security?**
|
|
54
54
|
→ See [Domain Organization](./DOMAINS.md)
|
|
@@ -63,7 +63,7 @@ Welcome to the `@falai/agent` documentation!
|
|
|
63
63
|
|
|
64
64
|
- **Architecture & Design**: [Architecture Guide](./ARCHITECTURE.md)
|
|
65
65
|
- **Agent Configuration**: [Agent](./AGENT.md) | [Context Management](./CONTEXT_MANAGEMENT.md)
|
|
66
|
-
- **Conversation Flows**: [Routes Guide](./ROUTES.md) | [
|
|
66
|
+
- **Conversation Flows**: [Routes Guide](./ROUTES.md) | [Steps Guide](./STEPS.md) | [API Reference - Routes](./API_REFERENCE.md#route)
|
|
67
67
|
- **Tools & Domains**: [Domain Organization](./DOMAINS.md) | [API Reference - Tools](./API_REFERENCE.md#definetool)
|
|
68
68
|
- **AI Providers**: [Providers Guide](./PROVIDERS.md) | [API Reference](./API_REFERENCE.md#geminiprovider)
|
|
69
69
|
- **Database Persistence**: [Persistence Guide](./PERSISTENCE.md) | [Adapters](./ADAPTERS.md)
|
|
@@ -79,7 +79,7 @@ Check out the [`examples/`](../examples/) directory for complete, runnable examp
|
|
|
79
79
|
- **[Travel Agent](../examples/travel-agent.ts)** - Complex multi-route travel booking system
|
|
80
80
|
- **[Healthcare Agent](../examples/healthcare-agent.ts)** - Full example
|
|
81
81
|
- **[Streaming Agent](../examples/streaming-agent.ts)** - Real-time streaming responses
|
|
82
|
-
- **[Company Q&A Agent](../examples/company-qna-agent.ts)** -
|
|
82
|
+
- **[Company Q&A Agent](../examples/company-qna-agent.ts)** - Stepless question-answering with knowledge base
|
|
83
83
|
|
|
84
84
|
### Persistence Examples
|
|
85
85
|
|
|
@@ -96,7 +96,7 @@ Check out the [`examples/`](../examples/) directory for complete, runnable examp
|
|
|
96
96
|
|
|
97
97
|
- **[Domain Scoping](../examples/domain-scoping.ts)** - Control tool access per route
|
|
98
98
|
- **[Rules & Prohibitions](../examples/rules-prohibitions.ts)** - Fine-grained behavior control
|
|
99
|
-
- **[
|
|
99
|
+
- **[Collected data Modification](../examples/data-data-modification.ts)** - Tools that validate and enrich collected data
|
|
100
100
|
|
|
101
101
|
## 🤝 Contributing
|
|
102
102
|
|