@falai/agent 0.6.3 → 0.6.4
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 +89 -29
- package/dist/cjs/constants/index.d.ts +6 -1
- package/dist/cjs/constants/index.d.ts.map +1 -1
- package/dist/cjs/constants/index.js +8 -3
- package/dist/cjs/constants/index.js.map +1 -1
- package/dist/cjs/core/Agent.d.ts +22 -0
- package/dist/cjs/core/Agent.d.ts.map +1 -1
- package/dist/cjs/core/Agent.js +108 -21
- package/dist/cjs/core/Agent.js.map +1 -1
- package/dist/cjs/core/Events.d.ts +13 -0
- package/dist/cjs/core/Events.d.ts.map +1 -1
- package/dist/cjs/core/Events.js +28 -14
- package/dist/cjs/core/Events.js.map +1 -1
- package/dist/cjs/core/Route.d.ts.map +1 -1
- package/dist/cjs/core/Route.js +4 -4
- package/dist/cjs/core/Route.js.map +1 -1
- package/dist/cjs/core/RoutingEngine.d.ts +6 -1
- package/dist/cjs/core/RoutingEngine.d.ts.map +1 -1
- package/dist/cjs/core/RoutingEngine.js +112 -37
- package/dist/cjs/core/RoutingEngine.js.map +1 -1
- package/dist/cjs/core/State.d.ts +15 -5
- package/dist/cjs/core/State.d.ts.map +1 -1
- package/dist/cjs/core/State.js +24 -5
- package/dist/cjs/core/State.js.map +1 -1
- package/dist/cjs/core/Tool.d.ts +8 -1
- package/dist/cjs/core/Tool.d.ts.map +1 -1
- package/dist/cjs/core/Tool.js +25 -28
- package/dist/cjs/core/Tool.js.map +1 -1
- package/dist/cjs/core/Transition.js +1 -1
- package/dist/cjs/index.d.ts +1 -1
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +3 -2
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/types/agent.d.ts +5 -0
- package/dist/cjs/types/agent.d.ts.map +1 -1
- package/dist/cjs/types/agent.js.map +1 -1
- package/dist/cjs/types/route.d.ts +7 -1
- package/dist/cjs/types/route.d.ts.map +1 -1
- package/dist/cjs/types/session.d.ts +12 -1
- package/dist/cjs/types/session.d.ts.map +1 -1
- package/dist/cjs/types/session.js +26 -5
- package/dist/cjs/types/session.js.map +1 -1
- package/dist/cjs/utils/logger.d.ts +10 -0
- package/dist/cjs/utils/logger.d.ts.map +1 -0
- package/dist/cjs/utils/logger.js +23 -0
- package/dist/cjs/utils/logger.js.map +1 -0
- package/dist/constants/index.d.ts +6 -1
- package/dist/constants/index.d.ts.map +1 -1
- package/dist/constants/index.js +6 -1
- package/dist/constants/index.js.map +1 -1
- package/dist/core/Agent.d.ts +22 -0
- package/dist/core/Agent.d.ts.map +1 -1
- package/dist/core/Agent.js +108 -21
- package/dist/core/Agent.js.map +1 -1
- package/dist/core/Events.d.ts +13 -0
- package/dist/core/Events.d.ts.map +1 -1
- package/dist/core/Events.js +28 -14
- package/dist/core/Events.js.map +1 -1
- package/dist/core/Route.d.ts.map +1 -1
- package/dist/core/Route.js +4 -4
- package/dist/core/Route.js.map +1 -1
- package/dist/core/RoutingEngine.d.ts +6 -1
- package/dist/core/RoutingEngine.d.ts.map +1 -1
- package/dist/core/RoutingEngine.js +112 -37
- package/dist/core/RoutingEngine.js.map +1 -1
- package/dist/core/State.d.ts +15 -5
- package/dist/core/State.d.ts.map +1 -1
- package/dist/core/State.js +25 -6
- package/dist/core/State.js.map +1 -1
- package/dist/core/Tool.d.ts +8 -1
- package/dist/core/Tool.d.ts.map +1 -1
- package/dist/core/Tool.js +25 -28
- package/dist/core/Tool.js.map +1 -1
- package/dist/core/Transition.js +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/types/agent.d.ts +5 -0
- package/dist/types/agent.d.ts.map +1 -1
- package/dist/types/agent.js.map +1 -1
- package/dist/types/route.d.ts +7 -1
- package/dist/types/route.d.ts.map +1 -1
- package/dist/types/session.d.ts +12 -1
- package/dist/types/session.d.ts.map +1 -1
- package/dist/types/session.js +26 -5
- package/dist/types/session.js.map +1 -1
- package/dist/utils/logger.d.ts +10 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +17 -0
- package/dist/utils/logger.js.map +1 -0
- package/docs/{CONSTRUCTOR_OPTIONS.md → AGENT.md} +79 -7
- package/docs/API_REFERENCE.md +309 -18
- package/docs/ARCHITECTURE.md +1 -1
- package/docs/DOCS.md +46 -22
- package/docs/GETTING_STARTED.md +1 -1
- package/docs/README.md +13 -5
- package/docs/ROUTES.md +743 -0
- package/docs/STATES.md +798 -0
- package/examples/business-onboarding.ts +46 -5
- package/examples/company-qna-agent.ts +107 -1
- package/examples/custom-database-persistence.ts +44 -1
- package/examples/declarative-agent.ts +80 -37
- package/examples/domain-scoping.ts +91 -21
- package/examples/extracted-data-modification.ts +64 -2
- package/examples/healthcare-agent.ts +61 -4
- package/examples/openai-agent.ts +24 -2
- package/examples/opensearch-persistence.ts +26 -1
- package/examples/persistent-onboarding.ts +84 -18
- package/examples/prisma-persistence.ts +90 -16
- package/examples/redis-persistence.ts +89 -17
- package/examples/rules-prohibitions.ts +300 -139
- package/examples/streaming-agent.ts +60 -0
- package/examples/travel-agent.ts +66 -24
- package/package.json +3 -2
- package/src/constants/index.ts +6 -1
- package/src/core/Agent.ts +135 -21
- package/src/core/Events.ts +73 -10
- package/src/core/Route.ts +8 -4
- package/src/core/RoutingEngine.ts +150 -39
- package/src/core/State.ts +35 -10
- package/src/core/Tool.ts +67 -10
- package/src/core/Transition.ts +1 -1
- package/src/index.ts +1 -1
- package/src/types/agent.ts +5 -0
- package/src/types/route.ts +10 -1
- package/src/types/session.ts +42 -6
- package/src/utils/logger.ts +19 -0
package/README.md
CHANGED
|
@@ -93,7 +93,6 @@
|
|
|
93
93
|
|
|
94
94
|
---
|
|
95
95
|
|
|
96
|
-
|
|
97
96
|
## 📦 Installation
|
|
98
97
|
|
|
99
98
|
```bash
|
|
@@ -113,7 +112,7 @@ yarn add @falai/agent
|
|
|
113
112
|
|
|
114
113
|
## 🚀 Quick Start
|
|
115
114
|
|
|
116
|
-
Build a conversational AI agent in
|
|
115
|
+
Build a data-driven conversational AI agent in minutes. This example shows how to intelligently gather structured data over multiple turns.
|
|
117
116
|
|
|
118
117
|
```typescript
|
|
119
118
|
import {
|
|
@@ -122,65 +121,117 @@ import {
|
|
|
122
121
|
defineTool,
|
|
123
122
|
createMessageEvent,
|
|
124
123
|
EventSource,
|
|
124
|
+
END_STATE,
|
|
125
|
+
type ToolContext,
|
|
125
126
|
} from "@falai/agent";
|
|
126
127
|
|
|
127
|
-
// 1️⃣
|
|
128
|
+
// 1️⃣ Define the data you want to collect
|
|
129
|
+
interface HotelBookingData {
|
|
130
|
+
hotelName: string;
|
|
131
|
+
date: string;
|
|
132
|
+
guests: number;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// 2️⃣ Create your agent
|
|
128
136
|
const agent = new Agent({
|
|
129
137
|
name: "BookingBot",
|
|
130
|
-
description: "
|
|
138
|
+
description: "A hotel booking assistant that gathers information.",
|
|
131
139
|
ai: new GeminiProvider({
|
|
132
140
|
apiKey: process.env.GEMINI_API_KEY!,
|
|
133
|
-
model: "models/gemini-2.5-flash",
|
|
141
|
+
model: "models/gemini-2.5-flash", // or your preferred model
|
|
134
142
|
}),
|
|
135
|
-
context: { userId: "user_123" },
|
|
136
143
|
});
|
|
137
144
|
|
|
138
|
-
//
|
|
139
|
-
const
|
|
140
|
-
"
|
|
141
|
-
async (
|
|
142
|
-
|
|
145
|
+
// 3️⃣ Define a tool that uses the collected data
|
|
146
|
+
const bookHotel = defineTool(
|
|
147
|
+
"book_hotel",
|
|
148
|
+
async ({ extracted }: ToolContext<{}, HotelBookingData>) => {
|
|
149
|
+
// Logic to book the hotel...
|
|
150
|
+
return {
|
|
151
|
+
data: `Booking confirmed for ${extracted?.guests} at ${extracted?.hotelName} on ${extracted?.date}!`,
|
|
152
|
+
};
|
|
143
153
|
},
|
|
144
|
-
{ description: "
|
|
154
|
+
{ description: "Books a hotel once all information is collected." }
|
|
145
155
|
);
|
|
146
156
|
|
|
147
|
-
//
|
|
148
|
-
const bookingRoute = agent.createRoute({
|
|
157
|
+
// 4️⃣ Create a data-driven route
|
|
158
|
+
const bookingRoute = agent.createRoute<HotelBookingData>({
|
|
149
159
|
title: "Book Hotel",
|
|
160
|
+
description: "Guides the user through the hotel booking process.",
|
|
150
161
|
conditions: ["User wants to book a hotel"],
|
|
162
|
+
extractionSchema: {
|
|
163
|
+
type: "object",
|
|
164
|
+
properties: {
|
|
165
|
+
hotelName: { type: "string", description: "The name of the hotel." },
|
|
166
|
+
date: { type: "string", description: "The desired booking date." },
|
|
167
|
+
guests: { type: "number", description: "The number of guests." },
|
|
168
|
+
},
|
|
169
|
+
required: ["hotelName", "date", "guests"],
|
|
170
|
+
},
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
// 5️⃣ Build the flow to gather data step-by-step
|
|
174
|
+
const askHotel = bookingRoute.initialState.transitionTo({
|
|
175
|
+
chatState: "Ask which hotel they want to book",
|
|
176
|
+
gather: ["hotelName"],
|
|
177
|
+
skipIf: (extracted) => !!extracted.hotelName, // Skip if we already have it
|
|
151
178
|
});
|
|
152
179
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
180
|
+
const askDate = askHotel.transitionTo({
|
|
181
|
+
chatState: "Ask for the booking date",
|
|
182
|
+
gather: ["date"],
|
|
183
|
+
skipIf: (extracted) => !!extracted.date,
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
const askGuests = askDate.transitionTo({
|
|
187
|
+
chatState: "Ask for the number of guests",
|
|
188
|
+
gather: ["guests"],
|
|
189
|
+
skipIf: (extracted) => !!extracted.guests,
|
|
190
|
+
});
|
|
159
191
|
|
|
160
|
-
|
|
192
|
+
const confirmBooking = askGuests.transitionTo({
|
|
193
|
+
toolState: bookHotel,
|
|
194
|
+
condition:
|
|
195
|
+
"All required information (hotel, date, guests) has been collected.",
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
confirmBooking.transitionTo({
|
|
199
|
+
state: END_STATE, // End the conversation flow
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
// 6️⃣ Start conversing
|
|
161
203
|
const response = await agent.respond({
|
|
162
204
|
history: [
|
|
163
205
|
createMessageEvent(
|
|
164
206
|
EventSource.CUSTOMER,
|
|
165
207
|
"Alice",
|
|
166
|
-
"
|
|
208
|
+
"I want to book a room at the Grand Hotel for 2 people."
|
|
167
209
|
),
|
|
168
210
|
],
|
|
169
211
|
});
|
|
170
212
|
|
|
171
|
-
|
|
213
|
+
// The agent sees that `hotelName` and `guests` are provided,
|
|
214
|
+
// skips the first and third steps, and only asks for the date.
|
|
215
|
+
console.log(response.message);
|
|
216
|
+
// Expected: "Sure, for what date would you like to book at the Grand Hotel?"
|
|
172
217
|
```
|
|
173
218
|
|
|
174
|
-
**That's it!** The agent will:
|
|
175
|
-
|
|
176
|
-
- ✅
|
|
177
|
-
- ✅
|
|
219
|
+
**That's it!** The data-driven agent will:
|
|
220
|
+
|
|
221
|
+
- ✅ **Understand the Goal** - Route to the `Book Hotel` flow based on user intent.
|
|
222
|
+
- ✅ **Extract Known Data** - Automatically pull `hotelName` and `guests` from the first message.
|
|
223
|
+
- ✅ **Skip Unneeded Steps** - Use `skipIf` to bypass questions for data it already has.
|
|
224
|
+
- ✅ **Gather Missing Data** - Intelligently ask only for the missing `date`.
|
|
225
|
+
- ✅ **Execute Deterministically** - Call the `bookHotel` tool only when all required data is present.
|
|
226
|
+
|
|
227
|
+
This creates a flexible and natural conversation, guided by a clear data structure.
|
|
178
228
|
|
|
179
229
|
📖 **[See more examples →](./docs/EXAMPLES.md)** | **[Full tutorial →](./docs/GETTING_STARTED.md)**
|
|
180
230
|
|
|
181
231
|
### ⚡ Advanced Features
|
|
182
232
|
|
|
183
233
|
**Streaming responses** for real-time UX:
|
|
234
|
+
|
|
184
235
|
```typescript
|
|
185
236
|
for await (const chunk of agent.respondStream({ history })) {
|
|
186
237
|
process.stdout.write(chunk.delta);
|
|
@@ -188,6 +239,7 @@ for await (const chunk of agent.respondStream({ history })) {
|
|
|
188
239
|
```
|
|
189
240
|
|
|
190
241
|
**Session state** for multi-turn conversations:
|
|
242
|
+
|
|
191
243
|
```typescript
|
|
192
244
|
let session = createSession<MyData>();
|
|
193
245
|
const response = await agent.respond({ history, session });
|
|
@@ -195,10 +247,11 @@ session = response.session!; // Tracks progress across turns
|
|
|
195
247
|
```
|
|
196
248
|
|
|
197
249
|
**Database persistence** with any adapter:
|
|
250
|
+
|
|
198
251
|
```typescript
|
|
199
252
|
import { PrismaAdapter } from "@falai/agent";
|
|
200
253
|
const agent = new Agent({
|
|
201
|
-
persistence: { adapter: new PrismaAdapter({ prisma }) }
|
|
254
|
+
persistence: { adapter: new PrismaAdapter({ prisma }) },
|
|
202
255
|
});
|
|
203
256
|
```
|
|
204
257
|
|
|
@@ -211,15 +264,19 @@ const agent = new Agent({
|
|
|
211
264
|
📋 **[Complete Documentation Index →](docs/DOCS.md)** - Searchable index of all docs
|
|
212
265
|
|
|
213
266
|
**Core Guides:**
|
|
267
|
+
|
|
214
268
|
- 📘 **[Getting Started](./docs/GETTING_STARTED.md)** - Build your first agent in 5 minutes
|
|
215
269
|
- 🏗️ **[Architecture](./docs/ARCHITECTURE.md)** - Design principles & philosophy
|
|
216
270
|
- 🔧 **[API Reference](./docs/API_REFERENCE.md)** - Complete API documentation
|
|
217
271
|
- 📝 **[Examples](./docs/EXAMPLES.md)** - Production-ready code examples
|
|
218
272
|
|
|
219
273
|
**Feature Guides:**
|
|
274
|
+
|
|
275
|
+
- 🛤️ **[Routes](./docs/ROUTES.md)** - Creating conversational routes & flows
|
|
276
|
+
- 🔄 **[States](./docs/STATES.md)** - Managing states & transitions
|
|
220
277
|
- 💾 **[Persistence](./docs/PERSISTENCE.md)** - Database integration with adapters
|
|
221
278
|
- 🔒 **[Domains](./docs/DOMAINS.md)** - Optional tool security & organization
|
|
222
|
-
- 🎛️ **[
|
|
279
|
+
- 🎛️ **[Agent](./docs/AGENT.md)** - Configuration patterns
|
|
223
280
|
- 📊 **[Context Management](./docs/CONTEXT_MANAGEMENT.md)** - Session state & lifecycle hooks
|
|
224
281
|
- 🤖 **[AI Providers](./docs/PROVIDERS.md)** - Anthropic, OpenAI, Gemini, OpenRouter
|
|
225
282
|
|
|
@@ -228,6 +285,7 @@ const agent = new Agent({
|
|
|
228
285
|
## 🎯 Examples
|
|
229
286
|
|
|
230
287
|
**Core Examples:**
|
|
288
|
+
|
|
231
289
|
- 🏢 **[Business Onboarding](./examples/business-onboarding.ts)** - Complex multi-step flow with branching
|
|
232
290
|
- ✈️ **[Travel Agent](./examples/travel-agent.ts)** - Multi-route booking system with session state
|
|
233
291
|
- 🏥 **[Healthcare Assistant](./examples/healthcare-agent.ts)** - Appointment scheduling & lab results
|
|
@@ -235,6 +293,7 @@ const agent = new Agent({
|
|
|
235
293
|
- ⚡ **[Streaming Responses](./examples/streaming-agent.ts)** - Real-time response streaming
|
|
236
294
|
|
|
237
295
|
**Persistence & Advanced:**
|
|
296
|
+
|
|
238
297
|
- 💾 **[Prisma Persistence](./examples/prisma-persistence.ts)** - Auto-save with Prisma ORM
|
|
239
298
|
- ⚡ **[Redis Persistence](./examples/redis-persistence.ts)** - Fast in-memory sessions
|
|
240
299
|
- 🔐 **[Domain Scoping](./examples/domain-scoping.ts)** - Tool security per route
|
|
@@ -255,6 +314,7 @@ const agent = new Agent({
|
|
|
255
314
|
5. **Message Generation** - AI generates natural responses based on current state
|
|
256
315
|
|
|
257
316
|
**Behind the scenes:**
|
|
317
|
+
|
|
258
318
|
- The AI only generates messages and extracts data - it never decides which tools to call
|
|
259
319
|
- Tools execute deterministically based on state transitions and code-based conditions
|
|
260
320
|
- Session state tracks progress and extracted data across conversation turns
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Special marker to end a route/journey
|
|
3
3
|
*/
|
|
4
|
-
export declare const
|
|
4
|
+
export declare const END_STATE: unique symbol;
|
|
5
|
+
/**
|
|
6
|
+
* String constant for END_STATE comparisons
|
|
7
|
+
* Use this when checking if currentState.id has reached END_STATE
|
|
8
|
+
*/
|
|
9
|
+
export declare const END_STATE_ID = "END_STATE";
|
|
5
10
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/constants/index.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/constants/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,SAAS,eAAsB,CAAC;AAE7C;;;GAGG;AACH,eAAO,MAAM,YAAY,cAAc,CAAC"}
|
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.END_STATE_ID = exports.END_STATE = void 0;
|
|
2
4
|
/**
|
|
3
5
|
* Special marker to end a route/journey
|
|
4
6
|
*/
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
7
|
+
exports.END_STATE = Symbol("END_STATE");
|
|
8
|
+
/**
|
|
9
|
+
* String constant for END_STATE comparisons
|
|
10
|
+
* Use this when checking if currentState.id has reached END_STATE
|
|
11
|
+
*/
|
|
12
|
+
exports.END_STATE_ID = "END_STATE";
|
|
8
13
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/constants/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/constants/index.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACU,QAAA,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;AAE7C;;;GAGG;AACU,QAAA,YAAY,GAAG,WAAW,CAAC"}
|
package/dist/cjs/core/Agent.d.ts
CHANGED
|
@@ -22,6 +22,7 @@ export declare class Agent<TContext = unknown> {
|
|
|
22
22
|
private persistenceManager;
|
|
23
23
|
private routingEngine;
|
|
24
24
|
private responseEngine;
|
|
25
|
+
private currentSession?;
|
|
25
26
|
/**
|
|
26
27
|
* Dynamic domain property - populated via addDomain
|
|
27
28
|
*/
|
|
@@ -95,6 +96,7 @@ export declare class Agent<TContext = unknown> {
|
|
|
95
96
|
toolName: string;
|
|
96
97
|
arguments: Record<string, unknown>;
|
|
97
98
|
}>;
|
|
99
|
+
isRouteComplete?: boolean;
|
|
98
100
|
}>;
|
|
99
101
|
/**
|
|
100
102
|
* Generate a response based on history and context
|
|
@@ -112,6 +114,7 @@ export declare class Agent<TContext = unknown> {
|
|
|
112
114
|
toolName: string;
|
|
113
115
|
arguments: Record<string, unknown>;
|
|
114
116
|
}>;
|
|
117
|
+
isRouteComplete?: boolean;
|
|
115
118
|
}>;
|
|
116
119
|
/**
|
|
117
120
|
* Get all routes
|
|
@@ -153,5 +156,24 @@ export declare class Agent<TContext = unknown> {
|
|
|
153
156
|
* @returns Filtered domains object, or all domains if route has no restrictions
|
|
154
157
|
*/
|
|
155
158
|
getDomainsForRouteByTitle(routeTitle: string): Record<string, Record<string, unknown>>;
|
|
159
|
+
/**
|
|
160
|
+
* Set the current session for convenience methods
|
|
161
|
+
* @param session - Session state to use for subsequent calls
|
|
162
|
+
*/
|
|
163
|
+
setCurrentSession(session: SessionState): void;
|
|
164
|
+
/**
|
|
165
|
+
* Get the current session (if set)
|
|
166
|
+
*/
|
|
167
|
+
getCurrentSession(): SessionState | undefined;
|
|
168
|
+
/**
|
|
169
|
+
* Clear the current session
|
|
170
|
+
*/
|
|
171
|
+
clearCurrentSession(): void;
|
|
172
|
+
/**
|
|
173
|
+
* Get extracted data from current session
|
|
174
|
+
* @param routeId - Optional route ID to get data for (uses current route if not provided)
|
|
175
|
+
* @returns The extracted data from the current session
|
|
176
|
+
*/
|
|
177
|
+
getExtractedData<TExtracted = unknown>(routeId?: string): Partial<TExtracted>;
|
|
156
178
|
}
|
|
157
179
|
//# sourceMappingURL=Agent.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Agent.d.ts","sourceRoot":"","sources":["../../../src/core/Agent.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAChF,OAAO,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"Agent.d.ts","sourceRoot":"","sources":["../../../src/core/Agent.ts"],"names":[],"mappings":"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"}
|
package/dist/cjs/core/Agent.js
CHANGED
|
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.Agent = void 0;
|
|
7
7
|
const session_1 = require("../types/session");
|
|
8
8
|
const PromptComposer_1 = require("./PromptComposer");
|
|
9
|
+
const logger_1 = require("../utils/logger");
|
|
9
10
|
const Route_1 = require("./Route");
|
|
10
11
|
const DomainRegistry_1 = require("./DomainRegistry");
|
|
11
12
|
const PersistenceManager_1 = require("./PersistenceManager");
|
|
@@ -13,6 +14,7 @@ const RoutingEngine_1 = require("./RoutingEngine");
|
|
|
13
14
|
const ResponseEngine_1 = require("./ResponseEngine");
|
|
14
15
|
const ToolExecutor_1 = require("./ToolExecutor");
|
|
15
16
|
const event_1 = require("../utils/event");
|
|
17
|
+
const constants_1 = require("../constants");
|
|
16
18
|
/**
|
|
17
19
|
* Main Agent class with generic context support
|
|
18
20
|
*/
|
|
@@ -29,12 +31,18 @@ class Agent {
|
|
|
29
31
|
* Dynamic domain property - populated via addDomain
|
|
30
32
|
*/
|
|
31
33
|
this.domain = {};
|
|
34
|
+
// Set log level based on debug option
|
|
35
|
+
if (options.debug) {
|
|
36
|
+
logger_1.logger.setLevel(logger_1.LoggerLevel.DEBUG);
|
|
37
|
+
}
|
|
32
38
|
// Validate context configuration
|
|
33
39
|
if (options.context !== undefined && options.contextProvider) {
|
|
34
40
|
throw new Error("Cannot provide both 'context' and 'contextProvider'. Choose one.");
|
|
35
41
|
}
|
|
36
42
|
// Initialize context if provided
|
|
37
43
|
this.context = options.context;
|
|
44
|
+
// Initialize current session if provided
|
|
45
|
+
this.currentSession = options.session;
|
|
38
46
|
// Initialize routing and response engines
|
|
39
47
|
this.routingEngine = new RoutingEngine_1.RoutingEngine({
|
|
40
48
|
maxCandidates: 5,
|
|
@@ -48,7 +56,7 @@ class Agent {
|
|
|
48
56
|
// Initialize the adapter if it has an initialize method
|
|
49
57
|
if (options.persistence.adapter.initialize) {
|
|
50
58
|
options.persistence.adapter.initialize().catch((error) => {
|
|
51
|
-
|
|
59
|
+
logger_1.logger.error("[Agent] Persistence adapter initialization failed:", error);
|
|
52
60
|
});
|
|
53
61
|
}
|
|
54
62
|
}
|
|
@@ -218,8 +226,8 @@ class Agent {
|
|
|
218
226
|
...currentContext,
|
|
219
227
|
...contextOverride,
|
|
220
228
|
};
|
|
221
|
-
// Initialize or get session
|
|
222
|
-
let session = params.session || (0, session_1.createSession)();
|
|
229
|
+
// Initialize or get session (use current session if available)
|
|
230
|
+
let session = params.session || this.currentSession || (0, session_1.createSession)();
|
|
223
231
|
// PHASE 1: TOOL EXECUTION - Execute tools if current state has toolState
|
|
224
232
|
if (session.currentRoute && session.currentState) {
|
|
225
233
|
const currentRoute = this.routes.find((r) => r.id === session.currentRoute?.id);
|
|
@@ -240,9 +248,9 @@ class Agent {
|
|
|
240
248
|
// Update extracted data with tool results
|
|
241
249
|
if (result.extractedUpdate) {
|
|
242
250
|
session = await this.updateExtracted(session, result.extractedUpdate);
|
|
243
|
-
|
|
251
|
+
logger_1.logger.debug(`[Agent] Tool updated extracted data:`, result.extractedUpdate);
|
|
244
252
|
}
|
|
245
|
-
|
|
253
|
+
logger_1.logger.debug(`[Agent] Executed tool: ${result.toolName} (success: ${result.success})`);
|
|
246
254
|
}
|
|
247
255
|
}
|
|
248
256
|
}
|
|
@@ -251,6 +259,7 @@ class Agent {
|
|
|
251
259
|
let selectedRoute;
|
|
252
260
|
let responseDirectives;
|
|
253
261
|
let selectedState;
|
|
262
|
+
let isRouteComplete = false;
|
|
254
263
|
if (this.routes.length > 0) {
|
|
255
264
|
const orchestration = await this.routingEngine.decideRouteAndState({
|
|
256
265
|
routes: this.routes,
|
|
@@ -270,9 +279,14 @@ class Agent {
|
|
|
270
279
|
selectedState = orchestration.selectedState;
|
|
271
280
|
responseDirectives = orchestration.responseDirectives;
|
|
272
281
|
session = orchestration.session;
|
|
282
|
+
isRouteComplete = orchestration.isRouteComplete || false;
|
|
283
|
+
// Log if route is complete
|
|
284
|
+
if (isRouteComplete) {
|
|
285
|
+
logger_1.logger.debug(`[Agent] Route complete: all required data collected, END_STATE reached`);
|
|
286
|
+
}
|
|
273
287
|
}
|
|
274
288
|
// PHASE 3: DETERMINE NEXT STATE - Use state from combined decision or get initial state
|
|
275
|
-
if (selectedRoute) {
|
|
289
|
+
if (selectedRoute && !isRouteComplete) {
|
|
276
290
|
let nextState;
|
|
277
291
|
// If we have a selected state from the combined routing decision, use it
|
|
278
292
|
if (selectedState) {
|
|
@@ -283,17 +297,17 @@ class Agent {
|
|
|
283
297
|
const candidates = this.routingEngine.getCandidateStates(selectedRoute, undefined, session.extracted);
|
|
284
298
|
if (candidates.length > 0) {
|
|
285
299
|
nextState = candidates[0].state;
|
|
286
|
-
|
|
300
|
+
logger_1.logger.debug(`[Agent] Using first valid state: ${nextState.id} for new route`);
|
|
287
301
|
}
|
|
288
302
|
else {
|
|
289
303
|
// Fallback to initial state even if it should be skipped
|
|
290
304
|
nextState = selectedRoute.initialState;
|
|
291
|
-
|
|
305
|
+
logger_1.logger.warn(`[Agent] No valid states found, using initial state: ${nextState.id}`);
|
|
292
306
|
}
|
|
293
307
|
}
|
|
294
308
|
// Update session with next state
|
|
295
309
|
session = (0, session_1.enterState)(session, nextState.id, nextState.description);
|
|
296
|
-
|
|
310
|
+
logger_1.logger.debug(`[Agent] Entered state: ${nextState.id}`);
|
|
297
311
|
// PHASE 4: RESPONSE GENERATION - Stream message using selected route and state
|
|
298
312
|
// Get last user message
|
|
299
313
|
const lastUserMessage = (0, event_1.getLastMessageFromHistory)(history);
|
|
@@ -333,7 +347,7 @@ class Agent {
|
|
|
333
347
|
// Merge gathered data into session
|
|
334
348
|
if (Object.keys(gatheredData).length > 0) {
|
|
335
349
|
session = await this.updateExtracted(session, gatheredData);
|
|
336
|
-
|
|
350
|
+
logger_1.logger.debug(`[Agent] Extracted data:`, gatheredData);
|
|
337
351
|
}
|
|
338
352
|
}
|
|
339
353
|
// Extract any additional data from structured response on final chunk
|
|
@@ -350,7 +364,11 @@ class Agent {
|
|
|
350
364
|
session.id &&
|
|
351
365
|
this.options.persistence?.autoSave !== false) {
|
|
352
366
|
await this.persistenceManager.saveSessionState(session.id, session);
|
|
353
|
-
|
|
367
|
+
logger_1.logger.debug(`[Agent] Auto-saved session state to persistence: ${session.id}`);
|
|
368
|
+
}
|
|
369
|
+
// Update current session if we have one
|
|
370
|
+
if (chunk.done && this.currentSession) {
|
|
371
|
+
this.currentSession = session;
|
|
354
372
|
}
|
|
355
373
|
yield {
|
|
356
374
|
delta: chunk.delta,
|
|
@@ -358,9 +376,23 @@ class Agent {
|
|
|
358
376
|
done: chunk.done,
|
|
359
377
|
session, // Return updated session
|
|
360
378
|
toolCalls,
|
|
379
|
+
isRouteComplete,
|
|
361
380
|
};
|
|
362
381
|
}
|
|
363
382
|
}
|
|
383
|
+
else if (isRouteComplete && selectedRoute) {
|
|
384
|
+
// Route is complete - set state to END_STATE marker and yield completion signal
|
|
385
|
+
session = (0, session_1.enterState)(session, constants_1.END_STATE_ID, "Route completed");
|
|
386
|
+
logger_1.logger.debug(`[Agent] Route ${selectedRoute.title} completed. Entered END_STATE state.`);
|
|
387
|
+
yield {
|
|
388
|
+
delta: "",
|
|
389
|
+
accumulated: "",
|
|
390
|
+
done: true,
|
|
391
|
+
session,
|
|
392
|
+
toolCalls: undefined,
|
|
393
|
+
isRouteComplete: true,
|
|
394
|
+
};
|
|
395
|
+
}
|
|
364
396
|
else {
|
|
365
397
|
// Fallback: No routes defined, stream a simple response
|
|
366
398
|
const fallbackPrompt = new PromptComposer_1.PromptComposer()
|
|
@@ -393,12 +425,17 @@ class Agent {
|
|
|
393
425
|
},
|
|
394
426
|
});
|
|
395
427
|
for await (const chunk of stream) {
|
|
428
|
+
// Update current session if we have one
|
|
429
|
+
if (chunk.done && this.currentSession) {
|
|
430
|
+
this.currentSession = session;
|
|
431
|
+
}
|
|
396
432
|
yield {
|
|
397
433
|
delta: chunk.delta,
|
|
398
434
|
accumulated: chunk.accumulated,
|
|
399
435
|
done: chunk.done,
|
|
400
436
|
session, // Return updated session
|
|
401
437
|
toolCalls: undefined,
|
|
438
|
+
isRouteComplete: false,
|
|
402
439
|
};
|
|
403
440
|
}
|
|
404
441
|
}
|
|
@@ -421,8 +458,8 @@ class Agent {
|
|
|
421
458
|
...currentContext,
|
|
422
459
|
...contextOverride,
|
|
423
460
|
};
|
|
424
|
-
// Initialize or get session
|
|
425
|
-
let session = params.session || (0, session_1.createSession)();
|
|
461
|
+
// Initialize or get session (use current session if available)
|
|
462
|
+
let session = params.session || this.currentSession || (0, session_1.createSession)();
|
|
426
463
|
// PHASE 1: TOOL EXECUTION - Execute tools if current state has toolState
|
|
427
464
|
if (session.currentRoute && session.currentState) {
|
|
428
465
|
const currentRoute = this.routes.find((r) => r.id === session.currentRoute?.id);
|
|
@@ -443,9 +480,9 @@ class Agent {
|
|
|
443
480
|
// Update extracted data with tool results
|
|
444
481
|
if (result.extractedUpdate) {
|
|
445
482
|
session = await this.updateExtracted(session, result.extractedUpdate);
|
|
446
|
-
|
|
483
|
+
logger_1.logger.debug(`[Agent] Tool updated extracted data:`, result.extractedUpdate);
|
|
447
484
|
}
|
|
448
|
-
|
|
485
|
+
logger_1.logger.debug(`[Agent] Executed tool: ${result.toolName} (success: ${result.success})`);
|
|
449
486
|
}
|
|
450
487
|
}
|
|
451
488
|
}
|
|
@@ -454,6 +491,7 @@ class Agent {
|
|
|
454
491
|
let selectedRoute;
|
|
455
492
|
let responseDirectives;
|
|
456
493
|
let selectedState;
|
|
494
|
+
let isRouteComplete = false;
|
|
457
495
|
if (this.routes.length > 0) {
|
|
458
496
|
const orchestration = await this.routingEngine.decideRouteAndState({
|
|
459
497
|
routes: this.routes,
|
|
@@ -473,11 +511,16 @@ class Agent {
|
|
|
473
511
|
selectedState = orchestration.selectedState;
|
|
474
512
|
responseDirectives = orchestration.responseDirectives;
|
|
475
513
|
session = orchestration.session;
|
|
514
|
+
isRouteComplete = orchestration.isRouteComplete || false;
|
|
515
|
+
// Log if route is complete
|
|
516
|
+
if (isRouteComplete) {
|
|
517
|
+
logger_1.logger.debug(`[Agent] Route complete: all required data collected, END_STATE reached`);
|
|
518
|
+
}
|
|
476
519
|
}
|
|
477
520
|
// PHASE 3: DETERMINE NEXT STATE - Use state from combined decision or get initial state
|
|
478
521
|
let message;
|
|
479
522
|
const toolCalls = undefined;
|
|
480
|
-
if (selectedRoute) {
|
|
523
|
+
if (selectedRoute && !isRouteComplete) {
|
|
481
524
|
let nextState;
|
|
482
525
|
// If we have a selected state from the combined routing decision, use it
|
|
483
526
|
if (selectedState) {
|
|
@@ -488,17 +531,17 @@ class Agent {
|
|
|
488
531
|
const candidates = this.routingEngine.getCandidateStates(selectedRoute, undefined, session.extracted);
|
|
489
532
|
if (candidates.length > 0) {
|
|
490
533
|
nextState = candidates[0].state;
|
|
491
|
-
|
|
534
|
+
logger_1.logger.debug(`[Agent] Using first valid state: ${nextState.id} for new route`);
|
|
492
535
|
}
|
|
493
536
|
else {
|
|
494
537
|
// Fallback to initial state even if it should be skipped
|
|
495
538
|
nextState = selectedRoute.initialState;
|
|
496
|
-
|
|
539
|
+
logger_1.logger.warn(`[Agent] No valid states found, using initial state: ${nextState.id}`);
|
|
497
540
|
}
|
|
498
541
|
}
|
|
499
542
|
// Update session with next state
|
|
500
543
|
session = (0, session_1.enterState)(session, nextState.id, nextState.description);
|
|
501
|
-
|
|
544
|
+
logger_1.logger.debug(`[Agent] Entered state: ${nextState.id}`);
|
|
502
545
|
// PHASE 4: RESPONSE GENERATION - Generate message using selected route and state
|
|
503
546
|
// Get last user message
|
|
504
547
|
const lastUserMessage = (0, event_1.getLastMessageFromHistory)(history);
|
|
@@ -536,7 +579,7 @@ class Agent {
|
|
|
536
579
|
// Merge gathered data into session
|
|
537
580
|
if (Object.keys(gatheredData).length > 0) {
|
|
538
581
|
session = (0, session_1.mergeExtracted)(session, gatheredData);
|
|
539
|
-
|
|
582
|
+
logger_1.logger.debug(`[Agent] Extracted data:`, gatheredData);
|
|
540
583
|
}
|
|
541
584
|
}
|
|
542
585
|
// Extract any additional data from structured response
|
|
@@ -547,6 +590,12 @@ class Agent {
|
|
|
547
590
|
.contextUpdate);
|
|
548
591
|
}
|
|
549
592
|
}
|
|
593
|
+
else if (isRouteComplete && selectedRoute) {
|
|
594
|
+
// Route is complete - set state to END_STATE marker and return completion signal
|
|
595
|
+
session = (0, session_1.enterState)(session, constants_1.END_STATE_ID, "Route completed");
|
|
596
|
+
message = "";
|
|
597
|
+
logger_1.logger.debug(`[Agent] Route ${selectedRoute.title} completed. Entered END_STATE state.`);
|
|
598
|
+
}
|
|
550
599
|
else {
|
|
551
600
|
// Fallback: No routes defined, generate a simple response
|
|
552
601
|
const fallbackPrompt = new PromptComposer_1.PromptComposer()
|
|
@@ -585,12 +634,17 @@ class Agent {
|
|
|
585
634
|
session.id &&
|
|
586
635
|
this.options.persistence?.autoSave !== false) {
|
|
587
636
|
await this.persistenceManager.saveSessionState(session.id, session);
|
|
588
|
-
|
|
637
|
+
logger_1.logger.debug(`[Agent] Auto-saved session state to persistence: ${session.id}`);
|
|
638
|
+
}
|
|
639
|
+
// Update current session if we have one
|
|
640
|
+
if (this.currentSession) {
|
|
641
|
+
this.currentSession = session;
|
|
589
642
|
}
|
|
590
643
|
return {
|
|
591
644
|
message,
|
|
592
645
|
session, // Return updated session with route/state info
|
|
593
646
|
toolCalls,
|
|
647
|
+
isRouteComplete: !isRouteComplete, // Indicates if the route has reached END_STATE with all data collected
|
|
594
648
|
};
|
|
595
649
|
}
|
|
596
650
|
/**
|
|
@@ -663,6 +717,39 @@ class Agent {
|
|
|
663
717
|
const allowedDomains = route.getDomains();
|
|
664
718
|
return this.domainRegistry.getFiltered(allowedDomains);
|
|
665
719
|
}
|
|
720
|
+
/**
|
|
721
|
+
* Set the current session for convenience methods
|
|
722
|
+
* @param session - Session state to use for subsequent calls
|
|
723
|
+
*/
|
|
724
|
+
setCurrentSession(session) {
|
|
725
|
+
this.currentSession = session;
|
|
726
|
+
}
|
|
727
|
+
/**
|
|
728
|
+
* Get the current session (if set)
|
|
729
|
+
*/
|
|
730
|
+
getCurrentSession() {
|
|
731
|
+
return this.currentSession;
|
|
732
|
+
}
|
|
733
|
+
/**
|
|
734
|
+
* Clear the current session
|
|
735
|
+
*/
|
|
736
|
+
clearCurrentSession() {
|
|
737
|
+
this.currentSession = undefined;
|
|
738
|
+
}
|
|
739
|
+
/**
|
|
740
|
+
* Get extracted data from current session
|
|
741
|
+
* @param routeId - Optional route ID to get data for (uses current route if not provided)
|
|
742
|
+
* @returns The extracted data from the current session
|
|
743
|
+
*/
|
|
744
|
+
getExtractedData(routeId) {
|
|
745
|
+
if (!this.currentSession) {
|
|
746
|
+
return {};
|
|
747
|
+
}
|
|
748
|
+
if (routeId) {
|
|
749
|
+
return (this.currentSession.extractedByRoute[routeId] || {});
|
|
750
|
+
}
|
|
751
|
+
return this.currentSession.extracted;
|
|
752
|
+
}
|
|
666
753
|
}
|
|
667
754
|
exports.Agent = Agent;
|
|
668
755
|
//# sourceMappingURL=Agent.js.map
|