@falai/agent 0.9.2 → 1.0.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 +281 -42
- package/dist/adapters/MemoryAdapter.d.ts.map +1 -0
- package/dist/adapters/MemoryAdapter.js.map +1 -0
- package/dist/adapters/MongoAdapter.d.ts.map +1 -0
- package/dist/adapters/MongoAdapter.js.map +1 -0
- package/dist/adapters/OpenSearchAdapter.d.ts.map +1 -0
- package/dist/adapters/OpenSearchAdapter.js.map +1 -0
- package/dist/adapters/PostgreSQLAdapter.d.ts.map +1 -0
- package/dist/adapters/PostgreSQLAdapter.js.map +1 -0
- package/dist/adapters/PrismaAdapter.d.ts.map +1 -0
- package/dist/{src/adapters → adapters}/PrismaAdapter.js +3 -2
- package/dist/adapters/PrismaAdapter.js.map +1 -0
- package/dist/adapters/RedisAdapter.d.ts.map +1 -0
- package/dist/{src/adapters → adapters}/RedisAdapter.js +3 -3
- package/dist/adapters/RedisAdapter.js.map +1 -0
- package/dist/adapters/SQLiteAdapter.d.ts.map +1 -0
- package/dist/adapters/SQLiteAdapter.js.map +1 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/cjs/adapters/MemoryAdapter.js.map +1 -0
- package/dist/cjs/adapters/MongoAdapter.js.map +1 -0
- package/dist/cjs/adapters/OpenSearchAdapter.js.map +1 -0
- package/dist/cjs/adapters/PostgreSQLAdapter.js.map +1 -0
- package/dist/{src → cjs}/adapters/PrismaAdapter.d.ts.map +1 -1
- package/dist/cjs/{src/adapters → adapters}/PrismaAdapter.js +3 -2
- package/dist/cjs/adapters/PrismaAdapter.js.map +1 -0
- package/dist/cjs/{src/adapters → adapters}/RedisAdapter.js +2 -2
- package/dist/cjs/adapters/RedisAdapter.js.map +1 -0
- package/dist/cjs/adapters/SQLiteAdapter.js.map +1 -0
- package/dist/cjs/adapters/index.js.map +1 -0
- package/dist/cjs/constants/index.js.map +1 -0
- package/dist/cjs/{src/core → core}/Agent.d.ts +16 -1
- package/dist/cjs/core/Agent.d.ts.map +1 -0
- package/dist/cjs/{src/core → core}/Agent.js +63 -2
- package/dist/cjs/core/Agent.js.map +1 -0
- package/dist/cjs/core/BatchExecutor.d.ts +353 -0
- package/dist/cjs/core/BatchExecutor.d.ts.map +1 -0
- package/dist/cjs/core/BatchExecutor.js +850 -0
- package/dist/cjs/core/BatchExecutor.js.map +1 -0
- package/dist/cjs/core/BatchPromptBuilder.d.ts +86 -0
- package/dist/cjs/core/BatchPromptBuilder.d.ts.map +1 -0
- package/dist/cjs/core/BatchPromptBuilder.js +217 -0
- package/dist/cjs/core/BatchPromptBuilder.js.map +1 -0
- package/dist/cjs/core/Events.js.map +1 -0
- package/dist/cjs/core/PersistenceManager.js.map +1 -0
- package/dist/{src → cjs}/core/PromptComposer.d.ts +1 -1
- package/dist/cjs/core/PromptComposer.d.ts.map +1 -0
- package/dist/cjs/{src/core → core}/PromptComposer.js +44 -7
- package/dist/cjs/core/PromptComposer.js.map +1 -0
- package/dist/{src → cjs}/core/ResponseEngine.d.ts.map +1 -1
- package/dist/cjs/core/ResponseEngine.js +211 -0
- package/dist/cjs/core/ResponseEngine.js.map +1 -0
- package/dist/{src → cjs}/core/ResponseModal.d.ts +45 -0
- package/dist/cjs/core/ResponseModal.d.ts.map +1 -0
- package/dist/cjs/{src/core → core}/ResponseModal.js +752 -74
- package/dist/cjs/core/ResponseModal.js.map +1 -0
- package/dist/{src → cjs}/core/ResponsePipeline.d.ts +2 -2
- package/dist/cjs/core/ResponsePipeline.d.ts.map +1 -0
- package/dist/cjs/{src/core → core}/ResponsePipeline.js +13 -6
- package/dist/cjs/core/ResponsePipeline.js.map +1 -0
- package/dist/{src → cjs}/core/Route.d.ts +34 -5
- package/dist/cjs/core/Route.d.ts.map +1 -0
- package/dist/cjs/{src/core → core}/Route.js +196 -19
- package/dist/cjs/core/Route.js.map +1 -0
- package/dist/cjs/{src/core → core}/RoutingEngine.d.ts +30 -5
- package/dist/cjs/core/RoutingEngine.d.ts.map +1 -0
- package/dist/cjs/{src/core → core}/RoutingEngine.js +330 -80
- package/dist/cjs/core/RoutingEngine.js.map +1 -0
- package/dist/cjs/core/SessionManager.js.map +1 -0
- package/dist/{src → cjs}/core/Step.d.ts +31 -10
- package/dist/cjs/core/Step.d.ts.map +1 -0
- package/dist/cjs/{src/core → core}/Step.js +105 -10
- package/dist/cjs/core/Step.js.map +1 -0
- package/dist/cjs/core/ToolManager.js.map +1 -0
- package/dist/{src → cjs}/index.d.ts +4 -1
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/{src/index.js → index.js} +12 -1
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/{src/providers → providers}/AnthropicProvider.js +18 -18
- package/dist/cjs/providers/AnthropicProvider.js.map +1 -0
- package/dist/{src → cjs}/providers/GeminiProvider.d.ts.map +1 -1
- package/dist/cjs/{src/providers → providers}/GeminiProvider.js +123 -51
- package/dist/cjs/providers/GeminiProvider.js.map +1 -0
- package/dist/cjs/{src/providers → providers}/OpenAIProvider.js +19 -19
- package/dist/cjs/providers/OpenAIProvider.js.map +1 -0
- package/dist/cjs/{src/providers → providers}/OpenRouterProvider.js +19 -19
- package/dist/cjs/providers/OpenRouterProvider.js.map +1 -0
- package/dist/cjs/providers/index.js.map +1 -0
- package/dist/cjs/{src/types → types}/agent.d.ts +15 -3
- package/dist/cjs/types/agent.d.ts.map +1 -0
- package/dist/cjs/types/agent.js.map +1 -0
- package/dist/{src → cjs}/types/ai.js.map +1 -1
- package/dist/cjs/types/history.js.map +1 -0
- package/dist/cjs/{src/types → types}/index.d.ts +2 -1
- package/dist/{src → cjs}/types/index.d.ts.map +1 -1
- package/dist/cjs/{src/types → types}/index.js +6 -1
- package/dist/cjs/types/index.js.map +1 -0
- package/dist/cjs/types/persistence.js.map +1 -0
- package/dist/cjs/{src/types → types}/route.d.ts +111 -12
- package/dist/cjs/types/route.d.ts.map +1 -0
- package/dist/cjs/{src/types → types}/route.js.map +1 -1
- package/dist/cjs/types/session.js.map +1 -0
- package/dist/cjs/types/template.d.ts +88 -0
- package/dist/cjs/types/template.d.ts.map +1 -0
- package/dist/cjs/types/tool.js.map +1 -0
- package/dist/cjs/utils/clone.js.map +1 -0
- package/dist/cjs/utils/condition.d.ts +38 -0
- package/dist/cjs/utils/condition.d.ts.map +1 -0
- package/dist/cjs/utils/condition.js +168 -0
- package/dist/cjs/utils/condition.js.map +1 -0
- package/dist/cjs/utils/event.js.map +1 -0
- package/dist/cjs/utils/history.js.map +1 -0
- package/dist/cjs/utils/id.js.map +1 -0
- package/dist/cjs/{src/utils → utils}/index.d.ts +3 -1
- package/dist/cjs/utils/index.d.ts.map +1 -0
- package/dist/cjs/{src/utils → utils}/index.js +12 -1
- package/dist/cjs/utils/index.js.map +1 -0
- package/dist/cjs/utils/json.d.ts +16 -0
- package/dist/cjs/utils/json.d.ts.map +1 -0
- package/dist/cjs/utils/json.js +47 -0
- package/dist/cjs/utils/json.js.map +1 -0
- package/dist/cjs/utils/logger.js.map +1 -0
- package/dist/{src → cjs}/utils/retry.d.ts +0 -3
- package/dist/cjs/utils/retry.d.ts.map +1 -0
- package/dist/cjs/{src/utils → utils}/retry.js +8 -7
- package/dist/cjs/utils/retry.js.map +1 -0
- package/dist/cjs/utils/session.js.map +1 -0
- package/dist/{src → cjs}/utils/template.d.ts +48 -0
- package/dist/cjs/utils/template.d.ts.map +1 -0
- package/dist/cjs/{src/utils → utils}/template.js +100 -0
- package/dist/cjs/utils/template.js.map +1 -0
- package/dist/constants/index.d.ts.map +1 -0
- package/dist/constants/index.js.map +1 -0
- package/dist/{src/core → core}/Agent.d.ts +16 -1
- package/dist/core/Agent.d.ts.map +1 -0
- package/dist/{src/core → core}/Agent.js +64 -3
- package/dist/core/Agent.js.map +1 -0
- package/dist/core/BatchExecutor.d.ts +353 -0
- package/dist/core/BatchExecutor.d.ts.map +1 -0
- package/dist/core/BatchExecutor.js +845 -0
- package/dist/core/BatchExecutor.js.map +1 -0
- package/dist/core/BatchPromptBuilder.d.ts +86 -0
- package/dist/core/BatchPromptBuilder.d.ts.map +1 -0
- package/dist/core/BatchPromptBuilder.js +213 -0
- package/dist/core/BatchPromptBuilder.js.map +1 -0
- package/dist/core/Events.d.ts.map +1 -0
- package/dist/core/Events.js.map +1 -0
- package/dist/core/PersistenceManager.d.ts.map +1 -0
- package/dist/core/PersistenceManager.js.map +1 -0
- package/dist/{cjs/src/core → core}/PromptComposer.d.ts +1 -1
- package/dist/core/PromptComposer.d.ts.map +1 -0
- package/dist/{src/core → core}/PromptComposer.js +45 -8
- package/dist/core/PromptComposer.js.map +1 -0
- package/dist/core/ResponseEngine.d.ts.map +1 -0
- package/dist/core/ResponseEngine.js +207 -0
- package/dist/core/ResponseEngine.js.map +1 -0
- package/dist/{cjs/src/core → core}/ResponseModal.d.ts +45 -0
- package/dist/core/ResponseModal.d.ts.map +1 -0
- package/dist/{src/core → core}/ResponseModal.js +752 -74
- package/dist/core/ResponseModal.js.map +1 -0
- package/dist/{cjs/src/core → core}/ResponsePipeline.d.ts +2 -2
- package/dist/core/ResponsePipeline.d.ts.map +1 -0
- package/dist/{src/core → core}/ResponsePipeline.js +13 -6
- package/dist/core/ResponsePipeline.js.map +1 -0
- package/dist/{cjs/src/core → core}/Route.d.ts +34 -5
- package/dist/core/Route.d.ts.map +1 -0
- package/dist/{src/core → core}/Route.js +195 -18
- package/dist/core/Route.js.map +1 -0
- package/dist/{src/core → core}/RoutingEngine.d.ts +30 -5
- package/dist/core/RoutingEngine.d.ts.map +1 -0
- package/dist/{src/core → core}/RoutingEngine.js +310 -60
- package/dist/core/RoutingEngine.js.map +1 -0
- package/dist/core/SessionManager.d.ts.map +1 -0
- package/dist/core/SessionManager.js.map +1 -0
- package/dist/{cjs/src/core → core}/Step.d.ts +31 -10
- package/dist/core/Step.d.ts.map +1 -0
- package/dist/{src/core → core}/Step.js +104 -9
- package/dist/core/Step.js.map +1 -0
- package/dist/core/ToolManager.d.ts.map +1 -0
- package/dist/core/ToolManager.js.map +1 -0
- package/dist/{cjs/src/index.d.ts → index.d.ts} +4 -1
- package/dist/index.d.ts.map +1 -0
- package/dist/{src/index.js → index.js} +3 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/AnthropicProvider.d.ts.map +1 -0
- package/dist/{src/providers → providers}/AnthropicProvider.js +17 -17
- package/dist/providers/AnthropicProvider.js.map +1 -0
- package/dist/providers/GeminiProvider.d.ts.map +1 -0
- package/dist/{src/providers → providers}/GeminiProvider.js +123 -51
- package/dist/providers/GeminiProvider.js.map +1 -0
- package/dist/providers/OpenAIProvider.d.ts.map +1 -0
- package/dist/{src/providers → providers}/OpenAIProvider.js +18 -18
- package/dist/providers/OpenAIProvider.js.map +1 -0
- package/dist/providers/OpenRouterProvider.d.ts.map +1 -0
- package/dist/{src/providers → providers}/OpenRouterProvider.js +18 -18
- package/dist/providers/OpenRouterProvider.js.map +1 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/{src/types → types}/agent.d.ts +15 -3
- package/dist/types/agent.d.ts.map +1 -0
- package/dist/types/agent.js.map +1 -0
- package/dist/types/ai.d.ts.map +1 -0
- package/dist/types/ai.js.map +1 -0
- package/dist/types/history.d.ts.map +1 -0
- package/dist/types/history.js.map +1 -0
- package/dist/{src/types → types}/index.d.ts +2 -1
- package/dist/types/index.d.ts.map +1 -0
- package/dist/{src/types → types}/index.js +1 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/persistence.d.ts.map +1 -0
- package/dist/types/persistence.js.map +1 -0
- package/dist/{src/types → types}/route.d.ts +111 -12
- package/dist/types/route.d.ts.map +1 -0
- package/dist/{src/types → types}/route.js.map +1 -1
- package/dist/types/routing.d.ts.map +1 -0
- package/dist/{cjs/src/types → types}/routing.js.map +1 -1
- package/dist/types/schema.d.ts.map +1 -0
- package/dist/{cjs/src/types → types}/schema.js.map +1 -1
- package/dist/types/session.d.ts.map +1 -0
- package/dist/{src/types → types}/session.js.map +1 -1
- package/dist/types/template.d.ts +88 -0
- package/dist/types/template.d.ts.map +1 -0
- package/dist/{cjs/src/types → types}/template.js.map +1 -1
- package/dist/types/tool.d.ts.map +1 -0
- package/dist/types/tool.js.map +1 -0
- package/dist/utils/clone.d.ts.map +1 -0
- package/dist/utils/clone.js.map +1 -0
- package/dist/utils/condition.d.ts +38 -0
- package/dist/utils/condition.d.ts.map +1 -0
- package/dist/utils/condition.js +161 -0
- package/dist/utils/condition.js.map +1 -0
- package/dist/utils/event.d.ts.map +1 -0
- package/dist/utils/event.js.map +1 -0
- package/dist/utils/history.d.ts.map +1 -0
- package/dist/utils/history.js.map +1 -0
- package/dist/utils/id.d.ts.map +1 -0
- package/dist/utils/id.js.map +1 -0
- package/dist/{src/utils → utils}/index.d.ts +3 -1
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/{src/utils → utils}/index.js +5 -1
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/json.d.ts +16 -0
- package/dist/utils/json.d.ts.map +1 -0
- package/dist/utils/json.js +43 -0
- package/dist/utils/json.js.map +1 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/{cjs/src/utils → utils}/retry.d.ts +0 -3
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/{src/utils → utils}/retry.js +5 -4
- package/dist/utils/retry.js.map +1 -0
- package/dist/utils/session.d.ts.map +1 -0
- package/dist/utils/session.js.map +1 -0
- package/dist/{cjs/src/utils → utils}/template.d.ts +48 -0
- package/dist/utils/template.d.ts.map +1 -0
- package/dist/{src/utils → utils}/template.js +98 -0
- package/dist/utils/template.js.map +1 -0
- package/docs/README.md +1 -0
- package/docs/api/README.md +237 -12
- package/docs/api/overview.md +206 -3
- package/docs/architecture/data-extraction-flow.md +363 -0
- package/docs/architecture/multi-step-execution.md +243 -0
- package/docs/core/agent/README.md +156 -5
- package/docs/core/agent/rules-and-prohibitions.md +113 -0
- package/docs/core/agent/session-management.md +1 -1
- package/docs/core/ai-integration/prompt-composition.md +135 -0
- package/docs/core/ai-integration/response-processing.md +146 -0
- package/docs/core/conversation-flows/data-collection.md +143 -0
- package/docs/core/conversation-flows/routes.md +2 -2
- package/docs/core/conversation-flows/step-transitions.md +132 -0
- package/docs/core/conversation-flows/steps.md +112 -0
- package/docs/core/error-handling.md +193 -0
- package/docs/core/routing/intelligent-routing.md +118 -0
- package/docs/guides/getting-started/README.md +284 -3
- package/docs/guides/migration/README.md +27 -0
- package/docs/guides/migration/flexible-routing-conditions.md +375 -0
- package/docs/guides/migration/multi-step-execution.md +373 -0
- package/examples/advanced-patterns/knowledge-based-agent.ts +101 -24
- package/examples/advanced-patterns/persistent-onboarding.ts +40 -5
- package/examples/advanced-patterns/route-lifecycle-hooks.ts +82 -12
- package/examples/advanced-patterns/streaming-responses.ts +2 -2
- package/examples/ai-providers/anthropic-integration.ts +4 -4
- package/examples/ai-providers/openai-integration.ts +1 -1
- package/examples/condition-patterns/function-only-conditions.ts +365 -0
- package/examples/condition-patterns/mixed-array-conditions.ts +477 -0
- package/examples/condition-patterns/route-skipif-patterns.ts +468 -0
- package/examples/condition-patterns/step-skipif-patterns.ts +0 -0
- package/examples/condition-patterns/string-only-conditions.ts +296 -0
- package/examples/conversation-flows/completion-transitions.ts +48 -7
- package/examples/core-concepts/basic-agent.ts +54 -33
- package/examples/core-concepts/schema-driven-extraction.ts +33 -9
- package/examples/core-concepts/session-management.ts +51 -16
- package/examples/integrations/database-integration.ts +6 -6
- package/examples/integrations/healthcare-integration.ts +10 -10
- package/examples/integrations/search-integration.ts +8 -8
- package/examples/integrations/server-session-management.ts +8 -8
- package/examples/persistence/database-persistence.ts +15 -15
- package/examples/persistence/memory-sessions.ts +3 -3
- package/examples/persistence/redis-persistence.ts +7 -9
- package/examples/tools/data-enrichment-tools.ts +4 -4
- package/package.json +6 -4
- package/src/adapters/PrismaAdapter.ts +3 -2
- package/src/adapters/RedisAdapter.ts +3 -3
- package/src/core/Agent.ts +78 -2
- package/src/core/BatchExecutor.ts +1166 -0
- package/src/core/BatchPromptBuilder.ts +293 -0
- package/src/core/PromptComposer.ts +53 -16
- package/src/core/ResponseEngine.ts +168 -29
- package/src/core/ResponseModal.ts +954 -74
- package/src/core/ResponsePipeline.ts +17 -9
- package/src/core/Route.ts +223 -22
- package/src/core/RoutingEngine.ts +426 -83
- package/src/core/Step.ts +144 -16
- package/src/index.ts +19 -0
- package/src/providers/AnthropicProvider.ts +17 -17
- package/src/providers/GeminiProvider.ts +129 -60
- package/src/providers/OpenAIProvider.ts +18 -18
- package/src/providers/OpenRouterProvider.ts +18 -18
- package/src/types/agent.ts +15 -3
- package/src/types/index.ts +12 -1
- package/src/types/route.ts +131 -12
- package/src/types/template.ts +70 -2
- package/src/utils/condition.ts +190 -0
- package/src/utils/index.ts +12 -0
- package/src/utils/json.ts +46 -0
- package/src/utils/retry.ts +5 -4
- package/src/utils/template.ts +109 -0
- package/dist/cjs/src/adapters/MemoryAdapter.d.ts.map +0 -1
- package/dist/cjs/src/adapters/MemoryAdapter.js.map +0 -1
- package/dist/cjs/src/adapters/MongoAdapter.d.ts.map +0 -1
- package/dist/cjs/src/adapters/MongoAdapter.js.map +0 -1
- package/dist/cjs/src/adapters/OpenSearchAdapter.d.ts.map +0 -1
- package/dist/cjs/src/adapters/OpenSearchAdapter.js.map +0 -1
- package/dist/cjs/src/adapters/PostgreSQLAdapter.d.ts.map +0 -1
- package/dist/cjs/src/adapters/PostgreSQLAdapter.js.map +0 -1
- package/dist/cjs/src/adapters/PrismaAdapter.d.ts.map +0 -1
- package/dist/cjs/src/adapters/PrismaAdapter.js.map +0 -1
- package/dist/cjs/src/adapters/RedisAdapter.d.ts.map +0 -1
- package/dist/cjs/src/adapters/RedisAdapter.js.map +0 -1
- package/dist/cjs/src/adapters/SQLiteAdapter.d.ts.map +0 -1
- package/dist/cjs/src/adapters/SQLiteAdapter.js.map +0 -1
- package/dist/cjs/src/adapters/index.d.ts.map +0 -1
- package/dist/cjs/src/adapters/index.js.map +0 -1
- package/dist/cjs/src/constants/index.d.ts.map +0 -1
- package/dist/cjs/src/constants/index.js.map +0 -1
- package/dist/cjs/src/core/Agent.d.ts.map +0 -1
- package/dist/cjs/src/core/Agent.js.map +0 -1
- package/dist/cjs/src/core/Events.d.ts.map +0 -1
- package/dist/cjs/src/core/Events.js.map +0 -1
- package/dist/cjs/src/core/PersistenceManager.d.ts.map +0 -1
- package/dist/cjs/src/core/PersistenceManager.js.map +0 -1
- package/dist/cjs/src/core/PromptComposer.d.ts.map +0 -1
- package/dist/cjs/src/core/PromptComposer.js.map +0 -1
- package/dist/cjs/src/core/ResponseEngine.d.ts.map +0 -1
- package/dist/cjs/src/core/ResponseEngine.js +0 -84
- package/dist/cjs/src/core/ResponseEngine.js.map +0 -1
- package/dist/cjs/src/core/ResponseModal.d.ts.map +0 -1
- package/dist/cjs/src/core/ResponseModal.js.map +0 -1
- package/dist/cjs/src/core/ResponsePipeline.d.ts.map +0 -1
- package/dist/cjs/src/core/ResponsePipeline.js.map +0 -1
- package/dist/cjs/src/core/Route.d.ts.map +0 -1
- package/dist/cjs/src/core/Route.js.map +0 -1
- package/dist/cjs/src/core/RoutingEngine.d.ts.map +0 -1
- package/dist/cjs/src/core/RoutingEngine.js.map +0 -1
- package/dist/cjs/src/core/SessionManager.d.ts.map +0 -1
- package/dist/cjs/src/core/SessionManager.js.map +0 -1
- package/dist/cjs/src/core/Step.d.ts.map +0 -1
- package/dist/cjs/src/core/Step.js.map +0 -1
- package/dist/cjs/src/core/ToolManager.d.ts.map +0 -1
- package/dist/cjs/src/core/ToolManager.js.map +0 -1
- package/dist/cjs/src/index.d.ts.map +0 -1
- package/dist/cjs/src/index.js.map +0 -1
- package/dist/cjs/src/providers/AnthropicProvider.d.ts.map +0 -1
- package/dist/cjs/src/providers/AnthropicProvider.js.map +0 -1
- package/dist/cjs/src/providers/GeminiProvider.d.ts.map +0 -1
- package/dist/cjs/src/providers/GeminiProvider.js.map +0 -1
- package/dist/cjs/src/providers/OpenAIProvider.d.ts.map +0 -1
- package/dist/cjs/src/providers/OpenAIProvider.js.map +0 -1
- package/dist/cjs/src/providers/OpenRouterProvider.d.ts.map +0 -1
- package/dist/cjs/src/providers/OpenRouterProvider.js.map +0 -1
- package/dist/cjs/src/providers/index.d.ts.map +0 -1
- package/dist/cjs/src/providers/index.js.map +0 -1
- package/dist/cjs/src/types/agent.d.ts.map +0 -1
- package/dist/cjs/src/types/agent.js.map +0 -1
- package/dist/cjs/src/types/ai.d.ts.map +0 -1
- package/dist/cjs/src/types/ai.js.map +0 -1
- package/dist/cjs/src/types/history.d.ts.map +0 -1
- package/dist/cjs/src/types/history.js.map +0 -1
- package/dist/cjs/src/types/index.d.ts.map +0 -1
- package/dist/cjs/src/types/index.js.map +0 -1
- package/dist/cjs/src/types/persistence.d.ts.map +0 -1
- package/dist/cjs/src/types/persistence.js.map +0 -1
- package/dist/cjs/src/types/route.d.ts.map +0 -1
- package/dist/cjs/src/types/routing.d.ts.map +0 -1
- package/dist/cjs/src/types/schema.d.ts.map +0 -1
- package/dist/cjs/src/types/session.d.ts.map +0 -1
- package/dist/cjs/src/types/session.js.map +0 -1
- package/dist/cjs/src/types/template.d.ts +0 -30
- package/dist/cjs/src/types/template.d.ts.map +0 -1
- package/dist/cjs/src/types/tool.d.ts.map +0 -1
- package/dist/cjs/src/types/tool.js.map +0 -1
- package/dist/cjs/src/utils/clone.d.ts.map +0 -1
- package/dist/cjs/src/utils/clone.js.map +0 -1
- package/dist/cjs/src/utils/event.d.ts.map +0 -1
- package/dist/cjs/src/utils/event.js.map +0 -1
- package/dist/cjs/src/utils/history.d.ts.map +0 -1
- package/dist/cjs/src/utils/history.js.map +0 -1
- package/dist/cjs/src/utils/id.d.ts.map +0 -1
- package/dist/cjs/src/utils/id.js.map +0 -1
- package/dist/cjs/src/utils/index.d.ts.map +0 -1
- package/dist/cjs/src/utils/index.js.map +0 -1
- package/dist/cjs/src/utils/logger.d.ts.map +0 -1
- package/dist/cjs/src/utils/logger.js.map +0 -1
- package/dist/cjs/src/utils/retry.d.ts.map +0 -1
- package/dist/cjs/src/utils/retry.js.map +0 -1
- package/dist/cjs/src/utils/session.d.ts.map +0 -1
- package/dist/cjs/src/utils/session.js.map +0 -1
- package/dist/cjs/src/utils/template.d.ts.map +0 -1
- package/dist/cjs/src/utils/template.js.map +0 -1
- package/dist/src/adapters/MemoryAdapter.js.map +0 -1
- package/dist/src/adapters/MongoAdapter.js.map +0 -1
- package/dist/src/adapters/OpenSearchAdapter.js.map +0 -1
- package/dist/src/adapters/PostgreSQLAdapter.js.map +0 -1
- package/dist/src/adapters/PrismaAdapter.js.map +0 -1
- package/dist/src/adapters/RedisAdapter.js.map +0 -1
- package/dist/src/adapters/SQLiteAdapter.js.map +0 -1
- package/dist/src/adapters/index.js.map +0 -1
- package/dist/src/constants/index.js.map +0 -1
- package/dist/src/core/Agent.d.ts.map +0 -1
- package/dist/src/core/Agent.js.map +0 -1
- package/dist/src/core/Events.js.map +0 -1
- package/dist/src/core/PersistenceManager.js.map +0 -1
- package/dist/src/core/PromptComposer.d.ts.map +0 -1
- package/dist/src/core/PromptComposer.js.map +0 -1
- package/dist/src/core/ResponseEngine.js +0 -80
- package/dist/src/core/ResponseEngine.js.map +0 -1
- package/dist/src/core/ResponseModal.d.ts.map +0 -1
- package/dist/src/core/ResponseModal.js.map +0 -1
- package/dist/src/core/ResponsePipeline.d.ts.map +0 -1
- package/dist/src/core/ResponsePipeline.js.map +0 -1
- package/dist/src/core/Route.d.ts.map +0 -1
- package/dist/src/core/Route.js.map +0 -1
- package/dist/src/core/RoutingEngine.d.ts.map +0 -1
- package/dist/src/core/RoutingEngine.js.map +0 -1
- package/dist/src/core/SessionManager.js.map +0 -1
- package/dist/src/core/Step.d.ts.map +0 -1
- package/dist/src/core/Step.js.map +0 -1
- package/dist/src/core/ToolManager.js.map +0 -1
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/index.js.map +0 -1
- package/dist/src/providers/AnthropicProvider.js.map +0 -1
- package/dist/src/providers/GeminiProvider.js.map +0 -1
- package/dist/src/providers/OpenAIProvider.js.map +0 -1
- package/dist/src/providers/OpenRouterProvider.js.map +0 -1
- package/dist/src/providers/index.js.map +0 -1
- package/dist/src/types/agent.d.ts.map +0 -1
- package/dist/src/types/agent.js.map +0 -1
- package/dist/src/types/history.js.map +0 -1
- package/dist/src/types/index.js.map +0 -1
- package/dist/src/types/persistence.js.map +0 -1
- package/dist/src/types/route.d.ts.map +0 -1
- package/dist/src/types/template.d.ts +0 -30
- package/dist/src/types/template.d.ts.map +0 -1
- package/dist/src/types/tool.js.map +0 -1
- package/dist/src/utils/clone.js.map +0 -1
- package/dist/src/utils/event.js.map +0 -1
- package/dist/src/utils/history.js.map +0 -1
- package/dist/src/utils/id.js.map +0 -1
- package/dist/src/utils/index.d.ts.map +0 -1
- package/dist/src/utils/index.js.map +0 -1
- package/dist/src/utils/logger.js.map +0 -1
- package/dist/src/utils/retry.d.ts.map +0 -1
- package/dist/src/utils/retry.js.map +0 -1
- package/dist/src/utils/session.js.map +0 -1
- package/dist/src/utils/template.d.ts.map +0 -1
- package/dist/src/utils/template.js.map +0 -1
- /package/dist/{cjs/src/adapters → adapters}/MemoryAdapter.d.ts +0 -0
- /package/dist/{src/adapters → adapters}/MemoryAdapter.js +0 -0
- /package/dist/{cjs/src/adapters → adapters}/MongoAdapter.d.ts +0 -0
- /package/dist/{src/adapters → adapters}/MongoAdapter.js +0 -0
- /package/dist/{cjs/src/adapters → adapters}/OpenSearchAdapter.d.ts +0 -0
- /package/dist/{src/adapters → adapters}/OpenSearchAdapter.js +0 -0
- /package/dist/{cjs/src/adapters → adapters}/PostgreSQLAdapter.d.ts +0 -0
- /package/dist/{src/adapters → adapters}/PostgreSQLAdapter.js +0 -0
- /package/dist/{cjs/src/adapters → adapters}/PrismaAdapter.d.ts +0 -0
- /package/dist/{cjs/src/adapters → adapters}/RedisAdapter.d.ts +0 -0
- /package/dist/{cjs/src/adapters → adapters}/SQLiteAdapter.d.ts +0 -0
- /package/dist/{src/adapters → adapters}/SQLiteAdapter.js +0 -0
- /package/dist/{cjs/src/adapters → adapters}/index.d.ts +0 -0
- /package/dist/{src/adapters → adapters}/index.js +0 -0
- /package/dist/{src → cjs}/adapters/MemoryAdapter.d.ts +0 -0
- /package/dist/{src → cjs}/adapters/MemoryAdapter.d.ts.map +0 -0
- /package/dist/cjs/{src/adapters → adapters}/MemoryAdapter.js +0 -0
- /package/dist/{src → cjs}/adapters/MongoAdapter.d.ts +0 -0
- /package/dist/{src → cjs}/adapters/MongoAdapter.d.ts.map +0 -0
- /package/dist/cjs/{src/adapters → adapters}/MongoAdapter.js +0 -0
- /package/dist/{src → cjs}/adapters/OpenSearchAdapter.d.ts +0 -0
- /package/dist/{src → cjs}/adapters/OpenSearchAdapter.d.ts.map +0 -0
- /package/dist/cjs/{src/adapters → adapters}/OpenSearchAdapter.js +0 -0
- /package/dist/{src → cjs}/adapters/PostgreSQLAdapter.d.ts +0 -0
- /package/dist/{src → cjs}/adapters/PostgreSQLAdapter.d.ts.map +0 -0
- /package/dist/cjs/{src/adapters → adapters}/PostgreSQLAdapter.js +0 -0
- /package/dist/{src → cjs}/adapters/PrismaAdapter.d.ts +0 -0
- /package/dist/{src → cjs}/adapters/RedisAdapter.d.ts +0 -0
- /package/dist/{src → cjs}/adapters/RedisAdapter.d.ts.map +0 -0
- /package/dist/{src → cjs}/adapters/SQLiteAdapter.d.ts +0 -0
- /package/dist/{src → cjs}/adapters/SQLiteAdapter.d.ts.map +0 -0
- /package/dist/cjs/{src/adapters → adapters}/SQLiteAdapter.js +0 -0
- /package/dist/{src → cjs}/adapters/index.d.ts +0 -0
- /package/dist/{src → cjs}/adapters/index.d.ts.map +0 -0
- /package/dist/cjs/{src/adapters → adapters}/index.js +0 -0
- /package/dist/cjs/{src/constants → constants}/index.d.ts +0 -0
- /package/dist/{src → cjs}/constants/index.d.ts.map +0 -0
- /package/dist/cjs/{src/constants → constants}/index.js +0 -0
- /package/dist/cjs/{src/core → core}/Events.d.ts +0 -0
- /package/dist/{src → cjs}/core/Events.d.ts.map +0 -0
- /package/dist/cjs/{src/core → core}/Events.js +0 -0
- /package/dist/cjs/{src/core → core}/PersistenceManager.d.ts +0 -0
- /package/dist/{src → cjs}/core/PersistenceManager.d.ts.map +0 -0
- /package/dist/cjs/{src/core → core}/PersistenceManager.js +0 -0
- /package/dist/cjs/{src/core → core}/ResponseEngine.d.ts +0 -0
- /package/dist/cjs/{src/core → core}/SessionManager.d.ts +0 -0
- /package/dist/{src → cjs}/core/SessionManager.d.ts.map +0 -0
- /package/dist/cjs/{src/core → core}/SessionManager.js +0 -0
- /package/dist/cjs/{src/core → core}/ToolManager.d.ts +0 -0
- /package/dist/{src → cjs}/core/ToolManager.d.ts.map +0 -0
- /package/dist/cjs/{src/core → core}/ToolManager.js +0 -0
- /package/dist/cjs/{src/providers → providers}/AnthropicProvider.d.ts +0 -0
- /package/dist/{src → cjs}/providers/AnthropicProvider.d.ts.map +0 -0
- /package/dist/cjs/{src/providers → providers}/GeminiProvider.d.ts +0 -0
- /package/dist/cjs/{src/providers → providers}/OpenAIProvider.d.ts +0 -0
- /package/dist/{src → cjs}/providers/OpenAIProvider.d.ts.map +0 -0
- /package/dist/cjs/{src/providers → providers}/OpenRouterProvider.d.ts +0 -0
- /package/dist/{src → cjs}/providers/OpenRouterProvider.d.ts.map +0 -0
- /package/dist/cjs/{src/providers → providers}/index.d.ts +0 -0
- /package/dist/{src → cjs}/providers/index.d.ts.map +0 -0
- /package/dist/cjs/{src/providers → providers}/index.js +0 -0
- /package/dist/cjs/{src/types → types}/agent.js +0 -0
- /package/dist/cjs/{src/types → types}/ai.d.ts +0 -0
- /package/dist/{src → cjs}/types/ai.d.ts.map +0 -0
- /package/dist/cjs/{src/types → types}/ai.js +0 -0
- /package/dist/cjs/{src/types → types}/history.d.ts +0 -0
- /package/dist/{src → cjs}/types/history.d.ts.map +0 -0
- /package/dist/cjs/{src/types → types}/history.js +0 -0
- /package/dist/cjs/{src/types → types}/persistence.d.ts +0 -0
- /package/dist/{src → cjs}/types/persistence.d.ts.map +0 -0
- /package/dist/cjs/{src/types → types}/persistence.js +0 -0
- /package/dist/cjs/{src/types → types}/route.js +0 -0
- /package/dist/cjs/{src/types → types}/routing.d.ts +0 -0
- /package/dist/{src → cjs}/types/routing.d.ts.map +0 -0
- /package/dist/cjs/{src/types → types}/routing.js +0 -0
- /package/dist/{src → cjs}/types/routing.js.map +0 -0
- /package/dist/cjs/{src/types → types}/schema.d.ts +0 -0
- /package/dist/{src → cjs}/types/schema.d.ts.map +0 -0
- /package/dist/cjs/{src/types → types}/schema.js +0 -0
- /package/dist/{src → cjs}/types/schema.js.map +0 -0
- /package/dist/cjs/{src/types → types}/session.d.ts +0 -0
- /package/dist/{src → cjs}/types/session.d.ts.map +0 -0
- /package/dist/cjs/{src/types → types}/session.js +0 -0
- /package/dist/cjs/{src/types → types}/template.js +0 -0
- /package/dist/{src → cjs}/types/template.js.map +0 -0
- /package/dist/cjs/{src/types → types}/tool.d.ts +0 -0
- /package/dist/{src → cjs}/types/tool.d.ts.map +0 -0
- /package/dist/cjs/{src/types → types}/tool.js +0 -0
- /package/dist/cjs/{src/utils → utils}/clone.d.ts +0 -0
- /package/dist/{src → cjs}/utils/clone.d.ts.map +0 -0
- /package/dist/cjs/{src/utils → utils}/clone.js +0 -0
- /package/dist/cjs/{src/utils → utils}/event.d.ts +0 -0
- /package/dist/{src → cjs}/utils/event.d.ts.map +0 -0
- /package/dist/cjs/{src/utils → utils}/event.js +0 -0
- /package/dist/cjs/{src/utils → utils}/history.d.ts +0 -0
- /package/dist/{src → cjs}/utils/history.d.ts.map +0 -0
- /package/dist/cjs/{src/utils → utils}/history.js +0 -0
- /package/dist/cjs/{src/utils → utils}/id.d.ts +0 -0
- /package/dist/{src → cjs}/utils/id.d.ts.map +0 -0
- /package/dist/cjs/{src/utils → utils}/id.js +0 -0
- /package/dist/cjs/{src/utils → utils}/logger.d.ts +0 -0
- /package/dist/{src → cjs}/utils/logger.d.ts.map +0 -0
- /package/dist/cjs/{src/utils → utils}/logger.js +0 -0
- /package/dist/cjs/{src/utils → utils}/session.d.ts +0 -0
- /package/dist/{src → cjs}/utils/session.d.ts.map +0 -0
- /package/dist/cjs/{src/utils → utils}/session.js +0 -0
- /package/dist/{src/constants → constants}/index.d.ts +0 -0
- /package/dist/{src/constants → constants}/index.js +0 -0
- /package/dist/{src/core → core}/Events.d.ts +0 -0
- /package/dist/{src/core → core}/Events.js +0 -0
- /package/dist/{src/core → core}/PersistenceManager.d.ts +0 -0
- /package/dist/{src/core → core}/PersistenceManager.js +0 -0
- /package/dist/{src/core → core}/ResponseEngine.d.ts +0 -0
- /package/dist/{src/core → core}/SessionManager.d.ts +0 -0
- /package/dist/{src/core → core}/SessionManager.js +0 -0
- /package/dist/{src/core → core}/ToolManager.d.ts +0 -0
- /package/dist/{src/core → core}/ToolManager.js +0 -0
- /package/dist/{src/providers → providers}/AnthropicProvider.d.ts +0 -0
- /package/dist/{src/providers → providers}/GeminiProvider.d.ts +0 -0
- /package/dist/{src/providers → providers}/OpenAIProvider.d.ts +0 -0
- /package/dist/{src/providers → providers}/OpenRouterProvider.d.ts +0 -0
- /package/dist/{src/providers → providers}/index.d.ts +0 -0
- /package/dist/{src/providers → providers}/index.js +0 -0
- /package/dist/{src/types → types}/agent.js +0 -0
- /package/dist/{src/types → types}/ai.d.ts +0 -0
- /package/dist/{src/types → types}/ai.js +0 -0
- /package/dist/{src/types → types}/history.d.ts +0 -0
- /package/dist/{src/types → types}/history.js +0 -0
- /package/dist/{src/types → types}/persistence.d.ts +0 -0
- /package/dist/{src/types → types}/persistence.js +0 -0
- /package/dist/{src/types → types}/route.js +0 -0
- /package/dist/{src/types → types}/routing.d.ts +0 -0
- /package/dist/{src/types → types}/routing.js +0 -0
- /package/dist/{src/types → types}/schema.d.ts +0 -0
- /package/dist/{src/types → types}/schema.js +0 -0
- /package/dist/{src/types → types}/session.d.ts +0 -0
- /package/dist/{src/types → types}/session.js +0 -0
- /package/dist/{src/types → types}/template.js +0 -0
- /package/dist/{src/types → types}/tool.d.ts +0 -0
- /package/dist/{src/types → types}/tool.js +0 -0
- /package/dist/{src/utils → utils}/clone.d.ts +0 -0
- /package/dist/{src/utils → utils}/clone.js +0 -0
- /package/dist/{src/utils → utils}/event.d.ts +0 -0
- /package/dist/{src/utils → utils}/event.js +0 -0
- /package/dist/{src/utils → utils}/history.d.ts +0 -0
- /package/dist/{src/utils → utils}/history.js +0 -0
- /package/dist/{src/utils → utils}/id.d.ts +0 -0
- /package/dist/{src/utils → utils}/id.js +0 -0
- /package/dist/{src/utils → utils}/logger.d.ts +0 -0
- /package/dist/{src/utils → utils}/logger.js +0 -0
- /package/dist/{src/utils → utils}/session.d.ts +0 -0
- /package/dist/{src/utils → utils}/session.js +0 -0
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
# Multi-Step Execution Migration Guide
|
|
2
|
+
|
|
3
|
+
This guide covers the behavioral changes from single-step to multi-step execution and provides migration guidance for existing routes.
|
|
4
|
+
|
|
5
|
+
## Breaking Changes in v1.0.0
|
|
6
|
+
|
|
7
|
+
### History API Simplified
|
|
8
|
+
|
|
9
|
+
The `createMessageEvent` and `EventSource` exports have been replaced with simpler helper functions:
|
|
10
|
+
|
|
11
|
+
**Before (v0.x):**
|
|
12
|
+
```typescript
|
|
13
|
+
import { createMessageEvent, EventSource } from "@falai/agent";
|
|
14
|
+
|
|
15
|
+
const history = [
|
|
16
|
+
createMessageEvent(EventSource.CUSTOMER, "Hello"),
|
|
17
|
+
createMessageEvent(EventSource.AI_AGENT, "Hi there!"),
|
|
18
|
+
];
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
**After (v1.0.0):**
|
|
22
|
+
```typescript
|
|
23
|
+
import { userMessage, assistantMessage } from "@falai/agent";
|
|
24
|
+
|
|
25
|
+
const history = [
|
|
26
|
+
userMessage("Hello"),
|
|
27
|
+
assistantMessage("Hi there!"),
|
|
28
|
+
];
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
The history is now a simple array of objects with `role` and `content` properties:
|
|
32
|
+
|
|
33
|
+
```typescript
|
|
34
|
+
// Available helper functions
|
|
35
|
+
import {
|
|
36
|
+
userMessage, // (content, name?) => { role: "user", content, name? }
|
|
37
|
+
assistantMessage, // (content, toolCalls?) => { role: "assistant", content, tool_calls? }
|
|
38
|
+
toolMessage, // (toolCallId, name, content) => { role: "tool", ... }
|
|
39
|
+
systemMessage, // (content) => { role: "system", content }
|
|
40
|
+
} from "@falai/agent";
|
|
41
|
+
|
|
42
|
+
// Or create history items directly
|
|
43
|
+
const history = [
|
|
44
|
+
{ role: "user", content: "Hello" },
|
|
45
|
+
{ role: "assistant", content: "Hi there!" },
|
|
46
|
+
];
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### StepOptions: `instructions` → `prompt`
|
|
50
|
+
|
|
51
|
+
The `instructions` property in `StepOptions` has been renamed to `prompt`:
|
|
52
|
+
|
|
53
|
+
**Before:**
|
|
54
|
+
```typescript
|
|
55
|
+
steps: [
|
|
56
|
+
{
|
|
57
|
+
id: "greeting",
|
|
58
|
+
instructions: "Greet the user warmly",
|
|
59
|
+
}
|
|
60
|
+
]
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
**After:**
|
|
64
|
+
```typescript
|
|
65
|
+
steps: [
|
|
66
|
+
{
|
|
67
|
+
id: "greeting",
|
|
68
|
+
prompt: "Greet the user warmly",
|
|
69
|
+
}
|
|
70
|
+
]
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Overview
|
|
76
|
+
|
|
77
|
+
Multi-step execution is a **major behavioral change** that allows multiple consecutive steps to execute in a single LLM call. While the public API shape remains compatible, the execution semantics differ from the previous single-step model.
|
|
78
|
+
|
|
79
|
+
## Key Behavioral Changes
|
|
80
|
+
|
|
81
|
+
### Before: Single-Step Execution
|
|
82
|
+
|
|
83
|
+
Previously, each `.respond()` call executed exactly one step:
|
|
84
|
+
|
|
85
|
+
```typescript
|
|
86
|
+
// Turn 1
|
|
87
|
+
const response1 = await agent.respond("Book Grand Hotel for 2 on Friday");
|
|
88
|
+
// Executes: ask-hotel step
|
|
89
|
+
// Response: "What date would you like to book?"
|
|
90
|
+
|
|
91
|
+
// Turn 2
|
|
92
|
+
const response2 = await agent.respond("Friday");
|
|
93
|
+
// Executes: ask-date step
|
|
94
|
+
// Response: "How many guests?"
|
|
95
|
+
|
|
96
|
+
// Turn 3
|
|
97
|
+
const response3 = await agent.respond("2 people");
|
|
98
|
+
// Executes: ask-guests step
|
|
99
|
+
// Response: "Booking confirmed!"
|
|
100
|
+
|
|
101
|
+
// Total: 3 LLM calls
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### After: Multi-Step Execution
|
|
105
|
+
|
|
106
|
+
Now, multiple steps can execute in a single call when data requirements are satisfied:
|
|
107
|
+
|
|
108
|
+
```typescript
|
|
109
|
+
// Turn 1
|
|
110
|
+
const response = await agent.respond("Book Grand Hotel for 2 on Friday");
|
|
111
|
+
// Pre-extraction captures: { hotel: "Grand Hotel", date: "Friday", guests: 2 }
|
|
112
|
+
// Executes: ask-hotel, ask-date, ask-guests steps (all in one batch)
|
|
113
|
+
// Response: "Booking confirmed for 2 guests at Grand Hotel on Friday!"
|
|
114
|
+
|
|
115
|
+
// Total: 1 LLM call
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## What Changed
|
|
119
|
+
|
|
120
|
+
| Aspect | Before | After |
|
|
121
|
+
|--------|--------|-------|
|
|
122
|
+
| Steps per call | Always 1 | 1 or more (batched) |
|
|
123
|
+
| LLM calls | One per step | One per batch |
|
|
124
|
+
| Pre-extraction | Per-step | Before batch determination |
|
|
125
|
+
| Response fields | Basic | Includes `executedSteps`, `stoppedReason` |
|
|
126
|
+
| Hook execution | Per-step | All prepare hooks, then LLM, then all finalize hooks |
|
|
127
|
+
|
|
128
|
+
## Migration Checklist
|
|
129
|
+
|
|
130
|
+
### 1. Review Hook Dependencies
|
|
131
|
+
|
|
132
|
+
If your hooks depend on being called between steps, they may need adjustment:
|
|
133
|
+
|
|
134
|
+
```typescript
|
|
135
|
+
// Before: Hooks called between each step
|
|
136
|
+
const step1 = {
|
|
137
|
+
finalize: async (ctx, data) => {
|
|
138
|
+
// This ran before step2's prepare
|
|
139
|
+
await saveProgress(data);
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
const step2 = {
|
|
144
|
+
prepare: async (ctx, data) => {
|
|
145
|
+
// This expected step1's finalize to have run
|
|
146
|
+
const progress = await loadProgress();
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
// After: All prepare hooks run first, then all finalize hooks
|
|
151
|
+
// If step1 and step2 are batched together:
|
|
152
|
+
// 1. step1.prepare runs
|
|
153
|
+
// 2. step2.prepare runs
|
|
154
|
+
// 3. LLM call
|
|
155
|
+
// 4. step1.finalize runs
|
|
156
|
+
// 5. step2.finalize runs
|
|
157
|
+
|
|
158
|
+
// Migration: Use session data instead of external state
|
|
159
|
+
const step1 = {
|
|
160
|
+
finalize: async (ctx, data) => {
|
|
161
|
+
// Store in session data, not external state
|
|
162
|
+
data.step1Complete = true;
|
|
163
|
+
}
|
|
164
|
+
};
|
|
165
|
+
|
|
166
|
+
const step2 = {
|
|
167
|
+
prepare: async (ctx, data) => {
|
|
168
|
+
// Check session data
|
|
169
|
+
if (!data.step1Complete) {
|
|
170
|
+
// Handle case where step1 hasn't finalized yet
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
};
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
### 2. Update Response Handling
|
|
177
|
+
|
|
178
|
+
Check for new response fields:
|
|
179
|
+
|
|
180
|
+
```typescript
|
|
181
|
+
// Before
|
|
182
|
+
const response = await agent.respond(message);
|
|
183
|
+
console.log(response.message);
|
|
184
|
+
console.log(response.isRouteComplete);
|
|
185
|
+
|
|
186
|
+
// After - additional fields available
|
|
187
|
+
const response = await agent.respond(message);
|
|
188
|
+
console.log(response.message);
|
|
189
|
+
console.log(response.isRouteComplete);
|
|
190
|
+
console.log(response.executedSteps); // NEW: Array of executed steps
|
|
191
|
+
console.log(response.stoppedReason); // NEW: Why execution stopped
|
|
192
|
+
console.log(response.error); // NEW: Error details if any
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
### 3. Review SkipIf Conditions
|
|
196
|
+
|
|
197
|
+
SkipIf conditions now affect batch determination:
|
|
198
|
+
|
|
199
|
+
```typescript
|
|
200
|
+
// Before: skipIf evaluated when entering step
|
|
201
|
+
const step = {
|
|
202
|
+
skipIf: (data) => {
|
|
203
|
+
// Called when transitioning to this step
|
|
204
|
+
return data.alreadyHaveInfo;
|
|
205
|
+
}
|
|
206
|
+
};
|
|
207
|
+
|
|
208
|
+
// After: skipIf evaluated during batch determination
|
|
209
|
+
// If skipIf returns true, step is skipped and next step is evaluated
|
|
210
|
+
// If skipIf throws, step is treated as non-skippable (included in batch)
|
|
211
|
+
|
|
212
|
+
// Migration: Ensure skipIf is pure and doesn't have side effects
|
|
213
|
+
const step = {
|
|
214
|
+
skipIf: (data) => {
|
|
215
|
+
// GOOD: Pure function
|
|
216
|
+
return data.alreadyHaveInfo;
|
|
217
|
+
}
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
// AVOID: Side effects in skipIf
|
|
221
|
+
const badStep = {
|
|
222
|
+
skipIf: (data) => {
|
|
223
|
+
// BAD: Side effect
|
|
224
|
+
logSkipCheck(data);
|
|
225
|
+
return data.alreadyHaveInfo;
|
|
226
|
+
}
|
|
227
|
+
};
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
### 4. Handle Partial Execution
|
|
231
|
+
|
|
232
|
+
Errors may leave partial progress:
|
|
233
|
+
|
|
234
|
+
```typescript
|
|
235
|
+
// Before: Single step, all or nothing
|
|
236
|
+
|
|
237
|
+
// After: Batch may partially complete
|
|
238
|
+
const response = await agent.respond(message);
|
|
239
|
+
|
|
240
|
+
if (response.stoppedReason === 'prepare_error') {
|
|
241
|
+
// Some steps may have executed before the error
|
|
242
|
+
console.log("Executed before error:", response.executedSteps);
|
|
243
|
+
console.log("Error details:", response.error);
|
|
244
|
+
}
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
### 5. Update Tests
|
|
248
|
+
|
|
249
|
+
Tests expecting single-step behavior need updates:
|
|
250
|
+
|
|
251
|
+
```typescript
|
|
252
|
+
// Before
|
|
253
|
+
test("collects hotel name", async () => {
|
|
254
|
+
const response = await agent.respond("Book Grand Hotel");
|
|
255
|
+
expect(response.session.data.hotel).toBe("Grand Hotel");
|
|
256
|
+
// Assumed only hotel step executed
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
// After
|
|
260
|
+
test("collects hotel name", async () => {
|
|
261
|
+
const response = await agent.respond("Book Grand Hotel");
|
|
262
|
+
expect(response.session.data.hotel).toBe("Grand Hotel");
|
|
263
|
+
|
|
264
|
+
// Check which steps actually executed
|
|
265
|
+
expect(response.executedSteps).toContainEqual(
|
|
266
|
+
expect.objectContaining({ id: "ask-hotel" })
|
|
267
|
+
);
|
|
268
|
+
|
|
269
|
+
// May have executed more steps if data was available
|
|
270
|
+
expect(response.stoppedReason).toBe("needs_input");
|
|
271
|
+
});
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
## Before/After Examples
|
|
275
|
+
|
|
276
|
+
### Example 1: Simple Booking Flow
|
|
277
|
+
|
|
278
|
+
**Before (3 turns):**
|
|
279
|
+
```
|
|
280
|
+
User: "I want to book a hotel"
|
|
281
|
+
Bot: "Which hotel would you like?"
|
|
282
|
+
User: "Grand Hotel"
|
|
283
|
+
Bot: "What date?"
|
|
284
|
+
User: "Friday"
|
|
285
|
+
Bot: "Booking confirmed!"
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
**After (potentially 1-2 turns):**
|
|
289
|
+
```
|
|
290
|
+
User: "I want to book Grand Hotel for Friday"
|
|
291
|
+
Bot: "Booking confirmed for Grand Hotel on Friday!"
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
### Example 2: Partial Information
|
|
295
|
+
|
|
296
|
+
**Before:**
|
|
297
|
+
```
|
|
298
|
+
User: "Book Grand Hotel"
|
|
299
|
+
Bot: "What date?" (only hotel step executed)
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
**After:**
|
|
303
|
+
```
|
|
304
|
+
User: "Book Grand Hotel"
|
|
305
|
+
Bot: "What date?" (hotel step executed, stopped at date step)
|
|
306
|
+
// response.executedSteps = [{ id: "ask-hotel" }]
|
|
307
|
+
// response.stoppedReason = "needs_input"
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
### Example 3: With SkipIf Conditions
|
|
311
|
+
|
|
312
|
+
**Before:**
|
|
313
|
+
```typescript
|
|
314
|
+
// Each step evaluated individually
|
|
315
|
+
const step1 = { skipIf: (d) => !!d.name }; // Skipped if name exists
|
|
316
|
+
const step2 = { skipIf: (d) => !!d.email }; // Skipped if email exists
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
**After:**
|
|
320
|
+
```typescript
|
|
321
|
+
// All skipIf conditions evaluated during batch determination
|
|
322
|
+
// If user provides "I'm John, john@example.com":
|
|
323
|
+
// - Pre-extraction: { name: "John", email: "john@example.com" }
|
|
324
|
+
// - step1 skipIf: true (skipped)
|
|
325
|
+
// - step2 skipIf: true (skipped)
|
|
326
|
+
// - Both steps skipped, route may complete immediately
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
## Opting Out of Batching
|
|
330
|
+
|
|
331
|
+
If you need single-step behavior for specific steps, use `requires` to create dependencies:
|
|
332
|
+
|
|
333
|
+
```typescript
|
|
334
|
+
// Force step2 to wait for step1's data
|
|
335
|
+
const step1 = {
|
|
336
|
+
collect: ["name"],
|
|
337
|
+
};
|
|
338
|
+
|
|
339
|
+
const step2 = {
|
|
340
|
+
collect: ["email"],
|
|
341
|
+
requires: ["name"], // Won't batch with step1
|
|
342
|
+
};
|
|
343
|
+
|
|
344
|
+
// Now step2 will only execute after step1 completes
|
|
345
|
+
// (in a separate batch/LLM call)
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
## Debugging Migration Issues
|
|
349
|
+
|
|
350
|
+
Enable debug mode to see batch behavior:
|
|
351
|
+
|
|
352
|
+
```typescript
|
|
353
|
+
const agent = new Agent({
|
|
354
|
+
debug: true,
|
|
355
|
+
// ...
|
|
356
|
+
});
|
|
357
|
+
|
|
358
|
+
// Logs will show:
|
|
359
|
+
// [BatchExecutor] Starting batch determination...
|
|
360
|
+
// [BatchExecutor] Including step ask-hotel in batch
|
|
361
|
+
// [BatchExecutor] Step ask-date needs input, stopping batch
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
## Summary
|
|
365
|
+
|
|
366
|
+
1. **Multiple steps can now execute together** - reducing LLM calls
|
|
367
|
+
2. **Pre-extraction happens before batch determination** - maximizing batching
|
|
368
|
+
3. **New response fields** - `executedSteps`, `stoppedReason`, `error`
|
|
369
|
+
4. **Hook execution order changed** - all prepare, then LLM, then all finalize
|
|
370
|
+
5. **SkipIf affects batching** - evaluated during batch determination
|
|
371
|
+
6. **Partial progress preserved** - on errors, completed steps are retained
|
|
372
|
+
|
|
373
|
+
The changes improve efficiency and UX while maintaining API compatibility. Most existing code will work without changes, but reviewing hook dependencies and test expectations is recommended.
|
|
@@ -8,6 +8,12 @@
|
|
|
8
8
|
* 3. Session step management even for stepless conversations
|
|
9
9
|
* 4. Always-on routing with context awareness
|
|
10
10
|
* 5. Three-phase pipeline: PREPARATION → ROUTING → RESPONSE
|
|
11
|
+
* 6. NEW: Complex ConditionTemplate patterns for intelligent routing:
|
|
12
|
+
* - Mixed conditions: ["AI context", (ctx) => programmatic_check]
|
|
13
|
+
* - Route skipIf: Dynamic route exclusion based on message content
|
|
14
|
+
* - Function-only conditions: (ctx) => sophisticated_logic
|
|
15
|
+
* - String-only conditions: "simple AI context"
|
|
16
|
+
* - Fallback routing with programmatic logic
|
|
11
17
|
*/
|
|
12
18
|
|
|
13
19
|
import {
|
|
@@ -119,7 +125,7 @@ const searchKnowledgeTool: Tool<CompanyContext, UnifiedData> = {
|
|
|
119
125
|
).message.toLowerCase();
|
|
120
126
|
|
|
121
127
|
// Simple keyword matching (in real app, use vector search)
|
|
122
|
-
const relevantFaqs =
|
|
128
|
+
const relevantFaqs = toolContext.context.faqs.filter(
|
|
123
129
|
(faq) =>
|
|
124
130
|
faq.question.toLowerCase().includes(query) ||
|
|
125
131
|
faq.answer.toLowerCase().includes(query)
|
|
@@ -262,12 +268,25 @@ const agent = new Agent<CompanyContext, UnifiedData>({
|
|
|
262
268
|
agent.createRoute({
|
|
263
269
|
title: "Company Information",
|
|
264
270
|
description: "Answer general questions about Acme Corp",
|
|
265
|
-
|
|
271
|
+
// Mixed condition: AI context + programmatic validation
|
|
272
|
+
when: [
|
|
266
273
|
"User asks about the company",
|
|
267
274
|
"Questions about company history, size, location",
|
|
268
275
|
"When was the company founded",
|
|
269
276
|
"How many employees",
|
|
270
277
|
"Where is the headquarters",
|
|
278
|
+
(ctx) => {
|
|
279
|
+
const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
|
|
280
|
+
return message.includes('company') || message.includes('acme') || message.includes('founded');
|
|
281
|
+
}
|
|
282
|
+
],
|
|
283
|
+
// Skip if user is asking about specific products instead
|
|
284
|
+
skipIf: [
|
|
285
|
+
"user is asking about specific products or services",
|
|
286
|
+
(ctx) => {
|
|
287
|
+
const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
|
|
288
|
+
return message.includes('widget') || message.includes('gadget') || message.includes('product');
|
|
289
|
+
}
|
|
271
290
|
],
|
|
272
291
|
// Route-specific knowledge base for company information
|
|
273
292
|
knowledgeBase: {
|
|
@@ -299,12 +318,18 @@ agent.createRoute({
|
|
|
299
318
|
agent.createRoute({
|
|
300
319
|
title: "Product Information",
|
|
301
320
|
description: "Answer questions about products",
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
321
|
+
// Function-only condition for programmatic logic
|
|
322
|
+
when: (ctx) => {
|
|
323
|
+
const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
|
|
324
|
+
return message.includes('product') || message.includes('widget') ||
|
|
325
|
+
message.includes('gadget') || message.includes('price') ||
|
|
326
|
+
message.includes('feature');
|
|
327
|
+
},
|
|
328
|
+
// Skip if user is asking about company policies instead
|
|
329
|
+
skipIf: (ctx) => {
|
|
330
|
+
const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
|
|
331
|
+
return message.includes('policy') || message.includes('return') || message.includes('warranty');
|
|
332
|
+
},
|
|
308
333
|
// NO schema - just answering questions
|
|
309
334
|
});
|
|
310
335
|
|
|
@@ -315,11 +340,25 @@ agent.createRoute({
|
|
|
315
340
|
agent.createRoute({
|
|
316
341
|
title: "Policy Information",
|
|
317
342
|
description: "Answer questions about company policies",
|
|
318
|
-
|
|
343
|
+
// Mixed condition: AI context + programmatic check
|
|
344
|
+
when: [
|
|
319
345
|
"User asks about policies",
|
|
320
346
|
"Return policy",
|
|
321
|
-
"Shipping information",
|
|
347
|
+
"Shipping information",
|
|
322
348
|
"Warranty questions",
|
|
349
|
+
(ctx) => {
|
|
350
|
+
const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
|
|
351
|
+
return message.includes('policy') || message.includes('return') ||
|
|
352
|
+
message.includes('shipping') || message.includes('warranty');
|
|
353
|
+
}
|
|
354
|
+
],
|
|
355
|
+
// Skip if user is asking about news or updates
|
|
356
|
+
skipIf: [
|
|
357
|
+
"user wants latest news or updates",
|
|
358
|
+
(ctx) => {
|
|
359
|
+
const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
|
|
360
|
+
return message.includes('news') || message.includes('update') || message.includes('new');
|
|
361
|
+
}
|
|
323
362
|
],
|
|
324
363
|
// NO schema
|
|
325
364
|
});
|
|
@@ -330,12 +369,13 @@ agent.createRoute({
|
|
|
330
369
|
const newsRoute = agent.createRoute({
|
|
331
370
|
title: "Company News",
|
|
332
371
|
description: "Share latest company news and updates",
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
372
|
+
// String-only condition for AI context
|
|
373
|
+
when: "User asks about news, updates, or recent announcements",
|
|
374
|
+
// Skip if user is asking about general FAQ topics
|
|
375
|
+
skipIf: (ctx) => {
|
|
376
|
+
const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
|
|
377
|
+
return message.includes('how do i') || message.includes('can i') || message.includes('is there');
|
|
378
|
+
},
|
|
339
379
|
});
|
|
340
380
|
|
|
341
381
|
// Add tool to initial step to fetch news
|
|
@@ -351,11 +391,25 @@ fetchNews.nextStep({
|
|
|
351
391
|
const faqRoute = agent.createRoute({
|
|
352
392
|
title: "FAQ Search",
|
|
353
393
|
description: "Search FAQs for relevant answers",
|
|
354
|
-
|
|
394
|
+
// Mixed condition: AI context + programmatic pattern matching
|
|
395
|
+
when: [
|
|
355
396
|
"User has a question that might be in FAQs",
|
|
356
397
|
"How do I...",
|
|
357
398
|
"Can I...",
|
|
358
399
|
"Is there...",
|
|
400
|
+
(ctx) => {
|
|
401
|
+
const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
|
|
402
|
+
return message.startsWith('how ') || message.startsWith('can ') ||
|
|
403
|
+
message.startsWith('is ') || message.includes('?');
|
|
404
|
+
}
|
|
405
|
+
],
|
|
406
|
+
// Skip if user is clearly asking for news or company info
|
|
407
|
+
skipIf: [
|
|
408
|
+
"user wants company news or general company information",
|
|
409
|
+
(ctx) => {
|
|
410
|
+
const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
|
|
411
|
+
return message.includes('news') || message.includes('company') || message.includes('founded');
|
|
412
|
+
}
|
|
359
413
|
],
|
|
360
414
|
});
|
|
361
415
|
|
|
@@ -372,12 +426,15 @@ searchFaqs.nextStep({
|
|
|
372
426
|
agent.createRoute({
|
|
373
427
|
title: "General Conversation",
|
|
374
428
|
description: "Handle general conversation or unclear questions",
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
429
|
+
// Function-only condition for fallback logic
|
|
430
|
+
when: (ctx) => {
|
|
431
|
+
// This route catches everything that doesn't match other routes
|
|
432
|
+
const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
|
|
433
|
+
return !message.includes('product') && !message.includes('policy') &&
|
|
434
|
+
!message.includes('news') && !message.includes('company');
|
|
435
|
+
},
|
|
436
|
+
// Never skip the fallback route
|
|
437
|
+
skipIf: ()=>false,
|
|
381
438
|
});
|
|
382
439
|
|
|
383
440
|
// Initial step is enough for fallback conversations
|
|
@@ -386,7 +443,27 @@ agent.createRoute({
|
|
|
386
443
|
const feedbackRoute = agent.createRoute({
|
|
387
444
|
title: "Collect Feedback",
|
|
388
445
|
description: "Collect user feedback about their experience",
|
|
389
|
-
|
|
446
|
+
// Mixed condition: AI context + sentiment analysis
|
|
447
|
+
when: [
|
|
448
|
+
"User wants to leave feedback",
|
|
449
|
+
"User seems satisfied or upset",
|
|
450
|
+
(ctx) => {
|
|
451
|
+
const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
|
|
452
|
+
return message.includes('feedback') || message.includes('review') ||
|
|
453
|
+
message.includes('satisfied') || message.includes('disappointed');
|
|
454
|
+
}
|
|
455
|
+
],
|
|
456
|
+
// Skip if user is in the middle of another task
|
|
457
|
+
skipIf: [
|
|
458
|
+
"user is actively getting help with something else",
|
|
459
|
+
(ctx) => {
|
|
460
|
+
const recentMessages = ctx.history?.filter((m) => "content" in m).slice(-3) || [];
|
|
461
|
+
return recentMessages.some(msg =>
|
|
462
|
+
(msg.content as string)?.toLowerCase().includes('help') ||
|
|
463
|
+
(msg.content as string)?.toLowerCase().includes('problem')
|
|
464
|
+
);
|
|
465
|
+
}
|
|
466
|
+
],
|
|
390
467
|
// NEW: Required fields for route completion
|
|
391
468
|
requiredFields: ["rating", "comments"],
|
|
392
469
|
// NEW: Optional fields
|
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Persistent multi-turn onboarding agent example
|
|
3
3
|
* Updated for v2 architecture with session step management and schema-first data extraction
|
|
4
|
+
*
|
|
5
|
+
* NEW: Enhanced with flexible ConditionTemplate patterns:
|
|
6
|
+
* - Mixed route conditions: ["AI context", (ctx) => state_check]
|
|
7
|
+
* - Route skipIf: Skip if onboarding already complete
|
|
8
|
+
* - Step skipIf: Enhanced conditional step skipping with AI context
|
|
9
|
+
* - Programmatic when conditions: (ctx) => data_validation
|
|
10
|
+
* - Performance patterns for condition evaluation
|
|
4
11
|
*/
|
|
5
12
|
|
|
6
13
|
import {
|
|
@@ -327,7 +334,24 @@ function createPersistentOnboardingAgent(sessionId: string) {
|
|
|
327
334
|
const onboardingRoute = agent.createRoute({
|
|
328
335
|
title: "Business Onboarding",
|
|
329
336
|
description: "Guide user through business information collection",
|
|
330
|
-
|
|
337
|
+
// Mixed condition: AI context + programmatic validation
|
|
338
|
+
when: [
|
|
339
|
+
"User is onboarding their business",
|
|
340
|
+
(ctx) => {
|
|
341
|
+
const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
|
|
342
|
+
return message.includes('onboard') || message.includes('register') ||
|
|
343
|
+
message.includes('business') || message.includes('start');
|
|
344
|
+
}
|
|
345
|
+
],
|
|
346
|
+
// Skip if user already has complete business info
|
|
347
|
+
skipIf: [
|
|
348
|
+
"business information already complete",
|
|
349
|
+
(ctx) => {
|
|
350
|
+
const data = ctx.data;
|
|
351
|
+
return !!(data?.businessName && data?.businessDescription &&
|
|
352
|
+
data?.industry && data?.contactEmail);
|
|
353
|
+
}
|
|
354
|
+
],
|
|
331
355
|
// NEW: Required fields for route completion
|
|
332
356
|
requiredFields: ["businessName", "businessDescription"],
|
|
333
357
|
// NEW: Optional fields that enhance the experience
|
|
@@ -342,7 +366,12 @@ function createPersistentOnboardingAgent(sessionId: string) {
|
|
|
342
366
|
const collectBusinessInfo = onboardingRoute.initialStep.nextStep({
|
|
343
367
|
prompt: "Ask for business name and a brief description",
|
|
344
368
|
collect: ["businessName", "businessDescription"],
|
|
345
|
-
skipIf:
|
|
369
|
+
// Mixed skipIf: AI context + programmatic check
|
|
370
|
+
skipIf: [
|
|
371
|
+
"business name and description already provided",
|
|
372
|
+
(ctx) => !!ctx.data?.businessName && !!ctx.data.businessDescription
|
|
373
|
+
],
|
|
374
|
+
// String-only when condition for AI context
|
|
346
375
|
when: "Need to collect basic business information first",
|
|
347
376
|
});
|
|
348
377
|
|
|
@@ -350,14 +379,19 @@ function createPersistentOnboardingAgent(sessionId: string) {
|
|
|
350
379
|
const saveBusiness = collectBusinessInfo.nextStep({
|
|
351
380
|
tools: [saveBusinessInfo],
|
|
352
381
|
requires: ["businessName", "businessDescription"],
|
|
353
|
-
|
|
382
|
+
// Function-only when condition for programmatic logic
|
|
383
|
+
when: (ctx) => !!ctx.data?.businessName && !!ctx.data?.businessDescription,
|
|
354
384
|
});
|
|
355
385
|
|
|
356
386
|
// Step 3: Collect industry
|
|
357
387
|
const collectIndustry = saveBusiness.nextStep({
|
|
358
388
|
prompt: "Ask what industry the business operates in",
|
|
359
389
|
collect: ["industry"],
|
|
360
|
-
skipIf:
|
|
390
|
+
// Mixed skipIf: AI context + programmatic logic
|
|
391
|
+
skipIf: [
|
|
392
|
+
"industry already specified",
|
|
393
|
+
(ctx) => !!ctx.data?.industry
|
|
394
|
+
],
|
|
361
395
|
});
|
|
362
396
|
|
|
363
397
|
// Step 4: Save industry (tool execution)
|
|
@@ -370,7 +404,8 @@ function createPersistentOnboardingAgent(sessionId: string) {
|
|
|
370
404
|
const collectContact = saveIndustryStep.nextStep({
|
|
371
405
|
prompt: "Ask for their contact email",
|
|
372
406
|
collect: ["contactEmail"],
|
|
373
|
-
skipIf
|
|
407
|
+
// Function-only skipIf for programmatic check
|
|
408
|
+
skipIf: (ctx) => !!ctx.data?.contactEmail,
|
|
374
409
|
});
|
|
375
410
|
|
|
376
411
|
// Step 6: Save contact (tool execution)
|