@falai/agent 0.8.0 → 0.9.0-alpha-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 +306 -133
- 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/{core → cjs/src/core}/Agent.d.ts +67 -69
- package/dist/cjs/src/core/Agent.d.ts.map +1 -0
- package/dist/cjs/src/core/Agent.js +1433 -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/cjs/src/core/PersistenceManager.d.ts +98 -0
- package/dist/cjs/src/core/PersistenceManager.d.ts.map +1 -0
- package/dist/cjs/{core → src/core}/PersistenceManager.js +62 -32
- 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 +31 -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 +143 -0
- package/dist/cjs/src/core/ResponsePipeline.d.ts.map +1 -0
- package/dist/cjs/src/core/ResponsePipeline.js +446 -0
- package/dist/cjs/src/core/ResponsePipeline.js.map +1 -0
- package/dist/cjs/src/core/Route.d.ts +126 -0
- package/dist/cjs/src/core/Route.d.ts.map +1 -0
- package/dist/cjs/{core → src/core}/Route.js +116 -20
- package/dist/cjs/src/core/Route.js.map +1 -0
- package/dist/{core → cjs/src/core}/RoutingEngine.d.ts +33 -38
- package/dist/cjs/src/core/RoutingEngine.d.ts.map +1 -0
- package/dist/cjs/{core → src/core}/RoutingEngine.js +102 -108
- package/dist/cjs/src/core/RoutingEngine.js.map +1 -0
- package/dist/cjs/src/core/SessionManager.d.ts +76 -0
- package/dist/cjs/src/core/SessionManager.d.ts.map +1 -0
- package/dist/cjs/src/core/SessionManager.js +197 -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 +43 -0
- package/dist/cjs/src/core/ToolExecutor.d.ts.map +1 -0
- package/dist/cjs/{core → src/core}/ToolExecutor.js +19 -18
- 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 +54 -35
- 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 +39 -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/{types → src/types}/route.d.ts +85 -31
- 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 +70 -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/cjs/{types → src/types}/tool.d.ts +6 -8
- 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 +36 -13
- 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/{cjs → src}/core/Agent.d.ts +67 -69
- package/dist/src/core/Agent.d.ts.map +1 -0
- package/dist/src/core/Agent.js +1429 -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/src/core/PersistenceManager.d.ts +98 -0
- package/dist/src/core/PersistenceManager.d.ts.map +1 -0
- package/dist/{core → src/core}/PersistenceManager.js +56 -26
- 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 +31 -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 +143 -0
- package/dist/src/core/ResponsePipeline.d.ts.map +1 -0
- package/dist/src/core/ResponsePipeline.js +442 -0
- package/dist/src/core/ResponsePipeline.js.map +1 -0
- package/dist/src/core/Route.d.ts +126 -0
- package/dist/src/core/Route.d.ts.map +1 -0
- package/dist/{core → src/core}/Route.js +116 -20
- package/dist/src/core/Route.js.map +1 -0
- package/dist/{cjs → src}/core/RoutingEngine.d.ts +33 -38
- package/dist/src/core/RoutingEngine.d.ts.map +1 -0
- package/dist/{core → src/core}/RoutingEngine.js +98 -104
- package/dist/src/core/RoutingEngine.js.map +1 -0
- package/dist/src/core/SessionManager.d.ts +76 -0
- package/dist/src/core/SessionManager.d.ts.map +1 -0
- package/dist/src/core/SessionManager.js +193 -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 +43 -0
- package/dist/src/core/ToolExecutor.d.ts.map +1 -0
- package/dist/src/core/ToolExecutor.js +70 -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 +54 -35
- 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 +39 -23
- package/dist/src/types/persistence.d.ts.map +1 -0
- package/dist/src/types/persistence.js.map +1 -0
- package/dist/{types → src/types}/route.d.ts +85 -31
- 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 +70 -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/{types → src/types}/tool.d.ts +6 -8
- package/dist/{cjs → src}/types/tool.d.ts.map +1 -1
- 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 +34 -13
- 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} +902 -263
- package/docs/api/overview.md +798 -0
- package/docs/core/agent/README.md +642 -0
- package/docs/{CONTEXT_MANAGEMENT.md → core/agent/context-management.md} +144 -95
- package/docs/{ARCHITECTURE.md → core/agent/session-management.md} +74 -59
- package/docs/core/ai-integration/prompt-composition.md +196 -0
- package/docs/core/ai-integration/providers.md +515 -0
- package/docs/core/ai-integration/response-processing.md +165 -0
- package/docs/core/conversation-flows/data-collection.md +545 -0
- package/docs/core/conversation-flows/route-dsl.md +479 -0
- package/docs/core/conversation-flows/routes.md +61 -0
- package/docs/core/conversation-flows/step-transitions.md +595 -0
- package/docs/core/conversation-flows/steps.md +130 -0
- package/docs/{ADAPTERS.md → core/persistence/adapters.md} +2 -2
- package/docs/core/persistence/session-storage.md +644 -0
- package/docs/core/routing/intelligent-routing.md +339 -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 +384 -0
- package/examples/{company-qna-agent.ts → advanced-patterns/knowledge-based-agent.ts} +104 -69
- package/examples/{persistent-onboarding.ts → advanced-patterns/persistent-onboarding.ts} +181 -103
- package/examples/{rules-prohibitions.ts → advanced-patterns/route-lifecycle-hooks.ts} +102 -82
- package/examples/{streaming-agent.ts → advanced-patterns/streaming-responses.ts} +90 -69
- package/examples/ai-providers/anthropic-integration.ts +377 -0
- package/examples/{openai-agent.ts → ai-providers/openai-integration.ts} +37 -43
- package/examples/{route-transitions.ts → conversation-flows/completion-transitions.ts} +115 -108
- package/examples/{declarative-agent.ts → core-concepts/basic-agent.ts} +175 -131
- package/examples/core-concepts/schema-driven-extraction.ts +301 -0
- package/examples/core-concepts/session-management.ts +394 -0
- package/examples/integrations/database-integration.ts +615 -0
- package/examples/{healthcare-agent.ts → integrations/healthcare-integration.ts} +204 -111
- package/examples/{opensearch-persistence.ts → integrations/search-integration.ts} +159 -128
- package/examples/integrations/server-session-management.ts +299 -0
- package/examples/persistence/custom-adapter.ts +529 -0
- package/examples/{prisma-persistence.ts → persistence/database-persistence.ts} +168 -241
- package/examples/persistence/memory-sessions.ts +506 -0
- package/examples/{prisma-schema.example.prisma → persistence/prisma-schema.example.prisma} +1 -1
- package/examples/{redis-persistence.ts → persistence/redis-persistence.ts} +152 -173
- package/examples/tools/basic-tools.ts +550 -0
- package/examples/{extracted-data-modification.ts → tools/data-enrichment-tools.ts} +82 -79
- 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 +1102 -487
- package/src/core/Events.ts +100 -112
- package/src/core/PersistenceManager.ts +87 -57
- package/src/core/PromptComposer.ts +158 -85
- package/src/core/ResponseEngine.ts +118 -38
- package/src/core/ResponsePipeline.ts +715 -0
- package/src/core/Route.ts +168 -51
- package/src/core/RoutingEngine.ts +178 -209
- package/src/core/SessionManager.ts +241 -0
- package/src/core/Step.ts +149 -67
- package/src/core/ToolExecutor.ts +37 -42
- 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 +50 -38
- package/src/types/ai.ts +7 -0
- package/src/types/history.ts +91 -18
- package/src/types/index.ts +43 -7
- package/src/types/persistence.ts +46 -28
- package/src/types/route.ts +104 -45
- package/src/types/session.ts +19 -213
- package/src/types/template.ts +36 -0
- package/src/types/tool.ts +9 -11
- 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 +229 -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.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 +0 -96
- 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.map +0 -1
- 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.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/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.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 +0 -96
- 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.map +0 -1
- 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.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/domain-scoping.ts +0 -366
- 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,339 @@
|
|
|
1
|
+
# Intelligent Routing System
|
|
2
|
+
|
|
3
|
+
The AI routing system is the core intelligence layer of @falai/agent that enables dynamic, context-aware conversation flows. Unlike traditional state machines, the routing system uses AI to intelligently select routes and steps based on user intent, conversation history, and collected data.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
The `RoutingEngine` class powers two key decision-making processes:
|
|
8
|
+
|
|
9
|
+
1. **Route Selection**: When multiple routes are available, AI analyzes the conversation to score and select the most appropriate route
|
|
10
|
+
2. **Step Selection**: Within an active route, AI determines the best next step from available candidates
|
|
11
|
+
|
|
12
|
+
## How It Works
|
|
13
|
+
|
|
14
|
+
### Route Selection Process
|
|
15
|
+
|
|
16
|
+
When an agent has multiple routes defined, the routing engine:
|
|
17
|
+
|
|
18
|
+
1. **Analyzes Context**: Evaluates conversation history, user intent, and current session state
|
|
19
|
+
2. **Scores Routes**: Uses AI to score each route (0-100) based on relevance and semantic fit
|
|
20
|
+
3. **Applies Thresholds**: Considers switching costs and maintains conversation continuity
|
|
21
|
+
4. **Selects Winner**: Chooses the highest-scoring route or stays with the current route
|
|
22
|
+
|
|
23
|
+
### Step Selection Process
|
|
24
|
+
|
|
25
|
+
Within an active route, the routing engine:
|
|
26
|
+
|
|
27
|
+
1. **Finds Candidates**: Traverses the step chain to identify valid next steps
|
|
28
|
+
2. **Evaluates Conditions**: Respects `skipIf` conditions and `requires` dependencies
|
|
29
|
+
3. **AI Decision**: When multiple candidates exist, uses AI to select the optimal step
|
|
30
|
+
4. **Handles Completion**: Detects route completion and manages transitions
|
|
31
|
+
|
|
32
|
+
## Key Features
|
|
33
|
+
|
|
34
|
+
### Intelligent Route Scoring
|
|
35
|
+
|
|
36
|
+
Routes are scored based on multiple factors:
|
|
37
|
+
|
|
38
|
+
```typescript
|
|
39
|
+
// Routes receive scores 0-100 based on:
|
|
40
|
+
- Explicit keyword matches (90-100)
|
|
41
|
+
- Contextual evidence (70-89)
|
|
42
|
+
- Moderate relevance (50-69)
|
|
43
|
+
- Weak connections (30-49)
|
|
44
|
+
- Minimal relevance (0-29)
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Smart Step Traversal
|
|
48
|
+
|
|
49
|
+
The system intelligently traverses step chains:
|
|
50
|
+
|
|
51
|
+
- **Skip Logic**: Automatically skips steps where `skipIf` conditions are met
|
|
52
|
+
- **Dependency Checking**: Ensures required data is present before allowing step progression
|
|
53
|
+
- **Loop Prevention**: Uses visited sets to prevent infinite traversal
|
|
54
|
+
- **Branch Resolution**: Handles complex branching logic with AI assistance
|
|
55
|
+
|
|
56
|
+
### Context-Aware Decisions
|
|
57
|
+
|
|
58
|
+
All routing decisions consider:
|
|
59
|
+
|
|
60
|
+
- **Conversation History**: Full dialogue context
|
|
61
|
+
- **Collected Data**: What information has been gathered
|
|
62
|
+
- **Session State**: Current route and step position
|
|
63
|
+
- **Agent Knowledge**: Guidelines, terms, and domain knowledge
|
|
64
|
+
|
|
65
|
+
## Route Selection API
|
|
66
|
+
|
|
67
|
+
### Single Route Optimization
|
|
68
|
+
|
|
69
|
+
For agents with only one route, the system optimizes by skipping expensive route scoring:
|
|
70
|
+
|
|
71
|
+
```typescript
|
|
72
|
+
// Single route - direct step selection
|
|
73
|
+
const result = await routingEngine.decideSingleRouteStep({
|
|
74
|
+
route: userOnboardingRoute,
|
|
75
|
+
session,
|
|
76
|
+
history,
|
|
77
|
+
agentOptions,
|
|
78
|
+
provider,
|
|
79
|
+
context,
|
|
80
|
+
});
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### Multi-Route Orchestration
|
|
84
|
+
|
|
85
|
+
For complex agents with multiple routes:
|
|
86
|
+
|
|
87
|
+
```typescript
|
|
88
|
+
// Multiple routes - full AI-powered selection
|
|
89
|
+
const result = await routingEngine.decideRouteAndStep({
|
|
90
|
+
routes: [onboardingRoute, supportRoute, salesRoute],
|
|
91
|
+
session,
|
|
92
|
+
history,
|
|
93
|
+
agentOptions,
|
|
94
|
+
provider,
|
|
95
|
+
context,
|
|
96
|
+
});
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## Step Candidate Logic
|
|
100
|
+
|
|
101
|
+
### Finding Valid Steps
|
|
102
|
+
|
|
103
|
+
The `getCandidateSteps()` method implements sophisticated logic:
|
|
104
|
+
|
|
105
|
+
```typescript
|
|
106
|
+
// Find valid next steps considering:
|
|
107
|
+
const candidates = routingEngine.getCandidateSteps(
|
|
108
|
+
route, // Current route
|
|
109
|
+
currentStep, // Current step (or null for route start)
|
|
110
|
+
collectedData // Session data collected so far
|
|
111
|
+
);
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### SkipIf Processing
|
|
115
|
+
|
|
116
|
+
Steps are automatically filtered based on conditions:
|
|
117
|
+
|
|
118
|
+
```typescript
|
|
119
|
+
// Step definition with skipIf
|
|
120
|
+
initialStep: {
|
|
121
|
+
prompt: "What's your name?",
|
|
122
|
+
collect: ["name"],
|
|
123
|
+
skipIf: (data) => data.name !== undefined // Skip if name already collected
|
|
124
|
+
}
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### Recursive Traversal
|
|
128
|
+
|
|
129
|
+
The system recursively traverses step chains to find valid paths:
|
|
130
|
+
|
|
131
|
+
```typescript
|
|
132
|
+
// Handles complex scenarios like:
|
|
133
|
+
// Step A (skipIf: condition) -> Step B -> Step C (requires: data)
|
|
134
|
+
// If Step A is skipped, system continues to Step B, then evaluates Step C
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
## Prompt Engineering
|
|
138
|
+
|
|
139
|
+
### Route Selection Prompts
|
|
140
|
+
|
|
141
|
+
The system builds comprehensive prompts for route selection:
|
|
142
|
+
|
|
143
|
+
```typescript
|
|
144
|
+
const routingPrompt = await routingEngine.buildRoutingPrompt({
|
|
145
|
+
history,
|
|
146
|
+
routes,
|
|
147
|
+
lastMessage,
|
|
148
|
+
agentOptions,
|
|
149
|
+
session,
|
|
150
|
+
activeRouteSteps,
|
|
151
|
+
context,
|
|
152
|
+
});
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
Prompts include:
|
|
156
|
+
|
|
157
|
+
- Agent identity and personality
|
|
158
|
+
- Available routes with descriptions and conditions
|
|
159
|
+
- Session context and collected data
|
|
160
|
+
- Scoring guidelines (90-100 scale)
|
|
161
|
+
- Conversation history and directives
|
|
162
|
+
|
|
163
|
+
### Step Selection Prompts
|
|
164
|
+
|
|
165
|
+
For step selection within routes:
|
|
166
|
+
|
|
167
|
+
```typescript
|
|
168
|
+
const stepPrompt = await routingEngine.buildStepSelectionPrompt({
|
|
169
|
+
route,
|
|
170
|
+
currentStep,
|
|
171
|
+
candidates,
|
|
172
|
+
data: session.data,
|
|
173
|
+
history,
|
|
174
|
+
lastMessage,
|
|
175
|
+
agentOptions,
|
|
176
|
+
context,
|
|
177
|
+
session,
|
|
178
|
+
});
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
## Response Processing
|
|
182
|
+
|
|
183
|
+
### Structured Scoring
|
|
184
|
+
|
|
185
|
+
AI responses use JSON schemas for reliable parsing:
|
|
186
|
+
|
|
187
|
+
```typescript
|
|
188
|
+
// Route scoring schema
|
|
189
|
+
{
|
|
190
|
+
context: "Brief summary of user intent",
|
|
191
|
+
routes: {
|
|
192
|
+
"route-id-1": 85, // Score 0-100
|
|
193
|
+
"route-id-2": 72,
|
|
194
|
+
"route-id-3": 45
|
|
195
|
+
},
|
|
196
|
+
responseDirectives: ["Focus on pricing", "Be helpful"]
|
|
197
|
+
}
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### Step Selection Schema
|
|
201
|
+
|
|
202
|
+
```typescript
|
|
203
|
+
// Step selection schema
|
|
204
|
+
{
|
|
205
|
+
reasoning: "Why this step was selected",
|
|
206
|
+
selectedStepId: "step-id",
|
|
207
|
+
responseDirectives: ["Address concerns", "Provide options"]
|
|
208
|
+
}
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
## Integration with Agent Flow
|
|
212
|
+
|
|
213
|
+
### Response Pipeline Integration
|
|
214
|
+
|
|
215
|
+
The routing engine integrates seamlessly with the response pipeline:
|
|
216
|
+
|
|
217
|
+
```typescript
|
|
218
|
+
// In Agent.respondStream():
|
|
219
|
+
1. Prepare context and session
|
|
220
|
+
2. Call routingEngine.decideRouteAndStep()
|
|
221
|
+
3. Execute prepare() functions on current step
|
|
222
|
+
4. Generate AI response with selected route/step
|
|
223
|
+
5. Process tool calls and data collection
|
|
224
|
+
6. Handle route completion and transitions
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
### Session State Management
|
|
228
|
+
|
|
229
|
+
Routing decisions update session state:
|
|
230
|
+
|
|
231
|
+
```typescript
|
|
232
|
+
// Session updates include:
|
|
233
|
+
- Current route transitions
|
|
234
|
+
- Step progression
|
|
235
|
+
- Initial data merging
|
|
236
|
+
- Route completion handling
|
|
237
|
+
- Pending transition management
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
## Performance Optimizations
|
|
241
|
+
|
|
242
|
+
### Single Route Fast Path
|
|
243
|
+
|
|
244
|
+
For agents with one route, skips route scoring entirely:
|
|
245
|
+
|
|
246
|
+
```typescript
|
|
247
|
+
if (routes.length === 1) {
|
|
248
|
+
return this.decideSingleRouteStep(/* optimized path */);
|
|
249
|
+
}
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
### Candidate Limiting
|
|
253
|
+
|
|
254
|
+
Applies configurable limits to prevent excessive AI calls:
|
|
255
|
+
|
|
256
|
+
```typescript
|
|
257
|
+
const limited = maxCandidates ? entries.slice(0, maxCandidates) : entries;
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
## Error Handling & Resilience
|
|
261
|
+
|
|
262
|
+
### Backup Model Support
|
|
263
|
+
|
|
264
|
+
When primary AI models fail, automatically tries backup models:
|
|
265
|
+
|
|
266
|
+
```typescript
|
|
267
|
+
// Automatic fallback to backup models
|
|
268
|
+
// Error classification (rate limits, overloads, etc.)
|
|
269
|
+
// Timeout and retry logic
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
### Validation & Fallbacks
|
|
273
|
+
|
|
274
|
+
Robust validation ensures system stability:
|
|
275
|
+
|
|
276
|
+
```typescript
|
|
277
|
+
// Invalid responses fallback to first candidate
|
|
278
|
+
// Missing data handled gracefully
|
|
279
|
+
// Circular dependencies prevented
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
## Configuration Options
|
|
283
|
+
|
|
284
|
+
### Routing Engine Options
|
|
285
|
+
|
|
286
|
+
```typescript
|
|
287
|
+
const routingEngine = new RoutingEngine({
|
|
288
|
+
allowRouteSwitch: true, // Allow switching between routes
|
|
289
|
+
switchThreshold: 70, // Minimum score to switch routes
|
|
290
|
+
maxCandidates: 5, // Limit AI evaluation candidates
|
|
291
|
+
});
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
## Best Practices
|
|
295
|
+
|
|
296
|
+
### Route Design
|
|
297
|
+
|
|
298
|
+
1. **Clear Conditions**: Define specific conditions for route activation
|
|
299
|
+
2. **Distinct Purposes**: Ensure routes serve different user intents
|
|
300
|
+
3. **Progressive Disclosure**: Use step dependencies to control information flow
|
|
301
|
+
4. **Completion Handling**: Define clear end states and transitions
|
|
302
|
+
|
|
303
|
+
### Step Design
|
|
304
|
+
|
|
305
|
+
1. **Atomic Actions**: Each step should accomplish one clear goal
|
|
306
|
+
2. **Smart Skipping**: Use `skipIf` to avoid redundant questions
|
|
307
|
+
3. **Data Dependencies**: Use `requires` to enforce logical flow
|
|
308
|
+
4. **Branch Wisely**: AI can handle branching but prefer linear flows when possible
|
|
309
|
+
|
|
310
|
+
### Performance
|
|
311
|
+
|
|
312
|
+
1. **Limit Routes**: Too many routes increase AI evaluation time
|
|
313
|
+
2. **Optimize Prompts**: Keep route/step descriptions concise
|
|
314
|
+
3. **Cache Context**: Reuse context when possible
|
|
315
|
+
4. **Monitor Scores**: Track route selection accuracy and adjust conditions
|
|
316
|
+
|
|
317
|
+
## Debugging & Monitoring
|
|
318
|
+
|
|
319
|
+
### Route Selection Logging
|
|
320
|
+
|
|
321
|
+
```typescript
|
|
322
|
+
// Debug logging shows:
|
|
323
|
+
- Route scores and reasoning
|
|
324
|
+
- Selected routes and steps
|
|
325
|
+
- Candidate evaluation process
|
|
326
|
+
- Context analysis results
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
### Performance Metrics
|
|
330
|
+
|
|
331
|
+
```typescript
|
|
332
|
+
// Track:
|
|
333
|
+
- Route selection accuracy
|
|
334
|
+
- Step transition success rates
|
|
335
|
+
- AI call latency and costs
|
|
336
|
+
- User satisfaction scores
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
The intelligent routing system transforms traditional conversation design from static flows into dynamic, AI-driven experiences that adapt to user needs and context.
|
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
# Tool Definition
|
|
2
|
+
|
|
3
|
+
Tools in @falai/agent enable AI agents to execute custom logic, access external APIs, and perform actions during conversations. This document covers tool creation, configuration, and integration.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
Tools provide a way for agents to:
|
|
8
|
+
|
|
9
|
+
- Execute business logic and API calls
|
|
10
|
+
- Access external services and databases
|
|
11
|
+
- Perform calculations and data transformations
|
|
12
|
+
- Update conversation context and session data
|
|
13
|
+
|
|
14
|
+
## Tool Creation
|
|
15
|
+
|
|
16
|
+
Tools are created as objects implementing the `Tool` interface:
|
|
17
|
+
|
|
18
|
+
```typescript
|
|
19
|
+
import { Tool } from "@falai/agent";
|
|
20
|
+
|
|
21
|
+
const weatherTool: Tool<unknown, [], string, WeatherData> = {
|
|
22
|
+
id: "get_weather",
|
|
23
|
+
name: "Weather Forecast", // Human-readable name shown to AI models
|
|
24
|
+
description: "Get current weather and forecast for a location",
|
|
25
|
+
parameters: {
|
|
26
|
+
type: "object",
|
|
27
|
+
properties: {
|
|
28
|
+
location: { type: "string", description: "City or location name" },
|
|
29
|
+
date: { type: "string", description: "Date for forecast (YYYY-MM-DD)" },
|
|
30
|
+
},
|
|
31
|
+
required: ["location"],
|
|
32
|
+
},
|
|
33
|
+
handler: async ({ location, date }) => {
|
|
34
|
+
const weather = await weatherAPI.getForecast(location, date);
|
|
35
|
+
return {
|
|
36
|
+
data: `The weather in ${location} on ${date} is ${weather.condition}`,
|
|
37
|
+
contextUpdate: {
|
|
38
|
+
currentWeather: weather,
|
|
39
|
+
lastWeatherCheck: new Date().toISOString(),
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Tool Name
|
|
47
|
+
|
|
48
|
+
The optional `name` field provides a human-readable name for the tool that is displayed to AI models. When provided, this name takes precedence over the `id` field in AI provider interactions:
|
|
49
|
+
|
|
50
|
+
```typescript
|
|
51
|
+
const calculatorTool: Tool<unknown, [], string, CalcData> = {
|
|
52
|
+
id: "math_calculator", // Internal identifier
|
|
53
|
+
name: "Math Calculator", // Display name for AI models
|
|
54
|
+
description: "Perform mathematical calculations",
|
|
55
|
+
// ... rest of tool definition
|
|
56
|
+
};
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
**Benefits:**
|
|
60
|
+
|
|
61
|
+
- **Better AI Understanding**: Clear, descriptive names help AI models choose appropriate tools
|
|
62
|
+
- **User-Friendly**: More readable than cryptic IDs in AI responses and logs
|
|
63
|
+
- **Backward Compatible**: Falls back to `id` if `name` is not provided
|
|
64
|
+
- **Flexible**: Allows separation of internal IDs from user-facing names
|
|
65
|
+
|
|
66
|
+
## Tool Parameters
|
|
67
|
+
|
|
68
|
+
Tool parameters are defined using JSON Schema:
|
|
69
|
+
|
|
70
|
+
```typescript
|
|
71
|
+
const searchTool: Tool<unknown, [], string, SearchData> = {
|
|
72
|
+
id: "web_search",
|
|
73
|
+
name: "Web Search Engine",
|
|
74
|
+
description: "Search the web for information",
|
|
75
|
+
parameters: {
|
|
76
|
+
type: "object",
|
|
77
|
+
properties: {
|
|
78
|
+
query: {
|
|
79
|
+
type: "string",
|
|
80
|
+
description: "Search query",
|
|
81
|
+
minLength: 1,
|
|
82
|
+
maxLength: 200,
|
|
83
|
+
},
|
|
84
|
+
limit: {
|
|
85
|
+
type: "number",
|
|
86
|
+
description: "Maximum number of results",
|
|
87
|
+
minimum: 1,
|
|
88
|
+
maximum: 50,
|
|
89
|
+
default: 10,
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
required: ["query"],
|
|
93
|
+
},
|
|
94
|
+
handler: async ({ query, limit = 10 }) => {
|
|
95
|
+
const results = await searchAPI.query(query, limit);
|
|
96
|
+
return {
|
|
97
|
+
data: `Found ${results.length} results for "${query}"`,
|
|
98
|
+
contextUpdate: { searchResults: results },
|
|
99
|
+
};
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## Tool Execution Context
|
|
105
|
+
|
|
106
|
+
Tools receive execution context including:
|
|
107
|
+
|
|
108
|
+
- **Current context** - Agent and route context
|
|
109
|
+
- **Session data** - Collected conversation data
|
|
110
|
+
- **Route information** - Current route and step details
|
|
111
|
+
|
|
112
|
+
```typescript
|
|
113
|
+
const userProfileTool: Tool<unknown, [], string, UserData> = {
|
|
114
|
+
id: "get_user_profile",
|
|
115
|
+
description: "Retrieve user profile information",
|
|
116
|
+
parameters: {
|
|
117
|
+
type: "object",
|
|
118
|
+
properties: {
|
|
119
|
+
userId: {
|
|
120
|
+
type: "string",
|
|
121
|
+
description: "User ID (optional, uses context if not provided)",
|
|
122
|
+
},
|
|
123
|
+
},
|
|
124
|
+
},
|
|
125
|
+
handler: async (toolContext, args) => {
|
|
126
|
+
// Access current context
|
|
127
|
+
const currentUserId = toolContext.context.userId || args.userId;
|
|
128
|
+
|
|
129
|
+
// Access collected data
|
|
130
|
+
const preferences = toolContext.data.userPreferences;
|
|
131
|
+
|
|
132
|
+
const profile = await userAPI.getProfile(currentUserId);
|
|
133
|
+
return {
|
|
134
|
+
data: `Retrieved profile for ${profile.name}`,
|
|
135
|
+
dataUpdate: { userProfile: profile },
|
|
136
|
+
};
|
|
137
|
+
},
|
|
138
|
+
};
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## Tool Response Format
|
|
142
|
+
|
|
143
|
+
Tools return structured responses with multiple components:
|
|
144
|
+
|
|
145
|
+
```typescript
|
|
146
|
+
interface ToolResult {
|
|
147
|
+
success: boolean;
|
|
148
|
+
result?: {
|
|
149
|
+
data: unknown; // User-visible result
|
|
150
|
+
contextUpdate?: Partial<TContext>; // Context modifications
|
|
151
|
+
dataUpdate?: Partial<TData>; // Session data updates
|
|
152
|
+
};
|
|
153
|
+
error?: string; // Error message if failed
|
|
154
|
+
}
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
## Context Updates
|
|
158
|
+
|
|
159
|
+
Tools can modify conversation context:
|
|
160
|
+
|
|
161
|
+
```typescript
|
|
162
|
+
const locationTool: Tool<unknown, [], string, LocationData> = {
|
|
163
|
+
id: "set_location",
|
|
164
|
+
description: "Update the user's location in context",
|
|
165
|
+
parameters: {
|
|
166
|
+
type: "object",
|
|
167
|
+
properties: {
|
|
168
|
+
location: { type: "string", description: "New location" },
|
|
169
|
+
},
|
|
170
|
+
required: ["location"],
|
|
171
|
+
},
|
|
172
|
+
handler: async (toolContext, args) => {
|
|
173
|
+
return {
|
|
174
|
+
data: `Location set to ${args.location}`,
|
|
175
|
+
contextUpdate: {
|
|
176
|
+
currentLocation: args.location,
|
|
177
|
+
locationSetAt: new Date().toISOString(),
|
|
178
|
+
locationHistory: (prev: string[]) => [...(prev || []), args.location],
|
|
179
|
+
},
|
|
180
|
+
};
|
|
181
|
+
},
|
|
182
|
+
};
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
## Data Collection Updates
|
|
186
|
+
|
|
187
|
+
Tools can update session data collected during conversation:
|
|
188
|
+
|
|
189
|
+
```typescript
|
|
190
|
+
const validationTool: Tool<unknown, [], string, BookingData> = {
|
|
191
|
+
id: "validate_booking",
|
|
192
|
+
description: "Validate booking information and update session data",
|
|
193
|
+
parameters: {
|
|
194
|
+
type: "object",
|
|
195
|
+
properties: {},
|
|
196
|
+
},
|
|
197
|
+
handler: async (toolContext) => {
|
|
198
|
+
const validation = await bookingAPI.validate(toolContext.data.bookingInfo);
|
|
199
|
+
|
|
200
|
+
if (!validation.valid) {
|
|
201
|
+
return {
|
|
202
|
+
data: `Booking validation failed: ${validation.errors.join(", ")}`,
|
|
203
|
+
dataUpdate: {
|
|
204
|
+
bookingErrors: validation.errors,
|
|
205
|
+
bookingValid: false,
|
|
206
|
+
},
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
return {
|
|
211
|
+
data: "Booking validated successfully",
|
|
212
|
+
dataUpdate: {
|
|
213
|
+
bookingValid: true,
|
|
214
|
+
validatedAt: new Date().toISOString(),
|
|
215
|
+
},
|
|
216
|
+
};
|
|
217
|
+
},
|
|
218
|
+
};
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
## Error Handling
|
|
222
|
+
|
|
223
|
+
Tools should handle errors gracefully:
|
|
224
|
+
|
|
225
|
+
```typescript
|
|
226
|
+
const apiTool: Tool<unknown, [], string, ApiData> = {
|
|
227
|
+
id: "call_external_api",
|
|
228
|
+
description: "Call an external API endpoint",
|
|
229
|
+
parameters: {
|
|
230
|
+
type: "object",
|
|
231
|
+
properties: {
|
|
232
|
+
endpoint: { type: "string", description: "API endpoint to call" },
|
|
233
|
+
},
|
|
234
|
+
required: ["endpoint"],
|
|
235
|
+
},
|
|
236
|
+
handler: async (toolContext, args) => {
|
|
237
|
+
try {
|
|
238
|
+
const result = await externalAPI.call(args.endpoint);
|
|
239
|
+
return {
|
|
240
|
+
data: `API call successful: ${result}`,
|
|
241
|
+
};
|
|
242
|
+
} catch (error) {
|
|
243
|
+
const errorMessage =
|
|
244
|
+
error instanceof Error ? error.message : "Unknown error";
|
|
245
|
+
return {
|
|
246
|
+
data: `API call failed: ${errorMessage}`,
|
|
247
|
+
contextUpdate: { lastApiError: errorMessage },
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
},
|
|
251
|
+
};
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
## Tool Scoping
|
|
255
|
+
|
|
256
|
+
Tools can be registered at different levels:
|
|
257
|
+
|
|
258
|
+
### Agent-Level Tools
|
|
259
|
+
|
|
260
|
+
Available to all routes and steps:
|
|
261
|
+
|
|
262
|
+
```typescript
|
|
263
|
+
const agent = new Agent({
|
|
264
|
+
name: "Assistant",
|
|
265
|
+
provider: openaiProvider,
|
|
266
|
+
tools: [globalSearchTool, userManagementTool],
|
|
267
|
+
});
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
### Route-Level Tools
|
|
271
|
+
|
|
272
|
+
Available only within specific routes:
|
|
273
|
+
|
|
274
|
+
```typescript
|
|
275
|
+
const supportRoute = agent.createRoute({
|
|
276
|
+
title: "Customer Support",
|
|
277
|
+
tools: [ticketCreationTool, knowledgeBaseTool],
|
|
278
|
+
});
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
### Step-Level Tools
|
|
282
|
+
|
|
283
|
+
Available only in specific steps:
|
|
284
|
+
|
|
285
|
+
```typescript
|
|
286
|
+
const bookingStep = route.initialStep.nextStep({
|
|
287
|
+
prompt: "Ready to book?",
|
|
288
|
+
tools: [paymentProcessingTool],
|
|
289
|
+
requires: ["bookingDetails"],
|
|
290
|
+
});
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
## Tool Resolution Priority
|
|
294
|
+
|
|
295
|
+
When multiple tools with the same name exist, priority is:
|
|
296
|
+
|
|
297
|
+
1. **Step-level tools** (highest priority)
|
|
298
|
+
2. **Route-level tools**
|
|
299
|
+
3. **Agent-level tools** (lowest priority)
|
|
300
|
+
|
|
301
|
+
## Async Tools
|
|
302
|
+
|
|
303
|
+
Tools support async operations and Promises:
|
|
304
|
+
|
|
305
|
+
```typescript
|
|
306
|
+
const asyncTool: Tool<unknown, [], string, ProcessingData> = {
|
|
307
|
+
id: "process_data",
|
|
308
|
+
description: "Process data asynchronously with heavy computation",
|
|
309
|
+
parameters: {
|
|
310
|
+
type: "object",
|
|
311
|
+
properties: {
|
|
312
|
+
data: { type: "object", description: "Data to process" },
|
|
313
|
+
},
|
|
314
|
+
required: ["data"],
|
|
315
|
+
},
|
|
316
|
+
handler: async (toolContext, args) => {
|
|
317
|
+
// Simulate async processing
|
|
318
|
+
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
319
|
+
|
|
320
|
+
const processed = await heavyComputation(args.data);
|
|
321
|
+
|
|
322
|
+
return {
|
|
323
|
+
data: "Data processed successfully",
|
|
324
|
+
dataUpdate: { processedData: processed },
|
|
325
|
+
};
|
|
326
|
+
},
|
|
327
|
+
};
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
## Tool Validation
|
|
331
|
+
|
|
332
|
+
Tools are validated at registration time:
|
|
333
|
+
|
|
334
|
+
- **Schema validation** - Parameter schemas must be valid JSON Schema
|
|
335
|
+
- **Type checking** - TypeScript types must match schemas
|
|
336
|
+
- **Name uniqueness** - Tool names must be unique within scope
|
|
337
|
+
|
|
338
|
+
## Best Practices
|
|
339
|
+
|
|
340
|
+
- **Keep tools focused** - Each tool should do one thing well
|
|
341
|
+
- **Use descriptive names** - Tool names should be clear and specific
|
|
342
|
+
- **Handle errors gracefully** - Provide meaningful error messages
|
|
343
|
+
- **Leverage context updates** - Use context to maintain conversation state
|
|
344
|
+
- **Validate parameters** - Use JSON Schema constraints effectively
|
|
345
|
+
- **Consider performance** - Avoid long-running operations when possible
|
|
346
|
+
- **Document thoroughly** - Provide clear descriptions for AI usage
|