@falai/agent 0.8.1 → 0.9.0-alpha-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 +306 -133
- package/dist/{adapters → cjs/src/adapters}/MemoryAdapter.d.ts +4 -4
- package/dist/cjs/src/adapters/MemoryAdapter.d.ts.map +1 -0
- package/dist/cjs/{adapters → src/adapters}/MemoryAdapter.js +41 -21
- package/dist/cjs/src/adapters/MemoryAdapter.js.map +1 -0
- package/dist/{adapters → cjs/src/adapters}/MongoAdapter.d.ts +3 -3
- package/dist/cjs/src/adapters/MongoAdapter.d.ts.map +1 -0
- package/dist/cjs/{adapters → src/adapters}/MongoAdapter.js +2 -1
- package/dist/cjs/src/adapters/MongoAdapter.js.map +1 -0
- package/dist/cjs/{adapters → src/adapters}/OpenSearchAdapter.d.ts +3 -3
- package/dist/cjs/src/adapters/OpenSearchAdapter.d.ts.map +1 -0
- package/dist/cjs/{adapters → src/adapters}/OpenSearchAdapter.js +10 -13
- package/dist/cjs/src/adapters/OpenSearchAdapter.js.map +1 -0
- package/dist/cjs/{adapters → src/adapters}/PostgreSQLAdapter.d.ts +3 -3
- package/dist/cjs/src/adapters/PostgreSQLAdapter.d.ts.map +1 -0
- package/dist/cjs/{adapters → src/adapters}/PostgreSQLAdapter.js +1 -1
- package/dist/cjs/src/adapters/PostgreSQLAdapter.js.map +1 -0
- package/dist/cjs/{adapters → src/adapters}/PrismaAdapter.d.ts +3 -3
- package/dist/cjs/src/adapters/PrismaAdapter.d.ts.map +1 -0
- package/dist/cjs/{adapters → src/adapters}/PrismaAdapter.js +35 -5
- package/dist/cjs/src/adapters/PrismaAdapter.js.map +1 -0
- package/dist/cjs/{adapters → src/adapters}/RedisAdapter.d.ts +3 -3
- package/dist/cjs/src/adapters/RedisAdapter.d.ts.map +1 -0
- package/dist/cjs/{adapters → src/adapters}/RedisAdapter.js +3 -2
- package/dist/cjs/src/adapters/RedisAdapter.js.map +1 -0
- package/dist/{adapters → cjs/src/adapters}/SQLiteAdapter.d.ts +3 -3
- package/dist/cjs/src/adapters/SQLiteAdapter.d.ts.map +1 -0
- package/dist/cjs/{adapters → src/adapters}/SQLiteAdapter.js +2 -1
- package/dist/cjs/src/adapters/SQLiteAdapter.js.map +1 -0
- package/dist/cjs/src/adapters/index.d.ts.map +1 -0
- package/dist/cjs/src/adapters/index.js.map +1 -0
- package/dist/cjs/src/constants/index.d.ts.map +1 -0
- package/dist/cjs/src/constants/index.js.map +1 -0
- package/dist/{core → cjs/src/core}/Agent.d.ts +65 -67
- package/dist/cjs/src/core/Agent.d.ts.map +1 -0
- package/dist/cjs/src/core/Agent.js +1433 -0
- package/dist/cjs/src/core/Agent.js.map +1 -0
- package/dist/cjs/src/core/Events.d.ts +26 -0
- package/dist/cjs/src/core/Events.d.ts.map +1 -0
- package/dist/cjs/src/core/Events.js +144 -0
- package/dist/cjs/src/core/Events.js.map +1 -0
- package/dist/{core → cjs/src/core}/PersistenceManager.d.ts +21 -19
- package/dist/cjs/src/core/PersistenceManager.d.ts.map +1 -0
- package/dist/cjs/{core → src/core}/PersistenceManager.js +50 -20
- package/dist/cjs/src/core/PersistenceManager.js.map +1 -0
- package/dist/cjs/src/core/PromptComposer.d.ts +27 -0
- package/dist/cjs/src/core/PromptComposer.d.ts.map +1 -0
- package/dist/cjs/src/core/PromptComposer.js +157 -0
- package/dist/cjs/src/core/PromptComposer.js.map +1 -0
- package/dist/cjs/src/core/ResponseEngine.d.ts +31 -0
- package/dist/cjs/src/core/ResponseEngine.d.ts.map +1 -0
- package/dist/cjs/src/core/ResponseEngine.js +84 -0
- package/dist/cjs/src/core/ResponseEngine.js.map +1 -0
- package/dist/cjs/src/core/ResponsePipeline.d.ts +143 -0
- package/dist/cjs/src/core/ResponsePipeline.d.ts.map +1 -0
- package/dist/cjs/src/core/ResponsePipeline.js +446 -0
- package/dist/cjs/src/core/ResponsePipeline.js.map +1 -0
- package/dist/cjs/src/core/Route.d.ts +126 -0
- package/dist/cjs/src/core/Route.d.ts.map +1 -0
- package/dist/cjs/{core → src/core}/Route.js +116 -20
- package/dist/cjs/src/core/Route.js.map +1 -0
- package/dist/{core → cjs/src/core}/RoutingEngine.d.ts +33 -38
- package/dist/cjs/src/core/RoutingEngine.d.ts.map +1 -0
- package/dist/cjs/{core → src/core}/RoutingEngine.js +102 -108
- package/dist/cjs/src/core/RoutingEngine.js.map +1 -0
- package/dist/cjs/src/core/SessionManager.d.ts +76 -0
- package/dist/cjs/src/core/SessionManager.d.ts.map +1 -0
- package/dist/cjs/src/core/SessionManager.js +197 -0
- package/dist/cjs/src/core/SessionManager.js.map +1 -0
- package/dist/cjs/src/core/Step.d.ts +96 -0
- package/dist/cjs/src/core/Step.d.ts.map +1 -0
- package/dist/cjs/src/core/Step.js +206 -0
- package/dist/cjs/src/core/Step.js.map +1 -0
- package/dist/cjs/src/core/ToolExecutor.d.ts +43 -0
- package/dist/cjs/src/core/ToolExecutor.d.ts.map +1 -0
- package/dist/cjs/{core → src/core}/ToolExecutor.js +19 -18
- package/dist/cjs/src/core/ToolExecutor.js.map +1 -0
- package/dist/{index.d.ts → cjs/src/index.d.ts} +7 -15
- package/dist/cjs/src/index.d.ts.map +1 -0
- package/dist/cjs/{index.js → src/index.js} +21 -19
- package/dist/cjs/src/index.js.map +1 -0
- package/dist/cjs/{providers → src/providers}/AnthropicProvider.d.ts +1 -1
- package/dist/cjs/src/providers/AnthropicProvider.d.ts.map +1 -0
- package/dist/cjs/{providers → src/providers}/AnthropicProvider.js +54 -2
- package/dist/cjs/src/providers/AnthropicProvider.js.map +1 -0
- package/dist/{providers → cjs/src/providers}/GeminiProvider.d.ts +1 -1
- package/dist/cjs/src/providers/GeminiProvider.d.ts.map +1 -0
- package/dist/cjs/{providers → src/providers}/GeminiProvider.js +65 -0
- package/dist/cjs/src/providers/GeminiProvider.js.map +1 -0
- package/dist/cjs/{providers → src/providers}/OpenAIProvider.d.ts +1 -1
- package/dist/cjs/src/providers/OpenAIProvider.d.ts.map +1 -0
- package/dist/cjs/{providers → src/providers}/OpenAIProvider.js +70 -1
- package/dist/cjs/src/providers/OpenAIProvider.js.map +1 -0
- package/dist/{providers → cjs/src/providers}/OpenRouterProvider.d.ts +1 -1
- package/dist/cjs/src/providers/OpenRouterProvider.d.ts.map +1 -0
- package/dist/cjs/{providers → src/providers}/OpenRouterProvider.js +76 -0
- package/dist/cjs/src/providers/OpenRouterProvider.js.map +1 -0
- package/dist/cjs/src/providers/index.d.ts.map +1 -0
- package/dist/cjs/src/providers/index.js.map +1 -0
- package/dist/cjs/{types → src/types}/agent.d.ts +52 -33
- package/dist/cjs/src/types/agent.d.ts.map +1 -0
- package/dist/cjs/src/types/agent.js.map +1 -0
- package/dist/cjs/{types → src/types}/ai.d.ts +7 -0
- package/dist/cjs/src/types/ai.d.ts.map +1 -0
- package/dist/cjs/src/types/ai.js.map +1 -0
- package/dist/{types → cjs/src/types}/history.d.ts +76 -18
- package/dist/cjs/src/types/history.d.ts.map +1 -0
- package/dist/cjs/src/types/history.js +33 -0
- package/dist/cjs/src/types/history.js.map +1 -0
- package/dist/cjs/src/types/index.d.ts +20 -0
- package/dist/cjs/src/types/index.d.ts.map +1 -0
- package/dist/cjs/src/types/index.js +30 -0
- package/dist/cjs/src/types/index.js.map +1 -0
- package/dist/{types → cjs/src/types}/persistence.d.ts +39 -23
- package/dist/cjs/src/types/persistence.d.ts.map +1 -0
- package/dist/cjs/src/types/persistence.js.map +1 -0
- package/dist/cjs/{types → src/types}/route.d.ts +85 -31
- package/dist/cjs/src/types/route.d.ts.map +1 -0
- package/dist/cjs/{types → src/types}/route.js.map +1 -1
- package/dist/cjs/src/types/routing.d.ts.map +1 -0
- package/dist/{types → cjs/src/types}/routing.js.map +1 -1
- package/dist/cjs/src/types/schema.d.ts.map +1 -0
- package/dist/{types → cjs/src/types}/schema.js.map +1 -1
- package/dist/cjs/src/types/session.d.ts +70 -0
- package/dist/cjs/src/types/session.d.ts.map +1 -0
- package/dist/cjs/src/types/session.js +6 -0
- package/dist/cjs/src/types/session.js.map +1 -0
- package/dist/cjs/src/types/template.d.ts +30 -0
- package/dist/cjs/src/types/template.d.ts.map +1 -0
- package/dist/cjs/src/types/template.js +3 -0
- package/dist/cjs/src/types/template.js.map +1 -0
- package/dist/cjs/{types → src/types}/tool.d.ts +6 -8
- package/dist/cjs/src/types/tool.d.ts.map +1 -0
- package/dist/cjs/{types → src/types}/tool.js.map +1 -1
- package/dist/cjs/src/utils/clone.d.ts +8 -0
- package/dist/cjs/src/utils/clone.d.ts.map +1 -0
- package/dist/cjs/src/utils/clone.js +36 -0
- package/dist/cjs/src/utils/clone.js.map +1 -0
- package/dist/{utils → cjs/src/utils}/event.d.ts +1 -1
- package/dist/cjs/src/utils/event.d.ts.map +1 -0
- package/dist/cjs/{utils → src/utils}/event.js +2 -2
- package/dist/cjs/src/utils/event.js.map +1 -0
- package/dist/cjs/src/utils/history.d.ts +31 -0
- package/dist/cjs/src/utils/history.d.ts.map +1 -0
- package/dist/cjs/src/utils/history.js +128 -0
- package/dist/cjs/src/utils/history.js.map +1 -0
- package/dist/cjs/src/utils/id.d.ts.map +1 -0
- package/dist/cjs/src/utils/id.js.map +1 -0
- package/dist/cjs/src/utils/index.d.ts +13 -0
- package/dist/cjs/src/utils/index.d.ts.map +1 -0
- package/dist/cjs/src/utils/index.js +49 -0
- package/dist/cjs/src/utils/index.js.map +1 -0
- package/dist/cjs/src/utils/logger.d.ts.map +1 -0
- package/dist/cjs/src/utils/logger.js.map +1 -0
- package/dist/cjs/src/utils/retry.d.ts.map +1 -0
- package/dist/cjs/src/utils/retry.js.map +1 -0
- package/dist/cjs/src/utils/session.d.ts +51 -0
- package/dist/cjs/src/utils/session.d.ts.map +1 -0
- package/dist/cjs/{types → src/utils}/session.js +34 -11
- package/dist/cjs/src/utils/session.js.map +1 -0
- package/dist/cjs/src/utils/template.d.ts +107 -0
- package/dist/cjs/src/utils/template.d.ts.map +1 -0
- package/dist/cjs/src/utils/template.js +283 -0
- package/dist/cjs/src/utils/template.js.map +1 -0
- package/dist/{cjs → src}/adapters/MemoryAdapter.d.ts +4 -4
- package/dist/src/adapters/MemoryAdapter.d.ts.map +1 -0
- package/dist/{adapters → src/adapters}/MemoryAdapter.js +41 -21
- package/dist/src/adapters/MemoryAdapter.js.map +1 -0
- package/dist/{cjs → src}/adapters/MongoAdapter.d.ts +3 -3
- package/dist/src/adapters/MongoAdapter.d.ts.map +1 -0
- package/dist/{adapters → src/adapters}/MongoAdapter.js +2 -1
- package/dist/src/adapters/MongoAdapter.js.map +1 -0
- package/dist/{adapters → src/adapters}/OpenSearchAdapter.d.ts +3 -3
- package/dist/src/adapters/OpenSearchAdapter.d.ts.map +1 -0
- package/dist/{adapters → src/adapters}/OpenSearchAdapter.js +10 -13
- package/dist/src/adapters/OpenSearchAdapter.js.map +1 -0
- package/dist/{adapters → src/adapters}/PostgreSQLAdapter.d.ts +3 -3
- package/dist/src/adapters/PostgreSQLAdapter.d.ts.map +1 -0
- package/dist/{adapters → src/adapters}/PostgreSQLAdapter.js +1 -1
- package/dist/src/adapters/PostgreSQLAdapter.js.map +1 -0
- package/dist/{adapters → src/adapters}/PrismaAdapter.d.ts +3 -3
- package/dist/src/adapters/PrismaAdapter.d.ts.map +1 -0
- package/dist/{adapters → src/adapters}/PrismaAdapter.js +35 -5
- package/dist/src/adapters/PrismaAdapter.js.map +1 -0
- package/dist/{adapters → src/adapters}/RedisAdapter.d.ts +3 -3
- package/dist/src/adapters/RedisAdapter.d.ts.map +1 -0
- package/dist/{adapters → src/adapters}/RedisAdapter.js +3 -2
- package/dist/src/adapters/RedisAdapter.js.map +1 -0
- package/dist/{cjs → src}/adapters/SQLiteAdapter.d.ts +3 -3
- package/dist/src/adapters/SQLiteAdapter.d.ts.map +1 -0
- package/dist/{adapters → src/adapters}/SQLiteAdapter.js +2 -1
- package/dist/src/adapters/SQLiteAdapter.js.map +1 -0
- package/dist/src/adapters/index.js.map +1 -0
- package/dist/src/constants/index.js.map +1 -0
- package/dist/{cjs → src}/core/Agent.d.ts +65 -67
- package/dist/src/core/Agent.d.ts.map +1 -0
- package/dist/src/core/Agent.js +1429 -0
- package/dist/src/core/Agent.js.map +1 -0
- package/dist/src/core/Events.d.ts +26 -0
- package/dist/src/core/Events.d.ts.map +1 -0
- package/dist/src/core/Events.js +137 -0
- package/dist/src/core/Events.js.map +1 -0
- package/dist/{cjs → src}/core/PersistenceManager.d.ts +21 -19
- package/dist/src/core/PersistenceManager.d.ts.map +1 -0
- package/dist/{core → src/core}/PersistenceManager.js +47 -17
- package/dist/src/core/PersistenceManager.js.map +1 -0
- package/dist/src/core/PromptComposer.d.ts +27 -0
- package/dist/src/core/PromptComposer.d.ts.map +1 -0
- package/dist/src/core/PromptComposer.js +153 -0
- package/dist/src/core/PromptComposer.js.map +1 -0
- package/dist/src/core/ResponseEngine.d.ts +31 -0
- package/dist/src/core/ResponseEngine.d.ts.map +1 -0
- package/dist/src/core/ResponseEngine.js +80 -0
- package/dist/src/core/ResponseEngine.js.map +1 -0
- package/dist/src/core/ResponsePipeline.d.ts +143 -0
- package/dist/src/core/ResponsePipeline.d.ts.map +1 -0
- package/dist/src/core/ResponsePipeline.js +442 -0
- package/dist/src/core/ResponsePipeline.js.map +1 -0
- package/dist/src/core/Route.d.ts +126 -0
- package/dist/src/core/Route.d.ts.map +1 -0
- package/dist/{core → src/core}/Route.js +116 -20
- package/dist/src/core/Route.js.map +1 -0
- package/dist/{cjs → src}/core/RoutingEngine.d.ts +33 -38
- package/dist/src/core/RoutingEngine.d.ts.map +1 -0
- package/dist/{core → src/core}/RoutingEngine.js +98 -104
- package/dist/src/core/RoutingEngine.js.map +1 -0
- package/dist/src/core/SessionManager.d.ts +76 -0
- package/dist/src/core/SessionManager.d.ts.map +1 -0
- package/dist/src/core/SessionManager.js +193 -0
- package/dist/src/core/SessionManager.js.map +1 -0
- package/dist/src/core/Step.d.ts +96 -0
- package/dist/src/core/Step.d.ts.map +1 -0
- package/dist/src/core/Step.js +202 -0
- package/dist/src/core/Step.js.map +1 -0
- package/dist/src/core/ToolExecutor.d.ts +43 -0
- package/dist/src/core/ToolExecutor.d.ts.map +1 -0
- package/dist/src/core/ToolExecutor.js +70 -0
- package/dist/src/core/ToolExecutor.js.map +1 -0
- package/dist/{cjs → src}/index.d.ts +7 -15
- package/dist/src/index.d.ts.map +1 -0
- package/dist/{index.js → src/index.js} +6 -7
- package/dist/src/index.js.map +1 -0
- package/dist/{providers → src/providers}/AnthropicProvider.d.ts +1 -1
- package/dist/src/providers/AnthropicProvider.d.ts.map +1 -0
- package/dist/{providers → src/providers}/AnthropicProvider.js +54 -2
- package/dist/src/providers/AnthropicProvider.js.map +1 -0
- package/dist/{cjs → src}/providers/GeminiProvider.d.ts +1 -1
- package/dist/{cjs → src}/providers/GeminiProvider.d.ts.map +1 -1
- package/dist/{providers → src/providers}/GeminiProvider.js +65 -0
- package/dist/src/providers/GeminiProvider.js.map +1 -0
- package/dist/{providers → src/providers}/OpenAIProvider.d.ts +1 -1
- package/dist/{cjs → src}/providers/OpenAIProvider.d.ts.map +1 -1
- package/dist/{providers → src/providers}/OpenAIProvider.js +70 -1
- package/dist/src/providers/OpenAIProvider.js.map +1 -0
- package/dist/{cjs → src}/providers/OpenRouterProvider.d.ts +1 -1
- package/dist/{cjs → src}/providers/OpenRouterProvider.d.ts.map +1 -1
- package/dist/{providers → src/providers}/OpenRouterProvider.js +76 -0
- package/dist/src/providers/OpenRouterProvider.js.map +1 -0
- package/dist/src/providers/index.js.map +1 -0
- package/dist/{types → src/types}/agent.d.ts +52 -33
- package/dist/src/types/agent.d.ts.map +1 -0
- package/dist/src/types/agent.js.map +1 -0
- package/dist/{types → src/types}/ai.d.ts +7 -0
- package/dist/src/types/ai.d.ts.map +1 -0
- package/dist/{cjs → src}/types/ai.js.map +1 -1
- package/dist/{cjs → src}/types/history.d.ts +76 -18
- package/dist/src/types/history.d.ts.map +1 -0
- package/dist/src/types/history.js +30 -0
- package/dist/src/types/history.js.map +1 -0
- package/dist/src/types/index.d.ts +20 -0
- package/dist/src/types/index.d.ts.map +1 -0
- package/dist/src/types/index.js +10 -0
- package/dist/src/types/index.js.map +1 -0
- package/dist/{cjs → src}/types/persistence.d.ts +39 -23
- package/dist/src/types/persistence.d.ts.map +1 -0
- package/dist/src/types/persistence.js.map +1 -0
- package/dist/{types → src/types}/route.d.ts +85 -31
- package/dist/src/types/route.d.ts.map +1 -0
- package/dist/{types → src/types}/route.js.map +1 -1
- package/dist/src/types/session.d.ts +70 -0
- package/dist/src/types/session.d.ts.map +1 -0
- package/dist/src/types/session.js +5 -0
- package/dist/src/types/session.js.map +1 -0
- package/dist/src/types/template.d.ts +30 -0
- package/dist/src/types/template.d.ts.map +1 -0
- package/dist/src/types/template.js +2 -0
- package/dist/src/types/template.js.map +1 -0
- package/dist/{types → src/types}/tool.d.ts +6 -8
- package/dist/{cjs → src}/types/tool.d.ts.map +1 -1
- package/dist/{types → src/types}/tool.js.map +1 -1
- package/dist/src/utils/clone.d.ts +8 -0
- package/dist/src/utils/clone.d.ts.map +1 -0
- package/dist/src/utils/clone.js +33 -0
- package/dist/src/utils/clone.js.map +1 -0
- package/dist/{cjs → src}/utils/event.d.ts +1 -1
- package/dist/{cjs → src}/utils/event.d.ts.map +1 -1
- package/dist/{utils → src/utils}/event.js +1 -1
- package/dist/src/utils/event.js.map +1 -0
- package/dist/src/utils/history.d.ts +31 -0
- package/dist/src/utils/history.d.ts.map +1 -0
- package/dist/src/utils/history.js +121 -0
- package/dist/src/utils/history.js.map +1 -0
- package/dist/src/utils/id.js.map +1 -0
- package/dist/src/utils/index.d.ts +13 -0
- package/dist/src/utils/index.d.ts.map +1 -0
- package/dist/src/utils/index.js +19 -0
- package/dist/src/utils/index.js.map +1 -0
- package/dist/src/utils/logger.js.map +1 -0
- package/dist/src/utils/retry.js.map +1 -0
- package/dist/src/utils/session.d.ts +51 -0
- package/dist/src/utils/session.d.ts.map +1 -0
- package/dist/{types → src/utils}/session.js +32 -11
- package/dist/src/utils/session.js.map +1 -0
- package/dist/src/utils/template.d.ts +107 -0
- package/dist/src/utils/template.d.ts.map +1 -0
- package/dist/src/utils/template.js +276 -0
- package/dist/src/utils/template.js.map +1 -0
- package/docs/README.md +174 -68
- package/docs/{API_REFERENCE.md → api/README.md} +890 -251
- package/docs/api/overview.md +798 -0
- package/docs/core/agent/README.md +642 -0
- package/docs/{CONTEXT_MANAGEMENT.md → core/agent/context-management.md} +143 -94
- package/docs/{ARCHITECTURE.md → core/agent/session-management.md} +74 -59
- package/docs/core/ai-integration/prompt-composition.md +196 -0
- package/docs/core/ai-integration/providers.md +515 -0
- package/docs/core/ai-integration/response-processing.md +165 -0
- package/docs/core/conversation-flows/data-collection.md +545 -0
- package/docs/core/conversation-flows/route-dsl.md +479 -0
- package/docs/core/conversation-flows/routes.md +61 -0
- package/docs/core/conversation-flows/step-transitions.md +595 -0
- package/docs/core/conversation-flows/steps.md +130 -0
- package/docs/{ADAPTERS.md → core/persistence/adapters.md} +1 -1
- package/docs/core/persistence/session-storage.md +644 -0
- package/docs/core/routing/intelligent-routing.md +339 -0
- package/docs/core/tools/tool-definition.md +346 -0
- package/docs/core/tools/tool-execution.md +815 -0
- package/docs/core/tools/tool-scoping.md +628 -0
- package/docs/guides/getting-started/README.md +384 -0
- package/examples/{company-qna-agent.ts → advanced-patterns/knowledge-based-agent.ts} +104 -69
- package/examples/{persistent-onboarding.ts → advanced-patterns/persistent-onboarding.ts} +181 -103
- package/examples/{rules-prohibitions.ts → advanced-patterns/route-lifecycle-hooks.ts} +102 -82
- package/examples/{streaming-agent.ts → advanced-patterns/streaming-responses.ts} +90 -69
- package/examples/ai-providers/anthropic-integration.ts +377 -0
- package/examples/{openai-agent.ts → ai-providers/openai-integration.ts} +37 -43
- package/examples/{route-transitions.ts → conversation-flows/completion-transitions.ts} +112 -105
- package/examples/{declarative-agent.ts → core-concepts/basic-agent.ts} +175 -131
- package/examples/core-concepts/schema-driven-extraction.ts +301 -0
- package/examples/core-concepts/session-management.ts +394 -0
- package/examples/integrations/database-integration.ts +615 -0
- package/examples/{healthcare-agent.ts → integrations/healthcare-integration.ts} +204 -111
- package/examples/{opensearch-persistence.ts → integrations/search-integration.ts} +159 -128
- package/examples/integrations/server-session-management.ts +299 -0
- package/examples/persistence/custom-adapter.ts +529 -0
- package/examples/{prisma-persistence.ts → persistence/database-persistence.ts} +168 -241
- package/examples/persistence/memory-sessions.ts +506 -0
- package/examples/{prisma-schema.example.prisma → persistence/prisma-schema.example.prisma} +1 -1
- package/examples/{redis-persistence.ts → persistence/redis-persistence.ts} +152 -173
- package/examples/tools/basic-tools.ts +550 -0
- package/examples/{extracted-data-modification.ts → tools/data-enrichment-tools.ts} +82 -79
- package/package.json +14 -10
- package/src/adapters/MemoryAdapter.ts +74 -46
- package/src/adapters/MongoAdapter.ts +33 -24
- package/src/adapters/OpenSearchAdapter.ts +41 -37
- package/src/adapters/PostgreSQLAdapter.ts +35 -24
- package/src/adapters/PrismaAdapter.ts +69 -27
- package/src/adapters/RedisAdapter.ts +38 -26
- package/src/adapters/SQLiteAdapter.ts +32 -22
- package/src/core/Agent.ts +1093 -478
- package/src/core/Events.ts +100 -112
- package/src/core/PersistenceManager.ts +77 -47
- package/src/core/PromptComposer.ts +158 -85
- package/src/core/ResponseEngine.ts +118 -38
- package/src/core/ResponsePipeline.ts +715 -0
- package/src/core/Route.ts +168 -51
- package/src/core/RoutingEngine.ts +178 -209
- package/src/core/SessionManager.ts +241 -0
- package/src/core/Step.ts +149 -67
- package/src/core/ToolExecutor.ts +37 -42
- package/src/index.ts +31 -37
- package/src/providers/AnthropicProvider.ts +71 -5
- package/src/providers/GeminiProvider.ts +83 -2
- package/src/providers/OpenAIProvider.ts +95 -3
- package/src/providers/OpenRouterProvider.ts +102 -2
- package/src/types/agent.ts +48 -36
- package/src/types/ai.ts +7 -0
- package/src/types/history.ts +91 -18
- package/src/types/index.ts +43 -7
- package/src/types/persistence.ts +46 -28
- package/src/types/route.ts +104 -45
- package/src/types/session.ts +19 -213
- package/src/types/template.ts +36 -0
- package/src/types/tool.ts +9 -11
- package/src/utils/clone.ts +36 -0
- package/src/utils/event.ts +1 -1
- package/src/utils/history.ts +143 -0
- package/src/utils/index.ts +53 -0
- package/src/utils/session.ts +229 -0
- package/src/utils/template.ts +335 -0
- package/dist/adapters/MemoryAdapter.d.ts.map +0 -1
- package/dist/adapters/MemoryAdapter.js.map +0 -1
- package/dist/adapters/MongoAdapter.d.ts.map +0 -1
- package/dist/adapters/MongoAdapter.js.map +0 -1
- package/dist/adapters/OpenSearchAdapter.d.ts.map +0 -1
- package/dist/adapters/OpenSearchAdapter.js.map +0 -1
- package/dist/adapters/PostgreSQLAdapter.d.ts.map +0 -1
- package/dist/adapters/PostgreSQLAdapter.js.map +0 -1
- package/dist/adapters/PrismaAdapter.d.ts.map +0 -1
- package/dist/adapters/PrismaAdapter.js.map +0 -1
- package/dist/adapters/RedisAdapter.d.ts.map +0 -1
- package/dist/adapters/RedisAdapter.js.map +0 -1
- package/dist/adapters/SQLiteAdapter.d.ts.map +0 -1
- package/dist/adapters/SQLiteAdapter.js.map +0 -1
- package/dist/adapters/index.d.ts.map +0 -1
- package/dist/adapters/index.js.map +0 -1
- package/dist/cjs/adapters/MemoryAdapter.d.ts.map +0 -1
- package/dist/cjs/adapters/MemoryAdapter.js.map +0 -1
- package/dist/cjs/adapters/MongoAdapter.d.ts.map +0 -1
- package/dist/cjs/adapters/MongoAdapter.js.map +0 -1
- package/dist/cjs/adapters/OpenSearchAdapter.d.ts.map +0 -1
- package/dist/cjs/adapters/OpenSearchAdapter.js.map +0 -1
- package/dist/cjs/adapters/PostgreSQLAdapter.d.ts.map +0 -1
- package/dist/cjs/adapters/PostgreSQLAdapter.js.map +0 -1
- package/dist/cjs/adapters/PrismaAdapter.d.ts.map +0 -1
- package/dist/cjs/adapters/PrismaAdapter.js.map +0 -1
- package/dist/cjs/adapters/RedisAdapter.d.ts.map +0 -1
- package/dist/cjs/adapters/RedisAdapter.js.map +0 -1
- package/dist/cjs/adapters/SQLiteAdapter.d.ts.map +0 -1
- package/dist/cjs/adapters/SQLiteAdapter.js.map +0 -1
- package/dist/cjs/adapters/index.js.map +0 -1
- package/dist/cjs/constants/index.js.map +0 -1
- package/dist/cjs/core/Agent.d.ts.map +0 -1
- package/dist/cjs/core/Agent.js +0 -966
- package/dist/cjs/core/Agent.js.map +0 -1
- package/dist/cjs/core/DomainRegistry.d.ts +0 -36
- package/dist/cjs/core/DomainRegistry.d.ts.map +0 -1
- package/dist/cjs/core/DomainRegistry.js +0 -72
- package/dist/cjs/core/DomainRegistry.js.map +0 -1
- package/dist/cjs/core/Events.d.ts +0 -41
- package/dist/cjs/core/Events.d.ts.map +0 -1
- package/dist/cjs/core/Events.js +0 -99
- package/dist/cjs/core/Events.js.map +0 -1
- package/dist/cjs/core/PersistenceManager.d.ts.map +0 -1
- package/dist/cjs/core/PersistenceManager.js.map +0 -1
- package/dist/cjs/core/PromptComposer.d.ts +0 -24
- package/dist/cjs/core/PromptComposer.d.ts.map +0 -1
- package/dist/cjs/core/PromptComposer.js +0 -127
- package/dist/cjs/core/PromptComposer.js.map +0 -1
- package/dist/cjs/core/ResponseEngine.d.ts +0 -14
- package/dist/cjs/core/ResponseEngine.d.ts.map +0 -1
- package/dist/cjs/core/ResponseEngine.js +0 -56
- package/dist/cjs/core/ResponseEngine.js.map +0 -1
- package/dist/cjs/core/Route.d.ts +0 -90
- package/dist/cjs/core/Route.d.ts.map +0 -1
- package/dist/cjs/core/Route.js.map +0 -1
- package/dist/cjs/core/RoutingEngine.d.ts.map +0 -1
- package/dist/cjs/core/RoutingEngine.js.map +0 -1
- package/dist/cjs/core/Step.d.ts +0 -72
- package/dist/cjs/core/Step.d.ts.map +0 -1
- package/dist/cjs/core/Step.js +0 -150
- package/dist/cjs/core/Step.js.map +0 -1
- package/dist/cjs/core/Tool.d.ts +0 -39
- package/dist/cjs/core/Tool.d.ts.map +0 -1
- package/dist/cjs/core/Tool.js +0 -34
- package/dist/cjs/core/Tool.js.map +0 -1
- package/dist/cjs/core/ToolExecutor.d.ts +0 -29
- package/dist/cjs/core/ToolExecutor.d.ts.map +0 -1
- package/dist/cjs/core/ToolExecutor.js.map +0 -1
- package/dist/cjs/core/Transition.d.ts +0 -32
- package/dist/cjs/core/Transition.d.ts.map +0 -1
- package/dist/cjs/core/Transition.js +0 -89
- package/dist/cjs/core/Transition.js.map +0 -1
- package/dist/cjs/index.d.ts.map +0 -1
- package/dist/cjs/index.js.map +0 -1
- package/dist/cjs/providers/AnthropicProvider.d.ts.map +0 -1
- package/dist/cjs/providers/AnthropicProvider.js.map +0 -1
- package/dist/cjs/providers/GeminiProvider.js.map +0 -1
- package/dist/cjs/providers/OpenAIProvider.js.map +0 -1
- package/dist/cjs/providers/OpenRouterProvider.js.map +0 -1
- package/dist/cjs/providers/index.js.map +0 -1
- package/dist/cjs/types/agent.d.ts.map +0 -1
- package/dist/cjs/types/agent.js.map +0 -1
- package/dist/cjs/types/ai.d.ts.map +0 -1
- package/dist/cjs/types/history.d.ts.map +0 -1
- package/dist/cjs/types/history.js +0 -37
- package/dist/cjs/types/history.js.map +0 -1
- package/dist/cjs/types/index.d.ts +0 -12
- package/dist/cjs/types/index.d.ts.map +0 -1
- package/dist/cjs/types/index.js +0 -12
- package/dist/cjs/types/index.js.map +0 -1
- package/dist/cjs/types/persistence.d.ts.map +0 -1
- package/dist/cjs/types/persistence.js.map +0 -1
- package/dist/cjs/types/route.d.ts.map +0 -1
- package/dist/cjs/types/session.d.ts +0 -104
- package/dist/cjs/types/session.d.ts.map +0 -1
- package/dist/cjs/types/session.js.map +0 -1
- package/dist/cjs/utils/event.js.map +0 -1
- package/dist/cjs/utils/id.js.map +0 -1
- package/dist/cjs/utils/logger.js.map +0 -1
- package/dist/cjs/utils/retry.js.map +0 -1
- package/dist/constants/index.d.ts.map +0 -1
- package/dist/constants/index.js.map +0 -1
- package/dist/core/Agent.d.ts.map +0 -1
- package/dist/core/Agent.js +0 -962
- package/dist/core/Agent.js.map +0 -1
- package/dist/core/DomainRegistry.d.ts +0 -36
- package/dist/core/DomainRegistry.d.ts.map +0 -1
- package/dist/core/DomainRegistry.js +0 -68
- package/dist/core/DomainRegistry.js.map +0 -1
- package/dist/core/Events.d.ts +0 -41
- package/dist/core/Events.d.ts.map +0 -1
- package/dist/core/Events.js +0 -94
- package/dist/core/Events.js.map +0 -1
- package/dist/core/PersistenceManager.d.ts.map +0 -1
- package/dist/core/PersistenceManager.js.map +0 -1
- package/dist/core/PromptComposer.d.ts +0 -24
- package/dist/core/PromptComposer.d.ts.map +0 -1
- package/dist/core/PromptComposer.js +0 -123
- package/dist/core/PromptComposer.js.map +0 -1
- package/dist/core/ResponseEngine.d.ts +0 -14
- package/dist/core/ResponseEngine.d.ts.map +0 -1
- package/dist/core/ResponseEngine.js +0 -52
- package/dist/core/ResponseEngine.js.map +0 -1
- package/dist/core/Route.d.ts +0 -90
- package/dist/core/Route.d.ts.map +0 -1
- package/dist/core/Route.js.map +0 -1
- package/dist/core/RoutingEngine.d.ts.map +0 -1
- package/dist/core/RoutingEngine.js.map +0 -1
- package/dist/core/Step.d.ts +0 -72
- package/dist/core/Step.d.ts.map +0 -1
- package/dist/core/Step.js +0 -146
- package/dist/core/Step.js.map +0 -1
- package/dist/core/Tool.d.ts +0 -39
- package/dist/core/Tool.d.ts.map +0 -1
- package/dist/core/Tool.js +0 -31
- package/dist/core/Tool.js.map +0 -1
- package/dist/core/ToolExecutor.d.ts +0 -29
- package/dist/core/ToolExecutor.d.ts.map +0 -1
- package/dist/core/ToolExecutor.js +0 -69
- package/dist/core/ToolExecutor.js.map +0 -1
- package/dist/core/Transition.d.ts +0 -32
- package/dist/core/Transition.d.ts.map +0 -1
- package/dist/core/Transition.js +0 -85
- package/dist/core/Transition.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/providers/AnthropicProvider.d.ts.map +0 -1
- package/dist/providers/AnthropicProvider.js.map +0 -1
- package/dist/providers/GeminiProvider.d.ts.map +0 -1
- package/dist/providers/GeminiProvider.js.map +0 -1
- package/dist/providers/OpenAIProvider.d.ts.map +0 -1
- package/dist/providers/OpenAIProvider.js.map +0 -1
- package/dist/providers/OpenRouterProvider.d.ts.map +0 -1
- package/dist/providers/OpenRouterProvider.js.map +0 -1
- package/dist/providers/index.d.ts.map +0 -1
- package/dist/providers/index.js.map +0 -1
- package/dist/types/agent.d.ts.map +0 -1
- package/dist/types/agent.js.map +0 -1
- package/dist/types/ai.d.ts.map +0 -1
- package/dist/types/ai.js.map +0 -1
- package/dist/types/history.d.ts.map +0 -1
- package/dist/types/history.js +0 -34
- package/dist/types/history.js.map +0 -1
- package/dist/types/index.d.ts +0 -12
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -6
- package/dist/types/index.js.map +0 -1
- package/dist/types/persistence.d.ts.map +0 -1
- package/dist/types/persistence.js.map +0 -1
- package/dist/types/route.d.ts.map +0 -1
- package/dist/types/routing.d.ts.map +0 -1
- package/dist/types/schema.d.ts.map +0 -1
- package/dist/types/session.d.ts +0 -104
- package/dist/types/session.d.ts.map +0 -1
- package/dist/types/session.js.map +0 -1
- package/dist/types/tool.d.ts.map +0 -1
- package/dist/utils/event.d.ts.map +0 -1
- package/dist/utils/event.js.map +0 -1
- package/dist/utils/id.d.ts.map +0 -1
- package/dist/utils/id.js.map +0 -1
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/logger.js.map +0 -1
- package/dist/utils/retry.d.ts.map +0 -1
- package/dist/utils/retry.js.map +0 -1
- package/docs/AGENT.md +0 -535
- package/docs/DOCS.md +0 -263
- package/docs/DOMAINS.md +0 -735
- package/docs/EXAMPLES.md +0 -467
- package/docs/GETTING_STARTED.md +0 -424
- package/docs/PERSISTENCE.md +0 -815
- package/docs/PROVIDERS.md +0 -612
- package/docs/ROUTES.md +0 -1085
- package/docs/STEPS.md +0 -883
- package/examples/business-onboarding.ts +0 -791
- package/examples/custom-database-persistence.ts +0 -574
- package/examples/domain-scoping.ts +0 -366
- package/examples/travel-agent.ts +0 -584
- package/src/core/DomainRegistry.ts +0 -80
- package/src/core/Tool.ts +0 -112
- package/src/core/Transition.ts +0 -115
- /package/dist/{adapters → cjs/src/adapters}/index.d.ts +0 -0
- /package/dist/cjs/{adapters → src/adapters}/index.js +0 -0
- /package/dist/cjs/{constants → src/constants}/index.d.ts +0 -0
- /package/dist/cjs/{constants → src/constants}/index.js +0 -0
- /package/dist/cjs/{providers → src/providers}/index.d.ts +0 -0
- /package/dist/cjs/{providers → src/providers}/index.js +0 -0
- /package/dist/cjs/{types → src/types}/agent.js +0 -0
- /package/dist/cjs/{types → src/types}/ai.js +0 -0
- /package/dist/cjs/{types → src/types}/persistence.js +0 -0
- /package/dist/cjs/{types → src/types}/route.js +0 -0
- /package/dist/cjs/{types → src/types}/routing.d.ts +0 -0
- /package/dist/cjs/{types → src/types}/routing.js +0 -0
- /package/dist/cjs/{types → src/types}/schema.d.ts +0 -0
- /package/dist/cjs/{types → src/types}/schema.js +0 -0
- /package/dist/cjs/{types → src/types}/tool.js +0 -0
- /package/dist/cjs/{utils → src/utils}/id.d.ts +0 -0
- /package/dist/cjs/{utils → src/utils}/id.js +0 -0
- /package/dist/cjs/{utils → src/utils}/logger.d.ts +0 -0
- /package/dist/cjs/{utils → src/utils}/logger.js +0 -0
- /package/dist/cjs/{utils → src/utils}/retry.d.ts +0 -0
- /package/dist/cjs/{utils → src/utils}/retry.js +0 -0
- /package/dist/{cjs → src}/adapters/index.d.ts +0 -0
- /package/dist/{cjs → src}/adapters/index.d.ts.map +0 -0
- /package/dist/{adapters → src/adapters}/index.js +0 -0
- /package/dist/{constants → src/constants}/index.d.ts +0 -0
- /package/dist/{cjs → src}/constants/index.d.ts.map +0 -0
- /package/dist/{constants → src/constants}/index.js +0 -0
- /package/dist/{providers → src/providers}/index.d.ts +0 -0
- /package/dist/{cjs → src}/providers/index.d.ts.map +0 -0
- /package/dist/{providers → src/providers}/index.js +0 -0
- /package/dist/{types → src/types}/agent.js +0 -0
- /package/dist/{types → src/types}/ai.js +0 -0
- /package/dist/{types → src/types}/persistence.js +0 -0
- /package/dist/{types → src/types}/route.js +0 -0
- /package/dist/{types → src/types}/routing.d.ts +0 -0
- /package/dist/{cjs → src}/types/routing.d.ts.map +0 -0
- /package/dist/{types → src/types}/routing.js +0 -0
- /package/dist/{cjs → src}/types/routing.js.map +0 -0
- /package/dist/{types → src/types}/schema.d.ts +0 -0
- /package/dist/{cjs → src}/types/schema.d.ts.map +0 -0
- /package/dist/{types → src/types}/schema.js +0 -0
- /package/dist/{cjs → src}/types/schema.js.map +0 -0
- /package/dist/{types → src/types}/tool.js +0 -0
- /package/dist/{utils → src/utils}/id.d.ts +0 -0
- /package/dist/{cjs → src}/utils/id.d.ts.map +0 -0
- /package/dist/{utils → src/utils}/id.js +0 -0
- /package/dist/{utils → src/utils}/logger.d.ts +0 -0
- /package/dist/{cjs → src}/utils/logger.d.ts.map +0 -0
- /package/dist/{utils → src/utils}/logger.js +0 -0
- /package/dist/{utils → src/utils}/retry.d.ts +0 -0
- /package/dist/{cjs → src}/utils/retry.d.ts.map +0 -0
- /package/dist/{utils → src/utils}/retry.js +0 -0
- /package/docs/{PUBLISHING.md → guides/advanced-patterns/publishing.md} +0 -0
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
# Response Processing
|
|
2
|
+
|
|
3
|
+
@fali/agent processes AI responses to extract structured data, execute tools, and update conversation state according to schema definitions and routing logic.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
The `ResponseEngine` handles AI response processing, including:
|
|
8
|
+
|
|
9
|
+
- Schema-based data extraction
|
|
10
|
+
- Tool execution coordination
|
|
11
|
+
- Context and session updates
|
|
12
|
+
- Route progression logic
|
|
13
|
+
|
|
14
|
+
## Response Parsing
|
|
15
|
+
|
|
16
|
+
AI responses are parsed to extract:
|
|
17
|
+
|
|
18
|
+
1. **Natural Language Response** - The text to send to the user
|
|
19
|
+
2. **Structured Data** - JSON data matching collection schemas
|
|
20
|
+
3. **Tool Calls** - Instructions to execute tools
|
|
21
|
+
4. **Routing Decisions** - Route or step transitions
|
|
22
|
+
|
|
23
|
+
## Schema-Driven Extraction
|
|
24
|
+
|
|
25
|
+
When steps specify `collect` fields, the AI response is validated against JSON schemas:
|
|
26
|
+
|
|
27
|
+
```typescript
|
|
28
|
+
const step = route.initialStep.nextStep({
|
|
29
|
+
prompt: "What's your name and email?",
|
|
30
|
+
collect: ["name", "email"],
|
|
31
|
+
schema: {
|
|
32
|
+
type: "object",
|
|
33
|
+
properties: {
|
|
34
|
+
name: { type: "string" },
|
|
35
|
+
email: { type: "string", format: "email" },
|
|
36
|
+
},
|
|
37
|
+
required: ["name", "email"],
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
The AI receives instructions to return structured data alongside natural language responses.
|
|
43
|
+
|
|
44
|
+
## Tool Execution Pipeline
|
|
45
|
+
|
|
46
|
+
When tools are called, the response engine:
|
|
47
|
+
|
|
48
|
+
1. **Validates** tool parameters against schemas
|
|
49
|
+
2. **Executes** tools in the correct order
|
|
50
|
+
3. **Updates** context with tool results
|
|
51
|
+
4. **Merges** tool-returned data into session
|
|
52
|
+
5. **Continues** conversation with enriched context
|
|
53
|
+
|
|
54
|
+
```typescript
|
|
55
|
+
// Tool execution result
|
|
56
|
+
{
|
|
57
|
+
success: true,
|
|
58
|
+
result: {
|
|
59
|
+
data: "Flight search completed",
|
|
60
|
+
contextUpdate: { availableFlights: [...] },
|
|
61
|
+
dataUpdate: { searchPerformed: true }
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Data Validation
|
|
67
|
+
|
|
68
|
+
Extracted data is validated against route schemas:
|
|
69
|
+
|
|
70
|
+
- **Type checking** - Ensures correct data types
|
|
71
|
+
- **Required fields** - Validates mandatory data presence
|
|
72
|
+
- **Format validation** - Email, dates, custom formats
|
|
73
|
+
- **Business rules** - Custom validation logic
|
|
74
|
+
|
|
75
|
+
## Context Updates
|
|
76
|
+
|
|
77
|
+
Response processing updates multiple context layers:
|
|
78
|
+
|
|
79
|
+
### Session Data
|
|
80
|
+
|
|
81
|
+
```typescript
|
|
82
|
+
// Collected data merged into session
|
|
83
|
+
session.data = {
|
|
84
|
+
...session.data,
|
|
85
|
+
...extractedData,
|
|
86
|
+
...toolResults,
|
|
87
|
+
};
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### Route Context
|
|
91
|
+
|
|
92
|
+
```typescript
|
|
93
|
+
// Route-specific context updates
|
|
94
|
+
routeContext.lastActivity = new Date();
|
|
95
|
+
routeContext.stepCount += 1;
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### Agent Context
|
|
99
|
+
|
|
100
|
+
```typescript
|
|
101
|
+
// Global agent context
|
|
102
|
+
agentContext.totalInteractions += 1;
|
|
103
|
+
agentContext.lastResponseTime = Date.now();
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## Error Handling
|
|
107
|
+
|
|
108
|
+
Robust error handling for various failure scenarios:
|
|
109
|
+
|
|
110
|
+
- **Schema validation failures** - Graceful fallback to manual extraction
|
|
111
|
+
- **Tool execution errors** - Error recovery and user notification
|
|
112
|
+
- **Context update failures** - Rollback and logging
|
|
113
|
+
- **Routing errors** - Safe fallback to default behavior
|
|
114
|
+
|
|
115
|
+
## Streaming Response Processing
|
|
116
|
+
|
|
117
|
+
For streaming responses, processing happens incrementally:
|
|
118
|
+
|
|
119
|
+
```typescript
|
|
120
|
+
for await (const chunk of agent.respondStream({...})) {
|
|
121
|
+
if (chunk.delta) {
|
|
122
|
+
// Process partial response
|
|
123
|
+
processStreamingChunk(chunk);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
if (chunk.done) {
|
|
127
|
+
// Final processing
|
|
128
|
+
await finalizeResponse(chunk);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## Route Progression
|
|
134
|
+
|
|
135
|
+
Response processing determines next conversation steps:
|
|
136
|
+
|
|
137
|
+
- **Step completion** - Advances to next step in route
|
|
138
|
+
- **Route completion** - Handles `END_ROUTE` logic
|
|
139
|
+
- **Branching decisions** - Evaluates conditions for path selection
|
|
140
|
+
- **Transition triggers** - Initiates route-to-route transitions
|
|
141
|
+
|
|
142
|
+
## Performance Considerations
|
|
143
|
+
|
|
144
|
+
- **Efficient parsing** - Minimal overhead for response processing
|
|
145
|
+
- **Lazy validation** - Only validate when necessary
|
|
146
|
+
- **Caching** - Cache parsed schemas and validation rules
|
|
147
|
+
- **Async processing** - Non-blocking context updates
|
|
148
|
+
|
|
149
|
+
## Monitoring & Debugging
|
|
150
|
+
|
|
151
|
+
Built-in monitoring capabilities:
|
|
152
|
+
|
|
153
|
+
- **Response metrics** - Token usage, processing time
|
|
154
|
+
- **Error tracking** - Failed extractions, validation errors
|
|
155
|
+
- **Debug logging** - Detailed processing traces
|
|
156
|
+
- **Performance profiling** - Identify bottlenecks
|
|
157
|
+
|
|
158
|
+
## Best Practices
|
|
159
|
+
|
|
160
|
+
- Design schemas for reliable AI extraction
|
|
161
|
+
- Implement comprehensive error handling
|
|
162
|
+
- Monitor response quality and adjust prompts
|
|
163
|
+
- Use streaming for better user experience
|
|
164
|
+
- Leverage tool results for context enrichment
|
|
165
|
+
- Validate data at multiple levels (schema + business rules)
|
|
@@ -0,0 +1,545 @@
|
|
|
1
|
+
# Schema-Driven Data Collection
|
|
2
|
+
|
|
3
|
+
@falai/agent implements a powerful schema-first approach to data collection, enabling type-safe, structured information extraction from natural conversations. Unlike traditional form-filling, this system uses AI to naturally gather information while maintaining data integrity.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
The data collection system provides:
|
|
8
|
+
|
|
9
|
+
- **JSON Schema Contracts**: Define data structures upfront with validation
|
|
10
|
+
- **Type-Safe Extraction**: Automatic mapping from AI responses to typed data
|
|
11
|
+
- **Natural Conversations**: AI handles information gathering conversationally
|
|
12
|
+
- **Validation & Enrichment**: Lifecycle hooks for data processing
|
|
13
|
+
- **Session Persistence**: Data survives across conversation turns
|
|
14
|
+
|
|
15
|
+
## Schema Definition
|
|
16
|
+
|
|
17
|
+
### Basic Schema
|
|
18
|
+
|
|
19
|
+
```typescript
|
|
20
|
+
interface UserProfile {
|
|
21
|
+
name: string;
|
|
22
|
+
email: string;
|
|
23
|
+
age: number;
|
|
24
|
+
interests: string[];
|
|
25
|
+
preferences: {
|
|
26
|
+
notifications: boolean;
|
|
27
|
+
theme: "light" | "dark";
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const userProfileRoute = agent.createRoute<UserProfile>({
|
|
32
|
+
title: "User Profile Collection",
|
|
33
|
+
schema: {
|
|
34
|
+
type: "object",
|
|
35
|
+
properties: {
|
|
36
|
+
name: {
|
|
37
|
+
type: "string",
|
|
38
|
+
description: "The user's full name",
|
|
39
|
+
},
|
|
40
|
+
email: {
|
|
41
|
+
type: "string",
|
|
42
|
+
format: "email",
|
|
43
|
+
description: "Valid email address",
|
|
44
|
+
},
|
|
45
|
+
age: {
|
|
46
|
+
type: "number",
|
|
47
|
+
minimum: 13,
|
|
48
|
+
maximum: 120,
|
|
49
|
+
description: "Age in years",
|
|
50
|
+
},
|
|
51
|
+
interests: {
|
|
52
|
+
type: "array",
|
|
53
|
+
items: { type: "string" },
|
|
54
|
+
description: "List of user interests",
|
|
55
|
+
},
|
|
56
|
+
preferences: {
|
|
57
|
+
type: "object",
|
|
58
|
+
properties: {
|
|
59
|
+
notifications: { type: "boolean" },
|
|
60
|
+
theme: {
|
|
61
|
+
type: "string",
|
|
62
|
+
enum: ["light", "dark"],
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
required: ["name", "email"],
|
|
68
|
+
},
|
|
69
|
+
});
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### Advanced Schema Features
|
|
73
|
+
|
|
74
|
+
```typescript
|
|
75
|
+
const complexSchema = {
|
|
76
|
+
type: "object",
|
|
77
|
+
properties: {
|
|
78
|
+
// Basic types
|
|
79
|
+
name: { type: "string", minLength: 2, maxLength: 100 },
|
|
80
|
+
|
|
81
|
+
// Email validation
|
|
82
|
+
email: { type: "string", format: "email" },
|
|
83
|
+
|
|
84
|
+
// Number constraints
|
|
85
|
+
age: { type: "number", minimum: 0, maximum: 150 },
|
|
86
|
+
|
|
87
|
+
// Arrays with constraints
|
|
88
|
+
skills: {
|
|
89
|
+
type: "array",
|
|
90
|
+
items: { type: "string" },
|
|
91
|
+
minItems: 1,
|
|
92
|
+
maxItems: 10,
|
|
93
|
+
uniqueItems: true,
|
|
94
|
+
},
|
|
95
|
+
|
|
96
|
+
// Nested objects
|
|
97
|
+
address: {
|
|
98
|
+
type: "object",
|
|
99
|
+
properties: {
|
|
100
|
+
street: { type: "string" },
|
|
101
|
+
city: { type: "string" },
|
|
102
|
+
zipCode: { type: "string", pattern: "^\\d{5}(-\\d{4})?$" },
|
|
103
|
+
},
|
|
104
|
+
required: ["street", "city"],
|
|
105
|
+
},
|
|
106
|
+
|
|
107
|
+
// Enums
|
|
108
|
+
priority: {
|
|
109
|
+
type: "string",
|
|
110
|
+
enum: ["low", "medium", "high", "urgent"],
|
|
111
|
+
},
|
|
112
|
+
|
|
113
|
+
// Conditional schemas
|
|
114
|
+
contactMethod: { type: "string", enum: ["email", "phone", "sms"] },
|
|
115
|
+
},
|
|
116
|
+
|
|
117
|
+
// Cross-field validation
|
|
118
|
+
allOf: [
|
|
119
|
+
{
|
|
120
|
+
if: { properties: { contactMethod: { const: "phone" } } },
|
|
121
|
+
then: { required: ["phoneNumber"] },
|
|
122
|
+
},
|
|
123
|
+
],
|
|
124
|
+
|
|
125
|
+
required: ["name", "email"],
|
|
126
|
+
};
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
## Step-Level Data Collection
|
|
130
|
+
|
|
131
|
+
### Basic Collection
|
|
132
|
+
|
|
133
|
+
```typescript
|
|
134
|
+
const profileRoute = agent
|
|
135
|
+
.createRoute({
|
|
136
|
+
title: "Profile Collection",
|
|
137
|
+
schema: userProfileSchema,
|
|
138
|
+
initialStep: {
|
|
139
|
+
prompt:
|
|
140
|
+
"Hi! I'm collecting some information to personalize your experience. What's your name?",
|
|
141
|
+
collect: ["name"], // Maps to schema field
|
|
142
|
+
},
|
|
143
|
+
})
|
|
144
|
+
.nextStep({
|
|
145
|
+
prompt: "Thanks {{name}}! What's your email address?",
|
|
146
|
+
collect: ["email"],
|
|
147
|
+
requires: ["name"], // Must have name before collecting email
|
|
148
|
+
});
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Multi-Field Collection
|
|
152
|
+
|
|
153
|
+
```typescript
|
|
154
|
+
const comprehensiveStep = {
|
|
155
|
+
prompt: `
|
|
156
|
+
Now I'd like to learn more about you. Please share:
|
|
157
|
+
- Your age
|
|
158
|
+
- Your main interests (comma-separated)
|
|
159
|
+
- Whether you'd like email notifications (yes/no)
|
|
160
|
+
- Your preferred theme (light/dark)
|
|
161
|
+
`,
|
|
162
|
+
collect: [
|
|
163
|
+
"age", // Single field
|
|
164
|
+
"interests", // Array field
|
|
165
|
+
"preferences.notifications", // Nested field (dot notation)
|
|
166
|
+
"preferences.theme", // Another nested field
|
|
167
|
+
],
|
|
168
|
+
requires: ["name", "email"],
|
|
169
|
+
};
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### Conditional Collection
|
|
173
|
+
|
|
174
|
+
```typescript
|
|
175
|
+
const conditionalCollection = {
|
|
176
|
+
prompt: "Would you like to set up notifications? (yes/no)",
|
|
177
|
+
collect: ["preferences.notifications"],
|
|
178
|
+
skipIf: (data) => data.preferences?.notifications !== undefined,
|
|
179
|
+
requires: ["name", "email"],
|
|
180
|
+
};
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
## Data Validation & Processing
|
|
184
|
+
|
|
185
|
+
### Lifecycle Hooks
|
|
186
|
+
|
|
187
|
+
```typescript
|
|
188
|
+
const validatedRoute = agent.createRoute({
|
|
189
|
+
title: "Validated Collection",
|
|
190
|
+
|
|
191
|
+
// Agent-level data validation
|
|
192
|
+
hooks: {
|
|
193
|
+
onDataUpdate: (newData, previousData) => {
|
|
194
|
+
// Cross-field validation
|
|
195
|
+
if (newData.email && newData.confirmEmail) {
|
|
196
|
+
if (newData.email !== newData.confirmEmail) {
|
|
197
|
+
throw new Error("Email addresses don't match");
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// Data enrichment
|
|
202
|
+
if (newData.name && !newData.displayName) {
|
|
203
|
+
newData.displayName = newData.name.split(" ")[0]; // First name only
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
return newData;
|
|
207
|
+
},
|
|
208
|
+
},
|
|
209
|
+
});
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
### Route-Level Hooks
|
|
213
|
+
|
|
214
|
+
```typescript
|
|
215
|
+
const routeWithHooks = agent.createRoute({
|
|
216
|
+
title: "Smart Collection",
|
|
217
|
+
|
|
218
|
+
hooks: {
|
|
219
|
+
onDataUpdate: async (newData, previousData) => {
|
|
220
|
+
// External validation
|
|
221
|
+
if (newData.email) {
|
|
222
|
+
const isValid = await validateEmailExternally(newData.email);
|
|
223
|
+
if (!isValid) {
|
|
224
|
+
throw new Error("Email validation failed");
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
// Data transformation
|
|
229
|
+
if (newData.interests && typeof newData.interests === "string") {
|
|
230
|
+
newData.interests = newData.interests.split(",").map((s) => s.trim());
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
return newData;
|
|
234
|
+
},
|
|
235
|
+
|
|
236
|
+
onContextUpdate: (newContext, previousContext) => {
|
|
237
|
+
// React to context changes that affect data collection
|
|
238
|
+
console.log("Context updated, may affect data validation rules");
|
|
239
|
+
},
|
|
240
|
+
},
|
|
241
|
+
});
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
## Data Flow & Persistence
|
|
245
|
+
|
|
246
|
+
### Session Data Management
|
|
247
|
+
|
|
248
|
+
```typescript
|
|
249
|
+
// Data flows through the session
|
|
250
|
+
const session = {
|
|
251
|
+
data: {
|
|
252
|
+
name: "John Doe",
|
|
253
|
+
email: "john@example.com",
|
|
254
|
+
age: 30,
|
|
255
|
+
},
|
|
256
|
+
dataByRoute: {
|
|
257
|
+
"user-profile": {
|
|
258
|
+
name: "John Doe",
|
|
259
|
+
email: "john@example.com",
|
|
260
|
+
age: 30,
|
|
261
|
+
},
|
|
262
|
+
preferences: {
|
|
263
|
+
theme: "dark",
|
|
264
|
+
notifications: true,
|
|
265
|
+
},
|
|
266
|
+
},
|
|
267
|
+
};
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
### Initial Data
|
|
271
|
+
|
|
272
|
+
```typescript
|
|
273
|
+
const routeWithInitialData = agent.createRoute({
|
|
274
|
+
title: "Resume Collection",
|
|
275
|
+
schema: userProfileSchema,
|
|
276
|
+
|
|
277
|
+
// Pre-populate known data
|
|
278
|
+
initialData: {
|
|
279
|
+
name: "John Doe", // From authentication
|
|
280
|
+
email: "john@example.com", // From user profile
|
|
281
|
+
preferences: {
|
|
282
|
+
theme: "dark", // From user settings
|
|
283
|
+
},
|
|
284
|
+
},
|
|
285
|
+
|
|
286
|
+
initialStep: {
|
|
287
|
+
prompt:
|
|
288
|
+
"Welcome back {{name}}! Let's update your profile. How old are you?",
|
|
289
|
+
collect: ["age"],
|
|
290
|
+
skipIf: (data) => data.age !== undefined, // Skip if already known
|
|
291
|
+
},
|
|
292
|
+
});
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
### Cross-Route Data Sharing
|
|
296
|
+
|
|
297
|
+
```typescript
|
|
298
|
+
// Route 1: Basic profile
|
|
299
|
+
const profileRoute = agent.createRoute({
|
|
300
|
+
title: "Basic Profile",
|
|
301
|
+
schema: {
|
|
302
|
+
/* basic fields */
|
|
303
|
+
},
|
|
304
|
+
});
|
|
305
|
+
|
|
306
|
+
// Route 2: Extended profile (can access data from Route 1)
|
|
307
|
+
const extendedRoute = agent.createRoute({
|
|
308
|
+
title: "Extended Profile",
|
|
309
|
+
schema: {
|
|
310
|
+
/* extended fields */
|
|
311
|
+
},
|
|
312
|
+
initialData: (session) => ({
|
|
313
|
+
// Access data from previous route
|
|
314
|
+
...session.dataByRoute?.["basic-profile"],
|
|
315
|
+
}),
|
|
316
|
+
});
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
## AI Response Processing
|
|
320
|
+
|
|
321
|
+
### Structured Response Schema
|
|
322
|
+
|
|
323
|
+
The system automatically builds response schemas for AI:
|
|
324
|
+
|
|
325
|
+
```typescript
|
|
326
|
+
// For a step collecting ["name", "email"]
|
|
327
|
+
const responseSchema = {
|
|
328
|
+
type: "object",
|
|
329
|
+
properties: {
|
|
330
|
+
message: { type: "string" }, // Standard response field
|
|
331
|
+
name: {
|
|
332
|
+
/* from route schema */
|
|
333
|
+
},
|
|
334
|
+
email: {
|
|
335
|
+
/* from route schema */
|
|
336
|
+
},
|
|
337
|
+
},
|
|
338
|
+
required: ["message"],
|
|
339
|
+
};
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
### Tool Integration
|
|
343
|
+
|
|
344
|
+
Data collection works seamlessly with tools:
|
|
345
|
+
|
|
346
|
+
```typescript
|
|
347
|
+
const toolEnhancedStep = {
|
|
348
|
+
prompt: "What's your location? I'll help you find nearby services.",
|
|
349
|
+
collect: ["location"],
|
|
350
|
+
tools: ["geolocation-tool"], // Tools can enrich collected data
|
|
351
|
+
finalize: async (context, data) => {
|
|
352
|
+
if (data.location) {
|
|
353
|
+
// Use collected location data
|
|
354
|
+
const services = await findNearbyServices(data.location);
|
|
355
|
+
// Update context or trigger next steps
|
|
356
|
+
}
|
|
357
|
+
},
|
|
358
|
+
};
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
## Error Handling & Recovery
|
|
362
|
+
|
|
363
|
+
### Validation Errors
|
|
364
|
+
|
|
365
|
+
```typescript
|
|
366
|
+
const robustRoute = agent.createRoute({
|
|
367
|
+
title: "Robust Collection",
|
|
368
|
+
|
|
369
|
+
hooks: {
|
|
370
|
+
onDataUpdate: (newData, previousData) => {
|
|
371
|
+
// Handle validation gracefully
|
|
372
|
+
try {
|
|
373
|
+
validateUserData(newData);
|
|
374
|
+
return newData;
|
|
375
|
+
} catch (error) {
|
|
376
|
+
// Provide user-friendly error recovery
|
|
377
|
+
if (error.message.includes("email")) {
|
|
378
|
+
newData.emailError = "Please provide a valid email address";
|
|
379
|
+
}
|
|
380
|
+
return { ...previousData, ...newData };
|
|
381
|
+
}
|
|
382
|
+
},
|
|
383
|
+
},
|
|
384
|
+
});
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
### Recovery Steps
|
|
388
|
+
|
|
389
|
+
```typescript
|
|
390
|
+
const recoveryRoute = agent
|
|
391
|
+
.createRoute({
|
|
392
|
+
title: "Error Recovery",
|
|
393
|
+
|
|
394
|
+
initialStep: {
|
|
395
|
+
prompt:
|
|
396
|
+
"I noticed there was an issue with the information provided. Let's try again.",
|
|
397
|
+
collect: ["correctedData"],
|
|
398
|
+
when: "if there are validation errors in session data",
|
|
399
|
+
},
|
|
400
|
+
})
|
|
401
|
+
.nextStep({
|
|
402
|
+
prompt:
|
|
403
|
+
"Thanks for the correction. Here's what I now have: {{correctedData}}",
|
|
404
|
+
requires: ["correctedData"],
|
|
405
|
+
});
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
## Advanced Patterns
|
|
409
|
+
|
|
410
|
+
### Progressive Collection
|
|
411
|
+
|
|
412
|
+
```typescript
|
|
413
|
+
const progressiveRoute = agent
|
|
414
|
+
.createRoute({
|
|
415
|
+
title: "Progressive Collection",
|
|
416
|
+
|
|
417
|
+
// Start with minimal required data
|
|
418
|
+
initialStep: {
|
|
419
|
+
prompt: "Let's get started! What's your name and email?",
|
|
420
|
+
collect: ["name", "email"],
|
|
421
|
+
},
|
|
422
|
+
|
|
423
|
+
// Add more fields as conversation progresses
|
|
424
|
+
})
|
|
425
|
+
.nextStep({
|
|
426
|
+
prompt: "Great! Now tell me about your interests and preferences.",
|
|
427
|
+
collect: ["interests", "preferences"],
|
|
428
|
+
requires: ["name", "email"],
|
|
429
|
+
skipIf: (data) => data.interests && data.preferences, // Skip if already have both
|
|
430
|
+
});
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
### Conditional Schema Expansion
|
|
434
|
+
|
|
435
|
+
```typescript
|
|
436
|
+
const dynamicRoute = agent
|
|
437
|
+
.createRoute({
|
|
438
|
+
title: "Dynamic Collection",
|
|
439
|
+
|
|
440
|
+
initialStep: {
|
|
441
|
+
prompt: "Are you a business user or individual?",
|
|
442
|
+
collect: ["userType"],
|
|
443
|
+
},
|
|
444
|
+
})
|
|
445
|
+
.branch([
|
|
446
|
+
{
|
|
447
|
+
name: "business",
|
|
448
|
+
step: {
|
|
449
|
+
prompt: "For business users, I need company information...",
|
|
450
|
+
collect: ["companyName", "industry", "companySize"],
|
|
451
|
+
requires: ["userType"],
|
|
452
|
+
},
|
|
453
|
+
},
|
|
454
|
+
{
|
|
455
|
+
name: "individual",
|
|
456
|
+
step: {
|
|
457
|
+
prompt: "For individual users, tell me about your interests...",
|
|
458
|
+
collect: ["personalInterests", "occupation"],
|
|
459
|
+
requires: ["userType"],
|
|
460
|
+
},
|
|
461
|
+
},
|
|
462
|
+
]);
|
|
463
|
+
```
|
|
464
|
+
|
|
465
|
+
## Best Practices
|
|
466
|
+
|
|
467
|
+
### Schema Design
|
|
468
|
+
|
|
469
|
+
1. **Start Simple**: Begin with required fields only
|
|
470
|
+
2. **Progressive Enhancement**: Add optional fields as needed
|
|
471
|
+
3. **Clear Descriptions**: Document field purposes in schema
|
|
472
|
+
4. **Validation Rules**: Use JSON Schema constraints effectively
|
|
473
|
+
|
|
474
|
+
### Collection Strategy
|
|
475
|
+
|
|
476
|
+
1. **Logical Order**: Collect prerequisite data first
|
|
477
|
+
2. **Smart Skipping**: Skip already-known information
|
|
478
|
+
3. **Natural Flow**: Make conversations feel organic
|
|
479
|
+
4. **Error Recovery**: Plan for validation failures
|
|
480
|
+
|
|
481
|
+
### Performance
|
|
482
|
+
|
|
483
|
+
1. **Minimal Schemas**: Only define needed fields
|
|
484
|
+
2. **Efficient Hooks**: Avoid expensive operations in data hooks
|
|
485
|
+
3. **Caching**: Cache external validation results
|
|
486
|
+
4. **Batch Updates**: Group related field collections
|
|
487
|
+
|
|
488
|
+
### Testing
|
|
489
|
+
|
|
490
|
+
```typescript
|
|
491
|
+
// Test data collection
|
|
492
|
+
const mockSession = createSession();
|
|
493
|
+
const testData = {
|
|
494
|
+
name: "Test User",
|
|
495
|
+
email: "test@example.com",
|
|
496
|
+
};
|
|
497
|
+
|
|
498
|
+
// Simulate collection
|
|
499
|
+
const updatedSession = mergeCollected(mockSession, testData);
|
|
500
|
+
|
|
501
|
+
// Validate against schema
|
|
502
|
+
const isValid = validateAgainstSchema(testData, route.schema);
|
|
503
|
+
```
|
|
504
|
+
|
|
505
|
+
## Integration Examples
|
|
506
|
+
|
|
507
|
+
### Database Persistence
|
|
508
|
+
|
|
509
|
+
```typescript
|
|
510
|
+
const dbRoute = agent.createRoute({
|
|
511
|
+
title: "Database-Backed Collection",
|
|
512
|
+
|
|
513
|
+
hooks: {
|
|
514
|
+
onDataUpdate: async (newData, previousData) => {
|
|
515
|
+
// Auto-save to database
|
|
516
|
+
if (newData.email && newData.email !== previousData.email) {
|
|
517
|
+
await saveEmailToDatabase(newData.email);
|
|
518
|
+
}
|
|
519
|
+
return newData;
|
|
520
|
+
},
|
|
521
|
+
},
|
|
522
|
+
});
|
|
523
|
+
```
|
|
524
|
+
|
|
525
|
+
### External API Integration
|
|
526
|
+
|
|
527
|
+
```typescript
|
|
528
|
+
const apiRoute = agent.createRoute({
|
|
529
|
+
title: "API-Enhanced Collection",
|
|
530
|
+
|
|
531
|
+
hooks: {
|
|
532
|
+
onDataUpdate: async (newData, previousData) => {
|
|
533
|
+
// Enrich data with external APIs
|
|
534
|
+
if (newData.zipCode && !newData.city) {
|
|
535
|
+
const locationData = await geocodeZipCode(newData.zipCode);
|
|
536
|
+
newData.city = locationData.city;
|
|
537
|
+
newData.state = locationData.state;
|
|
538
|
+
}
|
|
539
|
+
return newData;
|
|
540
|
+
},
|
|
541
|
+
},
|
|
542
|
+
});
|
|
543
|
+
```
|
|
544
|
+
|
|
545
|
+
The schema-driven data collection system transforms natural conversations into structured, validated data while maintaining the flexibility and intelligence of AI-driven interactions.
|