@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,243 @@
|
|
|
1
|
+
# Multi-Step Execution Architecture
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
@falai/agent supports **multi-step execution**, enabling multiple consecutive Steps to execute in a single LLM call. This reduces unnecessary multi-turn conversations, minimizes LLM costs, and improves user experience when steps don't require new user input.
|
|
6
|
+
|
|
7
|
+
The core insight is simple: **if a Step's data requirements are already satisfied, there's no reason to pause and wait for user input**. By detecting which Steps can execute together and combining them into a single batch, we reduce LLM calls while improving conversation UX.
|
|
8
|
+
|
|
9
|
+
## Design Priorities
|
|
10
|
+
|
|
11
|
+
1. **Conversation UX** - Reduce unnecessary back-and-forth
|
|
12
|
+
2. **LLM Cost Optimization** - Fewer calls for the same outcome
|
|
13
|
+
3. **Predictability** - Clear, simple rules for when execution pauses
|
|
14
|
+
4. **Framework Understandability** - Keep the Step/Route mental model intact
|
|
15
|
+
|
|
16
|
+
## Batch Execution Flow
|
|
17
|
+
|
|
18
|
+
```mermaid
|
|
19
|
+
flowchart TD
|
|
20
|
+
A[User Message] --> B[Pre-Extraction]
|
|
21
|
+
B --> C[Batch Determination]
|
|
22
|
+
C --> D{More Steps?}
|
|
23
|
+
D -->|Yes| E[Evaluate Step]
|
|
24
|
+
E --> F{Needs Input?}
|
|
25
|
+
F -->|No| G[Add to Batch]
|
|
26
|
+
G --> D
|
|
27
|
+
F -->|Yes| H[Stop Batch]
|
|
28
|
+
D -->|No| H
|
|
29
|
+
H --> I[Execute Prepare Hooks]
|
|
30
|
+
I --> J[Build Combined Prompt]
|
|
31
|
+
J --> K[Single LLM Call]
|
|
32
|
+
K --> L[Extract Response Data]
|
|
33
|
+
L --> M[Execute Finalize Hooks]
|
|
34
|
+
M --> N[Update Session]
|
|
35
|
+
N --> O[Return Response]
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Execution Phases
|
|
39
|
+
|
|
40
|
+
### Phase 1: Pre-Extraction
|
|
41
|
+
|
|
42
|
+
When processing a user message, the engine performs **pre-extraction** before determining the batch. This phase:
|
|
43
|
+
|
|
44
|
+
1. Attempts to extract data for all fields defined in the Route's `requiredFields` and `optionalFields`
|
|
45
|
+
2. Merges pre-extracted data into session data
|
|
46
|
+
3. Maximizes batching by satisfying Step requirements upfront
|
|
47
|
+
|
|
48
|
+
```typescript
|
|
49
|
+
// User: "I want to book the Grand Hotel for 2 people next Friday"
|
|
50
|
+
|
|
51
|
+
// Pre-extraction automatically captures:
|
|
52
|
+
{
|
|
53
|
+
hotelName: "Grand Hotel",
|
|
54
|
+
guests: 2,
|
|
55
|
+
date: "next Friday"
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### Phase 2: Batch Determination
|
|
60
|
+
|
|
61
|
+
The `BatchExecutor` walks through Steps using this algorithm:
|
|
62
|
+
|
|
63
|
+
```
|
|
64
|
+
For each Step starting from current position:
|
|
65
|
+
a. Check if it's END_ROUTE → stop with 'end_route'
|
|
66
|
+
b. Evaluate skipIf condition
|
|
67
|
+
c. If skipIf is true → skip Step, continue to next
|
|
68
|
+
d. If skipIf throws error → treat as non-skippable
|
|
69
|
+
e. Evaluate needsInput(step, sessionDataAfterPreExtraction)
|
|
70
|
+
f. If needsInput is false → include Step in batch, continue to next
|
|
71
|
+
g. If needsInput is true → stop with 'needs_input'
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Phase 3: Hook Execution (Prepare)
|
|
75
|
+
|
|
76
|
+
Before the LLM call, all `prepare` hooks for batched Steps execute in Step order. If any prepare hook fails, batch execution stops immediately.
|
|
77
|
+
|
|
78
|
+
### Phase 4: LLM Call
|
|
79
|
+
|
|
80
|
+
A single LLM call is made with a combined prompt that includes all Step prompts and collect fields.
|
|
81
|
+
|
|
82
|
+
### Phase 5: Data Collection
|
|
83
|
+
|
|
84
|
+
All `collect` fields from all Steps in the batch are extracted from the LLM response and validated against the agent schema.
|
|
85
|
+
|
|
86
|
+
### Phase 6: Hook Execution (Finalize)
|
|
87
|
+
|
|
88
|
+
After the LLM response, all `finalize` hooks execute in Step order. Finalize hook failures are logged but don't stop execution.
|
|
89
|
+
|
|
90
|
+
## Needs-Input Detection Algorithm
|
|
91
|
+
|
|
92
|
+
The `needsInput` function implements the core execution rule:
|
|
93
|
+
|
|
94
|
+
```typescript
|
|
95
|
+
function needsInput<TData>(
|
|
96
|
+
step: Step<unknown, TData>,
|
|
97
|
+
sessionDataAfterPreExtraction: Partial<TData>
|
|
98
|
+
): boolean {
|
|
99
|
+
// Check requires - all must be present (after pre-extraction)
|
|
100
|
+
if (step.requires && step.requires.length > 0) {
|
|
101
|
+
const missingRequired = step.requires.some(
|
|
102
|
+
field => sessionDataAfterPreExtraction[field] === undefined
|
|
103
|
+
);
|
|
104
|
+
if (missingRequired) return true;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Check collect - needs input if collecting and no data exists (after pre-extraction)
|
|
108
|
+
if (step.collect && step.collect.length > 0) {
|
|
109
|
+
const hasAnyCollectData = step.collect.some(
|
|
110
|
+
field => sessionDataAfterPreExtraction[field] !== undefined
|
|
111
|
+
);
|
|
112
|
+
if (!hasAnyCollectData) return true;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
A Step **needs input** when:
|
|
120
|
+
|
|
121
|
+
1. It has `requires` fields and at least one is missing from session data (after pre-extraction)
|
|
122
|
+
2. It has non-empty `collect` fields and none of those fields have data (after pre-extraction)
|
|
123
|
+
|
|
124
|
+
## Pre-Extraction's Role in Batching
|
|
125
|
+
|
|
126
|
+
Pre-extraction is critical for maximizing batch size. Consider this scenario:
|
|
127
|
+
|
|
128
|
+
```typescript
|
|
129
|
+
// Route with 3 steps
|
|
130
|
+
const route = agent.createRoute({
|
|
131
|
+
title: "Booking",
|
|
132
|
+
requiredFields: ["hotel", "date", "guests"],
|
|
133
|
+
steps: [
|
|
134
|
+
{ prompt: "Which hotel?", collect: ["hotel"] },
|
|
135
|
+
{ prompt: "What date?", collect: ["date"] },
|
|
136
|
+
{ prompt: "How many guests?", collect: ["guests"] }
|
|
137
|
+
]
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
// User message: "Book Grand Hotel for 2 people on Friday"
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
**Without pre-extraction:**
|
|
144
|
+
- Step 1 needs input (no hotel data) → batch stops
|
|
145
|
+
- 3 separate LLM calls needed
|
|
146
|
+
|
|
147
|
+
**With pre-extraction:**
|
|
148
|
+
- Pre-extraction captures: `{ hotel: "Grand Hotel", date: "Friday", guests: 2 }`
|
|
149
|
+
- All steps have their data satisfied
|
|
150
|
+
- All 3 steps execute in a single batch
|
|
151
|
+
- 1 LLM call needed
|
|
152
|
+
|
|
153
|
+
## Key Components
|
|
154
|
+
|
|
155
|
+
### BatchExecutor
|
|
156
|
+
|
|
157
|
+
The core component responsible for:
|
|
158
|
+
- Determining which Steps can execute together (`determineBatch`)
|
|
159
|
+
- Executing prepare/finalize hooks (`executePrepareHooks`, `executeFinalizeHooks`)
|
|
160
|
+
- Collecting data from LLM responses (`collectBatchData`)
|
|
161
|
+
- Orchestrating complete batch execution (`executeBatch`)
|
|
162
|
+
|
|
163
|
+
### BatchPromptBuilder
|
|
164
|
+
|
|
165
|
+
Combines multiple Step prompts into a single coherent prompt:
|
|
166
|
+
- Preserves each Step's individual prompt intent
|
|
167
|
+
- Includes data collection instructions for all `collect` fields
|
|
168
|
+
- Produces a single LLM call regardless of Step count
|
|
169
|
+
|
|
170
|
+
## Example: Multi-Step Batch
|
|
171
|
+
|
|
172
|
+
```typescript
|
|
173
|
+
// User provides all booking info at once
|
|
174
|
+
const response = await agent.respond(
|
|
175
|
+
"I want to book the Grand Hotel for 2 people next Friday"
|
|
176
|
+
);
|
|
177
|
+
|
|
178
|
+
// Response includes:
|
|
179
|
+
{
|
|
180
|
+
message: "Perfect! I've booked the Grand Hotel for 2 guests on Friday.",
|
|
181
|
+
executedSteps: [
|
|
182
|
+
{ id: "ask-hotel", routeId: "booking" },
|
|
183
|
+
{ id: "ask-date", routeId: "booking" },
|
|
184
|
+
{ id: "ask-guests", routeId: "booking" }
|
|
185
|
+
],
|
|
186
|
+
stoppedReason: "route_complete",
|
|
187
|
+
session: {
|
|
188
|
+
data: {
|
|
189
|
+
hotel: "Grand Hotel",
|
|
190
|
+
date: "Friday",
|
|
191
|
+
guests: 2
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
## Debugging
|
|
198
|
+
|
|
199
|
+
Enable debug mode to see batch execution decisions:
|
|
200
|
+
|
|
201
|
+
```typescript
|
|
202
|
+
const agent = new Agent({
|
|
203
|
+
name: "Assistant",
|
|
204
|
+
provider: provider,
|
|
205
|
+
debug: true // Enable detailed logging
|
|
206
|
+
});
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
Look for these log messages:
|
|
210
|
+
|
|
211
|
+
```
|
|
212
|
+
[BatchExecutor] Starting batch determination from step index 0
|
|
213
|
+
[BatchExecutor] Including step ask-hotel in batch (all requirements satisfied)
|
|
214
|
+
[BatchExecutor] Including step ask-date in batch (all requirements satisfied)
|
|
215
|
+
[BatchExecutor] Step ask-guests needs input, stopping batch
|
|
216
|
+
[BatchExecutor] Batch determination complete. Steps: 2, Stopped reason: needs_input
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
## Event Emission
|
|
220
|
+
|
|
221
|
+
The BatchExecutor emits events for observability:
|
|
222
|
+
|
|
223
|
+
- `batch_start` - When batch determination begins
|
|
224
|
+
- `step_included` - When a step is included in the batch
|
|
225
|
+
- `step_skipped` - When a step is skipped (due to skipIf)
|
|
226
|
+
- `batch_stop` - When batch determination stops
|
|
227
|
+
- `batch_complete` - When batch execution completes
|
|
228
|
+
|
|
229
|
+
```typescript
|
|
230
|
+
const executor = new BatchExecutor();
|
|
231
|
+
|
|
232
|
+
executor.addEventListener((event) => {
|
|
233
|
+
console.log(`[${event.type}]`, event.details);
|
|
234
|
+
});
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
---
|
|
238
|
+
|
|
239
|
+
**Related Documentation:**
|
|
240
|
+
- [Steps](../core/conversation-flows/steps.md) - Step configuration and batching
|
|
241
|
+
- [Step Transitions](../core/conversation-flows/step-transitions.md) - Stopping conditions
|
|
242
|
+
- [Data Collection](../core/conversation-flows/data-collection.md) - Pre-extraction details
|
|
243
|
+
- [Prompt Composition](../core/ai-integration/prompt-composition.md) - Combined prompts
|
|
@@ -168,23 +168,43 @@ const agent = new Agent<CustomerContext, CustomerData>({
|
|
|
168
168
|
},
|
|
169
169
|
],
|
|
170
170
|
|
|
171
|
-
//
|
|
171
|
+
// Enhanced behavioral guidelines with ConditionTemplate
|
|
172
172
|
guidelines: [
|
|
173
173
|
{
|
|
174
|
-
condition:
|
|
174
|
+
condition: [
|
|
175
|
+
"Customer seems frustrated or upset", // AI context
|
|
176
|
+
(ctx) => ctx.data?.priority === 'high' // Programmatic check
|
|
177
|
+
],
|
|
175
178
|
action: "Apologize sincerely and offer to escalate to human agent",
|
|
176
179
|
enabled: true,
|
|
177
180
|
},
|
|
178
181
|
{
|
|
179
|
-
condition:
|
|
182
|
+
condition: (ctx) => ctx.accountTier === 'premium', // Function-only condition
|
|
180
183
|
action: "Provide expedited service and additional options",
|
|
181
184
|
enabled: true,
|
|
182
185
|
},
|
|
186
|
+
{
|
|
187
|
+
condition: "User is asking for help with billing", // String-only condition
|
|
188
|
+
action: "Be extra careful with financial information and offer phone support",
|
|
189
|
+
enabled: true,
|
|
190
|
+
},
|
|
183
191
|
],
|
|
184
192
|
|
|
185
193
|
// Global tools available to all routes
|
|
186
194
|
tools: [searchTool, userLookupTool],
|
|
187
195
|
|
|
196
|
+
// Agent-wide rules (enforced in every route)
|
|
197
|
+
rules: [
|
|
198
|
+
"Always respond in the customer's language",
|
|
199
|
+
"Confirm before taking any account action",
|
|
200
|
+
],
|
|
201
|
+
|
|
202
|
+
// Agent-wide prohibitions (enforced in every route)
|
|
203
|
+
prohibitions: [
|
|
204
|
+
"Never share internal system details or error stack traces",
|
|
205
|
+
"Never make up information — say you don't know instead",
|
|
206
|
+
],
|
|
207
|
+
|
|
188
208
|
// Knowledge base for AI context
|
|
189
209
|
knowledgeBase: {
|
|
190
210
|
company: {
|
|
@@ -366,7 +386,7 @@ const agent = new Agent<CustomerContext, CustomerData>({
|
|
|
366
386
|
{
|
|
367
387
|
title: "Technical Support",
|
|
368
388
|
description: "Help with technical issues",
|
|
369
|
-
|
|
389
|
+
when: ["user reports technical problem"],
|
|
370
390
|
// NEW: Routes specify required fields instead of schemas
|
|
371
391
|
requiredFields: ["customerName", "email", "issueType", "issueDescription"],
|
|
372
392
|
optionalFields: ["phone", "priority"],
|
|
@@ -379,7 +399,7 @@ const agent = new Agent<CustomerContext, CustomerData>({
|
|
|
379
399
|
{
|
|
380
400
|
title: "Billing Inquiry",
|
|
381
401
|
description: "Handle billing and payment questions",
|
|
382
|
-
|
|
402
|
+
when: ["user asks about billing or payment"],
|
|
383
403
|
requiredFields: ["customerName", "email", "issueType"],
|
|
384
404
|
initialStep: {
|
|
385
405
|
prompt:
|
|
@@ -416,6 +436,113 @@ const routes = agent.getRoutes();
|
|
|
416
436
|
console.log(routes.map((r) => r.title)); // ["Customer Support", ...]
|
|
417
437
|
```
|
|
418
438
|
|
|
439
|
+
## Enhanced Guideline System
|
|
440
|
+
|
|
441
|
+
### Flexible Guideline Conditions
|
|
442
|
+
|
|
443
|
+
Guidelines now support the powerful `ConditionTemplate` system, allowing for more sophisticated behavioral control:
|
|
444
|
+
|
|
445
|
+
```typescript
|
|
446
|
+
// String-only condition (AI context)
|
|
447
|
+
agent.addGuideline({
|
|
448
|
+
condition: "User is asking for technical help",
|
|
449
|
+
action: "Provide detailed technical explanations with examples"
|
|
450
|
+
});
|
|
451
|
+
|
|
452
|
+
// Function-only condition (programmatic)
|
|
453
|
+
agent.addGuideline({
|
|
454
|
+
condition: (ctx) => ctx.data?.userType === 'premium',
|
|
455
|
+
action: "Offer priority support and additional features"
|
|
456
|
+
});
|
|
457
|
+
|
|
458
|
+
// Mixed array condition (hybrid approach)
|
|
459
|
+
agent.addGuideline({
|
|
460
|
+
condition: [
|
|
461
|
+
"User seems confused or needs clarification", // AI context
|
|
462
|
+
(ctx) => ctx.data?.attemptCount > 2 // Programmatic check
|
|
463
|
+
],
|
|
464
|
+
action: "Slow down, use simpler language, and offer to connect with human support"
|
|
465
|
+
});
|
|
466
|
+
|
|
467
|
+
// Complex conditional guidelines
|
|
468
|
+
agent.addGuideline({
|
|
469
|
+
condition: [
|
|
470
|
+
"User is reporting a critical issue", // AI context
|
|
471
|
+
(ctx) => ctx.data?.accountTier === 'enterprise', // Account check
|
|
472
|
+
(ctx) => new Date().getHours() >= 9 && new Date().getHours() <= 17 // Business hours
|
|
473
|
+
],
|
|
474
|
+
action: "Immediately escalate to senior technical support and provide direct contact information"
|
|
475
|
+
});
|
|
476
|
+
```
|
|
477
|
+
|
|
478
|
+
### Guideline Evaluation Logic
|
|
479
|
+
|
|
480
|
+
Guidelines use **AND logic** for arrays - all conditions must be met:
|
|
481
|
+
|
|
482
|
+
- **String conditions**: Provide context to AI for guideline matching
|
|
483
|
+
- **Function conditions**: Must return `true` for guideline to activate
|
|
484
|
+
- **Arrays**: All functions must return `true`, strings provide AI context
|
|
485
|
+
|
|
486
|
+
### Context-Aware Guidelines
|
|
487
|
+
|
|
488
|
+
Guidelines can access both agent context and collected data:
|
|
489
|
+
|
|
490
|
+
```typescript
|
|
491
|
+
interface SupportContext {
|
|
492
|
+
userTier: 'free' | 'premium' | 'enterprise';
|
|
493
|
+
supportTicketCount: number;
|
|
494
|
+
lastContactDate?: Date;
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
interface SupportData {
|
|
498
|
+
issueType?: string;
|
|
499
|
+
severity?: 'low' | 'medium' | 'high' | 'critical';
|
|
500
|
+
previousAttempts?: number;
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
agent.addGuideline({
|
|
504
|
+
condition: [
|
|
505
|
+
"User has contacted support multiple times recently", // AI context
|
|
506
|
+
(ctx) => ctx.context?.supportTicketCount > 3, // Context check
|
|
507
|
+
(ctx) => ctx.data?.severity === 'high' // Data check
|
|
508
|
+
],
|
|
509
|
+
action: "Acknowledge their patience, apologize for the inconvenience, and prioritize their case"
|
|
510
|
+
});
|
|
511
|
+
```
|
|
512
|
+
|
|
513
|
+
### Dynamic Guideline Activation
|
|
514
|
+
|
|
515
|
+
Guidelines can be activated based on conversation state:
|
|
516
|
+
|
|
517
|
+
```typescript
|
|
518
|
+
// Time-based guidelines
|
|
519
|
+
agent.addGuideline({
|
|
520
|
+
condition: (ctx) => {
|
|
521
|
+
const hour = new Date().getHours();
|
|
522
|
+
return hour < 9 || hour > 17; // Outside business hours
|
|
523
|
+
},
|
|
524
|
+
action: "Inform user that live support is available during business hours (9 AM - 5 PM)"
|
|
525
|
+
});
|
|
526
|
+
|
|
527
|
+
// Progress-based guidelines
|
|
528
|
+
agent.addGuideline({
|
|
529
|
+
condition: [
|
|
530
|
+
"User is making good progress", // AI context
|
|
531
|
+
(ctx) => Object.keys(ctx.data || {}).length > 3 // Has collected significant data
|
|
532
|
+
],
|
|
533
|
+
action: "Acknowledge their cooperation and let them know we're almost done"
|
|
534
|
+
});
|
|
535
|
+
|
|
536
|
+
// Route-specific guidelines
|
|
537
|
+
agent.addGuideline({
|
|
538
|
+
condition: [
|
|
539
|
+
"User is in the payment process", // AI context
|
|
540
|
+
(ctx) => ctx.session?.currentRoute?.id === 'payment_flow' // Route check
|
|
541
|
+
],
|
|
542
|
+
action: "Be extra careful with payment information and confirm all details before processing"
|
|
543
|
+
});
|
|
544
|
+
```
|
|
545
|
+
|
|
419
546
|
## Tool Integration
|
|
420
547
|
|
|
421
548
|
### Agent-Level Tools
|
|
@@ -644,6 +771,30 @@ const debugAgent = new Agent({
|
|
|
644
771
|
|
|
645
772
|
@fai/agent supports hierarchical configuration where route-level options can override or merge with agent-level options. Understanding this behavior is crucial for effective agent design.
|
|
646
773
|
|
|
774
|
+
### Rules and Prohibitions
|
|
775
|
+
|
|
776
|
+
**Rules** and **prohibitions** are merged from both agent and route levels:
|
|
777
|
+
|
|
778
|
+
- Agent-level rules/prohibitions apply to all routes
|
|
779
|
+
- Route-level rules/prohibitions are appended after agent-level ones
|
|
780
|
+
- Both are always included in every prompt (they are not conditional)
|
|
781
|
+
|
|
782
|
+
```typescript
|
|
783
|
+
const agent = new Agent({
|
|
784
|
+
rules: ["Always confirm before taking action"],
|
|
785
|
+
prohibitions: ["Never delete data without confirmation"],
|
|
786
|
+
});
|
|
787
|
+
|
|
788
|
+
agent.createRoute({
|
|
789
|
+
title: "Billing",
|
|
790
|
+
rules: ["Always quote prices in the user's currency"],
|
|
791
|
+
prohibitions: ["Never process refunds above $500 without escalation"],
|
|
792
|
+
});
|
|
793
|
+
// Result: Both agent and route rules/prohibitions are included in prompts
|
|
794
|
+
```
|
|
795
|
+
|
|
796
|
+
See [Rules & Prohibitions](./rules-and-prohibitions.md) for full details.
|
|
797
|
+
|
|
647
798
|
### Guidelines and Terms
|
|
648
799
|
|
|
649
800
|
**Guidelines** are combined from both agent and route levels:
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# Agent-Level Rules & Prohibitions
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Rules and prohibitions define hard behavioral boundaries for the agent. Unlike guidelines (which are conditional and advisory), rules and prohibitions are absolute — they are always included in every prompt sent to the AI provider.
|
|
6
|
+
|
|
7
|
+
- **Rules**: Things the agent must always do.
|
|
8
|
+
- **Prohibitions**: Things the agent must never do.
|
|
9
|
+
|
|
10
|
+
Both can be defined at the agent level (applies to all routes) and at the route level (applies only within that route). When both are present, they are merged — agent-level entries appear first, followed by route-level entries.
|
|
11
|
+
|
|
12
|
+
## Agent-Level Configuration
|
|
13
|
+
|
|
14
|
+
```typescript
|
|
15
|
+
const agent = new Agent({
|
|
16
|
+
name: "Support Bot",
|
|
17
|
+
provider: myProvider,
|
|
18
|
+
|
|
19
|
+
// Agent-wide rules — enforced in every route
|
|
20
|
+
rules: [
|
|
21
|
+
"Always respond in the user's language",
|
|
22
|
+
"Include a follow-up question when the conversation is open-ended",
|
|
23
|
+
],
|
|
24
|
+
|
|
25
|
+
// Agent-wide prohibitions — enforced in every route
|
|
26
|
+
prohibitions: [
|
|
27
|
+
"Never share internal system details or error stack traces",
|
|
28
|
+
"Never make up information — say you don't know instead",
|
|
29
|
+
],
|
|
30
|
+
});
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Dynamic Templates
|
|
34
|
+
|
|
35
|
+
Rules and prohibitions accept the same `Template` type used elsewhere in the framework — they can be static strings or context-aware functions:
|
|
36
|
+
|
|
37
|
+
```typescript
|
|
38
|
+
const agent = new Agent<MyContext, MyData>({
|
|
39
|
+
name: "Adaptive Bot",
|
|
40
|
+
provider: myProvider,
|
|
41
|
+
|
|
42
|
+
rules: [
|
|
43
|
+
"Always be polite",
|
|
44
|
+
// Dynamic rule based on context
|
|
45
|
+
({ context }) =>
|
|
46
|
+
context?.locale === "de"
|
|
47
|
+
? "Respond in formal German (Sie-form)"
|
|
48
|
+
: "Use a casual, friendly tone",
|
|
49
|
+
],
|
|
50
|
+
|
|
51
|
+
prohibitions: [
|
|
52
|
+
"Never discuss competitor products",
|
|
53
|
+
// Dynamic prohibition based on collected data
|
|
54
|
+
({ data }) =>
|
|
55
|
+
data?.isMinor
|
|
56
|
+
? "Do not discuss age-restricted topics"
|
|
57
|
+
: "Do not share personal medical advice",
|
|
58
|
+
],
|
|
59
|
+
});
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Merging with Route-Level Rules
|
|
63
|
+
|
|
64
|
+
Route-level rules and prohibitions are additive. The final prompt includes both:
|
|
65
|
+
|
|
66
|
+
```typescript
|
|
67
|
+
const agent = new Agent({
|
|
68
|
+
provider: myProvider,
|
|
69
|
+
name: "Agent",
|
|
70
|
+
rules: ["Always confirm before taking action"],
|
|
71
|
+
prohibitions: ["Never delete data without confirmation"],
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
agent.createRoute({
|
|
75
|
+
title: "Billing",
|
|
76
|
+
rules: ["Always quote prices in the user's currency"],
|
|
77
|
+
prohibitions: ["Never process refunds above $500 without escalation"],
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
// During a Billing route response, the prompt will contain:
|
|
81
|
+
// Rules:
|
|
82
|
+
// - Always confirm before taking action (agent)
|
|
83
|
+
// - Always quote prices in the user's currency (route)
|
|
84
|
+
//
|
|
85
|
+
// Prohibitions:
|
|
86
|
+
// - Never delete data without confirmation (agent)
|
|
87
|
+
// - Never process refunds above $500 without escalation (route)
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
This merging applies to all execution paths: single-step responses, batch execution, and streaming.
|
|
91
|
+
|
|
92
|
+
## Accessing Rules Programmatically
|
|
93
|
+
|
|
94
|
+
```typescript
|
|
95
|
+
// Agent-level
|
|
96
|
+
const agentRules = agent.getRules();
|
|
97
|
+
const agentProhibitions = agent.getProhibitions();
|
|
98
|
+
|
|
99
|
+
// Route-level (unchanged)
|
|
100
|
+
const routeRules = route.getRules();
|
|
101
|
+
const routeProhibitions = route.getProhibitions();
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## When to Use Rules vs. Guidelines
|
|
105
|
+
|
|
106
|
+
| | Rules / Prohibitions | Guidelines |
|
|
107
|
+
|---|---|---|
|
|
108
|
+
| Scope | Always active | Conditional (can have `condition`) |
|
|
109
|
+
| Purpose | Hard boundaries | Soft behavioral nudges |
|
|
110
|
+
| Enforcement | Included in every prompt | Only when condition matches |
|
|
111
|
+
| Example | "Never reveal API keys" | "When user is frustrated, apologize" |
|
|
112
|
+
|
|
113
|
+
Use rules for non-negotiable constraints. Use guidelines for context-dependent behavior.
|
|
@@ -589,7 +589,7 @@ For simple question-answering without step:
|
|
|
589
589
|
```typescript
|
|
590
590
|
const qnaRoute = agent.createRoute({
|
|
591
591
|
title: "Company Q&A",
|
|
592
|
-
|
|
592
|
+
when: ["User asks about company"],
|
|
593
593
|
// NO schema - stepless!
|
|
594
594
|
});
|
|
595
595
|
|