@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,21 +1,21 @@
|
|
|
1
|
-
# Session
|
|
1
|
+
# Session Step & Data Management
|
|
2
2
|
|
|
3
3
|
## Overview
|
|
4
4
|
|
|
5
|
-
The `@falai/agent` framework provides **session
|
|
5
|
+
The `@falai/agent` framework provides **session step management** for tracking conversation progress, collected data, and user intent across multiple turns. This enables sophisticated data-driven conversations with intelligent step progression.
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
## 🎯 Session
|
|
9
|
+
## 🎯 Session Step: The Foundation
|
|
10
10
|
|
|
11
|
-
Session
|
|
11
|
+
Session step tracks three key aspects of a conversation:
|
|
12
12
|
|
|
13
13
|
1. **Current Route** - Which conversation flow the user is in
|
|
14
|
-
2. **Current
|
|
15
|
-
3. **
|
|
14
|
+
2. **Current Step** - Where in the flow they currently are
|
|
15
|
+
3. **Collected data** - Structured data collected so far
|
|
16
16
|
|
|
17
17
|
```typescript
|
|
18
|
-
import { createSession,
|
|
18
|
+
import { createSession, SessionStep } from "@falai/agent";
|
|
19
19
|
|
|
20
20
|
// Define your data extraction type
|
|
21
21
|
interface FlightData {
|
|
@@ -25,33 +25,33 @@ interface FlightData {
|
|
|
25
25
|
cabinClass: "economy" | "business" | "first";
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
-
// Initialize session
|
|
28
|
+
// Initialize session step
|
|
29
29
|
let session = createSession<FlightData>();
|
|
30
30
|
|
|
31
31
|
// Session starts empty
|
|
32
32
|
console.log(session.currentRoute); // undefined
|
|
33
|
-
console.log(session.
|
|
34
|
-
console.log(session.
|
|
33
|
+
console.log(session.currentStep); // undefined
|
|
34
|
+
console.log(session.data); // {}
|
|
35
35
|
|
|
36
36
|
// Use in conversation
|
|
37
37
|
const response = await agent.respond({ history, session });
|
|
38
38
|
|
|
39
|
-
// Session updated with progress and
|
|
39
|
+
// Session updated with progress and collected data
|
|
40
40
|
console.log(response.session?.currentRoute?.title); // "Book Flight"
|
|
41
|
-
console.log(response.session?.
|
|
42
|
-
console.log(response.session?.
|
|
41
|
+
console.log(response.session?.currentStep?.id); // "ask_destination"
|
|
42
|
+
console.log(response.session?.data); // { destination: "Paris", ... }
|
|
43
43
|
```
|
|
44
44
|
|
|
45
|
-
**Benefits of Session
|
|
45
|
+
**Benefits of Session Step:**
|
|
46
46
|
|
|
47
47
|
- **Always-On Routing** - Users can change their mind mid-conversation
|
|
48
|
-
- **Data Persistence** -
|
|
49
|
-
- **Context Awareness** - Router sees current progress and
|
|
50
|
-
- **
|
|
48
|
+
- **Data Persistence** - Collected data survives across turns
|
|
49
|
+
- **Context Awareness** - Router sees current progress and collected data
|
|
50
|
+
- **Step Recovery** - Resume conversations from any point
|
|
51
51
|
|
|
52
52
|
---
|
|
53
53
|
|
|
54
|
-
## 🔄 Session
|
|
54
|
+
## 🔄 Session Step Helpers
|
|
55
55
|
|
|
56
56
|
### Creating and Managing Sessions
|
|
57
57
|
|
|
@@ -59,9 +59,9 @@ console.log(response.session?.extracted); // { destination: "Paris", ... }
|
|
|
59
59
|
import {
|
|
60
60
|
createSession,
|
|
61
61
|
enterRoute,
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
type
|
|
62
|
+
enterStep,
|
|
63
|
+
mergeData,
|
|
64
|
+
type SessionStep,
|
|
65
65
|
} from "@falai/agent";
|
|
66
66
|
|
|
67
67
|
// Create a new session
|
|
@@ -70,32 +70,32 @@ let session = createSession<FlightData>();
|
|
|
70
70
|
// Enter a route (when routing decides to switch)
|
|
71
71
|
session = enterRoute(session, "book_flight", "Book Flight");
|
|
72
72
|
|
|
73
|
-
// Enter a
|
|
74
|
-
session =
|
|
73
|
+
// Enter a step (when progressing through the flow)
|
|
74
|
+
session = enterStep(session, "ask_destination", "Ask where they want to fly");
|
|
75
75
|
|
|
76
|
-
// Merge
|
|
77
|
-
session =
|
|
76
|
+
// Merge collected data (when AI extracts new information)
|
|
77
|
+
session = mergeData(session, {
|
|
78
78
|
destination: "Paris",
|
|
79
79
|
departureDate: "2025-10-15",
|
|
80
80
|
passengers: 2,
|
|
81
81
|
});
|
|
82
82
|
```
|
|
83
83
|
|
|
84
|
-
### Session
|
|
84
|
+
### Session Step Structure
|
|
85
85
|
|
|
86
86
|
```typescript
|
|
87
|
-
interface
|
|
87
|
+
interface SessionStep<TData = unknown> {
|
|
88
88
|
currentRoute?: {
|
|
89
89
|
id: string;
|
|
90
90
|
title: string;
|
|
91
91
|
enteredAt: Date;
|
|
92
92
|
};
|
|
93
|
-
|
|
93
|
+
currentStep?: {
|
|
94
94
|
id: string;
|
|
95
95
|
description?: string;
|
|
96
96
|
enteredAt: Date;
|
|
97
97
|
};
|
|
98
|
-
|
|
98
|
+
data: Partial<TData>; // Data collected so far
|
|
99
99
|
routeHistory: Array<{
|
|
100
100
|
routeId: string;
|
|
101
101
|
routeTitle: string;
|
|
@@ -125,25 +125,23 @@ const agent = new Agent({
|
|
|
125
125
|
await saveUserData(newContext.userId, newContext);
|
|
126
126
|
},
|
|
127
127
|
|
|
128
|
-
// NEW: Validate and enrich
|
|
129
|
-
|
|
128
|
+
// NEW: Validate and enrich collected data
|
|
129
|
+
onDataUpdate: async (data, previousData) => {
|
|
130
130
|
// Normalize passenger count
|
|
131
|
-
if (
|
|
132
|
-
if (
|
|
131
|
+
if (data.passengers < 1) data.passengers = 1;
|
|
132
|
+
if (data.passengers > 9) data.passengers = 9;
|
|
133
133
|
|
|
134
134
|
// Enrich with computed fields
|
|
135
|
-
if (
|
|
136
|
-
|
|
137
|
-
extracted.destination
|
|
138
|
-
);
|
|
135
|
+
if (data.destination) {
|
|
136
|
+
data.destinationCode = await lookupAirportCode(data.destination);
|
|
139
137
|
}
|
|
140
138
|
|
|
141
139
|
// Auto-trigger actions
|
|
142
|
-
if (
|
|
143
|
-
|
|
140
|
+
if (hasAllRequires(data)) {
|
|
141
|
+
data.shouldSearchFlights = true;
|
|
144
142
|
}
|
|
145
143
|
|
|
146
|
-
return
|
|
144
|
+
return data;
|
|
147
145
|
},
|
|
148
146
|
},
|
|
149
147
|
});
|
|
@@ -165,7 +163,7 @@ const agent = new Agent({
|
|
|
165
163
|
|
|
166
164
|
## 📊 Data Extraction Pipeline
|
|
167
165
|
|
|
168
|
-
Schema-first data extraction with intelligent
|
|
166
|
+
Schema-first data extraction with intelligent step progression:
|
|
169
167
|
|
|
170
168
|
### 1. Define Your Data Schema
|
|
171
169
|
|
|
@@ -182,7 +180,7 @@ interface FlightData {
|
|
|
182
180
|
|
|
183
181
|
const route = agent.createRoute<FlightData>({
|
|
184
182
|
title: "Book Flight",
|
|
185
|
-
|
|
183
|
+
schema: {
|
|
186
184
|
type: "object",
|
|
187
185
|
properties: {
|
|
188
186
|
destination: { type: "string" },
|
|
@@ -202,65 +200,62 @@ const route = agent.createRoute<FlightData>({
|
|
|
202
200
|
});
|
|
203
201
|
```
|
|
204
202
|
|
|
205
|
-
### 2. Create Smart
|
|
203
|
+
### 2. Create Smart Step Machines
|
|
206
204
|
|
|
207
205
|
```typescript
|
|
208
|
-
//
|
|
209
|
-
const askDestination = route.
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
skipIf: (
|
|
206
|
+
// Step with code-based logic (no fuzzy LLM conditions!)
|
|
207
|
+
const askDestination = route.initialStep.nextStep({
|
|
208
|
+
instructions: "Ask where they want to fly",
|
|
209
|
+
collect: ["destination"],
|
|
210
|
+
skipIf: (data) => !!data.destination, // Skip if already have destination
|
|
213
211
|
});
|
|
214
212
|
|
|
215
|
-
const enrichDestination = askDestination.
|
|
216
|
-
|
|
217
|
-
|
|
213
|
+
const enrichDestination = askDestination.nextStep({
|
|
214
|
+
tool: lookupAirportCode, // Tool executes automatically
|
|
215
|
+
requires: ["destination"], // Prerequisites
|
|
218
216
|
});
|
|
219
217
|
|
|
220
|
-
const askDates = enrichDestination.
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
skipIf: (
|
|
224
|
-
|
|
218
|
+
const askDates = enrichDestination.nextStep({
|
|
219
|
+
instructions: "Ask about travel dates",
|
|
220
|
+
collect: ["departureDate"],
|
|
221
|
+
skipIf: (data) => !!data.departureDate,
|
|
222
|
+
requires: ["destination"], // Must have destination first
|
|
225
223
|
});
|
|
226
224
|
|
|
227
|
-
const validateDate = askDates.
|
|
228
|
-
|
|
229
|
-
|
|
225
|
+
const validateDate = askDates.nextStep({
|
|
226
|
+
tool: parseAndValidateDate,
|
|
227
|
+
requires: ["departureDate"],
|
|
230
228
|
});
|
|
231
229
|
|
|
232
|
-
const askPassengers = validateDate.
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
skipIf: (
|
|
230
|
+
const askPassengers = validateDate.nextStep({
|
|
231
|
+
instructions: "How many passengers?",
|
|
232
|
+
collect: ["passengers"],
|
|
233
|
+
skipIf: (data) => !!data.passengers,
|
|
236
234
|
});
|
|
237
235
|
|
|
238
|
-
const searchFlights = askPassengers.
|
|
239
|
-
|
|
236
|
+
const searchFlights = askPassengers.nextStep({
|
|
237
|
+
tool: searchFlightAPI,
|
|
240
238
|
// Triggered when shouldSearchFlights flag is set by hook
|
|
241
239
|
});
|
|
242
240
|
```
|
|
243
241
|
|
|
244
|
-
### 3. Tools Access
|
|
242
|
+
### 3. Tools Access Collected data
|
|
245
243
|
|
|
246
244
|
```typescript
|
|
247
245
|
const searchFlights = defineTool<Context, [], void, FlightData>(
|
|
248
246
|
"search_flights",
|
|
249
|
-
async ({ context,
|
|
250
|
-
// Access
|
|
251
|
-
if (!
|
|
247
|
+
async ({ context, data }) => {
|
|
248
|
+
// Access collected data directly (no LLM extraction needed!)
|
|
249
|
+
if (!data.destination || !data.departureDate) {
|
|
252
250
|
return { data: undefined };
|
|
253
251
|
}
|
|
254
252
|
|
|
255
|
-
const flights = await searchFlightAPI(
|
|
256
|
-
extracted.destination,
|
|
257
|
-
extracted.departureDate
|
|
258
|
-
);
|
|
253
|
+
const flights = await searchFlightAPI(data.destination, data.departureDate);
|
|
259
254
|
|
|
260
255
|
return {
|
|
261
256
|
data: undefined,
|
|
262
257
|
contextUpdate: { availableFlights: flights },
|
|
263
|
-
|
|
258
|
+
dataUpdate: {
|
|
264
259
|
shouldSearchFlights: false, // Clear the flag
|
|
265
260
|
},
|
|
266
261
|
};
|
|
@@ -274,24 +269,22 @@ const searchFlights = defineTool<Context, [], void, FlightData>(
|
|
|
274
269
|
const agent = new Agent({
|
|
275
270
|
// ... other options
|
|
276
271
|
hooks: {
|
|
277
|
-
|
|
272
|
+
onDataUpdate: async (data, previous) => {
|
|
278
273
|
// Normalize data
|
|
279
|
-
if (
|
|
280
|
-
if (
|
|
274
|
+
if (data.passengers < 1) data.passengers = 1;
|
|
275
|
+
if (data.passengers > 9) data.passengers = 9;
|
|
281
276
|
|
|
282
277
|
// Enrich data
|
|
283
|
-
if (
|
|
284
|
-
|
|
285
|
-
extracted.destination
|
|
286
|
-
);
|
|
278
|
+
if (data.destination && !data.destinationCode) {
|
|
279
|
+
data.destinationCode = await lookupAirportCode(data.destination);
|
|
287
280
|
}
|
|
288
281
|
|
|
289
282
|
// Auto-trigger actions
|
|
290
|
-
if (
|
|
291
|
-
|
|
283
|
+
if (hasAllRequires(data) && !data.shouldSearchFlights) {
|
|
284
|
+
data.shouldSearchFlights = true;
|
|
292
285
|
}
|
|
293
286
|
|
|
294
|
-
return
|
|
287
|
+
return data;
|
|
295
288
|
},
|
|
296
289
|
},
|
|
297
290
|
});
|
|
@@ -329,8 +322,8 @@ const response2 = await agent.respond({
|
|
|
329
322
|
|
|
330
323
|
// Router understands:
|
|
331
324
|
// - Current route: "Book Flight"
|
|
332
|
-
// - Current
|
|
333
|
-
// -
|
|
325
|
+
// - Current step: "ask_passengers"
|
|
326
|
+
// - Collected data: { destination: "Paris", departureDate: "tomorrow", passengers: 2 }
|
|
334
327
|
// - User intent: "Tokyo instead" → switches to new destination
|
|
335
328
|
```
|
|
336
329
|
|
|
@@ -456,7 +449,7 @@ const agent = new Agent({
|
|
|
456
449
|
**Difference from `beforeRespond`:**
|
|
457
450
|
|
|
458
451
|
- `contextProvider`: **Replaces** the context entirely
|
|
459
|
-
- `beforeRespond`: **Updates** the existing context (can access previous
|
|
452
|
+
- `beforeRespond`: **Updates** the existing context (can access previous step)
|
|
460
453
|
|
|
461
454
|
---
|
|
462
455
|
|
|
@@ -579,7 +572,7 @@ async function handleUserMessage(sessionId: string, message: string) {
|
|
|
579
572
|
|
|
580
573
|
- **Cache agent instances** across requests (context gets stale)
|
|
581
574
|
- **Mutate context directly** without using `updateContext()` or `contextUpdate`
|
|
582
|
-
- **Rely on in-memory
|
|
575
|
+
- **Rely on in-memory step** for multi-turn conversations
|
|
583
576
|
- **Forget to handle** `onContextUpdate` failures (could lose data)
|
|
584
577
|
- **Mix** `context` and `contextProvider` (will throw an error)
|
|
585
578
|
|
package/docs/DOCS.md
CHANGED
|
@@ -12,7 +12,7 @@ Start here if you're new to the framework:
|
|
|
12
12
|
|
|
13
13
|
Build your first AI agent in 5 minutes with step-by-step instructions.
|
|
14
14
|
|
|
15
|
-
**Topics:** Installation, first agent, basic routes, data extraction, session
|
|
15
|
+
**Topics:** Installation, first agent, basic routes, data extraction, session step
|
|
16
16
|
|
|
17
17
|
---
|
|
18
18
|
|
|
@@ -24,7 +24,7 @@ Essential guides for understanding how the framework works:
|
|
|
24
24
|
|
|
25
25
|
Design principles, philosophy, and how the framework works under the hood.
|
|
26
26
|
|
|
27
|
-
**Topics:** Schema-first extraction, session
|
|
27
|
+
**Topics:** Schema-first extraction, session step, code-based logic, step machines, deterministic IDs
|
|
28
28
|
|
|
29
29
|
### [Agent](./AGENT.md)
|
|
30
30
|
|
|
@@ -34,9 +34,9 @@ Comprehensive guide to agent configuration patterns.
|
|
|
34
34
|
|
|
35
35
|
### [Context Management](./CONTEXT_MANAGEMENT.md)
|
|
36
36
|
|
|
37
|
-
Session
|
|
37
|
+
Session step, lifecycle hooks, and persistent conversations.
|
|
38
38
|
|
|
39
|
-
**Topics:** Session
|
|
39
|
+
**Topics:** Session step, lifecycle hooks, context updates, multi-turn conversations, persistence patterns
|
|
40
40
|
|
|
41
41
|
---
|
|
42
42
|
|
|
@@ -48,19 +48,19 @@ Deep dives into specific features:
|
|
|
48
48
|
|
|
49
49
|
Complete guide to creating and managing conversational routes.
|
|
50
50
|
|
|
51
|
-
**Topics:** Route creation, initial
|
|
51
|
+
**Topics:** Route creation, initial step configuration, data extraction, sequential steps, security, branching logic
|
|
52
52
|
|
|
53
|
-
### [
|
|
53
|
+
### [Steps Guide](./STEPS.md)
|
|
54
54
|
|
|
55
|
-
Complete guide to creating and managing
|
|
55
|
+
Complete guide to creating and managing steps in conversational flows.
|
|
56
56
|
|
|
57
|
-
**Topics:**
|
|
57
|
+
**Topics:** Step types, transitions, data collecting, step logic, skip conditions, configuration, advanced patterns
|
|
58
58
|
|
|
59
59
|
### [API Reference](./API_REFERENCE.md)
|
|
60
60
|
|
|
61
61
|
Complete API documentation for all classes, methods, and types.
|
|
62
62
|
|
|
63
|
-
**Topics:** Agent class, Route class,
|
|
63
|
+
**Topics:** Agent class, Route class, Step class, defineTool, providers, all APIs
|
|
64
64
|
|
|
65
65
|
### [AI Providers](./PROVIDERS.md)
|
|
66
66
|
|
|
@@ -103,7 +103,7 @@ Comprehensive guide to all 15+ production-ready examples.
|
|
|
103
103
|
Browse the `/examples` directory for runnable code:
|
|
104
104
|
|
|
105
105
|
- [Business Onboarding](../examples/business-onboarding.ts) - Complex multi-step workflows
|
|
106
|
-
- [Travel Agent](../examples/travel-agent.ts) - Session
|
|
106
|
+
- [Travel Agent](../examples/travel-agent.ts) - Session step & data extraction
|
|
107
107
|
- [Healthcare Agent](../examples/healthcare-agent.ts) - Security & validation
|
|
108
108
|
- [Streaming Agent](../examples/streaming-agent.ts) - Real-time responses
|
|
109
109
|
- [Prisma Persistence](../examples/prisma-persistence.ts) - Database integration
|
|
@@ -140,7 +140,7 @@ Internal guide for maintainers on publishing releases.
|
|
|
140
140
|
- **Understand the design** → [Architecture](./ARCHITECTURE.md)
|
|
141
141
|
- **Configure my agent** → [Agent](./AGENT.md)
|
|
142
142
|
- **Create conversational flows** → [Routes Guide](./ROUTES.md)
|
|
143
|
-
- **Manage
|
|
143
|
+
- **Manage steps** → [Steps Guide](./STEPS.md)
|
|
144
144
|
- **Persist conversations** → [Persistence Guide](./PERSISTENCE.md)
|
|
145
145
|
- **Add tool security** → [Domain Organization](./DOMAINS.md)
|
|
146
146
|
- **See real examples** → [Examples Guide](./EXAMPLES.md)
|
|
@@ -162,13 +162,13 @@ Internal guide for maintainers on publishing releases.
|
|
|
162
162
|
- [Context Management](./CONTEXT_MANAGEMENT.md)
|
|
163
163
|
- [Getting Started](./GETTING_STARTED.md)
|
|
164
164
|
|
|
165
|
-
**Routes &
|
|
165
|
+
**Routes & Step Machines:**
|
|
166
166
|
|
|
167
167
|
- [Routes Guide](./ROUTES.md) - Complete guide to routes
|
|
168
|
-
- [
|
|
168
|
+
- [Steps Guide](./STEPS.md) - Complete guide to steps
|
|
169
169
|
- [API Reference - Routes](./API_REFERENCE.md#route)
|
|
170
|
-
- [API Reference -
|
|
171
|
-
- [Architecture -
|
|
170
|
+
- [API Reference - Steps](./API_REFERENCE.md#step)
|
|
171
|
+
- [Architecture - Step Machines](./ARCHITECTURE.md#step-machines)
|
|
172
172
|
- [Examples - Complex Flows](./EXAMPLES.md#-real-world-applications)
|
|
173
173
|
|
|
174
174
|
**Tools & Domains:**
|
|
@@ -180,13 +180,13 @@ Internal guide for maintainers on publishing releases.
|
|
|
180
180
|
**Data Extraction:**
|
|
181
181
|
|
|
182
182
|
- [Architecture - Schema-First](./ARCHITECTURE.md#schema-first-data-extraction)
|
|
183
|
-
- [API Reference -
|
|
183
|
+
- [API Reference - schema](./API_REFERENCE.md#schema)
|
|
184
184
|
- [Examples - Travel Agent](./EXAMPLES.md#-travel-agent)
|
|
185
185
|
|
|
186
|
-
**Session
|
|
186
|
+
**Session Step:**
|
|
187
187
|
|
|
188
188
|
- [Context Management](./CONTEXT_MANAGEMENT.md)
|
|
189
|
-
- [Architecture - Session
|
|
189
|
+
- [Architecture - Session Step](./ARCHITECTURE.md#session-step-management)
|
|
190
190
|
- [API Reference - createSession](./API_REFERENCE.md#createsession)
|
|
191
191
|
|
|
192
192
|
**Persistence:**
|
package/docs/DOMAINS.md
CHANGED
|
@@ -45,9 +45,9 @@ const route = agent.createRoute({
|
|
|
45
45
|
// No domains specified = all tools available
|
|
46
46
|
});
|
|
47
47
|
|
|
48
|
-
route.
|
|
49
|
-
.
|
|
50
|
-
.
|
|
48
|
+
route.initialStep
|
|
49
|
+
.nextStep({ tool: saveName }) // ✅ Works
|
|
50
|
+
.nextStep({ tool: saveEmail }); // ✅ Works
|
|
51
51
|
```
|
|
52
52
|
|
|
53
53
|
**Result**: Everything works. All tools can execute. Simple and easy!
|
|
@@ -96,17 +96,17 @@ const adminRoute = agent.createRoute({
|
|
|
96
96
|
});
|
|
97
97
|
|
|
98
98
|
// 3️⃣ Tools execute based on route restrictions
|
|
99
|
-
onboardingRoute.
|
|
100
|
-
.
|
|
101
|
-
.
|
|
99
|
+
onboardingRoute.initialStep
|
|
100
|
+
.nextStep({ tool: agent.domain.user.saveName }) // ✅ Allowed
|
|
101
|
+
.nextStep({ tool: agent.domain.payment.processPayment }); // ❌ Blocked!
|
|
102
102
|
|
|
103
|
-
checkoutRoute.
|
|
104
|
-
.
|
|
105
|
-
.
|
|
103
|
+
checkoutRoute.initialStep
|
|
104
|
+
.nextStep({ tool: agent.domain.payment.processPayment }) // ✅ Allowed
|
|
105
|
+
.nextStep({ tool: agent.domain.user.saveName }); // ❌ Blocked!
|
|
106
106
|
|
|
107
|
-
adminRoute.
|
|
108
|
-
.
|
|
109
|
-
.
|
|
107
|
+
adminRoute.initialStep
|
|
108
|
+
.nextStep({ tool: agent.domain.user.saveName }) // ✅ Allowed
|
|
109
|
+
.nextStep({ tool: agent.domain.payment.processPayment }); // ✅ Allowed
|
|
110
110
|
```
|
|
111
111
|
|
|
112
112
|
**Result**: Tools are restricted by route. Security and isolation guaranteed!
|
|
@@ -638,7 +638,7 @@ const route = agent.createRoute({
|
|
|
638
638
|
title: "Checkout",
|
|
639
639
|
});
|
|
640
640
|
|
|
641
|
-
route.
|
|
641
|
+
route.initialStep.nextStep({ tool: processPayment });
|
|
642
642
|
|
|
643
643
|
// AFTER: With domains
|
|
644
644
|
const agent = new Agent({
|
|
@@ -657,8 +657,8 @@ const route = agent.createRoute({
|
|
|
657
657
|
});
|
|
658
658
|
|
|
659
659
|
// Access via domain registry
|
|
660
|
-
route.
|
|
661
|
-
|
|
660
|
+
route.initialStep.nextStep({
|
|
661
|
+
tool: agent.domain.payment.processPayment,
|
|
662
662
|
});
|
|
663
663
|
```
|
|
664
664
|
|
|
@@ -705,7 +705,7 @@ if (allowedDomains !== undefined && tool.domainName) {
|
|
|
705
705
|
|
|
706
706
|
### What Gets Enforced
|
|
707
707
|
|
|
708
|
-
✅ **Tools in
|
|
708
|
+
✅ **Tools in step machine transitions** (`tool`)
|
|
709
709
|
✅ **Multiple domain access** (route can allow several domains)
|
|
710
710
|
✅ **Empty array enforcement** (`domains: []` blocks all tools)
|
|
711
711
|
✅ **Undefined = all allowed** (backward compatible)
|