@falai/agent 0.4.1 → 0.5.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 +21 -74
- package/dist/cjs/core/Agent.d.ts +22 -29
- package/dist/cjs/core/Agent.d.ts.map +1 -1
- package/dist/cjs/core/Agent.js +464 -291
- package/dist/cjs/core/Agent.js.map +1 -1
- package/dist/cjs/core/Events.d.ts +10 -1
- package/dist/cjs/core/Events.d.ts.map +1 -1
- package/dist/cjs/core/Events.js +3 -2
- package/dist/cjs/core/Events.js.map +1 -1
- package/dist/cjs/core/PersistenceManager.d.ts +19 -0
- package/dist/cjs/core/PersistenceManager.d.ts.map +1 -1
- package/dist/cjs/core/PersistenceManager.js +57 -0
- package/dist/cjs/core/PersistenceManager.js.map +1 -1
- package/dist/cjs/core/PromptComposer.d.ts +24 -0
- package/dist/cjs/core/PromptComposer.d.ts.map +1 -0
- package/dist/cjs/core/PromptComposer.js +127 -0
- package/dist/cjs/core/PromptComposer.js.map +1 -0
- package/dist/cjs/core/ResponseEngine.d.ts +19 -0
- package/dist/cjs/core/ResponseEngine.d.ts.map +1 -0
- package/dist/cjs/core/ResponseEngine.js +51 -0
- package/dist/cjs/core/ResponseEngine.js.map +1 -0
- package/dist/cjs/core/Route.d.ts +18 -12
- package/dist/cjs/core/Route.d.ts.map +1 -1
- package/dist/cjs/core/Route.js +15 -9
- package/dist/cjs/core/Route.js.map +1 -1
- package/dist/cjs/core/RoutingEngine.d.ts +38 -0
- package/dist/cjs/core/RoutingEngine.d.ts.map +1 -0
- package/dist/cjs/core/RoutingEngine.js +110 -0
- package/dist/cjs/core/RoutingEngine.js.map +1 -0
- package/dist/cjs/core/State.d.ts +15 -4
- package/dist/cjs/core/State.d.ts.map +1 -1
- package/dist/cjs/core/State.js +21 -2
- package/dist/cjs/core/State.js.map +1 -1
- package/dist/cjs/core/ToolExecutor.d.ts +29 -0
- package/dist/cjs/core/ToolExecutor.d.ts.map +1 -0
- package/dist/cjs/core/ToolExecutor.js +73 -0
- package/dist/cjs/core/ToolExecutor.js.map +1 -0
- package/dist/cjs/core/Transition.d.ts +5 -5
- package/dist/cjs/core/Transition.d.ts.map +1 -1
- package/dist/cjs/core/Transition.js.map +1 -1
- package/dist/cjs/index.d.ts +6 -8
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +8 -10
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/providers/AnthropicProvider.d.ts.map +1 -1
- package/dist/cjs/providers/AnthropicProvider.js +10 -13
- package/dist/cjs/providers/AnthropicProvider.js.map +1 -1
- package/dist/cjs/providers/GeminiProvider.d.ts.map +1 -1
- package/dist/cjs/providers/GeminiProvider.js +12 -8
- package/dist/cjs/providers/GeminiProvider.js.map +1 -1
- package/dist/cjs/providers/OpenAIProvider.d.ts.map +1 -1
- package/dist/cjs/providers/OpenAIProvider.js +10 -53
- package/dist/cjs/providers/OpenAIProvider.js.map +1 -1
- package/dist/cjs/providers/OpenRouterProvider.d.ts.map +1 -1
- package/dist/cjs/providers/OpenRouterProvider.js +10 -53
- package/dist/cjs/providers/OpenRouterProvider.js.map +1 -1
- package/dist/cjs/types/agent.d.ts +13 -12
- package/dist/cjs/types/agent.d.ts.map +1 -1
- package/dist/cjs/types/ai.d.ts +8 -2
- package/dist/cjs/types/ai.d.ts.map +1 -1
- package/dist/cjs/types/history.d.ts +8 -0
- package/dist/cjs/types/history.d.ts.map +1 -1
- package/dist/cjs/types/index.d.ts +0 -3
- package/dist/cjs/types/index.d.ts.map +1 -1
- package/dist/cjs/types/index.js +1 -3
- package/dist/cjs/types/index.js.map +1 -1
- package/dist/cjs/types/route.d.ts +39 -4
- package/dist/cjs/types/route.d.ts.map +1 -1
- package/dist/cjs/types/routing.d.ts +16 -0
- package/dist/cjs/types/routing.d.ts.map +1 -0
- package/dist/cjs/types/routing.js +3 -0
- package/dist/cjs/types/routing.js.map +1 -0
- package/dist/cjs/types/schema.d.ts +22 -0
- package/dist/cjs/types/schema.d.ts.map +1 -0
- package/dist/cjs/types/schema.js +3 -0
- package/dist/cjs/types/schema.js.map +1 -0
- package/dist/cjs/types/session.d.ts +72 -0
- package/dist/cjs/types/session.d.ts.map +1 -0
- package/dist/cjs/types/session.js +140 -0
- package/dist/cjs/types/session.js.map +1 -0
- package/dist/cjs/types/tool.d.ts +11 -5
- package/dist/cjs/types/tool.d.ts.map +1 -1
- package/dist/cjs/utils/id.d.ts +0 -5
- package/dist/cjs/utils/id.d.ts.map +1 -1
- package/dist/cjs/utils/id.js +0 -10
- package/dist/cjs/utils/id.js.map +1 -1
- package/dist/cjs/utils/schema.d.ts +17 -0
- package/dist/cjs/utils/schema.d.ts.map +1 -0
- package/dist/cjs/utils/schema.js +32 -0
- package/dist/cjs/utils/schema.js.map +1 -0
- package/dist/core/Agent.d.ts +22 -29
- package/dist/core/Agent.d.ts.map +1 -1
- package/dist/core/Agent.js +464 -291
- package/dist/core/Agent.js.map +1 -1
- package/dist/core/Events.d.ts +10 -1
- package/dist/core/Events.d.ts.map +1 -1
- package/dist/core/Events.js +3 -2
- package/dist/core/Events.js.map +1 -1
- package/dist/core/PersistenceManager.d.ts +19 -0
- package/dist/core/PersistenceManager.d.ts.map +1 -1
- package/dist/core/PersistenceManager.js +57 -0
- package/dist/core/PersistenceManager.js.map +1 -1
- package/dist/core/PromptComposer.d.ts +24 -0
- package/dist/core/PromptComposer.d.ts.map +1 -0
- package/dist/core/PromptComposer.js +123 -0
- package/dist/core/PromptComposer.js.map +1 -0
- package/dist/core/ResponseEngine.d.ts +19 -0
- package/dist/core/ResponseEngine.d.ts.map +1 -0
- package/dist/core/ResponseEngine.js +47 -0
- package/dist/core/ResponseEngine.js.map +1 -0
- package/dist/core/Route.d.ts +18 -12
- package/dist/core/Route.d.ts.map +1 -1
- package/dist/core/Route.js +15 -9
- package/dist/core/Route.js.map +1 -1
- package/dist/core/RoutingEngine.d.ts +38 -0
- package/dist/core/RoutingEngine.d.ts.map +1 -0
- package/dist/core/RoutingEngine.js +106 -0
- package/dist/core/RoutingEngine.js.map +1 -0
- package/dist/core/State.d.ts +15 -4
- package/dist/core/State.d.ts.map +1 -1
- package/dist/core/State.js +21 -2
- package/dist/core/State.js.map +1 -1
- package/dist/core/ToolExecutor.d.ts +29 -0
- package/dist/core/ToolExecutor.d.ts.map +1 -0
- package/dist/core/ToolExecutor.js +69 -0
- package/dist/core/ToolExecutor.js.map +1 -0
- package/dist/core/Transition.d.ts +5 -5
- package/dist/core/Transition.d.ts.map +1 -1
- package/dist/core/Transition.js.map +1 -1
- package/dist/index.d.ts +6 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -5
- package/dist/index.js.map +1 -1
- package/dist/providers/AnthropicProvider.d.ts.map +1 -1
- package/dist/providers/AnthropicProvider.js +10 -13
- package/dist/providers/AnthropicProvider.js.map +1 -1
- package/dist/providers/GeminiProvider.d.ts.map +1 -1
- package/dist/providers/GeminiProvider.js +12 -8
- package/dist/providers/GeminiProvider.js.map +1 -1
- package/dist/providers/OpenAIProvider.d.ts.map +1 -1
- package/dist/providers/OpenAIProvider.js +10 -53
- package/dist/providers/OpenAIProvider.js.map +1 -1
- package/dist/providers/OpenRouterProvider.d.ts.map +1 -1
- package/dist/providers/OpenRouterProvider.js +10 -53
- package/dist/providers/OpenRouterProvider.js.map +1 -1
- package/dist/types/agent.d.ts +13 -12
- package/dist/types/agent.d.ts.map +1 -1
- package/dist/types/ai.d.ts +8 -2
- package/dist/types/ai.d.ts.map +1 -1
- package/dist/types/history.d.ts +8 -0
- package/dist/types/history.d.ts.map +1 -1
- package/dist/types/index.d.ts +0 -3
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +0 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/route.d.ts +39 -4
- package/dist/types/route.d.ts.map +1 -1
- package/dist/types/routing.d.ts +16 -0
- package/dist/types/routing.d.ts.map +1 -0
- package/dist/types/routing.js +2 -0
- package/dist/types/routing.js.map +1 -0
- package/dist/types/schema.d.ts +22 -0
- package/dist/types/schema.d.ts.map +1 -0
- package/dist/types/schema.js +2 -0
- package/dist/types/schema.js.map +1 -0
- package/dist/types/session.d.ts +72 -0
- package/dist/types/session.d.ts.map +1 -0
- package/dist/types/session.js +132 -0
- package/dist/types/session.js.map +1 -0
- package/dist/types/tool.d.ts +11 -5
- package/dist/types/tool.d.ts.map +1 -1
- package/dist/utils/id.d.ts +0 -5
- package/dist/utils/id.d.ts.map +1 -1
- package/dist/utils/id.js +0 -9
- package/dist/utils/id.js.map +1 -1
- package/dist/utils/schema.d.ts +17 -0
- package/dist/utils/schema.d.ts.map +1 -0
- package/dist/utils/schema.js +27 -0
- package/dist/utils/schema.js.map +1 -0
- package/docs/ADAPTERS.md +83 -3
- package/docs/API_REFERENCE.md +95 -104
- package/docs/ARCHITECTURE.md +284 -286
- package/docs/CONSTRUCTOR_OPTIONS.md +192 -135
- package/docs/CONTEXT_MANAGEMENT.md +311 -28
- package/docs/CONTRIBUTING.md +1 -1
- package/docs/DOMAINS.md +61 -0
- package/docs/GETTING_STARTED.md +177 -88
- package/docs/PERSISTENCE.md +170 -23
- package/docs/README.md +7 -10
- package/examples/business-onboarding.ts +21 -9
- package/examples/company-qna-agent.ts +508 -0
- package/examples/declarative-agent.ts +143 -26
- package/examples/domain-scoping.ts +31 -10
- package/examples/extracted-data-modification.ts +415 -0
- package/examples/healthcare-agent.ts +194 -90
- package/examples/openai-agent.ts +67 -25
- package/examples/opensearch-persistence.ts +455 -151
- package/examples/persistent-onboarding.ts +162 -96
- package/examples/prisma-persistence.ts +371 -125
- package/examples/redis-persistence.ts +393 -23
- package/examples/rules-prohibitions.ts +32 -11
- package/examples/streaming-agent.ts +61 -13
- package/examples/travel-agent.ts +266 -133
- package/package.json +1 -1
- package/src/core/Agent.ts +674 -356
- package/src/core/Events.ts +12 -2
- package/src/core/PersistenceManager.ts +83 -0
- package/src/core/PromptComposer.ts +143 -0
- package/src/core/ResponseEngine.ts +82 -0
- package/src/core/Route.ts +32 -17
- package/src/core/RoutingEngine.ts +165 -0
- package/src/core/State.ts +55 -15
- package/src/core/ToolExecutor.ts +117 -0
- package/src/core/Transition.ts +5 -5
- package/src/index.ts +12 -21
- package/src/providers/AnthropicProvider.ts +10 -13
- package/src/providers/GeminiProvider.ts +12 -8
- package/src/providers/OpenAIProvider.ts +10 -56
- package/src/providers/OpenRouterProvider.ts +10 -56
- package/src/types/agent.ts +16 -13
- package/src/types/ai.ts +6 -2
- package/src/types/history.ts +8 -0
- package/src/types/index.ts +0 -11
- package/src/types/route.ts +41 -5
- package/src/types/routing.ts +18 -0
- package/src/types/schema.ts +23 -0
- package/src/types/session.ts +207 -0
- package/src/types/tool.ts +29 -7
- package/src/utils/id.ts +0 -10
- package/src/utils/schema.ts +32 -0
- package/dist/cjs/core/ConditionEvaluator.d.ts +0 -72
- package/dist/cjs/core/ConditionEvaluator.d.ts.map +0 -1
- package/dist/cjs/core/ConditionEvaluator.js +0 -272
- package/dist/cjs/core/ConditionEvaluator.js.map +0 -1
- package/dist/cjs/core/Observation.d.ts +0 -24
- package/dist/cjs/core/Observation.d.ts.map +0 -1
- package/dist/cjs/core/Observation.js +0 -39
- package/dist/cjs/core/Observation.js.map +0 -1
- package/dist/cjs/core/PreparationEngine.d.ts +0 -116
- package/dist/cjs/core/PreparationEngine.d.ts.map +0 -1
- package/dist/cjs/core/PreparationEngine.js +0 -353
- package/dist/cjs/core/PreparationEngine.js.map +0 -1
- package/dist/cjs/core/PromptBuilder.d.ts +0 -136
- package/dist/cjs/core/PromptBuilder.d.ts.map +0 -1
- package/dist/cjs/core/PromptBuilder.js +0 -421
- package/dist/cjs/core/PromptBuilder.js.map +0 -1
- package/dist/cjs/types/observation.d.ts +0 -27
- package/dist/cjs/types/observation.d.ts.map +0 -1
- package/dist/cjs/types/observation.js +0 -6
- package/dist/cjs/types/observation.js.map +0 -1
- package/dist/cjs/types/prompt.d.ts +0 -46
- package/dist/cjs/types/prompt.d.ts.map +0 -1
- package/dist/cjs/types/prompt.js +0 -19
- package/dist/cjs/types/prompt.js.map +0 -1
- package/dist/core/ConditionEvaluator.d.ts +0 -72
- package/dist/core/ConditionEvaluator.d.ts.map +0 -1
- package/dist/core/ConditionEvaluator.js +0 -268
- package/dist/core/ConditionEvaluator.js.map +0 -1
- package/dist/core/Observation.d.ts +0 -24
- package/dist/core/Observation.d.ts.map +0 -1
- package/dist/core/Observation.js +0 -35
- package/dist/core/Observation.js.map +0 -1
- package/dist/core/PreparationEngine.d.ts +0 -116
- package/dist/core/PreparationEngine.d.ts.map +0 -1
- package/dist/core/PreparationEngine.js +0 -349
- package/dist/core/PreparationEngine.js.map +0 -1
- package/dist/core/PromptBuilder.d.ts +0 -136
- package/dist/core/PromptBuilder.d.ts.map +0 -1
- package/dist/core/PromptBuilder.js +0 -417
- package/dist/core/PromptBuilder.js.map +0 -1
- package/dist/types/observation.d.ts +0 -27
- package/dist/types/observation.d.ts.map +0 -1
- package/dist/types/observation.js +0 -5
- package/dist/types/observation.js.map +0 -1
- package/dist/types/prompt.d.ts +0 -46
- package/dist/types/prompt.d.ts.map +0 -1
- package/dist/types/prompt.js +0 -16
- package/dist/types/prompt.js.map +0 -1
- package/docs/STRUCTURE.md +0 -58
- package/src/core/ConditionEvaluator.ts +0 -381
- package/src/core/Observation.ts +0 -47
- package/src/core/PreparationEngine.ts +0 -561
- package/src/core/PromptBuilder.ts +0 -617
- package/src/types/observation.ts +0 -29
- package/src/types/prompt.ts +0 -49
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Persistent multi-turn onboarding agent example
|
|
3
|
-
*
|
|
3
|
+
* Updated for v2 architecture with session state management and schema-first data extraction
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import {
|
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
END_ROUTE,
|
|
11
11
|
EventSource,
|
|
12
12
|
createMessageEvent,
|
|
13
|
-
|
|
13
|
+
createSession,
|
|
14
14
|
} from "../src/index";
|
|
15
15
|
|
|
16
16
|
// ============================================================================
|
|
@@ -63,16 +63,19 @@ const db = {
|
|
|
63
63
|
// CONTEXT TYPE
|
|
64
64
|
// ============================================================================
|
|
65
65
|
|
|
66
|
+
// Data extraction types for onboarding
|
|
67
|
+
interface OnboardingData {
|
|
68
|
+
businessName?: string;
|
|
69
|
+
businessDescription?: string;
|
|
70
|
+
industry?: string;
|
|
71
|
+
contactEmail?: string;
|
|
72
|
+
}
|
|
73
|
+
|
|
66
74
|
interface OnboardingContext {
|
|
67
75
|
sessionId: string;
|
|
68
76
|
userId: string;
|
|
69
77
|
userName?: string;
|
|
70
|
-
collectedData:
|
|
71
|
-
businessName?: string;
|
|
72
|
-
businessDescription?: string;
|
|
73
|
-
industry?: string;
|
|
74
|
-
contactEmail?: string;
|
|
75
|
-
};
|
|
78
|
+
collectedData: OnboardingData;
|
|
76
79
|
completedSteps: string[];
|
|
77
80
|
}
|
|
78
81
|
|
|
@@ -96,31 +99,26 @@ async function createPersistentOnboardingAgent(sessionId: string) {
|
|
|
96
99
|
}
|
|
97
100
|
|
|
98
101
|
// Define lifecycle hooks for automatic persistence
|
|
99
|
-
const hooks
|
|
100
|
-
// Called
|
|
101
|
-
|
|
102
|
-
console.log("🔄
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
completedSteps: freshSession.completedSteps,
|
|
114
|
-
};
|
|
115
|
-
},
|
|
116
|
-
|
|
117
|
-
// Called after context updates - persist to database
|
|
118
|
-
onContextUpdate: async (newContext) => {
|
|
119
|
-
console.log("💾 Persisting context update to database...");
|
|
102
|
+
const hooks = {
|
|
103
|
+
// Called after data extraction - validate and enrich extracted data
|
|
104
|
+
onExtractedUpdate: async (extracted, previousExtracted) => {
|
|
105
|
+
console.log("🔄 Processing extracted data...");
|
|
106
|
+
|
|
107
|
+
// Update completed steps based on what's been extracted
|
|
108
|
+
const completedSteps: string[] = [];
|
|
109
|
+
if (extracted.businessName) completedSteps.push("business_info");
|
|
110
|
+
if (extracted.businessDescription)
|
|
111
|
+
completedSteps.push("business_description");
|
|
112
|
+
if (extracted.industry) completedSteps.push("industry");
|
|
113
|
+
if (extracted.contactEmail) completedSteps.push("contact");
|
|
114
|
+
|
|
115
|
+
// Persist to database
|
|
120
116
|
await db.sessions.update(sessionId, {
|
|
121
|
-
collectedData:
|
|
122
|
-
completedSteps
|
|
117
|
+
collectedData: extracted,
|
|
118
|
+
completedSteps,
|
|
123
119
|
});
|
|
120
|
+
|
|
121
|
+
return extracted;
|
|
124
122
|
},
|
|
125
123
|
};
|
|
126
124
|
|
|
@@ -134,11 +132,21 @@ async function createPersistentOnboardingAgent(sessionId: string) {
|
|
|
134
132
|
description: "A friendly assistant that helps businesses get started",
|
|
135
133
|
goal: "Collect business information efficiently while being conversational",
|
|
136
134
|
ai: provider,
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
135
|
+
// Context is loaded fresh from database on each respond() call
|
|
136
|
+
contextProvider: async () => {
|
|
137
|
+
console.log("🔄 Loading fresh context from database...");
|
|
138
|
+
const freshSession = await db.sessions.findById(sessionId);
|
|
139
|
+
|
|
140
|
+
if (!freshSession) {
|
|
141
|
+
throw new Error(`Session ${sessionId} not found`);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
return {
|
|
145
|
+
sessionId: freshSession.sessionId,
|
|
146
|
+
userId: freshSession.userId,
|
|
147
|
+
collectedData: freshSession.collectedData,
|
|
148
|
+
completedSteps: freshSession.completedSteps,
|
|
149
|
+
};
|
|
142
150
|
},
|
|
143
151
|
hooks, // Enable lifecycle hooks for persistence
|
|
144
152
|
});
|
|
@@ -229,44 +237,79 @@ async function createPersistentOnboardingAgent(sessionId: string) {
|
|
|
229
237
|
);
|
|
230
238
|
|
|
231
239
|
// ============================================================================
|
|
232
|
-
// ONBOARDING ROUTE
|
|
240
|
+
// ONBOARDING ROUTE WITH DATA EXTRACTION
|
|
233
241
|
// ============================================================================
|
|
234
242
|
|
|
235
|
-
const onboardingRoute = agent.createRoute({
|
|
243
|
+
const onboardingRoute = agent.createRoute<OnboardingData>({
|
|
236
244
|
title: "Business Onboarding",
|
|
237
245
|
description: "Guide user through business information collection",
|
|
238
246
|
conditions: ["User is onboarding their business"],
|
|
247
|
+
gatherSchema: {
|
|
248
|
+
type: "object",
|
|
249
|
+
properties: {
|
|
250
|
+
businessName: {
|
|
251
|
+
type: "string",
|
|
252
|
+
description: "Name of the business",
|
|
253
|
+
},
|
|
254
|
+
businessDescription: {
|
|
255
|
+
type: "string",
|
|
256
|
+
description: "Brief description of what the business does",
|
|
257
|
+
},
|
|
258
|
+
industry: {
|
|
259
|
+
type: "string",
|
|
260
|
+
description: "Industry the business operates in",
|
|
261
|
+
},
|
|
262
|
+
contactEmail: {
|
|
263
|
+
type: "string",
|
|
264
|
+
description: "Contact email for the business",
|
|
265
|
+
},
|
|
266
|
+
},
|
|
267
|
+
required: ["businessName", "businessDescription"],
|
|
268
|
+
},
|
|
239
269
|
});
|
|
240
270
|
|
|
241
|
-
//
|
|
242
|
-
const
|
|
271
|
+
// State 1: Gather business name and description
|
|
272
|
+
const gatherBusinessInfo = onboardingRoute.initialState.transitionTo({
|
|
243
273
|
chatState: "Ask for business name and a brief description",
|
|
274
|
+
gather: ["businessName", "businessDescription"],
|
|
275
|
+
skipIf: (extracted) =>
|
|
276
|
+
!!extracted.businessName && !!extracted.businessDescription,
|
|
244
277
|
});
|
|
245
278
|
|
|
246
|
-
|
|
279
|
+
// State 2: Save business info (tool execution)
|
|
280
|
+
const saveBusiness = gatherBusinessInfo.transitionTo({
|
|
247
281
|
toolState: saveBusinessInfo,
|
|
282
|
+
requiredData: ["businessName", "businessDescription"],
|
|
248
283
|
});
|
|
249
284
|
|
|
250
|
-
//
|
|
251
|
-
const
|
|
285
|
+
// State 3: Gather industry
|
|
286
|
+
const gatherIndustry = saveBusiness.transitionTo({
|
|
252
287
|
chatState: "Ask what industry the business operates in",
|
|
288
|
+
gather: ["industry"],
|
|
289
|
+
skipIf: (extracted) => !!extracted.industry,
|
|
253
290
|
});
|
|
254
291
|
|
|
255
|
-
|
|
292
|
+
// State 4: Save industry (tool execution)
|
|
293
|
+
const saveIndustryStep = gatherIndustry.transitionTo({
|
|
256
294
|
toolState: saveIndustry,
|
|
295
|
+
requiredData: ["industry"],
|
|
257
296
|
});
|
|
258
297
|
|
|
259
|
-
//
|
|
260
|
-
const
|
|
298
|
+
// State 5: Gather contact email
|
|
299
|
+
const gatherContact = saveIndustryStep.transitionTo({
|
|
261
300
|
chatState: "Ask for their contact email",
|
|
301
|
+
gather: ["contactEmail"],
|
|
302
|
+
skipIf: (extracted) => !!extracted.contactEmail,
|
|
262
303
|
});
|
|
263
304
|
|
|
264
|
-
|
|
305
|
+
// State 6: Save contact (tool execution)
|
|
306
|
+
const saveContact = gatherContact.transitionTo({
|
|
265
307
|
toolState: saveContactEmail,
|
|
308
|
+
requiredData: ["contactEmail"],
|
|
266
309
|
});
|
|
267
310
|
|
|
268
|
-
//
|
|
269
|
-
const confirm =
|
|
311
|
+
// State 7: Confirmation
|
|
312
|
+
const confirm = saveContact.transitionTo({
|
|
270
313
|
chatState: "Summarize all collected information and ask for confirmation",
|
|
271
314
|
});
|
|
272
315
|
|
|
@@ -366,12 +409,17 @@ async function main() {
|
|
|
366
409
|
lastUpdated: new Date(),
|
|
367
410
|
});
|
|
368
411
|
|
|
412
|
+
// Create agent with fresh context loading
|
|
413
|
+
const agent = await createPersistentOnboardingAgent(sessionId);
|
|
414
|
+
|
|
369
415
|
console.log("=== MULTI-TURN CONVERSATION SIMULATION ===\n");
|
|
370
416
|
|
|
417
|
+
// Initialize session state for multi-turn conversation
|
|
418
|
+
let session = createSession<OnboardingData>();
|
|
419
|
+
|
|
371
420
|
// Turn 1: Start onboarding
|
|
372
421
|
console.log("📱 Turn 1: User starts onboarding");
|
|
373
|
-
const
|
|
374
|
-
const response1 = await agent1.respond({
|
|
422
|
+
const response1 = await agent.respond({
|
|
375
423
|
history: [
|
|
376
424
|
createMessageEvent(
|
|
377
425
|
EventSource.CUSTOMER,
|
|
@@ -379,42 +427,53 @@ async function main() {
|
|
|
379
427
|
"Hi, I want to onboard my business"
|
|
380
428
|
),
|
|
381
429
|
],
|
|
430
|
+
session,
|
|
382
431
|
});
|
|
383
432
|
console.log("🤖 Bot:", response1.message);
|
|
384
|
-
console.log("📊
|
|
433
|
+
console.log("📊 Extracted after turn 1:", response1.session?.extracted);
|
|
434
|
+
console.log("📊 Route:", response1.session?.currentRoute?.title);
|
|
385
435
|
console.log();
|
|
386
436
|
|
|
437
|
+
// Update session with progress
|
|
438
|
+
session = response1.session!;
|
|
439
|
+
|
|
387
440
|
// Turn 2: User provides business info
|
|
388
|
-
// NOTE: We create a NEW agent instance - context is loaded from database
|
|
389
441
|
console.log("📱 Turn 2: User provides business info");
|
|
390
|
-
const
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
442
|
+
const history2 = [
|
|
443
|
+
createMessageEvent(
|
|
444
|
+
EventSource.CUSTOMER,
|
|
445
|
+
"Alice",
|
|
446
|
+
"Hi, I want to onboard my business"
|
|
447
|
+
),
|
|
448
|
+
createMessageEvent(EventSource.AI_AGENT, "Agent", response1.message),
|
|
449
|
+
createMessageEvent(
|
|
450
|
+
EventSource.CUSTOMER,
|
|
451
|
+
"Alice",
|
|
452
|
+
"My business is called 'TechFlow' and we build AI-powered workflow automation tools"
|
|
453
|
+
),
|
|
454
|
+
];
|
|
455
|
+
const response2 = await agent.respond({ history: history2, session });
|
|
400
456
|
console.log("🤖 Bot:", response2.message);
|
|
401
|
-
console.log("📊
|
|
457
|
+
console.log("📊 Extracted after turn 2:", response2.session?.extracted);
|
|
402
458
|
console.log();
|
|
403
459
|
|
|
460
|
+
// Update session again
|
|
461
|
+
session = response2.session!;
|
|
462
|
+
|
|
404
463
|
// Turn 3: User provides industry
|
|
405
464
|
console.log("📱 Turn 3: User provides industry");
|
|
406
|
-
const
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
});
|
|
465
|
+
const history3 = [
|
|
466
|
+
...history2,
|
|
467
|
+
createMessageEvent(EventSource.AI_AGENT, "Agent", response2.message),
|
|
468
|
+
createMessageEvent(
|
|
469
|
+
EventSource.CUSTOMER,
|
|
470
|
+
"Alice",
|
|
471
|
+
"We're in the SaaS industry"
|
|
472
|
+
),
|
|
473
|
+
];
|
|
474
|
+
const response3 = await agent.respond({ history: history3, session });
|
|
416
475
|
console.log("🤖 Bot:", response3.message);
|
|
417
|
-
console.log("📊
|
|
476
|
+
console.log("📊 Extracted after turn 3:", response3.session?.extracted);
|
|
418
477
|
console.log();
|
|
419
478
|
|
|
420
479
|
// Verify persistence
|
|
@@ -427,34 +486,41 @@ async function main() {
|
|
|
427
486
|
}
|
|
428
487
|
|
|
429
488
|
// ============================================================================
|
|
430
|
-
// KEY PATTERNS DEMONSTRATED
|
|
489
|
+
// KEY PATTERNS DEMONSTRATED (V2 Architecture)
|
|
431
490
|
// ============================================================================
|
|
432
491
|
|
|
433
492
|
/*
|
|
434
|
-
* ✅ PATTERN 1:
|
|
435
|
-
* -
|
|
436
|
-
* -
|
|
437
|
-
* -
|
|
493
|
+
* ✅ PATTERN 1: Session State Management (Core v2 pattern)
|
|
494
|
+
* - createSession<T>(): Initialize typed session state
|
|
495
|
+
* - Pass session to respond() calls
|
|
496
|
+
* - Session tracks extracted data across turns
|
|
497
|
+
* - Always-on routing respects intent changes
|
|
498
|
+
*
|
|
499
|
+
* ✅ PATTERN 2: Schema-First Data Extraction
|
|
500
|
+
* - gatherSchema: Define data contracts upfront
|
|
501
|
+
* - Type-safe extraction throughout conversation
|
|
502
|
+
* - skipIf functions for deterministic state logic
|
|
503
|
+
* - requiredData arrays for prerequisites
|
|
438
504
|
*
|
|
439
|
-
* ✅ PATTERN
|
|
440
|
-
* - contextProvider:
|
|
441
|
-
* -
|
|
442
|
-
* -
|
|
505
|
+
* ✅ PATTERN 3: Context Provider (For external data sources)
|
|
506
|
+
* - contextProvider: Load fresh context from database/API
|
|
507
|
+
* - Runs before each respond() call
|
|
508
|
+
* - Perfect for real-time external data
|
|
443
509
|
*
|
|
444
|
-
* ✅ PATTERN
|
|
445
|
-
* -
|
|
446
|
-
* -
|
|
447
|
-
* -
|
|
510
|
+
* ✅ PATTERN 4: Lifecycle Hooks (Data validation & enrichment)
|
|
511
|
+
* - onExtractedUpdate: Process extracted data after extraction
|
|
512
|
+
* - Validate, enrich, and persist extracted data
|
|
513
|
+
* - Return modified extracted data
|
|
448
514
|
*
|
|
449
|
-
* ✅ PATTERN
|
|
450
|
-
* -
|
|
451
|
-
* -
|
|
452
|
-
* -
|
|
515
|
+
* ✅ PATTERN 5: Tool Integration (Enhanced context access)
|
|
516
|
+
* - Tools access extracted data via context parameter
|
|
517
|
+
* - Can return extractedUpdate to modify extracted data
|
|
518
|
+
* - Perfect for data validation and enrichment
|
|
453
519
|
*
|
|
454
|
-
*
|
|
455
|
-
* -
|
|
456
|
-
* -
|
|
457
|
-
* -
|
|
520
|
+
* ✅ PATTERN 6: State Progression (Code-based logic)
|
|
521
|
+
* - skipIf: Deterministic functions instead of fuzzy conditions
|
|
522
|
+
* - requiredData: Prerequisites for state transitions
|
|
523
|
+
* - No more LLM interpretation of state logic
|
|
458
524
|
*/
|
|
459
525
|
|
|
460
526
|
if (import.meta.url === `file://${process.argv[1]}`) {
|