@falai/agent 0.9.2 → 1.0.0
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 +262 -38
- 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 +6 -1
- package/dist/cjs/core/Agent.d.ts.map +1 -0
- package/dist/cjs/{src/core → core}/Agent.js +42 -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 +842 -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 +201 -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 +202 -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 +686 -66
- 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 +11 -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 +6 -1
- package/dist/core/Agent.d.ts.map +1 -0
- package/dist/{src/core → core}/Agent.js +43 -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 +837 -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 +197 -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 +198 -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 +686 -66
- 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 +11 -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/api/README.md +221 -12
- package/docs/api/overview.md +202 -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 +120 -5
- 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 +23 -0
- package/docs/guides/migration/flexible-routing-conditions.md +375 -0
- package/docs/guides/migration/multi-step-execution.md +303 -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 +54 -2
- package/src/core/BatchExecutor.ts +1156 -0
- package/src/core/BatchPromptBuilder.ts +275 -0
- package/src/core/PromptComposer.ts +53 -16
- package/src/core/ResponseEngine.ts +143 -4
- package/src/core/ResponseModal.ts +888 -66
- 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 +11 -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,375 @@
|
|
|
1
|
+
# Migration Guide: Flexible Routing Conditions
|
|
2
|
+
|
|
3
|
+
This guide helps you migrate from the previous routing condition system to the new `ConditionTemplate` system introduced in version X.X.X.
|
|
4
|
+
|
|
5
|
+
## Overview of Changes
|
|
6
|
+
|
|
7
|
+
The routing system has been enhanced with a new `ConditionTemplate` type that supports:
|
|
8
|
+
|
|
9
|
+
- **String conditions**: AI context for routing decisions
|
|
10
|
+
- **Function conditions**: Programmatic boolean evaluation
|
|
11
|
+
- **Array conditions**: Mix of strings and functions with logical operators
|
|
12
|
+
- **Route skipIf**: New functionality to exclude routes dynamically
|
|
13
|
+
- **Enhanced Step conditions**: More flexible step control
|
|
14
|
+
|
|
15
|
+
## Breaking Changes
|
|
16
|
+
|
|
17
|
+
### 1. Route Conditions → Route When
|
|
18
|
+
|
|
19
|
+
**Before:**
|
|
20
|
+
```typescript
|
|
21
|
+
agent.createRoute({
|
|
22
|
+
title: "Customer Support",
|
|
23
|
+
conditions: ["User needs help", "User asks questions"],
|
|
24
|
+
// ...
|
|
25
|
+
});
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
**After:**
|
|
29
|
+
```typescript
|
|
30
|
+
agent.createRoute({
|
|
31
|
+
title: "Customer Support",
|
|
32
|
+
when: ["User needs help", "User asks questions"], // Renamed from 'conditions'
|
|
33
|
+
// ...
|
|
34
|
+
});
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
**Migration:** Simply rename `conditions` to `when` in all route definitions.
|
|
38
|
+
|
|
39
|
+
### 2. Step When Conditions
|
|
40
|
+
|
|
41
|
+
**Before:**
|
|
42
|
+
```typescript
|
|
43
|
+
// String-based when condition
|
|
44
|
+
step.nextStep({
|
|
45
|
+
when: "User wants to continue",
|
|
46
|
+
prompt: "Let's continue..."
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
// Function-based when condition (returned string)
|
|
50
|
+
step.nextStep({
|
|
51
|
+
when: (ctx) => ctx.data?.readyToContinue ? "Ready to proceed" : null,
|
|
52
|
+
prompt: "Let's continue..."
|
|
53
|
+
});
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
**After:**
|
|
57
|
+
```typescript
|
|
58
|
+
// String-based when condition (unchanged)
|
|
59
|
+
step.nextStep({
|
|
60
|
+
when: "User wants to continue",
|
|
61
|
+
prompt: "Let's continue..."
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
// Function-based when condition (now returns boolean)
|
|
65
|
+
step.nextStep({
|
|
66
|
+
when: (ctx) => ctx.data?.readyToContinue === true, // Returns boolean
|
|
67
|
+
prompt: "Let's continue..."
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
// Mixed array condition (new capability)
|
|
71
|
+
step.nextStep({
|
|
72
|
+
when: [
|
|
73
|
+
"User is ready to proceed", // AI context
|
|
74
|
+
(ctx) => ctx.data?.readyToContinue === true // Programmatic check
|
|
75
|
+
],
|
|
76
|
+
prompt: "Let's continue..."
|
|
77
|
+
});
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
**Migration:** Update function-based `when` conditions to return boolean instead of string.
|
|
81
|
+
|
|
82
|
+
### 3. Step SkipIf Conditions
|
|
83
|
+
|
|
84
|
+
**Before:**
|
|
85
|
+
```typescript
|
|
86
|
+
step.nextStep({
|
|
87
|
+
skipIf: (data) => data.alreadyCompleted === true, // Function only
|
|
88
|
+
prompt: "Complete this step"
|
|
89
|
+
});
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
**After:**
|
|
93
|
+
```typescript
|
|
94
|
+
// Function-only skipIf (unchanged signature, but now uses full context)
|
|
95
|
+
step.nextStep({
|
|
96
|
+
skipIf: (ctx) => ctx.data?.alreadyCompleted === true, // Full context access
|
|
97
|
+
prompt: "Complete this step"
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
// String-only skipIf (new capability)
|
|
101
|
+
step.nextStep({
|
|
102
|
+
skipIf: "Step already completed",
|
|
103
|
+
prompt: "Complete this step"
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
// Mixed array skipIf (new capability)
|
|
107
|
+
step.nextStep({
|
|
108
|
+
skipIf: [
|
|
109
|
+
"Step already completed", // AI context
|
|
110
|
+
(ctx) => ctx.data?.alreadyCompleted === true // Programmatic check
|
|
111
|
+
],
|
|
112
|
+
prompt: "Complete this step"
|
|
113
|
+
});
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
**Migration:** Update `skipIf` functions to use full `TemplateContext` instead of just data.
|
|
117
|
+
|
|
118
|
+
### 4. Guideline Conditions
|
|
119
|
+
|
|
120
|
+
**Before:**
|
|
121
|
+
```typescript
|
|
122
|
+
agent.addGuideline({
|
|
123
|
+
condition: "User seems frustrated", // Template type
|
|
124
|
+
action: "Be extra helpful"
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
agent.addGuideline({
|
|
128
|
+
condition: (ctx) => `User type is ${ctx.userType}`, // Function returning string
|
|
129
|
+
action: "Adjust tone accordingly"
|
|
130
|
+
});
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
**After:**
|
|
134
|
+
```typescript
|
|
135
|
+
// String condition (unchanged)
|
|
136
|
+
agent.addGuideline({
|
|
137
|
+
condition: "User seems frustrated",
|
|
138
|
+
action: "Be extra helpful"
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
// Function condition (now returns boolean)
|
|
142
|
+
agent.addGuideline({
|
|
143
|
+
condition: (ctx) => ctx.data?.userType === 'premium', // Returns boolean
|
|
144
|
+
action: "Provide premium support"
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
// Mixed array condition (new capability)
|
|
148
|
+
agent.addGuideline({
|
|
149
|
+
condition: [
|
|
150
|
+
"User needs special assistance", // AI context
|
|
151
|
+
(ctx) => ctx.data?.userType === 'premium' // Programmatic check
|
|
152
|
+
],
|
|
153
|
+
action: "Provide premium support with priority handling"
|
|
154
|
+
});
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
**Migration:** Update function-based guideline conditions to return boolean instead of string.
|
|
158
|
+
|
|
159
|
+
## New Features
|
|
160
|
+
|
|
161
|
+
### Route SkipIf
|
|
162
|
+
|
|
163
|
+
Routes can now be excluded from consideration:
|
|
164
|
+
|
|
165
|
+
```typescript
|
|
166
|
+
agent.createRoute({
|
|
167
|
+
title: "Premium Features",
|
|
168
|
+
when: ["User wants premium features"],
|
|
169
|
+
skipIf: [
|
|
170
|
+
"Premium features are under maintenance", // AI context
|
|
171
|
+
(ctx) => ctx.context?.maintenanceMode === true // Programmatic check
|
|
172
|
+
],
|
|
173
|
+
// ...
|
|
174
|
+
});
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
### Enhanced Context Access
|
|
178
|
+
|
|
179
|
+
All condition functions now receive full `TemplateContext`:
|
|
180
|
+
|
|
181
|
+
```typescript
|
|
182
|
+
interface TemplateContext<TContext, TData> {
|
|
183
|
+
context?: TContext; // Agent context
|
|
184
|
+
session?: SessionState<TData>; // Session state
|
|
185
|
+
history?: Event[]; // Conversation history
|
|
186
|
+
data?: Partial<TData>; // Convenience alias for session.data
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// Use in conditions
|
|
190
|
+
const condition = (ctx) => {
|
|
191
|
+
return ctx.context?.userTier === 'premium' &&
|
|
192
|
+
ctx.data?.issueType === 'billing' &&
|
|
193
|
+
ctx.session?.currentRoute?.id !== 'billing_route';
|
|
194
|
+
};
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
## Migration Steps
|
|
198
|
+
|
|
199
|
+
### Step 1: Update Route Definitions
|
|
200
|
+
|
|
201
|
+
```typescript
|
|
202
|
+
// Before
|
|
203
|
+
const routes = [
|
|
204
|
+
{
|
|
205
|
+
title: "Support",
|
|
206
|
+
conditions: ["User needs help"],
|
|
207
|
+
// ...
|
|
208
|
+
}
|
|
209
|
+
];
|
|
210
|
+
|
|
211
|
+
// After
|
|
212
|
+
const routes = [
|
|
213
|
+
{
|
|
214
|
+
title: "Support",
|
|
215
|
+
when: ["User needs help"], // Renamed
|
|
216
|
+
// ...
|
|
217
|
+
}
|
|
218
|
+
];
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
### Step 2: Update Function-Based Conditions
|
|
222
|
+
|
|
223
|
+
```typescript
|
|
224
|
+
// Before - functions returned strings
|
|
225
|
+
when: (ctx) => ctx.data?.ready ? "User is ready" : null,
|
|
226
|
+
skipIf: (data) => data.completed === true,
|
|
227
|
+
|
|
228
|
+
// After - functions return booleans
|
|
229
|
+
when: (ctx) => ctx.data?.ready === true,
|
|
230
|
+
skipIf: (ctx) => ctx.data?.completed === true,
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
### Step 3: Update Guideline Conditions
|
|
234
|
+
|
|
235
|
+
```typescript
|
|
236
|
+
// Before
|
|
237
|
+
guidelines: [
|
|
238
|
+
{
|
|
239
|
+
condition: (ctx) => `User is ${ctx.userType}`,
|
|
240
|
+
action: "Adjust tone"
|
|
241
|
+
}
|
|
242
|
+
]
|
|
243
|
+
|
|
244
|
+
// After
|
|
245
|
+
guidelines: [
|
|
246
|
+
{
|
|
247
|
+
condition: (ctx) => ctx.data?.userType === 'premium',
|
|
248
|
+
action: "Provide premium tone and service"
|
|
249
|
+
}
|
|
250
|
+
]
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
### Step 4: Leverage New Capabilities
|
|
254
|
+
|
|
255
|
+
```typescript
|
|
256
|
+
// Add Route skipIf where appropriate
|
|
257
|
+
agent.createRoute({
|
|
258
|
+
title: "Payment Processing",
|
|
259
|
+
when: ["User wants to make payment"],
|
|
260
|
+
skipIf: [
|
|
261
|
+
"Payment system is down", // AI context
|
|
262
|
+
(ctx) => ctx.context?.paymentSystemDown === true // Programmatic
|
|
263
|
+
]
|
|
264
|
+
});
|
|
265
|
+
|
|
266
|
+
// Use mixed array conditions for complex logic
|
|
267
|
+
step.nextStep({
|
|
268
|
+
when: [
|
|
269
|
+
"User is ready for advanced features", // AI context
|
|
270
|
+
(ctx) => ctx.data?.experienceLevel === 'advanced', // Programmatic
|
|
271
|
+
(ctx) => ctx.context?.featuresEnabled === true // Context check
|
|
272
|
+
],
|
|
273
|
+
prompt: "Let's explore advanced features"
|
|
274
|
+
});
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
## Testing Your Migration
|
|
278
|
+
|
|
279
|
+
### 1. Verify Route Selection
|
|
280
|
+
|
|
281
|
+
Test that routes are selected correctly with new `when` conditions:
|
|
282
|
+
|
|
283
|
+
```typescript
|
|
284
|
+
// Test route selection
|
|
285
|
+
const response = await agent.respond("I need help with billing");
|
|
286
|
+
expect(response.session?.currentRoute?.title).toBe("Billing Support");
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
### 2. Test SkipIf Logic
|
|
290
|
+
|
|
291
|
+
Verify that routes and steps are properly skipped:
|
|
292
|
+
|
|
293
|
+
```typescript
|
|
294
|
+
// Test route skipIf
|
|
295
|
+
const contextWithMaintenance = { maintenanceMode: true };
|
|
296
|
+
const response = await agent.respond("I want premium features", {
|
|
297
|
+
contextOverride: contextWithMaintenance
|
|
298
|
+
});
|
|
299
|
+
// Should not select premium route due to skipIf
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
### 3. Validate Guideline Activation
|
|
303
|
+
|
|
304
|
+
Test that guidelines activate correctly with new conditions:
|
|
305
|
+
|
|
306
|
+
```typescript
|
|
307
|
+
// Test guideline conditions
|
|
308
|
+
const premiumContext = { userType: 'premium' };
|
|
309
|
+
const response = await agent.respond("I need help", {
|
|
310
|
+
contextOverride: premiumContext
|
|
311
|
+
});
|
|
312
|
+
// Should apply premium guidelines
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
## Common Issues
|
|
316
|
+
|
|
317
|
+
### Issue 1: Function Conditions Not Working
|
|
318
|
+
|
|
319
|
+
**Problem:** Function conditions that previously returned strings now need to return booleans.
|
|
320
|
+
|
|
321
|
+
**Solution:**
|
|
322
|
+
```typescript
|
|
323
|
+
// Wrong
|
|
324
|
+
when: (ctx) => ctx.data?.ready ? "User is ready" : null,
|
|
325
|
+
|
|
326
|
+
// Correct
|
|
327
|
+
when: (ctx) => ctx.data?.ready === true,
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
### Issue 2: SkipIf Context Access
|
|
331
|
+
|
|
332
|
+
**Problem:** `skipIf` functions now receive full context instead of just data.
|
|
333
|
+
|
|
334
|
+
**Solution:**
|
|
335
|
+
```typescript
|
|
336
|
+
// Wrong
|
|
337
|
+
skipIf: (data) => data.completed,
|
|
338
|
+
|
|
339
|
+
// Correct
|
|
340
|
+
skipIf: (ctx) => ctx.data?.completed === true,
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
### Issue 3: Guideline Condition Types
|
|
344
|
+
|
|
345
|
+
**Problem:** Guideline conditions that returned strings need to return booleans.
|
|
346
|
+
|
|
347
|
+
**Solution:**
|
|
348
|
+
```typescript
|
|
349
|
+
// Wrong
|
|
350
|
+
condition: (ctx) => `User is ${ctx.userType}`,
|
|
351
|
+
|
|
352
|
+
// Correct
|
|
353
|
+
condition: (ctx) => ctx.data?.userType === 'premium',
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
## Benefits of Migration
|
|
357
|
+
|
|
358
|
+
After migration, you'll have access to:
|
|
359
|
+
|
|
360
|
+
- **Hybrid Logic**: Combine AI understanding with programmatic precision
|
|
361
|
+
- **Better Performance**: Functions execute first, strings only used when needed
|
|
362
|
+
- **Route Exclusion**: Use `skipIf` to dynamically exclude routes
|
|
363
|
+
- **Enhanced Context**: Access full context in all condition functions
|
|
364
|
+
- **Flexible Arrays**: Mix strings and functions for optimal control
|
|
365
|
+
|
|
366
|
+
## Support
|
|
367
|
+
|
|
368
|
+
If you encounter issues during migration:
|
|
369
|
+
|
|
370
|
+
1. Check the [API Reference](../../api/README.md) for updated interfaces
|
|
371
|
+
2. Review [examples](../../../examples/) for migration patterns
|
|
372
|
+
3. Test incrementally - migrate one route at a time
|
|
373
|
+
4. Use TypeScript for compile-time validation of new signatures
|
|
374
|
+
|
|
375
|
+
The new `ConditionTemplate` system provides much more flexibility while maintaining backward compatibility where possible.
|
|
@@ -0,0 +1,303 @@
|
|
|
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
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
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.
|
|
8
|
+
|
|
9
|
+
## Key Behavioral Changes
|
|
10
|
+
|
|
11
|
+
### Before: Single-Step Execution
|
|
12
|
+
|
|
13
|
+
Previously, each `.respond()` call executed exactly one step:
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
// Turn 1
|
|
17
|
+
const response1 = await agent.respond("Book Grand Hotel for 2 on Friday");
|
|
18
|
+
// Executes: ask-hotel step
|
|
19
|
+
// Response: "What date would you like to book?"
|
|
20
|
+
|
|
21
|
+
// Turn 2
|
|
22
|
+
const response2 = await agent.respond("Friday");
|
|
23
|
+
// Executes: ask-date step
|
|
24
|
+
// Response: "How many guests?"
|
|
25
|
+
|
|
26
|
+
// Turn 3
|
|
27
|
+
const response3 = await agent.respond("2 people");
|
|
28
|
+
// Executes: ask-guests step
|
|
29
|
+
// Response: "Booking confirmed!"
|
|
30
|
+
|
|
31
|
+
// Total: 3 LLM calls
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### After: Multi-Step Execution
|
|
35
|
+
|
|
36
|
+
Now, multiple steps can execute in a single call when data requirements are satisfied:
|
|
37
|
+
|
|
38
|
+
```typescript
|
|
39
|
+
// Turn 1
|
|
40
|
+
const response = await agent.respond("Book Grand Hotel for 2 on Friday");
|
|
41
|
+
// Pre-extraction captures: { hotel: "Grand Hotel", date: "Friday", guests: 2 }
|
|
42
|
+
// Executes: ask-hotel, ask-date, ask-guests steps (all in one batch)
|
|
43
|
+
// Response: "Booking confirmed for 2 guests at Grand Hotel on Friday!"
|
|
44
|
+
|
|
45
|
+
// Total: 1 LLM call
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## What Changed
|
|
49
|
+
|
|
50
|
+
| Aspect | Before | After |
|
|
51
|
+
|--------|--------|-------|
|
|
52
|
+
| Steps per call | Always 1 | 1 or more (batched) |
|
|
53
|
+
| LLM calls | One per step | One per batch |
|
|
54
|
+
| Pre-extraction | Per-step | Before batch determination |
|
|
55
|
+
| Response fields | Basic | Includes `executedSteps`, `stoppedReason` |
|
|
56
|
+
| Hook execution | Per-step | All prepare hooks, then LLM, then all finalize hooks |
|
|
57
|
+
|
|
58
|
+
## Migration Checklist
|
|
59
|
+
|
|
60
|
+
### 1. Review Hook Dependencies
|
|
61
|
+
|
|
62
|
+
If your hooks depend on being called between steps, they may need adjustment:
|
|
63
|
+
|
|
64
|
+
```typescript
|
|
65
|
+
// Before: Hooks called between each step
|
|
66
|
+
const step1 = {
|
|
67
|
+
finalize: async (ctx, data) => {
|
|
68
|
+
// This ran before step2's prepare
|
|
69
|
+
await saveProgress(data);
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
const step2 = {
|
|
74
|
+
prepare: async (ctx, data) => {
|
|
75
|
+
// This expected step1's finalize to have run
|
|
76
|
+
const progress = await loadProgress();
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
// After: All prepare hooks run first, then all finalize hooks
|
|
81
|
+
// If step1 and step2 are batched together:
|
|
82
|
+
// 1. step1.prepare runs
|
|
83
|
+
// 2. step2.prepare runs
|
|
84
|
+
// 3. LLM call
|
|
85
|
+
// 4. step1.finalize runs
|
|
86
|
+
// 5. step2.finalize runs
|
|
87
|
+
|
|
88
|
+
// Migration: Use session data instead of external state
|
|
89
|
+
const step1 = {
|
|
90
|
+
finalize: async (ctx, data) => {
|
|
91
|
+
// Store in session data, not external state
|
|
92
|
+
data.step1Complete = true;
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
const step2 = {
|
|
97
|
+
prepare: async (ctx, data) => {
|
|
98
|
+
// Check session data
|
|
99
|
+
if (!data.step1Complete) {
|
|
100
|
+
// Handle case where step1 hasn't finalized yet
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### 2. Update Response Handling
|
|
107
|
+
|
|
108
|
+
Check for new response fields:
|
|
109
|
+
|
|
110
|
+
```typescript
|
|
111
|
+
// Before
|
|
112
|
+
const response = await agent.respond(message);
|
|
113
|
+
console.log(response.message);
|
|
114
|
+
console.log(response.isRouteComplete);
|
|
115
|
+
|
|
116
|
+
// After - additional fields available
|
|
117
|
+
const response = await agent.respond(message);
|
|
118
|
+
console.log(response.message);
|
|
119
|
+
console.log(response.isRouteComplete);
|
|
120
|
+
console.log(response.executedSteps); // NEW: Array of executed steps
|
|
121
|
+
console.log(response.stoppedReason); // NEW: Why execution stopped
|
|
122
|
+
console.log(response.error); // NEW: Error details if any
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### 3. Review SkipIf Conditions
|
|
126
|
+
|
|
127
|
+
SkipIf conditions now affect batch determination:
|
|
128
|
+
|
|
129
|
+
```typescript
|
|
130
|
+
// Before: skipIf evaluated when entering step
|
|
131
|
+
const step = {
|
|
132
|
+
skipIf: (data) => {
|
|
133
|
+
// Called when transitioning to this step
|
|
134
|
+
return data.alreadyHaveInfo;
|
|
135
|
+
}
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
// After: skipIf evaluated during batch determination
|
|
139
|
+
// If skipIf returns true, step is skipped and next step is evaluated
|
|
140
|
+
// If skipIf throws, step is treated as non-skippable (included in batch)
|
|
141
|
+
|
|
142
|
+
// Migration: Ensure skipIf is pure and doesn't have side effects
|
|
143
|
+
const step = {
|
|
144
|
+
skipIf: (data) => {
|
|
145
|
+
// GOOD: Pure function
|
|
146
|
+
return data.alreadyHaveInfo;
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
// AVOID: Side effects in skipIf
|
|
151
|
+
const badStep = {
|
|
152
|
+
skipIf: (data) => {
|
|
153
|
+
// BAD: Side effect
|
|
154
|
+
logSkipCheck(data);
|
|
155
|
+
return data.alreadyHaveInfo;
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
### 4. Handle Partial Execution
|
|
161
|
+
|
|
162
|
+
Errors may leave partial progress:
|
|
163
|
+
|
|
164
|
+
```typescript
|
|
165
|
+
// Before: Single step, all or nothing
|
|
166
|
+
|
|
167
|
+
// After: Batch may partially complete
|
|
168
|
+
const response = await agent.respond(message);
|
|
169
|
+
|
|
170
|
+
if (response.stoppedReason === 'prepare_error') {
|
|
171
|
+
// Some steps may have executed before the error
|
|
172
|
+
console.log("Executed before error:", response.executedSteps);
|
|
173
|
+
console.log("Error details:", response.error);
|
|
174
|
+
}
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
### 5. Update Tests
|
|
178
|
+
|
|
179
|
+
Tests expecting single-step behavior need updates:
|
|
180
|
+
|
|
181
|
+
```typescript
|
|
182
|
+
// Before
|
|
183
|
+
test("collects hotel name", async () => {
|
|
184
|
+
const response = await agent.respond("Book Grand Hotel");
|
|
185
|
+
expect(response.session.data.hotel).toBe("Grand Hotel");
|
|
186
|
+
// Assumed only hotel step executed
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
// After
|
|
190
|
+
test("collects hotel name", async () => {
|
|
191
|
+
const response = await agent.respond("Book Grand Hotel");
|
|
192
|
+
expect(response.session.data.hotel).toBe("Grand Hotel");
|
|
193
|
+
|
|
194
|
+
// Check which steps actually executed
|
|
195
|
+
expect(response.executedSteps).toContainEqual(
|
|
196
|
+
expect.objectContaining({ id: "ask-hotel" })
|
|
197
|
+
);
|
|
198
|
+
|
|
199
|
+
// May have executed more steps if data was available
|
|
200
|
+
expect(response.stoppedReason).toBe("needs_input");
|
|
201
|
+
});
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
## Before/After Examples
|
|
205
|
+
|
|
206
|
+
### Example 1: Simple Booking Flow
|
|
207
|
+
|
|
208
|
+
**Before (3 turns):**
|
|
209
|
+
```
|
|
210
|
+
User: "I want to book a hotel"
|
|
211
|
+
Bot: "Which hotel would you like?"
|
|
212
|
+
User: "Grand Hotel"
|
|
213
|
+
Bot: "What date?"
|
|
214
|
+
User: "Friday"
|
|
215
|
+
Bot: "Booking confirmed!"
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
**After (potentially 1-2 turns):**
|
|
219
|
+
```
|
|
220
|
+
User: "I want to book Grand Hotel for Friday"
|
|
221
|
+
Bot: "Booking confirmed for Grand Hotel on Friday!"
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
### Example 2: Partial Information
|
|
225
|
+
|
|
226
|
+
**Before:**
|
|
227
|
+
```
|
|
228
|
+
User: "Book Grand Hotel"
|
|
229
|
+
Bot: "What date?" (only hotel step executed)
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
**After:**
|
|
233
|
+
```
|
|
234
|
+
User: "Book Grand Hotel"
|
|
235
|
+
Bot: "What date?" (hotel step executed, stopped at date step)
|
|
236
|
+
// response.executedSteps = [{ id: "ask-hotel" }]
|
|
237
|
+
// response.stoppedReason = "needs_input"
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
### Example 3: With SkipIf Conditions
|
|
241
|
+
|
|
242
|
+
**Before:**
|
|
243
|
+
```typescript
|
|
244
|
+
// Each step evaluated individually
|
|
245
|
+
const step1 = { skipIf: (d) => !!d.name }; // Skipped if name exists
|
|
246
|
+
const step2 = { skipIf: (d) => !!d.email }; // Skipped if email exists
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
**After:**
|
|
250
|
+
```typescript
|
|
251
|
+
// All skipIf conditions evaluated during batch determination
|
|
252
|
+
// If user provides "I'm John, john@example.com":
|
|
253
|
+
// - Pre-extraction: { name: "John", email: "john@example.com" }
|
|
254
|
+
// - step1 skipIf: true (skipped)
|
|
255
|
+
// - step2 skipIf: true (skipped)
|
|
256
|
+
// - Both steps skipped, route may complete immediately
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
## Opting Out of Batching
|
|
260
|
+
|
|
261
|
+
If you need single-step behavior for specific steps, use `requires` to create dependencies:
|
|
262
|
+
|
|
263
|
+
```typescript
|
|
264
|
+
// Force step2 to wait for step1's data
|
|
265
|
+
const step1 = {
|
|
266
|
+
collect: ["name"],
|
|
267
|
+
};
|
|
268
|
+
|
|
269
|
+
const step2 = {
|
|
270
|
+
collect: ["email"],
|
|
271
|
+
requires: ["name"], // Won't batch with step1
|
|
272
|
+
};
|
|
273
|
+
|
|
274
|
+
// Now step2 will only execute after step1 completes
|
|
275
|
+
// (in a separate batch/LLM call)
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
## Debugging Migration Issues
|
|
279
|
+
|
|
280
|
+
Enable debug mode to see batch behavior:
|
|
281
|
+
|
|
282
|
+
```typescript
|
|
283
|
+
const agent = new Agent({
|
|
284
|
+
debug: true,
|
|
285
|
+
// ...
|
|
286
|
+
});
|
|
287
|
+
|
|
288
|
+
// Logs will show:
|
|
289
|
+
// [BatchExecutor] Starting batch determination...
|
|
290
|
+
// [BatchExecutor] Including step ask-hotel in batch
|
|
291
|
+
// [BatchExecutor] Step ask-date needs input, stopping batch
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
## Summary
|
|
295
|
+
|
|
296
|
+
1. **Multiple steps can now execute together** - reducing LLM calls
|
|
297
|
+
2. **Pre-extraction happens before batch determination** - maximizing batching
|
|
298
|
+
3. **New response fields** - `executedSteps`, `stoppedReason`, `error`
|
|
299
|
+
4. **Hook execution order changed** - all prepare, then LLM, then all finalize
|
|
300
|
+
5. **SkipIf affects batching** - evaluated during batch determination
|
|
301
|
+
6. **Partial progress preserved** - on errors, completed steps are retained
|
|
302
|
+
|
|
303
|
+
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.
|