@falai/agent 0.1.0-alpha2
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 +797 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/src/adapters/MemoryAdapter.d.ts +47 -0
- package/dist/cjs/src/adapters/MemoryAdapter.d.ts.map +1 -0
- package/dist/cjs/src/adapters/MemoryAdapter.js +202 -0
- package/dist/cjs/src/adapters/MemoryAdapter.js.map +1 -0
- package/dist/cjs/src/adapters/MongoAdapter.d.ts +97 -0
- package/dist/cjs/src/adapters/MongoAdapter.d.ts.map +1 -0
- package/dist/cjs/src/adapters/MongoAdapter.js +168 -0
- package/dist/cjs/src/adapters/MongoAdapter.js.map +1 -0
- package/dist/cjs/src/adapters/OpenSearchAdapter.d.ts +169 -0
- package/dist/cjs/src/adapters/OpenSearchAdapter.d.ts.map +1 -0
- package/dist/cjs/src/adapters/OpenSearchAdapter.js +458 -0
- package/dist/cjs/src/adapters/OpenSearchAdapter.js.map +1 -0
- package/dist/cjs/src/adapters/PostgreSQLAdapter.d.ts +71 -0
- package/dist/cjs/src/adapters/PostgreSQLAdapter.d.ts.map +1 -0
- package/dist/cjs/src/adapters/PostgreSQLAdapter.js +260 -0
- package/dist/cjs/src/adapters/PostgreSQLAdapter.js.map +1 -0
- package/dist/cjs/src/adapters/PrismaAdapter.d.ts +115 -0
- package/dist/cjs/src/adapters/PrismaAdapter.d.ts.map +1 -0
- package/dist/cjs/src/adapters/PrismaAdapter.js +366 -0
- package/dist/cjs/src/adapters/PrismaAdapter.js.map +1 -0
- package/dist/cjs/src/adapters/RedisAdapter.d.ts +71 -0
- package/dist/cjs/src/adapters/RedisAdapter.d.ts.map +1 -0
- package/dist/cjs/src/adapters/RedisAdapter.js +231 -0
- package/dist/cjs/src/adapters/RedisAdapter.js.map +1 -0
- package/dist/cjs/src/adapters/SQLiteAdapter.d.ts +69 -0
- package/dist/cjs/src/adapters/SQLiteAdapter.d.ts.map +1 -0
- package/dist/cjs/src/adapters/SQLiteAdapter.js +312 -0
- package/dist/cjs/src/adapters/SQLiteAdapter.js.map +1 -0
- package/dist/cjs/src/adapters/index.d.ts +17 -0
- package/dist/cjs/src/adapters/index.d.ts.map +1 -0
- package/dist/cjs/src/adapters/index.js +21 -0
- package/dist/cjs/src/adapters/index.js.map +1 -0
- package/dist/cjs/src/constants/index.d.ts +10 -0
- package/dist/cjs/src/constants/index.d.ts.map +1 -0
- package/dist/cjs/src/constants/index.js +13 -0
- package/dist/cjs/src/constants/index.js.map +1 -0
- package/dist/cjs/src/core/Agent.d.ts +232 -0
- package/dist/cjs/src/core/Agent.d.ts.map +1 -0
- package/dist/cjs/src/core/Agent.js +741 -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/src/core/PersistenceManager.js +261 -0
- 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 +194 -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 +202 -0
- package/dist/cjs/src/core/ResponseEngine.js.map +1 -0
- package/dist/cjs/src/core/ResponseModal.d.ts +222 -0
- package/dist/cjs/src/core/ResponseModal.d.ts.map +1 -0
- package/dist/cjs/src/core/ResponseModal.js +1588 -0
- package/dist/cjs/src/core/ResponseModal.js.map +1 -0
- package/dist/cjs/src/core/ResponsePipeline.d.ts +175 -0
- package/dist/cjs/src/core/ResponsePipeline.d.ts.map +1 -0
- package/dist/cjs/src/core/ResponsePipeline.js +549 -0
- package/dist/cjs/src/core/ResponsePipeline.js.map +1 -0
- package/dist/cjs/src/core/Route.d.ts +181 -0
- package/dist/cjs/src/core/Route.d.ts.map +1 -0
- package/dist/cjs/src/core/Route.js +541 -0
- package/dist/cjs/src/core/Route.js.map +1 -0
- package/dist/cjs/src/core/RoutingEngine.d.ts +159 -0
- package/dist/cjs/src/core/RoutingEngine.d.ts.map +1 -0
- package/dist/cjs/src/core/RoutingEngine.js +961 -0
- package/dist/cjs/src/core/RoutingEngine.js.map +1 -0
- package/dist/cjs/src/core/SessionManager.d.ts +94 -0
- package/dist/cjs/src/core/SessionManager.d.ts.map +1 -0
- package/dist/cjs/src/core/SessionManager.js +239 -0
- package/dist/cjs/src/core/SessionManager.js.map +1 -0
- package/dist/cjs/src/core/Step.d.ts +170 -0
- package/dist/cjs/src/core/Step.d.ts.map +1 -0
- package/dist/cjs/src/core/Step.js +448 -0
- package/dist/cjs/src/core/Step.js.map +1 -0
- package/dist/cjs/src/core/ToolManager.d.ts +234 -0
- package/dist/cjs/src/core/ToolManager.d.ts.map +1 -0
- package/dist/cjs/src/core/ToolManager.js +1117 -0
- package/dist/cjs/src/core/ToolManager.js.map +1 -0
- package/dist/cjs/src/index.d.ts +44 -0
- package/dist/cjs/src/index.d.ts.map +1 -0
- package/dist/cjs/src/index.js +88 -0
- package/dist/cjs/src/index.js.map +1 -0
- package/dist/cjs/src/providers/AnthropicProvider.d.ts +43 -0
- package/dist/cjs/src/providers/AnthropicProvider.d.ts.map +1 -0
- package/dist/cjs/src/providers/AnthropicProvider.js +377 -0
- package/dist/cjs/src/providers/AnthropicProvider.js.map +1 -0
- package/dist/cjs/src/providers/GeminiProvider.d.ts +58 -0
- package/dist/cjs/src/providers/GeminiProvider.d.ts.map +1 -0
- package/dist/cjs/src/providers/GeminiProvider.js +489 -0
- package/dist/cjs/src/providers/GeminiProvider.js.map +1 -0
- package/dist/cjs/src/providers/OpenAIProvider.d.ts +52 -0
- package/dist/cjs/src/providers/OpenAIProvider.d.ts.map +1 -0
- package/dist/cjs/src/providers/OpenAIProvider.js +395 -0
- package/dist/cjs/src/providers/OpenAIProvider.js.map +1 -0
- package/dist/cjs/src/providers/OpenRouterProvider.d.ts +56 -0
- package/dist/cjs/src/providers/OpenRouterProvider.d.ts.map +1 -0
- package/dist/cjs/src/providers/OpenRouterProvider.js +409 -0
- package/dist/cjs/src/providers/OpenRouterProvider.js.map +1 -0
- package/dist/cjs/src/providers/index.d.ts +13 -0
- package/dist/cjs/src/providers/index.d.ts.map +1 -0
- package/dist/cjs/src/providers/index.js +16 -0
- package/dist/cjs/src/providers/index.js.map +1 -0
- package/dist/cjs/src/types/agent.d.ts +181 -0
- package/dist/cjs/src/types/agent.d.ts.map +1 -0
- package/dist/cjs/src/types/agent.js +21 -0
- package/dist/cjs/src/types/agent.js.map +1 -0
- package/dist/cjs/src/types/ai.d.ts +143 -0
- package/dist/cjs/src/types/ai.d.ts.map +1 -0
- package/dist/cjs/src/types/ai.js +6 -0
- package/dist/cjs/src/types/ai.js.map +1 -0
- package/dist/cjs/src/types/history.d.ts +178 -0
- 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 +22 -0
- package/dist/cjs/src/types/index.d.ts.map +1 -0
- package/dist/cjs/src/types/index.js +37 -0
- package/dist/cjs/src/types/index.js.map +1 -0
- package/dist/cjs/src/types/persistence.d.ts +209 -0
- package/dist/cjs/src/types/persistence.d.ts.map +1 -0
- package/dist/cjs/src/types/persistence.js +7 -0
- package/dist/cjs/src/types/persistence.js.map +1 -0
- package/dist/cjs/src/types/route.d.ts +238 -0
- package/dist/cjs/src/types/route.d.ts.map +1 -0
- package/dist/cjs/src/types/route.js +6 -0
- package/dist/cjs/src/types/route.js.map +1 -0
- package/dist/cjs/src/types/routing.d.ts +16 -0
- package/dist/cjs/src/types/routing.d.ts.map +1 -0
- package/dist/cjs/src/types/routing.js +3 -0
- package/dist/cjs/src/types/routing.js.map +1 -0
- package/dist/cjs/src/types/schema.d.ts +22 -0
- package/dist/cjs/src/types/schema.d.ts.map +1 -0
- package/dist/cjs/src/types/schema.js +3 -0
- package/dist/cjs/src/types/schema.js.map +1 -0
- 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 +88 -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/src/types/tool.d.ts +130 -0
- package/dist/cjs/src/types/tool.d.ts.map +1 -0
- package/dist/cjs/src/types/tool.js +19 -0
- package/dist/cjs/src/types/tool.js.map +1 -0
- 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 +32 -0
- package/dist/cjs/src/utils/clone.js.map +1 -0
- package/dist/cjs/src/utils/condition.d.ts +38 -0
- package/dist/cjs/src/utils/condition.d.ts.map +1 -0
- package/dist/cjs/src/utils/condition.js +168 -0
- package/dist/cjs/src/utils/condition.js.map +1 -0
- package/dist/cjs/src/utils/event.d.ts +6 -0
- package/dist/cjs/src/utils/event.d.ts.map +1 -0
- package/dist/cjs/src/utils/event.js +20 -0
- package/dist/cjs/src/utils/event.js.map +1 -0
- package/dist/cjs/src/utils/history.d.ts +60 -0
- package/dist/cjs/src/utils/history.d.ts.map +1 -0
- package/dist/cjs/src/utils/history.js +274 -0
- package/dist/cjs/src/utils/history.js.map +1 -0
- package/dist/cjs/src/utils/id.d.ts +25 -0
- package/dist/cjs/src/utils/id.d.ts.map +1 -0
- package/dist/cjs/src/utils/id.js +70 -0
- package/dist/cjs/src/utils/id.js.map +1 -0
- package/dist/cjs/src/utils/index.d.ts +15 -0
- package/dist/cjs/src/utils/index.d.ts.map +1 -0
- package/dist/cjs/src/utils/index.js +64 -0
- package/dist/cjs/src/utils/index.js.map +1 -0
- package/dist/cjs/src/utils/json.d.ts +16 -0
- package/dist/cjs/src/utils/json.d.ts.map +1 -0
- package/dist/cjs/src/utils/json.js +47 -0
- package/dist/cjs/src/utils/json.js.map +1 -0
- package/dist/cjs/src/utils/logger.d.ts +10 -0
- package/dist/cjs/src/utils/logger.d.ts.map +1 -0
- package/dist/cjs/src/utils/logger.js +23 -0
- package/dist/cjs/src/utils/logger.js.map +1 -0
- package/dist/cjs/src/utils/retry.d.ts +10 -0
- package/dist/cjs/src/utils/retry.d.ts.map +1 -0
- package/dist/cjs/src/utils/retry.js +76 -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/src/utils/session.js +170 -0
- package/dist/cjs/src/utils/session.js.map +1 -0
- package/dist/cjs/src/utils/template.d.ts +155 -0
- package/dist/cjs/src/utils/template.d.ts.map +1 -0
- package/dist/cjs/src/utils/template.js +383 -0
- package/dist/cjs/src/utils/template.js.map +1 -0
- package/dist/src/adapters/MemoryAdapter.d.ts +47 -0
- package/dist/src/adapters/MemoryAdapter.d.ts.map +1 -0
- package/dist/src/adapters/MemoryAdapter.js +198 -0
- package/dist/src/adapters/MemoryAdapter.js.map +1 -0
- package/dist/src/adapters/MongoAdapter.d.ts +97 -0
- package/dist/src/adapters/MongoAdapter.d.ts.map +1 -0
- package/dist/src/adapters/MongoAdapter.js +164 -0
- package/dist/src/adapters/MongoAdapter.js.map +1 -0
- package/dist/src/adapters/OpenSearchAdapter.d.ts +169 -0
- package/dist/src/adapters/OpenSearchAdapter.d.ts.map +1 -0
- package/dist/src/adapters/OpenSearchAdapter.js +454 -0
- package/dist/src/adapters/OpenSearchAdapter.js.map +1 -0
- package/dist/src/adapters/PostgreSQLAdapter.d.ts +71 -0
- package/dist/src/adapters/PostgreSQLAdapter.d.ts.map +1 -0
- package/dist/src/adapters/PostgreSQLAdapter.js +256 -0
- package/dist/src/adapters/PostgreSQLAdapter.js.map +1 -0
- package/dist/src/adapters/PrismaAdapter.d.ts +115 -0
- package/dist/src/adapters/PrismaAdapter.d.ts.map +1 -0
- package/dist/src/adapters/PrismaAdapter.js +362 -0
- package/dist/src/adapters/PrismaAdapter.js.map +1 -0
- package/dist/src/adapters/RedisAdapter.d.ts +71 -0
- package/dist/src/adapters/RedisAdapter.d.ts.map +1 -0
- package/dist/src/adapters/RedisAdapter.js +227 -0
- package/dist/src/adapters/RedisAdapter.js.map +1 -0
- package/dist/src/adapters/SQLiteAdapter.d.ts +69 -0
- package/dist/src/adapters/SQLiteAdapter.d.ts.map +1 -0
- package/dist/src/adapters/SQLiteAdapter.js +308 -0
- package/dist/src/adapters/SQLiteAdapter.js.map +1 -0
- package/dist/src/adapters/index.d.ts +17 -0
- package/dist/src/adapters/index.d.ts.map +1 -0
- package/dist/src/adapters/index.js +11 -0
- package/dist/src/adapters/index.js.map +1 -0
- package/dist/src/constants/index.d.ts +10 -0
- package/dist/src/constants/index.d.ts.map +1 -0
- package/dist/src/constants/index.js +10 -0
- package/dist/src/constants/index.js.map +1 -0
- package/dist/src/core/Agent.d.ts +232 -0
- package/dist/src/core/Agent.d.ts.map +1 -0
- package/dist/src/core/Agent.js +737 -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/src/core/PersistenceManager.js +257 -0
- 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 +190 -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 +198 -0
- package/dist/src/core/ResponseEngine.js.map +1 -0
- package/dist/src/core/ResponseModal.d.ts +222 -0
- package/dist/src/core/ResponseModal.d.ts.map +1 -0
- package/dist/src/core/ResponseModal.js +1583 -0
- package/dist/src/core/ResponseModal.js.map +1 -0
- package/dist/src/core/ResponsePipeline.d.ts +175 -0
- package/dist/src/core/ResponsePipeline.d.ts.map +1 -0
- package/dist/src/core/ResponsePipeline.js +545 -0
- package/dist/src/core/ResponsePipeline.js.map +1 -0
- package/dist/src/core/Route.d.ts +181 -0
- package/dist/src/core/Route.d.ts.map +1 -0
- package/dist/src/core/Route.js +537 -0
- package/dist/src/core/Route.js.map +1 -0
- package/dist/src/core/RoutingEngine.d.ts +159 -0
- package/dist/src/core/RoutingEngine.d.ts.map +1 -0
- package/dist/src/core/RoutingEngine.js +957 -0
- package/dist/src/core/RoutingEngine.js.map +1 -0
- package/dist/src/core/SessionManager.d.ts +94 -0
- package/dist/src/core/SessionManager.d.ts.map +1 -0
- package/dist/src/core/SessionManager.js +235 -0
- package/dist/src/core/SessionManager.js.map +1 -0
- package/dist/src/core/Step.d.ts +170 -0
- package/dist/src/core/Step.d.ts.map +1 -0
- package/dist/src/core/Step.js +444 -0
- package/dist/src/core/Step.js.map +1 -0
- package/dist/src/core/ToolManager.d.ts +234 -0
- package/dist/src/core/ToolManager.d.ts.map +1 -0
- package/dist/src/core/ToolManager.js +1111 -0
- package/dist/src/core/ToolManager.js.map +1 -0
- package/dist/src/index.d.ts +44 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +37 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/providers/AnthropicProvider.d.ts +43 -0
- package/dist/src/providers/AnthropicProvider.d.ts.map +1 -0
- package/dist/src/providers/AnthropicProvider.js +370 -0
- package/dist/src/providers/AnthropicProvider.js.map +1 -0
- package/dist/src/providers/GeminiProvider.d.ts +58 -0
- package/dist/src/providers/GeminiProvider.d.ts.map +1 -0
- package/dist/src/providers/GeminiProvider.js +485 -0
- package/dist/src/providers/GeminiProvider.js.map +1 -0
- package/dist/src/providers/OpenAIProvider.d.ts +52 -0
- package/dist/src/providers/OpenAIProvider.d.ts.map +1 -0
- package/dist/src/providers/OpenAIProvider.js +388 -0
- package/dist/src/providers/OpenAIProvider.js.map +1 -0
- package/dist/src/providers/OpenRouterProvider.d.ts +56 -0
- package/dist/src/providers/OpenRouterProvider.d.ts.map +1 -0
- package/dist/src/providers/OpenRouterProvider.js +402 -0
- package/dist/src/providers/OpenRouterProvider.js.map +1 -0
- package/dist/src/providers/index.d.ts +13 -0
- package/dist/src/providers/index.d.ts.map +1 -0
- package/dist/src/providers/index.js +9 -0
- package/dist/src/providers/index.js.map +1 -0
- package/dist/src/types/agent.d.ts +181 -0
- package/dist/src/types/agent.d.ts.map +1 -0
- package/dist/src/types/agent.js +18 -0
- package/dist/src/types/agent.js.map +1 -0
- package/dist/src/types/ai.d.ts +143 -0
- package/dist/src/types/ai.d.ts.map +1 -0
- package/dist/src/types/ai.js +5 -0
- package/dist/src/types/ai.js.map +1 -0
- package/dist/src/types/history.d.ts +178 -0
- 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 +22 -0
- package/dist/src/types/index.d.ts.map +1 -0
- package/dist/src/types/index.js +12 -0
- package/dist/src/types/index.js.map +1 -0
- package/dist/src/types/persistence.d.ts +209 -0
- package/dist/src/types/persistence.d.ts.map +1 -0
- package/dist/src/types/persistence.js +6 -0
- package/dist/src/types/persistence.js.map +1 -0
- package/dist/src/types/route.d.ts +238 -0
- package/dist/src/types/route.d.ts.map +1 -0
- package/dist/src/types/route.js +5 -0
- package/dist/src/types/route.js.map +1 -0
- package/dist/src/types/routing.d.ts +16 -0
- package/dist/src/types/routing.d.ts.map +1 -0
- package/dist/src/types/routing.js +2 -0
- package/dist/src/types/routing.js.map +1 -0
- package/dist/src/types/schema.d.ts +22 -0
- package/dist/src/types/schema.d.ts.map +1 -0
- package/dist/src/types/schema.js +2 -0
- package/dist/src/types/schema.js.map +1 -0
- 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 +88 -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/src/types/tool.d.ts +130 -0
- package/dist/src/types/tool.d.ts.map +1 -0
- package/dist/src/types/tool.js +16 -0
- package/dist/src/types/tool.js.map +1 -0
- 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 +29 -0
- package/dist/src/utils/clone.js.map +1 -0
- package/dist/src/utils/condition.d.ts +38 -0
- package/dist/src/utils/condition.d.ts.map +1 -0
- package/dist/src/utils/condition.js +161 -0
- package/dist/src/utils/condition.js.map +1 -0
- package/dist/src/utils/event.d.ts +6 -0
- package/dist/src/utils/event.d.ts.map +1 -0
- package/dist/src/utils/event.js +17 -0
- package/dist/src/utils/event.js.map +1 -0
- package/dist/src/utils/history.d.ts +60 -0
- package/dist/src/utils/history.d.ts.map +1 -0
- package/dist/src/utils/history.js +263 -0
- package/dist/src/utils/history.js.map +1 -0
- package/dist/src/utils/id.d.ts +25 -0
- package/dist/src/utils/id.d.ts.map +1 -0
- package/dist/src/utils/id.js +64 -0
- package/dist/src/utils/id.js.map +1 -0
- package/dist/src/utils/index.d.ts +15 -0
- package/dist/src/utils/index.d.ts.map +1 -0
- package/dist/src/utils/index.js +23 -0
- package/dist/src/utils/index.js.map +1 -0
- package/dist/src/utils/json.d.ts +16 -0
- package/dist/src/utils/json.d.ts.map +1 -0
- package/dist/src/utils/json.js +43 -0
- package/dist/src/utils/json.js.map +1 -0
- package/dist/src/utils/logger.d.ts +10 -0
- package/dist/src/utils/logger.d.ts.map +1 -0
- package/dist/src/utils/logger.js +17 -0
- package/dist/src/utils/logger.js.map +1 -0
- package/dist/src/utils/retry.d.ts +10 -0
- package/dist/src/utils/retry.d.ts.map +1 -0
- package/dist/src/utils/retry.js +71 -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/src/utils/session.js +160 -0
- package/dist/src/utils/session.js.map +1 -0
- package/dist/src/utils/template.d.ts +155 -0
- package/dist/src/utils/template.d.ts.map +1 -0
- package/dist/src/utils/template.js +374 -0
- package/dist/src/utils/template.js.map +1 -0
- package/docs/CONTRIBUTING.md +521 -0
- package/docs/README.md +228 -0
- package/docs/api/README.md +3258 -0
- package/docs/api/overview.md +1134 -0
- package/docs/architecture/data-extraction-flow.md +363 -0
- package/docs/core/agent/README.md +902 -0
- package/docs/core/agent/context-management.md +796 -0
- package/docs/core/agent/session-management.md +641 -0
- 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 +287 -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 +247 -0
- package/docs/core/conversation-flows/step-transitions.md +595 -0
- package/docs/core/conversation-flows/steps.md +154 -0
- package/docs/core/error-handling.md +638 -0
- package/docs/core/persistence/adapters.md +255 -0
- package/docs/core/persistence/session-storage.md +644 -0
- package/docs/core/routing/intelligent-routing.md +466 -0
- package/docs/core/tools/tool-definition.md +970 -0
- package/docs/core/tools/tool-scoping.md +819 -0
- package/docs/guides/advanced-patterns/publishing.md +186 -0
- package/docs/guides/error-handling-patterns.md +578 -0
- package/docs/guides/getting-started/README.md +696 -0
- package/docs/guides/migration/README.md +72 -0
- package/docs/guides/migration/flexible-routing-conditions.md +375 -0
- package/docs/guides/migration/response-modal-refactor.md +518 -0
- package/examples/advanced-patterns/knowledge-based-agent.ts +735 -0
- package/examples/advanced-patterns/persistent-onboarding.ts +728 -0
- package/examples/advanced-patterns/route-lifecycle-hooks.ts +556 -0
- package/examples/advanced-patterns/streaming-responses.ts +578 -0
- package/examples/ai-providers/anthropic-integration.ts +388 -0
- package/examples/ai-providers/openai-integration.ts +228 -0
- package/examples/condition-patterns/function-only-conditions.ts +365 -0
- package/examples/condition-patterns/mixed-array-conditions.ts +477 -0
- package/examples/condition-patterns/route-skipif-patterns.ts +468 -0
- package/examples/condition-patterns/step-skipif-patterns.ts +0 -0
- package/examples/condition-patterns/string-only-conditions.ts +296 -0
- package/examples/conversation-flows/completion-transitions.ts +318 -0
- package/examples/core-concepts/basic-agent.ts +503 -0
- package/examples/core-concepts/modern-streaming-api.ts +309 -0
- package/examples/core-concepts/schema-driven-extraction.ts +332 -0
- package/examples/core-concepts/session-management.ts +494 -0
- package/examples/integrations/database-integration.ts +630 -0
- package/examples/integrations/healthcare-integration.ts +595 -0
- package/examples/integrations/search-integration.ts +530 -0
- package/examples/integrations/server-session-management.ts +307 -0
- package/examples/persistence/custom-adapter.ts +529 -0
- package/examples/persistence/database-persistence.ts +583 -0
- package/examples/persistence/memory-sessions.ts +495 -0
- package/examples/persistence/prisma-schema.example.prisma +74 -0
- package/examples/persistence/redis-persistence.ts +488 -0
- package/examples/tools/basic-tools.ts +765 -0
- package/examples/tools/data-enrichment-tools.ts +593 -0
- package/package.json +125 -0
- package/src/adapters/MemoryAdapter.ts +273 -0
- package/src/adapters/MongoAdapter.ts +304 -0
- package/src/adapters/OpenSearchAdapter.ts +670 -0
- package/src/adapters/PostgreSQLAdapter.ts +428 -0
- package/src/adapters/PrismaAdapter.ts +553 -0
- package/src/adapters/RedisAdapter.ts +377 -0
- package/src/adapters/SQLiteAdapter.ts +459 -0
- package/src/adapters/index.ts +43 -0
- package/src/constants/index.ts +10 -0
- package/src/core/Agent.ts +970 -0
- package/src/core/Events.ts +164 -0
- package/src/core/PersistenceManager.ts +353 -0
- package/src/core/PromptComposer.ts +253 -0
- package/src/core/ResponseEngine.ts +306 -0
- package/src/core/ResponseModal.ts +2050 -0
- package/src/core/ResponsePipeline.ts +864 -0
- package/src/core/Route.ts +677 -0
- package/src/core/RoutingEngine.ts +1396 -0
- package/src/core/SessionManager.ts +297 -0
- package/src/core/Step.ts +593 -0
- package/src/core/ToolManager.ts +1394 -0
- package/src/index.ts +155 -0
- package/src/providers/AnthropicProvider.ts +560 -0
- package/src/providers/GeminiProvider.ts +683 -0
- package/src/providers/OpenAIProvider.ts +602 -0
- package/src/providers/OpenRouterProvider.ts +613 -0
- package/src/providers/index.ts +16 -0
- package/src/types/agent.ts +196 -0
- package/src/types/ai.ts +158 -0
- package/src/types/history.ts +206 -0
- package/src/types/index.ts +119 -0
- package/src/types/persistence.ts +251 -0
- package/src/types/route.ts +272 -0
- package/src/types/routing.ts +18 -0
- package/src/types/schema.ts +23 -0
- package/src/types/session.ts +74 -0
- package/src/types/template.ts +104 -0
- package/src/types/tool.ts +174 -0
- package/src/utils/clone.ts +34 -0
- package/src/utils/condition.ts +190 -0
- package/src/utils/event.ts +16 -0
- package/src/utils/history.ts +306 -0
- package/src/utils/id.ts +73 -0
- package/src/utils/index.ts +69 -0
- package/src/utils/json.ts +46 -0
- package/src/utils/logger.ts +19 -0
- package/src/utils/retry.ts +97 -0
- package/src/utils/session.ts +204 -0
- package/src/utils/template.ts +444 -0
package/README.md
ADDED
|
@@ -0,0 +1,797 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
|
|
3
|
+
# 🤖 @falai/agent
|
|
4
|
+
|
|
5
|
+
### Type-Safe AI Conversational Agents That Actually Work in Production
|
|
6
|
+
|
|
7
|
+
**Schema-driven data extraction • Predictable conversations • Enterprise-ready**
|
|
8
|
+
|
|
9
|
+
[](https://www.typescriptlang.org/)
|
|
10
|
+
[](./LICENSE)
|
|
11
|
+
[](https://bun.sh)
|
|
12
|
+
[](https://falai.dev)
|
|
13
|
+
|
|
14
|
+
[🌐 Website](https://falai.dev) • [Features](#-features) • [Installation](#-installation) • [Quick Start](#-quick-start) • [Documentation](#-documentation) • [Examples](#-examples)
|
|
15
|
+
|
|
16
|
+
</div>
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## ⚡ The @falai/agent Difference
|
|
21
|
+
|
|
22
|
+
### Traditional AI Chat:
|
|
23
|
+
|
|
24
|
+
```typescript
|
|
25
|
+
// User: "I want to book the Grand Hotel for 2 people next Friday"
|
|
26
|
+
// AI: "Sure! Which hotel would you like?" // 😠 Asked already!
|
|
27
|
+
// User: "Grand Hotel"
|
|
28
|
+
// AI: "How many guests?" // 😠 You just told me!
|
|
29
|
+
// User: "2 people"
|
|
30
|
+
// AI: "What date?" // 😠 I said Friday!
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### With @falai/agent:
|
|
34
|
+
|
|
35
|
+
```typescript
|
|
36
|
+
// User: "I want to book the Grand Hotel for 2 people next Friday"
|
|
37
|
+
// AI: "Perfect! Booking confirmed for 2 guests at Grand Hotel on Friday!"
|
|
38
|
+
// ✅ Extracted all data from one message
|
|
39
|
+
// ✅ Skipped unnecessary steps
|
|
40
|
+
// ✅ Completed immediately
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
**No more repetitive questions. No more guessing what the AI will ask next.**
|
|
44
|
+
|
|
45
|
+
**Intelligent Pre-Extraction** - AI automatically captures ALL relevant data from user messages, then determines which step to start at based on what's missing.
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## 🤔 Why @falai/agent?
|
|
50
|
+
|
|
51
|
+
After building production AI applications, we found existing solutions either:
|
|
52
|
+
|
|
53
|
+
- **Too unpredictable** - AI decides everything, including which tools to call (unreliable in production)
|
|
54
|
+
- **Too complex** - Heavy Python frameworks with massive dependencies
|
|
55
|
+
- **Too basic** - No structured data extraction or step management
|
|
56
|
+
|
|
57
|
+
@falai/agent gives you **predictable AI** - the creativity of LLMs with the reliability of code.
|
|
58
|
+
|
|
59
|
+
**The key insight:** Let AI do what it's good at (understanding intent, generating responses, extracting data), and let TypeScript handle the rest (step logic, tool execution, validation).
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## 🌟 Features
|
|
64
|
+
|
|
65
|
+
<table>
|
|
66
|
+
<tr>
|
|
67
|
+
<td width="50%">
|
|
68
|
+
|
|
69
|
+
### 🎯 **Developer Experience**
|
|
70
|
+
|
|
71
|
+
- **Fully Type-Safe** - Generic `Agent<TContext>` with complete inference
|
|
72
|
+
- **Fluent API** - Chainable methods for elegant code
|
|
73
|
+
- **Modular Design** - Use what you need, when you need it
|
|
74
|
+
|
|
75
|
+
</td>
|
|
76
|
+
<td width="50%">
|
|
77
|
+
|
|
78
|
+
### 🚀 **Production Ready**
|
|
79
|
+
|
|
80
|
+
- **Robust Retry Logic** - Exponential backoff & backup models
|
|
81
|
+
- **AI Provider Strategy** - Pluggable backends (Claude, Gemini, OpenAI, OpenRouter)
|
|
82
|
+
- **Prompt Composition** - Sophisticated prompt building system
|
|
83
|
+
|
|
84
|
+
</td>
|
|
85
|
+
</tr>
|
|
86
|
+
<tr>
|
|
87
|
+
<td width="50%">
|
|
88
|
+
|
|
89
|
+
### 🛤️ **Data-Driven Conversations**
|
|
90
|
+
|
|
91
|
+
- **Intelligent Pre-Extraction** - Automatically extract data BEFORE entering steps
|
|
92
|
+
- **Schema-First Extraction** - Define data contracts with JSON Schema
|
|
93
|
+
- **Automatic Route Completion** - Routes complete when required fields are collected
|
|
94
|
+
- **Smart Step Skipping** - Skip steps whose data is already present
|
|
95
|
+
- **Always-On Routing** - Context-aware routing between different flows
|
|
96
|
+
|
|
97
|
+
</td>
|
|
98
|
+
<td width="50%">
|
|
99
|
+
|
|
100
|
+
### 🔧 **Tools & Data Integration**
|
|
101
|
+
|
|
102
|
+
- **Advanced Tool System** - Context-aware tools with data access and lifecycle integration
|
|
103
|
+
- **Dynamic Tool Calling** - AI can call tools during streaming responses
|
|
104
|
+
- **Tool Result Processing** - Tools update context and collected data automatically
|
|
105
|
+
|
|
106
|
+
</td>
|
|
107
|
+
</tr>
|
|
108
|
+
<tr>
|
|
109
|
+
<td width="50%">
|
|
110
|
+
|
|
111
|
+
### 💾 **Optional Persistence**
|
|
112
|
+
|
|
113
|
+
- **Auto-Save** - Automatically persist conversation data and progress
|
|
114
|
+
- **Extensible Adapters** - Use built-in (Prisma, Redis, etc.) or create your own
|
|
115
|
+
- **Custom DB Support** - Integrate with your existing database schemas
|
|
116
|
+
|
|
117
|
+
</td>
|
|
118
|
+
<td width="50%">
|
|
119
|
+
|
|
120
|
+
### 🎯 **Session-Aware Routing**
|
|
121
|
+
|
|
122
|
+
- **Always-On Routing** - Users can change their mind mid-conversation
|
|
123
|
+
- **Context Awareness** - Router sees current progress and collected data
|
|
124
|
+
|
|
125
|
+
</td>
|
|
126
|
+
</tr>
|
|
127
|
+
<tr>
|
|
128
|
+
<td width="50%">
|
|
129
|
+
|
|
130
|
+
### 🚀 **Advanced Features**
|
|
131
|
+
|
|
132
|
+
- **Streaming Responses** - Real-time response generation with tool execution
|
|
133
|
+
- **Lifecycle Hooks** - `prepare`/`finalize` functions or tools on steps, context/data update hooks
|
|
134
|
+
- **Sequential Steps** - Define linear conversation flows with `steps` array
|
|
135
|
+
- **Route Transitions** - Automatic flow transitions when routes complete
|
|
136
|
+
- **Smart Step Control** - `skipIf` and `requires` for data-driven flow control
|
|
137
|
+
|
|
138
|
+
</td>
|
|
139
|
+
<td width="50%">
|
|
140
|
+
|
|
141
|
+
### 🎨 **Behavioral Control**
|
|
142
|
+
|
|
143
|
+
- **Guidelines & Rules** - Define agent behavior patterns and restrictions
|
|
144
|
+
- **Route-Specific Logic** - Different rules for different conversation contexts
|
|
145
|
+
- **Knowledge Base** - Structured information available to AI during responses
|
|
146
|
+
- **Session Step** - Track conversation progress across turns
|
|
147
|
+
|
|
148
|
+
</td>
|
|
149
|
+
</tr>
|
|
150
|
+
</table>
|
|
151
|
+
|
|
152
|
+
---
|
|
153
|
+
|
|
154
|
+
## 📦 Installation
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
# Using bun (recommended)
|
|
158
|
+
bun add @falai/agent
|
|
159
|
+
|
|
160
|
+
# Using npm
|
|
161
|
+
npm install @falai/agent
|
|
162
|
+
|
|
163
|
+
# Using yarn
|
|
164
|
+
yarn add @falai/agent
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
> **Requirements:** Node.js 18+ or Bun 1.0+
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
## 🚀 Quick Start
|
|
172
|
+
|
|
173
|
+
### Level 1: Your First Agent (30 seconds)
|
|
174
|
+
|
|
175
|
+
Create a minimal conversational agent:
|
|
176
|
+
|
|
177
|
+
```typescript
|
|
178
|
+
import {
|
|
179
|
+
Agent,
|
|
180
|
+
GeminiProvider,
|
|
181
|
+
createMessageEvent,
|
|
182
|
+
EventSource,
|
|
183
|
+
} from "@falai/agent";
|
|
184
|
+
|
|
185
|
+
// Create your agent
|
|
186
|
+
const agent = new Agent({
|
|
187
|
+
name: "Assistant",
|
|
188
|
+
description: "A helpful assistant",
|
|
189
|
+
provider: new GeminiProvider({
|
|
190
|
+
apiKey: process.env.GEMINI_API_KEY!,
|
|
191
|
+
model: "models/gemini-2.5-flash",
|
|
192
|
+
}),
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
// Create a simple route with sequential steps
|
|
196
|
+
agent.createRoute({
|
|
197
|
+
title: "General Help",
|
|
198
|
+
description: "Answers user questions",
|
|
199
|
+
when: ["User needs help or asks a question"],
|
|
200
|
+
steps: [
|
|
201
|
+
{
|
|
202
|
+
id: "answer_question",
|
|
203
|
+
description: "Answer the user's question helpfully",
|
|
204
|
+
prompt: "Answer the user's question helpfully",
|
|
205
|
+
},
|
|
206
|
+
],
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
// Start chatting - simple message-based API
|
|
210
|
+
const response = await agent.respond("What can you do?");
|
|
211
|
+
|
|
212
|
+
console.log(response.message);
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
**That's it!** You now have a working conversational AI agent.
|
|
216
|
+
|
|
217
|
+
---
|
|
218
|
+
|
|
219
|
+
## 🎯 Advanced Routing with ConditionTemplate
|
|
220
|
+
|
|
221
|
+
### Flexible Route Conditions
|
|
222
|
+
|
|
223
|
+
Routes now support powerful condition patterns that combine AI context with programmatic logic:
|
|
224
|
+
|
|
225
|
+
```typescript
|
|
226
|
+
// String-only conditions (AI context for routing decisions)
|
|
227
|
+
agent.createRoute({
|
|
228
|
+
title: "Customer Support",
|
|
229
|
+
when: "User needs help with their account",
|
|
230
|
+
steps: [/* ... */]
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
// Function-only conditions (programmatic evaluation)
|
|
234
|
+
agent.createRoute({
|
|
235
|
+
title: "Premium Features",
|
|
236
|
+
when: (ctx) => ctx.data?.userType === 'premium',
|
|
237
|
+
steps: [/* ... */]
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
// Mixed array conditions (AI context + programmatic logic)
|
|
241
|
+
agent.createRoute({
|
|
242
|
+
title: "Booking Assistance",
|
|
243
|
+
when: [
|
|
244
|
+
"User wants to make a reservation", // AI context
|
|
245
|
+
(ctx) => ctx.data?.isLoggedIn === true // Programmatic check
|
|
246
|
+
],
|
|
247
|
+
steps: [/* ... */]
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
// Route skipIf - exclude routes dynamically
|
|
251
|
+
agent.createRoute({
|
|
252
|
+
title: "Payment Processing",
|
|
253
|
+
when: ["User wants to make a payment"],
|
|
254
|
+
skipIf: [
|
|
255
|
+
"Payment system is under maintenance", // AI context
|
|
256
|
+
(ctx) => ctx.data?.paymentBlocked === true // Programmatic check
|
|
257
|
+
],
|
|
258
|
+
steps: [/* ... */]
|
|
259
|
+
});
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
### Enhanced Step Conditions
|
|
263
|
+
|
|
264
|
+
Steps support the same flexible condition patterns:
|
|
265
|
+
|
|
266
|
+
```typescript
|
|
267
|
+
agent.createRoute({
|
|
268
|
+
title: "Order Process",
|
|
269
|
+
steps: [
|
|
270
|
+
{
|
|
271
|
+
id: "collect_items",
|
|
272
|
+
when: "User wants to add items to cart",
|
|
273
|
+
prompt: "What would you like to order?",
|
|
274
|
+
collect: ["items"]
|
|
275
|
+
},
|
|
276
|
+
{
|
|
277
|
+
id: "payment_step",
|
|
278
|
+
when: [
|
|
279
|
+
"Ready to process payment", // AI context
|
|
280
|
+
(ctx) => ctx.data?.items?.length > 0 // Programmatic check
|
|
281
|
+
],
|
|
282
|
+
skipIf: (ctx) => ctx.data?.paymentComplete === true,
|
|
283
|
+
prompt: "Let's process your payment",
|
|
284
|
+
tools: ["process_payment"]
|
|
285
|
+
},
|
|
286
|
+
{
|
|
287
|
+
id: "confirmation",
|
|
288
|
+
when: "Order is ready for confirmation",
|
|
289
|
+
skipIf: [
|
|
290
|
+
"Order already confirmed", // AI context
|
|
291
|
+
(ctx) => ctx.data?.orderConfirmed === true // Programmatic check
|
|
292
|
+
],
|
|
293
|
+
prompt: "Your order is confirmed!",
|
|
294
|
+
finalize: "send_confirmation_email"
|
|
295
|
+
}
|
|
296
|
+
]
|
|
297
|
+
});
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
### Dynamic Guidelines
|
|
301
|
+
|
|
302
|
+
Guidelines now support flexible conditions for context-aware behavior:
|
|
303
|
+
|
|
304
|
+
```typescript
|
|
305
|
+
// Add guidelines with mixed condition types
|
|
306
|
+
agent.addGuideline({
|
|
307
|
+
title: "Premium User Support",
|
|
308
|
+
condition: [
|
|
309
|
+
"User is asking for help", // AI context
|
|
310
|
+
(ctx) => ctx.data?.userType === 'premium' // Programmatic check
|
|
311
|
+
],
|
|
312
|
+
content: "Provide priority support with detailed explanations and offer direct phone support."
|
|
313
|
+
});
|
|
314
|
+
|
|
315
|
+
agent.addGuideline({
|
|
316
|
+
title: "Maintenance Mode",
|
|
317
|
+
condition: "System maintenance is active",
|
|
318
|
+
content: "Inform users about scheduled maintenance and provide estimated completion time."
|
|
319
|
+
});
|
|
320
|
+
|
|
321
|
+
// Function-only guideline for specific conditions
|
|
322
|
+
agent.addGuideline({
|
|
323
|
+
title: "High Value Customer",
|
|
324
|
+
condition: (ctx) => ctx.data?.totalSpent > 10000,
|
|
325
|
+
content: "Offer VIP treatment and exclusive deals."
|
|
326
|
+
});
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
**Key Benefits:**
|
|
330
|
+
|
|
331
|
+
- ✅ **Hybrid Logic** - Combine AI understanding with programmatic precision
|
|
332
|
+
- ✅ **Context Awareness** - AI sees string conditions for better routing decisions
|
|
333
|
+
- ✅ **Performance** - Functions execute first, strings only used when needed
|
|
334
|
+
- ✅ **Flexibility** - Use simple strings, functions, or arrays as needed
|
|
335
|
+
|
|
336
|
+
---
|
|
337
|
+
|
|
338
|
+
## 🔧 Advanced Step Configuration
|
|
339
|
+
|
|
340
|
+
### Simple Tool Creation
|
|
341
|
+
|
|
342
|
+
Create tools with minimal boilerplate using the unified Tool interface:
|
|
343
|
+
|
|
344
|
+
```typescript
|
|
345
|
+
// Create a simple tool with the unified interface
|
|
346
|
+
agent.addTool({
|
|
347
|
+
id: "validate_user",
|
|
348
|
+
name: "User Data Validator",
|
|
349
|
+
description: "Validate user data before processing",
|
|
350
|
+
parameters: { type: "object", properties: {} },
|
|
351
|
+
handler: async ({ context, data, updateData }) => {
|
|
352
|
+
// Validation logic with helper methods
|
|
353
|
+
if (!data.email?.includes("@")) {
|
|
354
|
+
throw new Error("Invalid email address");
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
// Mark as validated using helper method
|
|
358
|
+
await updateData({ emailValidated: true });
|
|
359
|
+
|
|
360
|
+
return "User validation completed successfully";
|
|
361
|
+
},
|
|
362
|
+
});
|
|
363
|
+
|
|
364
|
+
// Use tools in conversation flows and step lifecycle
|
|
365
|
+
agent.createRoute({
|
|
366
|
+
title: "User Registration",
|
|
367
|
+
steps: [
|
|
368
|
+
{
|
|
369
|
+
id: "collect_info",
|
|
370
|
+
description: "Collect user information",
|
|
371
|
+
collect: ["name", "email"],
|
|
372
|
+
prompt: "Please provide your name and email.",
|
|
373
|
+
prepare: "validate_user", // Tool executes before AI response
|
|
374
|
+
tools: ["validate_user"], // Tool available during conversation
|
|
375
|
+
},
|
|
376
|
+
],
|
|
377
|
+
});
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
**Benefits:**
|
|
381
|
+
|
|
382
|
+
- ✅ **Simple API** - Unified Tool interface with minimal complexity
|
|
383
|
+
- ✅ **Type Safety** - Full TypeScript support with automatic inference
|
|
384
|
+
- ✅ **Flexible Returns** - Return simple values or complex ToolResult objects
|
|
385
|
+
- ✅ **Helper Methods** - Built-in context and data update utilities
|
|
386
|
+
- ✅ **Lifecycle Integration** - Use tools as prepare/finalize hooks in steps
|
|
387
|
+
|
|
388
|
+
---
|
|
389
|
+
|
|
390
|
+
### Level 2: Data Extraction (The Real Power)
|
|
391
|
+
|
|
392
|
+
Now let's build an agent that intelligently collects structured data:
|
|
393
|
+
|
|
394
|
+
```typescript
|
|
395
|
+
import {
|
|
396
|
+
Agent,
|
|
397
|
+
OpenAIProvider,
|
|
398
|
+
createMessageEvent,
|
|
399
|
+
EventSource,
|
|
400
|
+
} from "@falai/agent";
|
|
401
|
+
|
|
402
|
+
// 1️⃣ Define the data you want to collect
|
|
403
|
+
interface HotelBookingData {
|
|
404
|
+
hotelName: string;
|
|
405
|
+
date: string;
|
|
406
|
+
guests: number;
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
// 2️⃣ Create your agent with centralized data schema
|
|
410
|
+
const agent = new Agent<{}, HotelBookingData>({
|
|
411
|
+
name: "BookingBot",
|
|
412
|
+
description: "A hotel booking assistant that collects information.",
|
|
413
|
+
provider: new OpenAIProvider({
|
|
414
|
+
apiKey: process.env.OPENAI_API_KEY,
|
|
415
|
+
model: "gpt-4", // or your preferred model
|
|
416
|
+
}),
|
|
417
|
+
|
|
418
|
+
// Agent-level schema defines all possible data fields
|
|
419
|
+
schema: {
|
|
420
|
+
type: "object",
|
|
421
|
+
properties: {
|
|
422
|
+
hotelName: { type: "string", description: "The name of the hotel." },
|
|
423
|
+
date: { type: "string", description: "The desired booking date." },
|
|
424
|
+
guests: { type: "number", description: "The number of guests." },
|
|
425
|
+
},
|
|
426
|
+
required: ["hotelName", "date", "guests"],
|
|
427
|
+
},
|
|
428
|
+
|
|
429
|
+
// Agent-level data validation and enrichment
|
|
430
|
+
hooks: {
|
|
431
|
+
onDataUpdate: async (data, previousData) => {
|
|
432
|
+
// Auto-validate and enrich data
|
|
433
|
+
if (data.guests && data.guests > 10) {
|
|
434
|
+
throw new Error("Maximum 10 guests allowed");
|
|
435
|
+
}
|
|
436
|
+
return data;
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
});
|
|
440
|
+
|
|
441
|
+
// 3️⃣ Define a tool using the unified Tool interface
|
|
442
|
+
agent.addTool({
|
|
443
|
+
id: "book_hotel",
|
|
444
|
+
name: "Hotel Booking System",
|
|
445
|
+
description: "Books a hotel once all information is collected.",
|
|
446
|
+
parameters: { type: "object", properties: {} },
|
|
447
|
+
handler: async ({ context, data, updateContext }) => {
|
|
448
|
+
// Tool receives complete agent data with simplified context and helper methods
|
|
449
|
+
const bookingId = await hotelAPI.createBooking({
|
|
450
|
+
hotel: data.hotelName,
|
|
451
|
+
date: data.date,
|
|
452
|
+
guests: data.guests,
|
|
453
|
+
});
|
|
454
|
+
|
|
455
|
+
// Use helper method to update context
|
|
456
|
+
await updateContext({
|
|
457
|
+
lastBookingId: bookingId,
|
|
458
|
+
lastBookingDate: new Date().toISOString(),
|
|
459
|
+
});
|
|
460
|
+
|
|
461
|
+
return `Booking confirmed! Confirmation #${bookingId} for ${data.guests} guests at ${data.hotelName} on ${data.date}`;
|
|
462
|
+
},
|
|
463
|
+
});
|
|
464
|
+
|
|
465
|
+
// 4️⃣ Create a route with required fields specification
|
|
466
|
+
agent.createRoute({
|
|
467
|
+
title: "Book Hotel",
|
|
468
|
+
description: "Guides the user through the hotel booking process.",
|
|
469
|
+
when: ["User wants to book a hotel"],
|
|
470
|
+
requiredFields: ["hotelName", "date", "guests"], // Required for route completion
|
|
471
|
+
|
|
472
|
+
// 5️⃣ Define the flow to collect data step-by-step
|
|
473
|
+
steps: [
|
|
474
|
+
{
|
|
475
|
+
id: "ask_hotel",
|
|
476
|
+
description: "Ask which hotel they want to book",
|
|
477
|
+
prompt: "Which hotel would you like to book?",
|
|
478
|
+
collect: ["hotelName"],
|
|
479
|
+
skipIf: (data: Partial<HotelBookingData>) => !!data.hotelName,
|
|
480
|
+
},
|
|
481
|
+
{
|
|
482
|
+
id: "ask_date",
|
|
483
|
+
description: "Ask for the booking date",
|
|
484
|
+
prompt: "What date would you like to book for?",
|
|
485
|
+
collect: ["date"],
|
|
486
|
+
requires: ["hotelName"], // Prerequisites from agent data
|
|
487
|
+
skipIf: (data: Partial<HotelBookingData>) => !!data.date,
|
|
488
|
+
},
|
|
489
|
+
{
|
|
490
|
+
id: "ask_guests",
|
|
491
|
+
description: "Ask for the number of guests",
|
|
492
|
+
prompt: "How many guests will be staying?",
|
|
493
|
+
collect: ["guests"],
|
|
494
|
+
requires: ["hotelName", "date"], // Prerequisites from agent data
|
|
495
|
+
skipIf: (data: Partial<HotelBookingData>) => data.guests !== undefined,
|
|
496
|
+
},
|
|
497
|
+
{
|
|
498
|
+
id: "confirm_booking",
|
|
499
|
+
description: "Confirm and book the hotel",
|
|
500
|
+
prompt: "Let me confirm your booking details.",
|
|
501
|
+
tools: ["book_hotel"], // Reference tool by ID
|
|
502
|
+
requires: ["hotelName", "date", "guests"],
|
|
503
|
+
},
|
|
504
|
+
],
|
|
505
|
+
});
|
|
506
|
+
|
|
507
|
+
// 5️⃣ Start conversing - simple message API
|
|
508
|
+
const response = await agent.respond("I want to book a room at the Grand Hotel for 2 people.");
|
|
509
|
+
|
|
510
|
+
// The agent sees that `hotelName` and `guests` are provided,
|
|
511
|
+
// skips the first and third steps, and only asks for the date.
|
|
512
|
+
console.log(response.message);
|
|
513
|
+
// Expected: "What date would you like to book for?"
|
|
514
|
+
```
|
|
515
|
+
|
|
516
|
+
**That's it!** The data-driven agent will:
|
|
517
|
+
|
|
518
|
+
- ✅ **Understand the Goal** - Route to the `Book Hotel` flow based on user intent.
|
|
519
|
+
- ✅ **Extract Known Data** - Automatically pull `hotelName` and `guests` from the first message.
|
|
520
|
+
- ✅ **Skip Unneeded Steps** - Use `skipIf` to bypass questions for data it already has.
|
|
521
|
+
- ✅ **Collect Missing Data** - Intelligently ask only for the missing `date`.
|
|
522
|
+
- ✅ **Execute Deterministically** - Call the `bookHotel` tool only when all required data is present.
|
|
523
|
+
|
|
524
|
+
This creates a flexible and natural conversation, guided by a clear data structure.
|
|
525
|
+
|
|
526
|
+
📖 **[See more examples →](./examples/)** | **[Full tutorial →](./docs/guides/getting-started/README.md)**
|
|
527
|
+
|
|
528
|
+
### ⚡ Advanced Features
|
|
529
|
+
|
|
530
|
+
**Streaming responses** for real-time UX:
|
|
531
|
+
|
|
532
|
+
```typescript
|
|
533
|
+
for await (const chunk of agent.respondStream("Hello")) {
|
|
534
|
+
process.stdout.write(chunk.delta);
|
|
535
|
+
if (chunk.done) {
|
|
536
|
+
console.log("\nTool calls:", chunk.toolCalls);
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
```
|
|
540
|
+
|
|
541
|
+
**Automatic session management** for multi-turn conversations:
|
|
542
|
+
|
|
543
|
+
```typescript
|
|
544
|
+
// Server-side: Create agent with sessionId
|
|
545
|
+
const agent = new Agent({
|
|
546
|
+
name: "Assistant",
|
|
547
|
+
provider: new OpenAIProvider({ apiKey: process.env.OPENAI_API_KEY }),
|
|
548
|
+
persistence: { adapter: new PrismaAdapter({ prisma }) },
|
|
549
|
+
sessionId: "user-123" // Automatically loads or creates session
|
|
550
|
+
});
|
|
551
|
+
|
|
552
|
+
// Simple conversation - no manual session management needed
|
|
553
|
+
const response = await agent.respond("Hello, how are you?");
|
|
554
|
+
console.log(response.message);
|
|
555
|
+
console.log(agent.session.id); // Session ID for client
|
|
556
|
+
```
|
|
557
|
+
|
|
558
|
+
**Automatic session persistence** with any adapter:
|
|
559
|
+
|
|
560
|
+
```typescript
|
|
561
|
+
import { PrismaAdapter } from "@falai/agent";
|
|
562
|
+
|
|
563
|
+
// Server endpoint - sessions managed automatically
|
|
564
|
+
app.post('/chat', async (req, res) => {
|
|
565
|
+
const { sessionId, message } = req.body;
|
|
566
|
+
|
|
567
|
+
const agent = new Agent({
|
|
568
|
+
name: "ChatBot",
|
|
569
|
+
provider: new OpenAIProvider({ apiKey: process.env.OPENAI_API_KEY }),
|
|
570
|
+
persistence: { adapter: new PrismaAdapter({ prisma }) },
|
|
571
|
+
sessionId // Automatically loads or creates this session
|
|
572
|
+
});
|
|
573
|
+
|
|
574
|
+
const response = await agent.respond(message);
|
|
575
|
+
|
|
576
|
+
res.json({
|
|
577
|
+
message: response.message,
|
|
578
|
+
sessionId: agent.session.id, // Return session ID to client
|
|
579
|
+
isComplete: response.isRouteComplete
|
|
580
|
+
});
|
|
581
|
+
});
|
|
582
|
+
```
|
|
583
|
+
|
|
584
|
+
📖 **[See full feature docs →](./docs)**
|
|
585
|
+
|
|
586
|
+
---
|
|
587
|
+
|
|
588
|
+
## 📚 Documentation
|
|
589
|
+
|
|
590
|
+
📋 **[Complete Documentation Index →](docs/README.md)** - Searchable index of all docs
|
|
591
|
+
|
|
592
|
+
### 🚀 Getting Started
|
|
593
|
+
|
|
594
|
+
- **[Quick Start Guide](./docs/guides/getting-started/README.md)** - Build your first agent in 15 minutes
|
|
595
|
+
|
|
596
|
+
### 🏗️ Core Framework
|
|
597
|
+
|
|
598
|
+
- **[Agent Orchestration](./docs/core/agent/README.md)** - Agent lifecycle, configuration & hooks
|
|
599
|
+
- **[Context Management](./docs/core/agent/context-management.md)** - Dynamic context providers & updates
|
|
600
|
+
- **[Session Management](./docs/core/agent/session-management.md)** - Session persistence & state
|
|
601
|
+
|
|
602
|
+
### 💬 Conversation Flows
|
|
603
|
+
|
|
604
|
+
- **[Routes](./docs/core/conversation-flows/routes.md)** - Route definition & lifecycle
|
|
605
|
+
- **[Steps](./docs/core/conversation-flows/steps.md)** - Step transitions & logic
|
|
606
|
+
|
|
607
|
+
### 🤖 AI Integration
|
|
608
|
+
|
|
609
|
+
- **[AI Providers](./docs/core/ai-integration/providers.md)** - Gemini, OpenAI, Anthropic, OpenRouter
|
|
610
|
+
- **[Prompt Composition](./docs/core/ai-integration/prompt-composition/)** - How prompts are built
|
|
611
|
+
- **[Response Processing](./docs/core/ai-integration/response-processing/)** - Schema extraction & tool calls
|
|
612
|
+
|
|
613
|
+
### 🔧 Tools & Data
|
|
614
|
+
|
|
615
|
+
- **[Tool Definition](./docs/core/tools/tool-definition.md)** - Creating and configuring tools
|
|
616
|
+
- **[Tool Execution](./docs/core/tools/tool-execution.md)** - Dynamic tool calling and context updates
|
|
617
|
+
- **[Tool Scoping](./docs/core/tools/tool-scoping.md)** - Agent, route, and step-level tool management
|
|
618
|
+
|
|
619
|
+
### 💾 Persistence
|
|
620
|
+
|
|
621
|
+
- **[Session Storage](./docs/core/persistence/session-storage.md)** - Session persistence patterns
|
|
622
|
+
- **[Database Adapters](./docs/core/persistence/adapters.md)** - Built-in adapter configurations
|
|
623
|
+
|
|
624
|
+
### 🚀 Advanced Guides
|
|
625
|
+
|
|
626
|
+
- **[Building Agents](./docs/guides/building-agents/)** - Complete agent construction patterns
|
|
627
|
+
- **[Advanced Patterns](./docs/guides/advanced-patterns/)** - Complex use cases & integrations
|
|
628
|
+
- **[API Reference](./docs/api/overview.md)** - Complete API documentation
|
|
629
|
+
|
|
630
|
+
---
|
|
631
|
+
|
|
632
|
+
## 🎯 Examples - By Domain
|
|
633
|
+
|
|
634
|
+
### 🏗️ Core Concepts
|
|
635
|
+
|
|
636
|
+
Fundamental patterns every agent needs:
|
|
637
|
+
|
|
638
|
+
- **[Basic Agent](./examples/core-concepts/basic-agent.ts)** - Minimal agent setup and configuration
|
|
639
|
+
- **[Schema-Driven Extraction](./examples/core-concepts/schema-driven-extraction.ts)** - Type-safe data collection with JSON Schema
|
|
640
|
+
- **[Session Management](./examples/core-concepts/session-management.ts)** - Multi-turn conversations with persistence
|
|
641
|
+
- **[Context Providers](./examples/core-concepts/context-providers.ts)** - Dynamic context fetching and updates
|
|
642
|
+
|
|
643
|
+
### 💬 Conversation Flows
|
|
644
|
+
|
|
645
|
+
Building intelligent dialogue systems:
|
|
646
|
+
|
|
647
|
+
- **[Simple Route](./examples/conversation-flows/simple-route.ts)** - Basic route with linear step progression
|
|
648
|
+
- **[Data-Driven Flows](./examples/conversation-flows/data-driven-flows.ts)** - Conditional logic with skipIf and requires
|
|
649
|
+
- **[Conditional Branching](./examples/conversation-flows/conditional-branching.ts)** - AI-powered branching decisions
|
|
650
|
+
- **[Completion Transitions](./examples/conversation-flows/completion-transitions.ts)** - Route transitions when flows complete
|
|
651
|
+
|
|
652
|
+
### 🤖 AI Providers
|
|
653
|
+
|
|
654
|
+
Integrating different AI services:
|
|
655
|
+
|
|
656
|
+
- **[Gemini Integration](./examples/ai-providers/gemini-integration.ts)** - Google Gemini with advanced features
|
|
657
|
+
- **[OpenAI Integration](./examples/ai-providers/openai-integration.ts)** - GPT-4 and GPT-3.5 Turbo
|
|
658
|
+
- **[Anthropic Integration](./examples/ai-providers/anthropic-integration.ts)** - Claude with streaming and tool calling
|
|
659
|
+
- **[Custom Provider](./examples/ai-providers/custom-provider.ts)** - Build your own AI provider integration
|
|
660
|
+
|
|
661
|
+
### 💾 Persistence
|
|
662
|
+
|
|
663
|
+
Session storage and data persistence:
|
|
664
|
+
|
|
665
|
+
- **[Memory Sessions](./examples/persistence/memory-sessions.ts)** - In-memory session management
|
|
666
|
+
- **[Redis Persistence](./examples/persistence/redis-persistence.ts)** - High-performance Redis storage
|
|
667
|
+
- **[Database Persistence](./examples/persistence/database-persistence.ts)** - SQL/NoSQL database integration
|
|
668
|
+
- **[Custom Adapter](./examples/persistence/custom-adapter.ts)** - Build custom persistence adapters
|
|
669
|
+
|
|
670
|
+
### 🔧 Tools
|
|
671
|
+
|
|
672
|
+
Tool creation and data manipulation:
|
|
673
|
+
|
|
674
|
+
- **[Basic Tools](./examples/tools/basic-tools.ts)** - Simple tool creation and execution
|
|
675
|
+
- **[Data Enrichment Tools](./examples/tools/data-enrichment-tools.ts)** - Tools that modify collected data
|
|
676
|
+
- **[Context Updating Tools](./examples/tools/context-updating-tools.ts)** - Tools that modify agent context
|
|
677
|
+
- **[Domain Scoped Tools](./examples/tools/domain-scoped-tools.ts)** - Tool security and access control
|
|
678
|
+
|
|
679
|
+
### 🚀 Advanced Patterns
|
|
680
|
+
|
|
681
|
+
Complex use cases and integrations:
|
|
682
|
+
|
|
683
|
+
- **[Multi-Turn Conversations](./examples/advanced-patterns/multi-turn-conversations.ts)** - Complex dialogue flows with backtracking
|
|
684
|
+
- **[Streaming Responses](./examples/advanced-patterns/streaming-responses.ts)** - Real-time response streaming
|
|
685
|
+
- **[Route Lifecycle Hooks](./examples/advanced-patterns/route-lifecycle-hooks.ts)** - Custom route behavior
|
|
686
|
+
- **[Custom Response Schemas](./examples/advanced-patterns/custom-response-schemas.ts)** - Advanced schema patterns
|
|
687
|
+
|
|
688
|
+
### 🔗 Integrations
|
|
689
|
+
|
|
690
|
+
External service integrations:
|
|
691
|
+
|
|
692
|
+
- **[Server Deployment](./examples/integrations/server-deployment.ts)** - HTTP API with WebSocket streaming
|
|
693
|
+
- **[Database Integration](./examples/integrations/database-integration.ts)** - Direct database access patterns
|
|
694
|
+
- **[Webhook Integration](./examples/integrations/webhook-integration.ts)** - HTTP webhook handling
|
|
695
|
+
- **[API Integration](./examples/integrations/api-integration.ts)** - External API calls and responses
|
|
696
|
+
|
|
697
|
+
📖 **[See all examples with detailed explanations →](./examples/)**
|
|
698
|
+
|
|
699
|
+
---
|
|
700
|
+
|
|
701
|
+
## 🏗️ How It Works
|
|
702
|
+
|
|
703
|
+
`@falai/agent` uses a **schema-first, pipeline-driven architecture** with intelligent pre-extraction:
|
|
704
|
+
|
|
705
|
+
```
|
|
706
|
+
User Message + Session State
|
|
707
|
+
↓
|
|
708
|
+
┌─────────────────────────────────────────┐
|
|
709
|
+
│ 1. ROUTING + PRE-EXTRACTION │
|
|
710
|
+
│ • Evaluate routes (AI scoring) │
|
|
711
|
+
│ • Pre-extract data from message │
|
|
712
|
+
│ • Check route completion │
|
|
713
|
+
└─────────────────────────────────────────┘
|
|
714
|
+
↓
|
|
715
|
+
┌─────────────────────────────────────────┐
|
|
716
|
+
│ 2. SMART STEP SELECTION │
|
|
717
|
+
│ • Filter steps (skipIf, requires) │
|
|
718
|
+
│ • Skip steps with existing data │
|
|
719
|
+
│ • Select optimal next step │
|
|
720
|
+
└─────────────────────────────────────────┘
|
|
721
|
+
↓
|
|
722
|
+
┌─────────────────────────────────────────┐
|
|
723
|
+
│ 3. RESPONSE GENERATION │
|
|
724
|
+
│ • Build prompt with context │
|
|
725
|
+
│ • Generate AI response │
|
|
726
|
+
│ • Execute tools if needed │
|
|
727
|
+
└─────────────────────────────────────────┘
|
|
728
|
+
↓
|
|
729
|
+
┌─────────────────────────────────────────┐
|
|
730
|
+
│ 4. COMPLETION HANDLING │
|
|
731
|
+
│ • Auto-complete when data collected │
|
|
732
|
+
│ • Exclude completed routes │
|
|
733
|
+
│ • Generate completion message │
|
|
734
|
+
└─────────────────────────────────────────┘
|
|
735
|
+
↓
|
|
736
|
+
Response + Updated Session State
|
|
737
|
+
```
|
|
738
|
+
|
|
739
|
+
### Key Principles:
|
|
740
|
+
|
|
741
|
+
✅ **AI decides:** Route selection, data extraction, message generation, tool calling
|
|
742
|
+
✅ **Code decides:** Step flow control, route completion, lifecycle hooks, data validation
|
|
743
|
+
✅ **Result:** Efficient conversations that don't waste user time
|
|
744
|
+
|
|
745
|
+
### What Makes It Smart:
|
|
746
|
+
|
|
747
|
+
🎯 **Pre-Extraction** - Data extracted BEFORE entering steps (no repeated questions)
|
|
748
|
+
🚀 **Auto-Completion** - Routes complete automatically when required fields are collected
|
|
749
|
+
🔒 **Completion Protection** - Completed routes excluded from future selection
|
|
750
|
+
⚡ **Smart Skipping** - Steps bypassed if their data is already present
|
|
751
|
+
|
|
752
|
+
📖 **[Read the detailed architecture →](./docs/architecture/data-extraction-flow.md)**
|
|
753
|
+
|
|
754
|
+
---
|
|
755
|
+
|
|
756
|
+
## 🤝 Contributing
|
|
757
|
+
|
|
758
|
+
We welcome contributions! See our [Contributing Guide](./docs/CONTRIBUTING.md) for details on:
|
|
759
|
+
|
|
760
|
+
- 🐛 Reporting bugs
|
|
761
|
+
- 💡 Suggesting features
|
|
762
|
+
- 📝 Improving documentation
|
|
763
|
+
- 🔨 Submitting pull requests
|
|
764
|
+
|
|
765
|
+
## 🎓 Inspired By
|
|
766
|
+
|
|
767
|
+
This framework draws inspiration from [**Parlant**](https://github.com/emcie-co/parlant) by Emcie Co., an excellent Python framework for conversational AI agents. We've adapted and enhanced these concepts for the TypeScript ecosystem with additional type safety and modern patterns.
|
|
768
|
+
|
|
769
|
+
---
|
|
770
|
+
|
|
771
|
+
## 📄 License
|
|
772
|
+
|
|
773
|
+
MIT © 2025
|
|
774
|
+
|
|
775
|
+
---
|
|
776
|
+
|
|
777
|
+
<div align="center">
|
|
778
|
+
|
|
779
|
+
## 🚀 Ready to Build?
|
|
780
|
+
|
|
781
|
+
**Choose your path:**
|
|
782
|
+
|
|
783
|
+
👶 **New to AI agents?** → [Quick Start Guide](./docs/guides/getting-started/README.md)
|
|
784
|
+
🏗️ **Building production app?** → [Agent Architecture](./docs/core/agent/README.md)
|
|
785
|
+
💡 **Have questions?** → [Open a discussion](https://github.com/falai-dev/agent/discussions)
|
|
786
|
+
|
|
787
|
+
---
|
|
788
|
+
|
|
789
|
+
### ⭐ Star us on [GitHub](https://github.com/falai-dev/agent)
|
|
790
|
+
|
|
791
|
+
**Help us reach more developers building production AI!**
|
|
792
|
+
|
|
793
|
+
[Report Bug](https://github.com/falai-dev/agent/issues) • [Request Feature](https://github.com/falai-dev/agent/issues) • [Contribute](https://github.com/falai-dev/agent/pulls)
|
|
794
|
+
|
|
795
|
+
**Made with ❤️ for the community**
|
|
796
|
+
|
|
797
|
+
</div>
|