@falai/agent 0.5.4 → 0.5.5
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 +9 -4
- package/dist/cjs/core/Agent.d.ts +0 -5
- package/dist/cjs/core/Agent.d.ts.map +1 -1
- package/dist/cjs/core/Agent.js +75 -157
- package/dist/cjs/core/Agent.js.map +1 -1
- package/dist/cjs/core/RoutingEngine.d.ts +68 -2
- package/dist/cjs/core/RoutingEngine.d.ts.map +1 -1
- package/dist/cjs/core/RoutingEngine.js +416 -2
- package/dist/cjs/core/RoutingEngine.js.map +1 -1
- package/dist/cjs/utils/event.d.ts +6 -0
- package/dist/cjs/utils/event.d.ts.map +1 -0
- package/dist/cjs/utils/event.js +20 -0
- package/dist/cjs/utils/event.js.map +1 -0
- package/dist/core/Agent.d.ts +0 -5
- package/dist/core/Agent.d.ts.map +1 -1
- package/dist/core/Agent.js +74 -156
- package/dist/core/Agent.js.map +1 -1
- package/dist/core/RoutingEngine.d.ts +68 -2
- package/dist/core/RoutingEngine.d.ts.map +1 -1
- package/dist/core/RoutingEngine.js +416 -2
- package/dist/core/RoutingEngine.js.map +1 -1
- package/dist/utils/event.d.ts +6 -0
- package/dist/utils/event.d.ts.map +1 -0
- package/dist/utils/event.js +17 -0
- package/dist/utils/event.js.map +1 -0
- package/docs/API_REFERENCE.md +24 -13
- package/docs/ARCHITECTURE.md +38 -14
- package/examples/business-onboarding.ts +11 -0
- package/examples/healthcare-agent.ts +28 -16
- package/examples/persistent-onboarding.ts +16 -10
- package/examples/travel-agent.ts +94 -52
- package/package.json +1 -1
- package/src/core/Agent.ts +78 -227
- package/src/core/RoutingEngine.ts +663 -2
- package/src/utils/event.ts +16 -0
|
@@ -1,9 +1,374 @@
|
|
|
1
|
+
import { enterRoute, mergeExtracted } from "../types/session";
|
|
1
2
|
import { PromptComposer } from "./PromptComposer";
|
|
3
|
+
import { getLastMessageFromHistory } from "../utils/event";
|
|
2
4
|
export class RoutingEngine {
|
|
3
5
|
constructor(options) {
|
|
4
6
|
this.options = options;
|
|
5
7
|
}
|
|
6
|
-
|
|
8
|
+
/**
|
|
9
|
+
* Optimized decision for single-route scenarios
|
|
10
|
+
* Skips route scoring and only does state selection
|
|
11
|
+
* @private
|
|
12
|
+
*/
|
|
13
|
+
async decideSingleRouteState(params) {
|
|
14
|
+
const { route, session, history, agentMeta, ai, context, signal } = params;
|
|
15
|
+
let updatedSession = session;
|
|
16
|
+
const selectedRoute = route;
|
|
17
|
+
// Enter route if not already in it
|
|
18
|
+
if (!session.currentRoute || session.currentRoute.id !== route.id) {
|
|
19
|
+
updatedSession = enterRoute(session, route.id, route.title);
|
|
20
|
+
if (route.initialData) {
|
|
21
|
+
updatedSession = mergeExtracted(updatedSession, route.initialData);
|
|
22
|
+
console.log(`[RoutingEngine] Single-route: Merged initial data:`, route.initialData);
|
|
23
|
+
}
|
|
24
|
+
console.log(`[RoutingEngine] Single-route: Entered route: ${route.title}`);
|
|
25
|
+
}
|
|
26
|
+
// Get candidate states
|
|
27
|
+
const currentState = updatedSession.currentState
|
|
28
|
+
? route.getState(updatedSession.currentState.id)
|
|
29
|
+
: undefined;
|
|
30
|
+
const candidates = this.getCandidateStates(route, currentState, updatedSession.extracted);
|
|
31
|
+
if (candidates.length === 0) {
|
|
32
|
+
console.warn(`[RoutingEngine] Single-route: No valid states found`);
|
|
33
|
+
return { selectedRoute, session: updatedSession };
|
|
34
|
+
}
|
|
35
|
+
// If only one candidate, check if route is complete
|
|
36
|
+
if (candidates.length === 1) {
|
|
37
|
+
const isRouteComplete = candidates[0].isRouteComplete;
|
|
38
|
+
if (isRouteComplete) {
|
|
39
|
+
console.log(`[RoutingEngine] Single-route: Route complete - all data collected`);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
console.log(`[RoutingEngine] Single-route: Only one valid state: ${candidates[0].state.id}`);
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
selectedRoute,
|
|
46
|
+
selectedState: candidates[0].state,
|
|
47
|
+
session: updatedSession,
|
|
48
|
+
isRouteComplete,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
// Multiple candidates - use AI to select best state
|
|
52
|
+
const lastUserMessage = getLastMessageFromHistory(history);
|
|
53
|
+
const statePrompt = this.buildStateSelectionPrompt(route, currentState, candidates, updatedSession.extracted, history, lastUserMessage, agentMeta);
|
|
54
|
+
const stateSchema = this.buildStateSelectionSchema(candidates.map((c) => c.state.id));
|
|
55
|
+
const stateResult = await ai.generateMessage({
|
|
56
|
+
prompt: statePrompt,
|
|
57
|
+
history,
|
|
58
|
+
context,
|
|
59
|
+
signal,
|
|
60
|
+
parameters: {
|
|
61
|
+
jsonSchema: stateSchema,
|
|
62
|
+
schemaName: "state_selection",
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
const selectedStateId = stateResult.structured?.selectedStateId;
|
|
66
|
+
const selectedState = candidates.find((c) => c.state.id === selectedStateId)?.state;
|
|
67
|
+
if (selectedState) {
|
|
68
|
+
console.log(`[RoutingEngine] Single-route: AI selected state: ${selectedState.id}`);
|
|
69
|
+
console.log(`[RoutingEngine] Single-route: Reasoning: ${stateResult.structured?.reasoning}`);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
console.warn(`[RoutingEngine] Single-route: Invalid state ID returned, using first candidate`);
|
|
73
|
+
}
|
|
74
|
+
return {
|
|
75
|
+
selectedRoute,
|
|
76
|
+
selectedState: selectedState || candidates[0].state,
|
|
77
|
+
responseDirectives: stateResult.structured?.responseDirectives,
|
|
78
|
+
session: updatedSession,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Identify valid next candidate states based on current state and extracted data
|
|
83
|
+
* Returns state with isRouteComplete flag if route is complete (all states skipped + has END_ROUTE transition)
|
|
84
|
+
*/
|
|
85
|
+
getCandidateStates(route, currentState, extracted) {
|
|
86
|
+
const candidates = [];
|
|
87
|
+
if (!currentState) {
|
|
88
|
+
const initialState = route.initialState;
|
|
89
|
+
if (initialState.shouldSkip(extracted)) {
|
|
90
|
+
const transitions = initialState.getTransitions();
|
|
91
|
+
for (const transition of transitions) {
|
|
92
|
+
const target = transition.getTarget();
|
|
93
|
+
if (target && !target.shouldSkip(extracted)) {
|
|
94
|
+
candidates.push({
|
|
95
|
+
state: target,
|
|
96
|
+
condition: transition.condition,
|
|
97
|
+
requiredData: target.requiredData,
|
|
98
|
+
gatherFields: target.gatherFields,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
candidates.push({
|
|
105
|
+
state: initialState,
|
|
106
|
+
requiredData: initialState.requiredData,
|
|
107
|
+
gatherFields: initialState.gatherFields,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
return candidates;
|
|
111
|
+
}
|
|
112
|
+
const transitions = currentState.getTransitions();
|
|
113
|
+
let hasEndRoute = false;
|
|
114
|
+
for (const transition of transitions) {
|
|
115
|
+
const target = transition.getTarget();
|
|
116
|
+
// Check for END_ROUTE transition (no target state)
|
|
117
|
+
if (!target &&
|
|
118
|
+
transition.spec.state &&
|
|
119
|
+
typeof transition.spec.state === "symbol") {
|
|
120
|
+
hasEndRoute = true;
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
if (!target)
|
|
124
|
+
continue;
|
|
125
|
+
if (target.shouldSkip(extracted)) {
|
|
126
|
+
console.log(`[RoutingEngine] Skipping state ${target.id} (skipIf condition met)`);
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
candidates.push({
|
|
130
|
+
state: target,
|
|
131
|
+
condition: transition.condition,
|
|
132
|
+
requiredData: target.requiredData,
|
|
133
|
+
gatherFields: target.gatherFields,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
// If no valid candidates found
|
|
137
|
+
if (candidates.length === 0) {
|
|
138
|
+
// If current state has END_ROUTE transition, the route is complete
|
|
139
|
+
if (hasEndRoute) {
|
|
140
|
+
console.log(`[RoutingEngine] Route complete: all states processed, END_ROUTE reached`);
|
|
141
|
+
// Return current state with completion flag
|
|
142
|
+
return [
|
|
143
|
+
{
|
|
144
|
+
state: currentState,
|
|
145
|
+
condition: "Route complete - all data collected",
|
|
146
|
+
isRouteComplete: true,
|
|
147
|
+
},
|
|
148
|
+
];
|
|
149
|
+
}
|
|
150
|
+
// Otherwise, stay in current state if it's still valid
|
|
151
|
+
if (!currentState.shouldSkip(extracted)) {
|
|
152
|
+
candidates.push({
|
|
153
|
+
state: currentState,
|
|
154
|
+
condition: "Continue in current state (no valid transitions)",
|
|
155
|
+
requiredData: currentState.requiredData,
|
|
156
|
+
gatherFields: currentState.gatherFields,
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return candidates;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Full routing orchestration: builds prompt and schema, calls AI, selects route/state,
|
|
164
|
+
* and updates the session (including initialData merge when entering a new route).
|
|
165
|
+
*
|
|
166
|
+
* OPTIMIZATION: If there's only 1 route, skips route scoring and only does state selection.
|
|
167
|
+
*/
|
|
168
|
+
async decideRouteAndState(params) {
|
|
169
|
+
const { routes, session, history, agentMeta, ai, context, signal } = params;
|
|
170
|
+
if (routes.length === 0) {
|
|
171
|
+
return { session };
|
|
172
|
+
}
|
|
173
|
+
// OPTIMIZATION: Single route - skip route scoring, only do state selection
|
|
174
|
+
if (routes.length === 1) {
|
|
175
|
+
return this.decideSingleRouteState({
|
|
176
|
+
route: routes[0],
|
|
177
|
+
session,
|
|
178
|
+
history,
|
|
179
|
+
agentMeta,
|
|
180
|
+
ai,
|
|
181
|
+
context,
|
|
182
|
+
signal,
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
const lastUserMessage = getLastMessageFromHistory(history);
|
|
186
|
+
let activeRouteStates;
|
|
187
|
+
let activeRoute;
|
|
188
|
+
let isRouteComplete = false;
|
|
189
|
+
if (session.currentRoute) {
|
|
190
|
+
activeRoute = routes.find((r) => r.id === session.currentRoute?.id);
|
|
191
|
+
if (activeRoute) {
|
|
192
|
+
const currentState = session.currentState
|
|
193
|
+
? activeRoute.getState(session.currentState.id)
|
|
194
|
+
: undefined;
|
|
195
|
+
const candidates = this.getCandidateStates(activeRoute, currentState, session.extracted);
|
|
196
|
+
// Check if route is complete
|
|
197
|
+
if (candidates.length === 1 && candidates[0].isRouteComplete) {
|
|
198
|
+
isRouteComplete = true;
|
|
199
|
+
console.log(`[RoutingEngine] Route ${activeRoute.title} is complete - all data collected`);
|
|
200
|
+
// Don't include states in routing if route is complete
|
|
201
|
+
activeRouteStates = undefined;
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
activeRouteStates = candidates.map((c) => ({
|
|
205
|
+
stateId: c.state.id,
|
|
206
|
+
description: c.state.description || "",
|
|
207
|
+
condition: c.condition,
|
|
208
|
+
requiredData: c.requiredData,
|
|
209
|
+
gatherFields: c.gatherFields,
|
|
210
|
+
}));
|
|
211
|
+
console.log(`[RoutingEngine] Found ${activeRouteStates.length} candidate states for active route`);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
const routingSchema = this.buildDynamicRoutingSchema(routes, undefined, activeRouteStates);
|
|
216
|
+
const routingPrompt = this.buildRoutingPrompt(history, routes, lastUserMessage, agentMeta, session, activeRouteStates);
|
|
217
|
+
const routingResult = await ai.generateMessage({
|
|
218
|
+
prompt: routingPrompt,
|
|
219
|
+
history,
|
|
220
|
+
context,
|
|
221
|
+
signal,
|
|
222
|
+
parameters: {
|
|
223
|
+
jsonSchema: routingSchema,
|
|
224
|
+
schemaName: "routing_output",
|
|
225
|
+
},
|
|
226
|
+
});
|
|
227
|
+
let selectedRoute;
|
|
228
|
+
let selectedState;
|
|
229
|
+
let responseDirectives;
|
|
230
|
+
let updatedSession = session;
|
|
231
|
+
if (routingResult.structured?.routes) {
|
|
232
|
+
const decision = this.decideRouteFromScores({
|
|
233
|
+
context: routingResult.structured.context,
|
|
234
|
+
routes: routingResult.structured.routes,
|
|
235
|
+
responseDirectives: routingResult.structured.responseDirectives,
|
|
236
|
+
});
|
|
237
|
+
selectedRoute = routes.find((r) => r.id === decision.routeId);
|
|
238
|
+
responseDirectives = routingResult.structured.responseDirectives;
|
|
239
|
+
if (selectedRoute === activeRoute &&
|
|
240
|
+
routingResult.structured.selectedStateId &&
|
|
241
|
+
activeRoute) {
|
|
242
|
+
selectedState = activeRoute.getState(routingResult.structured.selectedStateId);
|
|
243
|
+
if (selectedState) {
|
|
244
|
+
console.log(`[RoutingEngine] AI selected state: ${selectedState.id} in active route`);
|
|
245
|
+
console.log(`[RoutingEngine] State reasoning: ${routingResult.structured.stateReasoning}`);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
if (selectedRoute) {
|
|
249
|
+
console.log(`[RoutingEngine] Selected route: ${selectedRoute.title}`);
|
|
250
|
+
if (!session.currentRoute ||
|
|
251
|
+
session.currentRoute.id !== selectedRoute.id) {
|
|
252
|
+
updatedSession = enterRoute(session, selectedRoute.id, selectedRoute.title);
|
|
253
|
+
if (selectedRoute.initialData) {
|
|
254
|
+
updatedSession = mergeExtracted(updatedSession, selectedRoute.initialData);
|
|
255
|
+
console.log(`[RoutingEngine] Merged initial data:`, selectedRoute.initialData);
|
|
256
|
+
}
|
|
257
|
+
console.log(`[RoutingEngine] Entered route: ${selectedRoute.title}`);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
return {
|
|
262
|
+
selectedRoute,
|
|
263
|
+
selectedState,
|
|
264
|
+
responseDirectives,
|
|
265
|
+
session: updatedSession,
|
|
266
|
+
isRouteComplete,
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Build prompt for state selection within a single route
|
|
271
|
+
* @private
|
|
272
|
+
*/
|
|
273
|
+
buildStateSelectionPrompt(route, currentState, candidates, extracted, history, lastMessage, agentMeta) {
|
|
274
|
+
const pc = new PromptComposer();
|
|
275
|
+
// Add agent metadata
|
|
276
|
+
if (agentMeta?.name || agentMeta?.goal || agentMeta?.description) {
|
|
277
|
+
pc.addAgentMeta({
|
|
278
|
+
name: agentMeta?.name || "Agent",
|
|
279
|
+
description: agentMeta?.description,
|
|
280
|
+
goal: agentMeta?.goal,
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
const personality = agentMeta?.personality || "Tone: brief, natural, 1-2 short sentences.";
|
|
284
|
+
pc.addPersonality(personality);
|
|
285
|
+
// Add route context
|
|
286
|
+
pc.addInstruction(`Active Route: ${route.title}\nDescription: ${route.description || "N/A"}`);
|
|
287
|
+
// Add current state context
|
|
288
|
+
if (currentState) {
|
|
289
|
+
pc.addInstruction(`Current State: ${currentState.id}\nDescription: ${currentState.description || "N/A"}`);
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
pc.addInstruction("Current State: None (entering route)");
|
|
293
|
+
}
|
|
294
|
+
// Add extracted data context
|
|
295
|
+
if (Object.keys(extracted).length > 0) {
|
|
296
|
+
pc.addInstruction(`Extracted Data So Far:\n${JSON.stringify(extracted, null, 2)}`);
|
|
297
|
+
}
|
|
298
|
+
else {
|
|
299
|
+
pc.addInstruction("Extracted Data: None yet");
|
|
300
|
+
}
|
|
301
|
+
// Add conversation history
|
|
302
|
+
pc.addInteractionHistory(history);
|
|
303
|
+
pc.addLastMessage(lastMessage);
|
|
304
|
+
// Add candidate states
|
|
305
|
+
const stateDescriptions = candidates.map((candidate, idx) => {
|
|
306
|
+
const parts = [
|
|
307
|
+
`${idx + 1}. State ID: ${candidate.state.id}`,
|
|
308
|
+
` Description: ${candidate.state.description || "N/A"}`,
|
|
309
|
+
];
|
|
310
|
+
if (candidate.condition) {
|
|
311
|
+
parts.push(` Condition: ${candidate.condition}`);
|
|
312
|
+
}
|
|
313
|
+
if (candidate.requiredData && candidate.requiredData.length > 0) {
|
|
314
|
+
parts.push(` Required Data: ${candidate.requiredData.join(", ")}`);
|
|
315
|
+
}
|
|
316
|
+
if (candidate.gatherFields && candidate.gatherFields.length > 0) {
|
|
317
|
+
parts.push(` Gathers: ${candidate.gatherFields.join(", ")}`);
|
|
318
|
+
}
|
|
319
|
+
return parts.join("\n");
|
|
320
|
+
});
|
|
321
|
+
pc.addInstruction(`Available States to Transition To:\n${stateDescriptions.join("\n\n")}`);
|
|
322
|
+
// Add decision instructions
|
|
323
|
+
pc.addInstruction([
|
|
324
|
+
"Task: Decide which state to transition to based on:",
|
|
325
|
+
"1. The user's current message and intent",
|
|
326
|
+
"2. The conversation history and context",
|
|
327
|
+
"3. The extracted data we already have",
|
|
328
|
+
"4. The conditions and requirements of each state",
|
|
329
|
+
"5. The logical flow of the conversation",
|
|
330
|
+
"",
|
|
331
|
+
"Rules:",
|
|
332
|
+
"- If a state has a condition, evaluate whether it's met based on context",
|
|
333
|
+
"- If a state requires data we don't have, consider if we should gather it now",
|
|
334
|
+
"- Choose the state that makes the most sense for moving the conversation forward",
|
|
335
|
+
"- States with skipIf conditions that are met have already been filtered out",
|
|
336
|
+
"",
|
|
337
|
+
"Return ONLY JSON matching the provided schema.",
|
|
338
|
+
].join("\n"));
|
|
339
|
+
return pc.build();
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Build schema for state selection
|
|
343
|
+
* @private
|
|
344
|
+
*/
|
|
345
|
+
buildStateSelectionSchema(validStateIds) {
|
|
346
|
+
return {
|
|
347
|
+
description: "State transition decision based on conversation context and extracted data",
|
|
348
|
+
type: "object",
|
|
349
|
+
properties: {
|
|
350
|
+
reasoning: {
|
|
351
|
+
type: "string",
|
|
352
|
+
nullable: false,
|
|
353
|
+
description: "Brief explanation of why this state was selected",
|
|
354
|
+
},
|
|
355
|
+
selectedStateId: {
|
|
356
|
+
type: "string",
|
|
357
|
+
nullable: false,
|
|
358
|
+
description: "The ID of the selected state to transition to",
|
|
359
|
+
enum: validStateIds,
|
|
360
|
+
},
|
|
361
|
+
responseDirectives: {
|
|
362
|
+
type: "array",
|
|
363
|
+
items: { type: "string" },
|
|
364
|
+
description: "Optional bullet points the response should address (concise)",
|
|
365
|
+
},
|
|
366
|
+
},
|
|
367
|
+
required: ["reasoning", "selectedStateId"],
|
|
368
|
+
additionalProperties: false,
|
|
369
|
+
};
|
|
370
|
+
}
|
|
371
|
+
buildDynamicRoutingSchema(routes, extrasSchema, activeRouteStates) {
|
|
7
372
|
const routeIds = routes.map((r) => r.id);
|
|
8
373
|
const routeProperties = {};
|
|
9
374
|
for (const id of routeIds) {
|
|
@@ -40,13 +405,33 @@ export class RoutingEngine {
|
|
|
40
405
|
required: ["context", "routes"],
|
|
41
406
|
additionalProperties: false,
|
|
42
407
|
};
|
|
408
|
+
// Add state selection fields if there's an active route with states
|
|
409
|
+
if (activeRouteStates && activeRouteStates.length > 0) {
|
|
410
|
+
base.properties = base.properties || {};
|
|
411
|
+
base.properties.selectedStateId = {
|
|
412
|
+
type: "string",
|
|
413
|
+
nullable: false,
|
|
414
|
+
description: "The state ID to transition to within the active route (required if continuing in current route)",
|
|
415
|
+
enum: activeRouteStates.map((s) => s.stateId),
|
|
416
|
+
};
|
|
417
|
+
base.properties.stateReasoning = {
|
|
418
|
+
type: "string",
|
|
419
|
+
nullable: false,
|
|
420
|
+
description: "Brief explanation of why this state was selected",
|
|
421
|
+
};
|
|
422
|
+
base.required = [
|
|
423
|
+
...(base.required || []),
|
|
424
|
+
"selectedStateId",
|
|
425
|
+
"stateReasoning",
|
|
426
|
+
];
|
|
427
|
+
}
|
|
43
428
|
if (extrasSchema) {
|
|
44
429
|
base.properties = base.properties || {};
|
|
45
430
|
base.properties.extractions = extrasSchema;
|
|
46
431
|
}
|
|
47
432
|
return base;
|
|
48
433
|
}
|
|
49
|
-
buildRoutingPrompt(history, routes, lastMessage, agentMeta, session) {
|
|
434
|
+
buildRoutingPrompt(history, routes, lastMessage, agentMeta, session, activeRouteStates) {
|
|
50
435
|
const pc = new PromptComposer();
|
|
51
436
|
if (agentMeta?.name || agentMeta?.goal || agentMeta?.description) {
|
|
52
437
|
pc.addAgentMeta({
|
|
@@ -75,6 +460,35 @@ export class RoutingEngine {
|
|
|
75
460
|
}
|
|
76
461
|
sessionInfo.push("Note: User is mid-conversation. They may want to continue current route or switch to a new one based on their intent.");
|
|
77
462
|
pc.addInstruction(sessionInfo.join("\n"));
|
|
463
|
+
// Add available states for the active route
|
|
464
|
+
if (activeRouteStates && activeRouteStates.length > 0) {
|
|
465
|
+
const stateInfo = [
|
|
466
|
+
"",
|
|
467
|
+
"Available states in active route (choose one to transition to):",
|
|
468
|
+
];
|
|
469
|
+
activeRouteStates.forEach((state, idx) => {
|
|
470
|
+
stateInfo.push(`${idx + 1}. State: ${state.stateId}`);
|
|
471
|
+
if (state.description) {
|
|
472
|
+
stateInfo.push(` Description: ${state.description}`);
|
|
473
|
+
}
|
|
474
|
+
if (state.condition) {
|
|
475
|
+
stateInfo.push(` Condition: ${state.condition}`);
|
|
476
|
+
}
|
|
477
|
+
if (state.requiredData && state.requiredData.length > 0) {
|
|
478
|
+
stateInfo.push(` Required data: ${state.requiredData.join(", ")}`);
|
|
479
|
+
}
|
|
480
|
+
if (state.gatherFields && state.gatherFields.length > 0) {
|
|
481
|
+
stateInfo.push(` Will gather: ${state.gatherFields.join(", ")}`);
|
|
482
|
+
}
|
|
483
|
+
});
|
|
484
|
+
stateInfo.push("");
|
|
485
|
+
stateInfo.push("IMPORTANT: You MUST select a state to transition to. Evaluate which state makes the most sense based on:");
|
|
486
|
+
stateInfo.push("- The conversation flow and what's been collected");
|
|
487
|
+
stateInfo.push("- What data is still needed vs already present");
|
|
488
|
+
stateInfo.push("- The logical next step in the conversation");
|
|
489
|
+
stateInfo.push("- Whether conditions for states are met");
|
|
490
|
+
pc.addInstruction(stateInfo.join("\n"));
|
|
491
|
+
}
|
|
78
492
|
}
|
|
79
493
|
pc.addInteractionHistory(history);
|
|
80
494
|
pc.addLastMessage(lastMessage);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RoutingEngine.js","sourceRoot":"","sources":["../../src/core/RoutingEngine.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RoutingEngine.js","sourceRoot":"","sources":["../../src/core/RoutingEngine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event.d.ts","sourceRoot":"","sources":["../../src/utils/event.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAAa,MAAM,kBAAkB,CAAC;AACzD;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,MAAM,CAWlE"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { EventKind } from "../types/history";
|
|
2
|
+
/**
|
|
3
|
+
* Helper to extract last message from history
|
|
4
|
+
*/
|
|
5
|
+
export function getLastMessageFromHistory(history) {
|
|
6
|
+
for (let i = history.length - 1; i >= 0; i--) {
|
|
7
|
+
const event = history[i];
|
|
8
|
+
if (event.kind === EventKind.MESSAGE) {
|
|
9
|
+
if (!event.data || !("message" in event.data)) {
|
|
10
|
+
continue;
|
|
11
|
+
}
|
|
12
|
+
return event.data.message;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
return "";
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=event.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event.js","sourceRoot":"","sources":["../../src/utils/event.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACzD;;GAEG;AACH,MAAM,UAAU,yBAAyB,CAAC,OAAgB;IACxD,KAAK,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACzB,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,OAAO,EAAE,CAAC;YACrC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,SAAS,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC9C,SAAS;YACX,CAAC;YACD,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;QAC5B,CAAC;IACH,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC"}
|
package/docs/API_REFERENCE.md
CHANGED
|
@@ -420,11 +420,16 @@ interface TransitionResult<TExtracted = unknown> {
|
|
|
420
420
|
routeId: string; // Route identifier
|
|
421
421
|
transitionTo: (
|
|
422
422
|
spec: TransitionSpec<TExtracted>,
|
|
423
|
-
condition?: string
|
|
423
|
+
condition?: string // Optional: AI-evaluated text condition for this transition
|
|
424
424
|
) => TransitionResult<TExtracted>;
|
|
425
425
|
}
|
|
426
426
|
```
|
|
427
427
|
|
|
428
|
+
**Parameters:**
|
|
429
|
+
|
|
430
|
+
- `spec`: The transition specification (see `TransitionSpec` above)
|
|
431
|
+
- `condition` (optional): Human-readable condition text that the AI evaluates when selecting states. Use this to guide the AI's state selection based on conversation context. Examples: "Customer confirmed payment", "All required data collected", "User wants to modify order"
|
|
432
|
+
|
|
428
433
|
**Returns:** A `TransitionResult` that includes the target state's reference (`id`, `routeId`) and a `transitionTo` method for chaining additional transitions.
|
|
429
434
|
|
|
430
435
|
**Example:**
|
|
@@ -451,19 +456,25 @@ const flightRoute = agent.createRoute<FlightData>({
|
|
|
451
456
|
},
|
|
452
457
|
});
|
|
453
458
|
|
|
454
|
-
// Approach 1: Step-by-step with data extraction
|
|
455
|
-
const askDestination = flightRoute.initialState.transitionTo(
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
459
|
+
// Approach 1: Step-by-step with data extraction and text conditions
|
|
460
|
+
const askDestination = flightRoute.initialState.transitionTo(
|
|
461
|
+
{
|
|
462
|
+
chatState: "Ask where they want to fly",
|
|
463
|
+
gather: ["destination"],
|
|
464
|
+
skipIf: (extracted) => !!extracted.destination, // Skip if already have destination
|
|
465
|
+
},
|
|
466
|
+
"Customer hasn't specified destination yet" // AI-evaluated condition
|
|
467
|
+
);
|
|
460
468
|
|
|
461
|
-
const askDates = askDestination.transitionTo(
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
469
|
+
const askDates = askDestination.transitionTo(
|
|
470
|
+
{
|
|
471
|
+
chatState: "Ask about travel dates",
|
|
472
|
+
gather: ["departureDate"],
|
|
473
|
+
skipIf: (extracted) => !!extracted.departureDate,
|
|
474
|
+
requiredData: ["destination"], // Must have destination first
|
|
475
|
+
},
|
|
476
|
+
"Destination confirmed, need travel dates"
|
|
477
|
+
);
|
|
467
478
|
|
|
468
479
|
const askPassengers = askDates.transitionTo({
|
|
469
480
|
chatState: "How many passengers?",
|
package/docs/ARCHITECTURE.md
CHANGED
|
@@ -106,25 +106,32 @@ const response = await agent.respond({
|
|
|
106
106
|
- **State Recovery** - Resume conversations from any point
|
|
107
107
|
- **Session Tracking** - Track conversations via session ID in database
|
|
108
108
|
|
|
109
|
-
### 3. 🔧 Code-Based State Logic
|
|
109
|
+
### 3. 🔧 Code-Based State Logic + AI-Driven Transitions
|
|
110
110
|
|
|
111
|
-
Use TypeScript functions
|
|
111
|
+
Use TypeScript functions for deterministic flow control AND text conditions for AI-driven state selection:
|
|
112
112
|
|
|
113
113
|
```typescript
|
|
114
114
|
// State with smart bypassing based on extracted data
|
|
115
|
-
const askDestination = route.initialState.transitionTo(
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
115
|
+
const askDestination = route.initialState.transitionTo(
|
|
116
|
+
{
|
|
117
|
+
id: "ask_destination", // Optional: custom state ID
|
|
118
|
+
chatState: "Ask where they want to fly",
|
|
119
|
+
gather: ["destination"],
|
|
120
|
+
skipIf: (extracted) => !!extracted.destination, // Code-based condition!
|
|
121
|
+
},
|
|
122
|
+
"Customer hasn't specified destination yet" // Text condition for AI
|
|
123
|
+
);
|
|
121
124
|
|
|
122
|
-
const askDate = askDestination.transitionTo(
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
125
|
+
const askDate = askDestination.transitionTo(
|
|
126
|
+
{
|
|
127
|
+
id: "ask_date", // Optional: custom state ID for easier tracking
|
|
128
|
+
chatState: "Ask about travel dates",
|
|
129
|
+
gather: ["departureDate"],
|
|
130
|
+
skipIf: (extracted) => !!extracted.departureDate,
|
|
131
|
+
requiredData: ["destination"], // Prerequisites
|
|
132
|
+
},
|
|
133
|
+
"Destination confirmed, need travel dates now"
|
|
134
|
+
);
|
|
128
135
|
});
|
|
129
136
|
```
|
|
130
137
|
|
|
@@ -150,6 +157,23 @@ If you don't provide an ID, one is automatically generated from the route ID and
|
|
|
150
157
|
- **Type Safety** - Full TypeScript support for data validation
|
|
151
158
|
- **Custom IDs** - Easier tracking and debugging with meaningful state identifiers
|
|
152
159
|
|
|
160
|
+
**How State Transitions Work:**
|
|
161
|
+
|
|
162
|
+
1. **Code filters first**: `skipIf` and `requiredData` filter out invalid states deterministically
|
|
163
|
+
2. **AI selects best state**: From valid candidates, AI evaluates text conditions to choose optimal state
|
|
164
|
+
3. **Combined decision**: Single AI call handles both route selection AND state selection (no extra calls!)
|
|
165
|
+
4. **Completion detection**: When all states are skipped and `END_ROUTE` is reached, route is marked complete
|
|
166
|
+
|
|
167
|
+
```typescript
|
|
168
|
+
// The AI sees:
|
|
169
|
+
// "Available states: askDate, confirmBooking
|
|
170
|
+
// - askDate: Destination confirmed, need travel dates now
|
|
171
|
+
// - confirmBooking: All required info collected, ready to book
|
|
172
|
+
// Current extracted: {destination: 'Paris', departureDate: '2025-01-15'}
|
|
173
|
+
//
|
|
174
|
+
// → AI selects 'confirmBooking' based on context"
|
|
175
|
+
```
|
|
176
|
+
|
|
153
177
|
### 4. 🛠️ Tools with Data Access
|
|
154
178
|
|
|
155
179
|
Tools execute with full context including extracted data:
|