@falai/agent 0.8.0 → 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 +67 -69
- 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/cjs/src/core/PersistenceManager.d.ts +98 -0
- package/dist/cjs/src/core/PersistenceManager.d.ts.map +1 -0
- package/dist/cjs/{core → src/core}/PersistenceManager.js +62 -32
- 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 +54 -35
- 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 +36 -13
- 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 +67 -69
- 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/src/core/PersistenceManager.d.ts +98 -0
- package/dist/src/core/PersistenceManager.d.ts.map +1 -0
- package/dist/{core → src/core}/PersistenceManager.js +56 -26
- 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 +54 -35
- 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 +34 -13
- 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} +902 -263
- 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} +144 -95
- 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} +2 -2
- 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} +115 -108
- 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 +1102 -487
- package/src/core/Events.ts +100 -112
- package/src/core/PersistenceManager.ts +87 -57
- 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 +50 -38
- 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 +0 -96
- 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 +0 -96
- 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
package/docs/ROUTES.md
DELETED
|
@@ -1,1085 +0,0 @@
|
|
|
1
|
-
# Routes Guide
|
|
2
|
-
|
|
3
|
-
A complete guide to creating and managing conversational routes in `@falai/agent`.
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## Table of Contents
|
|
8
|
-
|
|
9
|
-
- [What is a Route?](#what-is-a-route)
|
|
10
|
-
- [Creating Routes](#creating-routes)
|
|
11
|
-
- [Initial Step Configuration](#initial-step-configuration)
|
|
12
|
-
- [End Step Configuration](#end-step-configuration)
|
|
13
|
-
- [Data Extraction](#data-extraction)
|
|
14
|
-
- [Sequential Steps](#sequential-steps)
|
|
15
|
-
- [Route Properties](#route-properties)
|
|
16
|
-
- [Route Security](#route-security)
|
|
17
|
-
- [Advanced Patterns](#advanced-patterns)
|
|
18
|
-
|
|
19
|
-
---
|
|
20
|
-
|
|
21
|
-
## What is a Route?
|
|
22
|
-
|
|
23
|
-
A **Route** (also called a "Journey") represents a specific conversational flow in your agent. Think of it as a step machine that guides the conversation through a series of steps to accomplish a specific goal.
|
|
24
|
-
|
|
25
|
-
```typescript
|
|
26
|
-
// Example: A route for booking flights
|
|
27
|
-
const bookingRoute = agent.createRoute<FlightData>({
|
|
28
|
-
title: "Book Flight",
|
|
29
|
-
description: "Help user book a flight",
|
|
30
|
-
conditions: ["User wants to book a flight"],
|
|
31
|
-
});
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
**Key Concepts:**
|
|
35
|
-
|
|
36
|
-
- Each route has a **goal** (e.g., "book a flight", "answer FAQ", "collect feedback")
|
|
37
|
-
- Routes contain **steps** that represent conversation steps
|
|
38
|
-
- Routes can extract and track **typed data** throughout the conversation
|
|
39
|
-
- Routes have their own **rules**, **prohibitions**, and **guidelines**
|
|
40
|
-
|
|
41
|
-
---
|
|
42
|
-
|
|
43
|
-
## Creating Routes
|
|
44
|
-
|
|
45
|
-
### Basic Route
|
|
46
|
-
|
|
47
|
-
```typescript
|
|
48
|
-
interface FlightData {
|
|
49
|
-
destination: string;
|
|
50
|
-
departureDate: string;
|
|
51
|
-
passengers: number;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
const bookingRoute = agent.createRoute<FlightData>({
|
|
55
|
-
title: "Book Flight",
|
|
56
|
-
description: "Help user book a flight",
|
|
57
|
-
conditions: [
|
|
58
|
-
"User wants to book a flight",
|
|
59
|
-
"User mentions flying or traveling",
|
|
60
|
-
],
|
|
61
|
-
});
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
### Route with Data Extraction Schema
|
|
65
|
-
|
|
66
|
-
```typescript
|
|
67
|
-
const bookingRoute = agent.createRoute<FlightData>({
|
|
68
|
-
title: "Book Flight",
|
|
69
|
-
description: "Help user book a flight",
|
|
70
|
-
conditions: ["User wants to book a flight"],
|
|
71
|
-
|
|
72
|
-
// Define what data to extract
|
|
73
|
-
schema: {
|
|
74
|
-
type: "object",
|
|
75
|
-
properties: {
|
|
76
|
-
destination: {
|
|
77
|
-
type: "string",
|
|
78
|
-
description: "Where the user wants to fly",
|
|
79
|
-
},
|
|
80
|
-
departureDate: {
|
|
81
|
-
type: "string",
|
|
82
|
-
description: "When they want to depart",
|
|
83
|
-
},
|
|
84
|
-
passengers: {
|
|
85
|
-
type: "number",
|
|
86
|
-
minimum: 1,
|
|
87
|
-
maximum: 9,
|
|
88
|
-
},
|
|
89
|
-
},
|
|
90
|
-
required: ["destination", "departureDate", "passengers"],
|
|
91
|
-
},
|
|
92
|
-
});
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
### Route with Rules and Prohibitions
|
|
96
|
-
|
|
97
|
-
```typescript
|
|
98
|
-
const paymentRoute = agent.createRoute({
|
|
99
|
-
title: "Process Payment",
|
|
100
|
-
conditions: ["User wants to make a payment"],
|
|
101
|
-
|
|
102
|
-
// Absolute rules the agent MUST follow
|
|
103
|
-
rules: [
|
|
104
|
-
"Always confirm the payment amount before processing",
|
|
105
|
-
"Verify payment method is supported",
|
|
106
|
-
"Provide a receipt after successful payment",
|
|
107
|
-
],
|
|
108
|
-
|
|
109
|
-
// Things the agent must NEVER do
|
|
110
|
-
prohibitions: [
|
|
111
|
-
"Never store credit card numbers",
|
|
112
|
-
"Never process payments without explicit confirmation",
|
|
113
|
-
"Never share payment details with third parties",
|
|
114
|
-
],
|
|
115
|
-
});
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
---
|
|
119
|
-
|
|
120
|
-
## Initial Step Configuration
|
|
121
|
-
|
|
122
|
-
Every route starts with an initial step. You can now configure it in two ways:
|
|
123
|
-
|
|
124
|
-
### Option 1: Configure at Route Creation
|
|
125
|
-
|
|
126
|
-
```typescript
|
|
127
|
-
const bookingRoute = agent.createRoute<FlightData>({
|
|
128
|
-
title: "Book Flight",
|
|
129
|
-
|
|
130
|
-
// Configure the initial step
|
|
131
|
-
initialStep: {
|
|
132
|
-
id: "welcome_step",
|
|
133
|
-
instructions:
|
|
134
|
-
"Welcome! I'll help you book a flight. Where would you like to go?",
|
|
135
|
-
collect: ["destination"],
|
|
136
|
-
skipIf: (data) => !!data.destination,
|
|
137
|
-
},
|
|
138
|
-
|
|
139
|
-
schema: {
|
|
140
|
-
// ... schema definition
|
|
141
|
-
},
|
|
142
|
-
});
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
### Option 2: Configure After Route Creation
|
|
146
|
-
|
|
147
|
-
```typescript
|
|
148
|
-
const bookingRoute = agent.createRoute<FlightData>({
|
|
149
|
-
title: "Book Flight",
|
|
150
|
-
// ... other options
|
|
151
|
-
});
|
|
152
|
-
|
|
153
|
-
// Configure initial step later
|
|
154
|
-
bookingRoute.initialStep.configure({
|
|
155
|
-
description: "Welcome! Let's book your flight",
|
|
156
|
-
collectFields: ["destination"],
|
|
157
|
-
skipIf: (data) => !!data.destination,
|
|
158
|
-
});
|
|
159
|
-
```
|
|
160
|
-
|
|
161
|
-
### Initial Step Options
|
|
162
|
-
|
|
163
|
-
```typescript
|
|
164
|
-
initialStep: {
|
|
165
|
-
// Custom ID for the initial step
|
|
166
|
-
id?: string;
|
|
167
|
-
|
|
168
|
-
// Description/prompt for the initial step
|
|
169
|
-
instructions?: string;
|
|
170
|
-
|
|
171
|
-
// Fields to extract in this step
|
|
172
|
-
collect?: string[];
|
|
173
|
-
|
|
174
|
-
// Skip this step if condition is met
|
|
175
|
-
skipIf?: (data: Partial<TData>) => boolean;
|
|
176
|
-
|
|
177
|
-
// Prerequisites that must be metw
|
|
178
|
-
requires?: string[];
|
|
179
|
-
}
|
|
180
|
-
```
|
|
181
|
-
|
|
182
|
-
---
|
|
183
|
-
|
|
184
|
-
## End Step Configuration
|
|
185
|
-
|
|
186
|
-
Every route ends when it reaches `END_ROUTE`. You can configure what happens at route completion:
|
|
187
|
-
|
|
188
|
-
### Configure End Step at Route Creation
|
|
189
|
-
|
|
190
|
-
```typescript
|
|
191
|
-
import { END_ROUTE } from "@falai/agent";
|
|
192
|
-
|
|
193
|
-
const bookingRoute = agent.createRoute<FlightData>({
|
|
194
|
-
title: "Book Flight",
|
|
195
|
-
|
|
196
|
-
// Configure what happens when route completes
|
|
197
|
-
endStep: {
|
|
198
|
-
// Custom completion message
|
|
199
|
-
instructions: "Confirm the booking details and thank the user warmly!",
|
|
200
|
-
|
|
201
|
-
// Optional: Execute final actions (like sending confirmation emails)
|
|
202
|
-
tool: sendConfirmationEmail,
|
|
203
|
-
|
|
204
|
-
// Optional: Collect final data before completing
|
|
205
|
-
collect: ["finalConfirmation"],
|
|
206
|
-
|
|
207
|
-
// Optional: Require certain data to be present
|
|
208
|
-
requires: ["destination", "departureDate"],
|
|
209
|
-
|
|
210
|
-
// Optional: Custom step ID
|
|
211
|
-
id: "booking_complete",
|
|
212
|
-
},
|
|
213
|
-
|
|
214
|
-
schema: {
|
|
215
|
-
// ... schema definition
|
|
216
|
-
},
|
|
217
|
-
});
|
|
218
|
-
|
|
219
|
-
// Then just transition to END_ROUTE
|
|
220
|
-
lastStep.nextStep({
|
|
221
|
-
step: END_ROUTE,
|
|
222
|
-
});
|
|
223
|
-
```
|
|
224
|
-
|
|
225
|
-
### Per-Transition Override
|
|
226
|
-
|
|
227
|
-
You can also override the endStep configuration for specific transitions:
|
|
228
|
-
|
|
229
|
-
```typescript
|
|
230
|
-
// Use route-level endStep
|
|
231
|
-
lastStep.nextStep({
|
|
232
|
-
step: END_ROUTE,
|
|
233
|
-
});
|
|
234
|
-
|
|
235
|
-
// OR override with custom instructions for this specific transition
|
|
236
|
-
lastStep.nextStep({
|
|
237
|
-
instructions: "Special completion message for this path!",
|
|
238
|
-
step: END_ROUTE,
|
|
239
|
-
});
|
|
240
|
-
```
|
|
241
|
-
|
|
242
|
-
### End Step Options
|
|
243
|
-
|
|
244
|
-
```typescript
|
|
245
|
-
endStep: {
|
|
246
|
-
// Completion message instruction (RECOMMENDED)
|
|
247
|
-
instructions?: string;
|
|
248
|
-
|
|
249
|
-
// Execute final tools/actions before completion
|
|
250
|
-
tool?: ToolRef;
|
|
251
|
-
|
|
252
|
-
// Collect final data at completion
|
|
253
|
-
collect?: string[];
|
|
254
|
-
|
|
255
|
-
// Require specific data to be present
|
|
256
|
-
requires?: string[];
|
|
257
|
-
|
|
258
|
-
// Custom step ID for debugging
|
|
259
|
-
id?: string;
|
|
260
|
-
}
|
|
261
|
-
```
|
|
262
|
-
|
|
263
|
-
### Default Behavior
|
|
264
|
-
|
|
265
|
-
If you don't configure `endStep`, a smart default is used:
|
|
266
|
-
|
|
267
|
-
```typescript
|
|
268
|
-
// Default endStep behavior:
|
|
269
|
-
{
|
|
270
|
-
instructions: "Summarize what was accomplished and confirm completion based on the conversation history and collected data";
|
|
271
|
-
}
|
|
272
|
-
```
|
|
273
|
-
|
|
274
|
-
### End Step with Tools
|
|
275
|
-
|
|
276
|
-
Execute final actions when route completes:
|
|
277
|
-
|
|
278
|
-
```typescript
|
|
279
|
-
import { defineTool, END_ROUTE } from "@falai/agent";
|
|
280
|
-
|
|
281
|
-
const sendConfirmation = defineTool("send_confirmation", async ({ data }) => {
|
|
282
|
-
await emailService.send({
|
|
283
|
-
to: data.email,
|
|
284
|
-
subject: "Booking Confirmed",
|
|
285
|
-
body: `Your flight to ${data.destination} is confirmed!`,
|
|
286
|
-
});
|
|
287
|
-
return { data: "Confirmation sent" };
|
|
288
|
-
});
|
|
289
|
-
|
|
290
|
-
const bookingRoute = agent.createRoute({
|
|
291
|
-
title: "Book Flight",
|
|
292
|
-
|
|
293
|
-
endStep: {
|
|
294
|
-
tool: sendConfirmation, // Executes when route completes
|
|
295
|
-
instructions: "Your booking is complete! Confirmation email sent.",
|
|
296
|
-
},
|
|
297
|
-
});
|
|
298
|
-
```
|
|
299
|
-
|
|
300
|
-
**Key Points:**
|
|
301
|
-
|
|
302
|
-
- ✅ `endStep` is configured once at the route level (DRY principle)
|
|
303
|
-
- ✅ Can be overridden per-transition if needed
|
|
304
|
-
- ✅ Supports full step capabilities: `instructions`, `tool`, `collect`, `requires`
|
|
305
|
-
- ✅ Falls back to smart default if not configured
|
|
306
|
-
|
|
307
|
-
---
|
|
308
|
-
|
|
309
|
-
## Data Extraction
|
|
310
|
-
|
|
311
|
-
### Defining Extraction Schema
|
|
312
|
-
|
|
313
|
-
The extraction schema defines what data your route will collect:
|
|
314
|
-
|
|
315
|
-
```typescript
|
|
316
|
-
const onboardingRoute = agent.createRoute<OnboardingData>({
|
|
317
|
-
title: "User Onboarding",
|
|
318
|
-
|
|
319
|
-
schema: {
|
|
320
|
-
type: "object",
|
|
321
|
-
properties: {
|
|
322
|
-
firstName: { type: "string" },
|
|
323
|
-
lastName: { type: "string" },
|
|
324
|
-
email: { type: "string", format: "email" },
|
|
325
|
-
company: { type: "string" },
|
|
326
|
-
role: {
|
|
327
|
-
type: "string",
|
|
328
|
-
enum: ["developer", "designer", "manager", "other"],
|
|
329
|
-
},
|
|
330
|
-
},
|
|
331
|
-
required: ["firstName", "lastName", "email"],
|
|
332
|
-
},
|
|
333
|
-
});
|
|
334
|
-
```
|
|
335
|
-
|
|
336
|
-
### Getting Collected data
|
|
337
|
-
|
|
338
|
-
```typescript
|
|
339
|
-
// Get collected data from the route
|
|
340
|
-
const data = bookingRoute.getData(session);
|
|
341
|
-
|
|
342
|
-
console.log(data);
|
|
343
|
-
// { destination: "Paris", departureDate: "2025-06-15", passengers: 2 }
|
|
344
|
-
|
|
345
|
-
// Only returns data if session is in this route
|
|
346
|
-
const otherRouteData = otherRoute.getData(session);
|
|
347
|
-
// {} - empty if session is in a different route
|
|
348
|
-
```
|
|
349
|
-
|
|
350
|
-
### Pre-populating Data
|
|
351
|
-
|
|
352
|
-
You can pre-populate data when entering a route:
|
|
353
|
-
|
|
354
|
-
```typescript
|
|
355
|
-
const bookingRoute = agent.createRoute<FlightData>({
|
|
356
|
-
title: "Book Flight",
|
|
357
|
-
|
|
358
|
-
// Pre-fill known information
|
|
359
|
-
initialData: {
|
|
360
|
-
destination: "Paris", // User mentioned this earlier
|
|
361
|
-
passengers: 1, // Default value
|
|
362
|
-
},
|
|
363
|
-
|
|
364
|
-
schema: {
|
|
365
|
-
// ... schema
|
|
366
|
-
},
|
|
367
|
-
});
|
|
368
|
-
|
|
369
|
-
// Steps with skipIf will automatically bypass if data exists
|
|
370
|
-
```
|
|
371
|
-
|
|
372
|
-
---
|
|
373
|
-
|
|
374
|
-
## Sequential Steps
|
|
375
|
-
|
|
376
|
-
For simple linear flows, use the `steps` option:
|
|
377
|
-
|
|
378
|
-
```typescript
|
|
379
|
-
const feedbackRoute = agent.createRoute({
|
|
380
|
-
title: "Collect Feedback",
|
|
381
|
-
|
|
382
|
-
steps: [
|
|
383
|
-
{
|
|
384
|
-
id: "ask_rating",
|
|
385
|
-
instructions: "How would you rate your experience? (1-5 stars)",
|
|
386
|
-
collect: ["rating"],
|
|
387
|
-
},
|
|
388
|
-
{
|
|
389
|
-
id: "ask_liked",
|
|
390
|
-
instructions: "What did you like most?",
|
|
391
|
-
collect: ["likedMost"],
|
|
392
|
-
},
|
|
393
|
-
{
|
|
394
|
-
id: "ask_improve",
|
|
395
|
-
instructions: "What could we improve?",
|
|
396
|
-
collect: ["improvements"],
|
|
397
|
-
},
|
|
398
|
-
{
|
|
399
|
-
id: "thank_you",
|
|
400
|
-
instructions: "Thank you for your feedback! 🙏",
|
|
401
|
-
},
|
|
402
|
-
],
|
|
403
|
-
});
|
|
404
|
-
|
|
405
|
-
// Automatically chains: initialStep → ask_rating → ask_liked → ask_improve → thank_you → END_ROUTE
|
|
406
|
-
```
|
|
407
|
-
|
|
408
|
-
**When to use steps vs manual chaining:**
|
|
409
|
-
|
|
410
|
-
- ✅ Use `steps` for: Linear flows, simple wizards, sequential data collection
|
|
411
|
-
- ✅ Use manual chaining for: Branching logic, conditional flows, complex step machines
|
|
412
|
-
|
|
413
|
-
---
|
|
414
|
-
|
|
415
|
-
## Route Properties
|
|
416
|
-
|
|
417
|
-
### Accessing Route Properties
|
|
418
|
-
|
|
419
|
-
```typescript
|
|
420
|
-
const route = agent.createRoute({ ... });
|
|
421
|
-
|
|
422
|
-
// Route identification
|
|
423
|
-
console.log(route.id); // "route_book_flight_abc123"
|
|
424
|
-
console.log(route.title); // "Book Flight"
|
|
425
|
-
console.log(route.description); // "Help user book a flight"
|
|
426
|
-
|
|
427
|
-
// Activation conditions
|
|
428
|
-
console.log(route.conditions); // ["User wants to book a flight"]
|
|
429
|
-
|
|
430
|
-
// Rules and guidelines
|
|
431
|
-
console.log(route.getRules()); // ["Always confirm...", ...]
|
|
432
|
-
console.log(route.getProhibitions()); // ["Never store...", ...]
|
|
433
|
-
console.log(route.getGuidelines()); // [{ condition: "...", action: "..." }]
|
|
434
|
-
|
|
435
|
-
// Domain restrictions
|
|
436
|
-
console.log(route.getDomains()); // ["payment", "booking"] or undefined
|
|
437
|
-
```
|
|
438
|
-
|
|
439
|
-
### Route Reference
|
|
440
|
-
|
|
441
|
-
```typescript
|
|
442
|
-
const routeRef = route.getRef();
|
|
443
|
-
console.log(routeRef); // { id: "route_book_flight_abc123" }
|
|
444
|
-
|
|
445
|
-
// Use reference to jump to specific routes
|
|
446
|
-
step.nextStep({ step: routeRef });
|
|
447
|
-
```
|
|
448
|
-
|
|
449
|
-
### Route Structure
|
|
450
|
-
|
|
451
|
-
```typescript
|
|
452
|
-
// Get all steps in the route
|
|
453
|
-
const steps = route.getAllSteps();
|
|
454
|
-
console.log(steps); // [Step, Step, Step, ...]
|
|
455
|
-
|
|
456
|
-
// Get specific step by ID
|
|
457
|
-
const step = route.getStep("ask_destination");
|
|
458
|
-
|
|
459
|
-
// Describe route structure
|
|
460
|
-
console.log(route.describe());
|
|
461
|
-
// Output:
|
|
462
|
-
// Route: Book Flight
|
|
463
|
-
// ID: route_book_flight_abc123
|
|
464
|
-
// Description: Help user book a flight
|
|
465
|
-
// Conditions: User wants to book a flight
|
|
466
|
-
//
|
|
467
|
-
// Steps:
|
|
468
|
-
// - initial_step: Initial step
|
|
469
|
-
// -> ask_destination
|
|
470
|
-
// - ask_destination: Ask where they want to fly
|
|
471
|
-
// -> ask_dates
|
|
472
|
-
// ...
|
|
473
|
-
```
|
|
474
|
-
|
|
475
|
-
---
|
|
476
|
-
|
|
477
|
-
## Route Security
|
|
478
|
-
|
|
479
|
-
### Domain Scoping
|
|
480
|
-
|
|
481
|
-
Restrict which tools/domains a route can access:
|
|
482
|
-
|
|
483
|
-
```typescript
|
|
484
|
-
// Define domains
|
|
485
|
-
agent.addDomain("payment", {
|
|
486
|
-
processPayment: async (amount: number) => {
|
|
487
|
-
/* ... */
|
|
488
|
-
},
|
|
489
|
-
refund: async (transactionId: string) => {
|
|
490
|
-
/* ... */
|
|
491
|
-
},
|
|
492
|
-
});
|
|
493
|
-
|
|
494
|
-
agent.addDomain("booking", {
|
|
495
|
-
searchFlights: async (dest: string) => {
|
|
496
|
-
/* ... */
|
|
497
|
-
},
|
|
498
|
-
createReservation: async (data: any) => {
|
|
499
|
-
/* ... */
|
|
500
|
-
},
|
|
501
|
-
});
|
|
502
|
-
|
|
503
|
-
agent.addDomain("database", {
|
|
504
|
-
saveUser: async (user: any) => {
|
|
505
|
-
/* ... */
|
|
506
|
-
},
|
|
507
|
-
deleteUser: async (userId: string) => {
|
|
508
|
-
/* ... */
|
|
509
|
-
},
|
|
510
|
-
});
|
|
511
|
-
|
|
512
|
-
// Payment route: only access payment tools
|
|
513
|
-
const paymentRoute = agent.createRoute({
|
|
514
|
-
title: "Process Payment",
|
|
515
|
-
domains: ["payment"], // ONLY payment domain
|
|
516
|
-
});
|
|
517
|
-
|
|
518
|
-
// Booking route: access booking AND payment
|
|
519
|
-
const bookingRoute = agent.createRoute({
|
|
520
|
-
title: "Book Flight",
|
|
521
|
-
domains: ["booking", "payment"], // Both domains
|
|
522
|
-
});
|
|
523
|
-
|
|
524
|
-
// Admin route: access everything
|
|
525
|
-
const adminRoute = agent.createRoute({
|
|
526
|
-
title: "Admin Actions",
|
|
527
|
-
// domains: undefined = all domains allowed
|
|
528
|
-
});
|
|
529
|
-
```
|
|
530
|
-
|
|
531
|
-
**Security Benefits:**
|
|
532
|
-
|
|
533
|
-
- ✅ Prevents accidental tool execution in wrong context
|
|
534
|
-
- ✅ Reduces attack surface for each route
|
|
535
|
-
- ✅ Makes permissions explicit and auditable
|
|
536
|
-
|
|
537
|
-
---
|
|
538
|
-
|
|
539
|
-
## Advanced Patterns
|
|
540
|
-
|
|
541
|
-
### Pattern 1: Branching Logic
|
|
542
|
-
|
|
543
|
-
```typescript
|
|
544
|
-
const supportRoute = agent.createRoute<SupportData>({
|
|
545
|
-
title: "Customer Support",
|
|
546
|
-
});
|
|
547
|
-
|
|
548
|
-
// Ask issue type
|
|
549
|
-
const askIssueType = supportRoute.initialStep.nextStep({
|
|
550
|
-
instructions: "What type of issue are you experiencing?",
|
|
551
|
-
collect: ["issueType"],
|
|
552
|
-
});
|
|
553
|
-
|
|
554
|
-
// Branch 1: Technical issues
|
|
555
|
-
const technicalFlow = askIssueType.nextStep({
|
|
556
|
-
instructions: "Let me help with your technical issue...",
|
|
557
|
-
condition: "Issue type is technical",
|
|
558
|
-
});
|
|
559
|
-
|
|
560
|
-
// Branch 2: Billing issues
|
|
561
|
-
const billingFlow = askIssueType.nextStep({
|
|
562
|
-
instructions: "Let me help with your billing issue...",
|
|
563
|
-
condition: "Issue type is billing",
|
|
564
|
-
});
|
|
565
|
-
|
|
566
|
-
// Branch 3: General inquiries
|
|
567
|
-
const generalFlow = askIssueType.nextStep({
|
|
568
|
-
instructions: "Let me help with your inquiry...",
|
|
569
|
-
condition: "Issue type is general",
|
|
570
|
-
});
|
|
571
|
-
```
|
|
572
|
-
|
|
573
|
-
### Pattern 2: Conditional Skip Steps
|
|
574
|
-
|
|
575
|
-
```typescript
|
|
576
|
-
const checkoutRoute = agent.createRoute<CheckoutData>({
|
|
577
|
-
title: "Checkout",
|
|
578
|
-
schema: {
|
|
579
|
-
properties: {
|
|
580
|
-
hasAccount: { type: "boolean" },
|
|
581
|
-
email: { type: "string" },
|
|
582
|
-
shippingAddress: { type: "object" },
|
|
583
|
-
billingAddress: { type: "object" },
|
|
584
|
-
},
|
|
585
|
-
},
|
|
586
|
-
});
|
|
587
|
-
|
|
588
|
-
// Skip login if user already has account
|
|
589
|
-
const login = checkoutRoute.initialStep.nextStep({
|
|
590
|
-
instructions: "Please log in or continue as guest",
|
|
591
|
-
collect: ["hasAccount", "email"],
|
|
592
|
-
skipIf: (data) => data.hasAccount === true,
|
|
593
|
-
});
|
|
594
|
-
|
|
595
|
-
// Skip billing address if same as shipping
|
|
596
|
-
const shippingAddress = login.nextStep({
|
|
597
|
-
instructions: "What's your shipping address?",
|
|
598
|
-
collect: ["shippingAddress"],
|
|
599
|
-
});
|
|
600
|
-
|
|
601
|
-
const billingAddress = shippingAddress.nextStep({
|
|
602
|
-
instructions: "Is your billing address the same as shipping?",
|
|
603
|
-
collect: ["billingAddress"],
|
|
604
|
-
skipIf: (data) => data.billingAddress !== undefined,
|
|
605
|
-
});
|
|
606
|
-
```
|
|
607
|
-
|
|
608
|
-
### Pattern 3: Route-Specific Guidelines
|
|
609
|
-
|
|
610
|
-
```typescript
|
|
611
|
-
const bookingRoute = agent.createRoute({
|
|
612
|
-
title: "Book Flight",
|
|
613
|
-
});
|
|
614
|
-
|
|
615
|
-
// Add guidelines specific to this route
|
|
616
|
-
bookingRoute.createGuideline({
|
|
617
|
-
condition: "User asks about cancellation policy",
|
|
618
|
-
action: "Explain that cancellations must be made 24 hours in advance",
|
|
619
|
-
tags: ["policy"],
|
|
620
|
-
});
|
|
621
|
-
|
|
622
|
-
bookingRoute.createGuideline({
|
|
623
|
-
condition: "User provides invalid date",
|
|
624
|
-
action: "Politely ask for a valid future date in YYYY-MM-DD format",
|
|
625
|
-
tags: ["validation"],
|
|
626
|
-
});
|
|
627
|
-
```
|
|
628
|
-
|
|
629
|
-
### Pattern 4: Tool Integration in Routes
|
|
630
|
-
|
|
631
|
-
```typescript
|
|
632
|
-
import { defineTool } from "@falai/agent";
|
|
633
|
-
|
|
634
|
-
const searchFlights = defineTool<MyContext, [], FlightResults>(
|
|
635
|
-
"search_flights",
|
|
636
|
-
async ({ context, data }) => {
|
|
637
|
-
const flights = await api.searchFlights({
|
|
638
|
-
destination: data.destination,
|
|
639
|
-
date: data.departureDate,
|
|
640
|
-
});
|
|
641
|
-
|
|
642
|
-
return {
|
|
643
|
-
data: flights,
|
|
644
|
-
contextUpdate: { availableFlights: flights },
|
|
645
|
-
};
|
|
646
|
-
}
|
|
647
|
-
);
|
|
648
|
-
|
|
649
|
-
const bookingRoute = agent.createRoute<FlightData>({
|
|
650
|
-
title: "Book Flight",
|
|
651
|
-
domains: ["booking"], // Ensure tool is in this domain
|
|
652
|
-
});
|
|
653
|
-
|
|
654
|
-
// Collect data
|
|
655
|
-
const collectDetails = bookingRoute.initialStep.nextStep({
|
|
656
|
-
instructions: "Where and when would you like to fly?",
|
|
657
|
-
collect: ["destination", "departureDate", "passengers"],
|
|
658
|
-
});
|
|
659
|
-
|
|
660
|
-
// Execute tool
|
|
661
|
-
const searchStep = collectDetails.nextStep({
|
|
662
|
-
tool: searchFlights,
|
|
663
|
-
requires: ["destination", "departureDate", "passengers"],
|
|
664
|
-
});
|
|
665
|
-
|
|
666
|
-
// Present results
|
|
667
|
-
const presentFlights = searchStep.nextStep({
|
|
668
|
-
instructions: "Here are available flights based on your search",
|
|
669
|
-
});
|
|
670
|
-
```
|
|
671
|
-
|
|
672
|
-
---
|
|
673
|
-
|
|
674
|
-
## Route Completion
|
|
675
|
-
|
|
676
|
-
When a route reaches its final step and transitions to `END_ROUTE`, the agent returns `isRouteComplete: true` to signal that all required data has been collected.
|
|
677
|
-
|
|
678
|
-
### Ending a Route
|
|
679
|
-
|
|
680
|
-
Use the `END_ROUTE` symbol to mark the end of a route:
|
|
681
|
-
|
|
682
|
-
```typescript
|
|
683
|
-
import { END_ROUTE } from "@falai/agent";
|
|
684
|
-
|
|
685
|
-
const onboardingRoute = agent.createRoute<OnboardingData>({
|
|
686
|
-
title: "User Onboarding",
|
|
687
|
-
schema: ONBOARDING_SCHEMA,
|
|
688
|
-
});
|
|
689
|
-
|
|
690
|
-
const askName = onboardingRoute.initialStep.nextStep({
|
|
691
|
-
instructions: "What's your name?",
|
|
692
|
-
collect: ["name"],
|
|
693
|
-
});
|
|
694
|
-
|
|
695
|
-
const askEmail = askName.nextStep({
|
|
696
|
-
instructions: "What's your email?",
|
|
697
|
-
collect: ["email"],
|
|
698
|
-
});
|
|
699
|
-
|
|
700
|
-
const thankYou = askEmail.nextStep({
|
|
701
|
-
instructions: "Thank you! Your profile is complete.",
|
|
702
|
-
});
|
|
703
|
-
|
|
704
|
-
// End the route
|
|
705
|
-
thankYou.nextStep({ step: END_ROUTE });
|
|
706
|
-
```
|
|
707
|
-
|
|
708
|
-
### Handling Completion
|
|
709
|
-
|
|
710
|
-
There are **two ways** to check if a route has completed:
|
|
711
|
-
|
|
712
|
-
#### Method 1: Using `isRouteComplete` (Recommended)
|
|
713
|
-
|
|
714
|
-
```typescript
|
|
715
|
-
const response = await agent.respond({
|
|
716
|
-
history,
|
|
717
|
-
session,
|
|
718
|
-
});
|
|
719
|
-
|
|
720
|
-
if (response.isRouteComplete) {
|
|
721
|
-
// ✅ Route is complete! All data has been collected
|
|
722
|
-
|
|
723
|
-
// Get the collected data
|
|
724
|
-
const data = agent.getData(response.session!);
|
|
725
|
-
console.log("Collected data:", data);
|
|
726
|
-
|
|
727
|
-
// Process the data
|
|
728
|
-
await saveToDatabase(data);
|
|
729
|
-
await sendConfirmationEmail(data.email);
|
|
730
|
-
|
|
731
|
-
// Show custom completion message
|
|
732
|
-
return "Thank you! Your information has been saved.";
|
|
733
|
-
} else {
|
|
734
|
-
// ⏳ Route still in progress
|
|
735
|
-
return response.message;
|
|
736
|
-
}
|
|
737
|
-
```
|
|
738
|
-
|
|
739
|
-
#### Method 2: Using `END_ROUTE_ID` Constant
|
|
740
|
-
|
|
741
|
-
For users who prefer a symbol-based pattern consistent with building routes:
|
|
742
|
-
|
|
743
|
-
```typescript
|
|
744
|
-
import { END_ROUTE_ID } from "@falai/agent";
|
|
745
|
-
|
|
746
|
-
const response = await agent.respond({
|
|
747
|
-
history,
|
|
748
|
-
session,
|
|
749
|
-
});
|
|
750
|
-
|
|
751
|
-
if (response.session?.currentStep?.id === END_ROUTE_ID) {
|
|
752
|
-
// ✅ Route completed - currentStep is now END_ROUTE
|
|
753
|
-
const data = agent.getData(response.session!);
|
|
754
|
-
await handleCompletion(data);
|
|
755
|
-
return "Complete!";
|
|
756
|
-
}
|
|
757
|
-
|
|
758
|
-
return response.message;
|
|
759
|
-
```
|
|
760
|
-
|
|
761
|
-
**Which method should you use?**
|
|
762
|
-
|
|
763
|
-
- ✅ **Use `isRouteComplete`** for simplicity and clarity
|
|
764
|
-
- ✅ **Use `END_ROUTE_ID`** if you want consistency with how you build routes (`END_ROUTE` symbol)
|
|
765
|
-
|
|
766
|
-
---
|
|
767
|
-
|
|
768
|
-
## Route Transitions with `onComplete`
|
|
769
|
-
|
|
770
|
-
**NEW:** You can now automatically transition to another route when a route completes using the `onComplete` option. This is perfect for chaining workflows like:
|
|
771
|
-
|
|
772
|
-
- 📋 Post-booking feedback collection
|
|
773
|
-
- 🎁 Upsell offers after purchase
|
|
774
|
-
- 📊 Satisfaction surveys after support
|
|
775
|
-
- ↩️ Error recovery flows
|
|
776
|
-
|
|
777
|
-
### Simple String Transition
|
|
778
|
-
|
|
779
|
-
The simplest form - just specify the target route ID or title:
|
|
780
|
-
|
|
781
|
-
```typescript
|
|
782
|
-
const bookingRoute = agent.createRoute<BookingData>({
|
|
783
|
-
title: "Book Hotel",
|
|
784
|
-
conditions: ["User wants to book a hotel"],
|
|
785
|
-
schema: BOOKING_SCHEMA,
|
|
786
|
-
// Automatically transition to feedback when booking completes
|
|
787
|
-
onComplete: "Collect Feedback",
|
|
788
|
-
});
|
|
789
|
-
|
|
790
|
-
const feedbackRoute = agent.createRoute<FeedbackData>({
|
|
791
|
-
title: "Collect Feedback",
|
|
792
|
-
conditions: ["Collect user feedback"],
|
|
793
|
-
schema: FEEDBACK_SCHEMA,
|
|
794
|
-
});
|
|
795
|
-
```
|
|
796
|
-
|
|
797
|
-
### With AI-Evaluated Condition
|
|
798
|
-
|
|
799
|
-
Add an optional condition that the AI evaluates to determine if transition should happen:
|
|
800
|
-
|
|
801
|
-
```typescript
|
|
802
|
-
const bookingRoute = agent.createRoute<BookingData>({
|
|
803
|
-
title: "Book Hotel",
|
|
804
|
-
schema: BOOKING_SCHEMA,
|
|
805
|
-
onComplete: {
|
|
806
|
-
nextStep: "Collect Feedback",
|
|
807
|
-
condition: "if booking was successful", // AI evaluates this
|
|
808
|
-
},
|
|
809
|
-
});
|
|
810
|
-
```
|
|
811
|
-
|
|
812
|
-
### Dynamic Function-Based Transition
|
|
813
|
-
|
|
814
|
-
Use a function for complex logic based on collected data or context:
|
|
815
|
-
|
|
816
|
-
```typescript
|
|
817
|
-
const bookingRoute = agent.createRoute<BookingData>({
|
|
818
|
-
title: "Book Hotel",
|
|
819
|
-
schema: BOOKING_SCHEMA,
|
|
820
|
-
// Function receives session and context
|
|
821
|
-
onComplete: (session, context) => {
|
|
822
|
-
// Conditional logic based on collected data
|
|
823
|
-
if (session.data?.guests && session.data.guests > 5) {
|
|
824
|
-
return "VIP Feedback"; // Large groups get VIP treatment
|
|
825
|
-
}
|
|
826
|
-
if (session.data?.bookingFailed) {
|
|
827
|
-
return "Error Recovery"; // Handle failures gracefully
|
|
828
|
-
}
|
|
829
|
-
return "Collect Feedback"; // Standard feedback flow
|
|
830
|
-
},
|
|
831
|
-
});
|
|
832
|
-
```
|
|
833
|
-
|
|
834
|
-
Function can also return a config object:
|
|
835
|
-
|
|
836
|
-
```typescript
|
|
837
|
-
onComplete: (session) => ({
|
|
838
|
-
nextStep: "Collect Feedback",
|
|
839
|
-
condition: session.data?.vip ? "if user is satisfied" : undefined,
|
|
840
|
-
});
|
|
841
|
-
```
|
|
842
|
-
|
|
843
|
-
### How It Works
|
|
844
|
-
|
|
845
|
-
1. **Route completes** → reaches `END_ROUTE`
|
|
846
|
-
2. **Agent evaluates** `onComplete` handler
|
|
847
|
-
3. **Sets pending transition** in session step
|
|
848
|
-
4. **Next `respond()` call** → automatically transitions to target route
|
|
849
|
-
5. **User sees seamless flow** → no interruption in conversation
|
|
850
|
-
|
|
851
|
-
```typescript
|
|
852
|
-
// User books hotel
|
|
853
|
-
const response1 = await agent.respond({ history, session });
|
|
854
|
-
console.log(response1.isRouteComplete); // true
|
|
855
|
-
console.log(response1.session?.pendingTransition); // { targetRouteId: "...", reason: "route_complete" }
|
|
856
|
-
|
|
857
|
-
// Next message automatically transitions to feedback route
|
|
858
|
-
history.push(createMessageEvent(EventSource.CUSTOMER, "User", "Yes!"));
|
|
859
|
-
const response2 = await agent.respond({ history, session: response1.session });
|
|
860
|
-
console.log(response2.session?.currentRoute?.title); // "Collect Feedback"
|
|
861
|
-
```
|
|
862
|
-
|
|
863
|
-
### Manual Transition Control
|
|
864
|
-
|
|
865
|
-
For more control, use `agent.nextStepRoute()` to manually set the transition:
|
|
866
|
-
|
|
867
|
-
```typescript
|
|
868
|
-
const response = await agent.respond({ history, session });
|
|
869
|
-
|
|
870
|
-
if (response.isRouteComplete && shouldCollectFeedback) {
|
|
871
|
-
// Manually trigger transition instead of onComplete
|
|
872
|
-
const updatedSession = agent.nextStepRoute(
|
|
873
|
-
"Collect Feedback",
|
|
874
|
-
response.session
|
|
875
|
-
);
|
|
876
|
-
|
|
877
|
-
// Next respond() will transition automatically
|
|
878
|
-
const nextResponse = await agent.respond({
|
|
879
|
-
history,
|
|
880
|
-
session: updatedSession,
|
|
881
|
-
});
|
|
882
|
-
}
|
|
883
|
-
```
|
|
884
|
-
|
|
885
|
-
### Complete Example
|
|
886
|
-
|
|
887
|
-
```typescript
|
|
888
|
-
interface BookingData {
|
|
889
|
-
hotelName: string;
|
|
890
|
-
date: string;
|
|
891
|
-
guests: number;
|
|
892
|
-
}
|
|
893
|
-
|
|
894
|
-
interface FeedbackData {
|
|
895
|
-
rating: number;
|
|
896
|
-
comments?: string;
|
|
897
|
-
}
|
|
898
|
-
|
|
899
|
-
// Booking route with automatic transition to feedback
|
|
900
|
-
const bookingRoute = agent.createRoute<BookingData>({
|
|
901
|
-
title: "Book Hotel",
|
|
902
|
-
conditions: ["User wants to book a hotel"],
|
|
903
|
-
schema: {
|
|
904
|
-
type: "object",
|
|
905
|
-
properties: {
|
|
906
|
-
hotelName: { type: "string" },
|
|
907
|
-
date: { type: "string" },
|
|
908
|
-
guests: { type: "number" },
|
|
909
|
-
},
|
|
910
|
-
required: ["hotelName", "date", "guests"],
|
|
911
|
-
},
|
|
912
|
-
onComplete: "Collect Feedback",
|
|
913
|
-
});
|
|
914
|
-
|
|
915
|
-
const askHotel = bookingRoute.initialStep.nextStep({
|
|
916
|
-
instructions: "Ask which hotel",
|
|
917
|
-
collect: ["hotelName"],
|
|
918
|
-
skipIf: (e) => !!e.hotelName,
|
|
919
|
-
});
|
|
920
|
-
|
|
921
|
-
const askDate = askHotel.nextStep({
|
|
922
|
-
instructions: "Ask for date",
|
|
923
|
-
collect: ["date"],
|
|
924
|
-
skipIf: (e) => !!e.date,
|
|
925
|
-
});
|
|
926
|
-
|
|
927
|
-
const askGuests = askDate.nextStep({
|
|
928
|
-
instructions: "Ask for guests",
|
|
929
|
-
collect: ["guests"],
|
|
930
|
-
skipIf: (e) => !!e.guests,
|
|
931
|
-
});
|
|
932
|
-
|
|
933
|
-
askGuests.nextStep({
|
|
934
|
-
instructions: "Confirm booking",
|
|
935
|
-
step: END_ROUTE,
|
|
936
|
-
});
|
|
937
|
-
|
|
938
|
-
// Feedback route
|
|
939
|
-
const feedbackRoute = agent.createRoute<FeedbackData>({
|
|
940
|
-
title: "Collect Feedback",
|
|
941
|
-
conditions: ["Collect user feedback"],
|
|
942
|
-
schema: {
|
|
943
|
-
type: "object",
|
|
944
|
-
properties: {
|
|
945
|
-
rating: { type: "number" },
|
|
946
|
-
comments: { type: "string" },
|
|
947
|
-
},
|
|
948
|
-
required: ["rating"],
|
|
949
|
-
},
|
|
950
|
-
});
|
|
951
|
-
|
|
952
|
-
const askRating = feedbackRoute.initialStep.nextStep({
|
|
953
|
-
instructions: "Ask for rating 1-5",
|
|
954
|
-
collect: ["rating"],
|
|
955
|
-
});
|
|
956
|
-
|
|
957
|
-
askRating.nextStep({
|
|
958
|
-
instructions: "Thank user",
|
|
959
|
-
step: END_ROUTE,
|
|
960
|
-
});
|
|
961
|
-
|
|
962
|
-
// Usage - seamless transition from booking to feedback
|
|
963
|
-
let session;
|
|
964
|
-
const response1 = await agent.respond({ history, session });
|
|
965
|
-
// Booking complete, pending transition set
|
|
966
|
-
|
|
967
|
-
history.push(createMessageEvent(EventSource.CUSTOMER, "User", "Yes!"));
|
|
968
|
-
const response2 = await agent.respond({ history, session: response1.session });
|
|
969
|
-
// Now in feedback route automatically
|
|
970
|
-
```
|
|
971
|
-
|
|
972
|
-
### Benefits
|
|
973
|
-
|
|
974
|
-
✅ **Seamless user experience** - No awkward pauses between flows
|
|
975
|
-
✅ **Predictable behavior** - Transitions defined at design time
|
|
976
|
-
✅ **Flexible** - Simple strings, conditions, or complex functions
|
|
977
|
-
✅ **Type-safe** - Full TypeScript inference for collected data
|
|
978
|
-
✅ **Non-breaking** - Existing routes without `onComplete` work as before
|
|
979
|
-
|
|
980
|
-
See [examples/route-transitions.ts](../examples/route-transitions.ts) for a complete working example.
|
|
981
|
-
|
|
982
|
-
### Immediate Completion
|
|
983
|
-
|
|
984
|
-
Routes can complete **immediately** if all steps are skipped due to `skipIf` conditions. This is useful when:
|
|
985
|
-
|
|
986
|
-
- Resuming a partially completed route
|
|
987
|
-
- Pre-filling data from an existing session
|
|
988
|
-
- User provides all information upfront
|
|
989
|
-
|
|
990
|
-
```typescript
|
|
991
|
-
const onboardingRoute = agent.createRoute<OnboardingData>({
|
|
992
|
-
title: "User Onboarding",
|
|
993
|
-
schema: ONBOARDING_SCHEMA,
|
|
994
|
-
initialData: existingUserData, // Pre-fill with existing data
|
|
995
|
-
});
|
|
996
|
-
|
|
997
|
-
const askName = onboardingRoute.initialStep.nextStep({
|
|
998
|
-
instructions: "What's your name?",
|
|
999
|
-
collect: ["name"],
|
|
1000
|
-
skipIf: (data) => !!data.name, // Skip if name exists
|
|
1001
|
-
});
|
|
1002
|
-
|
|
1003
|
-
const askEmail = askName.nextStep({
|
|
1004
|
-
instructions: "What's your email?",
|
|
1005
|
-
collect: ["email"],
|
|
1006
|
-
skipIf: (data) => !!data.email, // Skip if email exists
|
|
1007
|
-
});
|
|
1008
|
-
|
|
1009
|
-
const complete = askEmail.nextStep({
|
|
1010
|
-
instructions: "All done!",
|
|
1011
|
-
});
|
|
1012
|
-
|
|
1013
|
-
complete.nextStep({ step: END_ROUTE });
|
|
1014
|
-
|
|
1015
|
-
// In your handler:
|
|
1016
|
-
const response = await agent.respond({ history, session });
|
|
1017
|
-
|
|
1018
|
-
if (response.isRouteComplete) {
|
|
1019
|
-
// If existingUserData had all fields, route completes immediately!
|
|
1020
|
-
// The routing engine recursively skips all steps and reaches END_ROUTE
|
|
1021
|
-
console.log("Profile already complete!");
|
|
1022
|
-
}
|
|
1023
|
-
```
|
|
1024
|
-
|
|
1025
|
-
### Important Notes
|
|
1026
|
-
|
|
1027
|
-
- **`isRouteComplete: true`** indicates the route has reached `END_ROUTE`
|
|
1028
|
-
- **`currentStep.id`** is set to `END_ROUTE_ID` when the route completes
|
|
1029
|
-
- **`response.message`** will be empty (`""`) when route is complete
|
|
1030
|
-
- **The routing engine** recursively traverses skipped steps to detect completion
|
|
1031
|
-
- **You can check either** `isRouteComplete` or `currentStep.id === END_ROUTE_ID`
|
|
1032
|
-
- **Session step** still contains all the collected data via `agent.getData()`
|
|
1033
|
-
- **The route** (`currentRoute.id`) remains the completed route (e.g., "onboarding"), not END_ROUTE
|
|
1034
|
-
|
|
1035
|
-
### With Streaming
|
|
1036
|
-
|
|
1037
|
-
```typescript
|
|
1038
|
-
for await (const chunk of agent.respondStream({ history, session })) {
|
|
1039
|
-
if (chunk.delta) {
|
|
1040
|
-
process.stdout.write(chunk.delta);
|
|
1041
|
-
}
|
|
1042
|
-
|
|
1043
|
-
if (chunk.done && chunk.isRouteComplete) {
|
|
1044
|
-
console.log("\n🎉 Route completed!");
|
|
1045
|
-
const data = agent.getData(chunk.session!);
|
|
1046
|
-
await processCompletedData(data);
|
|
1047
|
-
}
|
|
1048
|
-
}
|
|
1049
|
-
```
|
|
1050
|
-
|
|
1051
|
-
---
|
|
1052
|
-
|
|
1053
|
-
## Best Practices
|
|
1054
|
-
|
|
1055
|
-
### ✅ Do's
|
|
1056
|
-
|
|
1057
|
-
- **Use descriptive titles and descriptions** - Makes routing more accurate
|
|
1058
|
-
- **Define extraction schemas** - Type-safe data collection
|
|
1059
|
-
- **Configure initial step** - Set up proper entry point
|
|
1060
|
-
- **Use skipIf for known data** - Avoid redundant questions
|
|
1061
|
-
- **Scope domains** - Limit tool access per route
|
|
1062
|
-
- **Add route-specific guidelines** - Context-aware behavior
|
|
1063
|
-
- **Use steps for linear flows** - Cleaner code for simple paths
|
|
1064
|
-
|
|
1065
|
-
### ❌ Don'ts
|
|
1066
|
-
|
|
1067
|
-
- **Don't use vague conditions** - Be specific about when to activate
|
|
1068
|
-
- **Don't skip extraction schemas** - Loses type safety
|
|
1069
|
-
- **Don't create overly complex routes** - Split into multiple routes
|
|
1070
|
-
- **Don't forget requires** - Prevent steps from executing too early
|
|
1071
|
-
- **Don't mix concerns** - One route = one goal
|
|
1072
|
-
- **Don't hardcode step IDs** - Let framework generate deterministic IDs
|
|
1073
|
-
|
|
1074
|
-
---
|
|
1075
|
-
|
|
1076
|
-
## See Also
|
|
1077
|
-
|
|
1078
|
-
- [Steps Guide](./STEPS.md) - Deep dive into step management
|
|
1079
|
-
- [API Reference - Route](./API_REFERENCE.md#route) - Complete API docs
|
|
1080
|
-
- [Examples](../examples/) - Real-world route implementations
|
|
1081
|
-
- [Architecture Guide](./ARCHITECTURE.md) - How routes fit in the system
|
|
1082
|
-
|
|
1083
|
-
---
|
|
1084
|
-
|
|
1085
|
-
**Made with ❤️ for the community**
|