@falai/agent 0.8.1 → 0.9.0-alpha-2
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 +332 -147
- package/dist/{adapters → cjs/src/adapters}/MemoryAdapter.d.ts +4 -4
- package/dist/cjs/src/adapters/MemoryAdapter.d.ts.map +1 -0
- package/dist/cjs/{adapters → src/adapters}/MemoryAdapter.js +41 -21
- package/dist/cjs/src/adapters/MemoryAdapter.js.map +1 -0
- package/dist/{adapters → cjs/src/adapters}/MongoAdapter.d.ts +3 -3
- package/dist/cjs/src/adapters/MongoAdapter.d.ts.map +1 -0
- package/dist/cjs/{adapters → src/adapters}/MongoAdapter.js +2 -1
- package/dist/cjs/src/adapters/MongoAdapter.js.map +1 -0
- package/dist/cjs/{adapters → src/adapters}/OpenSearchAdapter.d.ts +3 -3
- package/dist/cjs/src/adapters/OpenSearchAdapter.d.ts.map +1 -0
- package/dist/cjs/{adapters → src/adapters}/OpenSearchAdapter.js +10 -13
- package/dist/cjs/src/adapters/OpenSearchAdapter.js.map +1 -0
- package/dist/cjs/{adapters → src/adapters}/PostgreSQLAdapter.d.ts +3 -3
- package/dist/cjs/src/adapters/PostgreSQLAdapter.d.ts.map +1 -0
- package/dist/cjs/{adapters → src/adapters}/PostgreSQLAdapter.js +1 -1
- package/dist/cjs/src/adapters/PostgreSQLAdapter.js.map +1 -0
- package/dist/cjs/{adapters → src/adapters}/PrismaAdapter.d.ts +3 -3
- package/dist/cjs/src/adapters/PrismaAdapter.d.ts.map +1 -0
- package/dist/cjs/{adapters → src/adapters}/PrismaAdapter.js +35 -5
- package/dist/cjs/src/adapters/PrismaAdapter.js.map +1 -0
- package/dist/cjs/{adapters → src/adapters}/RedisAdapter.d.ts +3 -3
- package/dist/cjs/src/adapters/RedisAdapter.d.ts.map +1 -0
- package/dist/cjs/{adapters → src/adapters}/RedisAdapter.js +3 -2
- package/dist/cjs/src/adapters/RedisAdapter.js.map +1 -0
- package/dist/{adapters → cjs/src/adapters}/SQLiteAdapter.d.ts +3 -3
- package/dist/cjs/src/adapters/SQLiteAdapter.d.ts.map +1 -0
- package/dist/cjs/{adapters → src/adapters}/SQLiteAdapter.js +2 -1
- package/dist/cjs/src/adapters/SQLiteAdapter.js.map +1 -0
- package/dist/cjs/src/adapters/index.d.ts.map +1 -0
- package/dist/cjs/src/adapters/index.js.map +1 -0
- package/dist/cjs/src/constants/index.d.ts.map +1 -0
- package/dist/cjs/src/constants/index.js.map +1 -0
- package/dist/cjs/src/core/Agent.d.ts +223 -0
- package/dist/cjs/src/core/Agent.d.ts.map +1 -0
- package/dist/cjs/src/core/Agent.js +1660 -0
- package/dist/cjs/src/core/Agent.js.map +1 -0
- package/dist/cjs/src/core/Events.d.ts +26 -0
- package/dist/cjs/src/core/Events.d.ts.map +1 -0
- package/dist/cjs/src/core/Events.js +144 -0
- package/dist/cjs/src/core/Events.js.map +1 -0
- package/dist/{core → cjs/src/core}/PersistenceManager.d.ts +21 -19
- package/dist/cjs/src/core/PersistenceManager.d.ts.map +1 -0
- package/dist/cjs/{core → src/core}/PersistenceManager.js +73 -20
- package/dist/cjs/src/core/PersistenceManager.js.map +1 -0
- package/dist/cjs/src/core/PromptComposer.d.ts +27 -0
- package/dist/cjs/src/core/PromptComposer.d.ts.map +1 -0
- package/dist/cjs/src/core/PromptComposer.js +157 -0
- package/dist/cjs/src/core/PromptComposer.js.map +1 -0
- package/dist/cjs/src/core/ResponseEngine.d.ts +32 -0
- package/dist/cjs/src/core/ResponseEngine.d.ts.map +1 -0
- package/dist/cjs/src/core/ResponseEngine.js +84 -0
- package/dist/cjs/src/core/ResponseEngine.js.map +1 -0
- package/dist/cjs/src/core/ResponsePipeline.d.ts +171 -0
- package/dist/cjs/src/core/ResponsePipeline.d.ts.map +1 -0
- package/dist/cjs/src/core/ResponsePipeline.js +514 -0
- package/dist/cjs/src/core/ResponsePipeline.js.map +1 -0
- package/dist/cjs/src/core/Route.d.ts +145 -0
- package/dist/cjs/src/core/Route.d.ts.map +1 -0
- package/dist/cjs/src/core/Route.js +343 -0
- package/dist/cjs/src/core/Route.js.map +1 -0
- package/dist/cjs/src/core/RoutingEngine.d.ts +129 -0
- package/dist/cjs/src/core/RoutingEngine.d.ts.map +1 -0
- package/dist/cjs/{core → src/core}/RoutingEngine.js +215 -117
- package/dist/cjs/src/core/RoutingEngine.js.map +1 -0
- package/dist/cjs/src/core/SessionManager.d.ts +86 -0
- package/dist/cjs/src/core/SessionManager.d.ts.map +1 -0
- package/dist/cjs/src/core/SessionManager.js +217 -0
- package/dist/cjs/src/core/SessionManager.js.map +1 -0
- package/dist/cjs/src/core/Step.d.ts +96 -0
- package/dist/cjs/src/core/Step.d.ts.map +1 -0
- package/dist/cjs/src/core/Step.js +206 -0
- package/dist/cjs/src/core/Step.js.map +1 -0
- package/dist/cjs/src/core/ToolExecutor.d.ts +45 -0
- package/dist/cjs/src/core/ToolExecutor.d.ts.map +1 -0
- package/dist/cjs/{core → src/core}/ToolExecutor.js +30 -19
- package/dist/cjs/src/core/ToolExecutor.js.map +1 -0
- package/dist/{index.d.ts → cjs/src/index.d.ts} +7 -15
- package/dist/cjs/src/index.d.ts.map +1 -0
- package/dist/cjs/{index.js → src/index.js} +21 -19
- package/dist/cjs/src/index.js.map +1 -0
- package/dist/cjs/{providers → src/providers}/AnthropicProvider.d.ts +1 -1
- package/dist/cjs/src/providers/AnthropicProvider.d.ts.map +1 -0
- package/dist/cjs/{providers → src/providers}/AnthropicProvider.js +54 -2
- package/dist/cjs/src/providers/AnthropicProvider.js.map +1 -0
- package/dist/{providers → cjs/src/providers}/GeminiProvider.d.ts +1 -1
- package/dist/cjs/src/providers/GeminiProvider.d.ts.map +1 -0
- package/dist/cjs/{providers → src/providers}/GeminiProvider.js +65 -0
- package/dist/cjs/src/providers/GeminiProvider.js.map +1 -0
- package/dist/cjs/{providers → src/providers}/OpenAIProvider.d.ts +1 -1
- package/dist/cjs/src/providers/OpenAIProvider.d.ts.map +1 -0
- package/dist/cjs/{providers → src/providers}/OpenAIProvider.js +70 -1
- package/dist/cjs/src/providers/OpenAIProvider.js.map +1 -0
- package/dist/{providers → cjs/src/providers}/OpenRouterProvider.d.ts +1 -1
- package/dist/cjs/src/providers/OpenRouterProvider.d.ts.map +1 -0
- package/dist/cjs/{providers → src/providers}/OpenRouterProvider.js +76 -0
- package/dist/cjs/src/providers/OpenRouterProvider.js.map +1 -0
- package/dist/cjs/src/providers/index.d.ts.map +1 -0
- package/dist/cjs/src/providers/index.js.map +1 -0
- package/dist/cjs/{types → src/types}/agent.d.ts +80 -41
- package/dist/cjs/src/types/agent.d.ts.map +1 -0
- package/dist/cjs/src/types/agent.js.map +1 -0
- package/dist/cjs/{types → src/types}/ai.d.ts +7 -0
- package/dist/cjs/src/types/ai.d.ts.map +1 -0
- package/dist/cjs/src/types/ai.js.map +1 -0
- package/dist/{types → cjs/src/types}/history.d.ts +76 -18
- package/dist/cjs/src/types/history.d.ts.map +1 -0
- package/dist/cjs/src/types/history.js +33 -0
- package/dist/cjs/src/types/history.js.map +1 -0
- package/dist/cjs/src/types/index.d.ts +20 -0
- package/dist/cjs/src/types/index.d.ts.map +1 -0
- package/dist/cjs/src/types/index.js +30 -0
- package/dist/cjs/src/types/index.js.map +1 -0
- package/dist/{types → cjs/src/types}/persistence.d.ts +38 -23
- package/dist/cjs/src/types/persistence.d.ts.map +1 -0
- package/dist/cjs/src/types/persistence.js.map +1 -0
- package/dist/cjs/src/types/route.d.ts +235 -0
- package/dist/cjs/src/types/route.d.ts.map +1 -0
- package/dist/cjs/{types → src/types}/route.js.map +1 -1
- package/dist/cjs/src/types/routing.d.ts.map +1 -0
- package/dist/{types → cjs/src/types}/routing.js.map +1 -1
- package/dist/cjs/src/types/schema.d.ts.map +1 -0
- package/dist/{types → cjs/src/types}/schema.js.map +1 -1
- package/dist/cjs/src/types/session.d.ts +65 -0
- package/dist/cjs/src/types/session.d.ts.map +1 -0
- package/dist/cjs/src/types/session.js +6 -0
- package/dist/cjs/src/types/session.js.map +1 -0
- package/dist/cjs/src/types/template.d.ts +30 -0
- package/dist/cjs/src/types/template.d.ts.map +1 -0
- package/dist/cjs/src/types/template.js +3 -0
- package/dist/cjs/src/types/template.js.map +1 -0
- package/dist/{types → cjs/src/types}/tool.d.ts +17 -13
- package/dist/cjs/src/types/tool.d.ts.map +1 -0
- package/dist/cjs/{types → src/types}/tool.js.map +1 -1
- package/dist/cjs/src/utils/clone.d.ts +8 -0
- package/dist/cjs/src/utils/clone.d.ts.map +1 -0
- package/dist/cjs/src/utils/clone.js +36 -0
- package/dist/cjs/src/utils/clone.js.map +1 -0
- package/dist/{utils → cjs/src/utils}/event.d.ts +1 -1
- package/dist/cjs/src/utils/event.d.ts.map +1 -0
- package/dist/cjs/{utils → src/utils}/event.js +2 -2
- package/dist/cjs/src/utils/event.js.map +1 -0
- package/dist/cjs/src/utils/history.d.ts +31 -0
- package/dist/cjs/src/utils/history.d.ts.map +1 -0
- package/dist/cjs/src/utils/history.js +128 -0
- package/dist/cjs/src/utils/history.js.map +1 -0
- package/dist/cjs/src/utils/id.d.ts.map +1 -0
- package/dist/cjs/src/utils/id.js.map +1 -0
- package/dist/cjs/src/utils/index.d.ts +13 -0
- package/dist/cjs/src/utils/index.d.ts.map +1 -0
- package/dist/cjs/src/utils/index.js +49 -0
- package/dist/cjs/src/utils/index.js.map +1 -0
- package/dist/cjs/src/utils/logger.d.ts.map +1 -0
- package/dist/cjs/src/utils/logger.js.map +1 -0
- package/dist/cjs/src/utils/retry.d.ts.map +1 -0
- package/dist/cjs/src/utils/retry.js.map +1 -0
- package/dist/cjs/src/utils/session.d.ts +51 -0
- package/dist/cjs/src/utils/session.d.ts.map +1 -0
- package/dist/cjs/{types → src/utils}/session.js +35 -32
- package/dist/cjs/src/utils/session.js.map +1 -0
- package/dist/cjs/src/utils/template.d.ts +107 -0
- package/dist/cjs/src/utils/template.d.ts.map +1 -0
- package/dist/cjs/src/utils/template.js +283 -0
- package/dist/cjs/src/utils/template.js.map +1 -0
- package/dist/{cjs → src}/adapters/MemoryAdapter.d.ts +4 -4
- package/dist/src/adapters/MemoryAdapter.d.ts.map +1 -0
- package/dist/{adapters → src/adapters}/MemoryAdapter.js +41 -21
- package/dist/src/adapters/MemoryAdapter.js.map +1 -0
- package/dist/{cjs → src}/adapters/MongoAdapter.d.ts +3 -3
- package/dist/src/adapters/MongoAdapter.d.ts.map +1 -0
- package/dist/{adapters → src/adapters}/MongoAdapter.js +2 -1
- package/dist/src/adapters/MongoAdapter.js.map +1 -0
- package/dist/{adapters → src/adapters}/OpenSearchAdapter.d.ts +3 -3
- package/dist/src/adapters/OpenSearchAdapter.d.ts.map +1 -0
- package/dist/{adapters → src/adapters}/OpenSearchAdapter.js +10 -13
- package/dist/src/adapters/OpenSearchAdapter.js.map +1 -0
- package/dist/{adapters → src/adapters}/PostgreSQLAdapter.d.ts +3 -3
- package/dist/src/adapters/PostgreSQLAdapter.d.ts.map +1 -0
- package/dist/{adapters → src/adapters}/PostgreSQLAdapter.js +1 -1
- package/dist/src/adapters/PostgreSQLAdapter.js.map +1 -0
- package/dist/{adapters → src/adapters}/PrismaAdapter.d.ts +3 -3
- package/dist/src/adapters/PrismaAdapter.d.ts.map +1 -0
- package/dist/{adapters → src/adapters}/PrismaAdapter.js +35 -5
- package/dist/src/adapters/PrismaAdapter.js.map +1 -0
- package/dist/{adapters → src/adapters}/RedisAdapter.d.ts +3 -3
- package/dist/src/adapters/RedisAdapter.d.ts.map +1 -0
- package/dist/{adapters → src/adapters}/RedisAdapter.js +3 -2
- package/dist/src/adapters/RedisAdapter.js.map +1 -0
- package/dist/{cjs → src}/adapters/SQLiteAdapter.d.ts +3 -3
- package/dist/src/adapters/SQLiteAdapter.d.ts.map +1 -0
- package/dist/{adapters → src/adapters}/SQLiteAdapter.js +2 -1
- package/dist/src/adapters/SQLiteAdapter.js.map +1 -0
- package/dist/src/adapters/index.js.map +1 -0
- package/dist/src/constants/index.js.map +1 -0
- package/dist/src/core/Agent.d.ts +223 -0
- package/dist/src/core/Agent.d.ts.map +1 -0
- package/dist/src/core/Agent.js +1656 -0
- package/dist/src/core/Agent.js.map +1 -0
- package/dist/src/core/Events.d.ts +26 -0
- package/dist/src/core/Events.d.ts.map +1 -0
- package/dist/src/core/Events.js +137 -0
- package/dist/src/core/Events.js.map +1 -0
- package/dist/{cjs → src}/core/PersistenceManager.d.ts +21 -19
- package/dist/src/core/PersistenceManager.d.ts.map +1 -0
- package/dist/{core → src/core}/PersistenceManager.js +71 -18
- package/dist/src/core/PersistenceManager.js.map +1 -0
- package/dist/src/core/PromptComposer.d.ts +27 -0
- package/dist/src/core/PromptComposer.d.ts.map +1 -0
- package/dist/src/core/PromptComposer.js +153 -0
- package/dist/src/core/PromptComposer.js.map +1 -0
- package/dist/src/core/ResponseEngine.d.ts +32 -0
- package/dist/src/core/ResponseEngine.d.ts.map +1 -0
- package/dist/src/core/ResponseEngine.js +80 -0
- package/dist/src/core/ResponseEngine.js.map +1 -0
- package/dist/src/core/ResponsePipeline.d.ts +171 -0
- package/dist/src/core/ResponsePipeline.d.ts.map +1 -0
- package/dist/src/core/ResponsePipeline.js +510 -0
- package/dist/src/core/ResponsePipeline.js.map +1 -0
- package/dist/src/core/Route.d.ts +145 -0
- package/dist/src/core/Route.d.ts.map +1 -0
- package/dist/src/core/Route.js +339 -0
- package/dist/src/core/Route.js.map +1 -0
- package/dist/src/core/RoutingEngine.d.ts +129 -0
- package/dist/src/core/RoutingEngine.d.ts.map +1 -0
- package/dist/{core → src/core}/RoutingEngine.js +211 -113
- package/dist/src/core/RoutingEngine.js.map +1 -0
- package/dist/src/core/SessionManager.d.ts +86 -0
- package/dist/src/core/SessionManager.d.ts.map +1 -0
- package/dist/src/core/SessionManager.js +213 -0
- package/dist/src/core/SessionManager.js.map +1 -0
- package/dist/src/core/Step.d.ts +96 -0
- package/dist/src/core/Step.d.ts.map +1 -0
- package/dist/src/core/Step.js +202 -0
- package/dist/src/core/Step.js.map +1 -0
- package/dist/src/core/ToolExecutor.d.ts +45 -0
- package/dist/src/core/ToolExecutor.d.ts.map +1 -0
- package/dist/src/core/ToolExecutor.js +80 -0
- package/dist/src/core/ToolExecutor.js.map +1 -0
- package/dist/{cjs → src}/index.d.ts +7 -15
- package/dist/src/index.d.ts.map +1 -0
- package/dist/{index.js → src/index.js} +6 -7
- package/dist/src/index.js.map +1 -0
- package/dist/{providers → src/providers}/AnthropicProvider.d.ts +1 -1
- package/dist/src/providers/AnthropicProvider.d.ts.map +1 -0
- package/dist/{providers → src/providers}/AnthropicProvider.js +54 -2
- package/dist/src/providers/AnthropicProvider.js.map +1 -0
- package/dist/{cjs → src}/providers/GeminiProvider.d.ts +1 -1
- package/dist/{cjs → src}/providers/GeminiProvider.d.ts.map +1 -1
- package/dist/{providers → src/providers}/GeminiProvider.js +65 -0
- package/dist/src/providers/GeminiProvider.js.map +1 -0
- package/dist/{providers → src/providers}/OpenAIProvider.d.ts +1 -1
- package/dist/{cjs → src}/providers/OpenAIProvider.d.ts.map +1 -1
- package/dist/{providers → src/providers}/OpenAIProvider.js +70 -1
- package/dist/src/providers/OpenAIProvider.js.map +1 -0
- package/dist/{cjs → src}/providers/OpenRouterProvider.d.ts +1 -1
- package/dist/{cjs → src}/providers/OpenRouterProvider.d.ts.map +1 -1
- package/dist/{providers → src/providers}/OpenRouterProvider.js +76 -0
- package/dist/src/providers/OpenRouterProvider.js.map +1 -0
- package/dist/src/providers/index.js.map +1 -0
- package/dist/{types → src/types}/agent.d.ts +80 -41
- package/dist/src/types/agent.d.ts.map +1 -0
- package/dist/src/types/agent.js.map +1 -0
- package/dist/{types → src/types}/ai.d.ts +7 -0
- package/dist/src/types/ai.d.ts.map +1 -0
- package/dist/{cjs → src}/types/ai.js.map +1 -1
- package/dist/{cjs → src}/types/history.d.ts +76 -18
- package/dist/src/types/history.d.ts.map +1 -0
- package/dist/src/types/history.js +30 -0
- package/dist/src/types/history.js.map +1 -0
- package/dist/src/types/index.d.ts +20 -0
- package/dist/src/types/index.d.ts.map +1 -0
- package/dist/src/types/index.js +10 -0
- package/dist/src/types/index.js.map +1 -0
- package/dist/{cjs → src}/types/persistence.d.ts +38 -23
- package/dist/src/types/persistence.d.ts.map +1 -0
- package/dist/src/types/persistence.js.map +1 -0
- package/dist/src/types/route.d.ts +235 -0
- package/dist/src/types/route.d.ts.map +1 -0
- package/dist/{types → src/types}/route.js.map +1 -1
- package/dist/src/types/session.d.ts +65 -0
- package/dist/src/types/session.d.ts.map +1 -0
- package/dist/src/types/session.js +5 -0
- package/dist/src/types/session.js.map +1 -0
- package/dist/src/types/template.d.ts +30 -0
- package/dist/src/types/template.d.ts.map +1 -0
- package/dist/src/types/template.js +2 -0
- package/dist/src/types/template.js.map +1 -0
- package/dist/{cjs → src}/types/tool.d.ts +17 -13
- package/dist/src/types/tool.d.ts.map +1 -0
- package/dist/{types → src/types}/tool.js.map +1 -1
- package/dist/src/utils/clone.d.ts +8 -0
- package/dist/src/utils/clone.d.ts.map +1 -0
- package/dist/src/utils/clone.js +33 -0
- package/dist/src/utils/clone.js.map +1 -0
- package/dist/{cjs → src}/utils/event.d.ts +1 -1
- package/dist/{cjs → src}/utils/event.d.ts.map +1 -1
- package/dist/{utils → src/utils}/event.js +1 -1
- package/dist/src/utils/event.js.map +1 -0
- package/dist/src/utils/history.d.ts +31 -0
- package/dist/src/utils/history.d.ts.map +1 -0
- package/dist/src/utils/history.js +121 -0
- package/dist/src/utils/history.js.map +1 -0
- package/dist/src/utils/id.js.map +1 -0
- package/dist/src/utils/index.d.ts +13 -0
- package/dist/src/utils/index.d.ts.map +1 -0
- package/dist/src/utils/index.js +19 -0
- package/dist/src/utils/index.js.map +1 -0
- package/dist/src/utils/logger.js.map +1 -0
- package/dist/src/utils/retry.js.map +1 -0
- package/dist/src/utils/session.d.ts +51 -0
- package/dist/src/utils/session.d.ts.map +1 -0
- package/dist/{types → src/utils}/session.js +33 -32
- package/dist/src/utils/session.js.map +1 -0
- package/dist/src/utils/template.d.ts +107 -0
- package/dist/src/utils/template.d.ts.map +1 -0
- package/dist/src/utils/template.js +276 -0
- package/dist/src/utils/template.js.map +1 -0
- package/docs/README.md +174 -68
- package/docs/{API_REFERENCE.md → api/README.md} +925 -255
- package/docs/api/overview.md +952 -0
- package/docs/core/agent/README.md +787 -0
- package/docs/{CONTEXT_MANAGEMENT.md → core/agent/context-management.md} +175 -102
- package/docs/{ARCHITECTURE.md → core/agent/session-management.md} +117 -69
- package/docs/core/ai-integration/prompt-composition.md +220 -0
- package/docs/core/ai-integration/providers.md +515 -0
- package/docs/core/ai-integration/response-processing.md +176 -0
- package/docs/core/conversation-flows/data-collection.md +623 -0
- package/docs/core/conversation-flows/route-dsl.md +502 -0
- package/docs/core/conversation-flows/routes.md +117 -0
- package/docs/core/conversation-flows/step-transitions.md +595 -0
- package/docs/core/conversation-flows/steps.md +154 -0
- package/docs/{ADAPTERS.md → core/persistence/adapters.md} +1 -1
- package/docs/core/persistence/session-storage.md +644 -0
- package/docs/core/routing/intelligent-routing.md +348 -0
- package/docs/core/tools/tool-definition.md +346 -0
- package/docs/core/tools/tool-execution.md +815 -0
- package/docs/core/tools/tool-scoping.md +628 -0
- package/docs/guides/getting-started/README.md +406 -0
- package/examples/{company-qna-agent.ts → advanced-patterns/knowledge-based-agent.ts} +139 -95
- package/examples/{persistent-onboarding.ts → advanced-patterns/persistent-onboarding.ts} +244 -137
- package/examples/{rules-prohibitions.ts → advanced-patterns/route-lifecycle-hooks.ts} +130 -84
- package/examples/{streaming-agent.ts → advanced-patterns/streaming-responses.ts} +116 -90
- package/examples/ai-providers/anthropic-integration.ts +384 -0
- package/examples/{openai-agent.ts → ai-providers/openai-integration.ts} +57 -63
- package/examples/conversation-flows/completion-transitions.ts +277 -0
- package/examples/core-concepts/basic-agent.ts +443 -0
- package/examples/core-concepts/schema-driven-extraction.ts +305 -0
- package/examples/core-concepts/session-management.ts +406 -0
- package/examples/integrations/database-integration.ts +630 -0
- package/examples/integrations/healthcare-integration.ts +609 -0
- package/examples/{opensearch-persistence.ts → integrations/search-integration.ts} +199 -171
- package/examples/integrations/server-session-management.ts +307 -0
- package/examples/persistence/custom-adapter.ts +529 -0
- package/examples/{prisma-persistence.ts → persistence/database-persistence.ts} +215 -272
- package/examples/persistence/memory-sessions.ts +495 -0
- package/examples/{prisma-schema.example.prisma → persistence/prisma-schema.example.prisma} +1 -1
- package/examples/persistence/redis-persistence.ts +490 -0
- package/examples/tools/basic-tools.ts +561 -0
- package/examples/{extracted-data-modification.ts → tools/data-enrichment-tools.ts} +128 -117
- package/package.json +14 -10
- package/src/adapters/MemoryAdapter.ts +74 -46
- package/src/adapters/MongoAdapter.ts +33 -24
- package/src/adapters/OpenSearchAdapter.ts +41 -37
- package/src/adapters/PostgreSQLAdapter.ts +35 -24
- package/src/adapters/PrismaAdapter.ts +69 -27
- package/src/adapters/RedisAdapter.ts +38 -26
- package/src/adapters/SQLiteAdapter.ts +32 -22
- package/src/core/Agent.ts +1431 -526
- package/src/core/Events.ts +100 -112
- package/src/core/PersistenceManager.ts +103 -49
- package/src/core/PromptComposer.ts +158 -85
- package/src/core/ResponseEngine.ts +128 -46
- package/src/core/ResponsePipeline.ts +830 -0
- package/src/core/Route.ts +222 -53
- package/src/core/RoutingEngine.ts +345 -229
- package/src/core/SessionManager.ts +265 -0
- package/src/core/Step.ts +157 -67
- package/src/core/ToolExecutor.ts +52 -43
- package/src/index.ts +31 -37
- package/src/providers/AnthropicProvider.ts +71 -5
- package/src/providers/GeminiProvider.ts +83 -2
- package/src/providers/OpenAIProvider.ts +95 -3
- package/src/providers/OpenRouterProvider.ts +102 -2
- package/src/types/agent.ts +81 -46
- package/src/types/ai.ts +7 -0
- package/src/types/history.ts +91 -18
- package/src/types/index.ts +45 -7
- package/src/types/persistence.ts +45 -28
- package/src/types/route.ts +122 -57
- package/src/types/session.ts +20 -220
- package/src/types/template.ts +36 -0
- package/src/types/tool.ts +23 -19
- package/src/utils/clone.ts +36 -0
- package/src/utils/event.ts +1 -1
- package/src/utils/history.ts +143 -0
- package/src/utils/index.ts +53 -0
- package/src/utils/session.ts +204 -0
- package/src/utils/template.ts +335 -0
- package/dist/adapters/MemoryAdapter.d.ts.map +0 -1
- package/dist/adapters/MemoryAdapter.js.map +0 -1
- package/dist/adapters/MongoAdapter.d.ts.map +0 -1
- package/dist/adapters/MongoAdapter.js.map +0 -1
- package/dist/adapters/OpenSearchAdapter.d.ts.map +0 -1
- package/dist/adapters/OpenSearchAdapter.js.map +0 -1
- package/dist/adapters/PostgreSQLAdapter.d.ts.map +0 -1
- package/dist/adapters/PostgreSQLAdapter.js.map +0 -1
- package/dist/adapters/PrismaAdapter.d.ts.map +0 -1
- package/dist/adapters/PrismaAdapter.js.map +0 -1
- package/dist/adapters/RedisAdapter.d.ts.map +0 -1
- package/dist/adapters/RedisAdapter.js.map +0 -1
- package/dist/adapters/SQLiteAdapter.d.ts.map +0 -1
- package/dist/adapters/SQLiteAdapter.js.map +0 -1
- package/dist/adapters/index.d.ts.map +0 -1
- package/dist/adapters/index.js.map +0 -1
- package/dist/cjs/adapters/MemoryAdapter.d.ts.map +0 -1
- package/dist/cjs/adapters/MemoryAdapter.js.map +0 -1
- package/dist/cjs/adapters/MongoAdapter.d.ts.map +0 -1
- package/dist/cjs/adapters/MongoAdapter.js.map +0 -1
- package/dist/cjs/adapters/OpenSearchAdapter.d.ts.map +0 -1
- package/dist/cjs/adapters/OpenSearchAdapter.js.map +0 -1
- package/dist/cjs/adapters/PostgreSQLAdapter.d.ts.map +0 -1
- package/dist/cjs/adapters/PostgreSQLAdapter.js.map +0 -1
- package/dist/cjs/adapters/PrismaAdapter.d.ts.map +0 -1
- package/dist/cjs/adapters/PrismaAdapter.js.map +0 -1
- package/dist/cjs/adapters/RedisAdapter.d.ts.map +0 -1
- package/dist/cjs/adapters/RedisAdapter.js.map +0 -1
- package/dist/cjs/adapters/SQLiteAdapter.d.ts.map +0 -1
- package/dist/cjs/adapters/SQLiteAdapter.js.map +0 -1
- package/dist/cjs/adapters/index.js.map +0 -1
- package/dist/cjs/constants/index.js.map +0 -1
- package/dist/cjs/core/Agent.d.ts +0 -197
- package/dist/cjs/core/Agent.d.ts.map +0 -1
- package/dist/cjs/core/Agent.js +0 -966
- package/dist/cjs/core/Agent.js.map +0 -1
- package/dist/cjs/core/DomainRegistry.d.ts +0 -36
- package/dist/cjs/core/DomainRegistry.d.ts.map +0 -1
- package/dist/cjs/core/DomainRegistry.js +0 -72
- package/dist/cjs/core/DomainRegistry.js.map +0 -1
- package/dist/cjs/core/Events.d.ts +0 -41
- package/dist/cjs/core/Events.d.ts.map +0 -1
- package/dist/cjs/core/Events.js +0 -99
- package/dist/cjs/core/Events.js.map +0 -1
- package/dist/cjs/core/PersistenceManager.d.ts.map +0 -1
- package/dist/cjs/core/PersistenceManager.js.map +0 -1
- package/dist/cjs/core/PromptComposer.d.ts +0 -24
- package/dist/cjs/core/PromptComposer.d.ts.map +0 -1
- package/dist/cjs/core/PromptComposer.js +0 -127
- package/dist/cjs/core/PromptComposer.js.map +0 -1
- package/dist/cjs/core/ResponseEngine.d.ts +0 -14
- package/dist/cjs/core/ResponseEngine.d.ts.map +0 -1
- package/dist/cjs/core/ResponseEngine.js +0 -56
- package/dist/cjs/core/ResponseEngine.js.map +0 -1
- package/dist/cjs/core/Route.d.ts +0 -90
- package/dist/cjs/core/Route.d.ts.map +0 -1
- package/dist/cjs/core/Route.js +0 -203
- package/dist/cjs/core/Route.js.map +0 -1
- package/dist/cjs/core/RoutingEngine.d.ts +0 -109
- package/dist/cjs/core/RoutingEngine.d.ts.map +0 -1
- package/dist/cjs/core/RoutingEngine.js.map +0 -1
- package/dist/cjs/core/Step.d.ts +0 -72
- package/dist/cjs/core/Step.d.ts.map +0 -1
- package/dist/cjs/core/Step.js +0 -150
- package/dist/cjs/core/Step.js.map +0 -1
- package/dist/cjs/core/Tool.d.ts +0 -39
- package/dist/cjs/core/Tool.d.ts.map +0 -1
- package/dist/cjs/core/Tool.js +0 -34
- package/dist/cjs/core/Tool.js.map +0 -1
- package/dist/cjs/core/ToolExecutor.d.ts +0 -29
- package/dist/cjs/core/ToolExecutor.d.ts.map +0 -1
- package/dist/cjs/core/ToolExecutor.js.map +0 -1
- package/dist/cjs/core/Transition.d.ts +0 -32
- package/dist/cjs/core/Transition.d.ts.map +0 -1
- package/dist/cjs/core/Transition.js +0 -89
- package/dist/cjs/core/Transition.js.map +0 -1
- package/dist/cjs/index.d.ts.map +0 -1
- package/dist/cjs/index.js.map +0 -1
- package/dist/cjs/providers/AnthropicProvider.d.ts.map +0 -1
- package/dist/cjs/providers/AnthropicProvider.js.map +0 -1
- package/dist/cjs/providers/GeminiProvider.js.map +0 -1
- package/dist/cjs/providers/OpenAIProvider.js.map +0 -1
- package/dist/cjs/providers/OpenRouterProvider.js.map +0 -1
- package/dist/cjs/providers/index.js.map +0 -1
- package/dist/cjs/types/agent.d.ts.map +0 -1
- package/dist/cjs/types/agent.js.map +0 -1
- package/dist/cjs/types/ai.d.ts.map +0 -1
- package/dist/cjs/types/history.d.ts.map +0 -1
- package/dist/cjs/types/history.js +0 -37
- package/dist/cjs/types/history.js.map +0 -1
- package/dist/cjs/types/index.d.ts +0 -12
- package/dist/cjs/types/index.d.ts.map +0 -1
- package/dist/cjs/types/index.js +0 -12
- package/dist/cjs/types/index.js.map +0 -1
- package/dist/cjs/types/persistence.d.ts.map +0 -1
- package/dist/cjs/types/persistence.js.map +0 -1
- package/dist/cjs/types/route.d.ts +0 -175
- package/dist/cjs/types/route.d.ts.map +0 -1
- package/dist/cjs/types/session.d.ts +0 -104
- package/dist/cjs/types/session.d.ts.map +0 -1
- package/dist/cjs/types/session.js.map +0 -1
- package/dist/cjs/types/tool.d.ts.map +0 -1
- package/dist/cjs/utils/event.js.map +0 -1
- package/dist/cjs/utils/id.js.map +0 -1
- package/dist/cjs/utils/logger.js.map +0 -1
- package/dist/cjs/utils/retry.js.map +0 -1
- package/dist/constants/index.d.ts.map +0 -1
- package/dist/constants/index.js.map +0 -1
- package/dist/core/Agent.d.ts +0 -197
- package/dist/core/Agent.d.ts.map +0 -1
- package/dist/core/Agent.js +0 -962
- package/dist/core/Agent.js.map +0 -1
- package/dist/core/DomainRegistry.d.ts +0 -36
- package/dist/core/DomainRegistry.d.ts.map +0 -1
- package/dist/core/DomainRegistry.js +0 -68
- package/dist/core/DomainRegistry.js.map +0 -1
- package/dist/core/Events.d.ts +0 -41
- package/dist/core/Events.d.ts.map +0 -1
- package/dist/core/Events.js +0 -94
- package/dist/core/Events.js.map +0 -1
- package/dist/core/PersistenceManager.d.ts.map +0 -1
- package/dist/core/PersistenceManager.js.map +0 -1
- package/dist/core/PromptComposer.d.ts +0 -24
- package/dist/core/PromptComposer.d.ts.map +0 -1
- package/dist/core/PromptComposer.js +0 -123
- package/dist/core/PromptComposer.js.map +0 -1
- package/dist/core/ResponseEngine.d.ts +0 -14
- package/dist/core/ResponseEngine.d.ts.map +0 -1
- package/dist/core/ResponseEngine.js +0 -52
- package/dist/core/ResponseEngine.js.map +0 -1
- package/dist/core/Route.d.ts +0 -90
- package/dist/core/Route.d.ts.map +0 -1
- package/dist/core/Route.js +0 -199
- package/dist/core/Route.js.map +0 -1
- package/dist/core/RoutingEngine.d.ts +0 -109
- package/dist/core/RoutingEngine.d.ts.map +0 -1
- package/dist/core/RoutingEngine.js.map +0 -1
- package/dist/core/Step.d.ts +0 -72
- package/dist/core/Step.d.ts.map +0 -1
- package/dist/core/Step.js +0 -146
- package/dist/core/Step.js.map +0 -1
- package/dist/core/Tool.d.ts +0 -39
- package/dist/core/Tool.d.ts.map +0 -1
- package/dist/core/Tool.js +0 -31
- package/dist/core/Tool.js.map +0 -1
- package/dist/core/ToolExecutor.d.ts +0 -29
- package/dist/core/ToolExecutor.d.ts.map +0 -1
- package/dist/core/ToolExecutor.js +0 -69
- package/dist/core/ToolExecutor.js.map +0 -1
- package/dist/core/Transition.d.ts +0 -32
- package/dist/core/Transition.d.ts.map +0 -1
- package/dist/core/Transition.js +0 -85
- package/dist/core/Transition.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/providers/AnthropicProvider.d.ts.map +0 -1
- package/dist/providers/AnthropicProvider.js.map +0 -1
- package/dist/providers/GeminiProvider.d.ts.map +0 -1
- package/dist/providers/GeminiProvider.js.map +0 -1
- package/dist/providers/OpenAIProvider.d.ts.map +0 -1
- package/dist/providers/OpenAIProvider.js.map +0 -1
- package/dist/providers/OpenRouterProvider.d.ts.map +0 -1
- package/dist/providers/OpenRouterProvider.js.map +0 -1
- package/dist/providers/index.d.ts.map +0 -1
- package/dist/providers/index.js.map +0 -1
- package/dist/types/agent.d.ts.map +0 -1
- package/dist/types/agent.js.map +0 -1
- package/dist/types/ai.d.ts.map +0 -1
- package/dist/types/ai.js.map +0 -1
- package/dist/types/history.d.ts.map +0 -1
- package/dist/types/history.js +0 -34
- package/dist/types/history.js.map +0 -1
- package/dist/types/index.d.ts +0 -12
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -6
- package/dist/types/index.js.map +0 -1
- package/dist/types/persistence.d.ts.map +0 -1
- package/dist/types/persistence.js.map +0 -1
- package/dist/types/route.d.ts +0 -175
- package/dist/types/route.d.ts.map +0 -1
- package/dist/types/routing.d.ts.map +0 -1
- package/dist/types/schema.d.ts.map +0 -1
- package/dist/types/session.d.ts +0 -104
- package/dist/types/session.d.ts.map +0 -1
- package/dist/types/session.js.map +0 -1
- package/dist/types/tool.d.ts.map +0 -1
- package/dist/utils/event.d.ts.map +0 -1
- package/dist/utils/event.js.map +0 -1
- package/dist/utils/id.d.ts.map +0 -1
- package/dist/utils/id.js.map +0 -1
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/logger.js.map +0 -1
- package/dist/utils/retry.d.ts.map +0 -1
- package/dist/utils/retry.js.map +0 -1
- package/docs/AGENT.md +0 -535
- package/docs/DOCS.md +0 -263
- package/docs/DOMAINS.md +0 -735
- package/docs/EXAMPLES.md +0 -467
- package/docs/GETTING_STARTED.md +0 -424
- package/docs/PERSISTENCE.md +0 -815
- package/docs/PROVIDERS.md +0 -612
- package/docs/ROUTES.md +0 -1085
- package/docs/STEPS.md +0 -883
- package/examples/business-onboarding.ts +0 -791
- package/examples/custom-database-persistence.ts +0 -574
- package/examples/declarative-agent.ts +0 -401
- package/examples/domain-scoping.ts +0 -366
- package/examples/healthcare-agent.ts +0 -511
- package/examples/redis-persistence.ts +0 -525
- package/examples/route-transitions.ts +0 -266
- package/examples/travel-agent.ts +0 -584
- package/src/core/DomainRegistry.ts +0 -80
- package/src/core/Tool.ts +0 -112
- package/src/core/Transition.ts +0 -115
- /package/dist/{adapters → cjs/src/adapters}/index.d.ts +0 -0
- /package/dist/cjs/{adapters → src/adapters}/index.js +0 -0
- /package/dist/cjs/{constants → src/constants}/index.d.ts +0 -0
- /package/dist/cjs/{constants → src/constants}/index.js +0 -0
- /package/dist/cjs/{providers → src/providers}/index.d.ts +0 -0
- /package/dist/cjs/{providers → src/providers}/index.js +0 -0
- /package/dist/cjs/{types → src/types}/agent.js +0 -0
- /package/dist/cjs/{types → src/types}/ai.js +0 -0
- /package/dist/cjs/{types → src/types}/persistence.js +0 -0
- /package/dist/cjs/{types → src/types}/route.js +0 -0
- /package/dist/cjs/{types → src/types}/routing.d.ts +0 -0
- /package/dist/cjs/{types → src/types}/routing.js +0 -0
- /package/dist/cjs/{types → src/types}/schema.d.ts +0 -0
- /package/dist/cjs/{types → src/types}/schema.js +0 -0
- /package/dist/cjs/{types → src/types}/tool.js +0 -0
- /package/dist/cjs/{utils → src/utils}/id.d.ts +0 -0
- /package/dist/cjs/{utils → src/utils}/id.js +0 -0
- /package/dist/cjs/{utils → src/utils}/logger.d.ts +0 -0
- /package/dist/cjs/{utils → src/utils}/logger.js +0 -0
- /package/dist/cjs/{utils → src/utils}/retry.d.ts +0 -0
- /package/dist/cjs/{utils → src/utils}/retry.js +0 -0
- /package/dist/{cjs → src}/adapters/index.d.ts +0 -0
- /package/dist/{cjs → src}/adapters/index.d.ts.map +0 -0
- /package/dist/{adapters → src/adapters}/index.js +0 -0
- /package/dist/{constants → src/constants}/index.d.ts +0 -0
- /package/dist/{cjs → src}/constants/index.d.ts.map +0 -0
- /package/dist/{constants → src/constants}/index.js +0 -0
- /package/dist/{providers → src/providers}/index.d.ts +0 -0
- /package/dist/{cjs → src}/providers/index.d.ts.map +0 -0
- /package/dist/{providers → src/providers}/index.js +0 -0
- /package/dist/{types → src/types}/agent.js +0 -0
- /package/dist/{types → src/types}/ai.js +0 -0
- /package/dist/{types → src/types}/persistence.js +0 -0
- /package/dist/{types → src/types}/route.js +0 -0
- /package/dist/{types → src/types}/routing.d.ts +0 -0
- /package/dist/{cjs → src}/types/routing.d.ts.map +0 -0
- /package/dist/{types → src/types}/routing.js +0 -0
- /package/dist/{cjs → src}/types/routing.js.map +0 -0
- /package/dist/{types → src/types}/schema.d.ts +0 -0
- /package/dist/{cjs → src}/types/schema.d.ts.map +0 -0
- /package/dist/{types → src/types}/schema.js +0 -0
- /package/dist/{cjs → src}/types/schema.js.map +0 -0
- /package/dist/{types → src/types}/tool.js +0 -0
- /package/dist/{utils → src/utils}/id.d.ts +0 -0
- /package/dist/{cjs → src}/utils/id.d.ts.map +0 -0
- /package/dist/{utils → src/utils}/id.js +0 -0
- /package/dist/{utils → src/utils}/logger.d.ts +0 -0
- /package/dist/{cjs → src}/utils/logger.d.ts.map +0 -0
- /package/dist/{utils → src/utils}/logger.js +0 -0
- /package/dist/{utils → src/utils}/retry.d.ts +0 -0
- /package/dist/{cjs → src}/utils/retry.d.ts.map +0 -0
- /package/dist/{utils → src/utils}/retry.js +0 -0
- /package/docs/{PUBLISHING.md → guides/advanced-patterns/publishing.md} +0 -0
|
@@ -0,0 +1,787 @@
|
|
|
1
|
+
# Agent Architecture
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
The `Agent<TContext, TData>` class is the central orchestrator of @falai/agent, providing a strongly-typed, context-aware AI agent framework with intelligent routing and agent-level schema-driven data collection.
|
|
6
|
+
|
|
7
|
+
## Core Responsibilities
|
|
8
|
+
|
|
9
|
+
- **AI Provider Management**: Unified interface to multiple AI providers (OpenAI, Gemini, Anthropic, etc.)
|
|
10
|
+
- **Intelligent Routing**: AI-powered route and step selection based on conversation context
|
|
11
|
+
- **Context Lifecycle**: Dynamic context management with provider functions and lifecycle hooks
|
|
12
|
+
- **Session Management**: Conversation state persistence and multi-turn dialogue support
|
|
13
|
+
- **Tool Orchestration**: Hierarchical tool execution (agent → route → step level)
|
|
14
|
+
- **Agent-Level Data Collection**: Centralized schema-driven information extraction shared across all routes
|
|
15
|
+
|
|
16
|
+
## Agent Configuration
|
|
17
|
+
|
|
18
|
+
### Basic Agent Setup
|
|
19
|
+
|
|
20
|
+
```typescript
|
|
21
|
+
import { Agent, OpenAIProvider } from "@falai/agent";
|
|
22
|
+
|
|
23
|
+
const agent = new Agent({
|
|
24
|
+
name: "Customer Support Bot",
|
|
25
|
+
description: "AI assistant for customer inquiries",
|
|
26
|
+
provider: new OpenAIProvider({
|
|
27
|
+
apiKey: process.env.OPENAI_API_KEY,
|
|
28
|
+
model: "gpt-4",
|
|
29
|
+
}),
|
|
30
|
+
});
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### Advanced Configuration
|
|
34
|
+
|
|
35
|
+
```typescript
|
|
36
|
+
interface CustomerContext {
|
|
37
|
+
userId: string;
|
|
38
|
+
accountTier: "free" | "premium" | "enterprise";
|
|
39
|
+
lastLogin: Date;
|
|
40
|
+
preferences: {
|
|
41
|
+
language: string;
|
|
42
|
+
notifications: boolean;
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
interface CustomerData {
|
|
47
|
+
customerName?: string;
|
|
48
|
+
email?: string;
|
|
49
|
+
phone?: string;
|
|
50
|
+
issueType?: 'booking' | 'billing' | 'technical' | 'other';
|
|
51
|
+
issueDescription?: string;
|
|
52
|
+
priority?: 'low' | 'medium' | 'high';
|
|
53
|
+
rating?: number;
|
|
54
|
+
comments?: string;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const agent = new Agent<CustomerContext, CustomerData>({
|
|
58
|
+
// Identity
|
|
59
|
+
name: "Premium Support Assistant",
|
|
60
|
+
description: "24/7 AI support for premium customers",
|
|
61
|
+
goal: "Resolve customer issues efficiently while maintaining satisfaction",
|
|
62
|
+
|
|
63
|
+
// AI Provider with backup models
|
|
64
|
+
provider: new OpenAIProvider({
|
|
65
|
+
apiKey: process.env.OPENAI_API_KEY,
|
|
66
|
+
model: "gpt-5",
|
|
67
|
+
backupModels: ["gpt-4"],
|
|
68
|
+
}),
|
|
69
|
+
|
|
70
|
+
// Agent-level data schema (NEW)
|
|
71
|
+
schema: {
|
|
72
|
+
type: "object",
|
|
73
|
+
properties: {
|
|
74
|
+
customerName: { type: "string" },
|
|
75
|
+
email: { type: "string", format: "email" },
|
|
76
|
+
phone: { type: "string" },
|
|
77
|
+
issueType: { type: "string", enum: ["booking", "billing", "technical", "other"] },
|
|
78
|
+
issueDescription: { type: "string" },
|
|
79
|
+
priority: { type: "string", enum: ["low", "medium", "high"] },
|
|
80
|
+
rating: { type: "number", minimum: 1, maximum: 5 },
|
|
81
|
+
comments: { type: "string" }
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
|
|
85
|
+
// Static context (can be overridden by contextProvider)
|
|
86
|
+
context: {
|
|
87
|
+
userId: "anonymous",
|
|
88
|
+
accountTier: "free",
|
|
89
|
+
lastLogin: new Date(),
|
|
90
|
+
preferences: {
|
|
91
|
+
language: "en",
|
|
92
|
+
notifications: true,
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
|
|
96
|
+
// Dynamic context provider (takes precedence over static context)
|
|
97
|
+
contextProvider: async () => {
|
|
98
|
+
const user = await authenticateUser(request);
|
|
99
|
+
return {
|
|
100
|
+
userId: user.id,
|
|
101
|
+
accountTier: user.tier,
|
|
102
|
+
lastLogin: user.lastLogin,
|
|
103
|
+
preferences: user.preferences,
|
|
104
|
+
};
|
|
105
|
+
},
|
|
106
|
+
|
|
107
|
+
// Lifecycle hooks for context and data management
|
|
108
|
+
hooks: {
|
|
109
|
+
// Refresh context before each response
|
|
110
|
+
beforeRespond: async (currentContext) => {
|
|
111
|
+
const freshUser = await db.getUser(currentContext.userId);
|
|
112
|
+
return {
|
|
113
|
+
...currentContext,
|
|
114
|
+
accountTier: freshUser.tier,
|
|
115
|
+
lastLogin: freshUser.lastLogin,
|
|
116
|
+
};
|
|
117
|
+
},
|
|
118
|
+
|
|
119
|
+
// Handle context updates from tools or responses
|
|
120
|
+
onContextUpdate: async (newContext, previousContext) => {
|
|
121
|
+
if (newContext.accountTier !== previousContext.accountTier) {
|
|
122
|
+
await auditLog.log({
|
|
123
|
+
type: "tier_change",
|
|
124
|
+
userId: newContext.userId,
|
|
125
|
+
from: previousContext.accountTier,
|
|
126
|
+
to: newContext.accountTier,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
},
|
|
130
|
+
|
|
131
|
+
// Validate and enrich collected data (NEW: Agent-level data hooks)
|
|
132
|
+
onDataUpdate: async (data, previousData) => {
|
|
133
|
+
// Data validation against agent schema
|
|
134
|
+
if (data.email && !isValidEmail(data.email)) {
|
|
135
|
+
throw new Error("Invalid email format");
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// Data enrichment using agent-level data
|
|
139
|
+
if (data.customerName && !data.customerId) {
|
|
140
|
+
data.customerId = await lookupCustomerId(data.customerName);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// Auto-set priority based on issue type
|
|
144
|
+
if (data.issueType === 'billing' && !data.priority) {
|
|
145
|
+
data.priority = 'high';
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
return data;
|
|
149
|
+
},
|
|
150
|
+
},
|
|
151
|
+
|
|
152
|
+
// Optional sessionId for automatic session loading/creation
|
|
153
|
+
sessionId: "user-123", // Agent will automatically load or create this session
|
|
154
|
+
|
|
155
|
+
// Optional persistence configuration
|
|
156
|
+
persistence: {
|
|
157
|
+
adapter: new RedisAdapter(redisClient),
|
|
158
|
+
autoSave: true, // Auto-save after each response
|
|
159
|
+
userId: "global", // Or dynamic based on context
|
|
160
|
+
},
|
|
161
|
+
|
|
162
|
+
// Domain knowledge
|
|
163
|
+
terms: [
|
|
164
|
+
{
|
|
165
|
+
name: "Premium Support",
|
|
166
|
+
description: "24/7 priority assistance with 1-hour response guarantee",
|
|
167
|
+
synonyms: ["priority support", "vip assistance"],
|
|
168
|
+
},
|
|
169
|
+
],
|
|
170
|
+
|
|
171
|
+
// Behavioral guidelines
|
|
172
|
+
guidelines: [
|
|
173
|
+
{
|
|
174
|
+
condition: "Customer seems frustrated",
|
|
175
|
+
action: "Apologize sincerely and offer to escalate to human agent",
|
|
176
|
+
enabled: true,
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
condition: "Premium customer requests",
|
|
180
|
+
action: "Provide expedited service and additional options",
|
|
181
|
+
enabled: true,
|
|
182
|
+
},
|
|
183
|
+
],
|
|
184
|
+
|
|
185
|
+
// Global tools available to all routes
|
|
186
|
+
tools: [searchTool, userLookupTool],
|
|
187
|
+
|
|
188
|
+
// Knowledge base for AI context
|
|
189
|
+
knowledgeBase: {
|
|
190
|
+
company: {
|
|
191
|
+
name: "Acme Corp",
|
|
192
|
+
supportHours: "24/7 for premium, 9-5 for free",
|
|
193
|
+
refundPolicy: "30 days for all purchases",
|
|
194
|
+
},
|
|
195
|
+
products: {
|
|
196
|
+
basic: {
|
|
197
|
+
price: "$9.99/month",
|
|
198
|
+
features: ["Email support", "5GB storage"],
|
|
199
|
+
},
|
|
200
|
+
premium: {
|
|
201
|
+
price: "$29.99/month",
|
|
202
|
+
features: ["24/7 support", "100GB storage", "Priority queue"],
|
|
203
|
+
},
|
|
204
|
+
},
|
|
205
|
+
},
|
|
206
|
+
});
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
## Context Management
|
|
210
|
+
|
|
211
|
+
### Static Context
|
|
212
|
+
|
|
213
|
+
Fixed context available throughout the conversation:
|
|
214
|
+
|
|
215
|
+
```typescript
|
|
216
|
+
const agent = new Agent({
|
|
217
|
+
context: {
|
|
218
|
+
companyName: "Acme Corp",
|
|
219
|
+
supportEmail: "support@acme.com",
|
|
220
|
+
currentDate: new Date().toISOString(),
|
|
221
|
+
},
|
|
222
|
+
});
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
### Dynamic Context Provider
|
|
226
|
+
|
|
227
|
+
Fresh context fetched before each response:
|
|
228
|
+
|
|
229
|
+
```typescript
|
|
230
|
+
const agent = new Agent({
|
|
231
|
+
contextProvider: async () => {
|
|
232
|
+
// Fetch real-time data
|
|
233
|
+
const weather = await weatherAPI.getCurrentWeather();
|
|
234
|
+
const user = await auth.getCurrentUser();
|
|
235
|
+
|
|
236
|
+
return {
|
|
237
|
+
currentWeather: weather,
|
|
238
|
+
userProfile: user,
|
|
239
|
+
serverTime: new Date(),
|
|
240
|
+
};
|
|
241
|
+
},
|
|
242
|
+
});
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
### Context Updates
|
|
246
|
+
|
|
247
|
+
Context can be modified during conversation:
|
|
248
|
+
|
|
249
|
+
```typescript
|
|
250
|
+
// From tool execution
|
|
251
|
+
const updateLocationTool: Tool<
|
|
252
|
+
{ currentLocation?: string; lastLocationUpdate?: Date },
|
|
253
|
+
[],
|
|
254
|
+
string,
|
|
255
|
+
{ location: string }
|
|
256
|
+
> = {
|
|
257
|
+
id: "update_location",
|
|
258
|
+
description: "Update user's current location",
|
|
259
|
+
parameters: {
|
|
260
|
+
type: "object",
|
|
261
|
+
properties: {
|
|
262
|
+
location: { type: "string", description: "New location to set" },
|
|
263
|
+
},
|
|
264
|
+
required: ["location"],
|
|
265
|
+
},
|
|
266
|
+
handler: async ({ context }, { location }) => {
|
|
267
|
+
return {
|
|
268
|
+
data: `Location updated to ${location}`,
|
|
269
|
+
contextUpdate: {
|
|
270
|
+
currentLocation: location,
|
|
271
|
+
lastLocationUpdate: new Date(),
|
|
272
|
+
},
|
|
273
|
+
};
|
|
274
|
+
},
|
|
275
|
+
};
|
|
276
|
+
|
|
277
|
+
// Programmatically
|
|
278
|
+
await agent.updateContext({
|
|
279
|
+
userStatus: "premium",
|
|
280
|
+
lastActivity: new Date(),
|
|
281
|
+
});
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
## Session Management
|
|
285
|
+
|
|
286
|
+
### Automatic Session Management
|
|
287
|
+
|
|
288
|
+
Sessions are automatically managed through the integrated `SessionManager`:
|
|
289
|
+
|
|
290
|
+
```typescript
|
|
291
|
+
// Agent with automatic session management
|
|
292
|
+
const agent = new Agent({
|
|
293
|
+
name: "Assistant",
|
|
294
|
+
provider: new OpenAIProvider({ apiKey: process.env.OPENAI_API_KEY }),
|
|
295
|
+
persistence: { adapter: new PrismaAdapter({ prisma }) },
|
|
296
|
+
sessionId: "user-123" // Automatically loads or creates this session
|
|
297
|
+
});
|
|
298
|
+
|
|
299
|
+
// Access session manager
|
|
300
|
+
const sessionManager = agent.session;
|
|
301
|
+
|
|
302
|
+
// Get or create session (handles existing, new, or auto-generated IDs)
|
|
303
|
+
await sessionManager.getOrCreate("user-456");
|
|
304
|
+
await sessionManager.getOrCreate(); // Auto-generates ID
|
|
305
|
+
|
|
306
|
+
// Session data access
|
|
307
|
+
const data = sessionManager.getData<MyDataType>();
|
|
308
|
+
await sessionManager.setData({ field: "value" });
|
|
309
|
+
|
|
310
|
+
// History management
|
|
311
|
+
await sessionManager.addMessage("user", "Hello");
|
|
312
|
+
const history = sessionManager.getHistory();
|
|
313
|
+
sessionManager.clearHistory();
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
### Session Persistence
|
|
317
|
+
|
|
318
|
+
Sessions are automatically persisted when using persistence adapters:
|
|
319
|
+
|
|
320
|
+
```typescript
|
|
321
|
+
const agent = new Agent({
|
|
322
|
+
persistence: {
|
|
323
|
+
adapter: new RedisAdapter(redisClient),
|
|
324
|
+
autoSave: true, // Auto-save after each response (default)
|
|
325
|
+
},
|
|
326
|
+
sessionId: "user-123" // Automatically loads from persistence
|
|
327
|
+
});
|
|
328
|
+
|
|
329
|
+
// Sessions are automatically saved after each message
|
|
330
|
+
const response = await agent.respond("Hello");
|
|
331
|
+
// Session state automatically persisted
|
|
332
|
+
|
|
333
|
+
// Manual session operations (if needed)
|
|
334
|
+
await agent.session.save(); // Manual save
|
|
335
|
+
await agent.session.delete(); // Delete session
|
|
336
|
+
const newSession = await agent.session.reset(true); // Reset with history preserved
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
### Session Access Methods
|
|
340
|
+
|
|
341
|
+
```typescript
|
|
342
|
+
// Access current session data
|
|
343
|
+
const data = agent.session.getData<MyDataType>();
|
|
344
|
+
await agent.session.setData({ field: "value" });
|
|
345
|
+
|
|
346
|
+
// Session information
|
|
347
|
+
console.log(agent.session.id); // Current session ID
|
|
348
|
+
console.log(agent.session.current); // Full session state
|
|
349
|
+
|
|
350
|
+
// History management
|
|
351
|
+
const history = agent.session.getHistory();
|
|
352
|
+
await agent.session.addMessage("user", "New message");
|
|
353
|
+
agent.session.clearHistory();
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
## Route Management
|
|
357
|
+
|
|
358
|
+
### Declarative Route Creation
|
|
359
|
+
|
|
360
|
+
```typescript
|
|
361
|
+
const agent = new Agent<CustomerContext, CustomerData>({
|
|
362
|
+
// Agent-level schema defines all possible data fields
|
|
363
|
+
schema: { /* comprehensive schema */ },
|
|
364
|
+
|
|
365
|
+
routes: [
|
|
366
|
+
{
|
|
367
|
+
title: "Technical Support",
|
|
368
|
+
description: "Help with technical issues",
|
|
369
|
+
conditions: ["user reports technical problem"],
|
|
370
|
+
// NEW: Routes specify required fields instead of schemas
|
|
371
|
+
requiredFields: ["customerName", "email", "issueType", "issueDescription"],
|
|
372
|
+
optionalFields: ["phone", "priority"],
|
|
373
|
+
initialStep: {
|
|
374
|
+
prompt:
|
|
375
|
+
"I understand you're having a technical issue. Can you describe what's happening?",
|
|
376
|
+
collect: ["issueType", "issueDescription"], // Collects into agent-level data
|
|
377
|
+
},
|
|
378
|
+
},
|
|
379
|
+
{
|
|
380
|
+
title: "Billing Inquiry",
|
|
381
|
+
description: "Handle billing and payment questions",
|
|
382
|
+
conditions: ["user asks about billing or payment"],
|
|
383
|
+
requiredFields: ["customerName", "email", "issueType"],
|
|
384
|
+
initialStep: {
|
|
385
|
+
prompt:
|
|
386
|
+
"I'd be happy to help with your billing question. What can I assist with?",
|
|
387
|
+
collect: ["issueType"], // Maps to agent schema field
|
|
388
|
+
},
|
|
389
|
+
},
|
|
390
|
+
],
|
|
391
|
+
});
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
### Programmatic Route Creation
|
|
395
|
+
|
|
396
|
+
```typescript
|
|
397
|
+
// Create routes dynamically with required fields
|
|
398
|
+
const supportRoute = agent
|
|
399
|
+
.createRoute({
|
|
400
|
+
title: "Customer Support",
|
|
401
|
+
requiredFields: ["customerName", "email", "issueType"], // NEW: Required fields
|
|
402
|
+
optionalFields: ["phone"], // NEW: Optional fields
|
|
403
|
+
initialStep: {
|
|
404
|
+
prompt: "How can I help you today?",
|
|
405
|
+
collect: ["customerName", "email"], // Collects into agent-level data
|
|
406
|
+
},
|
|
407
|
+
})
|
|
408
|
+
.nextStep({
|
|
409
|
+
prompt: "I understand you need help, {{customerName}}. What type of issue are you experiencing?",
|
|
410
|
+
collect: ["issueType"],
|
|
411
|
+
requires: ["customerName", "email"], // Prerequisites from agent data
|
|
412
|
+
});
|
|
413
|
+
|
|
414
|
+
// Access created routes
|
|
415
|
+
const routes = agent.getRoutes();
|
|
416
|
+
console.log(routes.map((r) => r.title)); // ["Customer Support", ...]
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
## Tool Integration
|
|
420
|
+
|
|
421
|
+
### Agent-Level Tools
|
|
422
|
+
|
|
423
|
+
Available to all routes and steps:
|
|
424
|
+
|
|
425
|
+
```typescript
|
|
426
|
+
const agent = new Agent({
|
|
427
|
+
tools: [searchTool, calculatorTool, translationTool],
|
|
428
|
+
});
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
### Route-Level Tools
|
|
432
|
+
|
|
433
|
+
Specific to a route:
|
|
434
|
+
|
|
435
|
+
```typescript
|
|
436
|
+
const route = agent.createRoute({
|
|
437
|
+
title: "Order Management",
|
|
438
|
+
tools: [orderLookupTool, orderUpdateTool, refundTool],
|
|
439
|
+
});
|
|
440
|
+
```
|
|
441
|
+
|
|
442
|
+
### Tool Resolution Priority
|
|
443
|
+
|
|
444
|
+
1. **Step-level tools** (highest priority)
|
|
445
|
+
2. **Route-level tools**
|
|
446
|
+
3. **Agent-level tools** (lowest priority)
|
|
447
|
+
|
|
448
|
+
## Agent-Level Data Collection
|
|
449
|
+
|
|
450
|
+
### Centralized Data Schema
|
|
451
|
+
|
|
452
|
+
The new architecture centralizes data collection at the agent level, allowing all routes to work with the same data structure:
|
|
453
|
+
|
|
454
|
+
```typescript
|
|
455
|
+
interface ComprehensiveData {
|
|
456
|
+
// Customer identification
|
|
457
|
+
customerId?: string;
|
|
458
|
+
customerName?: string;
|
|
459
|
+
email?: string;
|
|
460
|
+
phone?: string;
|
|
461
|
+
|
|
462
|
+
// Issue tracking
|
|
463
|
+
issueType?: 'booking' | 'billing' | 'technical' | 'other';
|
|
464
|
+
issueDescription?: string;
|
|
465
|
+
priority?: 'low' | 'medium' | 'high';
|
|
466
|
+
|
|
467
|
+
// Feedback
|
|
468
|
+
rating?: number;
|
|
469
|
+
comments?: string;
|
|
470
|
+
recommendToFriend?: boolean;
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
const agent = new Agent<Context, ComprehensiveData>({
|
|
474
|
+
name: "Customer Service Agent",
|
|
475
|
+
schema: {
|
|
476
|
+
type: "object",
|
|
477
|
+
properties: {
|
|
478
|
+
customerId: { type: "string" },
|
|
479
|
+
customerName: { type: "string" },
|
|
480
|
+
email: { type: "string", format: "email" },
|
|
481
|
+
phone: { type: "string" },
|
|
482
|
+
issueType: { type: "string", enum: ["booking", "billing", "technical", "other"] },
|
|
483
|
+
issueDescription: { type: "string" },
|
|
484
|
+
priority: { type: "string", enum: ["low", "medium", "high"] },
|
|
485
|
+
rating: { type: "number", minimum: 1, maximum: 5 },
|
|
486
|
+
comments: { type: "string" },
|
|
487
|
+
recommendToFriend: { type: "boolean" }
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
});
|
|
491
|
+
```
|
|
492
|
+
|
|
493
|
+
### Route Completion Based on Required Fields
|
|
494
|
+
|
|
495
|
+
Routes now specify which fields they need to complete, enabling cross-route data sharing:
|
|
496
|
+
|
|
497
|
+
```typescript
|
|
498
|
+
// Support route needs basic info + issue details
|
|
499
|
+
const supportRoute = agent.createRoute({
|
|
500
|
+
title: "Customer Support",
|
|
501
|
+
requiredFields: ["customerName", "email", "issueType", "issueDescription"],
|
|
502
|
+
optionalFields: ["phone", "priority"]
|
|
503
|
+
});
|
|
504
|
+
|
|
505
|
+
// Feedback route needs basic info + rating
|
|
506
|
+
const feedbackRoute = agent.createRoute({
|
|
507
|
+
title: "Feedback Collection",
|
|
508
|
+
requiredFields: ["customerName", "email", "rating"],
|
|
509
|
+
optionalFields: ["comments", "recommendToFriend"]
|
|
510
|
+
});
|
|
511
|
+
|
|
512
|
+
// Routes can complete when their required data is available,
|
|
513
|
+
// regardless of which route collected it
|
|
514
|
+
```
|
|
515
|
+
|
|
516
|
+
### Cross-Route Data Sharing
|
|
517
|
+
|
|
518
|
+
Data collected by any route is available to all other routes:
|
|
519
|
+
|
|
520
|
+
```typescript
|
|
521
|
+
// User starts with support, provides name and email
|
|
522
|
+
const response1 = await agent.respond("I need help, my name is John Doe, email john@example.com");
|
|
523
|
+
// Agent data now contains: { customerName: "John Doe", email: "john@example.com" }
|
|
524
|
+
|
|
525
|
+
// User switches to feedback - already has 2/3 required fields
|
|
526
|
+
const response2 = await agent.respond("Actually, I want to leave feedback. I'd rate you 5 stars.");
|
|
527
|
+
// Feedback route completes immediately with: { customerName: "John Doe", email: "john@example.com", rating: 5 }
|
|
528
|
+
```
|
|
529
|
+
|
|
530
|
+
### Agent Data Management Methods
|
|
531
|
+
|
|
532
|
+
Access and update agent-level data programmatically:
|
|
533
|
+
|
|
534
|
+
```typescript
|
|
535
|
+
// Get current collected data
|
|
536
|
+
const currentData = agent.getCollectedData();
|
|
537
|
+
console.log(currentData); // { customerName: "John", email: "john@example.com" }
|
|
538
|
+
|
|
539
|
+
// Update data programmatically
|
|
540
|
+
await agent.updateCollectedData({
|
|
541
|
+
customerId: "CUST-12345",
|
|
542
|
+
priority: "high"
|
|
543
|
+
});
|
|
544
|
+
|
|
545
|
+
// Validate data against schema
|
|
546
|
+
const validation = agent.validateData({ email: "invalid-email" });
|
|
547
|
+
if (!validation.valid) {
|
|
548
|
+
console.log(validation.errors); // Detailed validation errors
|
|
549
|
+
}
|
|
550
|
+
```
|
|
551
|
+
|
|
552
|
+
## Response Generation
|
|
553
|
+
|
|
554
|
+
### Simple Response API
|
|
555
|
+
|
|
556
|
+
```typescript
|
|
557
|
+
// Simple message-based API (recommended)
|
|
558
|
+
const response = await agent.respond("How do I reset my password?");
|
|
559
|
+
console.log(response.message);
|
|
560
|
+
console.log(agent.session.getData<CustomerData>()); // Agent-level collected data
|
|
561
|
+
console.log(response.toolCalls); // Any tool calls made
|
|
562
|
+
console.log(response.isRouteComplete); // Whether route finished
|
|
563
|
+
|
|
564
|
+
// Advanced usage with history override
|
|
565
|
+
const response = await agent.respond("Hello", {
|
|
566
|
+
history: [
|
|
567
|
+
{ role: "user", content: "Previous context" },
|
|
568
|
+
{ role: "assistant", content: "I understand" }
|
|
569
|
+
]
|
|
570
|
+
});
|
|
571
|
+
```
|
|
572
|
+
|
|
573
|
+
### Streaming Response
|
|
574
|
+
|
|
575
|
+
```typescript
|
|
576
|
+
const stream = agent.respondStream("Tell me about your services");
|
|
577
|
+
|
|
578
|
+
for await (const chunk of stream) {
|
|
579
|
+
if (chunk.delta) {
|
|
580
|
+
process.stdout.write(chunk.delta); // Real-time output
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
if (chunk.done) {
|
|
584
|
+
console.log("\nSession ID:", agent.session.id);
|
|
585
|
+
console.log("Tool calls:", chunk.toolCalls);
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
```
|
|
589
|
+
|
|
590
|
+
### Response with Custom Context
|
|
591
|
+
|
|
592
|
+
```typescript
|
|
593
|
+
const response = await agent.respond("Hola", {
|
|
594
|
+
contextOverride: {
|
|
595
|
+
language: "es", // Override context for this response
|
|
596
|
+
debug: true,
|
|
597
|
+
}
|
|
598
|
+
});
|
|
599
|
+
```
|
|
600
|
+
|
|
601
|
+
## Advanced Features
|
|
602
|
+
|
|
603
|
+
### Route Transitions
|
|
604
|
+
|
|
605
|
+
```typescript
|
|
606
|
+
// Manual route transition
|
|
607
|
+
await agent.nextStepRoute("premium-support", session);
|
|
608
|
+
|
|
609
|
+
// Route completion transitions
|
|
610
|
+
const supportRoute = agent.createRoute({
|
|
611
|
+
title: "Basic Support",
|
|
612
|
+
onComplete: "feedback-survey", // Auto-transition when complete
|
|
613
|
+
});
|
|
614
|
+
|
|
615
|
+
// Dynamic transitions
|
|
616
|
+
const dynamicRoute = agent.createRoute({
|
|
617
|
+
title: "Workflow",
|
|
618
|
+
onComplete: async (session, context) => {
|
|
619
|
+
if (session.data.success) {
|
|
620
|
+
return "success-route";
|
|
621
|
+
}
|
|
622
|
+
return "retry-route";
|
|
623
|
+
},
|
|
624
|
+
});
|
|
625
|
+
```
|
|
626
|
+
|
|
627
|
+
### Debugging
|
|
628
|
+
|
|
629
|
+
```typescript
|
|
630
|
+
const debugAgent = new Agent({
|
|
631
|
+
name: "Debug Agent",
|
|
632
|
+
debug: true, // Enables detailed logging
|
|
633
|
+
provider: openaiProvider,
|
|
634
|
+
});
|
|
635
|
+
|
|
636
|
+
// Logs will show:
|
|
637
|
+
// [Agent] Selected route: Technical Support
|
|
638
|
+
// [Agent] Entered step: initial_step
|
|
639
|
+
// [Agent] Tool executed: search_kb (success: true)
|
|
640
|
+
// [RoutingEngine] AI selected step: detailed_help
|
|
641
|
+
```
|
|
642
|
+
|
|
643
|
+
## Agent and Route Option Merging
|
|
644
|
+
|
|
645
|
+
@fai/agent supports hierarchical configuration where route-level options can override or merge with agent-level options. Understanding this behavior is crucial for effective agent design.
|
|
646
|
+
|
|
647
|
+
### Guidelines and Terms
|
|
648
|
+
|
|
649
|
+
**Guidelines** are combined from both agent and route levels:
|
|
650
|
+
|
|
651
|
+
- Agent-level guidelines are applied first
|
|
652
|
+
- Route-level guidelines are added after agent guidelines
|
|
653
|
+
- All guidelines are evaluated together during response generation
|
|
654
|
+
|
|
655
|
+
```typescript
|
|
656
|
+
const agent = new Agent({
|
|
657
|
+
guidelines: [
|
|
658
|
+
{ id: "polite", action: "Always be polite and professional" },
|
|
659
|
+
{ id: "accurate", action: "Provide accurate information" },
|
|
660
|
+
],
|
|
661
|
+
});
|
|
662
|
+
|
|
663
|
+
const route = agent.createRoute({
|
|
664
|
+
guidelines: [
|
|
665
|
+
{
|
|
666
|
+
id: "domain_specific",
|
|
667
|
+
action: "Use technical terminology appropriately",
|
|
668
|
+
},
|
|
669
|
+
],
|
|
670
|
+
});
|
|
671
|
+
// Result: All 3 guidelines (polite, accurate, domain_specific) are used
|
|
672
|
+
```
|
|
673
|
+
|
|
674
|
+
**Terms** use route-level precedence:
|
|
675
|
+
|
|
676
|
+
- Agent-level terms are loaded first
|
|
677
|
+
- Route-level terms with the same name override agent-level terms
|
|
678
|
+
- This allows routes to provide domain-specific definitions
|
|
679
|
+
|
|
680
|
+
```typescript
|
|
681
|
+
const agent = new Agent({
|
|
682
|
+
terms: [{ name: "API", description: "Application Programming Interface" }],
|
|
683
|
+
});
|
|
684
|
+
|
|
685
|
+
const route = agent.createRoute({
|
|
686
|
+
terms: [
|
|
687
|
+
{
|
|
688
|
+
name: "API",
|
|
689
|
+
description: "In this context, API refers to our REST API endpoints",
|
|
690
|
+
},
|
|
691
|
+
],
|
|
692
|
+
});
|
|
693
|
+
// Result: Route's definition of "API" takes precedence
|
|
694
|
+
```
|
|
695
|
+
|
|
696
|
+
### Tools
|
|
697
|
+
|
|
698
|
+
**Tools** follow a hierarchical priority system:
|
|
699
|
+
|
|
700
|
+
1. Step-level tools (highest priority)
|
|
701
|
+
2. Route-level tools
|
|
702
|
+
3. Agent-level tools (lowest priority)
|
|
703
|
+
|
|
704
|
+
Tools with the same ID at different levels will be resolved by priority, with higher-level tools taking precedence.
|
|
705
|
+
|
|
706
|
+
### Lifecycle Hooks
|
|
707
|
+
|
|
708
|
+
**Lifecycle hooks** are called at both agent and route levels:
|
|
709
|
+
|
|
710
|
+
- Agent-level hooks are called for all routes
|
|
711
|
+
- Route-level hooks are called only for that specific route
|
|
712
|
+
- Both types of hooks can modify context and data
|
|
713
|
+
|
|
714
|
+
## Best Practices
|
|
715
|
+
|
|
716
|
+
### Context Design
|
|
717
|
+
|
|
718
|
+
- **Keep context focused**: Only include data needed across conversations
|
|
719
|
+
- **Use providers for freshness**: Prefer `contextProvider` over static context for dynamic data
|
|
720
|
+
- **Handle updates gracefully**: Use lifecycle hooks for validation and side effects
|
|
721
|
+
|
|
722
|
+
### Session Management
|
|
723
|
+
|
|
724
|
+
- **Set up persistence early**: Configure persistence for production use
|
|
725
|
+
- **Use meaningful session IDs**: Include user/context identifiers
|
|
726
|
+
- **Clean up old sessions**: Implement retention policies
|
|
727
|
+
|
|
728
|
+
### Route Organization
|
|
729
|
+
|
|
730
|
+
- **Single responsibility**: Each route should serve one clear user intent
|
|
731
|
+
- **Progressive disclosure**: Collect information in logical order
|
|
732
|
+
- **Clear completion criteria**: Define when routes should end
|
|
733
|
+
|
|
734
|
+
### Tool Management
|
|
735
|
+
|
|
736
|
+
- **Hierarchical scoping**: Use appropriate tool levels for security and performance
|
|
737
|
+
- **Error handling**: Implement robust error recovery in tools
|
|
738
|
+
- **Performance monitoring**: Track tool usage and response times
|
|
739
|
+
|
|
740
|
+
### Performance Optimization
|
|
741
|
+
|
|
742
|
+
- **Limit concurrent sessions**: Implement session limits for high-traffic scenarios
|
|
743
|
+
- **Cache context data**: Avoid redundant API calls in context providers
|
|
744
|
+
- **Batch operations**: Group related tool calls when possible
|
|
745
|
+
|
|
746
|
+
## Migration from Legacy Agents
|
|
747
|
+
|
|
748
|
+
### From Domain-Based to Route-Based
|
|
749
|
+
|
|
750
|
+
```typescript
|
|
751
|
+
// Legacy (domain-based)
|
|
752
|
+
const legacyAgent = new Agent({
|
|
753
|
+
domains: ["calendar", "email"],
|
|
754
|
+
});
|
|
755
|
+
|
|
756
|
+
// New (route-based)
|
|
757
|
+
const newAgent = new Agent({
|
|
758
|
+
routes: [
|
|
759
|
+
{
|
|
760
|
+
title: "Calendar Management",
|
|
761
|
+
tools: [calendarTool], // Route-specific tools
|
|
762
|
+
},
|
|
763
|
+
{
|
|
764
|
+
title: "Email Management",
|
|
765
|
+
tools: [emailTool],
|
|
766
|
+
},
|
|
767
|
+
],
|
|
768
|
+
});
|
|
769
|
+
```
|
|
770
|
+
|
|
771
|
+
### From Static to Dynamic Context
|
|
772
|
+
|
|
773
|
+
```typescript
|
|
774
|
+
// Legacy (static context)
|
|
775
|
+
const staticAgent = new Agent({
|
|
776
|
+
context: { userId: "123" },
|
|
777
|
+
});
|
|
778
|
+
|
|
779
|
+
// New (dynamic context)
|
|
780
|
+
const dynamicAgent = new Agent({
|
|
781
|
+
contextProvider: async () => {
|
|
782
|
+
return { userId: await auth.getCurrentUserId() };
|
|
783
|
+
},
|
|
784
|
+
});
|
|
785
|
+
```
|
|
786
|
+
|
|
787
|
+
The Agent class provides a comprehensive foundation for building intelligent, context-aware AI applications with robust conversation management and data collection capabilities.
|