@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,735 +0,0 @@
|
|
|
1
|
-
/* eslint @typescript-eslint/no-unused-vars: "off" */
|
|
2
|
-
/**
|
|
3
|
-
* Example: Company Q&A Agent (Stepless, Knowledge-Based)
|
|
4
|
-
*
|
|
5
|
-
* This demonstrates:
|
|
6
|
-
* 1. Schema-first architecture for stepless Q&A routes (no schema)
|
|
7
|
-
* 2. Tools for context enrichment (not data extraction)
|
|
8
|
-
* 3. Session step management even for stepless conversations
|
|
9
|
-
* 4. Always-on routing with context awareness
|
|
10
|
-
* 5. Three-phase pipeline: PREPARATION → ROUTING → RESPONSE
|
|
11
|
-
* 6. NEW: Complex ConditionTemplate patterns for intelligent routing:
|
|
12
|
-
* - Mixed conditions: ["AI context", (ctx) => programmatic_check]
|
|
13
|
-
* - Route skipIf: Dynamic route exclusion based on message content
|
|
14
|
-
* - Function-only conditions: (ctx) => sophisticated_logic
|
|
15
|
-
* - String-only conditions: "simple AI context"
|
|
16
|
-
* - Fallback routing with programmatic logic
|
|
17
|
-
*/
|
|
18
|
-
|
|
19
|
-
import {
|
|
20
|
-
Agent,
|
|
21
|
-
END_ROUTE,
|
|
22
|
-
EventKind,
|
|
23
|
-
MessageRole,
|
|
24
|
-
OpenAIProvider,
|
|
25
|
-
type Tool,
|
|
26
|
-
} from "../../src/index";
|
|
27
|
-
|
|
28
|
-
// ==============================================================================
|
|
29
|
-
// CONTEXT: Company Knowledge Base
|
|
30
|
-
// ==============================================================================
|
|
31
|
-
|
|
32
|
-
interface CompanyContext {
|
|
33
|
-
companyInfo: {
|
|
34
|
-
name: string;
|
|
35
|
-
founded: number;
|
|
36
|
-
employees: number;
|
|
37
|
-
headquarters: string;
|
|
38
|
-
};
|
|
39
|
-
products: Array<{
|
|
40
|
-
id: string;
|
|
41
|
-
name: string;
|
|
42
|
-
description: string;
|
|
43
|
-
price: string;
|
|
44
|
-
category: string;
|
|
45
|
-
}>;
|
|
46
|
-
policies: {
|
|
47
|
-
returnPolicy: string;
|
|
48
|
-
shippingPolicy: string;
|
|
49
|
-
warrantyPolicy: string;
|
|
50
|
-
};
|
|
51
|
-
faqs: Array<{
|
|
52
|
-
question: string;
|
|
53
|
-
answer: string;
|
|
54
|
-
category: string;
|
|
55
|
-
}>;
|
|
56
|
-
recentNews?: Array<{
|
|
57
|
-
title: string;
|
|
58
|
-
date: string;
|
|
59
|
-
summary: string;
|
|
60
|
-
}>;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
interface FeedbackData {
|
|
64
|
-
rating?: number;
|
|
65
|
-
comments?: string;
|
|
66
|
-
contactPermission?: boolean;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
// ==============================================================================
|
|
70
|
-
// TOOLS: Context Enrichment (PREPARATION Phase)
|
|
71
|
-
// ==============================================================================
|
|
72
|
-
|
|
73
|
-
// Tool: Fetch latest company news (context enrichment)
|
|
74
|
-
const fetchNewsTool: Tool<CompanyContext, UnifiedData> = {
|
|
75
|
-
id: "fetch_news",
|
|
76
|
-
name: "Company News Fetcher",
|
|
77
|
-
description: "Retrieve latest company news and updates",
|
|
78
|
-
handler: (context, args) => {
|
|
79
|
-
// Simulate API call to news service
|
|
80
|
-
const news = [
|
|
81
|
-
{
|
|
82
|
-
title: "New Product Launch: Acme Widget Pro",
|
|
83
|
-
date: "2025-10-10",
|
|
84
|
-
summary: "We're excited to announce the Acme Widget Pro...",
|
|
85
|
-
},
|
|
86
|
-
{
|
|
87
|
-
title: "Company Expands to European Market",
|
|
88
|
-
date: "2025-10-01",
|
|
89
|
-
summary: "Acme Corp opens new offices in London and Berlin...",
|
|
90
|
-
},
|
|
91
|
-
];
|
|
92
|
-
|
|
93
|
-
console.log(`[Tool] Fetched ${news.length} news articles`);
|
|
94
|
-
|
|
95
|
-
return {
|
|
96
|
-
data: `Fetched ${news.length} latest news articles`,
|
|
97
|
-
contextUpdate: {
|
|
98
|
-
recentNews: news,
|
|
99
|
-
},
|
|
100
|
-
};
|
|
101
|
-
},
|
|
102
|
-
};
|
|
103
|
-
|
|
104
|
-
// Tool: Search knowledge base (context enrichment)
|
|
105
|
-
const searchKnowledgeTool: Tool<CompanyContext, UnifiedData> = {
|
|
106
|
-
id: "search_knowledge",
|
|
107
|
-
name: "Knowledge Base Search",
|
|
108
|
-
description: "Search FAQs and documentation",
|
|
109
|
-
handler: (toolContext, args) => {
|
|
110
|
-
const { history } = toolContext;
|
|
111
|
-
|
|
112
|
-
// Get last user message
|
|
113
|
-
const lastMessage = history
|
|
114
|
-
.filter(
|
|
115
|
-
(e) => e.kind === EventKind.MESSAGE && e.source === MessageRole.USER
|
|
116
|
-
)
|
|
117
|
-
.pop();
|
|
118
|
-
|
|
119
|
-
if (!lastMessage) {
|
|
120
|
-
return { data: "No query found" };
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
const query = (
|
|
124
|
-
lastMessage.data as { message: string }
|
|
125
|
-
).message.toLowerCase();
|
|
126
|
-
|
|
127
|
-
// Simple keyword matching (in real app, use vector search)
|
|
128
|
-
const relevantFaqs = toolContext.context.faqs.filter(
|
|
129
|
-
(faq) =>
|
|
130
|
-
faq.question.toLowerCase().includes(query) ||
|
|
131
|
-
faq.answer.toLowerCase().includes(query)
|
|
132
|
-
);
|
|
133
|
-
|
|
134
|
-
console.log(`[Tool] Found ${relevantFaqs.length} relevant FAQs`);
|
|
135
|
-
|
|
136
|
-
return {
|
|
137
|
-
data: relevantFaqs
|
|
138
|
-
.map((faq) => `Q: ${faq.question}\nA: ${faq.answer}`)
|
|
139
|
-
.join("\n\n"),
|
|
140
|
-
};
|
|
141
|
-
},
|
|
142
|
-
};
|
|
143
|
-
|
|
144
|
-
// ==============================================================================
|
|
145
|
-
// AGENT SETUP
|
|
146
|
-
// ==============================================================================
|
|
147
|
-
|
|
148
|
-
// Define unified data schema for all interactions
|
|
149
|
-
interface UnifiedData extends FeedbackData {}
|
|
150
|
-
|
|
151
|
-
const unifiedSchema = {
|
|
152
|
-
type: "object",
|
|
153
|
-
properties: {
|
|
154
|
-
// Feedback fields
|
|
155
|
-
rating: {
|
|
156
|
-
type: "number",
|
|
157
|
-
description: "A rating from 1 to 5",
|
|
158
|
-
minimum: 1,
|
|
159
|
-
maximum: 5,
|
|
160
|
-
},
|
|
161
|
-
comments: { type: "string", description: "Open-ended feedback" },
|
|
162
|
-
contactPermission: {
|
|
163
|
-
type: "boolean",
|
|
164
|
-
description: "Permission to contact the user for more details",
|
|
165
|
-
},
|
|
166
|
-
},
|
|
167
|
-
};
|
|
168
|
-
|
|
169
|
-
const agent = new Agent<CompanyContext, UnifiedData>({
|
|
170
|
-
name: "Acme Support Agent",
|
|
171
|
-
goal: "Answer questions about Acme Corp and our products",
|
|
172
|
-
description:
|
|
173
|
-
"I'm here to help you learn about Acme Corp, our products, and policies",
|
|
174
|
-
personality:
|
|
175
|
-
"Friendly, helpful, and knowledgeable. Always professional but approachable.",
|
|
176
|
-
provider: new OpenAIProvider({
|
|
177
|
-
apiKey: process.env.OPENAI_API_KEY || "test-key",
|
|
178
|
-
model: "gpt-5o-mini",
|
|
179
|
-
}),
|
|
180
|
-
// NEW: Agent-level schema
|
|
181
|
-
schema: unifiedSchema,
|
|
182
|
-
|
|
183
|
-
// Initialize with company knowledge
|
|
184
|
-
context: {
|
|
185
|
-
companyInfo: {
|
|
186
|
-
name: "Acme Corporation",
|
|
187
|
-
founded: 2010,
|
|
188
|
-
employees: 500,
|
|
189
|
-
headquarters: "San Francisco, CA",
|
|
190
|
-
},
|
|
191
|
-
products: [
|
|
192
|
-
{
|
|
193
|
-
id: "widget-1",
|
|
194
|
-
name: "Acme Widget",
|
|
195
|
-
description: "Our flagship product for all your widget needs",
|
|
196
|
-
price: "$99.99",
|
|
197
|
-
category: "widgets",
|
|
198
|
-
},
|
|
199
|
-
{
|
|
200
|
-
id: "gadget-1",
|
|
201
|
-
name: "Acme Gadget",
|
|
202
|
-
description: "The revolutionary gadget that changed everything",
|
|
203
|
-
price: "$149.99",
|
|
204
|
-
category: "gadgets",
|
|
205
|
-
},
|
|
206
|
-
],
|
|
207
|
-
policies: {
|
|
208
|
-
returnPolicy: "30-day money-back guarantee, no questions asked",
|
|
209
|
-
shippingPolicy:
|
|
210
|
-
"Free shipping on orders over $50. 2-5 business days delivery",
|
|
211
|
-
warrantyPolicy: "1-year warranty on all products",
|
|
212
|
-
},
|
|
213
|
-
faqs: [
|
|
214
|
-
{
|
|
215
|
-
question: "What is your return policy?",
|
|
216
|
-
answer: "We offer a 30-day money-back guarantee on all products.",
|
|
217
|
-
category: "returns",
|
|
218
|
-
},
|
|
219
|
-
{
|
|
220
|
-
question: "Do you ship internationally?",
|
|
221
|
-
answer: "Yes, we ship to over 50 countries worldwide.",
|
|
222
|
-
category: "shipping",
|
|
223
|
-
},
|
|
224
|
-
{
|
|
225
|
-
question: "How long is the warranty?",
|
|
226
|
-
answer: "All products come with a 1-year manufacturer warranty.",
|
|
227
|
-
category: "warranty",
|
|
228
|
-
},
|
|
229
|
-
],
|
|
230
|
-
},
|
|
231
|
-
|
|
232
|
-
// Add domain terms for better understanding
|
|
233
|
-
terms: [
|
|
234
|
-
{
|
|
235
|
-
name: "Widget",
|
|
236
|
-
description: "Our core product line for task automation",
|
|
237
|
-
},
|
|
238
|
-
{
|
|
239
|
-
name: "Gadget",
|
|
240
|
-
description: "Advanced tools for power users",
|
|
241
|
-
},
|
|
242
|
-
],
|
|
243
|
-
|
|
244
|
-
// General guidelines (no tools attached - just behavioral)
|
|
245
|
-
guidelines: [
|
|
246
|
-
{
|
|
247
|
-
action: "Always be polite and professional",
|
|
248
|
-
enabled: true,
|
|
249
|
-
},
|
|
250
|
-
{
|
|
251
|
-
action:
|
|
252
|
-
"If you don't know the answer, admit it and offer to connect them with a human",
|
|
253
|
-
enabled: true,
|
|
254
|
-
},
|
|
255
|
-
{
|
|
256
|
-
action: "Provide specific, accurate information from the knowledge base",
|
|
257
|
-
enabled: true,
|
|
258
|
-
},
|
|
259
|
-
],
|
|
260
|
-
});
|
|
261
|
-
|
|
262
|
-
// ==============================================================================
|
|
263
|
-
// ROUTES: STEPLESS Q&A ROUTES (Schema-First Architecture)
|
|
264
|
-
// ==============================================================================
|
|
265
|
-
|
|
266
|
-
// Route 1: Company Information (stepless - no data extraction)
|
|
267
|
-
|
|
268
|
-
agent.createRoute({
|
|
269
|
-
title: "Company Information",
|
|
270
|
-
description: "Answer general questions about Acme Corp",
|
|
271
|
-
// Mixed condition: AI context + programmatic validation
|
|
272
|
-
when: [
|
|
273
|
-
"User asks about the company",
|
|
274
|
-
"Questions about company history, size, location",
|
|
275
|
-
"When was the company founded",
|
|
276
|
-
"How many employees",
|
|
277
|
-
"Where is the headquarters",
|
|
278
|
-
(ctx) => {
|
|
279
|
-
const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
|
|
280
|
-
return message.includes('company') || message.includes('acme') || message.includes('founded');
|
|
281
|
-
}
|
|
282
|
-
],
|
|
283
|
-
// Skip if user is asking about specific products instead
|
|
284
|
-
skipIf: [
|
|
285
|
-
"user is asking about specific products or services",
|
|
286
|
-
(ctx) => {
|
|
287
|
-
const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
|
|
288
|
-
return message.includes('widget') || message.includes('gadget') || message.includes('product');
|
|
289
|
-
}
|
|
290
|
-
],
|
|
291
|
-
// Route-specific knowledge base for company information
|
|
292
|
-
knowledgeBase: {
|
|
293
|
-
company: {
|
|
294
|
-
name: "Acme Corporation",
|
|
295
|
-
founded: "1985",
|
|
296
|
-
headquarters: "San Francisco, CA",
|
|
297
|
-
employees: "2,500+",
|
|
298
|
-
mission:
|
|
299
|
-
"To build software that makes businesses more efficient and people more productive",
|
|
300
|
-
},
|
|
301
|
-
history: {
|
|
302
|
-
founding: "Founded in 1985 by tech entrepreneurs",
|
|
303
|
-
milestones: [
|
|
304
|
-
"IPO in 1998",
|
|
305
|
-
"Acquired 3 companies in 2010s",
|
|
306
|
-
"Expanded to 20 countries by 2020",
|
|
307
|
-
],
|
|
308
|
-
},
|
|
309
|
-
},
|
|
310
|
-
// NO schema - stepless Q&A route
|
|
311
|
-
// Just use initial step with prompt for response generation
|
|
312
|
-
});
|
|
313
|
-
|
|
314
|
-
// Initial step: Answer from knowledge base (no data collecting needed)
|
|
315
|
-
|
|
316
|
-
// Route 2: Product Information (stepless)
|
|
317
|
-
|
|
318
|
-
agent.createRoute({
|
|
319
|
-
title: "Product Information",
|
|
320
|
-
description: "Answer questions about products",
|
|
321
|
-
// Function-only condition for programmatic logic
|
|
322
|
-
when: (ctx) => {
|
|
323
|
-
const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
|
|
324
|
-
return message.includes('product') || message.includes('widget') ||
|
|
325
|
-
message.includes('gadget') || message.includes('price') ||
|
|
326
|
-
message.includes('feature');
|
|
327
|
-
},
|
|
328
|
-
// Skip if user is asking about company policies instead
|
|
329
|
-
skipIf: (ctx) => {
|
|
330
|
-
const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
|
|
331
|
-
return message.includes('policy') || message.includes('return') || message.includes('warranty');
|
|
332
|
-
},
|
|
333
|
-
// NO schema - just answering questions
|
|
334
|
-
});
|
|
335
|
-
|
|
336
|
-
// Initial step is enough - no transitions needed for simple Q&A
|
|
337
|
-
|
|
338
|
-
// Route 3: Policy Questions (stepless)
|
|
339
|
-
|
|
340
|
-
agent.createRoute({
|
|
341
|
-
title: "Policy Information",
|
|
342
|
-
description: "Answer questions about company policies",
|
|
343
|
-
// Mixed condition: AI context + programmatic check
|
|
344
|
-
when: [
|
|
345
|
-
"User asks about policies",
|
|
346
|
-
"Return policy",
|
|
347
|
-
"Shipping information",
|
|
348
|
-
"Warranty questions",
|
|
349
|
-
(ctx) => {
|
|
350
|
-
const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
|
|
351
|
-
return message.includes('policy') || message.includes('return') ||
|
|
352
|
-
message.includes('shipping') || message.includes('warranty');
|
|
353
|
-
}
|
|
354
|
-
],
|
|
355
|
-
// Skip if user is asking about news or updates
|
|
356
|
-
skipIf: [
|
|
357
|
-
"user wants latest news or updates",
|
|
358
|
-
(ctx) => {
|
|
359
|
-
const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
|
|
360
|
-
return message.includes('news') || message.includes('update') || message.includes('new');
|
|
361
|
-
}
|
|
362
|
-
],
|
|
363
|
-
// NO schema
|
|
364
|
-
});
|
|
365
|
-
|
|
366
|
-
// Initial step is enough - no extra setup needed
|
|
367
|
-
|
|
368
|
-
// Route 4: News & Updates (uses tool, but still stepless)
|
|
369
|
-
const newsRoute = agent.createRoute({
|
|
370
|
-
title: "Company News",
|
|
371
|
-
description: "Share latest company news and updates",
|
|
372
|
-
// String-only condition for AI context
|
|
373
|
-
when: "User asks about news, updates, or recent announcements",
|
|
374
|
-
// Skip if user is asking about general FAQ topics
|
|
375
|
-
skipIf: (ctx) => {
|
|
376
|
-
const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
|
|
377
|
-
return message.includes('how do i') || message.includes('can i') || message.includes('is there');
|
|
378
|
-
},
|
|
379
|
-
});
|
|
380
|
-
|
|
381
|
-
// Add tool to initial step to fetch news
|
|
382
|
-
const fetchNews = newsRoute.initialStep.nextStep({
|
|
383
|
-
tools: [fetchNewsTool],
|
|
384
|
-
});
|
|
385
|
-
|
|
386
|
-
fetchNews.nextStep({
|
|
387
|
-
prompt: "Share the latest company news from context",
|
|
388
|
-
});
|
|
389
|
-
|
|
390
|
-
// Route 5: General FAQ Search (uses tool)
|
|
391
|
-
const faqRoute = agent.createRoute({
|
|
392
|
-
title: "FAQ Search",
|
|
393
|
-
description: "Search FAQs for relevant answers",
|
|
394
|
-
// Mixed condition: AI context + programmatic pattern matching
|
|
395
|
-
when: [
|
|
396
|
-
"User has a question that might be in FAQs",
|
|
397
|
-
"How do I...",
|
|
398
|
-
"Can I...",
|
|
399
|
-
"Is there...",
|
|
400
|
-
(ctx) => {
|
|
401
|
-
const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
|
|
402
|
-
return message.startsWith('how ') || message.startsWith('can ') ||
|
|
403
|
-
message.startsWith('is ') || message.includes('?');
|
|
404
|
-
}
|
|
405
|
-
],
|
|
406
|
-
// Skip if user is clearly asking for news or company info
|
|
407
|
-
skipIf: [
|
|
408
|
-
"user wants company news or general company information",
|
|
409
|
-
(ctx) => {
|
|
410
|
-
const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
|
|
411
|
-
return message.includes('news') || message.includes('company') || message.includes('founded');
|
|
412
|
-
}
|
|
413
|
-
],
|
|
414
|
-
});
|
|
415
|
-
|
|
416
|
-
const searchFaqs = faqRoute.initialStep.nextStep({
|
|
417
|
-
tools: [searchKnowledgeTool],
|
|
418
|
-
});
|
|
419
|
-
|
|
420
|
-
searchFaqs.nextStep({
|
|
421
|
-
prompt: "Provide answer based on FAQ search results",
|
|
422
|
-
});
|
|
423
|
-
|
|
424
|
-
// Route 6: Fallback (generic response)
|
|
425
|
-
|
|
426
|
-
agent.createRoute({
|
|
427
|
-
title: "General Conversation",
|
|
428
|
-
description: "Handle general conversation or unclear questions",
|
|
429
|
-
// Function-only condition for fallback logic
|
|
430
|
-
when: (ctx) => {
|
|
431
|
-
// This route catches everything that doesn't match other routes
|
|
432
|
-
const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
|
|
433
|
-
return !message.includes('product') && !message.includes('policy') &&
|
|
434
|
-
!message.includes('news') && !message.includes('company');
|
|
435
|
-
},
|
|
436
|
-
// Never skip the fallback route
|
|
437
|
-
skipIf: ()=>false,
|
|
438
|
-
});
|
|
439
|
-
|
|
440
|
-
// Initial step is enough for fallback conversations
|
|
441
|
-
|
|
442
|
-
// Route 7: Collect Feedback (Stepful Example)
|
|
443
|
-
const feedbackRoute = agent.createRoute({
|
|
444
|
-
title: "Collect Feedback",
|
|
445
|
-
description: "Collect user feedback about their experience",
|
|
446
|
-
// Mixed condition: AI context + sentiment analysis
|
|
447
|
-
when: [
|
|
448
|
-
"User wants to leave feedback",
|
|
449
|
-
"User seems satisfied or upset",
|
|
450
|
-
(ctx) => {
|
|
451
|
-
const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
|
|
452
|
-
return message.includes('feedback') || message.includes('review') ||
|
|
453
|
-
message.includes('satisfied') || message.includes('disappointed');
|
|
454
|
-
}
|
|
455
|
-
],
|
|
456
|
-
// Skip if user is in the middle of another task
|
|
457
|
-
skipIf: [
|
|
458
|
-
"user is actively getting help with something else",
|
|
459
|
-
(ctx) => {
|
|
460
|
-
const recentMessages = ctx.history?.filter((m) => "content" in m).slice(-3) || [];
|
|
461
|
-
return recentMessages.some(msg =>
|
|
462
|
-
(msg.content as string)?.toLowerCase().includes('help') ||
|
|
463
|
-
(msg.content as string)?.toLowerCase().includes('problem')
|
|
464
|
-
);
|
|
465
|
-
}
|
|
466
|
-
],
|
|
467
|
-
// NEW: Required fields for route completion
|
|
468
|
-
requiredFields: ["rating", "comments"],
|
|
469
|
-
// NEW: Optional fields
|
|
470
|
-
optionalFields: ["contactPermission"],
|
|
471
|
-
endStep: {
|
|
472
|
-
prompt:
|
|
473
|
-
"Thank the user warmly for their valuable feedback and let them know we appreciate their time",
|
|
474
|
-
},
|
|
475
|
-
});
|
|
476
|
-
|
|
477
|
-
feedbackRoute.initialStep
|
|
478
|
-
.nextStep({
|
|
479
|
-
id: "ask_rating",
|
|
480
|
-
prompt:
|
|
481
|
-
"I'd love to hear your feedback. On a scale of 1 to 5, how would you rate your experience with me today?",
|
|
482
|
-
collect: ["rating"],
|
|
483
|
-
})
|
|
484
|
-
.nextStep({
|
|
485
|
-
id: "ask_comments",
|
|
486
|
-
prompt:
|
|
487
|
-
"Thanks for the rating! Do you have any specific comments or suggestions?",
|
|
488
|
-
collect: ["comments"],
|
|
489
|
-
requires: ["rating"],
|
|
490
|
-
})
|
|
491
|
-
.nextStep({
|
|
492
|
-
id: "ask_permission",
|
|
493
|
-
prompt:
|
|
494
|
-
"Thank you for the detailed feedback. Would it be okay if our team contacted you for more details?",
|
|
495
|
-
collect: ["contactPermission"],
|
|
496
|
-
requires: ["comments"],
|
|
497
|
-
})
|
|
498
|
-
.nextStep({ step: END_ROUTE }); // Uses route-level endStep configuration
|
|
499
|
-
|
|
500
|
-
// ==============================================================================
|
|
501
|
-
// USAGE EXAMPLES: Three-Phase Pipeline Demonstration
|
|
502
|
-
// ==============================================================================
|
|
503
|
-
|
|
504
|
-
async function exampleConversations() {
|
|
505
|
-
// Session is automatically managed by the agent
|
|
506
|
-
console.log("✨ Session ready:", agent.session.id);
|
|
507
|
-
|
|
508
|
-
// =========================================================================
|
|
509
|
-
// Example 1: Simple company info question (stepless)
|
|
510
|
-
// =========================================================================
|
|
511
|
-
console.log("\n=== EXAMPLE 1: Company Info (Stepless Q&A) ===");
|
|
512
|
-
|
|
513
|
-
await agent.session.addMessage("user", "How many employees does Acme have?", "User");
|
|
514
|
-
|
|
515
|
-
const response1 = await agent.respond({
|
|
516
|
-
history: agent.session.getHistory()
|
|
517
|
-
});
|
|
518
|
-
|
|
519
|
-
console.log("AI:", response1.message);
|
|
520
|
-
console.log("Route:", response1.session?.currentRoute?.title);
|
|
521
|
-
|
|
522
|
-
await agent.session.addMessage("assistant", response1.message);
|
|
523
|
-
|
|
524
|
-
/*
|
|
525
|
-
* ARCHITECTURE FLOW:
|
|
526
|
-
* 1. PREPARATION: No tools needed for simple Q&A
|
|
527
|
-
* 2. ROUTING: Framework routes to "Company Information" (score: 95)
|
|
528
|
-
* 3. RESPONSE: AI answers from context knowledge
|
|
529
|
-
* - Route: "Company Information"
|
|
530
|
-
* - Session: Updated with route/step (even for stepless)
|
|
531
|
-
* - No data extraction (stepless route)
|
|
532
|
-
*/
|
|
533
|
-
|
|
534
|
-
// =========================================================================
|
|
535
|
-
// Example 2: Product question (stepless)
|
|
536
|
-
// =========================================================================
|
|
537
|
-
console.log("\n=== EXAMPLE 2: Product Info ===");
|
|
538
|
-
const history2 = [
|
|
539
|
-
{
|
|
540
|
-
role: "user" as const,
|
|
541
|
-
content: "What products do you offer?",
|
|
542
|
-
name: "User",
|
|
543
|
-
},
|
|
544
|
-
];
|
|
545
|
-
|
|
546
|
-
const response2 = await agent.respond({ history: history2 });
|
|
547
|
-
console.log("AI:", response2.message);
|
|
548
|
-
console.log("Route:", response2.session?.currentRoute?.title);
|
|
549
|
-
// Expected: "We offer two main products: Acme Widget ($99.99)..."
|
|
550
|
-
// Route: "Product Information"
|
|
551
|
-
|
|
552
|
-
// =========================================================================
|
|
553
|
-
// Example 3: Policy question (stepless)
|
|
554
|
-
// =========================================================================
|
|
555
|
-
console.log("\n=== EXAMPLE 3: Policy Question ===");
|
|
556
|
-
const history3 = [
|
|
557
|
-
{
|
|
558
|
-
role: "user" as const,
|
|
559
|
-
content: "What's your return policy?",
|
|
560
|
-
name: "User",
|
|
561
|
-
},
|
|
562
|
-
];
|
|
563
|
-
|
|
564
|
-
const response3 = await agent.respond({ history: history3 });
|
|
565
|
-
console.log("AI:", response3.message);
|
|
566
|
-
console.log("Route:", response3.session?.currentRoute?.title);
|
|
567
|
-
// Expected: "We offer a 30-day money-back guarantee..."
|
|
568
|
-
// Route: "Policy Information"
|
|
569
|
-
|
|
570
|
-
// =========================================================================
|
|
571
|
-
// Example 4: News request (tool execution, but still stepless)
|
|
572
|
-
// =========================================================================
|
|
573
|
-
console.log("\n=== EXAMPLE 4: Latest News ===");
|
|
574
|
-
const history4 = [
|
|
575
|
-
{
|
|
576
|
-
role: "user" as const,
|
|
577
|
-
content: "What's new at Acme?",
|
|
578
|
-
name: "User",
|
|
579
|
-
},
|
|
580
|
-
];
|
|
581
|
-
|
|
582
|
-
const response4 = await agent.respond({ history: history4 });
|
|
583
|
-
console.log("AI:", response4.message);
|
|
584
|
-
console.log("Route:", response4.session?.currentRoute?.title);
|
|
585
|
-
// Tool fetches news → Updates context → AI responds with news
|
|
586
|
-
// Route: "Company News"
|
|
587
|
-
// NO data extraction - tool just enriches context
|
|
588
|
-
|
|
589
|
-
// =========================================================================
|
|
590
|
-
// Example 5: Multi-turn conversation (context maintained)
|
|
591
|
-
// =========================================================================
|
|
592
|
-
console.log("\n=== EXAMPLE 5: Multi-turn ===");
|
|
593
|
-
|
|
594
|
-
// Turn 1
|
|
595
|
-
const turn1 = [
|
|
596
|
-
{
|
|
597
|
-
role: "user" as const,
|
|
598
|
-
content: "Tell me about the Acme Widget",
|
|
599
|
-
name: "User",
|
|
600
|
-
},
|
|
601
|
-
];
|
|
602
|
-
const resp1 = await agent.respond({ history: turn1 });
|
|
603
|
-
console.log("User: Tell me about the Acme Widget");
|
|
604
|
-
console.log("AI:", resp1.message);
|
|
605
|
-
|
|
606
|
-
// Turn 2 - follow-up question
|
|
607
|
-
const turn2 = [
|
|
608
|
-
...turn1,
|
|
609
|
-
{
|
|
610
|
-
role: "assistant" as const,
|
|
611
|
-
content: resp1.message,
|
|
612
|
-
},
|
|
613
|
-
{
|
|
614
|
-
role: "user" as const,
|
|
615
|
-
content: "How much does it cost?",
|
|
616
|
-
name: "User",
|
|
617
|
-
},
|
|
618
|
-
];
|
|
619
|
-
const resp2 = await agent.respond({
|
|
620
|
-
history: turn2,
|
|
621
|
-
session: resp1.session, // Pass previous session
|
|
622
|
-
});
|
|
623
|
-
console.log("User: How much does it cost?");
|
|
624
|
-
console.log("AI:", resp2.message);
|
|
625
|
-
// AI understands "it" refers to Acme Widget from context
|
|
626
|
-
|
|
627
|
-
// =========================================================================
|
|
628
|
-
// Example 6: Stepful feedback collection
|
|
629
|
-
// =========================================================================
|
|
630
|
-
console.log("\n=== EXAMPLE 6: Stepful Feedback Collection ===");
|
|
631
|
-
const feedbackHistory = [
|
|
632
|
-
{
|
|
633
|
-
role: "user" as const,
|
|
634
|
-
content: "This was very helpful, I want to leave some feedback.",
|
|
635
|
-
name: "User",
|
|
636
|
-
},
|
|
637
|
-
];
|
|
638
|
-
|
|
639
|
-
const feedbackResponse = await agent.respond({
|
|
640
|
-
history: feedbackHistory,
|
|
641
|
-
});
|
|
642
|
-
console.log("AI:", feedbackResponse.message);
|
|
643
|
-
console.log("Route:", feedbackResponse.session?.currentRoute?.title);
|
|
644
|
-
|
|
645
|
-
if (feedbackResponse.isRouteComplete) {
|
|
646
|
-
console.log("\n✅ Feedback collection complete!");
|
|
647
|
-
await processFeedback(agent.getCollectedData());
|
|
648
|
-
} else {
|
|
649
|
-
console.log("\n⏳ Feedback collection in progress...");
|
|
650
|
-
}
|
|
651
|
-
}
|
|
652
|
-
|
|
653
|
-
/**
|
|
654
|
-
* Mock function to process collected feedback.
|
|
655
|
-
* @param data The feedback data collected from the user.
|
|
656
|
-
*/
|
|
657
|
-
async function processFeedback(data: Partial<UnifiedData>) {
|
|
658
|
-
console.log("\n" + "=".repeat(60));
|
|
659
|
-
console.log("Processing user feedback...");
|
|
660
|
-
console.log("=".repeat(60));
|
|
661
|
-
console.log("Rating:", data.rating);
|
|
662
|
-
console.log("Comments:", data.comments);
|
|
663
|
-
console.log("Permission to contact:", data.contactPermission);
|
|
664
|
-
|
|
665
|
-
// Here you would typically save this to a database or send it to a support system.
|
|
666
|
-
await new Promise((resolve) => setTimeout(resolve, 500)); // Simulate async operation
|
|
667
|
-
console.log("Feedback logged successfully!");
|
|
668
|
-
console.log("=".repeat(60));
|
|
669
|
-
}
|
|
670
|
-
|
|
671
|
-
// ==============================================================================
|
|
672
|
-
// KEY TAKEAWAYS FOR Q&A USE CASES
|
|
673
|
-
// ==============================================================================
|
|
674
|
-
|
|
675
|
-
/*
|
|
676
|
-
* 1. NO STEP MACHINES REQUIRED
|
|
677
|
-
* - Just use the initial step with a prompt description
|
|
678
|
-
* - No collect, no skipIf, no step transitions
|
|
679
|
-
* - Perfect for stepless question-answering
|
|
680
|
-
*
|
|
681
|
-
* 2. ROUTING STILL WORKS
|
|
682
|
-
* - Framework routes to most relevant Q&A route
|
|
683
|
-
* - Always-on routing handles topic switches
|
|
684
|
-
* - Conditions guide the AI to the right knowledge domain
|
|
685
|
-
*
|
|
686
|
-
* 3. TOOLS FOR CONTEXT ENRICHMENT
|
|
687
|
-
* - Tools fetch additional data (news, search results)
|
|
688
|
-
* - Updates context (not collected data)
|
|
689
|
-
* - AI uses enriched context to answer
|
|
690
|
-
*
|
|
691
|
-
* 4. KNOWLEDGE IN CONTEXT
|
|
692
|
-
* - Store company knowledge in context
|
|
693
|
-
* - Use contextProvider for always-fresh data
|
|
694
|
-
* - Tools can augment context at runtime
|
|
695
|
-
*
|
|
696
|
-
* 5. MIX STEPFUL & STEPLESS
|
|
697
|
-
* - Have Q&A routes (stepless)
|
|
698
|
-
* - AND booking/onboarding routes (stepful)
|
|
699
|
-
* - Framework handles both seamlessly
|
|
700
|
-
*
|
|
701
|
-
* 6. GUIDELINES FOR BEHAVIOR
|
|
702
|
-
* - Use guidelines for general behavioral rules
|
|
703
|
-
* - No need for complex step machines for simple policies
|
|
704
|
-
* - Keep it simple!
|
|
705
|
-
*
|
|
706
|
-
* ARCHITECTURE FOR Q&A:
|
|
707
|
-
*
|
|
708
|
-
* User Question
|
|
709
|
-
* ↓
|
|
710
|
-
* Routing (score all Q&A routes)
|
|
711
|
-
* ↓
|
|
712
|
-
* Tool Execution (if needed - fetch data)
|
|
713
|
-
* ↓
|
|
714
|
-
* Response (AI answers from context)
|
|
715
|
-
* ↓
|
|
716
|
-
* Done (no step tracking needed)
|
|
717
|
-
*
|
|
718
|
-
* vs. STEPFUL FLOWS (booking, onboarding):
|
|
719
|
-
*
|
|
720
|
-
* User Intent
|
|
721
|
-
* ↓
|
|
722
|
-
* Routing
|
|
723
|
-
* ↓
|
|
724
|
-
* Step Machine (collect data step-by-step)
|
|
725
|
-
* ↓
|
|
726
|
-
* Tools (validate/enrich collected data)
|
|
727
|
-
* ↓
|
|
728
|
-
* Response (continue conversation)
|
|
729
|
-
* ↓
|
|
730
|
-
* Track Session (collected data, current step)
|
|
731
|
-
*/
|
|
732
|
-
|
|
733
|
-
if (require.main === module) {
|
|
734
|
-
exampleConversations().catch(console.error);
|
|
735
|
-
}
|