@falai/agent 1.2.8 → 2.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 +40 -886
- package/dist/adapters/MemoryAdapter.js +2 -2
- package/dist/adapters/MemoryAdapter.js.map +1 -1
- package/dist/adapters/MongoAdapter.js +2 -2
- package/dist/adapters/MongoAdapter.js.map +1 -1
- package/dist/adapters/OpenSearchAdapter.d.ts.map +1 -1
- package/dist/adapters/OpenSearchAdapter.js +9 -7
- package/dist/adapters/OpenSearchAdapter.js.map +1 -1
- package/dist/adapters/PostgreSQLAdapter.d.ts +14 -0
- package/dist/adapters/PostgreSQLAdapter.d.ts.map +1 -1
- package/dist/adapters/PostgreSQLAdapter.js +25 -9
- package/dist/adapters/PostgreSQLAdapter.js.map +1 -1
- package/dist/adapters/PrismaAdapter.js +5 -5
- package/dist/adapters/PrismaAdapter.js.map +1 -1
- package/dist/adapters/RedisAdapter.js +2 -2
- package/dist/adapters/RedisAdapter.js.map +1 -1
- package/dist/adapters/SQLiteAdapter.d.ts +17 -0
- package/dist/adapters/SQLiteAdapter.d.ts.map +1 -1
- package/dist/adapters/SQLiteAdapter.js +30 -11
- package/dist/adapters/SQLiteAdapter.js.map +1 -1
- package/dist/cjs/adapters/MemoryAdapter.js +2 -2
- package/dist/cjs/adapters/MemoryAdapter.js.map +1 -1
- package/dist/cjs/adapters/MongoAdapter.js +2 -2
- package/dist/cjs/adapters/MongoAdapter.js.map +1 -1
- package/dist/cjs/adapters/OpenSearchAdapter.d.ts.map +1 -1
- package/dist/cjs/adapters/OpenSearchAdapter.js +9 -7
- package/dist/cjs/adapters/OpenSearchAdapter.js.map +1 -1
- package/dist/cjs/adapters/PostgreSQLAdapter.d.ts +14 -0
- package/dist/cjs/adapters/PostgreSQLAdapter.d.ts.map +1 -1
- package/dist/cjs/adapters/PostgreSQLAdapter.js +25 -9
- package/dist/cjs/adapters/PostgreSQLAdapter.js.map +1 -1
- package/dist/cjs/adapters/PrismaAdapter.js +5 -5
- package/dist/cjs/adapters/PrismaAdapter.js.map +1 -1
- package/dist/cjs/adapters/RedisAdapter.js +2 -2
- package/dist/cjs/adapters/RedisAdapter.js.map +1 -1
- package/dist/cjs/adapters/SQLiteAdapter.d.ts +17 -0
- package/dist/cjs/adapters/SQLiteAdapter.d.ts.map +1 -1
- package/dist/cjs/adapters/SQLiteAdapter.js +30 -11
- package/dist/cjs/adapters/SQLiteAdapter.js.map +1 -1
- package/dist/cjs/constants/index.d.ts +0 -9
- package/dist/cjs/constants/index.d.ts.map +1 -1
- package/dist/cjs/constants/index.js +2 -11
- package/dist/cjs/constants/index.js.map +1 -1
- package/dist/cjs/core/Agent.d.ts +119 -153
- package/dist/cjs/core/Agent.d.ts.map +1 -1
- package/dist/cjs/core/Agent.js +471 -324
- package/dist/cjs/core/Agent.js.map +1 -1
- package/dist/cjs/core/AutoChainExecutor.d.ts +107 -0
- package/dist/cjs/core/AutoChainExecutor.d.ts.map +1 -0
- package/dist/cjs/core/AutoChainExecutor.js +297 -0
- package/dist/cjs/core/AutoChainExecutor.js.map +1 -0
- package/dist/cjs/core/BranchEvaluator.d.ts +54 -0
- package/dist/cjs/core/BranchEvaluator.d.ts.map +1 -0
- package/dist/cjs/core/BranchEvaluator.js +130 -0
- package/dist/cjs/core/BranchEvaluator.js.map +1 -0
- package/dist/cjs/core/DirectiveBus.d.ts +88 -0
- package/dist/cjs/core/DirectiveBus.d.ts.map +1 -0
- package/dist/cjs/core/DirectiveBus.js +196 -0
- package/dist/cjs/core/DirectiveBus.js.map +1 -0
- package/dist/cjs/core/DirectiveChainTracker.d.ts +49 -0
- package/dist/cjs/core/DirectiveChainTracker.d.ts.map +1 -0
- package/dist/cjs/core/DirectiveChainTracker.js +121 -0
- package/dist/cjs/core/DirectiveChainTracker.js.map +1 -0
- package/dist/cjs/core/Flow.d.ts +186 -0
- package/dist/cjs/core/Flow.d.ts.map +1 -0
- package/dist/cjs/core/Flow.js +550 -0
- package/dist/cjs/core/Flow.js.map +1 -0
- package/dist/cjs/core/FlowRouter.d.ts +182 -0
- package/dist/cjs/core/FlowRouter.d.ts.map +1 -0
- package/dist/cjs/core/{RoutingEngine.js → FlowRouter.js} +323 -306
- package/dist/cjs/core/FlowRouter.js.map +1 -0
- package/dist/cjs/core/PersistenceManager.d.ts +2 -2
- package/dist/cjs/core/PersistenceManager.d.ts.map +1 -1
- package/dist/cjs/core/PersistenceManager.js +7 -7
- package/dist/cjs/core/PersistenceManager.js.map +1 -1
- package/dist/cjs/core/PromptComposer.d.ts +21 -8
- package/dist/cjs/core/PromptComposer.d.ts.map +1 -1
- package/dist/cjs/core/PromptComposer.js +182 -105
- package/dist/cjs/core/PromptComposer.js.map +1 -1
- package/dist/cjs/core/PromptSectionCache.d.ts +1 -1
- package/dist/cjs/core/PromptSectionCache.js +1 -1
- package/dist/cjs/core/ResponseEngine.d.ts +18 -8
- package/dist/cjs/core/ResponseEngine.d.ts.map +1 -1
- package/dist/cjs/core/ResponseEngine.js +38 -36
- package/dist/cjs/core/ResponseEngine.js.map +1 -1
- package/dist/cjs/core/ResponseModal.d.ts +73 -56
- package/dist/cjs/core/ResponseModal.d.ts.map +1 -1
- package/dist/cjs/core/ResponseModal.js +1191 -1014
- package/dist/cjs/core/ResponseModal.js.map +1 -1
- package/dist/cjs/core/ResponsePipeline.d.ts +124 -26
- package/dist/cjs/core/ResponsePipeline.d.ts.map +1 -1
- package/dist/cjs/core/ResponsePipeline.js +509 -136
- package/dist/cjs/core/ResponsePipeline.js.map +1 -1
- package/dist/cjs/core/SignalEvaluator.d.ts +86 -0
- package/dist/cjs/core/SignalEvaluator.d.ts.map +1 -0
- package/dist/cjs/core/SignalEvaluator.js +333 -0
- package/dist/cjs/core/SignalEvaluator.js.map +1 -0
- package/dist/cjs/core/SignalProcessor.d.ts +152 -0
- package/dist/cjs/core/SignalProcessor.d.ts.map +1 -0
- package/dist/cjs/core/SignalProcessor.js +562 -0
- package/dist/cjs/core/SignalProcessor.js.map +1 -0
- package/dist/cjs/core/Step.d.ts +43 -32
- package/dist/cjs/core/Step.d.ts.map +1 -1
- package/dist/cjs/core/Step.js +221 -126
- package/dist/cjs/core/Step.js.map +1 -1
- package/dist/cjs/core/StreamingToolExecutor.d.ts +2 -2
- package/dist/cjs/core/StreamingToolExecutor.d.ts.map +1 -1
- package/dist/cjs/core/StreamingToolExecutor.js.map +1 -1
- package/dist/cjs/core/ToolManager.d.ts +44 -13
- package/dist/cjs/core/ToolManager.d.ts.map +1 -1
- package/dist/cjs/core/ToolManager.js +174 -91
- package/dist/cjs/core/ToolManager.js.map +1 -1
- package/dist/cjs/core/createAgent.d.ts +35 -0
- package/dist/cjs/core/createAgent.d.ts.map +1 -0
- package/dist/cjs/core/createAgent.js +39 -0
- package/dist/cjs/core/createAgent.js.map +1 -0
- package/dist/cjs/core/flow-namespace.d.ts +49 -0
- package/dist/cjs/core/flow-namespace.d.ts.map +1 -0
- package/dist/cjs/core/flow-namespace.js +171 -0
- package/dist/cjs/core/flow-namespace.js.map +1 -0
- package/dist/cjs/index.d.ts +11 -14
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +18 -22
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/providers/AnthropicProvider.d.ts +1 -1
- package/dist/cjs/providers/AnthropicProvider.js +1 -1
- package/dist/cjs/providers/GeminiProvider.d.ts +1 -1
- package/dist/cjs/providers/GeminiProvider.d.ts.map +1 -1
- package/dist/cjs/providers/GeminiProvider.js +1 -1
- package/dist/cjs/providers/GeminiProvider.js.map +1 -1
- package/dist/cjs/providers/OpenAIProvider.d.ts +1 -1
- package/dist/cjs/providers/OpenAIProvider.d.ts.map +1 -1
- package/dist/cjs/providers/OpenAIProvider.js +1 -1
- package/dist/cjs/providers/OpenAIProvider.js.map +1 -1
- package/dist/cjs/types/agent.d.ts +183 -54
- package/dist/cjs/types/agent.d.ts.map +1 -1
- package/dist/cjs/types/agent.js +0 -6
- package/dist/cjs/types/agent.js.map +1 -1
- package/dist/cjs/types/ai.d.ts +3 -3
- package/dist/cjs/types/ai.d.ts.map +1 -1
- package/dist/cjs/types/errors.d.ts +15 -0
- package/dist/cjs/types/errors.d.ts.map +1 -0
- package/dist/cjs/types/errors.js +22 -0
- package/dist/cjs/types/errors.js.map +1 -0
- package/dist/cjs/types/flow.d.ts +513 -0
- package/dist/cjs/types/flow.d.ts.map +1 -0
- package/dist/cjs/types/{route.js → flow.js} +2 -2
- package/dist/cjs/types/flow.js.map +1 -0
- package/dist/cjs/types/index.d.ts +7 -6
- package/dist/cjs/types/index.d.ts.map +1 -1
- package/dist/cjs/types/index.js +6 -2
- package/dist/cjs/types/index.js.map +1 -1
- package/dist/cjs/types/persistence.d.ts +11 -7
- package/dist/cjs/types/persistence.d.ts.map +1 -1
- package/dist/cjs/types/routing.d.ts +1 -1
- package/dist/cjs/types/routing.d.ts.map +1 -1
- package/dist/cjs/types/session.d.ts +24 -23
- package/dist/cjs/types/session.d.ts.map +1 -1
- package/dist/cjs/types/signals.d.ts +248 -0
- package/dist/cjs/types/signals.d.ts.map +1 -0
- package/dist/cjs/types/signals.js +11 -0
- package/dist/cjs/types/signals.js.map +1 -0
- package/dist/cjs/types/template.d.ts +2 -8
- package/dist/cjs/types/template.d.ts.map +1 -1
- package/dist/cjs/types/tool.d.ts +36 -29
- package/dist/cjs/types/tool.d.ts.map +1 -1
- package/dist/cjs/types/tool.js +1 -1
- package/dist/cjs/types/tool.js.map +1 -1
- package/dist/cjs/utils/condition.d.ts +7 -1
- package/dist/cjs/utils/condition.d.ts.map +1 -1
- package/dist/cjs/utils/condition.js.map +1 -1
- package/dist/cjs/utils/id.d.ts +13 -5
- package/dist/cjs/utils/id.d.ts.map +1 -1
- package/dist/cjs/utils/id.js +24 -10
- package/dist/cjs/utils/id.js.map +1 -1
- package/dist/cjs/utils/index.d.ts +2 -2
- package/dist/cjs/utils/index.d.ts.map +1 -1
- package/dist/cjs/utils/index.js +7 -3
- package/dist/cjs/utils/index.js.map +1 -1
- package/dist/cjs/utils/session.d.ts +44 -5
- package/dist/cjs/utils/session.d.ts.map +1 -1
- package/dist/cjs/utils/session.js +197 -38
- package/dist/cjs/utils/session.js.map +1 -1
- package/dist/constants/index.d.ts +0 -9
- package/dist/constants/index.d.ts.map +1 -1
- package/dist/constants/index.js +3 -9
- package/dist/constants/index.js.map +1 -1
- package/dist/core/Agent.d.ts +119 -153
- package/dist/core/Agent.d.ts.map +1 -1
- package/dist/core/Agent.js +472 -325
- package/dist/core/Agent.js.map +1 -1
- package/dist/core/AutoChainExecutor.d.ts +107 -0
- package/dist/core/AutoChainExecutor.d.ts.map +1 -0
- package/dist/core/AutoChainExecutor.js +293 -0
- package/dist/core/AutoChainExecutor.js.map +1 -0
- package/dist/core/BranchEvaluator.d.ts +54 -0
- package/dist/core/BranchEvaluator.d.ts.map +1 -0
- package/dist/core/BranchEvaluator.js +126 -0
- package/dist/core/BranchEvaluator.js.map +1 -0
- package/dist/core/DirectiveBus.d.ts +88 -0
- package/dist/core/DirectiveBus.d.ts.map +1 -0
- package/dist/core/DirectiveBus.js +192 -0
- package/dist/core/DirectiveBus.js.map +1 -0
- package/dist/core/DirectiveChainTracker.d.ts +49 -0
- package/dist/core/DirectiveChainTracker.d.ts.map +1 -0
- package/dist/core/DirectiveChainTracker.js +117 -0
- package/dist/core/DirectiveChainTracker.js.map +1 -0
- package/dist/core/Flow.d.ts +186 -0
- package/dist/core/Flow.d.ts.map +1 -0
- package/dist/core/Flow.js +546 -0
- package/dist/core/Flow.js.map +1 -0
- package/dist/core/FlowRouter.d.ts +182 -0
- package/dist/core/FlowRouter.d.ts.map +1 -0
- package/dist/core/{RoutingEngine.js → FlowRouter.js} +322 -305
- package/dist/core/FlowRouter.js.map +1 -0
- package/dist/core/PersistenceManager.d.ts +2 -2
- package/dist/core/PersistenceManager.d.ts.map +1 -1
- package/dist/core/PersistenceManager.js +7 -7
- package/dist/core/PersistenceManager.js.map +1 -1
- package/dist/core/PromptComposer.d.ts +21 -8
- package/dist/core/PromptComposer.d.ts.map +1 -1
- package/dist/core/PromptComposer.js +183 -106
- package/dist/core/PromptComposer.js.map +1 -1
- package/dist/core/PromptSectionCache.d.ts +1 -1
- package/dist/core/PromptSectionCache.js +1 -1
- package/dist/core/ResponseEngine.d.ts +18 -8
- package/dist/core/ResponseEngine.d.ts.map +1 -1
- package/dist/core/ResponseEngine.js +38 -36
- package/dist/core/ResponseEngine.js.map +1 -1
- package/dist/core/ResponseModal.d.ts +73 -56
- package/dist/core/ResponseModal.d.ts.map +1 -1
- package/dist/core/ResponseModal.js +1193 -1016
- package/dist/core/ResponseModal.js.map +1 -1
- package/dist/core/ResponsePipeline.d.ts +124 -26
- package/dist/core/ResponsePipeline.d.ts.map +1 -1
- package/dist/core/ResponsePipeline.js +509 -137
- package/dist/core/ResponsePipeline.js.map +1 -1
- package/dist/core/SignalEvaluator.d.ts +86 -0
- package/dist/core/SignalEvaluator.d.ts.map +1 -0
- package/dist/core/SignalEvaluator.js +326 -0
- package/dist/core/SignalEvaluator.js.map +1 -0
- package/dist/core/SignalProcessor.d.ts +152 -0
- package/dist/core/SignalProcessor.d.ts.map +1 -0
- package/dist/core/SignalProcessor.js +555 -0
- package/dist/core/SignalProcessor.js.map +1 -0
- package/dist/core/Step.d.ts +43 -32
- package/dist/core/Step.d.ts.map +1 -1
- package/dist/core/Step.js +220 -126
- package/dist/core/Step.js.map +1 -1
- package/dist/core/StreamingToolExecutor.d.ts +2 -2
- package/dist/core/StreamingToolExecutor.d.ts.map +1 -1
- package/dist/core/StreamingToolExecutor.js.map +1 -1
- package/dist/core/ToolManager.d.ts +44 -13
- package/dist/core/ToolManager.d.ts.map +1 -1
- package/dist/core/ToolManager.js +174 -91
- package/dist/core/ToolManager.js.map +1 -1
- package/dist/core/createAgent.d.ts +35 -0
- package/dist/core/createAgent.d.ts.map +1 -0
- package/dist/core/createAgent.js +36 -0
- package/dist/core/createAgent.js.map +1 -0
- package/dist/core/flow-namespace.d.ts +49 -0
- package/dist/core/flow-namespace.d.ts.map +1 -0
- package/dist/core/flow-namespace.js +168 -0
- package/dist/core/flow-namespace.js.map +1 -0
- package/dist/index.d.ts +11 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -12
- package/dist/index.js.map +1 -1
- package/dist/providers/AnthropicProvider.d.ts +1 -1
- package/dist/providers/AnthropicProvider.js +1 -1
- package/dist/providers/GeminiProvider.d.ts +1 -1
- package/dist/providers/GeminiProvider.d.ts.map +1 -1
- package/dist/providers/GeminiProvider.js +1 -1
- package/dist/providers/GeminiProvider.js.map +1 -1
- package/dist/providers/OpenAIProvider.d.ts +1 -1
- package/dist/providers/OpenAIProvider.d.ts.map +1 -1
- package/dist/providers/OpenAIProvider.js +1 -1
- package/dist/providers/OpenAIProvider.js.map +1 -1
- package/dist/types/agent.d.ts +183 -54
- package/dist/types/agent.d.ts.map +1 -1
- package/dist/types/agent.js +0 -6
- package/dist/types/agent.js.map +1 -1
- package/dist/types/ai.d.ts +3 -3
- package/dist/types/ai.d.ts.map +1 -1
- package/dist/types/errors.d.ts +15 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +18 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/flow.d.ts +513 -0
- package/dist/types/flow.d.ts.map +1 -0
- package/dist/types/flow.js +5 -0
- package/dist/types/flow.js.map +1 -0
- package/dist/types/index.d.ts +7 -6
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +4 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/persistence.d.ts +11 -7
- package/dist/types/persistence.d.ts.map +1 -1
- package/dist/types/routing.d.ts +1 -1
- package/dist/types/routing.d.ts.map +1 -1
- package/dist/types/session.d.ts +24 -23
- package/dist/types/session.d.ts.map +1 -1
- package/dist/types/signals.d.ts +248 -0
- package/dist/types/signals.d.ts.map +1 -0
- package/dist/types/signals.js +10 -0
- package/dist/types/signals.js.map +1 -0
- package/dist/types/template.d.ts +2 -8
- package/dist/types/template.d.ts.map +1 -1
- package/dist/types/tool.d.ts +36 -29
- package/dist/types/tool.d.ts.map +1 -1
- package/dist/types/tool.js +1 -1
- package/dist/types/tool.js.map +1 -1
- package/dist/utils/condition.d.ts +7 -1
- package/dist/utils/condition.d.ts.map +1 -1
- package/dist/utils/condition.js.map +1 -1
- package/dist/utils/id.d.ts +13 -5
- package/dist/utils/id.d.ts.map +1 -1
- package/dist/utils/id.js +22 -9
- package/dist/utils/id.js.map +1 -1
- package/dist/utils/index.d.ts +2 -2
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +2 -2
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/session.d.ts +44 -5
- package/dist/utils/session.d.ts.map +1 -1
- package/dist/utils/session.js +193 -37
- package/dist/utils/session.js.map +1 -1
- package/docs/README.md +22 -200
- package/docs/concepts/architecture.md +281 -0
- package/docs/concepts/directives.md +400 -0
- package/docs/concepts/pipeline.md +399 -0
- package/docs/guides/branching.md +263 -0
- package/docs/guides/compaction.md +163 -0
- package/docs/guides/conditions.md +167 -0
- package/docs/guides/error-handling.md +176 -0
- package/docs/guides/flow-control.md +409 -0
- package/docs/guides/instructions.md +210 -0
- package/docs/guides/persistence.md +182 -0
- package/docs/guides/streaming.md +137 -0
- package/docs/migration/README.md +14 -0
- package/docs/migration/route-to-flow.md +561 -0
- package/docs/migration/v1-to-v2.md +909 -0
- package/docs/reference/adapters.md +481 -0
- package/docs/reference/branches.md +241 -0
- package/docs/reference/create-agent.md +186 -0
- package/docs/reference/directive.md +243 -0
- package/docs/reference/errors.md +122 -0
- package/docs/reference/flow.md +238 -0
- package/docs/reference/instruction.md +177 -0
- package/docs/reference/pre-directive.md +131 -0
- package/docs/reference/providers.md +227 -0
- package/docs/reference/signals.md +356 -0
- package/docs/reference/step.md +339 -0
- package/docs/reference/tool.md +269 -0
- package/docs/start/01-install.md +81 -0
- package/docs/start/02-first-agent.md +196 -0
- package/docs/start/03-collect-data.md +222 -0
- package/docs/start/04-add-tools.md +276 -0
- package/docs/start/05-go-to-production.md +216 -0
- package/examples/01-quickstart.ts +20 -0
- package/examples/02-data-extraction.ts +90 -0
- package/examples/03-tools.ts +136 -0
- package/examples/04-instructions.ts +100 -0
- package/examples/05-branching.ts +140 -0
- package/examples/06-flow-control.ts +103 -0
- package/examples/07-streaming.ts +69 -0
- package/examples/08-persistence.ts +98 -0
- package/examples/09-signals.ts +144 -0
- package/examples/tsconfig.json +30 -0
- package/package.json +2 -1
- package/src/adapters/MemoryAdapter.ts +3 -3
- package/src/adapters/MongoAdapter.ts +3 -3
- package/src/adapters/OpenSearchAdapter.ts +10 -8
- package/src/adapters/PostgreSQLAdapter.ts +26 -10
- package/src/adapters/PrismaAdapter.ts +6 -6
- package/src/adapters/RedisAdapter.ts +3 -3
- package/src/adapters/SQLiteAdapter.ts +31 -12
- package/src/constants/index.ts +2 -10
- package/src/core/Agent.ts +585 -374
- package/src/core/AutoChainExecutor.ts +440 -0
- package/src/core/BranchEvaluator.ts +167 -0
- package/src/core/DirectiveBus.ts +248 -0
- package/src/core/DirectiveChainTracker.ts +144 -0
- package/src/core/Flow.ts +666 -0
- package/src/core/{RoutingEngine.ts → FlowRouter.ts} +385 -365
- package/src/core/PersistenceManager.ts +8 -8
- package/src/core/PromptComposer.ts +209 -140
- package/src/core/PromptSectionCache.ts +1 -1
- package/src/core/ResponseEngine.ts +61 -46
- package/src/core/ResponseModal.ts +1453 -1240
- package/src/core/ResponsePipeline.ts +655 -175
- package/src/core/SignalEvaluator.ts +420 -0
- package/src/core/SignalProcessor.ts +723 -0
- package/src/core/Step.ts +279 -176
- package/src/core/StreamingToolExecutor.ts +4 -4
- package/src/core/ToolManager.ts +200 -97
- package/src/core/createAgent.ts +40 -0
- package/src/core/flow-namespace.ts +219 -0
- package/src/index.ts +42 -36
- package/src/providers/AnthropicProvider.ts +2 -2
- package/src/providers/GeminiProvider.ts +2 -2
- package/src/providers/OpenAIProvider.ts +2 -2
- package/src/types/agent.ts +182 -53
- package/src/types/ai.ts +3 -3
- package/src/types/errors.ts +18 -0
- package/src/types/flow.ts +590 -0
- package/src/types/index.ts +43 -16
- package/src/types/persistence.ts +12 -8
- package/src/types/routing.ts +1 -1
- package/src/types/session.ts +26 -23
- package/src/types/signals.ts +321 -0
- package/src/types/template.ts +3 -11
- package/src/types/tool.ts +50 -42
- package/src/utils/condition.ts +13 -4
- package/src/utils/id.ts +27 -9
- package/src/utils/index.ts +6 -2
- package/src/utils/session.ts +238 -42
- package/dist/cjs/core/BatchExecutor.d.ts +0 -359
- package/dist/cjs/core/BatchExecutor.d.ts.map +0 -1
- package/dist/cjs/core/BatchExecutor.js +0 -861
- package/dist/cjs/core/BatchExecutor.js.map +0 -1
- package/dist/cjs/core/BatchPromptBuilder.d.ts +0 -89
- package/dist/cjs/core/BatchPromptBuilder.d.ts.map +0 -1
- package/dist/cjs/core/BatchPromptBuilder.js +0 -223
- package/dist/cjs/core/BatchPromptBuilder.js.map +0 -1
- package/dist/cjs/core/Route.d.ts +0 -180
- package/dist/cjs/core/Route.d.ts.map +0 -1
- package/dist/cjs/core/Route.js +0 -542
- package/dist/cjs/core/Route.js.map +0 -1
- package/dist/cjs/core/RoutingEngine.d.ts +0 -185
- package/dist/cjs/core/RoutingEngine.d.ts.map +0 -1
- package/dist/cjs/core/RoutingEngine.js.map +0 -1
- package/dist/cjs/types/route.d.ts +0 -336
- package/dist/cjs/types/route.d.ts.map +0 -1
- package/dist/cjs/types/route.js.map +0 -1
- package/dist/core/BatchExecutor.d.ts +0 -359
- package/dist/core/BatchExecutor.d.ts.map +0 -1
- package/dist/core/BatchExecutor.js +0 -856
- package/dist/core/BatchExecutor.js.map +0 -1
- package/dist/core/BatchPromptBuilder.d.ts +0 -89
- package/dist/core/BatchPromptBuilder.d.ts.map +0 -1
- package/dist/core/BatchPromptBuilder.js +0 -219
- package/dist/core/BatchPromptBuilder.js.map +0 -1
- package/dist/core/Route.d.ts +0 -180
- package/dist/core/Route.d.ts.map +0 -1
- package/dist/core/Route.js +0 -538
- package/dist/core/Route.js.map +0 -1
- package/dist/core/RoutingEngine.d.ts +0 -185
- package/dist/core/RoutingEngine.d.ts.map +0 -1
- package/dist/core/RoutingEngine.js.map +0 -1
- package/dist/types/route.d.ts +0 -336
- package/dist/types/route.d.ts.map +0 -1
- package/dist/types/route.js +0 -5
- package/dist/types/route.js.map +0 -1
- package/docs/CONTRIBUTING.md +0 -521
- package/docs/api/README.md +0 -3299
- package/docs/api/overview.md +0 -1410
- package/docs/architecture/data-extraction-flow.md +0 -360
- package/docs/architecture/multi-step-execution.md +0 -277
- package/docs/core/agent/README.md +0 -938
- package/docs/core/agent/context-management.md +0 -796
- package/docs/core/agent/rules-and-prohibitions.md +0 -113
- package/docs/core/agent/session-management.md +0 -693
- package/docs/core/ai-integration/prompt-composition.md +0 -355
- package/docs/core/ai-integration/providers.md +0 -515
- package/docs/core/ai-integration/response-processing.md +0 -433
- package/docs/core/conversation-flows/data-collection.md +0 -772
- package/docs/core/conversation-flows/route-dsl.md +0 -509
- package/docs/core/conversation-flows/routes.md +0 -249
- package/docs/core/conversation-flows/step-transitions.md +0 -731
- package/docs/core/conversation-flows/steps.md +0 -268
- package/docs/core/error-handling.md +0 -830
- package/docs/core/persistence/adapters.md +0 -255
- package/docs/core/persistence/session-storage.md +0 -656
- package/docs/core/routing/intelligent-routing.md +0 -470
- package/docs/core/tools/enhanced-tool.md +0 -186
- package/docs/core/tools/streaming-execution.md +0 -161
- package/docs/core/tools/tool-definition.md +0 -970
- package/docs/core/tools/tool-scoping.md +0 -819
- package/docs/guides/advanced-patterns/publishing.md +0 -186
- package/docs/guides/context-compaction.md +0 -96
- package/docs/guides/error-handling-patterns.md +0 -578
- package/docs/guides/getting-started/README.md +0 -795
- package/docs/guides/migration/README.md +0 -101
- package/docs/guides/migration/flexible-routing-conditions.md +0 -375
- package/docs/guides/migration/multi-step-execution.md +0 -393
- package/docs/guides/migration/response-modal-refactor.md +0 -518
- package/docs/guides/prompt-optimization.md +0 -164
- package/examples/advanced-patterns/context-compaction.ts +0 -223
- package/examples/advanced-patterns/knowledge-based-agent.ts +0 -735
- package/examples/advanced-patterns/persistent-onboarding.ts +0 -728
- package/examples/advanced-patterns/route-lifecycle-hooks.ts +0 -556
- package/examples/advanced-patterns/streaming-responses.ts +0 -656
- package/examples/ai-providers/anthropic-integration.ts +0 -388
- package/examples/ai-providers/openai-integration.ts +0 -228
- package/examples/condition-patterns/function-only-conditions.ts +0 -365
- package/examples/condition-patterns/mixed-array-conditions.ts +0 -477
- package/examples/condition-patterns/route-skipif-patterns.ts +0 -468
- package/examples/condition-patterns/step-skipif-patterns.ts +0 -0
- package/examples/condition-patterns/string-only-conditions.ts +0 -296
- package/examples/conversation-flows/completion-transitions.ts +0 -318
- package/examples/core-concepts/basic-agent.ts +0 -503
- package/examples/core-concepts/modern-streaming-api.ts +0 -309
- package/examples/core-concepts/schema-driven-extraction.ts +0 -332
- package/examples/core-concepts/session-management.ts +0 -494
- package/examples/integrations/database-integration.ts +0 -631
- package/examples/integrations/healthcare-integration.ts +0 -595
- package/examples/integrations/search-integration.ts +0 -530
- package/examples/integrations/server-session-management.ts +0 -307
- package/examples/persistence/custom-adapter.ts +0 -526
- package/examples/persistence/database-persistence.ts +0 -583
- package/examples/persistence/memory-sessions.ts +0 -495
- package/examples/persistence/prisma-schema.example.prisma +0 -74
- package/examples/persistence/redis-persistence.ts +0 -488
- package/examples/tools/basic-tools.ts +0 -765
- package/examples/tools/data-enrichment-tools.ts +0 -593
- package/examples/tools/enhanced-tool-metadata.ts +0 -268
- package/examples/tools/streaming-tool-execution.ts +0 -283
- package/src/core/BatchExecutor.ts +0 -1187
- package/src/core/BatchPromptBuilder.ts +0 -299
- package/src/core/Route.ts +0 -678
- package/src/types/route.ts +0 -392
|
@@ -1,470 +0,0 @@
|
|
|
1
|
-
# Intelligent Routing System
|
|
2
|
-
|
|
3
|
-
The AI routing system is the core intelligence layer of @falai/agent that enables dynamic, context-aware conversation flows. Unlike traditional state machines, the routing system uses AI to intelligently select routes and steps based on user intent, conversation history, and collected data.
|
|
4
|
-
|
|
5
|
-
## Overview
|
|
6
|
-
|
|
7
|
-
The `RoutingEngine` class powers two key decision-making processes:
|
|
8
|
-
|
|
9
|
-
1. **Route Selection**: When multiple routes are available, AI analyzes the conversation to score and select the most appropriate route
|
|
10
|
-
2. **Step Selection**: Within an active route, AI determines the best next step from available candidates
|
|
11
|
-
|
|
12
|
-
## How It Works
|
|
13
|
-
|
|
14
|
-
### Route Selection Process
|
|
15
|
-
|
|
16
|
-
When an agent has multiple routes defined, the routing engine:
|
|
17
|
-
|
|
18
|
-
1. **Analyzes Context**: Evaluates conversation history, user intent, and current session state
|
|
19
|
-
2. **Scores Routes**: Uses AI to score each route (0-100) based on relevance and semantic fit
|
|
20
|
-
3. **Applies Thresholds**: Considers switching costs and maintains conversation continuity
|
|
21
|
-
4. **Selects Winner**: Chooses the highest-scoring route or stays with the current route
|
|
22
|
-
|
|
23
|
-
### Step Selection Process
|
|
24
|
-
|
|
25
|
-
Within an active route, the routing engine:
|
|
26
|
-
|
|
27
|
-
1. **Finds Candidates**: Traverses the step chain to identify valid next steps
|
|
28
|
-
2. **Evaluates Conditions**: Respects `skipIf` conditions and `requires` dependencies
|
|
29
|
-
3. **AI Decision**: When multiple candidates exist, uses AI to select the optimal step
|
|
30
|
-
4. **Handles Completion**: Detects route completion and manages transitions
|
|
31
|
-
|
|
32
|
-
## Enhanced Condition System
|
|
33
|
-
|
|
34
|
-
### ConditionTemplate for Routes and Steps
|
|
35
|
-
|
|
36
|
-
The routing system now supports the powerful `ConditionTemplate` type for both route activation and step control:
|
|
37
|
-
|
|
38
|
-
```typescript
|
|
39
|
-
// Route with mixed condition types
|
|
40
|
-
agent.createRoute({
|
|
41
|
-
title: "Premium Support",
|
|
42
|
-
when: [
|
|
43
|
-
"User needs premium or priority support", // AI context
|
|
44
|
-
(ctx) => ctx.context?.accountTier === 'premium' // Programmatic check
|
|
45
|
-
],
|
|
46
|
-
skipIf: [
|
|
47
|
-
"Support system is under maintenance", // AI context
|
|
48
|
-
(ctx) => ctx.context?.maintenanceMode === true // Programmatic check
|
|
49
|
-
],
|
|
50
|
-
steps: [
|
|
51
|
-
{
|
|
52
|
-
id: "priority_greeting",
|
|
53
|
-
when: "User should receive priority treatment", // AI context only
|
|
54
|
-
prompt: "Welcome to premium support! How can I assist you today?",
|
|
55
|
-
collect: ["issueType"]
|
|
56
|
-
},
|
|
57
|
-
{
|
|
58
|
-
id: "technical_help",
|
|
59
|
-
when: [
|
|
60
|
-
"User needs technical assistance", // AI context
|
|
61
|
-
(ctx) => ctx.data?.issueType === 'technical' // Programmatic check
|
|
62
|
-
],
|
|
63
|
-
skipIf: (ctx) => ctx.data?.issueResolved === true, // Function-only skipIf
|
|
64
|
-
prompt: "Let me help you with your technical issue",
|
|
65
|
-
collect: ["issueDescription"]
|
|
66
|
-
}
|
|
67
|
-
]
|
|
68
|
-
});
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
### Condition Evaluation Logic
|
|
72
|
-
|
|
73
|
-
**Route `when` conditions (AND logic):**
|
|
74
|
-
- All function conditions must return `true`
|
|
75
|
-
- String conditions provide AI context for route scoring
|
|
76
|
-
- Arrays require all functions to pass
|
|
77
|
-
|
|
78
|
-
**Route `skipIf` conditions (OR logic):**
|
|
79
|
-
- Any function returning `true` excludes the route
|
|
80
|
-
- String conditions provide AI context about exclusion reasons
|
|
81
|
-
- Arrays skip if any function returns `true`
|
|
82
|
-
|
|
83
|
-
**Step `when` conditions (AND logic):**
|
|
84
|
-
- All function conditions must return `true` for step to be eligible
|
|
85
|
-
- String conditions help AI understand step purpose
|
|
86
|
-
- Arrays require all functions to pass
|
|
87
|
-
|
|
88
|
-
**Step `skipIf` conditions (OR logic):**
|
|
89
|
-
- Any function returning `true` skips the step
|
|
90
|
-
- String conditions provide AI context about why step is skipped
|
|
91
|
-
- Arrays skip if any function returns `true`
|
|
92
|
-
|
|
93
|
-
### Hybrid Evaluation Process
|
|
94
|
-
|
|
95
|
-
The routing engine now performs a two-phase evaluation:
|
|
96
|
-
|
|
97
|
-
1. **Programmatic Phase**: Execute all function conditions for boolean results
|
|
98
|
-
2. **AI Context Phase**: Include string conditions in AI prompts for intelligent decision-making
|
|
99
|
-
|
|
100
|
-
```typescript
|
|
101
|
-
// Example evaluation flow:
|
|
102
|
-
const routeCondition = [
|
|
103
|
-
"User wants to upgrade their account", // → AI context
|
|
104
|
-
(ctx) => ctx.context?.accountTier !== 'enterprise' // → Must be true
|
|
105
|
-
];
|
|
106
|
-
|
|
107
|
-
// Programmatic: Check if user can upgrade (not already enterprise)
|
|
108
|
-
// AI Context: "User wants to upgrade their account" helps AI understand intent
|
|
109
|
-
// Result: Route eligible if function passes AND AI scores it highly
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
### Context-Aware Routing
|
|
113
|
-
|
|
114
|
-
Conditions can access comprehensive context:
|
|
115
|
-
|
|
116
|
-
```typescript
|
|
117
|
-
interface RoutingContext {
|
|
118
|
-
userId: string;
|
|
119
|
-
accountTier: 'free' | 'premium' | 'enterprise';
|
|
120
|
-
supportHistory: SupportTicket[];
|
|
121
|
-
currentTime: Date;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
interface AgentData {
|
|
125
|
-
customerName?: string;
|
|
126
|
-
issueType?: string;
|
|
127
|
-
priority?: 'low' | 'medium' | 'high';
|
|
128
|
-
previousAttempts?: number;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
// Route with context-aware conditions
|
|
132
|
-
agent.createRoute({
|
|
133
|
-
title: "Escalation Support",
|
|
134
|
-
when: [
|
|
135
|
-
"User needs escalated support or is frustrated", // AI context
|
|
136
|
-
(ctx) => ctx.data?.previousAttempts > 2, // Data check
|
|
137
|
-
(ctx) => ctx.context?.supportHistory.length > 5 // Context check
|
|
138
|
-
],
|
|
139
|
-
skipIf: [
|
|
140
|
-
"Issue has been resolved recently", // AI context
|
|
141
|
-
(ctx) => {
|
|
142
|
-
const lastTicket = ctx.context?.supportHistory[0];
|
|
143
|
-
return lastTicket?.status === 'resolved' &&
|
|
144
|
-
(Date.now() - lastTicket.resolvedAt.getTime()) < 24 * 60 * 60 * 1000;
|
|
145
|
-
}
|
|
146
|
-
]
|
|
147
|
-
});
|
|
148
|
-
```
|
|
149
|
-
|
|
150
|
-
## Key Features
|
|
151
|
-
|
|
152
|
-
### Intelligent Route Scoring
|
|
153
|
-
|
|
154
|
-
Routes are scored based on multiple factors:
|
|
155
|
-
|
|
156
|
-
```typescript
|
|
157
|
-
// Routes receive scores 0-100 based on:
|
|
158
|
-
- Explicit keyword matches (90-100)
|
|
159
|
-
- Contextual evidence (70-89)
|
|
160
|
-
- Moderate relevance (50-69)
|
|
161
|
-
- Weak connections (30-49)
|
|
162
|
-
- Minimal relevance (0-29)
|
|
163
|
-
```
|
|
164
|
-
|
|
165
|
-
### Smart Step Traversal
|
|
166
|
-
|
|
167
|
-
The system intelligently traverses step chains:
|
|
168
|
-
|
|
169
|
-
- **Skip Logic**: Automatically skips steps where `skipIf` conditions are met
|
|
170
|
-
- **Dependency Checking**: Ensures required data is present before allowing step progression
|
|
171
|
-
- **Loop Prevention**: Uses visited sets to prevent infinite traversal
|
|
172
|
-
- **Branch Resolution**: Handles complex branching logic with AI assistance
|
|
173
|
-
|
|
174
|
-
### Context-Aware Decisions
|
|
175
|
-
|
|
176
|
-
All routing decisions consider:
|
|
177
|
-
|
|
178
|
-
- **Conversation History**: Full dialogue context
|
|
179
|
-
- **Agent-Level Data**: Centralized information gathered across all routes
|
|
180
|
-
- **Session State**: Current route and step position with cross-route data access
|
|
181
|
-
- **Route Completion**: Progress toward required fields for each route
|
|
182
|
-
- **Agent Knowledge**: Guidelines, terms, and domain knowledge
|
|
183
|
-
|
|
184
|
-
## Route Selection API
|
|
185
|
-
|
|
186
|
-
### Single Route Optimization
|
|
187
|
-
|
|
188
|
-
For agents with only one route, the system optimizes by skipping expensive route scoring:
|
|
189
|
-
|
|
190
|
-
```typescript
|
|
191
|
-
// Single route - direct step selection
|
|
192
|
-
const result = await routingEngine.decideSingleRouteStep({
|
|
193
|
-
route: userOnboardingRoute,
|
|
194
|
-
session,
|
|
195
|
-
history,
|
|
196
|
-
agentOptions,
|
|
197
|
-
provider,
|
|
198
|
-
context,
|
|
199
|
-
});
|
|
200
|
-
```
|
|
201
|
-
|
|
202
|
-
### Multi-Route Orchestration
|
|
203
|
-
|
|
204
|
-
For complex agents with multiple routes:
|
|
205
|
-
|
|
206
|
-
```typescript
|
|
207
|
-
// Multiple routes - full AI-powered selection
|
|
208
|
-
const result = await routingEngine.decideRouteAndStep({
|
|
209
|
-
routes: [onboardingRoute, supportRoute, salesRoute],
|
|
210
|
-
session,
|
|
211
|
-
history,
|
|
212
|
-
agentOptions,
|
|
213
|
-
provider,
|
|
214
|
-
context,
|
|
215
|
-
});
|
|
216
|
-
```
|
|
217
|
-
|
|
218
|
-
## Step Candidate Logic
|
|
219
|
-
|
|
220
|
-
### Finding Valid Steps
|
|
221
|
-
|
|
222
|
-
The `getCandidateSteps()` method implements sophisticated logic:
|
|
223
|
-
|
|
224
|
-
```typescript
|
|
225
|
-
// Find valid next steps considering:
|
|
226
|
-
const candidates = routingEngine.getCandidateSteps(
|
|
227
|
-
route, // Current route
|
|
228
|
-
currentStep, // Current step (or null for route start)
|
|
229
|
-
agentData // Agent-level data collected across all routes
|
|
230
|
-
);
|
|
231
|
-
```
|
|
232
|
-
|
|
233
|
-
### SkipIf Processing
|
|
234
|
-
|
|
235
|
-
Steps are automatically filtered based on agent-level data conditions:
|
|
236
|
-
|
|
237
|
-
```typescript
|
|
238
|
-
// Step definition with skipIf using agent data
|
|
239
|
-
initialStep: {
|
|
240
|
-
prompt: "What's your name?",
|
|
241
|
-
collect: ["name"],
|
|
242
|
-
skipIf: (data) => data.name !== undefined // Skip if name already collected by any route
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
// Cross-route skipping example
|
|
246
|
-
const emailStep = {
|
|
247
|
-
prompt: "What's your email?",
|
|
248
|
-
collect: ["email"],
|
|
249
|
-
skipIf: (data) => data.email !== undefined // Skip if collected in different route
|
|
250
|
-
}
|
|
251
|
-
```
|
|
252
|
-
|
|
253
|
-
### Recursive Traversal
|
|
254
|
-
|
|
255
|
-
The system recursively traverses step chains to find valid paths:
|
|
256
|
-
|
|
257
|
-
```typescript
|
|
258
|
-
// Handles complex scenarios like:
|
|
259
|
-
// Step A (skipIf: condition) -> Step B -> Step C (requires: data)
|
|
260
|
-
// If Step A is skipped, system continues to Step B, then evaluates Step C
|
|
261
|
-
```
|
|
262
|
-
|
|
263
|
-
## Prompt Engineering
|
|
264
|
-
|
|
265
|
-
### Route Selection Prompts
|
|
266
|
-
|
|
267
|
-
The system builds comprehensive prompts for route selection:
|
|
268
|
-
|
|
269
|
-
```typescript
|
|
270
|
-
const routingPrompt = await routingEngine.buildRoutingPrompt({
|
|
271
|
-
history,
|
|
272
|
-
routes,
|
|
273
|
-
lastMessage,
|
|
274
|
-
agentOptions,
|
|
275
|
-
session,
|
|
276
|
-
activeRouteSteps,
|
|
277
|
-
context,
|
|
278
|
-
});
|
|
279
|
-
```
|
|
280
|
-
|
|
281
|
-
Prompts include:
|
|
282
|
-
|
|
283
|
-
- Agent identity and personality
|
|
284
|
-
- Available routes with descriptions and required fields
|
|
285
|
-
- Session context and agent-level collected data
|
|
286
|
-
- Route completion progress (e.g., "2/3 required fields collected")
|
|
287
|
-
- Scoring guidelines (90-100 scale)
|
|
288
|
-
- Conversation history and directives
|
|
289
|
-
|
|
290
|
-
### Step Selection Prompts
|
|
291
|
-
|
|
292
|
-
For step selection within routes:
|
|
293
|
-
|
|
294
|
-
```typescript
|
|
295
|
-
const stepPrompt = await routingEngine.buildStepSelectionPrompt({
|
|
296
|
-
route,
|
|
297
|
-
currentStep,
|
|
298
|
-
candidates,
|
|
299
|
-
data: agent.getCollectedData(), // Agent-level data
|
|
300
|
-
history,
|
|
301
|
-
lastMessage,
|
|
302
|
-
agentOptions,
|
|
303
|
-
context,
|
|
304
|
-
session,
|
|
305
|
-
});
|
|
306
|
-
```
|
|
307
|
-
|
|
308
|
-
## Response Processing
|
|
309
|
-
|
|
310
|
-
### Structured Scoring
|
|
311
|
-
|
|
312
|
-
AI responses use JSON schemas for reliable parsing:
|
|
313
|
-
|
|
314
|
-
```typescript
|
|
315
|
-
// Route scoring schema
|
|
316
|
-
{
|
|
317
|
-
context: "Brief summary of user intent",
|
|
318
|
-
routes: {
|
|
319
|
-
"route-id-1": 85, // Score 0-100
|
|
320
|
-
"route-id-2": 72,
|
|
321
|
-
"route-id-3": 45
|
|
322
|
-
},
|
|
323
|
-
responseDirectives: ["Focus on pricing", "Be helpful"]
|
|
324
|
-
}
|
|
325
|
-
```
|
|
326
|
-
|
|
327
|
-
### Step Selection Schema
|
|
328
|
-
|
|
329
|
-
```typescript
|
|
330
|
-
// Step selection schema
|
|
331
|
-
{
|
|
332
|
-
reasoning: "Why this step was selected",
|
|
333
|
-
selectedStepId: "step-id",
|
|
334
|
-
responseDirectives: ["Address concerns", "Provide options"]
|
|
335
|
-
}
|
|
336
|
-
```
|
|
337
|
-
|
|
338
|
-
## Integration with Agent Flow
|
|
339
|
-
|
|
340
|
-
### Response Pipeline Integration
|
|
341
|
-
|
|
342
|
-
The routing engine integrates seamlessly with the response pipeline:
|
|
343
|
-
|
|
344
|
-
```typescript
|
|
345
|
-
// In Agent.respondStream():
|
|
346
|
-
1. Prepare context and session
|
|
347
|
-
2. Call routingEngine.decideRouteAndStep()
|
|
348
|
-
3. Execute prepare() functions on current step
|
|
349
|
-
4. Generate AI response with selected route/step
|
|
350
|
-
5. Process tool calls and data collection
|
|
351
|
-
6. Handle route completion and transitions
|
|
352
|
-
```
|
|
353
|
-
|
|
354
|
-
### Session State Management
|
|
355
|
-
|
|
356
|
-
Routing decisions update session state:
|
|
357
|
-
|
|
358
|
-
```typescript
|
|
359
|
-
// Session updates include:
|
|
360
|
-
- Current route transitions
|
|
361
|
-
- Step progression
|
|
362
|
-
- Initial data merging
|
|
363
|
-
- Route completion handling
|
|
364
|
-
- Pending transition management
|
|
365
|
-
```
|
|
366
|
-
|
|
367
|
-
## Performance Optimizations
|
|
368
|
-
|
|
369
|
-
### Single Route Fast Path
|
|
370
|
-
|
|
371
|
-
For agents with one route, skips route scoring entirely:
|
|
372
|
-
|
|
373
|
-
```typescript
|
|
374
|
-
if (routes.length === 1) {
|
|
375
|
-
return this.decideSingleRouteStep(/* optimized path */);
|
|
376
|
-
}
|
|
377
|
-
```
|
|
378
|
-
|
|
379
|
-
### Sticky Route Switching
|
|
380
|
-
|
|
381
|
-
When the agent is already on a route, it won't switch unless an alternative route scores higher by a configurable margin. This prevents flip-flopping on marginal score differences:
|
|
382
|
-
|
|
383
|
-
```typescript
|
|
384
|
-
const agent = new Agent({
|
|
385
|
-
// ...
|
|
386
|
-
routeSwitchMargin: 15, // default: 15, range 0-100
|
|
387
|
-
});
|
|
388
|
-
```
|
|
389
|
-
|
|
390
|
-
A margin of 15 means the best alternative must outscore the current route by at least 15 points before a switch occurs.
|
|
391
|
-
|
|
392
|
-
## Error Handling & Resilience
|
|
393
|
-
|
|
394
|
-
### Backup Model Support
|
|
395
|
-
|
|
396
|
-
When primary AI models fail, automatically tries backup models:
|
|
397
|
-
|
|
398
|
-
```typescript
|
|
399
|
-
// Automatic fallback to backup models
|
|
400
|
-
// Error classification (rate limits, overloads, etc.)
|
|
401
|
-
// Timeout and retry logic
|
|
402
|
-
```
|
|
403
|
-
|
|
404
|
-
### Validation & Fallbacks
|
|
405
|
-
|
|
406
|
-
Robust validation ensures system stability:
|
|
407
|
-
|
|
408
|
-
```typescript
|
|
409
|
-
// Invalid responses fallback to first candidate
|
|
410
|
-
// Missing data handled gracefully
|
|
411
|
-
// Circular dependencies prevented
|
|
412
|
-
```
|
|
413
|
-
|
|
414
|
-
## Configuration Options
|
|
415
|
-
|
|
416
|
-
### Routing Configuration
|
|
417
|
-
|
|
418
|
-
```typescript
|
|
419
|
-
const agent = new Agent({
|
|
420
|
-
// ...
|
|
421
|
-
routeSwitchMargin: 15, // Score margin before switching routes (0-100, default: 15)
|
|
422
|
-
});
|
|
423
|
-
```
|
|
424
|
-
|
|
425
|
-
## Best Practices
|
|
426
|
-
|
|
427
|
-
### Route Design
|
|
428
|
-
|
|
429
|
-
1. **Clear Conditions**: Define specific conditions for route activation
|
|
430
|
-
2. **Distinct Purposes**: Ensure routes serve different user intents
|
|
431
|
-
3. **Progressive Disclosure**: Use step dependencies to control information flow
|
|
432
|
-
4. **Completion Handling**: Define clear end states and transitions
|
|
433
|
-
|
|
434
|
-
### Step Design
|
|
435
|
-
|
|
436
|
-
1. **Atomic Actions**: Each step should accomplish one clear goal
|
|
437
|
-
2. **Smart Skipping**: Use `skipIf` to avoid redundant questions
|
|
438
|
-
3. **Data Dependencies**: Use `requires` to enforce logical flow
|
|
439
|
-
4. **Branch Wisely**: AI can handle branching but prefer linear flows when possible
|
|
440
|
-
|
|
441
|
-
### Performance
|
|
442
|
-
|
|
443
|
-
1. **Limit Routes**: Too many routes increase AI evaluation time
|
|
444
|
-
2. **Optimize Prompts**: Keep route/step descriptions concise
|
|
445
|
-
3. **Cache Context**: Reuse context when possible
|
|
446
|
-
4. **Monitor Scores**: Track route selection accuracy and adjust conditions
|
|
447
|
-
|
|
448
|
-
## Debugging & Monitoring
|
|
449
|
-
|
|
450
|
-
### Route Selection Logging
|
|
451
|
-
|
|
452
|
-
```typescript
|
|
453
|
-
// Debug logging shows:
|
|
454
|
-
- Route scores and reasoning
|
|
455
|
-
- Selected routes and steps
|
|
456
|
-
- Candidate evaluation process
|
|
457
|
-
- Context analysis results
|
|
458
|
-
```
|
|
459
|
-
|
|
460
|
-
### Performance Metrics
|
|
461
|
-
|
|
462
|
-
```typescript
|
|
463
|
-
// Track:
|
|
464
|
-
- Route selection accuracy
|
|
465
|
-
- Step transition success rates
|
|
466
|
-
- AI call latency and costs
|
|
467
|
-
- User satisfaction scores
|
|
468
|
-
```
|
|
469
|
-
|
|
470
|
-
The intelligent routing system transforms traditional conversation design from static flows into dynamic, AI-driven experiences that adapt to user needs and context.
|
|
@@ -1,186 +0,0 @@
|
|
|
1
|
-
# EnhancedTool Interface
|
|
2
|
-
|
|
3
|
-
`EnhancedTool` extends the existing `Tool` interface with optional metadata for concurrency control, permission gating, input validation, and result size management. All additional methods are optional — plain `Tool` objects remain fully compatible.
|
|
4
|
-
|
|
5
|
-
## Interface
|
|
6
|
-
|
|
7
|
-
```typescript
|
|
8
|
-
interface EnhancedTool<TContext = any, TData = any, TResult = any>
|
|
9
|
-
extends Tool<TContext, TData, TResult> {
|
|
10
|
-
|
|
11
|
-
// Concurrency & safety
|
|
12
|
-
isConcurrencySafe?(input?: Record<string, unknown>): boolean;
|
|
13
|
-
isReadOnly?(input?: Record<string, unknown>): boolean;
|
|
14
|
-
isDestructive?(input?: Record<string, unknown>): boolean;
|
|
15
|
-
|
|
16
|
-
// Execution control
|
|
17
|
-
interruptBehavior?(): 'cancel' | 'block';
|
|
18
|
-
maxResultSizeChars?: number;
|
|
19
|
-
|
|
20
|
-
// Validation & permissions
|
|
21
|
-
validateInput?(
|
|
22
|
-
input: Record<string, unknown>,
|
|
23
|
-
context: ToolContext<TContext, TData>
|
|
24
|
-
): Promise<ToolValidationResult> | ToolValidationResult;
|
|
25
|
-
|
|
26
|
-
checkPermissions?(
|
|
27
|
-
input: Record<string, unknown>,
|
|
28
|
-
context: ToolContext<TContext, TData>
|
|
29
|
-
): Promise<ToolPermissionResult> | ToolPermissionResult;
|
|
30
|
-
}
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
## Methods & Properties
|
|
34
|
-
|
|
35
|
-
### isConcurrencySafe
|
|
36
|
-
|
|
37
|
-
Returns `true` if this tool can safely run in parallel with other concurrency-safe tools. The `StreamingToolExecutor` evaluates this once at queue time and caches the result.
|
|
38
|
-
|
|
39
|
-
Default (when absent): `false` — the tool runs serially.
|
|
40
|
-
|
|
41
|
-
```typescript
|
|
42
|
-
const listFiles: EnhancedTool = {
|
|
43
|
-
id: "list-files",
|
|
44
|
-
name: "list_files",
|
|
45
|
-
description: "List files in a directory",
|
|
46
|
-
handler: async (ctx, args) => { /* ... */ },
|
|
47
|
-
isConcurrencySafe: () => true,
|
|
48
|
-
};
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
The method receives the tool's input arguments, so concurrency safety can be input-dependent:
|
|
52
|
-
|
|
53
|
-
```typescript
|
|
54
|
-
isConcurrencySafe: (input) => {
|
|
55
|
-
// Safe for read paths, not safe for write paths
|
|
56
|
-
return input?.mode === "read";
|
|
57
|
-
},
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
### isReadOnly / isDestructive
|
|
61
|
-
|
|
62
|
-
Informational metadata. `isReadOnly` indicates the tool has no side effects; `isDestructive` indicates irreversible operations. Both default to `false` when absent.
|
|
63
|
-
|
|
64
|
-
```typescript
|
|
65
|
-
isReadOnly: () => true,
|
|
66
|
-
isDestructive: () => false,
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
### interruptBehavior
|
|
70
|
-
|
|
71
|
-
Controls how the tool responds to abort signals (sibling failure or parent cancellation):
|
|
72
|
-
|
|
73
|
-
- `'cancel'` — immediately abort the tool
|
|
74
|
-
- `'block'` — allow the tool to finish (default when absent)
|
|
75
|
-
|
|
76
|
-
```typescript
|
|
77
|
-
interruptBehavior: () => "cancel",
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
### maxResultSizeChars
|
|
81
|
-
|
|
82
|
-
Maximum characters for the tool result. Results exceeding this limit are truncated with a notice like `[Truncated: 12000 chars total, showing first 5000]`.
|
|
83
|
-
|
|
84
|
-
```typescript
|
|
85
|
-
maxResultSizeChars: 50_000,
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
### validateInput
|
|
89
|
-
|
|
90
|
-
Called before the tool handler. If it returns `{ valid: false }`, the handler is never invoked and a validation error is returned instead.
|
|
91
|
-
|
|
92
|
-
```typescript
|
|
93
|
-
validateInput: async (input, ctx) => {
|
|
94
|
-
if (!input.resourceId || typeof input.resourceId !== "string") {
|
|
95
|
-
return { valid: false, error: "resourceId must be a non-empty string" };
|
|
96
|
-
}
|
|
97
|
-
return { valid: true };
|
|
98
|
-
},
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
The return type:
|
|
102
|
-
|
|
103
|
-
```typescript
|
|
104
|
-
interface ToolValidationResult {
|
|
105
|
-
valid: boolean;
|
|
106
|
-
error?: string;
|
|
107
|
-
correctedInput?: Record<string, unknown>;
|
|
108
|
-
}
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
### checkPermissions
|
|
112
|
-
|
|
113
|
-
Called before the tool handler (after validation). If it returns `{ allowed: false }`, the handler is never invoked and a permission error is returned.
|
|
114
|
-
|
|
115
|
-
```typescript
|
|
116
|
-
checkPermissions: async (input, ctx) => {
|
|
117
|
-
const role = (ctx.context as any)?.userRole;
|
|
118
|
-
if (role !== "admin") {
|
|
119
|
-
return { allowed: false, reason: "Only admins can delete resources", canOverride: false };
|
|
120
|
-
}
|
|
121
|
-
return { allowed: true };
|
|
122
|
-
},
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
The return type:
|
|
126
|
-
|
|
127
|
-
```typescript
|
|
128
|
-
interface ToolPermissionResult {
|
|
129
|
-
allowed: boolean;
|
|
130
|
-
reason?: string;
|
|
131
|
-
canOverride?: boolean;
|
|
132
|
-
}
|
|
133
|
-
```
|
|
134
|
-
|
|
135
|
-
## Full Example
|
|
136
|
-
|
|
137
|
-
```typescript
|
|
138
|
-
const deleteTool: EnhancedTool = {
|
|
139
|
-
id: "delete-resource",
|
|
140
|
-
name: "delete_resource",
|
|
141
|
-
description: "Delete a resource permanently",
|
|
142
|
-
parameters: {
|
|
143
|
-
type: "object",
|
|
144
|
-
properties: { resourceId: { type: "string" } },
|
|
145
|
-
required: ["resourceId"],
|
|
146
|
-
},
|
|
147
|
-
handler: async (ctx, args) => {
|
|
148
|
-
await deleteResource(args?.resourceId as string);
|
|
149
|
-
return { success: true };
|
|
150
|
-
},
|
|
151
|
-
|
|
152
|
-
isConcurrencySafe: () => false,
|
|
153
|
-
isReadOnly: () => false,
|
|
154
|
-
isDestructive: () => true,
|
|
155
|
-
interruptBehavior: () => "block",
|
|
156
|
-
maxResultSizeChars: 500,
|
|
157
|
-
|
|
158
|
-
validateInput: async (input) => {
|
|
159
|
-
if (!input.resourceId || typeof input.resourceId !== "string") {
|
|
160
|
-
return { valid: false, error: "resourceId must be a non-empty string" };
|
|
161
|
-
}
|
|
162
|
-
return { valid: true };
|
|
163
|
-
},
|
|
164
|
-
|
|
165
|
-
checkPermissions: async (input, ctx) => {
|
|
166
|
-
const role = (ctx.context as any)?.userRole;
|
|
167
|
-
if (role !== "admin") {
|
|
168
|
-
return { allowed: false, reason: "Only admins can delete resources" };
|
|
169
|
-
}
|
|
170
|
-
return { allowed: true };
|
|
171
|
-
},
|
|
172
|
-
};
|
|
173
|
-
```
|
|
174
|
-
|
|
175
|
-
## Backward Compatibility
|
|
176
|
-
|
|
177
|
-
Plain `Tool` objects without any `EnhancedTool` methods work exactly as before. The framework applies these defaults:
|
|
178
|
-
|
|
179
|
-
| Property | Default |
|
|
180
|
-
|---|---|
|
|
181
|
-
| `isConcurrencySafe` | `false` |
|
|
182
|
-
| `isReadOnly` | `false` |
|
|
183
|
-
| `isDestructive` | `false` |
|
|
184
|
-
| `interruptBehavior` | `'block'` |
|
|
185
|
-
| `validateInput` | skipped |
|
|
186
|
-
| `checkPermissions` | skipped |
|