@falai/agent 1.2.7 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +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 +1196 -1015
- 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 +524 -134
- 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/GeminiProvider.d.ts +3 -3
- package/dist/cjs/providers/GeminiProvider.d.ts.map +1 -1
- package/dist/cjs/providers/GeminiProvider.js +16 -14
- package/dist/cjs/providers/GeminiProvider.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 +1198 -1017
- 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 +524 -135
- 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/GeminiProvider.d.ts +3 -3
- package/dist/providers/GeminiProvider.d.ts.map +1 -1
- package/dist/providers/GeminiProvider.js +16 -14
- package/dist/providers/GeminiProvider.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 +15 -202
- 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 +15 -0
- package/docs/migration/route-to-flow.md +560 -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 +1458 -1241
- package/src/core/ResponsePipeline.ts +675 -173
- 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/GeminiProvider.ts +17 -15
- 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,830 +0,0 @@
|
|
|
1
|
-
# Error Handling
|
|
2
|
-
|
|
3
|
-
@fali/agent provides comprehensive error handling mechanisms for streaming operations, route completion detection, and agent-session data synchronization. This document covers error propagation patterns, recovery strategies, and best practices.
|
|
4
|
-
|
|
5
|
-
## Overview
|
|
6
|
-
|
|
7
|
-
The framework handles errors across multiple layers:
|
|
8
|
-
|
|
9
|
-
- **Streaming Error Propagation** - Proper error handling in streaming AI responses
|
|
10
|
-
- **Route Completion Logic** - Accurate detection of route completion states
|
|
11
|
-
- **Session Data Synchronization** - Consistent error handling for agent-session data operations
|
|
12
|
-
- **Tool Execution Errors** - Graceful handling of tool failures
|
|
13
|
-
- **Validation Errors** - Schema and data validation error recovery
|
|
14
|
-
- **Batch Execution Errors** - Error handling during multi-step batch execution
|
|
15
|
-
|
|
16
|
-
## Batch Execution Error Handling
|
|
17
|
-
|
|
18
|
-
When executing multiple steps in a batch, errors are handled according to their category and severity.
|
|
19
|
-
|
|
20
|
-
### Error Categories
|
|
21
|
-
|
|
22
|
-
| Error Type | Severity | Behavior |
|
|
23
|
-
|------------|----------|----------|
|
|
24
|
-
| `pre_extraction` | Warning | Log warning, continue with empty extraction |
|
|
25
|
-
| `skipif_evaluation` | Warning | Treat step as non-skippable, include in batch |
|
|
26
|
-
| `prepare_hook` | Fatal | Stop batch execution, return error response |
|
|
27
|
-
| `llm_call` | Fatal | Stop batch, preserve last successful session state |
|
|
28
|
-
| `data_validation` | Non-fatal | Include errors in response, preserve partial data |
|
|
29
|
-
| `finalize_hook` | Non-fatal | Log error, continue with remaining hooks |
|
|
30
|
-
|
|
31
|
-
### Pre-Extraction Errors
|
|
32
|
-
|
|
33
|
-
Failures during data extraction from user message:
|
|
34
|
-
|
|
35
|
-
```typescript
|
|
36
|
-
// Pre-extraction is an optimization; failure shouldn't block execution
|
|
37
|
-
try {
|
|
38
|
-
const preExtracted = await preExtractData(message, route);
|
|
39
|
-
session = mergeCollected(session, preExtracted);
|
|
40
|
-
} catch (error) {
|
|
41
|
-
// Log warning but continue
|
|
42
|
-
console.warn("Pre-extraction failed:", error.message);
|
|
43
|
-
// Continue with empty extraction result
|
|
44
|
-
}
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
### SkipIf Evaluation Errors
|
|
48
|
-
|
|
49
|
-
Exceptions thrown by skipIf conditions:
|
|
50
|
-
|
|
51
|
-
```typescript
|
|
52
|
-
// Safer to execute than skip when condition is indeterminate
|
|
53
|
-
let shouldSkip = false;
|
|
54
|
-
try {
|
|
55
|
-
shouldSkip = await step.evaluateSkipIf(context);
|
|
56
|
-
} catch (error) {
|
|
57
|
-
console.warn(`skipIf error for step ${step.id}, treating as non-skippable`);
|
|
58
|
-
shouldSkip = false; // Include step in batch
|
|
59
|
-
}
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
### Prepare Hook Errors
|
|
63
|
-
|
|
64
|
-
Failures in step prepare hooks stop batch execution:
|
|
65
|
-
|
|
66
|
-
```typescript
|
|
67
|
-
const response = await agent.respond("Process my request");
|
|
68
|
-
|
|
69
|
-
if (response.stoppedReason === 'prepare_error') {
|
|
70
|
-
console.error("Prepare hook failed:", response.error);
|
|
71
|
-
// {
|
|
72
|
-
// type: 'prepare_hook',
|
|
73
|
-
// message: 'Validation failed in prepare hook',
|
|
74
|
-
// stepId: 'validate-step',
|
|
75
|
-
// details: { ... }
|
|
76
|
-
// }
|
|
77
|
-
|
|
78
|
-
// Session state is preserved from before the failed hook
|
|
79
|
-
console.log(response.session); // Last successful state
|
|
80
|
-
}
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
### LLM Call Errors
|
|
84
|
-
|
|
85
|
-
Provider failures, timeouts, and rate limits:
|
|
86
|
-
|
|
87
|
-
```typescript
|
|
88
|
-
const response = await agent.respond("Generate response");
|
|
89
|
-
|
|
90
|
-
if (response.stoppedReason === 'llm_error') {
|
|
91
|
-
console.error("LLM call failed:", response.error);
|
|
92
|
-
// {
|
|
93
|
-
// type: 'llm_call',
|
|
94
|
-
// message: 'Rate limit exceeded',
|
|
95
|
-
// details: { ... }
|
|
96
|
-
// }
|
|
97
|
-
|
|
98
|
-
// Session preserved from before LLM call
|
|
99
|
-
// Can retry with same session
|
|
100
|
-
}
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
### Data Validation Errors
|
|
104
|
-
|
|
105
|
-
Schema validation failures for collected data:
|
|
106
|
-
|
|
107
|
-
```typescript
|
|
108
|
-
const response = await agent.respond("Book for 100 guests");
|
|
109
|
-
|
|
110
|
-
if (response.stoppedReason === 'validation_error') {
|
|
111
|
-
console.warn("Validation failed:", response.error);
|
|
112
|
-
// {
|
|
113
|
-
// type: 'data_validation',
|
|
114
|
-
// message: 'Validation failed for 1 field(s): guests',
|
|
115
|
-
// details: [
|
|
116
|
-
// { field: 'guests', value: 100, message: 'Exceeds maximum of 10' }
|
|
117
|
-
// ]
|
|
118
|
-
// }
|
|
119
|
-
|
|
120
|
-
// Valid partial data is still preserved
|
|
121
|
-
console.log(response.session.data); // Contains valid fields
|
|
122
|
-
}
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
### Finalize Hook Errors
|
|
126
|
-
|
|
127
|
-
Failures in finalize hooks are logged but don't stop execution:
|
|
128
|
-
|
|
129
|
-
```typescript
|
|
130
|
-
// Finalize hooks are for cleanup; one failure shouldn't block others
|
|
131
|
-
const response = await agent.respond("Complete booking");
|
|
132
|
-
|
|
133
|
-
// Even if finalize hooks fail, response is returned
|
|
134
|
-
// Errors are logged and included in response.error if present
|
|
135
|
-
if (response.error?.type === 'finalize_hook') {
|
|
136
|
-
console.warn("Some finalize hooks failed:", response.error.details);
|
|
137
|
-
}
|
|
138
|
-
```
|
|
139
|
-
|
|
140
|
-
### Partial Progress Preservation
|
|
141
|
-
|
|
142
|
-
Errors preserve partial progress:
|
|
143
|
-
|
|
144
|
-
```typescript
|
|
145
|
-
// Batch: [step1, step2, step3]
|
|
146
|
-
// step2's prepare hook fails
|
|
147
|
-
|
|
148
|
-
const response = await agent.respond("Process all steps");
|
|
149
|
-
|
|
150
|
-
// step1 completed successfully
|
|
151
|
-
// step2 failed during prepare
|
|
152
|
-
// step3 never executed
|
|
153
|
-
|
|
154
|
-
console.log(response.executedSteps);
|
|
155
|
-
// [{ id: "step1", routeId: "route" }]
|
|
156
|
-
|
|
157
|
-
console.log(response.stoppedReason);
|
|
158
|
-
// "prepare_error"
|
|
159
|
-
|
|
160
|
-
// Session contains data from step1
|
|
161
|
-
console.log(response.session.data);
|
|
162
|
-
```
|
|
163
|
-
|
|
164
|
-
### Error Response Structure
|
|
165
|
-
|
|
166
|
-
```typescript
|
|
167
|
-
interface BatchExecutionError {
|
|
168
|
-
/** Type of error that occurred */
|
|
169
|
-
type: 'pre_extraction' | 'skipif_evaluation' | 'prepare_hook' |
|
|
170
|
-
'llm_call' | 'data_validation' | 'finalize_hook';
|
|
171
|
-
/** Error message */
|
|
172
|
-
message: string;
|
|
173
|
-
/** Step where error occurred (if applicable) */
|
|
174
|
-
stepId?: string;
|
|
175
|
-
/** Additional error details */
|
|
176
|
-
details?: unknown;
|
|
177
|
-
}
|
|
178
|
-
```
|
|
179
|
-
|
|
180
|
-
### Handling Batch Errors
|
|
181
|
-
|
|
182
|
-
```typescript
|
|
183
|
-
const response = await agent.respond(message);
|
|
184
|
-
|
|
185
|
-
// Check for errors
|
|
186
|
-
if (response.error) {
|
|
187
|
-
switch (response.error.type) {
|
|
188
|
-
case 'prepare_hook':
|
|
189
|
-
// Fatal - batch stopped
|
|
190
|
-
await handlePrepareError(response.error);
|
|
191
|
-
break;
|
|
192
|
-
case 'llm_call':
|
|
193
|
-
// Fatal - can retry
|
|
194
|
-
await retryWithBackoff(() => agent.respond(message));
|
|
195
|
-
break;
|
|
196
|
-
case 'data_validation':
|
|
197
|
-
// Non-fatal - ask user to correct
|
|
198
|
-
await promptForCorrection(response.error.details);
|
|
199
|
-
break;
|
|
200
|
-
case 'finalize_hook':
|
|
201
|
-
// Non-fatal - log and continue
|
|
202
|
-
console.warn("Finalize error:", response.error);
|
|
203
|
-
break;
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
```
|
|
207
|
-
|
|
208
|
-
## Streaming Error Propagation
|
|
209
|
-
|
|
210
|
-
### Error Handling in Streaming Responses
|
|
211
|
-
|
|
212
|
-
When using streaming AI providers, errors must be properly propagated from the underlying provider to the application layer:
|
|
213
|
-
|
|
214
|
-
```typescript
|
|
215
|
-
import { Agent, OpenAIProvider } from "@falai/agent";
|
|
216
|
-
|
|
217
|
-
const agent = new Agent({
|
|
218
|
-
provider: new OpenAIProvider({ apiKey: process.env.OPENAI_API_KEY }),
|
|
219
|
-
});
|
|
220
|
-
|
|
221
|
-
try {
|
|
222
|
-
// Streaming response with proper error handling
|
|
223
|
-
for await (const chunk of agent.respondStream({
|
|
224
|
-
message: "Hello",
|
|
225
|
-
sessionId: "user-123"
|
|
226
|
-
})) {
|
|
227
|
-
if (chunk.error) {
|
|
228
|
-
// Handle streaming errors properly
|
|
229
|
-
console.error("Streaming error:", chunk.error);
|
|
230
|
-
break;
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
if (chunk.delta) {
|
|
234
|
-
process.stdout.write(chunk.delta);
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
} catch (error) {
|
|
238
|
-
// Catch provider-level streaming errors
|
|
239
|
-
console.error("Provider streaming error:", error.message);
|
|
240
|
-
}
|
|
241
|
-
```
|
|
242
|
-
|
|
243
|
-
### MockProvider Error Testing
|
|
244
|
-
|
|
245
|
-
For testing streaming error scenarios, the MockProvider properly propagates configured errors:
|
|
246
|
-
|
|
247
|
-
```typescript
|
|
248
|
-
import { MockProvider } from "@falai/agent/testing";
|
|
249
|
-
|
|
250
|
-
const mockProvider = new MockProvider({
|
|
251
|
-
streamingError: "Mock provider streaming error for testing"
|
|
252
|
-
});
|
|
253
|
-
|
|
254
|
-
const agent = new Agent({ provider: mockProvider });
|
|
255
|
-
|
|
256
|
-
try {
|
|
257
|
-
for await (const chunk of agent.respondStream({ message: "test" })) {
|
|
258
|
-
// This will throw the configured streaming error
|
|
259
|
-
}
|
|
260
|
-
} catch (error) {
|
|
261
|
-
// Error message will be exactly: "Mock provider streaming error for testing"
|
|
262
|
-
expect(error.message).toBe("Mock provider streaming error for testing");
|
|
263
|
-
}
|
|
264
|
-
```
|
|
265
|
-
|
|
266
|
-
**Key Points:**
|
|
267
|
-
- Streaming errors are thrown from the async generator itself
|
|
268
|
-
- Error messages are preserved exactly as configured
|
|
269
|
-
- Test logic catches actual provider errors, not test-generated errors
|
|
270
|
-
|
|
271
|
-
## Route Completion Error Handling
|
|
272
|
-
|
|
273
|
-
### Proper Route Completion Detection
|
|
274
|
-
|
|
275
|
-
Routes with conditional steps and `endRoute()` calls require careful completion detection:
|
|
276
|
-
|
|
277
|
-
```typescript
|
|
278
|
-
const route = agent.createRoute({
|
|
279
|
-
title: "Conditional Route",
|
|
280
|
-
requiredFields: ["name", "email"]
|
|
281
|
-
});
|
|
282
|
-
|
|
283
|
-
// Step with skipIf condition
|
|
284
|
-
const askName = route.initialStep.nextStep({
|
|
285
|
-
prompt: "What's your name?",
|
|
286
|
-
collect: ["name"],
|
|
287
|
-
skipIf: (data) => !!data.name, // Skip if name already collected
|
|
288
|
-
});
|
|
289
|
-
|
|
290
|
-
// Step that calls endRoute()
|
|
291
|
-
const confirmDetails = askName.nextStep({
|
|
292
|
-
prompt: "Confirm your details",
|
|
293
|
-
requires: ["name", "email"],
|
|
294
|
-
onComplete: () => {
|
|
295
|
-
// This step calls endRoute() when complete
|
|
296
|
-
return { endRoute: true };
|
|
297
|
-
}
|
|
298
|
-
});
|
|
299
|
-
|
|
300
|
-
// Check route completion properly
|
|
301
|
-
const response = await agent.respond({
|
|
302
|
-
message: "My name is John and email is john@example.com",
|
|
303
|
-
sessionId: "user-123"
|
|
304
|
-
});
|
|
305
|
-
|
|
306
|
-
// Route should be marked complete when all steps are processed
|
|
307
|
-
if (response.isRouteComplete) {
|
|
308
|
-
console.log("Route completed successfully");
|
|
309
|
-
} else {
|
|
310
|
-
console.log("Route still in progress");
|
|
311
|
-
}
|
|
312
|
-
```
|
|
313
|
-
|
|
314
|
-
### Handling Route Completion Edge Cases
|
|
315
|
-
|
|
316
|
-
```typescript
|
|
317
|
-
// Route completion with error handling
|
|
318
|
-
const checkRouteCompletion = (route: Route, collectedData: any) => {
|
|
319
|
-
try {
|
|
320
|
-
// Required fields are a prerequisite for completion, not the trigger itself
|
|
321
|
-
const missingFields = route.getMissingRequiredFields(collectedData);
|
|
322
|
-
|
|
323
|
-
if (missingFields.length > 0) {
|
|
324
|
-
return { complete: false, missingFields };
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
// Check if route explicitly ended
|
|
328
|
-
if (route.hasExplicitEnd()) {
|
|
329
|
-
return { complete: true, reason: "explicit_end" };
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
// Check if all steps are skipped/completed
|
|
333
|
-
if (route.allStepsProcessed()) {
|
|
334
|
-
return { complete: true, reason: "all_steps_processed" };
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
return { complete: false, missingFields };
|
|
338
|
-
} catch (error) {
|
|
339
|
-
console.error("Route completion check failed:", error);
|
|
340
|
-
return { complete: false, error: error.message };
|
|
341
|
-
}
|
|
342
|
-
};
|
|
343
|
-
```
|
|
344
|
-
|
|
345
|
-
## Agent-Session Data Synchronization
|
|
346
|
-
|
|
347
|
-
### Bidirectional Data Sync Error Handling
|
|
348
|
-
|
|
349
|
-
Agent and session data must remain synchronized with proper error handling:
|
|
350
|
-
|
|
351
|
-
```typescript
|
|
352
|
-
class Agent<TContext, TData> {
|
|
353
|
-
async updateCollectedData(updates: Partial<TData>): Promise<void> {
|
|
354
|
-
try {
|
|
355
|
-
// Update agent data
|
|
356
|
-
this.collectedData = { ...this.collectedData, ...updates };
|
|
357
|
-
|
|
358
|
-
// Sync with session data
|
|
359
|
-
if (this.session) {
|
|
360
|
-
await this.session.setData(this.collectedData);
|
|
361
|
-
}
|
|
362
|
-
} catch (error) {
|
|
363
|
-
// Rollback agent data on session sync failure
|
|
364
|
-
console.error("Failed to sync data with session:", error);
|
|
365
|
-
// Restore previous state
|
|
366
|
-
throw new Error(`Data synchronization failed: ${error.message}`);
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
|
|
370
|
-
getCollectedData(): Partial<TData> {
|
|
371
|
-
try {
|
|
372
|
-
// Ensure session data is in sync
|
|
373
|
-
if (this.session) {
|
|
374
|
-
const sessionData = this.session.getData<TData>();
|
|
375
|
-
if (sessionData && Object.keys(sessionData).length > 0) {
|
|
376
|
-
this.collectedData = { ...this.collectedData, ...sessionData };
|
|
377
|
-
}
|
|
378
|
-
}
|
|
379
|
-
return this.collectedData;
|
|
380
|
-
} catch (error) {
|
|
381
|
-
console.error("Failed to retrieve collected data:", error);
|
|
382
|
-
return this.collectedData; // Return agent data as fallback
|
|
383
|
-
}
|
|
384
|
-
}
|
|
385
|
-
}
|
|
386
|
-
```
|
|
387
|
-
|
|
388
|
-
### Session Data Operations with Error Recovery
|
|
389
|
-
|
|
390
|
-
```typescript
|
|
391
|
-
class SessionManager<TData> {
|
|
392
|
-
async setData(data: Partial<TData>): Promise<void> {
|
|
393
|
-
try {
|
|
394
|
-
// Validate data before setting
|
|
395
|
-
if (this.schema) {
|
|
396
|
-
this.validateData(data);
|
|
397
|
-
}
|
|
398
|
-
|
|
399
|
-
// Update session data
|
|
400
|
-
this.session.data = { ...this.session.data, ...data };
|
|
401
|
-
|
|
402
|
-
// Sync with agent if available
|
|
403
|
-
if (this.agent) {
|
|
404
|
-
this.agent.collectedData = { ...this.agent.collectedData, ...data };
|
|
405
|
-
}
|
|
406
|
-
|
|
407
|
-
// Persist changes
|
|
408
|
-
await this.save();
|
|
409
|
-
} catch (error) {
|
|
410
|
-
console.error("Session data update failed:", error);
|
|
411
|
-
// Restore previous session state
|
|
412
|
-
await this.restore();
|
|
413
|
-
throw new Error(`Session data update failed: ${error.message}`);
|
|
414
|
-
}
|
|
415
|
-
}
|
|
416
|
-
|
|
417
|
-
private async restore(): Promise<void> {
|
|
418
|
-
try {
|
|
419
|
-
// Reload session from persistence
|
|
420
|
-
const restored = await this.adapter.getSession(this.session.id);
|
|
421
|
-
if (restored) {
|
|
422
|
-
this.session = restored;
|
|
423
|
-
}
|
|
424
|
-
} catch (error) {
|
|
425
|
-
console.error("Failed to restore session state:", error);
|
|
426
|
-
}
|
|
427
|
-
}
|
|
428
|
-
}
|
|
429
|
-
```
|
|
430
|
-
|
|
431
|
-
## Session History Error Handling
|
|
432
|
-
|
|
433
|
-
### Chat Method with Proper History Management
|
|
434
|
-
|
|
435
|
-
```typescript
|
|
436
|
-
class Agent<TContext, TData> {
|
|
437
|
-
async chat(message: string, sessionId?: string): Promise<AgentResponse<TData>> {
|
|
438
|
-
try {
|
|
439
|
-
// Ensure session exists
|
|
440
|
-
if (!this.session || this.session.id !== sessionId) {
|
|
441
|
-
await this.loadSession(sessionId);
|
|
442
|
-
}
|
|
443
|
-
|
|
444
|
-
// Add user message to history BEFORE processing
|
|
445
|
-
await this.session.addMessage("user", message);
|
|
446
|
-
|
|
447
|
-
// Process the message
|
|
448
|
-
const response = await this.respond({
|
|
449
|
-
message,
|
|
450
|
-
sessionId: this.session.id
|
|
451
|
-
});
|
|
452
|
-
|
|
453
|
-
// Add assistant response to history
|
|
454
|
-
if (response.message) {
|
|
455
|
-
await this.session.addMessage("assistant", response.message);
|
|
456
|
-
}
|
|
457
|
-
|
|
458
|
-
return response;
|
|
459
|
-
} catch (error) {
|
|
460
|
-
console.error("Chat method failed:", error);
|
|
461
|
-
|
|
462
|
-
// Try to remove the user message if response failed
|
|
463
|
-
try {
|
|
464
|
-
await this.session.removeLastMessage("user");
|
|
465
|
-
} catch (rollbackError) {
|
|
466
|
-
console.error("Failed to rollback user message:", rollbackError);
|
|
467
|
-
}
|
|
468
|
-
|
|
469
|
-
throw new Error(`Chat failed: ${error.message}`);
|
|
470
|
-
}
|
|
471
|
-
}
|
|
472
|
-
}
|
|
473
|
-
```
|
|
474
|
-
|
|
475
|
-
### History Persistence with Error Recovery
|
|
476
|
-
|
|
477
|
-
```typescript
|
|
478
|
-
class SessionManager<TData> {
|
|
479
|
-
async addMessage(role: "user" | "assistant", content: string): Promise<void> {
|
|
480
|
-
try {
|
|
481
|
-
const message: HistoryItem = {
|
|
482
|
-
role,
|
|
483
|
-
content,
|
|
484
|
-
timestamp: new Date().toISOString()
|
|
485
|
-
};
|
|
486
|
-
|
|
487
|
-
// Add to in-memory history
|
|
488
|
-
this.session.history.push(message);
|
|
489
|
-
|
|
490
|
-
// Persist immediately
|
|
491
|
-
await this.save();
|
|
492
|
-
} catch (error) {
|
|
493
|
-
// Remove from in-memory history on persistence failure
|
|
494
|
-
this.session.history.pop();
|
|
495
|
-
console.error("Failed to persist message:", error);
|
|
496
|
-
throw new Error(`Message persistence failed: ${error.message}`);
|
|
497
|
-
}
|
|
498
|
-
}
|
|
499
|
-
|
|
500
|
-
async getHistory(): Promise<HistoryItem[]> {
|
|
501
|
-
try {
|
|
502
|
-
// Ensure we have the latest history from persistence
|
|
503
|
-
await this.refresh();
|
|
504
|
-
return this.session.history || [];
|
|
505
|
-
} catch (error) {
|
|
506
|
-
console.error("Failed to retrieve history:", error);
|
|
507
|
-
// Return in-memory history as fallback
|
|
508
|
-
return this.session.history || [];
|
|
509
|
-
}
|
|
510
|
-
}
|
|
511
|
-
}
|
|
512
|
-
```
|
|
513
|
-
|
|
514
|
-
## Tool Execution Error Handling
|
|
515
|
-
|
|
516
|
-
### Graceful Tool Error Recovery
|
|
517
|
-
|
|
518
|
-
```typescript
|
|
519
|
-
import { Tool } from "@falai/agent";
|
|
520
|
-
|
|
521
|
-
const searchFlights: Tool<Context, [], void, FlightData> = {
|
|
522
|
-
id: "search_flights",
|
|
523
|
-
description: "Search for available flights",
|
|
524
|
-
parameters: {
|
|
525
|
-
type: "object",
|
|
526
|
-
properties: {
|
|
527
|
-
destination: { type: "string" },
|
|
528
|
-
date: { type: "string" }
|
|
529
|
-
},
|
|
530
|
-
required: ["destination", "date"]
|
|
531
|
-
},
|
|
532
|
-
handler: async (toolContext) => {
|
|
533
|
-
try {
|
|
534
|
-
const { data } = toolContext;
|
|
535
|
-
|
|
536
|
-
// Validate required data
|
|
537
|
-
if (!data.destination || !data.date) {
|
|
538
|
-
return {
|
|
539
|
-
error: "Missing required flight search parameters",
|
|
540
|
-
data: undefined
|
|
541
|
-
};
|
|
542
|
-
}
|
|
543
|
-
|
|
544
|
-
// Perform search
|
|
545
|
-
const results = await flightSearchAPI.search({
|
|
546
|
-
destination: data.destination,
|
|
547
|
-
date: data.date
|
|
548
|
-
});
|
|
549
|
-
|
|
550
|
-
return {
|
|
551
|
-
data: "Flight search completed successfully",
|
|
552
|
-
dataUpdate: {
|
|
553
|
-
availableFlights: results,
|
|
554
|
-
searchPerformed: true
|
|
555
|
-
}
|
|
556
|
-
};
|
|
557
|
-
} catch (error) {
|
|
558
|
-
console.error("Flight search failed:", error);
|
|
559
|
-
|
|
560
|
-
return {
|
|
561
|
-
error: `Flight search failed: ${error.message}`,
|
|
562
|
-
data: "I encountered an error while searching for flights. Please try again.",
|
|
563
|
-
dataUpdate: {
|
|
564
|
-
searchError: error.message,
|
|
565
|
-
searchPerformed: false
|
|
566
|
-
}
|
|
567
|
-
};
|
|
568
|
-
}
|
|
569
|
-
}
|
|
570
|
-
};
|
|
571
|
-
```
|
|
572
|
-
|
|
573
|
-
## Validation Error Handling
|
|
574
|
-
|
|
575
|
-
### Schema Validation with Fallback
|
|
576
|
-
|
|
577
|
-
```typescript
|
|
578
|
-
const validateAndExtractData = <T>(response: string, schema: JSONSchema): T | null => {
|
|
579
|
-
try {
|
|
580
|
-
// Try to extract structured data
|
|
581
|
-
const extracted = extractStructuredData<T>(response, schema);
|
|
582
|
-
|
|
583
|
-
// Validate against schema
|
|
584
|
-
const validation = validateSchema(extracted, schema);
|
|
585
|
-
|
|
586
|
-
if (validation.valid) {
|
|
587
|
-
return extracted;
|
|
588
|
-
} else {
|
|
589
|
-
console.warn("Schema validation failed:", validation.errors);
|
|
590
|
-
// Fall back to manual extraction
|
|
591
|
-
return manualExtraction<T>(response);
|
|
592
|
-
}
|
|
593
|
-
} catch (error) {
|
|
594
|
-
console.error("Data extraction failed:", error);
|
|
595
|
-
// Return null to indicate extraction failure
|
|
596
|
-
return null;
|
|
597
|
-
}
|
|
598
|
-
};
|
|
599
|
-
```
|
|
600
|
-
|
|
601
|
-
## Error Recovery Strategies
|
|
602
|
-
|
|
603
|
-
### Automatic Retry with Backoff
|
|
604
|
-
|
|
605
|
-
```typescript
|
|
606
|
-
const retryWithBackoff = async <T>(
|
|
607
|
-
operation: () => Promise<T>,
|
|
608
|
-
maxRetries: number = 3,
|
|
609
|
-
baseDelay: number = 1000
|
|
610
|
-
): Promise<T> => {
|
|
611
|
-
let lastError: Error;
|
|
612
|
-
|
|
613
|
-
for (let attempt = 0; attempt < maxRetries; attempt++) {
|
|
614
|
-
try {
|
|
615
|
-
return await operation();
|
|
616
|
-
} catch (error) {
|
|
617
|
-
lastError = error as Error;
|
|
618
|
-
|
|
619
|
-
if (attempt < maxRetries - 1) {
|
|
620
|
-
const delay = baseDelay * Math.pow(2, attempt);
|
|
621
|
-
console.warn(`Operation failed, retrying in ${delay}ms:`, error.message);
|
|
622
|
-
await new Promise(resolve => setTimeout(resolve, delay));
|
|
623
|
-
}
|
|
624
|
-
}
|
|
625
|
-
}
|
|
626
|
-
|
|
627
|
-
throw new Error(`Operation failed after ${maxRetries} attempts: ${lastError.message}`);
|
|
628
|
-
};
|
|
629
|
-
|
|
630
|
-
// Usage
|
|
631
|
-
const response = await retryWithBackoff(
|
|
632
|
-
() => agent.respond({ message: "Hello", sessionId: "user-123" }),
|
|
633
|
-
3,
|
|
634
|
-
1000
|
|
635
|
-
);
|
|
636
|
-
```
|
|
637
|
-
|
|
638
|
-
### Circuit Breaker Pattern
|
|
639
|
-
|
|
640
|
-
```typescript
|
|
641
|
-
class CircuitBreaker {
|
|
642
|
-
private failures = 0;
|
|
643
|
-
private lastFailureTime = 0;
|
|
644
|
-
private state: 'closed' | 'open' | 'half-open' = 'closed';
|
|
645
|
-
|
|
646
|
-
constructor(
|
|
647
|
-
private threshold: number = 5,
|
|
648
|
-
private timeout: number = 60000
|
|
649
|
-
) {}
|
|
650
|
-
|
|
651
|
-
async execute<T>(operation: () => Promise<T>): Promise<T> {
|
|
652
|
-
if (this.state === 'open') {
|
|
653
|
-
if (Date.now() - this.lastFailureTime > this.timeout) {
|
|
654
|
-
this.state = 'half-open';
|
|
655
|
-
} else {
|
|
656
|
-
throw new Error('Circuit breaker is open');
|
|
657
|
-
}
|
|
658
|
-
}
|
|
659
|
-
|
|
660
|
-
try {
|
|
661
|
-
const result = await operation();
|
|
662
|
-
this.onSuccess();
|
|
663
|
-
return result;
|
|
664
|
-
} catch (error) {
|
|
665
|
-
this.onFailure();
|
|
666
|
-
throw error;
|
|
667
|
-
}
|
|
668
|
-
}
|
|
669
|
-
|
|
670
|
-
private onSuccess(): void {
|
|
671
|
-
this.failures = 0;
|
|
672
|
-
this.state = 'closed';
|
|
673
|
-
}
|
|
674
|
-
|
|
675
|
-
private onFailure(): void {
|
|
676
|
-
this.failures++;
|
|
677
|
-
this.lastFailureTime = Date.now();
|
|
678
|
-
|
|
679
|
-
if (this.failures >= this.threshold) {
|
|
680
|
-
this.state = 'open';
|
|
681
|
-
}
|
|
682
|
-
}
|
|
683
|
-
}
|
|
684
|
-
```
|
|
685
|
-
|
|
686
|
-
## Best Practices
|
|
687
|
-
|
|
688
|
-
### Error Logging and Monitoring
|
|
689
|
-
|
|
690
|
-
```typescript
|
|
691
|
-
import { Logger } from "@falai/agent/utils";
|
|
692
|
-
|
|
693
|
-
const logger = new Logger("agent-errors");
|
|
694
|
-
|
|
695
|
-
// Structured error logging
|
|
696
|
-
const logError = (context: string, error: Error, metadata?: any) => {
|
|
697
|
-
logger.error({
|
|
698
|
-
context,
|
|
699
|
-
message: error.message,
|
|
700
|
-
stack: error.stack,
|
|
701
|
-
metadata,
|
|
702
|
-
timestamp: new Date().toISOString()
|
|
703
|
-
});
|
|
704
|
-
};
|
|
705
|
-
|
|
706
|
-
// Usage in error handlers
|
|
707
|
-
try {
|
|
708
|
-
await agent.respond({ message, sessionId });
|
|
709
|
-
} catch (error) {
|
|
710
|
-
logError("agent-response", error, { message, sessionId });
|
|
711
|
-
throw error;
|
|
712
|
-
}
|
|
713
|
-
```
|
|
714
|
-
|
|
715
|
-
### Error Boundaries for Route Execution
|
|
716
|
-
|
|
717
|
-
```typescript
|
|
718
|
-
const executeRouteWithErrorBoundary = async (route: Route, context: any) => {
|
|
719
|
-
try {
|
|
720
|
-
return await route.execute(context);
|
|
721
|
-
} catch (error) {
|
|
722
|
-
// Log the error
|
|
723
|
-
logError("route-execution", error, { routeId: route.id });
|
|
724
|
-
|
|
725
|
-
// Provide fallback response
|
|
726
|
-
return {
|
|
727
|
-
message: "I encountered an error processing your request. Please try again.",
|
|
728
|
-
isRouteComplete: false,
|
|
729
|
-
error: error.message
|
|
730
|
-
};
|
|
731
|
-
}
|
|
732
|
-
};
|
|
733
|
-
```
|
|
734
|
-
|
|
735
|
-
### Graceful Degradation
|
|
736
|
-
|
|
737
|
-
```typescript
|
|
738
|
-
const respondWithFallback = async (agent: Agent, message: string) => {
|
|
739
|
-
try {
|
|
740
|
-
// Try normal response
|
|
741
|
-
return await agent.respond({ message });
|
|
742
|
-
} catch (error) {
|
|
743
|
-
console.warn("Normal response failed, using fallback:", error.message);
|
|
744
|
-
|
|
745
|
-
// Fallback to simple response without routing
|
|
746
|
-
return {
|
|
747
|
-
message: "I'm experiencing some technical difficulties. How can I help you?",
|
|
748
|
-
isRouteComplete: false,
|
|
749
|
-
session: agent.session
|
|
750
|
-
};
|
|
751
|
-
}
|
|
752
|
-
};
|
|
753
|
-
```
|
|
754
|
-
|
|
755
|
-
## Testing Error Scenarios
|
|
756
|
-
|
|
757
|
-
### Unit Tests for Error Handling
|
|
758
|
-
|
|
759
|
-
```typescript
|
|
760
|
-
describe("Error Handling", () => {
|
|
761
|
-
it("should handle streaming errors properly", async () => {
|
|
762
|
-
const mockProvider = new MockProvider({
|
|
763
|
-
streamingError: "Test streaming error"
|
|
764
|
-
});
|
|
765
|
-
|
|
766
|
-
const agent = new Agent({ provider: mockProvider });
|
|
767
|
-
|
|
768
|
-
await expect(async () => {
|
|
769
|
-
for await (const chunk of agent.respondStream({ message: "test" })) {
|
|
770
|
-
// Should throw before yielding any chunks
|
|
771
|
-
}
|
|
772
|
-
}).rejects.toThrow("Test streaming error");
|
|
773
|
-
});
|
|
774
|
-
|
|
775
|
-
it("should handle route completion errors", async () => {
|
|
776
|
-
const route = agent.createRoute({
|
|
777
|
-
title: "Test Route",
|
|
778
|
-
requiredFields: ["name"]
|
|
779
|
-
});
|
|
780
|
-
|
|
781
|
-
// Mock route completion logic to throw
|
|
782
|
-
jest.spyOn(route, 'isComplete').mockImplementation(() => {
|
|
783
|
-
throw new Error("Completion check failed");
|
|
784
|
-
});
|
|
785
|
-
|
|
786
|
-
const response = await agent.respond({ message: "Hello" });
|
|
787
|
-
|
|
788
|
-
// Should handle error gracefully
|
|
789
|
-
expect(response.isRouteComplete).toBe(false);
|
|
790
|
-
});
|
|
791
|
-
});
|
|
792
|
-
```
|
|
793
|
-
|
|
794
|
-
## Monitoring and Observability
|
|
795
|
-
|
|
796
|
-
### Error Metrics Collection
|
|
797
|
-
|
|
798
|
-
```typescript
|
|
799
|
-
class ErrorMetrics {
|
|
800
|
-
private errorCounts = new Map<string, number>();
|
|
801
|
-
private errorRates = new Map<string, number[]>();
|
|
802
|
-
|
|
803
|
-
recordError(type: string, error: Error): void {
|
|
804
|
-
// Count errors by type
|
|
805
|
-
this.errorCounts.set(type, (this.errorCounts.get(type) || 0) + 1);
|
|
806
|
-
|
|
807
|
-
// Track error rates
|
|
808
|
-
const now = Date.now();
|
|
809
|
-
const rates = this.errorRates.get(type) || [];
|
|
810
|
-
rates.push(now);
|
|
811
|
-
|
|
812
|
-
// Keep only last hour of data
|
|
813
|
-
const oneHourAgo = now - 3600000;
|
|
814
|
-
this.errorRates.set(type, rates.filter(time => time > oneHourAgo));
|
|
815
|
-
}
|
|
816
|
-
|
|
817
|
-
getErrorRate(type: string): number {
|
|
818
|
-
const rates = this.errorRates.get(type) || [];
|
|
819
|
-
return rates.length; // Errors per hour
|
|
820
|
-
}
|
|
821
|
-
|
|
822
|
-
getTopErrors(limit: number = 10): Array<[string, number]> {
|
|
823
|
-
return Array.from(this.errorCounts.entries())
|
|
824
|
-
.sort(([,a], [,b]) => b - a)
|
|
825
|
-
.slice(0, limit);
|
|
826
|
-
}
|
|
827
|
-
}
|
|
828
|
-
```
|
|
829
|
-
|
|
830
|
-
This comprehensive error handling documentation covers all the key areas identified in the task requirements, providing practical examples and best practices for handling errors in streaming operations, route completion logic, and agent-session data synchronization.
|