@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
|
@@ -1,22 +1,21 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Context & Session Management
|
|
2
2
|
|
|
3
3
|
## Overview
|
|
4
4
|
|
|
5
|
-
The `@falai/agent` framework provides **session
|
|
5
|
+
The `@falai/agent` framework provides **automatic session management** through the integrated `SessionManager` class, tracking conversation progress, collected data, and user intent across multiple turns. This enables sophisticated data-driven conversations with zero boilerplate code.
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
## 🎯 Session
|
|
9
|
+
## 🎯 Automatic Session Management
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
The `SessionManager` automatically tracks three key aspects of a conversation:
|
|
12
12
|
|
|
13
13
|
1. **Current Route** - Which conversation flow the user is in
|
|
14
14
|
2. **Current Step** - Where in the flow they currently are
|
|
15
15
|
3. **Collected data** - Structured data collected so far
|
|
16
|
+
4. **Conversation History** - Complete message history within the session
|
|
16
17
|
|
|
17
18
|
```typescript
|
|
18
|
-
import { createSession, SessionStep } from "@falai/agent";
|
|
19
|
-
|
|
20
19
|
// Define your data extraction type
|
|
21
20
|
interface FlightData {
|
|
22
21
|
destination: string;
|
|
@@ -25,66 +24,70 @@ interface FlightData {
|
|
|
25
24
|
cabinClass: "economy" | "business" | "first";
|
|
26
25
|
}
|
|
27
26
|
|
|
28
|
-
//
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
27
|
+
// Agent with automatic session management
|
|
28
|
+
const agent = new Agent({
|
|
29
|
+
name: "Travel Agent",
|
|
30
|
+
provider: new OpenAIProvider({ apiKey: process.env.OPENAI_API_KEY }),
|
|
31
|
+
persistence: { adapter: new PrismaAdapter({ prisma }) },
|
|
32
|
+
sessionId: "user-123" // Automatically loads or creates session
|
|
33
|
+
});
|
|
35
34
|
|
|
36
|
-
//
|
|
37
|
-
const response = await agent.respond(
|
|
35
|
+
// Simple conversation - session managed automatically
|
|
36
|
+
const response = await agent.respond("I want to book a flight to Paris");
|
|
38
37
|
|
|
39
|
-
//
|
|
40
|
-
console.log(
|
|
41
|
-
console.log(
|
|
42
|
-
console.log(
|
|
38
|
+
// Access session information
|
|
39
|
+
console.log(agent.session.id); // "user-123"
|
|
40
|
+
console.log(agent.session.getData<FlightData>()); // { destination: "Paris", ... }
|
|
41
|
+
console.log(agent.session.getHistory()); // Conversation history
|
|
43
42
|
```
|
|
44
43
|
|
|
45
|
-
**Benefits of Session
|
|
44
|
+
**Benefits of Automatic Session Management:**
|
|
46
45
|
|
|
46
|
+
- **Zero Boilerplate** - No manual session creation or persistence code
|
|
47
47
|
- **Always-On Routing** - Users can change their mind mid-conversation
|
|
48
|
-
- **Data Persistence** - Collected data
|
|
48
|
+
- **Data Persistence** - Collected data automatically saved and restored
|
|
49
49
|
- **Context Awareness** - Router sees current progress and collected data
|
|
50
|
-
- **
|
|
50
|
+
- **History Management** - Conversation history automatically maintained
|
|
51
|
+
- **Server-Friendly** - Perfect for stateless server environments
|
|
51
52
|
|
|
52
53
|
---
|
|
53
54
|
|
|
54
|
-
## 🔄
|
|
55
|
+
## 🔄 SessionManager API
|
|
55
56
|
|
|
56
|
-
###
|
|
57
|
+
### Session Operations
|
|
57
58
|
|
|
58
59
|
```typescript
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
enterRoute,
|
|
62
|
-
enterStep,
|
|
63
|
-
mergeData,
|
|
64
|
-
type SessionStep,
|
|
65
|
-
} from "@falai/agent";
|
|
66
|
-
|
|
67
|
-
// Create a new session
|
|
68
|
-
let session = createSession<FlightData>();
|
|
60
|
+
// Access the session manager
|
|
61
|
+
const sessionManager = agent.session;
|
|
69
62
|
|
|
70
|
-
//
|
|
71
|
-
|
|
63
|
+
// Get or create session (works for existing, new, or auto-generated IDs)
|
|
64
|
+
await sessionManager.getOrCreate("user-123");
|
|
65
|
+
await sessionManager.getOrCreate(); // Auto-generates ID
|
|
72
66
|
|
|
73
|
-
//
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
// Merge collected data (when AI extracts new information)
|
|
77
|
-
session = mergeData(session, {
|
|
67
|
+
// Data management
|
|
68
|
+
const data = sessionManager.getData<FlightData>();
|
|
69
|
+
await sessionManager.setData({
|
|
78
70
|
destination: "Paris",
|
|
79
71
|
departureDate: "2025-10-15",
|
|
80
72
|
passengers: 2,
|
|
81
73
|
});
|
|
74
|
+
|
|
75
|
+
// History management
|
|
76
|
+
await sessionManager.addMessage("user", "I want to book a flight");
|
|
77
|
+
await sessionManager.addMessage("assistant", "Where would you like to go?");
|
|
78
|
+
const history = sessionManager.getHistory();
|
|
79
|
+
sessionManager.clearHistory();
|
|
80
|
+
|
|
81
|
+
// Session operations
|
|
82
|
+
await sessionManager.save(); // Manual save (auto-saves on addMessage)
|
|
83
|
+
await sessionManager.delete();
|
|
84
|
+
const newSession = await sessionManager.reset(true); // Preserve history
|
|
82
85
|
```
|
|
83
86
|
|
|
84
87
|
### Session Step Structure
|
|
85
88
|
|
|
86
89
|
```typescript
|
|
87
|
-
interface
|
|
90
|
+
interface SessionState<TData = unknown> {
|
|
88
91
|
currentRoute?: {
|
|
89
92
|
id: string;
|
|
90
93
|
title: string;
|
|
@@ -205,7 +208,7 @@ const route = agent.createRoute<FlightData>({
|
|
|
205
208
|
```typescript
|
|
206
209
|
// Step with code-based logic (no fuzzy LLM conditions!)
|
|
207
210
|
const askDestination = route.initialStep.nextStep({
|
|
208
|
-
|
|
211
|
+
prompt: "Ask where they want to fly",
|
|
209
212
|
collect: ["destination"],
|
|
210
213
|
skipIf: (data) => !!data.destination, // Skip if already have destination
|
|
211
214
|
});
|
|
@@ -216,7 +219,7 @@ const enrichDestination = askDestination.nextStep({
|
|
|
216
219
|
});
|
|
217
220
|
|
|
218
221
|
const askDates = enrichDestination.nextStep({
|
|
219
|
-
|
|
222
|
+
prompt: "Ask about travel dates",
|
|
220
223
|
collect: ["departureDate"],
|
|
221
224
|
skipIf: (data) => !!data.departureDate,
|
|
222
225
|
requires: ["destination"], // Must have destination first
|
|
@@ -228,7 +231,7 @@ const validateDate = askDates.nextStep({
|
|
|
228
231
|
});
|
|
229
232
|
|
|
230
233
|
const askPassengers = validateDate.nextStep({
|
|
231
|
-
|
|
234
|
+
prompt: "How many passengers?",
|
|
232
235
|
collect: ["passengers"],
|
|
233
236
|
skipIf: (data) => !!data.passengers,
|
|
234
237
|
});
|
|
@@ -242,15 +245,23 @@ const searchFlights = askPassengers.nextStep({
|
|
|
242
245
|
### 3. Tools Access Collected data
|
|
243
246
|
|
|
244
247
|
```typescript
|
|
245
|
-
const searchFlights
|
|
246
|
-
"search_flights",
|
|
247
|
-
|
|
248
|
+
const searchFlights: Tool<Context, [], void, FlightData> = {
|
|
249
|
+
id: "search_flights",
|
|
250
|
+
description: "Search for available flights based on collected data",
|
|
251
|
+
parameters: {
|
|
252
|
+
type: "object",
|
|
253
|
+
properties: {},
|
|
254
|
+
},
|
|
255
|
+
handler: async (toolContext) => {
|
|
248
256
|
// Access collected data directly (no LLM extraction needed!)
|
|
249
|
-
if (!data.destination || !data.departureDate) {
|
|
257
|
+
if (!toolContext.data.destination || !toolContext.data.departureDate) {
|
|
250
258
|
return { data: undefined };
|
|
251
259
|
}
|
|
252
260
|
|
|
253
|
-
const flights = await searchFlightAPI(
|
|
261
|
+
const flights = await searchFlightAPI(
|
|
262
|
+
toolContext.data.destination,
|
|
263
|
+
toolContext.data.departureDate
|
|
264
|
+
);
|
|
254
265
|
|
|
255
266
|
return {
|
|
256
267
|
data: undefined,
|
|
@@ -259,8 +270,8 @@ const searchFlights = defineTool<Context, [], void, FlightData>(
|
|
|
259
270
|
shouldSearchFlights: false, // Clear the flag
|
|
260
271
|
},
|
|
261
272
|
};
|
|
262
|
-
}
|
|
263
|
-
|
|
273
|
+
},
|
|
274
|
+
};
|
|
264
275
|
```
|
|
265
276
|
|
|
266
277
|
### 4. Lifecycle Hooks for Validation & Enrichment
|
|
@@ -298,11 +309,10 @@ Routing happens every turn with full session context:
|
|
|
298
309
|
// User starts booking a flight
|
|
299
310
|
const response1 = await agent.respond({
|
|
300
311
|
history: [
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
"
|
|
304
|
-
|
|
305
|
-
),
|
|
312
|
+
{
|
|
313
|
+
role: "user",
|
|
314
|
+
content: "I want to fly to Paris tomorrow with 2 people",
|
|
315
|
+
},
|
|
306
316
|
],
|
|
307
317
|
session,
|
|
308
318
|
});
|
|
@@ -311,11 +321,10 @@ const response1 = await agent.respond({
|
|
|
311
321
|
const response2 = await agent.respond({
|
|
312
322
|
history: [
|
|
313
323
|
...previousHistory,
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
"
|
|
317
|
-
|
|
318
|
-
),
|
|
324
|
+
{
|
|
325
|
+
role: "user",
|
|
326
|
+
content: "Actually, make that Tokyo instead",
|
|
327
|
+
},
|
|
319
328
|
],
|
|
320
329
|
session: response1.session, // Router sees context and switches appropriately
|
|
321
330
|
});
|
|
@@ -370,18 +379,26 @@ Tools can update context in **two ways**:
|
|
|
370
379
|
### Option A: Return `contextUpdate`
|
|
371
380
|
|
|
372
381
|
```typescript
|
|
373
|
-
const saveName
|
|
374
|
-
"save_name",
|
|
375
|
-
|
|
382
|
+
const saveName: Tool<MyContext, [name: string], boolean> = {
|
|
383
|
+
id: "save_name",
|
|
384
|
+
description: "Save the user's name to context",
|
|
385
|
+
parameters: {
|
|
386
|
+
type: "object",
|
|
387
|
+
properties: {
|
|
388
|
+
name: { type: "string", description: "The user's name" },
|
|
389
|
+
},
|
|
390
|
+
required: ["name"],
|
|
391
|
+
},
|
|
392
|
+
handler: async (toolContext, args) => {
|
|
376
393
|
return {
|
|
377
394
|
data: true,
|
|
378
395
|
contextUpdate: {
|
|
379
|
-
userName: name,
|
|
396
|
+
userName: args.name,
|
|
380
397
|
updatedAt: new Date(),
|
|
381
398
|
},
|
|
382
399
|
};
|
|
383
|
-
}
|
|
384
|
-
|
|
400
|
+
},
|
|
401
|
+
};
|
|
385
402
|
```
|
|
386
403
|
|
|
387
404
|
**Pros:**
|
|
@@ -393,17 +410,25 @@ const saveName = defineTool<MyContext, [name: string], boolean>(
|
|
|
393
410
|
### Option B: Call `updateContext()` directly
|
|
394
411
|
|
|
395
412
|
```typescript
|
|
396
|
-
const saveName
|
|
397
|
-
"save_name",
|
|
398
|
-
|
|
413
|
+
const saveName: Tool<MyContext, [name: string], boolean> = {
|
|
414
|
+
id: "save_name",
|
|
415
|
+
description: "Save the user's name to context using direct update",
|
|
416
|
+
parameters: {
|
|
417
|
+
type: "object",
|
|
418
|
+
properties: {
|
|
419
|
+
name: { type: "string", description: "The user's name" },
|
|
420
|
+
},
|
|
421
|
+
required: ["name"],
|
|
422
|
+
},
|
|
423
|
+
handler: async (toolContext, args) => {
|
|
399
424
|
await toolContext.updateContext({
|
|
400
|
-
userName: name,
|
|
425
|
+
userName: args.name,
|
|
401
426
|
updatedAt: new Date(),
|
|
402
427
|
});
|
|
403
428
|
|
|
404
429
|
return { data: true };
|
|
405
|
-
}
|
|
406
|
-
|
|
430
|
+
},
|
|
431
|
+
};
|
|
407
432
|
```
|
|
408
433
|
|
|
409
434
|
**Pros:**
|
|
@@ -456,7 +481,7 @@ const agent = new Agent({
|
|
|
456
481
|
## 🎯 Complete Example: Multi-Turn Onboarding
|
|
457
482
|
|
|
458
483
|
```typescript
|
|
459
|
-
import { Agent,
|
|
484
|
+
import { Agent, type Tool } from "@falai/agent";
|
|
460
485
|
|
|
461
486
|
interface OnboardingContext {
|
|
462
487
|
sessionId: string;
|
|
@@ -509,31 +534,50 @@ async function createOnboardingAgent(sessionId: string) {
|
|
|
509
534
|
});
|
|
510
535
|
|
|
511
536
|
// Define tools with context updates
|
|
512
|
-
const saveBusinessName =
|
|
513
|
-
"save_business_name",
|
|
514
|
-
|
|
537
|
+
const saveBusinessName: Tool<OnboardingContext, [name: string], boolean> = {
|
|
538
|
+
id: "save_business_name",
|
|
539
|
+
description: "Save the business name and mark step as completed",
|
|
540
|
+
parameters: {
|
|
541
|
+
type: "object",
|
|
542
|
+
properties: {
|
|
543
|
+
name: { type: "string", description: "The business name" },
|
|
544
|
+
},
|
|
545
|
+
required: ["name"],
|
|
546
|
+
},
|
|
547
|
+
handler: async (toolContext, args) => {
|
|
515
548
|
return {
|
|
516
549
|
data: true,
|
|
517
550
|
contextUpdate: {
|
|
518
|
-
businessName: name,
|
|
519
|
-
completedSteps: [
|
|
551
|
+
businessName: args.name,
|
|
552
|
+
completedSteps: [
|
|
553
|
+
...toolContext.context.completedSteps,
|
|
554
|
+
"business_name",
|
|
555
|
+
],
|
|
520
556
|
},
|
|
521
557
|
};
|
|
522
|
-
}
|
|
523
|
-
|
|
558
|
+
},
|
|
559
|
+
};
|
|
524
560
|
|
|
525
|
-
const saveIndustry =
|
|
526
|
-
"save_industry",
|
|
527
|
-
|
|
561
|
+
const saveIndustry: Tool<OnboardingContext, [industry: string], boolean> = {
|
|
562
|
+
id: "save_industry",
|
|
563
|
+
description: "Save the industry and mark step as completed",
|
|
564
|
+
parameters: {
|
|
565
|
+
type: "object",
|
|
566
|
+
properties: {
|
|
567
|
+
industry: { type: "string", description: "The business industry" },
|
|
568
|
+
},
|
|
569
|
+
required: ["industry"],
|
|
570
|
+
},
|
|
571
|
+
handler: async (toolContext, args) => {
|
|
528
572
|
// Alternative: use updateContext directly
|
|
529
|
-
await
|
|
530
|
-
industry,
|
|
531
|
-
completedSteps: [...
|
|
573
|
+
await toolContext.updateContext({
|
|
574
|
+
industry: args.industry,
|
|
575
|
+
completedSteps: [...toolContext.context.completedSteps, "industry"],
|
|
532
576
|
});
|
|
533
577
|
|
|
534
578
|
return { data: true };
|
|
535
|
-
}
|
|
536
|
-
|
|
579
|
+
},
|
|
580
|
+
};
|
|
537
581
|
|
|
538
582
|
// Build conversation routes...
|
|
539
583
|
const route = agent.createRoute({ title: "Onboarding" });
|
|
@@ -548,7 +592,12 @@ async function handleUserMessage(sessionId: string, message: string) {
|
|
|
548
592
|
const agent = await createOnboardingAgent(sessionId);
|
|
549
593
|
|
|
550
594
|
const response = await agent.respond({
|
|
551
|
-
history: [
|
|
595
|
+
history: [
|
|
596
|
+
{
|
|
597
|
+
role: "user",
|
|
598
|
+
content: message,
|
|
599
|
+
},
|
|
600
|
+
],
|
|
552
601
|
});
|
|
553
602
|
|
|
554
603
|
return response.message;
|
|
@@ -701,9 +750,9 @@ hooks: {
|
|
|
701
750
|
## 📚 Related Resources
|
|
702
751
|
|
|
703
752
|
- [Complete Example: Persistent Onboarding](../examples/persistent-onboarding.ts)
|
|
704
|
-
- [API Reference: AgentOptions](
|
|
705
|
-
- [API Reference: ContextLifecycleHooks](
|
|
706
|
-
- [Getting Started](
|
|
753
|
+
- [API Reference: AgentOptions](../api/overview.md#agentoptions)
|
|
754
|
+
- [API Reference: ContextLifecycleHooks](../api/overview.md#contextlifecyclehooks)
|
|
755
|
+
- [Getting Started](../guides/getting-started/README.md)
|
|
707
756
|
|
|
708
757
|
---
|
|
709
758
|
|
|
@@ -712,7 +761,7 @@ hooks: {
|
|
|
712
761
|
If you're still having issues:
|
|
713
762
|
|
|
714
763
|
1. Check the [examples](../examples/) for working implementations
|
|
715
|
-
2. Review the [API Reference](
|
|
764
|
+
2. Review the [API Reference](../api/README.md) for detailed type information
|
|
716
765
|
3. Open an issue on GitHub with your use case
|
|
717
766
|
|
|
718
767
|
**Remember:** The key to persistent conversations is:
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Session Management
|
|
2
2
|
|
|
3
3
|
## Overview
|
|
4
4
|
|
|
5
|
-
`@falai/agent`
|
|
5
|
+
The `@falai/agent` framework provides **automatic session management** through the `SessionManager` class, eliminating the need for manual session creation, persistence, and state management. Sessions are automatically created, loaded, and saved, allowing developers to focus on building conversation logic rather than managing session lifecycle.
|
|
6
6
|
|
|
7
7
|
## Core Design Principles
|
|
8
8
|
|
|
@@ -46,60 +46,66 @@ const route = agent.createRoute<FlightData>({
|
|
|
46
46
|
- **Predictability** - Same data structure every time
|
|
47
47
|
- **Efficiency** - Extract multiple fields in one LLM call
|
|
48
48
|
|
|
49
|
-
### 2.
|
|
49
|
+
### 2. 🤖 Automatic Session Management
|
|
50
50
|
|
|
51
|
-
|
|
51
|
+
Sessions are automatically managed through the `SessionManager` class integrated into every `Agent`:
|
|
52
52
|
|
|
53
53
|
```typescript
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
54
|
+
// Server-side: Agent with automatic session management
|
|
55
|
+
const agent = new Agent({
|
|
56
|
+
name: "Travel Agent",
|
|
57
|
+
provider: new OpenAIProvider({ apiKey: process.env.OPENAI_API_KEY }),
|
|
58
|
+
persistence: { adapter: new PrismaAdapter({ prisma }) },
|
|
59
|
+
sessionId: "user-123" // Automatically loads or creates this session
|
|
60
60
|
});
|
|
61
61
|
|
|
62
|
-
//
|
|
63
|
-
const response1 = await agent.respond(
|
|
64
|
-
session
|
|
62
|
+
// Simple conversation - no manual session management
|
|
63
|
+
const response1 = await agent.respond("I want to book a flight to Paris");
|
|
64
|
+
console.log(agent.session.id); // Session ID
|
|
65
|
+
console.log(agent.session.getData()); // Collected data
|
|
65
66
|
|
|
66
|
-
//
|
|
67
|
-
const response2 = await agent.respond(
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
// Access session metadata
|
|
71
|
-
console.log(session.metadata?.sessionId); // "unique-session-123"
|
|
67
|
+
// Continue conversation - session automatically maintained
|
|
68
|
+
const response2 = await agent.respond("Make that Tokyo instead");
|
|
69
|
+
// Session automatically updated with new data
|
|
72
70
|
```
|
|
73
71
|
|
|
74
|
-
**
|
|
72
|
+
**SessionManager API:**
|
|
75
73
|
|
|
76
|
-
|
|
74
|
+
The `SessionManager` provides a clean API for session operations:
|
|
77
75
|
|
|
78
76
|
```typescript
|
|
79
|
-
//
|
|
80
|
-
const
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
//
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
77
|
+
// Access the session manager
|
|
78
|
+
const sessionManager = agent.session;
|
|
79
|
+
|
|
80
|
+
// Get or create session (works for existing, new, or auto-generated IDs)
|
|
81
|
+
await sessionManager.getOrCreate("user-123");
|
|
82
|
+
await sessionManager.getOrCreate(); // Auto-generates ID
|
|
83
|
+
|
|
84
|
+
// History management
|
|
85
|
+
await sessionManager.addMessage("user", "Hello");
|
|
86
|
+
await sessionManager.addMessage("assistant", "Hi there!");
|
|
87
|
+
const history = sessionManager.getHistory();
|
|
88
|
+
sessionManager.clearHistory();
|
|
89
|
+
|
|
90
|
+
// Data access
|
|
91
|
+
const data = sessionManager.getData<FlightData>();
|
|
92
|
+
await sessionManager.setData({ destination: "Paris" });
|
|
93
|
+
|
|
94
|
+
// Session operations
|
|
95
|
+
await sessionManager.save(); // Manual save (auto-saves on addMessage)
|
|
96
|
+
await sessionManager.delete();
|
|
97
|
+
const newSession = await sessionManager.reset(true); // Preserve history
|
|
94
98
|
```
|
|
95
99
|
|
|
96
|
-
**Why?**
|
|
100
|
+
**Why?** Automatic session management provides:
|
|
97
101
|
|
|
102
|
+
- **Zero Boilerplate** - No manual session creation or persistence code
|
|
103
|
+
- **Server-Friendly** - Perfect for stateless server environments
|
|
98
104
|
- **Always-on Routing** - Users can change their mind mid-conversation
|
|
99
105
|
- **Context Awareness** - Router sees current progress and collected data
|
|
100
|
-
- **Data Persistence** - Collected data
|
|
101
|
-
- **
|
|
102
|
-
- **Session Tracking** -
|
|
106
|
+
- **Data Persistence** - Collected data automatically saved and restored
|
|
107
|
+
- **History Management** - Conversation history automatically maintained
|
|
108
|
+
- **Session Tracking** - Easy session identification for client/server communication
|
|
103
109
|
|
|
104
110
|
### 3. 🔧 Code-Based Step Logic + AI-Driven Transitions
|
|
105
111
|
|
|
@@ -109,7 +115,7 @@ Use TypeScript functions for deterministic flow control AND text conditions for
|
|
|
109
115
|
// Step with smart bypassing based on collected data
|
|
110
116
|
const askDestination = route.initialStep.nextStep({
|
|
111
117
|
id: "ask_destination", // Optional: custom step ID
|
|
112
|
-
|
|
118
|
+
prompt: "Ask where they want to fly",
|
|
113
119
|
collect: ["destination"],
|
|
114
120
|
skipIf: (data) => !!data.destination, // Code-based condition!
|
|
115
121
|
condition: "Customer hasn't specified destination yet", // Text condition for AI
|
|
@@ -117,7 +123,7 @@ const askDestination = route.initialStep.nextStep({
|
|
|
117
123
|
|
|
118
124
|
const askDate = askDestination.nextStep({
|
|
119
125
|
id: "ask_date", // Optional: custom step ID for easier tracking
|
|
120
|
-
|
|
126
|
+
prompt: "Ask about travel dates",
|
|
121
127
|
collect: ["departureDate"],
|
|
122
128
|
skipIf: (data) => !!data.departureDate,
|
|
123
129
|
requires: ["destination"], // Prerequisites
|
|
@@ -133,7 +139,7 @@ You can optionally provide custom IDs for steps to make them easier to track and
|
|
|
133
139
|
```typescript
|
|
134
140
|
const confirmBooking = askDate.nextStep({
|
|
135
141
|
id: "confirm_booking", // ✅ Custom ID instead of auto-generated
|
|
136
|
-
|
|
142
|
+
prompt: "Confirm all booking details",
|
|
137
143
|
requires: ["destination", "departureDate", "passengers"],
|
|
138
144
|
});
|
|
139
145
|
```
|
|
@@ -170,9 +176,16 @@ If you don't provide an ID, one is automatically generated from the route ID and
|
|
|
170
176
|
Tools execute with full context including collected data:
|
|
171
177
|
|
|
172
178
|
```typescript
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
179
|
+
import { Tool } from "@falai/agent";
|
|
180
|
+
|
|
181
|
+
const searchFlights: Tool<Context, [], void, FlightData> = {
|
|
182
|
+
id: "search_flights",
|
|
183
|
+
description: "Search for available flights based on collected data",
|
|
184
|
+
parameters: {
|
|
185
|
+
type: "object",
|
|
186
|
+
properties: {},
|
|
187
|
+
},
|
|
188
|
+
handler: async (toolContext) => {
|
|
176
189
|
const { data, context, history } = toolContext;
|
|
177
190
|
|
|
178
191
|
// Access collected data directly
|
|
@@ -188,8 +201,8 @@ const searchFlights = defineTool<Context, [], void, FlightData>(
|
|
|
188
201
|
departureDateParsed: parseDate(data.departureDate),
|
|
189
202
|
},
|
|
190
203
|
};
|
|
191
|
-
}
|
|
192
|
-
|
|
204
|
+
},
|
|
205
|
+
};
|
|
193
206
|
```
|
|
194
207
|
|
|
195
208
|
**Why?** Tools with data access enable:
|
|
@@ -207,7 +220,10 @@ Routing happens every turn, allowing users to change direction:
|
|
|
207
220
|
// User starts booking a flight
|
|
208
221
|
const response1 = await agent.respond({
|
|
209
222
|
history: [
|
|
210
|
-
|
|
223
|
+
{
|
|
224
|
+
role: "user",
|
|
225
|
+
content: "I want to fly to Paris",
|
|
226
|
+
},
|
|
211
227
|
],
|
|
212
228
|
session,
|
|
213
229
|
});
|
|
@@ -216,11 +232,10 @@ const response1 = await agent.respond({
|
|
|
216
232
|
const response2 = await agent.respond({
|
|
217
233
|
history: [
|
|
218
234
|
...previousHistory,
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
"
|
|
222
|
-
|
|
223
|
-
),
|
|
235
|
+
{
|
|
236
|
+
role: "user",
|
|
237
|
+
content: "Actually, make that Tokyo instead",
|
|
238
|
+
},
|
|
224
239
|
],
|
|
225
240
|
session: response1.session, // Router sees context and switches appropriately
|
|
226
241
|
});
|
|
@@ -372,7 +387,7 @@ const bookingRoute = agent.createRoute<BookingData>({
|
|
|
372
387
|
|
|
373
388
|
bookingRoute.initialStep
|
|
374
389
|
.nextStep({
|
|
375
|
-
|
|
390
|
+
prompt: "Ask destination",
|
|
376
391
|
collect: ["destination"],
|
|
377
392
|
skipIf: (data) => !!data.destination,
|
|
378
393
|
})
|
|
@@ -381,7 +396,7 @@ bookingRoute.initialStep
|
|
|
381
396
|
requires: ["destination"],
|
|
382
397
|
})
|
|
383
398
|
.nextStep({
|
|
384
|
-
|
|
399
|
+
prompt: "Ask dates",
|
|
385
400
|
collect: ["dates"],
|
|
386
401
|
skipIf: (data) => !!data.dates,
|
|
387
402
|
});
|
|
@@ -399,7 +414,7 @@ const qnaRoute = agent.createRoute({
|
|
|
399
414
|
});
|
|
400
415
|
|
|
401
416
|
// Just use initial step
|
|
402
|
-
qnaRoute.initialStep.
|
|
417
|
+
qnaRoute.initialStep.prompt = "Answer from knowledge base";
|
|
403
418
|
```
|
|
404
419
|
|
|
405
420
|
### Mixed Architecture
|
|
@@ -436,9 +451,9 @@ This framework draws inspiration from:
|
|
|
436
451
|
|
|
437
452
|
## Further Reading
|
|
438
453
|
|
|
439
|
-
- [Getting Started Guide](
|
|
454
|
+
- [Getting Started Guide](../guides/getting-started/README.md) - Build your first agent
|
|
440
455
|
- [Session Step Guide](./CONTEXT_MANAGEMENT.md) - Session management patterns
|
|
441
|
-
- [API Reference](
|
|
456
|
+
- [API Reference](../api/README.md) - Complete API documentation
|
|
442
457
|
- [Examples](../examples/) - Real-world implementations
|
|
443
458
|
|
|
444
459
|
---
|