@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
package/src/core/Events.ts
CHANGED
|
@@ -76,9 +76,9 @@ export function createMessageEvent(
|
|
|
76
76
|
session?: {
|
|
77
77
|
routeId?: string;
|
|
78
78
|
routeTitle?: string;
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
79
|
+
stepId?: string;
|
|
80
|
+
stepDescription?: string;
|
|
81
|
+
data?: Record<string, unknown>;
|
|
82
82
|
};
|
|
83
83
|
}
|
|
84
84
|
): Event<MessageEventData>;
|
|
@@ -90,9 +90,9 @@ export function createMessageEvent(options: {
|
|
|
90
90
|
session?: {
|
|
91
91
|
routeId?: string;
|
|
92
92
|
routeTitle?: string;
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
93
|
+
stepId?: string;
|
|
94
|
+
stepDescription?: string;
|
|
95
|
+
data?: Record<string, unknown>;
|
|
96
96
|
};
|
|
97
97
|
}): Event<MessageEventData>;
|
|
98
98
|
export function createMessageEvent(
|
|
@@ -106,9 +106,9 @@ export function createMessageEvent(
|
|
|
106
106
|
session?: {
|
|
107
107
|
routeId?: string;
|
|
108
108
|
routeTitle?: string;
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
109
|
+
stepId?: string;
|
|
110
|
+
stepDescription?: string;
|
|
111
|
+
data?: Record<string, unknown>;
|
|
112
112
|
};
|
|
113
113
|
},
|
|
114
114
|
participantName?: string,
|
|
@@ -118,9 +118,9 @@ export function createMessageEvent(
|
|
|
118
118
|
session?: {
|
|
119
119
|
routeId?: string;
|
|
120
120
|
routeTitle?: string;
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
121
|
+
stepId?: string;
|
|
122
|
+
stepDescription?: string;
|
|
123
|
+
data?: Record<string, unknown>;
|
|
124
124
|
};
|
|
125
125
|
}
|
|
126
126
|
): Event<MessageEventData> {
|
|
@@ -14,11 +14,11 @@ import type {
|
|
|
14
14
|
MessageRepository,
|
|
15
15
|
} from "../types/persistence";
|
|
16
16
|
import type { Event } from "../types/history";
|
|
17
|
-
import type {
|
|
17
|
+
import type { SessionStep } from "../types/session";
|
|
18
18
|
import {
|
|
19
19
|
createSession,
|
|
20
|
-
|
|
21
|
-
|
|
20
|
+
sessionStepToData,
|
|
21
|
+
sessionDataToStep,
|
|
22
22
|
} from "../types/session";
|
|
23
23
|
|
|
24
24
|
/**
|
|
@@ -119,18 +119,14 @@ export class PersistenceManager {
|
|
|
119
119
|
}
|
|
120
120
|
|
|
121
121
|
/**
|
|
122
|
-
* Update current route and
|
|
122
|
+
* Update current route and step
|
|
123
123
|
*/
|
|
124
|
-
async
|
|
124
|
+
async updateRouteStep(
|
|
125
125
|
sessionId: string,
|
|
126
126
|
route?: string,
|
|
127
|
-
|
|
127
|
+
step?: string
|
|
128
128
|
): Promise<SessionData | null> {
|
|
129
|
-
return await this.sessionRepository.
|
|
130
|
-
sessionId,
|
|
131
|
-
route,
|
|
132
|
-
state
|
|
133
|
-
);
|
|
129
|
+
return await this.sessionRepository.updateRouteStep(sessionId, route, step);
|
|
134
130
|
}
|
|
135
131
|
|
|
136
132
|
/**
|
|
@@ -145,7 +141,7 @@ export class PersistenceManager {
|
|
|
145
141
|
role: options.role,
|
|
146
142
|
content: options.content,
|
|
147
143
|
route: options.route,
|
|
148
|
-
|
|
144
|
+
step: options.step,
|
|
149
145
|
toolCalls: options.toolCalls,
|
|
150
146
|
event: options.event,
|
|
151
147
|
});
|
|
@@ -227,77 +223,77 @@ export class PersistenceManager {
|
|
|
227
223
|
}
|
|
228
224
|
|
|
229
225
|
/**
|
|
230
|
-
* Save
|
|
231
|
-
* Converts
|
|
226
|
+
* Save SessionStep to database
|
|
227
|
+
* Converts SessionStep to SessionData and persists it
|
|
232
228
|
*/
|
|
233
|
-
async
|
|
229
|
+
async saveSessionStep<TData = Record<string, unknown>>(
|
|
234
230
|
sessionId: string,
|
|
235
|
-
|
|
231
|
+
sessionStep: SessionStep<TData>
|
|
236
232
|
): Promise<SessionData | null> {
|
|
237
|
-
const persistenceData =
|
|
233
|
+
const persistenceData = sessionStepToData(sessionStep);
|
|
238
234
|
|
|
239
235
|
return await this.sessionRepository.update(sessionId, {
|
|
240
236
|
currentRoute: persistenceData.currentRoute,
|
|
241
|
-
|
|
237
|
+
currentStep: persistenceData.currentStep,
|
|
242
238
|
collectedData: persistenceData.collectedData,
|
|
243
239
|
lastMessageAt: new Date(),
|
|
244
240
|
});
|
|
245
241
|
}
|
|
246
242
|
|
|
247
243
|
/**
|
|
248
|
-
* Load
|
|
249
|
-
* Converts SessionData to
|
|
244
|
+
* Load SessionStep from database
|
|
245
|
+
* Converts SessionData to SessionStep
|
|
250
246
|
*/
|
|
251
|
-
async
|
|
247
|
+
async loadSessionStep<TData = Record<string, unknown>>(
|
|
252
248
|
sessionId: string
|
|
253
|
-
): Promise<
|
|
249
|
+
): Promise<SessionStep<TData> | null> {
|
|
254
250
|
const sessionData = await this.sessionRepository.findById(sessionId);
|
|
255
251
|
|
|
256
252
|
if (!sessionData) {
|
|
257
253
|
return null;
|
|
258
254
|
}
|
|
259
255
|
|
|
260
|
-
const
|
|
256
|
+
const stepData = sessionDataToStep<TData>(sessionId, {
|
|
261
257
|
currentRoute: sessionData.currentRoute,
|
|
262
|
-
|
|
258
|
+
currentStep: sessionData.currentStep,
|
|
263
259
|
collectedData: sessionData.collectedData,
|
|
264
260
|
});
|
|
265
261
|
|
|
266
|
-
// Create a full session
|
|
267
|
-
const session = createSession<
|
|
262
|
+
// Create a full session step with the loaded data
|
|
263
|
+
const session = createSession<TData>(sessionId, {
|
|
268
264
|
createdAt: sessionData.createdAt,
|
|
269
265
|
lastUpdatedAt: sessionData.updatedAt,
|
|
270
266
|
});
|
|
271
267
|
|
|
272
268
|
return {
|
|
273
269
|
...session,
|
|
274
|
-
...
|
|
270
|
+
...stepData,
|
|
275
271
|
};
|
|
276
272
|
}
|
|
277
273
|
|
|
278
274
|
/**
|
|
279
|
-
* Create session with
|
|
280
|
-
* Returns both SessionData and initialized
|
|
275
|
+
* Create session with SessionStep support
|
|
276
|
+
* Returns both SessionData and initialized SessionStep
|
|
281
277
|
*/
|
|
282
|
-
async
|
|
278
|
+
async createSessionWithStep<TData = Record<string, unknown>>(
|
|
283
279
|
options: CreateSessionOptions
|
|
284
280
|
): Promise<{
|
|
285
281
|
sessionData: SessionData;
|
|
286
|
-
|
|
282
|
+
sessionStep: SessionStep<TData>;
|
|
287
283
|
}> {
|
|
288
284
|
const sessionData = await this.createSession(options);
|
|
289
285
|
|
|
290
|
-
// Create
|
|
291
|
-
const
|
|
286
|
+
// Create SessionStep with database session ID
|
|
287
|
+
const sessionStep = createSession<TData>(sessionData.id, {
|
|
292
288
|
createdAt: sessionData.createdAt,
|
|
293
289
|
lastUpdatedAt: sessionData.updatedAt,
|
|
294
290
|
});
|
|
295
291
|
|
|
296
|
-
// If initial data was provided, merge it as
|
|
292
|
+
// If initial data was provided, merge it as collected data
|
|
297
293
|
if (options.initialData) {
|
|
298
|
-
|
|
294
|
+
sessionStep.data = options.initialData as Partial<TData>;
|
|
299
295
|
}
|
|
300
296
|
|
|
301
|
-
return { sessionData,
|
|
297
|
+
return { sessionData, sessionStep };
|
|
302
298
|
}
|
|
303
299
|
}
|
|
@@ -1,19 +1,13 @@
|
|
|
1
1
|
import type { Event } from "../types/history";
|
|
2
2
|
import type { Route } from "./Route";
|
|
3
|
-
import type {
|
|
3
|
+
import type { Step } from "./Step";
|
|
4
4
|
import type { StructuredSchema } from "../types/schema";
|
|
5
5
|
import { PromptComposer } from "./PromptComposer";
|
|
6
6
|
|
|
7
|
-
export interface ResponseOutput<TData = unknown> {
|
|
8
|
-
message: string;
|
|
9
|
-
data?: TData;
|
|
10
|
-
contextUpdate?: Record<string, unknown>;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
7
|
export class ResponseEngine<TContext = unknown> {
|
|
14
|
-
responseSchemaForRoute<
|
|
15
|
-
route: Route<TContext,
|
|
16
|
-
|
|
8
|
+
responseSchemaForRoute<TData = unknown>(
|
|
9
|
+
route: Route<TContext, TData>,
|
|
10
|
+
currentStep?: Step<TContext, TData>
|
|
17
11
|
): StructuredSchema {
|
|
18
12
|
const base: StructuredSchema = {
|
|
19
13
|
type: "object",
|
|
@@ -29,10 +23,10 @@ export class ResponseEngine<TContext = unknown> {
|
|
|
29
23
|
base.properties!.data = route.responseOutputSchema;
|
|
30
24
|
}
|
|
31
25
|
|
|
32
|
-
// Add
|
|
33
|
-
if (
|
|
34
|
-
for (const field of
|
|
35
|
-
const fieldSchema = route.
|
|
26
|
+
// Add collect fields from current step
|
|
27
|
+
if (currentStep?.collectFields && route.schema?.properties) {
|
|
28
|
+
for (const field of currentStep.collectFields) {
|
|
29
|
+
const fieldSchema = route.schema.properties[field];
|
|
36
30
|
if (fieldSchema) {
|
|
37
31
|
base.properties![field] = fieldSchema;
|
|
38
32
|
}
|
|
@@ -44,7 +38,7 @@ export class ResponseEngine<TContext = unknown> {
|
|
|
44
38
|
|
|
45
39
|
buildResponsePrompt(
|
|
46
40
|
route: Route<TContext>,
|
|
47
|
-
|
|
41
|
+
currentStep: Step<TContext>,
|
|
48
42
|
rules: string[],
|
|
49
43
|
prohibitions: string[],
|
|
50
44
|
directives: string[] | undefined,
|
|
@@ -72,9 +66,9 @@ export class ResponseEngine<TContext = unknown> {
|
|
|
72
66
|
route.description ? ` — ${route.description}` : ""
|
|
73
67
|
}`
|
|
74
68
|
);
|
|
75
|
-
if (
|
|
69
|
+
if (currentStep.instructions) {
|
|
76
70
|
pc.addInstruction(
|
|
77
|
-
`Guideline for your response (adapt to the conversation):\n${
|
|
71
|
+
`Guideline for your response (adapt to the conversation):\n${currentStep.instructions}`
|
|
78
72
|
);
|
|
79
73
|
}
|
|
80
74
|
if (rules.length) pc.addInstruction(`Rules:\n- ${rules.join("\n- ")}`);
|
package/src/core/Route.ts
CHANGED
|
@@ -13,13 +13,13 @@ import type {
|
|
|
13
13
|
import type { StructuredSchema } from "../types/schema";
|
|
14
14
|
import type { Guideline } from "../types/agent";
|
|
15
15
|
|
|
16
|
-
import {
|
|
16
|
+
import { Step } from "./Step";
|
|
17
17
|
import { generateRouteId } from "../utils/id";
|
|
18
18
|
|
|
19
19
|
/**
|
|
20
20
|
* Represents a conversational route/journey
|
|
21
21
|
*/
|
|
22
|
-
export class Route<TContext = unknown,
|
|
22
|
+
export class Route<TContext = unknown, TData = unknown> {
|
|
23
23
|
public readonly id: string;
|
|
24
24
|
public readonly title: string;
|
|
25
25
|
public readonly description?: string;
|
|
@@ -27,16 +27,22 @@ export class Route<TContext = unknown, TExtracted = unknown> {
|
|
|
27
27
|
public readonly domains?: string[];
|
|
28
28
|
public readonly rules: string[];
|
|
29
29
|
public readonly prohibitions: string[];
|
|
30
|
-
public readonly
|
|
31
|
-
public readonly
|
|
30
|
+
public readonly initialStep: Step<TContext, TData>;
|
|
31
|
+
public readonly endStepSpec: Omit<
|
|
32
|
+
TransitionSpec<TContext, TData>,
|
|
33
|
+
"step" | "condition" | "skipIf"
|
|
34
|
+
>;
|
|
32
35
|
public readonly responseOutputSchema?: StructuredSchema;
|
|
33
|
-
public readonly
|
|
34
|
-
public readonly initialData?: Partial<
|
|
35
|
-
public readonly onComplete?:
|
|
36
|
+
public readonly schema?: StructuredSchema;
|
|
37
|
+
public readonly initialData?: Partial<TData>;
|
|
38
|
+
public readonly onComplete?:
|
|
39
|
+
| string
|
|
40
|
+
| RouteTransitionConfig
|
|
41
|
+
| RouteCompletionHandler<TContext, TData>;
|
|
36
42
|
private routingExtrasSchema?: StructuredSchema;
|
|
37
43
|
private guidelines: Guideline[] = [];
|
|
38
44
|
|
|
39
|
-
constructor(options: RouteOptions<
|
|
45
|
+
constructor(options: RouteOptions<TContext, TData>) {
|
|
40
46
|
// Use provided ID or generate a deterministic one from the title
|
|
41
47
|
this.id = options.id || generateRouteId(options.title);
|
|
42
48
|
this.title = options.title;
|
|
@@ -45,22 +51,23 @@ export class Route<TContext = unknown, TExtracted = unknown> {
|
|
|
45
51
|
this.domains = options.domains;
|
|
46
52
|
this.rules = options.rules || ([] as string[]);
|
|
47
53
|
this.prohibitions = options.prohibitions || ([] as string[]);
|
|
48
|
-
this.
|
|
54
|
+
this.initialStep = new Step<TContext, TData>(
|
|
49
55
|
this.id,
|
|
50
|
-
options.
|
|
51
|
-
options.
|
|
52
|
-
options.
|
|
53
|
-
options.
|
|
54
|
-
options.
|
|
55
|
-
options.
|
|
56
|
+
options.initialStep?.instructions || "Initial step",
|
|
57
|
+
options.initialStep?.id,
|
|
58
|
+
options.initialStep?.collect,
|
|
59
|
+
options.initialStep?.skipIf,
|
|
60
|
+
options.initialStep?.requires,
|
|
61
|
+
options.initialStep?.instructions
|
|
56
62
|
);
|
|
57
|
-
// Store
|
|
58
|
-
this.
|
|
59
|
-
|
|
63
|
+
// Store endStep spec (will be used when route completes)
|
|
64
|
+
this.endStepSpec = options.endStep || {
|
|
65
|
+
instructions:
|
|
66
|
+
"Summarize what was accomplished and confirm completion based on the conversation history and collected data",
|
|
60
67
|
};
|
|
61
68
|
this.routingExtrasSchema = options.routingExtrasSchema;
|
|
62
69
|
this.responseOutputSchema = options.responseOutputSchema;
|
|
63
|
-
this.
|
|
70
|
+
this.schema = options.schema;
|
|
64
71
|
this.initialData = options.initialData;
|
|
65
72
|
this.onComplete = options.onComplete;
|
|
66
73
|
|
|
@@ -78,24 +85,23 @@ export class Route<TContext = unknown, TExtracted = unknown> {
|
|
|
78
85
|
}
|
|
79
86
|
|
|
80
87
|
/**
|
|
81
|
-
* Build a sequential
|
|
88
|
+
* Build a sequential step machine from an array of steps
|
|
82
89
|
* @private
|
|
83
90
|
*/
|
|
84
91
|
private buildSequentialSteps(
|
|
85
|
-
steps: Array<TransitionSpec<TContext,
|
|
92
|
+
steps: Array<TransitionSpec<TContext, TData>>
|
|
86
93
|
): void {
|
|
87
|
-
// Import
|
|
88
|
-
const
|
|
94
|
+
// Import END_ROUTE dynamically to avoid circular dependency
|
|
95
|
+
const END_ROUTE = Symbol.for("END_ROUTE");
|
|
89
96
|
|
|
90
|
-
let
|
|
91
|
-
this.initialState;
|
|
97
|
+
let currentStep: TransitionResult<TContext, TData> = this.initialStep;
|
|
92
98
|
|
|
93
99
|
for (const step of steps) {
|
|
94
|
-
|
|
100
|
+
currentStep = currentStep.nextStep(step);
|
|
95
101
|
}
|
|
96
102
|
|
|
97
103
|
// End the route
|
|
98
|
-
|
|
104
|
+
currentStep.nextStep({ step: END_ROUTE });
|
|
99
105
|
}
|
|
100
106
|
|
|
101
107
|
/**
|
|
@@ -163,12 +169,12 @@ export class Route<TContext = unknown, TExtracted = unknown> {
|
|
|
163
169
|
}
|
|
164
170
|
|
|
165
171
|
/**
|
|
166
|
-
* Get all
|
|
172
|
+
* Get all steps in this route (via traversal from initial step)
|
|
167
173
|
*/
|
|
168
|
-
|
|
174
|
+
getAllSteps(): Step<TContext, TData>[] {
|
|
169
175
|
const visited = new Set<string>();
|
|
170
|
-
const
|
|
171
|
-
const queue:
|
|
176
|
+
const steps: Step<TContext, TData>[] = [];
|
|
177
|
+
const queue: Step<TContext, TData>[] = [this.initialStep];
|
|
172
178
|
|
|
173
179
|
while (queue.length > 0) {
|
|
174
180
|
const current = queue.shift()!;
|
|
@@ -178,9 +184,9 @@ export class Route<TContext = unknown, TExtracted = unknown> {
|
|
|
178
184
|
}
|
|
179
185
|
|
|
180
186
|
visited.add(current.id);
|
|
181
|
-
|
|
187
|
+
steps.push(current);
|
|
182
188
|
|
|
183
|
-
// Add target
|
|
189
|
+
// Add target steps from transitions
|
|
184
190
|
for (const transition of current.getTransitions()) {
|
|
185
191
|
const target = transition.getTarget();
|
|
186
192
|
if (target && !visited.has(target.id)) {
|
|
@@ -189,17 +195,17 @@ export class Route<TContext = unknown, TExtracted = unknown> {
|
|
|
189
195
|
}
|
|
190
196
|
}
|
|
191
197
|
|
|
192
|
-
return
|
|
198
|
+
return steps;
|
|
193
199
|
}
|
|
194
200
|
|
|
195
201
|
/**
|
|
196
|
-
* Get a specific
|
|
197
|
-
* @param
|
|
198
|
-
* @returns The
|
|
202
|
+
* Get a specific step by ID
|
|
203
|
+
* @param stepId - The step ID to find
|
|
204
|
+
* @returns The step if found, undefined otherwise
|
|
199
205
|
*/
|
|
200
|
-
|
|
201
|
-
const
|
|
202
|
-
return
|
|
206
|
+
getStep(stepId: string): Step<TContext, TData> | undefined {
|
|
207
|
+
const steps = this.getAllSteps();
|
|
208
|
+
return steps.find((step) => step.id === stepId);
|
|
203
209
|
}
|
|
204
210
|
|
|
205
211
|
/**
|
|
@@ -212,16 +218,16 @@ export class Route<TContext = unknown, TExtracted = unknown> {
|
|
|
212
218
|
`Description: ${this.description || "N/A"}`,
|
|
213
219
|
`Conditions: ${this.conditions.join(", ") || "None"}`,
|
|
214
220
|
"",
|
|
215
|
-
"
|
|
221
|
+
"Steps:",
|
|
216
222
|
];
|
|
217
223
|
|
|
218
|
-
const
|
|
219
|
-
for (const
|
|
224
|
+
const steps = this.getAllSteps();
|
|
225
|
+
for (const step of steps) {
|
|
220
226
|
lines.push(
|
|
221
|
-
` - ${
|
|
227
|
+
` - ${step.id}${step.description ? `: ${step.description}` : ""}`
|
|
222
228
|
);
|
|
223
229
|
|
|
224
|
-
const transitions =
|
|
230
|
+
const transitions = step.getTransitions();
|
|
225
231
|
for (const transition of transitions) {
|
|
226
232
|
lines.push(` -> ${transition.describe()}`);
|
|
227
233
|
}
|
|
@@ -232,12 +238,12 @@ export class Route<TContext = unknown, TExtracted = unknown> {
|
|
|
232
238
|
|
|
233
239
|
/**
|
|
234
240
|
* Evaluate the onComplete handler and return transition config
|
|
235
|
-
* @param session - Current session
|
|
241
|
+
* @param session - Current session step
|
|
236
242
|
* @param context - Agent context
|
|
237
243
|
* @returns Transition config or undefined if no transition
|
|
238
244
|
*/
|
|
239
245
|
async evaluateOnComplete(
|
|
240
|
-
session: {
|
|
246
|
+
session: { data?: Partial<TData> },
|
|
241
247
|
context?: TContext
|
|
242
248
|
): Promise<RouteTransitionConfig | undefined> {
|
|
243
249
|
if (!this.onComplete) {
|
|
@@ -247,7 +253,7 @@ export class Route<TContext = unknown, TExtracted = unknown> {
|
|
|
247
253
|
// String form: just route ID/title
|
|
248
254
|
if (typeof this.onComplete === "string") {
|
|
249
255
|
return {
|
|
250
|
-
|
|
256
|
+
nextStep: this.onComplete,
|
|
251
257
|
};
|
|
252
258
|
}
|
|
253
259
|
|
|
@@ -261,7 +267,7 @@ export class Route<TContext = unknown, TExtracted = unknown> {
|
|
|
261
267
|
|
|
262
268
|
if (typeof result === "string") {
|
|
263
269
|
return {
|
|
264
|
-
|
|
270
|
+
nextStep: result,
|
|
265
271
|
};
|
|
266
272
|
}
|
|
267
273
|
|