@falai/agent 0.6.9 → 0.8.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 +78 -82
- package/dist/adapters/MemoryAdapter.d.ts +1 -1
- package/dist/adapters/MemoryAdapter.js +3 -3
- package/dist/adapters/MemoryAdapter.js.map +1 -1
- package/dist/adapters/MongoAdapter.d.ts +1 -1
- package/dist/adapters/MongoAdapter.js +3 -3
- 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.d.ts +1 -1
- package/dist/adapters/PostgreSQLAdapter.js +10 -10
- package/dist/adapters/PostgreSQLAdapter.js.map +1 -1
- package/dist/adapters/PrismaAdapter.d.ts +1 -1
- package/dist/adapters/PrismaAdapter.js +4 -4
- package/dist/adapters/PrismaAdapter.js.map +1 -1
- package/dist/adapters/RedisAdapter.d.ts +1 -1
- package/dist/adapters/RedisAdapter.js +3 -3
- package/dist/adapters/RedisAdapter.js.map +1 -1
- package/dist/adapters/SQLiteAdapter.d.ts +4 -4
- package/dist/adapters/SQLiteAdapter.d.ts.map +1 -1
- package/dist/adapters/SQLiteAdapter.js +12 -12
- 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.d.ts +1 -1
- package/dist/cjs/adapters/MemoryAdapter.js +3 -3
- package/dist/cjs/adapters/MemoryAdapter.js.map +1 -1
- package/dist/cjs/adapters/MongoAdapter.d.ts +1 -1
- package/dist/cjs/adapters/MongoAdapter.js +3 -3
- 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.d.ts +1 -1
- package/dist/cjs/adapters/PostgreSQLAdapter.js +10 -10
- package/dist/cjs/adapters/PostgreSQLAdapter.js.map +1 -1
- package/dist/cjs/adapters/PrismaAdapter.d.ts +1 -1
- package/dist/cjs/adapters/PrismaAdapter.js +4 -4
- package/dist/cjs/adapters/PrismaAdapter.js.map +1 -1
- package/dist/cjs/adapters/RedisAdapter.d.ts +1 -1
- package/dist/cjs/adapters/RedisAdapter.js +3 -3
- package/dist/cjs/adapters/RedisAdapter.js.map +1 -1
- package/dist/cjs/adapters/SQLiteAdapter.d.ts +4 -4
- package/dist/cjs/adapters/SQLiteAdapter.d.ts.map +1 -1
- package/dist/cjs/adapters/SQLiteAdapter.js +12 -12
- 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 +168 -160
- 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 +31 -31
- package/dist/cjs/core/RoutingEngine.d.ts.map +1 -1
- package/dist/cjs/core/RoutingEngine.js +196 -196
- 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 +9 -9
- 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 +170 -162
- 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 +31 -31
- package/dist/core/RoutingEngine.d.ts.map +1 -1
- package/dist/core/RoutingEngine.js +197 -197
- 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 +9 -9
- 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 +63 -61
- package/docs/API_REFERENCE.md +218 -220
- package/docs/ARCHITECTURE.md +99 -104
- package/docs/CONTEXT_MANAGEMENT.md +84 -91
- package/docs/CONTRIBUTING.md +3 -3
- package/docs/DOCS.md +18 -18
- package/docs/DOMAINS.md +18 -18
- package/docs/EXAMPLES.md +44 -44
- package/docs/GETTING_STARTED.md +63 -66
- package/docs/PERSISTENCE.md +70 -74
- package/docs/PROVIDERS.md +6 -6
- package/docs/README.md +6 -6
- package/docs/ROUTES.md +218 -220
- package/docs/STEPS.md +883 -0
- package/examples/business-onboarding.ts +85 -82
- package/examples/company-qna-agent.ts +69 -68
- package/examples/custom-database-persistence.ts +89 -91
- package/examples/declarative-agent.ts +33 -33
- package/examples/domain-scoping.ts +20 -20
- package/examples/extracted-data-modification.ts +93 -98
- package/examples/healthcare-agent.ts +90 -92
- package/examples/openai-agent.ts +30 -33
- package/examples/opensearch-persistence.ts +46 -48
- package/examples/persistent-onboarding.ts +67 -68
- package/examples/prisma-persistence.ts +111 -115
- package/examples/prisma-schema.example.prisma +3 -3
- package/examples/redis-persistence.ts +70 -76
- package/examples/route-transitions.ts +72 -48
- package/examples/rules-prohibitions.ts +31 -31
- package/examples/streaming-agent.ts +29 -29
- package/examples/travel-agent.ts +95 -110
- package/package.json +1 -1
- package/src/adapters/MemoryAdapter.ts +4 -4
- package/src/adapters/MongoAdapter.ts +4 -4
- package/src/adapters/OpenSearchAdapter.ts +8 -8
- package/src/adapters/PostgreSQLAdapter.ts +11 -11
- package/src/adapters/PrismaAdapter.ts +5 -5
- package/src/adapters/RedisAdapter.ts +4 -4
- package/src/adapters/SQLiteAdapter.ts +16 -16
- package/src/adapters/index.ts +1 -1
- package/src/constants/index.ts +4 -4
- package/src/core/Agent.ts +218 -214
- 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 +252 -258
- 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 +9 -9
- 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;
|
|
@@ -98,19 +98,19 @@ interface BookingData {
|
|
|
98
98
|
|
|
99
99
|
const agent = new Agent({
|
|
100
100
|
name: "My Agent",
|
|
101
|
-
|
|
101
|
+
provider: new GeminiProvider({ apiKey: "..." }),
|
|
102
102
|
// ✨ Just add this!
|
|
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({
|
|
@@ -219,7 +219,7 @@ Enable automatic message persistence:
|
|
|
219
219
|
```typescript
|
|
220
220
|
const agent = new Agent({
|
|
221
221
|
name: "My Agent",
|
|
222
|
-
|
|
222
|
+
provider: provider,
|
|
223
223
|
persistence: {
|
|
224
224
|
adapter: new PrismaAdapter({ prisma }),
|
|
225
225
|
autoSave: true, // Default: true
|
|
@@ -235,7 +235,7 @@ The most powerful pattern - auto-sync context with database:
|
|
|
235
235
|
```typescript
|
|
236
236
|
const agent = new Agent({
|
|
237
237
|
name: "Smart Assistant",
|
|
238
|
-
|
|
238
|
+
provider: provider,
|
|
239
239
|
context: {
|
|
240
240
|
userId: "user_123",
|
|
241
241
|
sessionId: session.id,
|
|
@@ -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
|
|
|
@@ -482,7 +478,7 @@ import { PrismaClient } from "@prisma/client";
|
|
|
482
478
|
const prisma = new PrismaClient();
|
|
483
479
|
const agent = new Agent({
|
|
484
480
|
name: "Assistant",
|
|
485
|
-
|
|
481
|
+
provider: provider,
|
|
486
482
|
persistence: {
|
|
487
483
|
adapter: new PrismaAdapter({ prisma }),
|
|
488
484
|
},
|
|
@@ -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
|
|
@@ -385,7 +385,7 @@ import {
|
|
|
385
385
|
// Use Anthropic (Claude)
|
|
386
386
|
const claudeAgent = new Agent({
|
|
387
387
|
name: "Claude Assistant",
|
|
388
|
-
|
|
388
|
+
provider: new AnthropicProvider({
|
|
389
389
|
apiKey: process.env.ANTHROPIC_API_KEY!,
|
|
390
390
|
model: "claude-sonnet-4-5",
|
|
391
391
|
}),
|
|
@@ -394,7 +394,7 @@ const claudeAgent = new Agent({
|
|
|
394
394
|
// Use Gemini
|
|
395
395
|
const geminiAgent = new Agent({
|
|
396
396
|
name: "Gemini Assistant",
|
|
397
|
-
|
|
397
|
+
provider: new GeminiProvider({
|
|
398
398
|
apiKey: process.env.GEMINI_API_KEY!,
|
|
399
399
|
model: "models/gemini-2.5-flash",
|
|
400
400
|
}),
|
|
@@ -403,7 +403,7 @@ const geminiAgent = new Agent({
|
|
|
403
403
|
// Use OpenAI
|
|
404
404
|
const openaiAgent = new Agent({
|
|
405
405
|
name: "OpenAI Assistant",
|
|
406
|
-
|
|
406
|
+
provider: new OpenAIProvider({
|
|
407
407
|
apiKey: process.env.OPENAI_API_KEY!,
|
|
408
408
|
model: "gpt-5",
|
|
409
409
|
}),
|
|
@@ -412,7 +412,7 @@ const openaiAgent = new Agent({
|
|
|
412
412
|
// Use OpenRouter (access to 200+ models)
|
|
413
413
|
const openrouterAgent = new Agent({
|
|
414
414
|
name: "OpenRouter Assistant",
|
|
415
|
-
|
|
415
|
+
provider: new OpenRouterProvider({
|
|
416
416
|
apiKey: process.env.OPENROUTER_API_KEY!,
|
|
417
417
|
model: "anthropic/claude-sonnet-4-5",
|
|
418
418
|
}),
|
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
|
|