@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,309 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Example: Modern Streaming API
|
|
3
|
-
*
|
|
4
|
-
* This example demonstrates the new agent.stream() method introduced in the
|
|
5
|
-
* ResponseModal refactor. The modern API provides automatic session management
|
|
6
|
-
* and a simpler interface compared to the legacy respondStream() method.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import {
|
|
10
|
-
Agent,
|
|
11
|
-
AnthropicProvider,
|
|
12
|
-
OpenAIProvider,
|
|
13
|
-
} from "../../src/index";
|
|
14
|
-
|
|
15
|
-
// Context type for our examples
|
|
16
|
-
interface UserContext {
|
|
17
|
-
userId: string;
|
|
18
|
-
preferences: {
|
|
19
|
-
language?: string;
|
|
20
|
-
verbosity: "concise" | "detailed";
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
async function basicModernStreaming() {
|
|
25
|
-
console.log("\n🚀 Example 1: Basic Modern Streaming API\n");
|
|
26
|
-
|
|
27
|
-
const provider = new AnthropicProvider({
|
|
28
|
-
apiKey: process.env.ANTHROPIC_API_KEY || "",
|
|
29
|
-
model: "claude-sonnet-4-5",
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
const agent = new Agent<UserContext, unknown>({
|
|
33
|
-
name: "ModernStreamingAgent",
|
|
34
|
-
description: "Demonstrates the new stream() API",
|
|
35
|
-
context: {
|
|
36
|
-
userId: "user123",
|
|
37
|
-
preferences: {
|
|
38
|
-
language: "English",
|
|
39
|
-
verbosity: "concise",
|
|
40
|
-
},
|
|
41
|
-
},
|
|
42
|
-
provider,
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
try {
|
|
46
|
-
console.log("📤 Using modern stream() API...\n");
|
|
47
|
-
console.log("Response: ");
|
|
48
|
-
|
|
49
|
-
// NEW: Simple streaming with automatic session management
|
|
50
|
-
for await (const chunk of agent.stream("What is machine learning?")) {
|
|
51
|
-
if (chunk.delta) {
|
|
52
|
-
process.stdout.write(chunk.delta);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
if (chunk.done) {
|
|
56
|
-
console.log("\n\n✅ Stream complete!");
|
|
57
|
-
console.log(`📊 Session has ${agent.session.getHistory().length} messages`);
|
|
58
|
-
console.log("💡 Session history was automatically managed!");
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
} catch (error) {
|
|
62
|
-
console.error("❌ Error:", error);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
async function streamingWithOptions() {
|
|
67
|
-
console.log("\n🚀 Example 2: Streaming with Options\n");
|
|
68
|
-
|
|
69
|
-
const provider = new OpenAIProvider({
|
|
70
|
-
apiKey: process.env.OPENAI_API_KEY || "",
|
|
71
|
-
model: "gpt-4",
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
const agent = new Agent<UserContext, unknown>({
|
|
75
|
-
name: "OptionsStreamingAgent",
|
|
76
|
-
description: "Demonstrates streaming with options",
|
|
77
|
-
context: {
|
|
78
|
-
userId: "user456",
|
|
79
|
-
preferences: {
|
|
80
|
-
language: "English",
|
|
81
|
-
verbosity: "detailed",
|
|
82
|
-
},
|
|
83
|
-
},
|
|
84
|
-
provider,
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
try {
|
|
88
|
-
console.log("📤 Streaming with context override and abort signal...\n");
|
|
89
|
-
console.log("Response: ");
|
|
90
|
-
|
|
91
|
-
// Create abort controller for cancellation
|
|
92
|
-
const abortController = new AbortController();
|
|
93
|
-
|
|
94
|
-
// Cancel after 10 seconds
|
|
95
|
-
setTimeout(() => {
|
|
96
|
-
console.log("\n⚠️ Aborting stream...");
|
|
97
|
-
abortController.abort();
|
|
98
|
-
}, 10000);
|
|
99
|
-
|
|
100
|
-
// Stream with options
|
|
101
|
-
for await (const chunk of agent.stream("Explain quantum computing in detail", {
|
|
102
|
-
contextOverride: {
|
|
103
|
-
preferences: { verbosity: "concise" } // Override to be more concise
|
|
104
|
-
},
|
|
105
|
-
signal: abortController.signal
|
|
106
|
-
})) {
|
|
107
|
-
if (chunk.delta) {
|
|
108
|
-
process.stdout.write(chunk.delta);
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
if (chunk.done) {
|
|
112
|
-
console.log("\n\n✅ Stream complete!");
|
|
113
|
-
console.log("💡 Context was overridden for this response only");
|
|
114
|
-
clearTimeout();
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
} catch (error) {
|
|
118
|
-
if (error instanceof Error && error.name === "AbortError") {
|
|
119
|
-
console.log("\n🛑 Stream was successfully aborted!");
|
|
120
|
-
} else {
|
|
121
|
-
console.error("❌ Error:", error);
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
async function conversationFlow() {
|
|
127
|
-
console.log("\n🚀 Example 3: Multi-turn Conversation Flow\n");
|
|
128
|
-
|
|
129
|
-
const provider = new AnthropicProvider({
|
|
130
|
-
apiKey: process.env.ANTHROPIC_API_KEY || "",
|
|
131
|
-
model: "claude-sonnet-4-5",
|
|
132
|
-
});
|
|
133
|
-
|
|
134
|
-
const agent = new Agent<UserContext, unknown>({
|
|
135
|
-
name: "ConversationAgent",
|
|
136
|
-
description: "Demonstrates multi-turn conversations",
|
|
137
|
-
context: {
|
|
138
|
-
userId: "user789",
|
|
139
|
-
preferences: {
|
|
140
|
-
language: "English",
|
|
141
|
-
verbosity: "detailed",
|
|
142
|
-
},
|
|
143
|
-
},
|
|
144
|
-
provider,
|
|
145
|
-
});
|
|
146
|
-
|
|
147
|
-
const messages = [
|
|
148
|
-
"What is TypeScript?",
|
|
149
|
-
"How is it different from JavaScript?",
|
|
150
|
-
"Can you give me a simple example?",
|
|
151
|
-
"Thank you for the explanation!"
|
|
152
|
-
];
|
|
153
|
-
|
|
154
|
-
try {
|
|
155
|
-
console.log("📤 Multi-turn conversation with automatic session management...\n");
|
|
156
|
-
|
|
157
|
-
for (let i = 0; i < messages.length; i++) {
|
|
158
|
-
console.log(`\n${"=".repeat(60)}`);
|
|
159
|
-
console.log(`💬 Turn ${i + 1}: ${messages[i]}`);
|
|
160
|
-
console.log(`${"=".repeat(60)}`);
|
|
161
|
-
console.log("Response: ");
|
|
162
|
-
|
|
163
|
-
// Each stream() call automatically manages the session
|
|
164
|
-
for await (const chunk of agent.stream(messages[i])) {
|
|
165
|
-
if (chunk.delta) {
|
|
166
|
-
process.stdout.write(chunk.delta);
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
if (chunk.done) {
|
|
170
|
-
console.log(`\n📊 Session now has ${agent.session.getHistory().length} messages`);
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
console.log("\n✅ Conversation complete!");
|
|
176
|
-
console.log("💡 All session management was handled automatically");
|
|
177
|
-
console.log(`📊 Final session has ${agent.session.getHistory().length} messages`);
|
|
178
|
-
|
|
179
|
-
} catch (error) {
|
|
180
|
-
console.error("❌ Error:", error);
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
async function migrationComparison() {
|
|
185
|
-
console.log("\n🚀 Example 4: Migration from respondStream() to stream()\n");
|
|
186
|
-
|
|
187
|
-
const provider = new AnthropicProvider({
|
|
188
|
-
apiKey: process.env.ANTHROPIC_API_KEY || "",
|
|
189
|
-
model: "claude-sonnet-4-5",
|
|
190
|
-
});
|
|
191
|
-
|
|
192
|
-
const agent = new Agent<UserContext, unknown>({
|
|
193
|
-
name: "MigrationAgent",
|
|
194
|
-
description: "Shows migration from old to new API",
|
|
195
|
-
context: {
|
|
196
|
-
userId: "migration-user",
|
|
197
|
-
preferences: {
|
|
198
|
-
language: "English",
|
|
199
|
-
verbosity: "concise",
|
|
200
|
-
},
|
|
201
|
-
},
|
|
202
|
-
provider,
|
|
203
|
-
});
|
|
204
|
-
|
|
205
|
-
const userMessage = "What are the benefits of TypeScript?";
|
|
206
|
-
|
|
207
|
-
try {
|
|
208
|
-
// ========================================================================
|
|
209
|
-
// OLD WAY: respondStream() - Manual session management
|
|
210
|
-
// ========================================================================
|
|
211
|
-
console.log("🔸 OLD WAY: Using respondStream() with manual session management");
|
|
212
|
-
console.log("Code: agent.respondStream({ history: agent.session.getHistory() })");
|
|
213
|
-
console.log("Response: ");
|
|
214
|
-
|
|
215
|
-
// Manual session management required
|
|
216
|
-
await agent.session.addMessage("user", userMessage);
|
|
217
|
-
|
|
218
|
-
let oldResponse = "";
|
|
219
|
-
for await (const chunk of agent.respondStream({
|
|
220
|
-
history: agent.session.getHistory()
|
|
221
|
-
})) {
|
|
222
|
-
if (chunk.delta) {
|
|
223
|
-
process.stdout.write(chunk.delta);
|
|
224
|
-
oldResponse += chunk.delta;
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
if (chunk.done) {
|
|
228
|
-
// Manual history update required
|
|
229
|
-
await agent.session.addMessage("assistant", oldResponse);
|
|
230
|
-
console.log("\n ✅ Manual session update completed");
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
console.log("\n" + "=".repeat(60));
|
|
235
|
-
|
|
236
|
-
// ========================================================================
|
|
237
|
-
// NEW WAY: stream() - Automatic session management
|
|
238
|
-
// ========================================================================
|
|
239
|
-
console.log("🔸 NEW WAY: Using stream() with automatic session management");
|
|
240
|
-
console.log("Code: agent.stream('message')");
|
|
241
|
-
console.log("Response: ");
|
|
242
|
-
|
|
243
|
-
// Automatic session management - just pass the message!
|
|
244
|
-
for await (const chunk of agent.stream("Can you elaborate on the type safety benefits?")) {
|
|
245
|
-
if (chunk.delta) {
|
|
246
|
-
process.stdout.write(chunk.delta);
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
if (chunk.done) {
|
|
250
|
-
console.log("\n ✅ Automatic session update - no manual work needed!");
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
console.log("\n📊 Migration Benefits:");
|
|
255
|
-
console.log(" ✅ Simpler API: agent.stream('message') vs complex parameters");
|
|
256
|
-
console.log(" ✅ Automatic session management - no manual addMessage() calls");
|
|
257
|
-
console.log(" ✅ Same performance and features as respondStream()");
|
|
258
|
-
console.log(" ✅ Backward compatibility - respondStream() still works");
|
|
259
|
-
console.log(" ✅ Consistent with chat() API patterns");
|
|
260
|
-
|
|
261
|
-
console.log(`\n📊 Final session has ${agent.session.getHistory().length} messages`);
|
|
262
|
-
|
|
263
|
-
} catch (error) {
|
|
264
|
-
console.error("❌ Error:", error);
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
async function main() {
|
|
269
|
-
console.log("🚀 Modern Streaming API Examples");
|
|
270
|
-
console.log("=".repeat(60));
|
|
271
|
-
|
|
272
|
-
const examples = [
|
|
273
|
-
{ name: "Basic Modern Streaming", fn: basicModernStreaming },
|
|
274
|
-
{ name: "Streaming with Options", fn: streamingWithOptions },
|
|
275
|
-
{ name: "Multi-turn Conversation", fn: conversationFlow },
|
|
276
|
-
{ name: "Migration Comparison", fn: migrationComparison },
|
|
277
|
-
];
|
|
278
|
-
|
|
279
|
-
console.log("\nAvailable Examples:");
|
|
280
|
-
examples.forEach((ex, i) => {
|
|
281
|
-
console.log(` ${i + 1}. ${ex.name}`);
|
|
282
|
-
});
|
|
283
|
-
|
|
284
|
-
console.log("\n💡 Key Benefits of Modern stream() API:");
|
|
285
|
-
console.log(" - Simple interface: agent.stream('message')");
|
|
286
|
-
console.log(" - Automatic session management");
|
|
287
|
-
console.log(" - No manual history updates needed");
|
|
288
|
-
console.log(" - Same performance as respondStream()");
|
|
289
|
-
console.log(" - Full backward compatibility maintained");
|
|
290
|
-
|
|
291
|
-
console.log("\n" + "=".repeat(60));
|
|
292
|
-
|
|
293
|
-
// Run examples if API key is available
|
|
294
|
-
if (process.env.ANTHROPIC_API_KEY || process.env.OPENAI_API_KEY) {
|
|
295
|
-
await basicModernStreaming();
|
|
296
|
-
await migrationComparison();
|
|
297
|
-
} else {
|
|
298
|
-
console.log(
|
|
299
|
-
"\n⚠️ Set ANTHROPIC_API_KEY or OPENAI_API_KEY to run examples."
|
|
300
|
-
);
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
// Run if executed directly
|
|
305
|
-
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
306
|
-
main().catch(console.error);
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
export { main };
|
|
@@ -1,332 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Schema-Driven Data Extraction Example
|
|
3
|
-
*
|
|
4
|
-
* This example demonstrates how to use JSON Schema to define data contracts
|
|
5
|
-
* and extract structured data reliably from conversations.
|
|
6
|
-
*
|
|
7
|
-
* Key concepts:
|
|
8
|
-
* - Schema-first data definition
|
|
9
|
-
* - Type-safe data extraction
|
|
10
|
-
* - Automatic validation
|
|
11
|
-
* - NEW: Flexible ConditionTemplate patterns for routing and step control:
|
|
12
|
-
* - String-only conditions: "user wants to register" (AI context only)
|
|
13
|
-
* - Function-only conditions: (ctx) => ctx.data?.complete (programmatic only)
|
|
14
|
-
* - Mixed arrays: ["user provided info", (ctx) => !!ctx.data?.name] (hybrid)
|
|
15
|
-
* - Enhanced skipIf conditions for smart flow control
|
|
16
|
-
*/
|
|
17
|
-
|
|
18
|
-
import { Agent, GeminiProvider, type Tool } from "../../src/index";
|
|
19
|
-
|
|
20
|
-
// Define the data structure we want to collect
|
|
21
|
-
interface UserProfileData {
|
|
22
|
-
name: string;
|
|
23
|
-
email: string;
|
|
24
|
-
age: number;
|
|
25
|
-
interests: string[];
|
|
26
|
-
preferredContact: "email" | "phone" | "sms";
|
|
27
|
-
newsletterOptIn: boolean;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
// Define a tool that uses the collected data - using unified Tool interface
|
|
31
|
-
const saveUserProfileTool: Tool<unknown, UserProfileData> = {
|
|
32
|
-
id: "save_user_profile",
|
|
33
|
-
description: "Save the collected user profile information",
|
|
34
|
-
parameters: {
|
|
35
|
-
type: "object",
|
|
36
|
-
properties: {},
|
|
37
|
-
},
|
|
38
|
-
handler: async (context, args) => {
|
|
39
|
-
console.log("Saving user profile:", context.data);
|
|
40
|
-
|
|
41
|
-
// Simulate saving to database
|
|
42
|
-
console.log("Profile data:", context.data);
|
|
43
|
-
|
|
44
|
-
return {
|
|
45
|
-
data: `Profile saved successfully! Welcome ${context.data?.name}!`,
|
|
46
|
-
};
|
|
47
|
-
},
|
|
48
|
-
};
|
|
49
|
-
|
|
50
|
-
// Define the schema for data validation and extraction
|
|
51
|
-
const userProfileSchema = {
|
|
52
|
-
type: "object",
|
|
53
|
-
properties: {
|
|
54
|
-
name: {
|
|
55
|
-
type: "string",
|
|
56
|
-
description: "The user's full name",
|
|
57
|
-
minLength: 2,
|
|
58
|
-
maxLength: 100,
|
|
59
|
-
},
|
|
60
|
-
email: {
|
|
61
|
-
type: "string",
|
|
62
|
-
format: "email",
|
|
63
|
-
description: "The user's email address",
|
|
64
|
-
},
|
|
65
|
-
age: {
|
|
66
|
-
type: "number",
|
|
67
|
-
description: "The user's age in years",
|
|
68
|
-
minimum: 13,
|
|
69
|
-
maximum: 120,
|
|
70
|
-
},
|
|
71
|
-
interests: {
|
|
72
|
-
type: "array",
|
|
73
|
-
items: { type: "string" },
|
|
74
|
-
description: "User's interests and hobbies",
|
|
75
|
-
minItems: 1,
|
|
76
|
-
maxItems: 10,
|
|
77
|
-
},
|
|
78
|
-
preferredContact: {
|
|
79
|
-
type: "string",
|
|
80
|
-
enum: ["email", "phone", "sms"],
|
|
81
|
-
description: "Preferred contact method",
|
|
82
|
-
default: "email",
|
|
83
|
-
},
|
|
84
|
-
newsletterOptIn: {
|
|
85
|
-
type: "boolean",
|
|
86
|
-
description: "Whether user wants to receive newsletters",
|
|
87
|
-
default: false,
|
|
88
|
-
},
|
|
89
|
-
},
|
|
90
|
-
required: ["name", "email"],
|
|
91
|
-
};
|
|
92
|
-
|
|
93
|
-
// Create the agent with agent-level schema
|
|
94
|
-
const agent = new Agent<unknown, UserProfileData>({
|
|
95
|
-
name: "ProfileBot",
|
|
96
|
-
description:
|
|
97
|
-
"A bot that collects user profile information using schema-driven extraction",
|
|
98
|
-
provider: new GeminiProvider({
|
|
99
|
-
apiKey: process.env.GEMINI_API_KEY!,
|
|
100
|
-
model: "models/gemini-2.5-flash",
|
|
101
|
-
}),
|
|
102
|
-
// NEW: Agent-level schema definition
|
|
103
|
-
schema: userProfileSchema,
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
// Add tool using unified interface
|
|
107
|
-
agent.addTool(saveUserProfileTool);
|
|
108
|
-
|
|
109
|
-
// Create a route that collects profile information step by step
|
|
110
|
-
agent.createRoute({
|
|
111
|
-
title: "User Profile Collection",
|
|
112
|
-
description: "Collect comprehensive user profile information",
|
|
113
|
-
// Mixed condition: AI context + programmatic validation
|
|
114
|
-
when: [
|
|
115
|
-
"user wants to create a profile or register",
|
|
116
|
-
(ctx) => {
|
|
117
|
-
const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
|
|
118
|
-
return message.includes('profile') || message.includes('register') || message.includes('sign up');
|
|
119
|
-
}
|
|
120
|
-
],
|
|
121
|
-
// Skip if user already has a complete profile
|
|
122
|
-
skipIf: (ctx) => Boolean(ctx.data?.name && ctx.data?.email && ctx.data?.age),
|
|
123
|
-
// NEW: Required fields for route completion (instead of schema)
|
|
124
|
-
requiredFields: ["name", "email"],
|
|
125
|
-
// NEW: Optional fields that enhance the experience
|
|
126
|
-
optionalFields: ["age", "interests", "preferredContact", "newsletterOptIn"],
|
|
127
|
-
// Use sequential steps for a linear flow with smart skipIf conditions
|
|
128
|
-
steps: [
|
|
129
|
-
{
|
|
130
|
-
id: "ask_name",
|
|
131
|
-
description: "Ask for user's name",
|
|
132
|
-
prompt: "Hi! I'd like to create a profile for you. What's your name?",
|
|
133
|
-
collect: ["name"],
|
|
134
|
-
// String-only skipIf for AI context
|
|
135
|
-
skipIf: "user already provided their name",
|
|
136
|
-
},
|
|
137
|
-
{
|
|
138
|
-
id: "ask_email",
|
|
139
|
-
description: "Ask for user's email",
|
|
140
|
-
prompt: "What's your email address?",
|
|
141
|
-
collect: ["email"],
|
|
142
|
-
requires: ["name"],
|
|
143
|
-
// Function-only skipIf for programmatic logic
|
|
144
|
-
skipIf: (ctx) => !!ctx.data?.email,
|
|
145
|
-
},
|
|
146
|
-
{
|
|
147
|
-
id: "ask_age",
|
|
148
|
-
description: "Ask for user's age (optional)",
|
|
149
|
-
prompt: "How old are you? (optional)",
|
|
150
|
-
collect: ["age"],
|
|
151
|
-
requires: ["name", "email"],
|
|
152
|
-
// Mixed skipIf: AI context + programmatic check
|
|
153
|
-
skipIf: [
|
|
154
|
-
"age already collected",
|
|
155
|
-
(ctx) => ctx.data?.age !== undefined
|
|
156
|
-
],
|
|
157
|
-
},
|
|
158
|
-
{
|
|
159
|
-
id: "ask_interests",
|
|
160
|
-
description: "Ask for user's interests (optional)",
|
|
161
|
-
prompt: "What are your interests or hobbies? (optional)",
|
|
162
|
-
collect: ["interests"],
|
|
163
|
-
requires: ["name", "email"],
|
|
164
|
-
// Mixed skipIf with complex logic
|
|
165
|
-
skipIf: [
|
|
166
|
-
"interests already provided",
|
|
167
|
-
(ctx) => !!(ctx.data?.interests && ctx.data.interests.length > 0)
|
|
168
|
-
],
|
|
169
|
-
},
|
|
170
|
-
{
|
|
171
|
-
id: "ask_contact_preference",
|
|
172
|
-
description: "Ask for preferred contact method",
|
|
173
|
-
prompt: "What's your preferred contact method?",
|
|
174
|
-
collect: ["preferredContact"],
|
|
175
|
-
requires: ["name", "email"],
|
|
176
|
-
// Function-only skipIf
|
|
177
|
-
skipIf: (ctx) => !!ctx.data?.preferredContact,
|
|
178
|
-
},
|
|
179
|
-
{
|
|
180
|
-
id: "ask_newsletter",
|
|
181
|
-
description: "Ask about newsletter subscription",
|
|
182
|
-
prompt: "Would you like to subscribe to our newsletter?",
|
|
183
|
-
collect: ["newsletterOptIn"],
|
|
184
|
-
requires: ["name", "email"],
|
|
185
|
-
// String-only skipIf for simple cases
|
|
186
|
-
skipIf: "newsletter preference already collected",
|
|
187
|
-
},
|
|
188
|
-
{
|
|
189
|
-
id: "save_profile",
|
|
190
|
-
description: "Save the collected profile",
|
|
191
|
-
prompt:
|
|
192
|
-
"Thanks for providing your information! Let me save your profile.",
|
|
193
|
-
tools: ["save_user_profile"], // Reference by ID
|
|
194
|
-
requires: ["name", "email"],
|
|
195
|
-
},
|
|
196
|
-
],
|
|
197
|
-
});
|
|
198
|
-
|
|
199
|
-
// Example conversation demonstrating schema-driven extraction
|
|
200
|
-
async function demonstrateSchemaExtraction() {
|
|
201
|
-
console.log("=== Schema-Driven Data Extraction Demo ===\n");
|
|
202
|
-
|
|
203
|
-
// First message - user provides name and email
|
|
204
|
-
console.log("User: Hi, I'm John Doe and my email is john@example.com");
|
|
205
|
-
const response1 = await agent.respond({
|
|
206
|
-
history: [
|
|
207
|
-
{
|
|
208
|
-
role: "user",
|
|
209
|
-
content: "Hi, I'm John Doe and my email is john@example.com",
|
|
210
|
-
name: "John",
|
|
211
|
-
},
|
|
212
|
-
],
|
|
213
|
-
});
|
|
214
|
-
|
|
215
|
-
console.log("Bot:", response1.message);
|
|
216
|
-
console.log(
|
|
217
|
-
"Collected data:",
|
|
218
|
-
JSON.stringify(response1.session?.data as Partial<UserProfileData>, null, 2)
|
|
219
|
-
);
|
|
220
|
-
|
|
221
|
-
// Second message - user provides more information
|
|
222
|
-
console.log(
|
|
223
|
-
"\nUser: I'm 30 years old and I like hiking, reading, and photography"
|
|
224
|
-
);
|
|
225
|
-
const response2 = await agent.respond({
|
|
226
|
-
history: [
|
|
227
|
-
{
|
|
228
|
-
role: "user",
|
|
229
|
-
content: "Hi, I'm John Doe and my email is john@example.com",
|
|
230
|
-
name: "John",
|
|
231
|
-
},
|
|
232
|
-
{
|
|
233
|
-
role: "assistant",
|
|
234
|
-
content: response1.message,
|
|
235
|
-
},
|
|
236
|
-
{
|
|
237
|
-
role: "user",
|
|
238
|
-
content: "I'm 30 years old and I like hiking, reading, and photography",
|
|
239
|
-
name: "John",
|
|
240
|
-
},
|
|
241
|
-
],
|
|
242
|
-
session: response1.session,
|
|
243
|
-
});
|
|
244
|
-
|
|
245
|
-
console.log("Bot:", response2.message);
|
|
246
|
-
console.log(
|
|
247
|
-
"Collected data:",
|
|
248
|
-
JSON.stringify(response2.session?.data as Partial<UserProfileData>, null, 2)
|
|
249
|
-
);
|
|
250
|
-
|
|
251
|
-
// Third message - user provides contact preference and completes profile
|
|
252
|
-
console.log(
|
|
253
|
-
"\nUser: Please contact me by email and yes, I'd like the newsletter"
|
|
254
|
-
);
|
|
255
|
-
const response3 = await agent.respond({
|
|
256
|
-
history: [
|
|
257
|
-
{
|
|
258
|
-
role: "user",
|
|
259
|
-
content: "Hi, I'm John Doe and my email is john@example.com",
|
|
260
|
-
name: "John",
|
|
261
|
-
},
|
|
262
|
-
{
|
|
263
|
-
role: "assistant",
|
|
264
|
-
content: response1.message,
|
|
265
|
-
},
|
|
266
|
-
{
|
|
267
|
-
role: "user",
|
|
268
|
-
content: "I'm 30 years old and I like hiking, reading, and photography",
|
|
269
|
-
name: "John",
|
|
270
|
-
},
|
|
271
|
-
{
|
|
272
|
-
role: "assistant",
|
|
273
|
-
content: response2.message,
|
|
274
|
-
},
|
|
275
|
-
{
|
|
276
|
-
role: "user",
|
|
277
|
-
content: "Please contact me by email and yes, I'd like the newsletter",
|
|
278
|
-
name: "John",
|
|
279
|
-
},
|
|
280
|
-
],
|
|
281
|
-
session: response2.session,
|
|
282
|
-
});
|
|
283
|
-
|
|
284
|
-
console.log("Bot:", response3.message);
|
|
285
|
-
console.log(
|
|
286
|
-
"Final collected data:",
|
|
287
|
-
JSON.stringify(response3.session?.data as Partial<UserProfileData>, null, 2)
|
|
288
|
-
);
|
|
289
|
-
console.log("Route complete:", response3.isRouteComplete);
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
// Demonstrate with a single comprehensive message
|
|
293
|
-
async function demonstrateSmartSkipping() {
|
|
294
|
-
console.log("\n=== Smart Skipping Demo ===\n");
|
|
295
|
-
|
|
296
|
-
console.log("User provides everything in one message:");
|
|
297
|
-
console.log(
|
|
298
|
-
"User: I'm Sarah Johnson, sarah@email.com, 28 years old. I enjoy cooking, travel, and music. Contact me by phone and yes to newsletter."
|
|
299
|
-
);
|
|
300
|
-
|
|
301
|
-
const response = await agent.respond({
|
|
302
|
-
history: [
|
|
303
|
-
{
|
|
304
|
-
role: "user",
|
|
305
|
-
content:
|
|
306
|
-
"I'm Sarah Johnson, sarah@email.com, 28 years old. I enjoy cooking, travel, and music. Contact me by phone and yes to newsletter.",
|
|
307
|
-
name: "Sarah",
|
|
308
|
-
},
|
|
309
|
-
],
|
|
310
|
-
});
|
|
311
|
-
|
|
312
|
-
console.log("Bot:", response.message);
|
|
313
|
-
console.log(
|
|
314
|
-
"Collected data:",
|
|
315
|
-
JSON.stringify(response.session?.data as Partial<UserProfileData>, null, 2)
|
|
316
|
-
);
|
|
317
|
-
console.log("Route complete:", response.isRouteComplete);
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
// Run the demonstrations
|
|
321
|
-
async function main() {
|
|
322
|
-
try {
|
|
323
|
-
await demonstrateSchemaExtraction();
|
|
324
|
-
await demonstrateSmartSkipping();
|
|
325
|
-
} catch (error) {
|
|
326
|
-
console.error("Error:", error);
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
331
|
-
main().catch(console.error);
|
|
332
|
-
}
|