@falai/agent 0.4.1 → 0.5.1
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 +55 -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 +77 -0
- package/dist/cjs/types/session.d.ts.map +1 -0
- package/dist/cjs/types/session.js +146 -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 +55 -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 +77 -0
- package/dist/types/session.d.ts.map +1 -0
- package/dist/types/session.js +138 -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 +329 -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 +668 -356
- package/src/core/Events.ts +12 -2
- package/src/core/PersistenceManager.ts +81 -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 +219 -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,14 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Example: Declarative Agent Configuration
|
|
2
|
+
* Example: Declarative Agent Configuration with Session State
|
|
3
3
|
*
|
|
4
4
|
* This example demonstrates how to configure an entire agent
|
|
5
5
|
* using declarative syntax in the constructor, including:
|
|
6
6
|
* - Terms (glossary)
|
|
7
7
|
* - Guidelines (behavior rules)
|
|
8
8
|
* - Capabilities
|
|
9
|
-
* - Routes with
|
|
10
|
-
* -
|
|
11
|
-
* - Custom timestamps for events
|
|
9
|
+
* - Routes with data extraction schemas and custom IDs
|
|
10
|
+
* - Session state management for multi-turn conversations
|
|
12
11
|
*/
|
|
13
12
|
|
|
14
13
|
import {
|
|
@@ -17,11 +16,11 @@ import {
|
|
|
17
16
|
createMessageEvent,
|
|
18
17
|
EventSource,
|
|
19
18
|
GeminiProvider,
|
|
19
|
+
createSession,
|
|
20
20
|
type Term,
|
|
21
21
|
type Guideline,
|
|
22
22
|
type Capability,
|
|
23
23
|
type RouteOptions,
|
|
24
|
-
type ObservationOptions,
|
|
25
24
|
} from "../src/index";
|
|
26
25
|
|
|
27
26
|
// Context type
|
|
@@ -30,6 +29,21 @@ interface HealthcareContext {
|
|
|
30
29
|
patientName: string;
|
|
31
30
|
}
|
|
32
31
|
|
|
32
|
+
// Data extraction types
|
|
33
|
+
interface AppointmentData {
|
|
34
|
+
appointmentType: "checkup" | "consultation" | "followup";
|
|
35
|
+
preferredDate: string;
|
|
36
|
+
preferredTime: string;
|
|
37
|
+
symptoms?: string;
|
|
38
|
+
urgency: "low" | "medium" | "high";
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
interface LabData {
|
|
42
|
+
testType: string;
|
|
43
|
+
testDate: string;
|
|
44
|
+
resultsNeeded: boolean;
|
|
45
|
+
}
|
|
46
|
+
|
|
33
47
|
// Define tools with custom IDs (optional - IDs are deterministic by default)
|
|
34
48
|
const getInsuranceProviders = defineTool<HealthcareContext, [], string[]>(
|
|
35
49
|
"get_insurance_providers",
|
|
@@ -69,7 +83,18 @@ const getLabResults = defineTool<
|
|
|
69
83
|
{ report: string; status: string }
|
|
70
84
|
>(
|
|
71
85
|
"get_lab_results",
|
|
72
|
-
async ({ context }) => {
|
|
86
|
+
async ({ context, extracted }) => {
|
|
87
|
+
// Tools can now access extracted data
|
|
88
|
+
const labData = extracted as Partial<LabData>;
|
|
89
|
+
if (labData?.testType) {
|
|
90
|
+
return {
|
|
91
|
+
data: {
|
|
92
|
+
report: `${labData.testType} results for ${context.patientName}`,
|
|
93
|
+
status: "All values within normal range",
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
|
|
73
98
|
return {
|
|
74
99
|
data: {
|
|
75
100
|
report: `Lab results for ${context.patientName}`,
|
|
@@ -83,6 +108,31 @@ const getLabResults = defineTool<
|
|
|
83
108
|
}
|
|
84
109
|
);
|
|
85
110
|
|
|
111
|
+
const scheduleAppointment = defineTool<
|
|
112
|
+
HealthcareContext,
|
|
113
|
+
[],
|
|
114
|
+
{ confirmation: string }
|
|
115
|
+
>(
|
|
116
|
+
"schedule_appointment",
|
|
117
|
+
async ({ context, extracted }) => {
|
|
118
|
+
// Tools can access extracted appointment data
|
|
119
|
+
const appointment = extracted as Partial<AppointmentData>;
|
|
120
|
+
if (!appointment?.preferredDate || !appointment?.preferredTime) {
|
|
121
|
+
return { data: { confirmation: "Please provide appointment details" } };
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
return {
|
|
125
|
+
data: {
|
|
126
|
+
confirmation: `Appointment scheduled for ${appointment.preferredDate} at ${appointment.preferredTime}`,
|
|
127
|
+
},
|
|
128
|
+
};
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
id: "healthcare_schedule_appointment",
|
|
132
|
+
description: "Schedules patient appointments",
|
|
133
|
+
}
|
|
134
|
+
);
|
|
135
|
+
|
|
86
136
|
// Declarative configuration
|
|
87
137
|
const terms: Term[] = [
|
|
88
138
|
{
|
|
@@ -140,6 +190,34 @@ const routes: RouteOptions[] = [
|
|
|
140
190
|
title: "Schedule Appointment",
|
|
141
191
|
description: "Helps the patient schedule an appointment",
|
|
142
192
|
conditions: ["The patient wants to schedule an appointment"],
|
|
193
|
+
gatherSchema: {
|
|
194
|
+
type: "object",
|
|
195
|
+
properties: {
|
|
196
|
+
appointmentType: {
|
|
197
|
+
type: "string",
|
|
198
|
+
enum: ["checkup", "consultation", "followup"],
|
|
199
|
+
description: "Type of appointment needed",
|
|
200
|
+
},
|
|
201
|
+
preferredDate: {
|
|
202
|
+
type: "string",
|
|
203
|
+
description: "Preferred appointment date",
|
|
204
|
+
},
|
|
205
|
+
preferredTime: {
|
|
206
|
+
type: "string",
|
|
207
|
+
description: "Preferred appointment time",
|
|
208
|
+
},
|
|
209
|
+
symptoms: {
|
|
210
|
+
type: "string",
|
|
211
|
+
description: "Description of symptoms (if applicable)",
|
|
212
|
+
},
|
|
213
|
+
urgency: {
|
|
214
|
+
type: "string",
|
|
215
|
+
enum: ["low", "medium", "high"],
|
|
216
|
+
default: "medium",
|
|
217
|
+
},
|
|
218
|
+
},
|
|
219
|
+
required: ["appointmentType", "preferredDate", "preferredTime"],
|
|
220
|
+
},
|
|
143
221
|
guidelines: [
|
|
144
222
|
{
|
|
145
223
|
condition: "The patient says their visit is urgent",
|
|
@@ -154,6 +232,25 @@ const routes: RouteOptions[] = [
|
|
|
154
232
|
title: "Check Lab Results",
|
|
155
233
|
description: "Retrieves and explains patient lab results",
|
|
156
234
|
conditions: ["The patient wants to see their lab results"],
|
|
235
|
+
gatherSchema: {
|
|
236
|
+
type: "object",
|
|
237
|
+
properties: {
|
|
238
|
+
testType: {
|
|
239
|
+
type: "string",
|
|
240
|
+
description: "Type of lab test",
|
|
241
|
+
},
|
|
242
|
+
testDate: {
|
|
243
|
+
type: "string",
|
|
244
|
+
description: "Date of the lab test",
|
|
245
|
+
},
|
|
246
|
+
resultsNeeded: {
|
|
247
|
+
type: "boolean",
|
|
248
|
+
default: true,
|
|
249
|
+
description: "Whether detailed results are needed",
|
|
250
|
+
},
|
|
251
|
+
},
|
|
252
|
+
required: ["testType"],
|
|
253
|
+
},
|
|
157
254
|
guidelines: [
|
|
158
255
|
{
|
|
159
256
|
condition: "The patient presses for more conclusions about results",
|
|
@@ -163,14 +260,11 @@ const routes: RouteOptions[] = [
|
|
|
163
260
|
},
|
|
164
261
|
],
|
|
165
262
|
},
|
|
166
|
-
];
|
|
167
|
-
|
|
168
|
-
const observations: ObservationOptions[] = [
|
|
169
263
|
{
|
|
170
|
-
|
|
171
|
-
description:
|
|
172
|
-
|
|
173
|
-
|
|
264
|
+
title: "General Healthcare Questions",
|
|
265
|
+
description: "Answer general healthcare questions",
|
|
266
|
+
conditions: ["Patient asks general healthcare questions"],
|
|
267
|
+
// No gatherSchema - stateless Q&A
|
|
174
268
|
},
|
|
175
269
|
];
|
|
176
270
|
|
|
@@ -192,7 +286,6 @@ const agent = new Agent<HealthcareContext>({
|
|
|
192
286
|
guidelines,
|
|
193
287
|
capabilities,
|
|
194
288
|
routes,
|
|
195
|
-
observations,
|
|
196
289
|
});
|
|
197
290
|
|
|
198
291
|
// You can still add more dynamically after construction
|
|
@@ -208,31 +301,55 @@ agent
|
|
|
208
301
|
synonyms: ["virtual visit", "video appointment"],
|
|
209
302
|
});
|
|
210
303
|
|
|
211
|
-
// Example usage
|
|
304
|
+
// Example usage with session state
|
|
212
305
|
async function main() {
|
|
306
|
+
// Initialize session state
|
|
307
|
+
let session = createSession<AppointmentData | LabData>();
|
|
308
|
+
|
|
213
309
|
// Create events with custom timestamps (useful for historical data)
|
|
214
310
|
const history = [
|
|
215
311
|
createMessageEvent(
|
|
216
312
|
EventSource.CUSTOMER,
|
|
217
313
|
"Alice",
|
|
218
|
-
"Hi, I need to follow up on my recent visit"
|
|
219
|
-
"2025-10-13T14:30:00Z" // Optional custom timestamp
|
|
314
|
+
"Hi, I need to follow up on my recent visit"
|
|
220
315
|
),
|
|
221
316
|
];
|
|
222
317
|
|
|
223
|
-
|
|
318
|
+
// Turn 1 - Agent responds and extracts intent
|
|
319
|
+
const response = await agent.respond({ history, session });
|
|
224
320
|
console.log("Agent:", response.message);
|
|
225
|
-
console.log("Route chosen:", response.
|
|
226
|
-
console.log("
|
|
321
|
+
console.log("Route chosen:", response.session?.currentRoute?.title);
|
|
322
|
+
console.log("Extracted data:", response.session?.extracted);
|
|
323
|
+
|
|
324
|
+
// Session state is updated with progress
|
|
325
|
+
session = response.session!;
|
|
227
326
|
|
|
228
|
-
//
|
|
229
|
-
|
|
327
|
+
// Turn 2 - Continue conversation with session state
|
|
328
|
+
if (response.session?.currentRoute?.title === "Schedule Appointment") {
|
|
329
|
+
const history2 = [
|
|
330
|
+
...history,
|
|
331
|
+
createMessageEvent(EventSource.AI_AGENT, "Bot", response.message),
|
|
332
|
+
createMessageEvent(
|
|
333
|
+
EventSource.CUSTOMER,
|
|
334
|
+
"Alice",
|
|
335
|
+
"I need a checkup next week"
|
|
336
|
+
),
|
|
337
|
+
];
|
|
338
|
+
|
|
339
|
+
const response2 = await agent.respond({ history: history2, session });
|
|
340
|
+
console.log("Agent:", response2.message);
|
|
341
|
+
console.log("Updated extracted:", response2.session?.extracted);
|
|
342
|
+
|
|
343
|
+
// Session tracks the appointment booking progress
|
|
344
|
+
console.log("Current state:", response2.session?.currentState?.id);
|
|
345
|
+
}
|
|
230
346
|
|
|
231
347
|
// Note: Custom IDs ensure consistency across server restarts
|
|
232
|
-
//
|
|
233
|
-
// -
|
|
234
|
-
// -
|
|
235
|
-
// -
|
|
348
|
+
// Session state enables:
|
|
349
|
+
// - Tracking conversation progress across turns
|
|
350
|
+
// - Extracting structured data throughout conversation
|
|
351
|
+
// - Always-on routing that respects user intent changes
|
|
352
|
+
// - State recovery for resuming conversations
|
|
236
353
|
}
|
|
237
354
|
|
|
238
355
|
// Uncomment to run:
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Domain Scoping Example
|
|
3
|
+
* Updated for v2 architecture with session state management
|
|
3
4
|
*
|
|
4
5
|
* This example demonstrates how to use domain scoping to restrict which tools
|
|
5
6
|
* can EXECUTE in different conversation routes for security and isolation.
|
|
@@ -11,7 +12,12 @@
|
|
|
11
12
|
* execute automatically when triggered by the state machine or guidelines.
|
|
12
13
|
*/
|
|
13
14
|
|
|
14
|
-
import {
|
|
15
|
+
import {
|
|
16
|
+
Agent,
|
|
17
|
+
createMessageEvent,
|
|
18
|
+
EventSource,
|
|
19
|
+
createSession,
|
|
20
|
+
} from "../src/index";
|
|
15
21
|
import { OpenRouterProvider } from "../src/providers";
|
|
16
22
|
|
|
17
23
|
// Initialize AI provider
|
|
@@ -138,11 +144,17 @@ async function demonstrateScoping() {
|
|
|
138
144
|
),
|
|
139
145
|
];
|
|
140
146
|
|
|
141
|
-
|
|
142
|
-
|
|
147
|
+
// Initialize session state for multi-turn conversation
|
|
148
|
+
let session = createSession();
|
|
149
|
+
|
|
150
|
+
const response1 = await agent.respond({ history: history1, session });
|
|
151
|
+
console.log(`Route chosen: ${response1.session?.currentRoute?.title}`);
|
|
143
152
|
console.log(`Available tools in this route: scraping only`);
|
|
144
153
|
console.log(`Response: ${response1.message}\n`);
|
|
145
154
|
|
|
155
|
+
// Update session with progress
|
|
156
|
+
session = response1.session!;
|
|
157
|
+
|
|
146
158
|
// Example 2: Schedule Meeting route - only calendar tools available
|
|
147
159
|
console.log("2️⃣ Example: User wants to schedule a meeting");
|
|
148
160
|
const history2 = [
|
|
@@ -153,11 +165,14 @@ async function demonstrateScoping() {
|
|
|
153
165
|
),
|
|
154
166
|
];
|
|
155
167
|
|
|
156
|
-
const response2 = await agent.respond({ history: history2 });
|
|
157
|
-
console.log(`Route chosen: ${response2.
|
|
168
|
+
const response2 = await agent.respond({ history: history2, session });
|
|
169
|
+
console.log(`Route chosen: ${response2.session?.currentRoute?.title}`);
|
|
158
170
|
console.log(`Available tools in this route: calendar only`);
|
|
159
171
|
console.log(`Response: ${response2.message}\n`);
|
|
160
172
|
|
|
173
|
+
// Update session again
|
|
174
|
+
session = response2.session!;
|
|
175
|
+
|
|
161
176
|
// Example 3: Customer Support route - NO tools available
|
|
162
177
|
console.log("3️⃣ Example: User has a general question");
|
|
163
178
|
const history3 = [
|
|
@@ -168,11 +183,14 @@ async function demonstrateScoping() {
|
|
|
168
183
|
),
|
|
169
184
|
];
|
|
170
185
|
|
|
171
|
-
const response3 = await agent.respond({ history: history3 });
|
|
172
|
-
console.log(`Route chosen: ${response3.
|
|
186
|
+
const response3 = await agent.respond({ history: history3, session });
|
|
187
|
+
console.log(`Route chosen: ${response3.session?.currentRoute?.title}`);
|
|
173
188
|
console.log(`Available tools in this route: none (conversation only)`);
|
|
174
189
|
console.log(`Response: ${response3.message}\n`);
|
|
175
190
|
|
|
191
|
+
// Update session again
|
|
192
|
+
session = response3.session!;
|
|
193
|
+
|
|
176
194
|
// Example 4: Admin Support route - ALL tools available (for demo purposes)
|
|
177
195
|
console.log("4️⃣ Example: Admin needs full access");
|
|
178
196
|
const history4 = [
|
|
@@ -183,30 +201,33 @@ async function demonstrateScoping() {
|
|
|
183
201
|
),
|
|
184
202
|
];
|
|
185
203
|
|
|
186
|
-
const response4 = await agent.respond({ history: history4 });
|
|
187
|
-
console.log(`Route chosen: ${response4.
|
|
204
|
+
const response4 = await agent.respond({ history: history4, session });
|
|
205
|
+
console.log(`Route chosen: ${response4.session?.currentRoute?.title}`);
|
|
188
206
|
console.log(`Available tools in this route: all domains`);
|
|
189
207
|
console.log(`Response: ${response4.message}\n`);
|
|
190
208
|
}
|
|
191
209
|
|
|
192
210
|
// Benefits demonstration
|
|
193
211
|
console.log(`
|
|
194
|
-
🔒 Security Benefits:
|
|
212
|
+
🔒 Security Benefits (V2 Architecture):
|
|
195
213
|
- Customer Support route cannot execute payment.processPayment()
|
|
196
214
|
- Data Collection route cannot execute calendar.scheduleEvent()
|
|
197
215
|
- Each route has minimum necessary tool permissions
|
|
198
216
|
- Prevents prompt injection attacks from calling sensitive tools
|
|
217
|
+
- Session state ensures domain scoping persists across turns
|
|
199
218
|
|
|
200
219
|
🎯 Isolation Benefits:
|
|
201
220
|
- Route execution is isolated - tools can't cross boundaries
|
|
202
221
|
- Checkout can't accidentally trigger admin operations
|
|
203
222
|
- Clear separation of concerns by capability
|
|
223
|
+
- Always-on routing maintains domain restrictions
|
|
204
224
|
|
|
205
225
|
📋 Clarity Benefits:
|
|
206
226
|
- Routes clearly document their capabilities
|
|
207
227
|
- Easy to audit what each route can execute
|
|
208
228
|
- Better debugging when tools are called
|
|
209
229
|
- Self-documenting security model
|
|
230
|
+
- Session state tracks domain-scoped conversations
|
|
210
231
|
`);
|
|
211
232
|
|
|
212
233
|
// Inspect route configurations
|