@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/STEPS.md
DELETED
|
@@ -1,883 +0,0 @@
|
|
|
1
|
-
# Steps Guide
|
|
2
|
-
|
|
3
|
-
A complete guide to creating and managing steps in conversational flows.
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## Table of Contents
|
|
8
|
-
|
|
9
|
-
- [What is a Step?](#what-is-a-step)
|
|
10
|
-
- [Creating Steps](#creating-steps)
|
|
11
|
-
- [Step Configuration](#step-configuration)
|
|
12
|
-
- [Transitions](#transitions)
|
|
13
|
-
- [Data Collecting](#data-collecting)
|
|
14
|
-
- [Step Logic](#step-logic)
|
|
15
|
-
- [Step Types](#step-types)
|
|
16
|
-
- [Advanced Patterns](#advanced-patterns)
|
|
17
|
-
|
|
18
|
-
---
|
|
19
|
-
|
|
20
|
-
## What is a Step?
|
|
21
|
-
|
|
22
|
-
A **Step** represents a specific step or moment in a conversation. Each step can:
|
|
23
|
-
|
|
24
|
-
- Display a message to the user (chat state)
|
|
25
|
-
- Execute a tool (tool state)
|
|
26
|
-
- Collect data from the conversation
|
|
27
|
-
- Make decisions about what to do next
|
|
28
|
-
|
|
29
|
-
```typescript
|
|
30
|
-
// Example: A step that asks for user's name
|
|
31
|
-
const askName = route.initialStep.nextStep({
|
|
32
|
-
instructions: "What's your name?",
|
|
33
|
-
collect: ["firstName", "lastName"],
|
|
34
|
-
});
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
**Key Concepts:**
|
|
38
|
-
|
|
39
|
-
- Steps form a **step machine** within a route
|
|
40
|
-
- Each step has a unique **ID** (auto-generated or custom)
|
|
41
|
-
- Steps can **collect data** from user responses
|
|
42
|
-
- Steps can be **skipped** based on conditions
|
|
43
|
-
- Steps can have **prerequisites** (required data)
|
|
44
|
-
|
|
45
|
-
---
|
|
46
|
-
|
|
47
|
-
## Creating Steps
|
|
48
|
-
|
|
49
|
-
### Chat states
|
|
50
|
-
|
|
51
|
-
Chat states present a message and optionally collect data:
|
|
52
|
-
|
|
53
|
-
```typescript
|
|
54
|
-
// Simple chat state
|
|
55
|
-
const welcome = route.initialStep.nextStep({
|
|
56
|
-
instructions: "Welcome! How can I help you today?",
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
// Chat state with data collecting
|
|
60
|
-
const askDestination = welcome.nextStep({
|
|
61
|
-
instructions: "Where would you like to fly?",
|
|
62
|
-
collect: ["destination"],
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
// Chat state with custom ID
|
|
66
|
-
const askDates = askDestination.nextStep({
|
|
67
|
-
id: "ask_travel_dates",
|
|
68
|
-
instructions: "When would you like to depart?",
|
|
69
|
-
collect: ["departureDate"],
|
|
70
|
-
});
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
### Tool states
|
|
74
|
-
|
|
75
|
-
Tool states execute functions and can update context or collected data:
|
|
76
|
-
|
|
77
|
-
```typescript
|
|
78
|
-
import { defineTool } from "@falai/agent";
|
|
79
|
-
|
|
80
|
-
const searchFlights = defineTool<Context, [], Results>(
|
|
81
|
-
"search_flights",
|
|
82
|
-
async ({ context, data }) => {
|
|
83
|
-
const results = await api.search(data.destination);
|
|
84
|
-
return {
|
|
85
|
-
data: results,
|
|
86
|
-
contextUpdate: { availableFlights: results },
|
|
87
|
-
};
|
|
88
|
-
}
|
|
89
|
-
);
|
|
90
|
-
|
|
91
|
-
// Tool state
|
|
92
|
-
const searchStep = askDates.nextStep({
|
|
93
|
-
tool: searchFlights,
|
|
94
|
-
requires: ["destination", "departureDate"],
|
|
95
|
-
});
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
### Direct Step References
|
|
99
|
-
|
|
100
|
-
Jump to specific steps or end the route:
|
|
101
|
-
|
|
102
|
-
```typescript
|
|
103
|
-
import { END_ROUTE } from "@falai/agent";
|
|
104
|
-
|
|
105
|
-
// Jump to another step
|
|
106
|
-
const confirm = processPayment.nextStep({
|
|
107
|
-
step: previousStep.getRef(), // Jump back
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
// End the route
|
|
111
|
-
const complete = confirm.nextStep({
|
|
112
|
-
step: END_ROUTE,
|
|
113
|
-
});
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
---
|
|
117
|
-
|
|
118
|
-
## Step Configuration
|
|
119
|
-
|
|
120
|
-
### Configuring Initial Step
|
|
121
|
-
|
|
122
|
-
Every route has an initial step that can be configured:
|
|
123
|
-
|
|
124
|
-
```typescript
|
|
125
|
-
// Option 1: Configure at route creation
|
|
126
|
-
const route = agent.createRoute({
|
|
127
|
-
title: "Booking",
|
|
128
|
-
initialStep: {
|
|
129
|
-
id: "welcome",
|
|
130
|
-
instructions: "Welcome to our booking system!",
|
|
131
|
-
collect: ["intention"],
|
|
132
|
-
},
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
// Option 2: Configure after creation
|
|
136
|
-
route.initialStep.configure({
|
|
137
|
-
description: "Welcome! Let's start booking",
|
|
138
|
-
collectFields: ["destination"],
|
|
139
|
-
skipIf: (data) => !!data.destination,
|
|
140
|
-
requires: [],
|
|
141
|
-
});
|
|
142
|
-
```
|
|
143
|
-
|
|
144
|
-
### Configuring Any Step
|
|
145
|
-
|
|
146
|
-
You can configure any step after creation:
|
|
147
|
-
|
|
148
|
-
```typescript
|
|
149
|
-
const askName = route.initialStep.nextStep({
|
|
150
|
-
instructions: "What's your name?",
|
|
151
|
-
});
|
|
152
|
-
|
|
153
|
-
// Later, reconfigure it
|
|
154
|
-
askName.configure({
|
|
155
|
-
description: "Ask for user's full name",
|
|
156
|
-
collectFields: ["firstName", "lastName"],
|
|
157
|
-
skipIf: (data) => !!data.firstName && !!data.lastName,
|
|
158
|
-
});
|
|
159
|
-
|
|
160
|
-
// Chaining is supported
|
|
161
|
-
askName
|
|
162
|
-
.configure({ description: "Updated description" })
|
|
163
|
-
.configure({ collectFields: ["fullName"] });
|
|
164
|
-
```
|
|
165
|
-
|
|
166
|
-
### Configuration Options
|
|
167
|
-
|
|
168
|
-
```typescript
|
|
169
|
-
step.configure({
|
|
170
|
-
// Step description
|
|
171
|
-
description?: string;
|
|
172
|
-
|
|
173
|
-
// Fields to collect from conversation
|
|
174
|
-
collectFields?: string[];
|
|
175
|
-
|
|
176
|
-
// Skip this step if condition is met
|
|
177
|
-
skipIf?: (data: Partial<TData>) => boolean;
|
|
178
|
-
|
|
179
|
-
// Prerequisites that must be met before entering
|
|
180
|
-
requires?: string[];
|
|
181
|
-
});
|
|
182
|
-
```
|
|
183
|
-
|
|
184
|
-
---
|
|
185
|
-
|
|
186
|
-
## Transitions
|
|
187
|
-
|
|
188
|
-
### Transition Specification
|
|
189
|
-
|
|
190
|
-
Every transition from one step to another uses a `TransitionSpec`:
|
|
191
|
-
|
|
192
|
-
```typescript
|
|
193
|
-
interface TransitionSpec<TData = unknown> {
|
|
194
|
-
// Custom step ID (optional)
|
|
195
|
-
id?: string;
|
|
196
|
-
|
|
197
|
-
// Chat state description
|
|
198
|
-
instructions?: string;
|
|
199
|
-
|
|
200
|
-
// Tool to execute
|
|
201
|
-
tool?: ToolRef;
|
|
202
|
-
|
|
203
|
-
// Direct step reference or END_ROUTE
|
|
204
|
-
step?: StepRef | symbol;
|
|
205
|
-
|
|
206
|
-
// Fields to collect in this step
|
|
207
|
-
collect?: string[];
|
|
208
|
-
|
|
209
|
-
// Skip condition (code-based)
|
|
210
|
-
skipIf?: (data: Partial<TData>) => boolean;
|
|
211
|
-
|
|
212
|
-
// Prerequisites
|
|
213
|
-
requires?: string[];
|
|
214
|
-
|
|
215
|
-
// AI-evaluated condition (for step selection)
|
|
216
|
-
condition?: string;
|
|
217
|
-
}
|
|
218
|
-
```
|
|
219
|
-
|
|
220
|
-
### Transition Chaining
|
|
221
|
-
|
|
222
|
-
```typescript
|
|
223
|
-
// Linear flow
|
|
224
|
-
route.initialStep
|
|
225
|
-
.nextStep({
|
|
226
|
-
instructions: "Step 1",
|
|
227
|
-
collect: ["field1"],
|
|
228
|
-
})
|
|
229
|
-
.nextStep({
|
|
230
|
-
instructions: "Step 2",
|
|
231
|
-
collect: ["field2"],
|
|
232
|
-
})
|
|
233
|
-
.nextStep({
|
|
234
|
-
instructions: "Step 3",
|
|
235
|
-
collect: ["field3"],
|
|
236
|
-
})
|
|
237
|
-
.nextStep({ step: END_ROUTE });
|
|
238
|
-
```
|
|
239
|
-
|
|
240
|
-
### Branching Transitions
|
|
241
|
-
|
|
242
|
-
```typescript
|
|
243
|
-
const askType = route.initialStep.nextStep({
|
|
244
|
-
instructions: "Are you booking a flight or hotel?",
|
|
245
|
-
collect: ["bookingType"],
|
|
246
|
-
});
|
|
247
|
-
|
|
248
|
-
// Branch 1: Flight booking
|
|
249
|
-
const flightFlow = askType.nextStep({
|
|
250
|
-
instructions: "Let's book your flight",
|
|
251
|
-
condition: "User selected flight",
|
|
252
|
-
});
|
|
253
|
-
|
|
254
|
-
// Branch 2: Hotel booking
|
|
255
|
-
const hotelFlow = askType.nextStep({
|
|
256
|
-
instructions: "Let's book your hotel",
|
|
257
|
-
condition: "User selected hotel",
|
|
258
|
-
});
|
|
259
|
-
|
|
260
|
-
// Both branches can converge later
|
|
261
|
-
const payment = flightFlow.nextStep({
|
|
262
|
-
instructions: "Let's process payment",
|
|
263
|
-
});
|
|
264
|
-
|
|
265
|
-
hotelFlow.nextStep({ step: payment }); // Converge to payment
|
|
266
|
-
```
|
|
267
|
-
|
|
268
|
-
---
|
|
269
|
-
|
|
270
|
-
## Data Collecting
|
|
271
|
-
|
|
272
|
-
### Basic Collecting
|
|
273
|
-
|
|
274
|
-
Specify which fields to extract in each step:
|
|
275
|
-
|
|
276
|
-
```typescript
|
|
277
|
-
interface UserData {
|
|
278
|
-
firstName: string;
|
|
279
|
-
lastName: string;
|
|
280
|
-
email: string;
|
|
281
|
-
phone: string;
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
const route = agent.createRoute<UserData>({ ... });
|
|
285
|
-
|
|
286
|
-
// Collect single field
|
|
287
|
-
const askName = route.initialStep.nextStep({
|
|
288
|
-
instructions: "What's your first name?",
|
|
289
|
-
collect: ["firstName"],
|
|
290
|
-
});
|
|
291
|
-
|
|
292
|
-
// Collect multiple fields at once
|
|
293
|
-
const askContact = askName.nextStep({
|
|
294
|
-
instructions: "Please provide your email and phone number",
|
|
295
|
-
collect: ["email", "phone"],
|
|
296
|
-
});
|
|
297
|
-
```
|
|
298
|
-
|
|
299
|
-
### Collecting with Schema Validation
|
|
300
|
-
|
|
301
|
-
The extraction schema validates collected data:
|
|
302
|
-
|
|
303
|
-
```typescript
|
|
304
|
-
const route = agent.createRoute<UserData>({
|
|
305
|
-
title: "User Registration",
|
|
306
|
-
|
|
307
|
-
schema: {
|
|
308
|
-
type: "object",
|
|
309
|
-
properties: {
|
|
310
|
-
firstName: {
|
|
311
|
-
type: "string",
|
|
312
|
-
minLength: 1,
|
|
313
|
-
},
|
|
314
|
-
email: {
|
|
315
|
-
type: "string",
|
|
316
|
-
format: "email", // Validates email format
|
|
317
|
-
},
|
|
318
|
-
age: {
|
|
319
|
-
type: "number",
|
|
320
|
-
minimum: 18,
|
|
321
|
-
maximum: 120,
|
|
322
|
-
},
|
|
323
|
-
},
|
|
324
|
-
required: ["firstName", "email"],
|
|
325
|
-
},
|
|
326
|
-
});
|
|
327
|
-
|
|
328
|
-
// AI will extract and validate according to schema
|
|
329
|
-
const askInfo = route.initialStep.nextStep({
|
|
330
|
-
instructions: "Please provide your name, email, and age",
|
|
331
|
-
collect: ["firstName", "email", "age"],
|
|
332
|
-
});
|
|
333
|
-
```
|
|
334
|
-
|
|
335
|
-
### Conditional Collecting
|
|
336
|
-
|
|
337
|
-
Use `skipIf` to avoid re-asking for data:
|
|
338
|
-
|
|
339
|
-
```typescript
|
|
340
|
-
const askDestination = route.initialStep.nextStep({
|
|
341
|
-
instructions: "Where would you like to go?",
|
|
342
|
-
collect: ["destination"],
|
|
343
|
-
// Skip if we already have the destination
|
|
344
|
-
skipIf: (data) => !!data.destination,
|
|
345
|
-
});
|
|
346
|
-
|
|
347
|
-
const askDates = askDestination.nextStep({
|
|
348
|
-
instructions: "When would you like to travel?",
|
|
349
|
-
collect: ["departureDate", "returnDate"],
|
|
350
|
-
// Skip if we have both dates
|
|
351
|
-
skipIf: (data) => !!data.departureDate && !!data.returnDate,
|
|
352
|
-
});
|
|
353
|
-
```
|
|
354
|
-
|
|
355
|
-
---
|
|
356
|
-
|
|
357
|
-
## Step Logic
|
|
358
|
-
|
|
359
|
-
### Skip Conditions
|
|
360
|
-
|
|
361
|
-
Control when steps should be bypassed:
|
|
362
|
-
|
|
363
|
-
```typescript
|
|
364
|
-
// Skip if data already exists
|
|
365
|
-
const askEmail = route.initialStep.nextStep({
|
|
366
|
-
instructions: "What's your email?",
|
|
367
|
-
collect: ["email"],
|
|
368
|
-
skipIf: (data) => !!data.email,
|
|
369
|
-
});
|
|
370
|
-
|
|
371
|
-
// Skip based on business logic
|
|
372
|
-
const askShipping = askEmail.nextStep({
|
|
373
|
-
instructions: "What's your shipping address?",
|
|
374
|
-
collect: ["shippingAddress"],
|
|
375
|
-
// Skip if user selected digital product
|
|
376
|
-
skipIf: (data) => data.productType === "digital",
|
|
377
|
-
});
|
|
378
|
-
|
|
379
|
-
// Skip based on multiple conditions
|
|
380
|
-
const askBilling = askShipping.nextStep({
|
|
381
|
-
instructions: "What's your billing address?",
|
|
382
|
-
collect: ["billingAddress"],
|
|
383
|
-
// Skip if billing same as shipping, or already provided
|
|
384
|
-
skipIf: (data) =>
|
|
385
|
-
data.billingSameAsShipping === true || !!data.billingAddress,
|
|
386
|
-
});
|
|
387
|
-
```
|
|
388
|
-
|
|
389
|
-
### Required Data
|
|
390
|
-
|
|
391
|
-
Ensure prerequisites are met before entering a step:
|
|
392
|
-
|
|
393
|
-
```typescript
|
|
394
|
-
// Can't search without destination and dates
|
|
395
|
-
const searchFlights = askDates.nextStep({
|
|
396
|
-
tool: searchFlightsTool,
|
|
397
|
-
requires: ["destination", "departureDate"],
|
|
398
|
-
});
|
|
399
|
-
|
|
400
|
-
// Can't checkout without all required fields
|
|
401
|
-
const processPayment = selectFlight.nextStep({
|
|
402
|
-
tool: processPaymentTool,
|
|
403
|
-
requires: ["destination", "departureDate", "selectedFlight", "paymentMethod"],
|
|
404
|
-
});
|
|
405
|
-
|
|
406
|
-
// Multiple prerequisites
|
|
407
|
-
const generateInvoice = processPayment.nextStep({
|
|
408
|
-
instructions: "Here's your invoice",
|
|
409
|
-
requires: ["paymentConfirmation", "customerEmail", "bookingReference"],
|
|
410
|
-
});
|
|
411
|
-
```
|
|
412
|
-
|
|
413
|
-
### Step Conditions
|
|
414
|
-
|
|
415
|
-
AI-evaluated conditions for step selection:
|
|
416
|
-
|
|
417
|
-
```typescript
|
|
418
|
-
const askIssue = route.initialStep.nextStep({
|
|
419
|
-
instructions: "What seems to be the problem?",
|
|
420
|
-
collect: ["issueDescription"],
|
|
421
|
-
});
|
|
422
|
-
|
|
423
|
-
// Technical support path
|
|
424
|
-
const technicalHelp = askIssue.nextStep({
|
|
425
|
-
instructions: "Let me help with your technical issue",
|
|
426
|
-
condition: "Issue is technical in nature",
|
|
427
|
-
});
|
|
428
|
-
|
|
429
|
-
// Billing support path
|
|
430
|
-
const billingHelp = askIssue.nextStep({
|
|
431
|
-
instructions: "Let me help with your billing issue",
|
|
432
|
-
condition: "Issue is related to billing or payments",
|
|
433
|
-
});
|
|
434
|
-
|
|
435
|
-
// General inquiry path
|
|
436
|
-
const generalHelp = askIssue.nextStep({
|
|
437
|
-
instructions: "Let me help with your question",
|
|
438
|
-
condition: "Issue is a general inquiry",
|
|
439
|
-
});
|
|
440
|
-
```
|
|
441
|
-
|
|
442
|
-
---
|
|
443
|
-
|
|
444
|
-
## Step Types
|
|
445
|
-
|
|
446
|
-
### 1. Chat states
|
|
447
|
-
|
|
448
|
-
Present information and collect data:
|
|
449
|
-
|
|
450
|
-
```typescript
|
|
451
|
-
const chat = route.initialStep.nextStep({
|
|
452
|
-
instructions: "What would you like to know?",
|
|
453
|
-
collect: ["question"],
|
|
454
|
-
});
|
|
455
|
-
```
|
|
456
|
-
|
|
457
|
-
**When to use:**
|
|
458
|
-
|
|
459
|
-
- Ask questions
|
|
460
|
-
- Present information
|
|
461
|
-
- Collect user input
|
|
462
|
-
- Confirm actions
|
|
463
|
-
|
|
464
|
-
### 2. Tool states
|
|
465
|
-
|
|
466
|
-
Execute functions:
|
|
467
|
-
|
|
468
|
-
```typescript
|
|
469
|
-
const tool = route.initialStep.nextStep({
|
|
470
|
-
tool: myTool,
|
|
471
|
-
requires: ["param1", "param2"],
|
|
472
|
-
});
|
|
473
|
-
```
|
|
474
|
-
|
|
475
|
-
**When to use:**
|
|
476
|
-
|
|
477
|
-
- Call APIs
|
|
478
|
-
- Database operations
|
|
479
|
-
- Complex computations
|
|
480
|
-
- External integrations
|
|
481
|
-
- Data validation/enrichment
|
|
482
|
-
|
|
483
|
-
### 3. Initial Step
|
|
484
|
-
|
|
485
|
-
Every route's starting point:
|
|
486
|
-
|
|
487
|
-
```typescript
|
|
488
|
-
route.initialStep.configure({
|
|
489
|
-
description: "Welcome message",
|
|
490
|
-
collectFields: ["initialInput"],
|
|
491
|
-
});
|
|
492
|
-
```
|
|
493
|
-
|
|
494
|
-
**When to configure:**
|
|
495
|
-
|
|
496
|
-
- Set up welcome messages
|
|
497
|
-
- Collect initial context
|
|
498
|
-
- Set expectations
|
|
499
|
-
- Pre-populate data
|
|
500
|
-
|
|
501
|
-
### 4. End Step (Terminal Step)
|
|
502
|
-
|
|
503
|
-
Every route ends when it reaches `END_ROUTE`. You can configure what happens at completion:
|
|
504
|
-
|
|
505
|
-
#### Option A: Route-Level Configuration (Recommended)
|
|
506
|
-
|
|
507
|
-
```typescript
|
|
508
|
-
import { END_ROUTE } from "@falai/agent";
|
|
509
|
-
|
|
510
|
-
const bookingRoute = agent.createRoute({
|
|
511
|
-
title: "Book Flight",
|
|
512
|
-
|
|
513
|
-
// Configure end step behavior
|
|
514
|
-
endStep: {
|
|
515
|
-
instructions: "Confirm booking and thank the user!",
|
|
516
|
-
tool: sendConfirmationEmail, // Execute final actions
|
|
517
|
-
collect: ["finalConfirmation"], // Collect last data
|
|
518
|
-
},
|
|
519
|
-
});
|
|
520
|
-
|
|
521
|
-
// Later, just transition to END_ROUTE
|
|
522
|
-
finalStep.nextStep({
|
|
523
|
-
step: END_ROUTE,
|
|
524
|
-
});
|
|
525
|
-
```
|
|
526
|
-
|
|
527
|
-
#### Option B: Per-Transition Override
|
|
528
|
-
|
|
529
|
-
```typescript
|
|
530
|
-
// Override endStep for this specific path
|
|
531
|
-
finalStep.nextStep({
|
|
532
|
-
instructions: "Special completion message for VIP users!",
|
|
533
|
-
step: END_ROUTE,
|
|
534
|
-
});
|
|
535
|
-
```
|
|
536
|
-
|
|
537
|
-
#### Option C: Default Behavior
|
|
538
|
-
|
|
539
|
-
If you don't configure `endStep`, a smart default completion message is generated:
|
|
540
|
-
|
|
541
|
-
```typescript
|
|
542
|
-
finalStep.nextStep({
|
|
543
|
-
step: END_ROUTE,
|
|
544
|
-
});
|
|
545
|
-
// Uses default: "Summarize what was accomplished and confirm completion..."
|
|
546
|
-
```
|
|
547
|
-
|
|
548
|
-
**End Step Capabilities:**
|
|
549
|
-
|
|
550
|
-
```typescript
|
|
551
|
-
endStep: {
|
|
552
|
-
// Completion message instruction
|
|
553
|
-
instructions?: string;
|
|
554
|
-
|
|
555
|
-
// Execute final actions (emails, database updates, etc.)
|
|
556
|
-
tool?: ToolRef;
|
|
557
|
-
|
|
558
|
-
// Collect final data before completion
|
|
559
|
-
collect?: string[];
|
|
560
|
-
|
|
561
|
-
// Require certain data to be present
|
|
562
|
-
requires?: string[];
|
|
563
|
-
|
|
564
|
-
// Custom step ID for debugging
|
|
565
|
-
id?: string;
|
|
566
|
-
}
|
|
567
|
-
```
|
|
568
|
-
|
|
569
|
-
**When to use END_ROUTE:**
|
|
570
|
-
|
|
571
|
-
- ✅ Route completion - all required data collected
|
|
572
|
-
- ✅ Success outcomes - action completed successfully
|
|
573
|
-
- ✅ Failure outcomes - error handling completed
|
|
574
|
-
- ✅ Before transition - handoff to another route via `onComplete`
|
|
575
|
-
|
|
576
|
-
**End Step with Tools:**
|
|
577
|
-
|
|
578
|
-
Execute final actions when route completes:
|
|
579
|
-
|
|
580
|
-
```typescript
|
|
581
|
-
import { defineTool, END_ROUTE } from "@falai/agent";
|
|
582
|
-
|
|
583
|
-
const notifyTeam = defineTool("notify_team", async ({ data }) => {
|
|
584
|
-
await slack.send({
|
|
585
|
-
channel: "#bookings",
|
|
586
|
-
message: `New booking: ${data.hotelName} for ${data.guests} guests`,
|
|
587
|
-
});
|
|
588
|
-
return { data: "Team notified" };
|
|
589
|
-
});
|
|
590
|
-
|
|
591
|
-
const bookingRoute = agent.createRoute({
|
|
592
|
-
endStep: {
|
|
593
|
-
tool: notifyTeam, // Runs when route completes
|
|
594
|
-
instructions: "Booking complete! Our team has been notified.",
|
|
595
|
-
},
|
|
596
|
-
});
|
|
597
|
-
```
|
|
598
|
-
|
|
599
|
-
**Key Points:**
|
|
600
|
-
|
|
601
|
-
- ✅ Configure once at route level (DRY principle)
|
|
602
|
-
- ✅ Can be overridden per-transition if needed
|
|
603
|
-
- ✅ Supports full step capabilities: `instructions`, `tool`, `collect`, `requires`
|
|
604
|
-
- ✅ Automatically generates message if not configured
|
|
605
|
-
- ✅ Executes before `onComplete` route transitions
|
|
606
|
-
|
|
607
|
-
---
|
|
608
|
-
|
|
609
|
-
## Advanced Patterns
|
|
610
|
-
|
|
611
|
-
### Pattern 1: Step Loops
|
|
612
|
-
|
|
613
|
-
```typescript
|
|
614
|
-
const askItems = route.initialStep.nextStep({
|
|
615
|
-
instructions: "What items would you like to add to your cart?",
|
|
616
|
-
collect: ["newItem"],
|
|
617
|
-
});
|
|
618
|
-
|
|
619
|
-
const confirmMore = askItems.nextStep({
|
|
620
|
-
instructions: "Would you like to add more items?",
|
|
621
|
-
collect: ["addMore"],
|
|
622
|
-
});
|
|
623
|
-
|
|
624
|
-
// Loop back to askItems if user wants more
|
|
625
|
-
confirmMore.nextStep({
|
|
626
|
-
step: askItems,
|
|
627
|
-
condition: "User wants to add more items",
|
|
628
|
-
});
|
|
629
|
-
|
|
630
|
-
// Or continue to checkout
|
|
631
|
-
const checkout = confirmMore.nextStep({
|
|
632
|
-
instructions: "Let's proceed to checkout",
|
|
633
|
-
condition: "User is done adding items",
|
|
634
|
-
});
|
|
635
|
-
```
|
|
636
|
-
|
|
637
|
-
### Pattern 2: Error Handling Steps
|
|
638
|
-
|
|
639
|
-
```typescript
|
|
640
|
-
const processPayment = route.initialStep.nextStep({
|
|
641
|
-
tool: paymentTool,
|
|
642
|
-
requires: ["amount", "paymentMethod"],
|
|
643
|
-
});
|
|
644
|
-
|
|
645
|
-
// Success path
|
|
646
|
-
const paymentSuccess = processPayment.nextStep({
|
|
647
|
-
instructions: "Payment successful! Here's your receipt",
|
|
648
|
-
condition: "Payment was successful",
|
|
649
|
-
});
|
|
650
|
-
|
|
651
|
-
// Failure path
|
|
652
|
-
const paymentFailed = processPayment.nextStep({
|
|
653
|
-
instructions:
|
|
654
|
-
"Payment failed. Would you like to try a different payment method?",
|
|
655
|
-
collect: ["retryPayment"],
|
|
656
|
-
condition: "Payment failed",
|
|
657
|
-
});
|
|
658
|
-
|
|
659
|
-
// Retry logic
|
|
660
|
-
paymentFailed.nextStep({
|
|
661
|
-
step: processPayment,
|
|
662
|
-
condition: "User wants to retry",
|
|
663
|
-
});
|
|
664
|
-
```
|
|
665
|
-
|
|
666
|
-
### Pattern 3: Progressive Disclosure
|
|
667
|
-
|
|
668
|
-
```typescript
|
|
669
|
-
// Start with basic info
|
|
670
|
-
const askBasic = route.initialStep.nextStep({
|
|
671
|
-
instructions: "Let's start with the basics. What's your name?",
|
|
672
|
-
collect: ["name"],
|
|
673
|
-
});
|
|
674
|
-
|
|
675
|
-
// Reveal more options
|
|
676
|
-
const askPreferences = askBasic.nextStep({
|
|
677
|
-
instructions: "Great! Now, would you like to customize your experience?",
|
|
678
|
-
collect: ["wantsCustomization"],
|
|
679
|
-
});
|
|
680
|
-
|
|
681
|
-
// Only ask detailed questions if user wants customization
|
|
682
|
-
const askDetailed = askPreferences.nextStep({
|
|
683
|
-
instructions: "Tell me about your preferences...",
|
|
684
|
-
collect: ["theme", "notifications", "language"],
|
|
685
|
-
skipIf: (data) => data.wantsCustomization === false,
|
|
686
|
-
});
|
|
687
|
-
|
|
688
|
-
const finish = askDetailed.nextStep({
|
|
689
|
-
instructions: "All set! Your account is ready",
|
|
690
|
-
});
|
|
691
|
-
|
|
692
|
-
// Direct path if no customization
|
|
693
|
-
askPreferences.nextStep({
|
|
694
|
-
step: finish,
|
|
695
|
-
condition: "User doesn't want customization",
|
|
696
|
-
});
|
|
697
|
-
```
|
|
698
|
-
|
|
699
|
-
### Pattern 4: Step Validation
|
|
700
|
-
|
|
701
|
-
```typescript
|
|
702
|
-
const askAge = route.initialStep.nextStep({
|
|
703
|
-
instructions: "How old are you?",
|
|
704
|
-
collect: ["age"],
|
|
705
|
-
});
|
|
706
|
-
|
|
707
|
-
const validateAge = askAge.nextStep({
|
|
708
|
-
tool: validateAgeTool,
|
|
709
|
-
requires: ["age"],
|
|
710
|
-
});
|
|
711
|
-
|
|
712
|
-
// Valid age
|
|
713
|
-
const proceed = validateAge.nextStep({
|
|
714
|
-
instructions: "Great! Let's continue",
|
|
715
|
-
condition: "Age is valid",
|
|
716
|
-
});
|
|
717
|
-
|
|
718
|
-
// Invalid age - loop back
|
|
719
|
-
validateAge.nextStep({
|
|
720
|
-
step: askAge,
|
|
721
|
-
condition: "Age is invalid",
|
|
722
|
-
});
|
|
723
|
-
```
|
|
724
|
-
|
|
725
|
-
### Pattern 5: Context-Aware Steps
|
|
726
|
-
|
|
727
|
-
```typescript
|
|
728
|
-
const askQuestion = route.initialStep.nextStep({
|
|
729
|
-
instructions: "What would you like to know?",
|
|
730
|
-
collect: ["question"],
|
|
731
|
-
});
|
|
732
|
-
|
|
733
|
-
// Different responses based on user type
|
|
734
|
-
const premiumResponse = askQuestion.nextStep({
|
|
735
|
-
instructions: "As a premium member, here's detailed information...",
|
|
736
|
-
condition: "User has premium account",
|
|
737
|
-
});
|
|
738
|
-
|
|
739
|
-
const basicResponse = askQuestion.nextStep({
|
|
740
|
-
instructions: "Here's the basic information. Upgrade for more details!",
|
|
741
|
-
condition: "User has basic account",
|
|
742
|
-
});
|
|
743
|
-
```
|
|
744
|
-
|
|
745
|
-
---
|
|
746
|
-
|
|
747
|
-
## Step Properties
|
|
748
|
-
|
|
749
|
-
### Accessing Step Properties
|
|
750
|
-
|
|
751
|
-
```typescript
|
|
752
|
-
const step = route.getStep("ask_name");
|
|
753
|
-
|
|
754
|
-
// Step identification
|
|
755
|
-
console.log(step.id); // "step_ask_name_abc123"
|
|
756
|
-
console.log(step.routeId); // "route_onboarding_xyz789"
|
|
757
|
-
console.log(step.description); // "Ask for user's name"
|
|
758
|
-
|
|
759
|
-
// Step configuration
|
|
760
|
-
console.log(step.collectFields); // ["firstName", "lastName"]
|
|
761
|
-
console.log(step.requires); // ["userId"]
|
|
762
|
-
|
|
763
|
-
// Step logic
|
|
764
|
-
if (step.skipIf) {
|
|
765
|
-
const shouldSkip = step.skipIf(dataData);
|
|
766
|
-
console.log("Should skip:", shouldSkip);
|
|
767
|
-
}
|
|
768
|
-
|
|
769
|
-
// Step guidelines
|
|
770
|
-
step.addGuideline({
|
|
771
|
-
condition: "User provides invalid name",
|
|
772
|
-
action: "Ask for valid name format",
|
|
773
|
-
});
|
|
774
|
-
console.log(step.getGuidelines());
|
|
775
|
-
|
|
776
|
-
// Transitions
|
|
777
|
-
console.log(step.getTransitions()); // [Transition, Transition, ...]
|
|
778
|
-
```
|
|
779
|
-
|
|
780
|
-
### Step Reference
|
|
781
|
-
|
|
782
|
-
```typescript
|
|
783
|
-
const stepRef = step.getRef();
|
|
784
|
-
console.log(stepRef);
|
|
785
|
-
// { id: "step_ask_name_abc123", routeId: "route_onboarding_xyz789" }
|
|
786
|
-
|
|
787
|
-
// Use reference in transitions
|
|
788
|
-
anotherStep.nextStep({ step: stepRef });
|
|
789
|
-
```
|
|
790
|
-
|
|
791
|
-
---
|
|
792
|
-
|
|
793
|
-
## Best Practices
|
|
794
|
-
|
|
795
|
-
### ✅ Do's
|
|
796
|
-
|
|
797
|
-
- **Use descriptive instructions** - Clear prompts for better UX
|
|
798
|
-
- **Define collect fields** - Explicit data extraction
|
|
799
|
-
- **Use skipIf for efficiency** - Avoid redundant questions
|
|
800
|
-
- **Set requires** - Prevent premature execution
|
|
801
|
-
- **Configure initial step** - Proper route entry point
|
|
802
|
-
- **Use tool states for logic** - Separate concerns
|
|
803
|
-
- **Add step-specific guidelines** - Context-aware behavior
|
|
804
|
-
|
|
805
|
-
### ❌ Don'ts
|
|
806
|
-
|
|
807
|
-
- **Don't hardcode step IDs** - Let framework generate them
|
|
808
|
-
- **Don't skip validation** - Always validate with requires
|
|
809
|
-
- **Don't create circular loops** - Without exit conditions
|
|
810
|
-
- **Don't collect unrelated data** - One concept per step
|
|
811
|
-
- **Don't use vague conditions** - Be specific
|
|
812
|
-
- **Don't forget skipIf** - For pre-populated data
|
|
813
|
-
- **Don't mix chat and tool** - One type per step
|
|
814
|
-
|
|
815
|
-
---
|
|
816
|
-
|
|
817
|
-
## Troubleshooting
|
|
818
|
-
|
|
819
|
-
### Step Not Being Entered
|
|
820
|
-
|
|
821
|
-
```typescript
|
|
822
|
-
// ❌ Problem: Required data missing
|
|
823
|
-
const step = prev.nextStep({
|
|
824
|
-
instructions: "Do something",
|
|
825
|
-
requires: ["field1", "field2"], // Missing field2
|
|
826
|
-
});
|
|
827
|
-
|
|
828
|
-
// ✅ Solution: Ensure required data is collected first
|
|
829
|
-
const collectData = prev.nextStep({
|
|
830
|
-
instructions: "Collect data",
|
|
831
|
-
collect: ["field1", "field2"],
|
|
832
|
-
});
|
|
833
|
-
|
|
834
|
-
const step = collectData.nextStep({
|
|
835
|
-
instructions: "Do something",
|
|
836
|
-
requires: ["field1", "field2"], // Now available
|
|
837
|
-
});
|
|
838
|
-
```
|
|
839
|
-
|
|
840
|
-
### Step Always Skipped
|
|
841
|
-
|
|
842
|
-
```typescript
|
|
843
|
-
// ❌ Problem: skipIf always returns true
|
|
844
|
-
const step = prev.nextStep({
|
|
845
|
-
instructions: "Ask something",
|
|
846
|
-
skipIf: (data) => true, // Always skips!
|
|
847
|
-
});
|
|
848
|
-
|
|
849
|
-
// ✅ Solution: Use proper condition
|
|
850
|
-
const step = prev.nextStep({
|
|
851
|
-
instructions: "Ask something",
|
|
852
|
-
skipIf: (data) => !!data.field, // Only skip if field exists
|
|
853
|
-
});
|
|
854
|
-
```
|
|
855
|
-
|
|
856
|
-
### Data Not Being Collected
|
|
857
|
-
|
|
858
|
-
```typescript
|
|
859
|
-
// ❌ Problem: Forgot to specify collect
|
|
860
|
-
const step = prev.nextStep({
|
|
861
|
-
instructions: "What's your name?",
|
|
862
|
-
// Missing collect!
|
|
863
|
-
});
|
|
864
|
-
|
|
865
|
-
// ✅ Solution: Add collect fields
|
|
866
|
-
const step = prev.nextStep({
|
|
867
|
-
instructions: "What's your name?",
|
|
868
|
-
collect: ["firstName", "lastName"],
|
|
869
|
-
});
|
|
870
|
-
```
|
|
871
|
-
|
|
872
|
-
---
|
|
873
|
-
|
|
874
|
-
## See Also
|
|
875
|
-
|
|
876
|
-
- [Routes Guide](./ROUTES.md) - Understanding routes
|
|
877
|
-
- [API Reference - Step](./API_REFERENCE.md#step) - Complete API docs
|
|
878
|
-
- [Examples](../examples/) - Real-world implementations
|
|
879
|
-
- [Architecture Guide](./ARCHITECTURE.md) - System overview
|
|
880
|
-
|
|
881
|
-
---
|
|
882
|
-
|
|
883
|
-
**Made with ❤️ for the community**
|