@falai/agent 0.8.0 → 0.9.0-alpha-1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +306 -133
- package/dist/{adapters → cjs/src/adapters}/MemoryAdapter.d.ts +4 -4
- package/dist/cjs/src/adapters/MemoryAdapter.d.ts.map +1 -0
- package/dist/cjs/{adapters → src/adapters}/MemoryAdapter.js +41 -21
- package/dist/cjs/src/adapters/MemoryAdapter.js.map +1 -0
- package/dist/{adapters → cjs/src/adapters}/MongoAdapter.d.ts +3 -3
- package/dist/cjs/src/adapters/MongoAdapter.d.ts.map +1 -0
- package/dist/cjs/{adapters → src/adapters}/MongoAdapter.js +2 -1
- package/dist/cjs/src/adapters/MongoAdapter.js.map +1 -0
- package/dist/cjs/{adapters → src/adapters}/OpenSearchAdapter.d.ts +3 -3
- package/dist/cjs/src/adapters/OpenSearchAdapter.d.ts.map +1 -0
- package/dist/cjs/{adapters → src/adapters}/OpenSearchAdapter.js +10 -13
- package/dist/cjs/src/adapters/OpenSearchAdapter.js.map +1 -0
- package/dist/cjs/{adapters → src/adapters}/PostgreSQLAdapter.d.ts +3 -3
- package/dist/cjs/src/adapters/PostgreSQLAdapter.d.ts.map +1 -0
- package/dist/cjs/{adapters → src/adapters}/PostgreSQLAdapter.js +1 -1
- package/dist/cjs/src/adapters/PostgreSQLAdapter.js.map +1 -0
- package/dist/cjs/{adapters → src/adapters}/PrismaAdapter.d.ts +3 -3
- package/dist/cjs/src/adapters/PrismaAdapter.d.ts.map +1 -0
- package/dist/cjs/{adapters → src/adapters}/PrismaAdapter.js +35 -5
- package/dist/cjs/src/adapters/PrismaAdapter.js.map +1 -0
- package/dist/cjs/{adapters → src/adapters}/RedisAdapter.d.ts +3 -3
- package/dist/cjs/src/adapters/RedisAdapter.d.ts.map +1 -0
- package/dist/cjs/{adapters → src/adapters}/RedisAdapter.js +3 -2
- package/dist/cjs/src/adapters/RedisAdapter.js.map +1 -0
- package/dist/{adapters → cjs/src/adapters}/SQLiteAdapter.d.ts +3 -3
- package/dist/cjs/src/adapters/SQLiteAdapter.d.ts.map +1 -0
- package/dist/cjs/{adapters → src/adapters}/SQLiteAdapter.js +2 -1
- package/dist/cjs/src/adapters/SQLiteAdapter.js.map +1 -0
- package/dist/cjs/src/adapters/index.d.ts.map +1 -0
- package/dist/cjs/src/adapters/index.js.map +1 -0
- package/dist/cjs/src/constants/index.d.ts.map +1 -0
- package/dist/cjs/src/constants/index.js.map +1 -0
- package/dist/{core → cjs/src/core}/Agent.d.ts +67 -69
- package/dist/cjs/src/core/Agent.d.ts.map +1 -0
- package/dist/cjs/src/core/Agent.js +1433 -0
- package/dist/cjs/src/core/Agent.js.map +1 -0
- package/dist/cjs/src/core/Events.d.ts +26 -0
- package/dist/cjs/src/core/Events.d.ts.map +1 -0
- package/dist/cjs/src/core/Events.js +144 -0
- package/dist/cjs/src/core/Events.js.map +1 -0
- package/dist/cjs/src/core/PersistenceManager.d.ts +98 -0
- package/dist/cjs/src/core/PersistenceManager.d.ts.map +1 -0
- package/dist/cjs/{core → src/core}/PersistenceManager.js +62 -32
- package/dist/cjs/src/core/PersistenceManager.js.map +1 -0
- package/dist/cjs/src/core/PromptComposer.d.ts +27 -0
- package/dist/cjs/src/core/PromptComposer.d.ts.map +1 -0
- package/dist/cjs/src/core/PromptComposer.js +157 -0
- package/dist/cjs/src/core/PromptComposer.js.map +1 -0
- package/dist/cjs/src/core/ResponseEngine.d.ts +31 -0
- package/dist/cjs/src/core/ResponseEngine.d.ts.map +1 -0
- package/dist/cjs/src/core/ResponseEngine.js +84 -0
- package/dist/cjs/src/core/ResponseEngine.js.map +1 -0
- package/dist/cjs/src/core/ResponsePipeline.d.ts +143 -0
- package/dist/cjs/src/core/ResponsePipeline.d.ts.map +1 -0
- package/dist/cjs/src/core/ResponsePipeline.js +446 -0
- package/dist/cjs/src/core/ResponsePipeline.js.map +1 -0
- package/dist/cjs/src/core/Route.d.ts +126 -0
- package/dist/cjs/src/core/Route.d.ts.map +1 -0
- package/dist/cjs/{core → src/core}/Route.js +116 -20
- package/dist/cjs/src/core/Route.js.map +1 -0
- package/dist/{core → cjs/src/core}/RoutingEngine.d.ts +33 -38
- package/dist/cjs/src/core/RoutingEngine.d.ts.map +1 -0
- package/dist/cjs/{core → src/core}/RoutingEngine.js +102 -108
- package/dist/cjs/src/core/RoutingEngine.js.map +1 -0
- package/dist/cjs/src/core/SessionManager.d.ts +76 -0
- package/dist/cjs/src/core/SessionManager.d.ts.map +1 -0
- package/dist/cjs/src/core/SessionManager.js +197 -0
- package/dist/cjs/src/core/SessionManager.js.map +1 -0
- package/dist/cjs/src/core/Step.d.ts +96 -0
- package/dist/cjs/src/core/Step.d.ts.map +1 -0
- package/dist/cjs/src/core/Step.js +206 -0
- package/dist/cjs/src/core/Step.js.map +1 -0
- package/dist/cjs/src/core/ToolExecutor.d.ts +43 -0
- package/dist/cjs/src/core/ToolExecutor.d.ts.map +1 -0
- package/dist/cjs/{core → src/core}/ToolExecutor.js +19 -18
- package/dist/cjs/src/core/ToolExecutor.js.map +1 -0
- package/dist/{index.d.ts → cjs/src/index.d.ts} +7 -15
- package/dist/cjs/src/index.d.ts.map +1 -0
- package/dist/cjs/{index.js → src/index.js} +21 -19
- package/dist/cjs/src/index.js.map +1 -0
- package/dist/cjs/{providers → src/providers}/AnthropicProvider.d.ts +1 -1
- package/dist/cjs/src/providers/AnthropicProvider.d.ts.map +1 -0
- package/dist/cjs/{providers → src/providers}/AnthropicProvider.js +54 -2
- package/dist/cjs/src/providers/AnthropicProvider.js.map +1 -0
- package/dist/{providers → cjs/src/providers}/GeminiProvider.d.ts +1 -1
- package/dist/cjs/src/providers/GeminiProvider.d.ts.map +1 -0
- package/dist/cjs/{providers → src/providers}/GeminiProvider.js +65 -0
- package/dist/cjs/src/providers/GeminiProvider.js.map +1 -0
- package/dist/cjs/{providers → src/providers}/OpenAIProvider.d.ts +1 -1
- package/dist/cjs/src/providers/OpenAIProvider.d.ts.map +1 -0
- package/dist/cjs/{providers → src/providers}/OpenAIProvider.js +70 -1
- package/dist/cjs/src/providers/OpenAIProvider.js.map +1 -0
- package/dist/{providers → cjs/src/providers}/OpenRouterProvider.d.ts +1 -1
- package/dist/cjs/src/providers/OpenRouterProvider.d.ts.map +1 -0
- package/dist/cjs/{providers → src/providers}/OpenRouterProvider.js +76 -0
- package/dist/cjs/src/providers/OpenRouterProvider.js.map +1 -0
- package/dist/cjs/src/providers/index.d.ts.map +1 -0
- package/dist/cjs/src/providers/index.js.map +1 -0
- package/dist/cjs/{types → src/types}/agent.d.ts +54 -35
- package/dist/cjs/src/types/agent.d.ts.map +1 -0
- package/dist/cjs/src/types/agent.js.map +1 -0
- package/dist/cjs/{types → src/types}/ai.d.ts +7 -0
- package/dist/cjs/src/types/ai.d.ts.map +1 -0
- package/dist/cjs/src/types/ai.js.map +1 -0
- package/dist/{types → cjs/src/types}/history.d.ts +76 -18
- package/dist/cjs/src/types/history.d.ts.map +1 -0
- package/dist/cjs/src/types/history.js +33 -0
- package/dist/cjs/src/types/history.js.map +1 -0
- package/dist/cjs/src/types/index.d.ts +20 -0
- package/dist/cjs/src/types/index.d.ts.map +1 -0
- package/dist/cjs/src/types/index.js +30 -0
- package/dist/cjs/src/types/index.js.map +1 -0
- package/dist/{types → cjs/src/types}/persistence.d.ts +39 -23
- package/dist/cjs/src/types/persistence.d.ts.map +1 -0
- package/dist/cjs/src/types/persistence.js.map +1 -0
- package/dist/cjs/{types → src/types}/route.d.ts +85 -31
- package/dist/cjs/src/types/route.d.ts.map +1 -0
- package/dist/cjs/{types → src/types}/route.js.map +1 -1
- package/dist/cjs/src/types/routing.d.ts.map +1 -0
- package/dist/{types → cjs/src/types}/routing.js.map +1 -1
- package/dist/cjs/src/types/schema.d.ts.map +1 -0
- package/dist/{types → cjs/src/types}/schema.js.map +1 -1
- package/dist/cjs/src/types/session.d.ts +70 -0
- package/dist/cjs/src/types/session.d.ts.map +1 -0
- package/dist/cjs/src/types/session.js +6 -0
- package/dist/cjs/src/types/session.js.map +1 -0
- package/dist/cjs/src/types/template.d.ts +30 -0
- package/dist/cjs/src/types/template.d.ts.map +1 -0
- package/dist/cjs/src/types/template.js +3 -0
- package/dist/cjs/src/types/template.js.map +1 -0
- package/dist/cjs/{types → src/types}/tool.d.ts +6 -8
- package/dist/cjs/src/types/tool.d.ts.map +1 -0
- package/dist/cjs/{types → src/types}/tool.js.map +1 -1
- package/dist/cjs/src/utils/clone.d.ts +8 -0
- package/dist/cjs/src/utils/clone.d.ts.map +1 -0
- package/dist/cjs/src/utils/clone.js +36 -0
- package/dist/cjs/src/utils/clone.js.map +1 -0
- package/dist/{utils → cjs/src/utils}/event.d.ts +1 -1
- package/dist/cjs/src/utils/event.d.ts.map +1 -0
- package/dist/cjs/{utils → src/utils}/event.js +2 -2
- package/dist/cjs/src/utils/event.js.map +1 -0
- package/dist/cjs/src/utils/history.d.ts +31 -0
- package/dist/cjs/src/utils/history.d.ts.map +1 -0
- package/dist/cjs/src/utils/history.js +128 -0
- package/dist/cjs/src/utils/history.js.map +1 -0
- package/dist/cjs/src/utils/id.d.ts.map +1 -0
- package/dist/cjs/src/utils/id.js.map +1 -0
- package/dist/cjs/src/utils/index.d.ts +13 -0
- package/dist/cjs/src/utils/index.d.ts.map +1 -0
- package/dist/cjs/src/utils/index.js +49 -0
- package/dist/cjs/src/utils/index.js.map +1 -0
- package/dist/cjs/src/utils/logger.d.ts.map +1 -0
- package/dist/cjs/src/utils/logger.js.map +1 -0
- package/dist/cjs/src/utils/retry.d.ts.map +1 -0
- package/dist/cjs/src/utils/retry.js.map +1 -0
- package/dist/cjs/src/utils/session.d.ts +51 -0
- package/dist/cjs/src/utils/session.d.ts.map +1 -0
- package/dist/cjs/{types → src/utils}/session.js +36 -13
- package/dist/cjs/src/utils/session.js.map +1 -0
- package/dist/cjs/src/utils/template.d.ts +107 -0
- package/dist/cjs/src/utils/template.d.ts.map +1 -0
- package/dist/cjs/src/utils/template.js +283 -0
- package/dist/cjs/src/utils/template.js.map +1 -0
- package/dist/{cjs → src}/adapters/MemoryAdapter.d.ts +4 -4
- package/dist/src/adapters/MemoryAdapter.d.ts.map +1 -0
- package/dist/{adapters → src/adapters}/MemoryAdapter.js +41 -21
- package/dist/src/adapters/MemoryAdapter.js.map +1 -0
- package/dist/{cjs → src}/adapters/MongoAdapter.d.ts +3 -3
- package/dist/src/adapters/MongoAdapter.d.ts.map +1 -0
- package/dist/{adapters → src/adapters}/MongoAdapter.js +2 -1
- package/dist/src/adapters/MongoAdapter.js.map +1 -0
- package/dist/{adapters → src/adapters}/OpenSearchAdapter.d.ts +3 -3
- package/dist/src/adapters/OpenSearchAdapter.d.ts.map +1 -0
- package/dist/{adapters → src/adapters}/OpenSearchAdapter.js +10 -13
- package/dist/src/adapters/OpenSearchAdapter.js.map +1 -0
- package/dist/{adapters → src/adapters}/PostgreSQLAdapter.d.ts +3 -3
- package/dist/src/adapters/PostgreSQLAdapter.d.ts.map +1 -0
- package/dist/{adapters → src/adapters}/PostgreSQLAdapter.js +1 -1
- package/dist/src/adapters/PostgreSQLAdapter.js.map +1 -0
- package/dist/{adapters → src/adapters}/PrismaAdapter.d.ts +3 -3
- package/dist/src/adapters/PrismaAdapter.d.ts.map +1 -0
- package/dist/{adapters → src/adapters}/PrismaAdapter.js +35 -5
- package/dist/src/adapters/PrismaAdapter.js.map +1 -0
- package/dist/{adapters → src/adapters}/RedisAdapter.d.ts +3 -3
- package/dist/src/adapters/RedisAdapter.d.ts.map +1 -0
- package/dist/{adapters → src/adapters}/RedisAdapter.js +3 -2
- package/dist/src/adapters/RedisAdapter.js.map +1 -0
- package/dist/{cjs → src}/adapters/SQLiteAdapter.d.ts +3 -3
- package/dist/src/adapters/SQLiteAdapter.d.ts.map +1 -0
- package/dist/{adapters → src/adapters}/SQLiteAdapter.js +2 -1
- package/dist/src/adapters/SQLiteAdapter.js.map +1 -0
- package/dist/src/adapters/index.js.map +1 -0
- package/dist/src/constants/index.js.map +1 -0
- package/dist/{cjs → src}/core/Agent.d.ts +67 -69
- package/dist/src/core/Agent.d.ts.map +1 -0
- package/dist/src/core/Agent.js +1429 -0
- package/dist/src/core/Agent.js.map +1 -0
- package/dist/src/core/Events.d.ts +26 -0
- package/dist/src/core/Events.d.ts.map +1 -0
- package/dist/src/core/Events.js +137 -0
- package/dist/src/core/Events.js.map +1 -0
- package/dist/src/core/PersistenceManager.d.ts +98 -0
- package/dist/src/core/PersistenceManager.d.ts.map +1 -0
- package/dist/{core → src/core}/PersistenceManager.js +56 -26
- package/dist/src/core/PersistenceManager.js.map +1 -0
- package/dist/src/core/PromptComposer.d.ts +27 -0
- package/dist/src/core/PromptComposer.d.ts.map +1 -0
- package/dist/src/core/PromptComposer.js +153 -0
- package/dist/src/core/PromptComposer.js.map +1 -0
- package/dist/src/core/ResponseEngine.d.ts +31 -0
- package/dist/src/core/ResponseEngine.d.ts.map +1 -0
- package/dist/src/core/ResponseEngine.js +80 -0
- package/dist/src/core/ResponseEngine.js.map +1 -0
- package/dist/src/core/ResponsePipeline.d.ts +143 -0
- package/dist/src/core/ResponsePipeline.d.ts.map +1 -0
- package/dist/src/core/ResponsePipeline.js +442 -0
- package/dist/src/core/ResponsePipeline.js.map +1 -0
- package/dist/src/core/Route.d.ts +126 -0
- package/dist/src/core/Route.d.ts.map +1 -0
- package/dist/{core → src/core}/Route.js +116 -20
- package/dist/src/core/Route.js.map +1 -0
- package/dist/{cjs → src}/core/RoutingEngine.d.ts +33 -38
- package/dist/src/core/RoutingEngine.d.ts.map +1 -0
- package/dist/{core → src/core}/RoutingEngine.js +98 -104
- package/dist/src/core/RoutingEngine.js.map +1 -0
- package/dist/src/core/SessionManager.d.ts +76 -0
- package/dist/src/core/SessionManager.d.ts.map +1 -0
- package/dist/src/core/SessionManager.js +193 -0
- package/dist/src/core/SessionManager.js.map +1 -0
- package/dist/src/core/Step.d.ts +96 -0
- package/dist/src/core/Step.d.ts.map +1 -0
- package/dist/src/core/Step.js +202 -0
- package/dist/src/core/Step.js.map +1 -0
- package/dist/src/core/ToolExecutor.d.ts +43 -0
- package/dist/src/core/ToolExecutor.d.ts.map +1 -0
- package/dist/src/core/ToolExecutor.js +70 -0
- package/dist/src/core/ToolExecutor.js.map +1 -0
- package/dist/{cjs → src}/index.d.ts +7 -15
- package/dist/src/index.d.ts.map +1 -0
- package/dist/{index.js → src/index.js} +6 -7
- package/dist/src/index.js.map +1 -0
- package/dist/{providers → src/providers}/AnthropicProvider.d.ts +1 -1
- package/dist/src/providers/AnthropicProvider.d.ts.map +1 -0
- package/dist/{providers → src/providers}/AnthropicProvider.js +54 -2
- package/dist/src/providers/AnthropicProvider.js.map +1 -0
- package/dist/{cjs → src}/providers/GeminiProvider.d.ts +1 -1
- package/dist/{cjs → src}/providers/GeminiProvider.d.ts.map +1 -1
- package/dist/{providers → src/providers}/GeminiProvider.js +65 -0
- package/dist/src/providers/GeminiProvider.js.map +1 -0
- package/dist/{providers → src/providers}/OpenAIProvider.d.ts +1 -1
- package/dist/{cjs → src}/providers/OpenAIProvider.d.ts.map +1 -1
- package/dist/{providers → src/providers}/OpenAIProvider.js +70 -1
- package/dist/src/providers/OpenAIProvider.js.map +1 -0
- package/dist/{cjs → src}/providers/OpenRouterProvider.d.ts +1 -1
- package/dist/{cjs → src}/providers/OpenRouterProvider.d.ts.map +1 -1
- package/dist/{providers → src/providers}/OpenRouterProvider.js +76 -0
- package/dist/src/providers/OpenRouterProvider.js.map +1 -0
- package/dist/src/providers/index.js.map +1 -0
- package/dist/{types → src/types}/agent.d.ts +54 -35
- package/dist/src/types/agent.d.ts.map +1 -0
- package/dist/src/types/agent.js.map +1 -0
- package/dist/{types → src/types}/ai.d.ts +7 -0
- package/dist/src/types/ai.d.ts.map +1 -0
- package/dist/{cjs → src}/types/ai.js.map +1 -1
- package/dist/{cjs → src}/types/history.d.ts +76 -18
- package/dist/src/types/history.d.ts.map +1 -0
- package/dist/src/types/history.js +30 -0
- package/dist/src/types/history.js.map +1 -0
- package/dist/src/types/index.d.ts +20 -0
- package/dist/src/types/index.d.ts.map +1 -0
- package/dist/src/types/index.js +10 -0
- package/dist/src/types/index.js.map +1 -0
- package/dist/{cjs → src}/types/persistence.d.ts +39 -23
- package/dist/src/types/persistence.d.ts.map +1 -0
- package/dist/src/types/persistence.js.map +1 -0
- package/dist/{types → src/types}/route.d.ts +85 -31
- package/dist/src/types/route.d.ts.map +1 -0
- package/dist/{types → src/types}/route.js.map +1 -1
- package/dist/src/types/session.d.ts +70 -0
- package/dist/src/types/session.d.ts.map +1 -0
- package/dist/src/types/session.js +5 -0
- package/dist/src/types/session.js.map +1 -0
- package/dist/src/types/template.d.ts +30 -0
- package/dist/src/types/template.d.ts.map +1 -0
- package/dist/src/types/template.js +2 -0
- package/dist/src/types/template.js.map +1 -0
- package/dist/{types → src/types}/tool.d.ts +6 -8
- package/dist/{cjs → src}/types/tool.d.ts.map +1 -1
- package/dist/{types → src/types}/tool.js.map +1 -1
- package/dist/src/utils/clone.d.ts +8 -0
- package/dist/src/utils/clone.d.ts.map +1 -0
- package/dist/src/utils/clone.js +33 -0
- package/dist/src/utils/clone.js.map +1 -0
- package/dist/{cjs → src}/utils/event.d.ts +1 -1
- package/dist/{cjs → src}/utils/event.d.ts.map +1 -1
- package/dist/{utils → src/utils}/event.js +1 -1
- package/dist/src/utils/event.js.map +1 -0
- package/dist/src/utils/history.d.ts +31 -0
- package/dist/src/utils/history.d.ts.map +1 -0
- package/dist/src/utils/history.js +121 -0
- package/dist/src/utils/history.js.map +1 -0
- package/dist/src/utils/id.js.map +1 -0
- package/dist/src/utils/index.d.ts +13 -0
- package/dist/src/utils/index.d.ts.map +1 -0
- package/dist/src/utils/index.js +19 -0
- package/dist/src/utils/index.js.map +1 -0
- package/dist/src/utils/logger.js.map +1 -0
- package/dist/src/utils/retry.js.map +1 -0
- package/dist/src/utils/session.d.ts +51 -0
- package/dist/src/utils/session.d.ts.map +1 -0
- package/dist/{types → src/utils}/session.js +34 -13
- package/dist/src/utils/session.js.map +1 -0
- package/dist/src/utils/template.d.ts +107 -0
- package/dist/src/utils/template.d.ts.map +1 -0
- package/dist/src/utils/template.js +276 -0
- package/dist/src/utils/template.js.map +1 -0
- package/docs/README.md +174 -68
- package/docs/{API_REFERENCE.md → api/README.md} +902 -263
- package/docs/api/overview.md +798 -0
- package/docs/core/agent/README.md +642 -0
- package/docs/{CONTEXT_MANAGEMENT.md → core/agent/context-management.md} +144 -95
- package/docs/{ARCHITECTURE.md → core/agent/session-management.md} +74 -59
- package/docs/core/ai-integration/prompt-composition.md +196 -0
- package/docs/core/ai-integration/providers.md +515 -0
- package/docs/core/ai-integration/response-processing.md +165 -0
- package/docs/core/conversation-flows/data-collection.md +545 -0
- package/docs/core/conversation-flows/route-dsl.md +479 -0
- package/docs/core/conversation-flows/routes.md +61 -0
- package/docs/core/conversation-flows/step-transitions.md +595 -0
- package/docs/core/conversation-flows/steps.md +130 -0
- package/docs/{ADAPTERS.md → core/persistence/adapters.md} +2 -2
- package/docs/core/persistence/session-storage.md +644 -0
- package/docs/core/routing/intelligent-routing.md +339 -0
- package/docs/core/tools/tool-definition.md +346 -0
- package/docs/core/tools/tool-execution.md +815 -0
- package/docs/core/tools/tool-scoping.md +628 -0
- package/docs/guides/getting-started/README.md +384 -0
- package/examples/{company-qna-agent.ts → advanced-patterns/knowledge-based-agent.ts} +104 -69
- package/examples/{persistent-onboarding.ts → advanced-patterns/persistent-onboarding.ts} +181 -103
- package/examples/{rules-prohibitions.ts → advanced-patterns/route-lifecycle-hooks.ts} +102 -82
- package/examples/{streaming-agent.ts → advanced-patterns/streaming-responses.ts} +90 -69
- package/examples/ai-providers/anthropic-integration.ts +377 -0
- package/examples/{openai-agent.ts → ai-providers/openai-integration.ts} +37 -43
- package/examples/{route-transitions.ts → conversation-flows/completion-transitions.ts} +115 -108
- package/examples/{declarative-agent.ts → core-concepts/basic-agent.ts} +175 -131
- package/examples/core-concepts/schema-driven-extraction.ts +301 -0
- package/examples/core-concepts/session-management.ts +394 -0
- package/examples/integrations/database-integration.ts +615 -0
- package/examples/{healthcare-agent.ts → integrations/healthcare-integration.ts} +204 -111
- package/examples/{opensearch-persistence.ts → integrations/search-integration.ts} +159 -128
- package/examples/integrations/server-session-management.ts +299 -0
- package/examples/persistence/custom-adapter.ts +529 -0
- package/examples/{prisma-persistence.ts → persistence/database-persistence.ts} +168 -241
- package/examples/persistence/memory-sessions.ts +506 -0
- package/examples/{prisma-schema.example.prisma → persistence/prisma-schema.example.prisma} +1 -1
- package/examples/{redis-persistence.ts → persistence/redis-persistence.ts} +152 -173
- package/examples/tools/basic-tools.ts +550 -0
- package/examples/{extracted-data-modification.ts → tools/data-enrichment-tools.ts} +82 -79
- package/package.json +14 -10
- package/src/adapters/MemoryAdapter.ts +74 -46
- package/src/adapters/MongoAdapter.ts +33 -24
- package/src/adapters/OpenSearchAdapter.ts +41 -37
- package/src/adapters/PostgreSQLAdapter.ts +35 -24
- package/src/adapters/PrismaAdapter.ts +69 -27
- package/src/adapters/RedisAdapter.ts +38 -26
- package/src/adapters/SQLiteAdapter.ts +32 -22
- package/src/core/Agent.ts +1102 -487
- package/src/core/Events.ts +100 -112
- package/src/core/PersistenceManager.ts +87 -57
- package/src/core/PromptComposer.ts +158 -85
- package/src/core/ResponseEngine.ts +118 -38
- package/src/core/ResponsePipeline.ts +715 -0
- package/src/core/Route.ts +168 -51
- package/src/core/RoutingEngine.ts +178 -209
- package/src/core/SessionManager.ts +241 -0
- package/src/core/Step.ts +149 -67
- package/src/core/ToolExecutor.ts +37 -42
- package/src/index.ts +31 -37
- package/src/providers/AnthropicProvider.ts +71 -5
- package/src/providers/GeminiProvider.ts +83 -2
- package/src/providers/OpenAIProvider.ts +95 -3
- package/src/providers/OpenRouterProvider.ts +102 -2
- package/src/types/agent.ts +50 -38
- package/src/types/ai.ts +7 -0
- package/src/types/history.ts +91 -18
- package/src/types/index.ts +43 -7
- package/src/types/persistence.ts +46 -28
- package/src/types/route.ts +104 -45
- package/src/types/session.ts +19 -213
- package/src/types/template.ts +36 -0
- package/src/types/tool.ts +9 -11
- package/src/utils/clone.ts +36 -0
- package/src/utils/event.ts +1 -1
- package/src/utils/history.ts +143 -0
- package/src/utils/index.ts +53 -0
- package/src/utils/session.ts +229 -0
- package/src/utils/template.ts +335 -0
- package/dist/adapters/MemoryAdapter.d.ts.map +0 -1
- package/dist/adapters/MemoryAdapter.js.map +0 -1
- package/dist/adapters/MongoAdapter.d.ts.map +0 -1
- package/dist/adapters/MongoAdapter.js.map +0 -1
- package/dist/adapters/OpenSearchAdapter.d.ts.map +0 -1
- package/dist/adapters/OpenSearchAdapter.js.map +0 -1
- package/dist/adapters/PostgreSQLAdapter.d.ts.map +0 -1
- package/dist/adapters/PostgreSQLAdapter.js.map +0 -1
- package/dist/adapters/PrismaAdapter.d.ts.map +0 -1
- package/dist/adapters/PrismaAdapter.js.map +0 -1
- package/dist/adapters/RedisAdapter.d.ts.map +0 -1
- package/dist/adapters/RedisAdapter.js.map +0 -1
- package/dist/adapters/SQLiteAdapter.d.ts.map +0 -1
- package/dist/adapters/SQLiteAdapter.js.map +0 -1
- package/dist/adapters/index.d.ts.map +0 -1
- package/dist/adapters/index.js.map +0 -1
- package/dist/cjs/adapters/MemoryAdapter.d.ts.map +0 -1
- package/dist/cjs/adapters/MemoryAdapter.js.map +0 -1
- package/dist/cjs/adapters/MongoAdapter.d.ts.map +0 -1
- package/dist/cjs/adapters/MongoAdapter.js.map +0 -1
- package/dist/cjs/adapters/OpenSearchAdapter.d.ts.map +0 -1
- package/dist/cjs/adapters/OpenSearchAdapter.js.map +0 -1
- package/dist/cjs/adapters/PostgreSQLAdapter.d.ts.map +0 -1
- package/dist/cjs/adapters/PostgreSQLAdapter.js.map +0 -1
- package/dist/cjs/adapters/PrismaAdapter.d.ts.map +0 -1
- package/dist/cjs/adapters/PrismaAdapter.js.map +0 -1
- package/dist/cjs/adapters/RedisAdapter.d.ts.map +0 -1
- package/dist/cjs/adapters/RedisAdapter.js.map +0 -1
- package/dist/cjs/adapters/SQLiteAdapter.d.ts.map +0 -1
- package/dist/cjs/adapters/SQLiteAdapter.js.map +0 -1
- package/dist/cjs/adapters/index.js.map +0 -1
- package/dist/cjs/constants/index.js.map +0 -1
- package/dist/cjs/core/Agent.d.ts.map +0 -1
- package/dist/cjs/core/Agent.js +0 -966
- package/dist/cjs/core/Agent.js.map +0 -1
- package/dist/cjs/core/DomainRegistry.d.ts +0 -36
- package/dist/cjs/core/DomainRegistry.d.ts.map +0 -1
- package/dist/cjs/core/DomainRegistry.js +0 -72
- package/dist/cjs/core/DomainRegistry.js.map +0 -1
- package/dist/cjs/core/Events.d.ts +0 -41
- package/dist/cjs/core/Events.d.ts.map +0 -1
- package/dist/cjs/core/Events.js +0 -99
- package/dist/cjs/core/Events.js.map +0 -1
- package/dist/cjs/core/PersistenceManager.d.ts +0 -96
- package/dist/cjs/core/PersistenceManager.d.ts.map +0 -1
- package/dist/cjs/core/PersistenceManager.js.map +0 -1
- package/dist/cjs/core/PromptComposer.d.ts +0 -24
- package/dist/cjs/core/PromptComposer.d.ts.map +0 -1
- package/dist/cjs/core/PromptComposer.js +0 -127
- package/dist/cjs/core/PromptComposer.js.map +0 -1
- package/dist/cjs/core/ResponseEngine.d.ts +0 -14
- package/dist/cjs/core/ResponseEngine.d.ts.map +0 -1
- package/dist/cjs/core/ResponseEngine.js +0 -56
- package/dist/cjs/core/ResponseEngine.js.map +0 -1
- package/dist/cjs/core/Route.d.ts +0 -90
- package/dist/cjs/core/Route.d.ts.map +0 -1
- package/dist/cjs/core/Route.js.map +0 -1
- package/dist/cjs/core/RoutingEngine.d.ts.map +0 -1
- package/dist/cjs/core/RoutingEngine.js.map +0 -1
- package/dist/cjs/core/Step.d.ts +0 -72
- package/dist/cjs/core/Step.d.ts.map +0 -1
- package/dist/cjs/core/Step.js +0 -150
- package/dist/cjs/core/Step.js.map +0 -1
- package/dist/cjs/core/Tool.d.ts +0 -39
- package/dist/cjs/core/Tool.d.ts.map +0 -1
- package/dist/cjs/core/Tool.js +0 -34
- package/dist/cjs/core/Tool.js.map +0 -1
- package/dist/cjs/core/ToolExecutor.d.ts +0 -29
- package/dist/cjs/core/ToolExecutor.d.ts.map +0 -1
- package/dist/cjs/core/ToolExecutor.js.map +0 -1
- package/dist/cjs/core/Transition.d.ts +0 -32
- package/dist/cjs/core/Transition.d.ts.map +0 -1
- package/dist/cjs/core/Transition.js +0 -89
- package/dist/cjs/core/Transition.js.map +0 -1
- package/dist/cjs/index.d.ts.map +0 -1
- package/dist/cjs/index.js.map +0 -1
- package/dist/cjs/providers/AnthropicProvider.d.ts.map +0 -1
- package/dist/cjs/providers/AnthropicProvider.js.map +0 -1
- package/dist/cjs/providers/GeminiProvider.js.map +0 -1
- package/dist/cjs/providers/OpenAIProvider.js.map +0 -1
- package/dist/cjs/providers/OpenRouterProvider.js.map +0 -1
- package/dist/cjs/providers/index.js.map +0 -1
- package/dist/cjs/types/agent.d.ts.map +0 -1
- package/dist/cjs/types/agent.js.map +0 -1
- package/dist/cjs/types/ai.d.ts.map +0 -1
- package/dist/cjs/types/history.d.ts.map +0 -1
- package/dist/cjs/types/history.js +0 -37
- package/dist/cjs/types/history.js.map +0 -1
- package/dist/cjs/types/index.d.ts +0 -12
- package/dist/cjs/types/index.d.ts.map +0 -1
- package/dist/cjs/types/index.js +0 -12
- package/dist/cjs/types/index.js.map +0 -1
- package/dist/cjs/types/persistence.d.ts.map +0 -1
- package/dist/cjs/types/persistence.js.map +0 -1
- package/dist/cjs/types/route.d.ts.map +0 -1
- package/dist/cjs/types/session.d.ts +0 -104
- package/dist/cjs/types/session.d.ts.map +0 -1
- package/dist/cjs/types/session.js.map +0 -1
- package/dist/cjs/utils/event.js.map +0 -1
- package/dist/cjs/utils/id.js.map +0 -1
- package/dist/cjs/utils/logger.js.map +0 -1
- package/dist/cjs/utils/retry.js.map +0 -1
- package/dist/constants/index.d.ts.map +0 -1
- package/dist/constants/index.js.map +0 -1
- package/dist/core/Agent.d.ts.map +0 -1
- package/dist/core/Agent.js +0 -962
- package/dist/core/Agent.js.map +0 -1
- package/dist/core/DomainRegistry.d.ts +0 -36
- package/dist/core/DomainRegistry.d.ts.map +0 -1
- package/dist/core/DomainRegistry.js +0 -68
- package/dist/core/DomainRegistry.js.map +0 -1
- package/dist/core/Events.d.ts +0 -41
- package/dist/core/Events.d.ts.map +0 -1
- package/dist/core/Events.js +0 -94
- package/dist/core/Events.js.map +0 -1
- package/dist/core/PersistenceManager.d.ts +0 -96
- package/dist/core/PersistenceManager.d.ts.map +0 -1
- package/dist/core/PersistenceManager.js.map +0 -1
- package/dist/core/PromptComposer.d.ts +0 -24
- package/dist/core/PromptComposer.d.ts.map +0 -1
- package/dist/core/PromptComposer.js +0 -123
- package/dist/core/PromptComposer.js.map +0 -1
- package/dist/core/ResponseEngine.d.ts +0 -14
- package/dist/core/ResponseEngine.d.ts.map +0 -1
- package/dist/core/ResponseEngine.js +0 -52
- package/dist/core/ResponseEngine.js.map +0 -1
- package/dist/core/Route.d.ts +0 -90
- package/dist/core/Route.d.ts.map +0 -1
- package/dist/core/Route.js.map +0 -1
- package/dist/core/RoutingEngine.d.ts.map +0 -1
- package/dist/core/RoutingEngine.js.map +0 -1
- package/dist/core/Step.d.ts +0 -72
- package/dist/core/Step.d.ts.map +0 -1
- package/dist/core/Step.js +0 -146
- package/dist/core/Step.js.map +0 -1
- package/dist/core/Tool.d.ts +0 -39
- package/dist/core/Tool.d.ts.map +0 -1
- package/dist/core/Tool.js +0 -31
- package/dist/core/Tool.js.map +0 -1
- package/dist/core/ToolExecutor.d.ts +0 -29
- package/dist/core/ToolExecutor.d.ts.map +0 -1
- package/dist/core/ToolExecutor.js +0 -69
- package/dist/core/ToolExecutor.js.map +0 -1
- package/dist/core/Transition.d.ts +0 -32
- package/dist/core/Transition.d.ts.map +0 -1
- package/dist/core/Transition.js +0 -85
- package/dist/core/Transition.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/providers/AnthropicProvider.d.ts.map +0 -1
- package/dist/providers/AnthropicProvider.js.map +0 -1
- package/dist/providers/GeminiProvider.d.ts.map +0 -1
- package/dist/providers/GeminiProvider.js.map +0 -1
- package/dist/providers/OpenAIProvider.d.ts.map +0 -1
- package/dist/providers/OpenAIProvider.js.map +0 -1
- package/dist/providers/OpenRouterProvider.d.ts.map +0 -1
- package/dist/providers/OpenRouterProvider.js.map +0 -1
- package/dist/providers/index.d.ts.map +0 -1
- package/dist/providers/index.js.map +0 -1
- package/dist/types/agent.d.ts.map +0 -1
- package/dist/types/agent.js.map +0 -1
- package/dist/types/ai.d.ts.map +0 -1
- package/dist/types/ai.js.map +0 -1
- package/dist/types/history.d.ts.map +0 -1
- package/dist/types/history.js +0 -34
- package/dist/types/history.js.map +0 -1
- package/dist/types/index.d.ts +0 -12
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -6
- package/dist/types/index.js.map +0 -1
- package/dist/types/persistence.d.ts.map +0 -1
- package/dist/types/persistence.js.map +0 -1
- package/dist/types/route.d.ts.map +0 -1
- package/dist/types/routing.d.ts.map +0 -1
- package/dist/types/schema.d.ts.map +0 -1
- package/dist/types/session.d.ts +0 -104
- package/dist/types/session.d.ts.map +0 -1
- package/dist/types/session.js.map +0 -1
- package/dist/types/tool.d.ts.map +0 -1
- package/dist/utils/event.d.ts.map +0 -1
- package/dist/utils/event.js.map +0 -1
- package/dist/utils/id.d.ts.map +0 -1
- package/dist/utils/id.js.map +0 -1
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/logger.js.map +0 -1
- package/dist/utils/retry.d.ts.map +0 -1
- package/dist/utils/retry.js.map +0 -1
- package/docs/AGENT.md +0 -535
- package/docs/DOCS.md +0 -263
- package/docs/DOMAINS.md +0 -735
- package/docs/EXAMPLES.md +0 -467
- package/docs/GETTING_STARTED.md +0 -424
- package/docs/PERSISTENCE.md +0 -815
- package/docs/PROVIDERS.md +0 -612
- package/docs/ROUTES.md +0 -1085
- package/docs/STEPS.md +0 -883
- package/examples/business-onboarding.ts +0 -791
- package/examples/custom-database-persistence.ts +0 -574
- package/examples/domain-scoping.ts +0 -366
- package/examples/travel-agent.ts +0 -584
- package/src/core/DomainRegistry.ts +0 -80
- package/src/core/Tool.ts +0 -112
- package/src/core/Transition.ts +0 -115
- /package/dist/{adapters → cjs/src/adapters}/index.d.ts +0 -0
- /package/dist/cjs/{adapters → src/adapters}/index.js +0 -0
- /package/dist/cjs/{constants → src/constants}/index.d.ts +0 -0
- /package/dist/cjs/{constants → src/constants}/index.js +0 -0
- /package/dist/cjs/{providers → src/providers}/index.d.ts +0 -0
- /package/dist/cjs/{providers → src/providers}/index.js +0 -0
- /package/dist/cjs/{types → src/types}/agent.js +0 -0
- /package/dist/cjs/{types → src/types}/ai.js +0 -0
- /package/dist/cjs/{types → src/types}/persistence.js +0 -0
- /package/dist/cjs/{types → src/types}/route.js +0 -0
- /package/dist/cjs/{types → src/types}/routing.d.ts +0 -0
- /package/dist/cjs/{types → src/types}/routing.js +0 -0
- /package/dist/cjs/{types → src/types}/schema.d.ts +0 -0
- /package/dist/cjs/{types → src/types}/schema.js +0 -0
- /package/dist/cjs/{types → src/types}/tool.js +0 -0
- /package/dist/cjs/{utils → src/utils}/id.d.ts +0 -0
- /package/dist/cjs/{utils → src/utils}/id.js +0 -0
- /package/dist/cjs/{utils → src/utils}/logger.d.ts +0 -0
- /package/dist/cjs/{utils → src/utils}/logger.js +0 -0
- /package/dist/cjs/{utils → src/utils}/retry.d.ts +0 -0
- /package/dist/cjs/{utils → src/utils}/retry.js +0 -0
- /package/dist/{cjs → src}/adapters/index.d.ts +0 -0
- /package/dist/{cjs → src}/adapters/index.d.ts.map +0 -0
- /package/dist/{adapters → src/adapters}/index.js +0 -0
- /package/dist/{constants → src/constants}/index.d.ts +0 -0
- /package/dist/{cjs → src}/constants/index.d.ts.map +0 -0
- /package/dist/{constants → src/constants}/index.js +0 -0
- /package/dist/{providers → src/providers}/index.d.ts +0 -0
- /package/dist/{cjs → src}/providers/index.d.ts.map +0 -0
- /package/dist/{providers → src/providers}/index.js +0 -0
- /package/dist/{types → src/types}/agent.js +0 -0
- /package/dist/{types → src/types}/ai.js +0 -0
- /package/dist/{types → src/types}/persistence.js +0 -0
- /package/dist/{types → src/types}/route.js +0 -0
- /package/dist/{types → src/types}/routing.d.ts +0 -0
- /package/dist/{cjs → src}/types/routing.d.ts.map +0 -0
- /package/dist/{types → src/types}/routing.js +0 -0
- /package/dist/{cjs → src}/types/routing.js.map +0 -0
- /package/dist/{types → src/types}/schema.d.ts +0 -0
- /package/dist/{cjs → src}/types/schema.d.ts.map +0 -0
- /package/dist/{types → src/types}/schema.js +0 -0
- /package/dist/{cjs → src}/types/schema.js.map +0 -0
- /package/dist/{types → src/types}/tool.js +0 -0
- /package/dist/{utils → src/utils}/id.d.ts +0 -0
- /package/dist/{cjs → src}/utils/id.d.ts.map +0 -0
- /package/dist/{utils → src/utils}/id.js +0 -0
- /package/dist/{utils → src/utils}/logger.d.ts +0 -0
- /package/dist/{cjs → src}/utils/logger.d.ts.map +0 -0
- /package/dist/{utils → src/utils}/logger.js +0 -0
- /package/dist/{utils → src/utils}/retry.d.ts +0 -0
- /package/dist/{cjs → src}/utils/retry.d.ts.map +0 -0
- /package/dist/{utils → src/utils}/retry.js +0 -0
- /package/docs/{PUBLISHING.md → guides/advanced-patterns/publishing.md} +0 -0
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema-Driven Data Extraction Example
|
|
3
|
+
*
|
|
4
|
+
* This example demonstrates how to use JSON Schema to define data contracts
|
|
5
|
+
* and extract structured data reliably from conversations.
|
|
6
|
+
*
|
|
7
|
+
* Key concepts:
|
|
8
|
+
* - Schema-first data definition
|
|
9
|
+
* - Type-safe data extraction
|
|
10
|
+
* - Automatic validation
|
|
11
|
+
* - SkipIf conditions for smart flow control
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { Agent, GeminiProvider, type Tool } from "../../src/index";
|
|
15
|
+
|
|
16
|
+
// Define the data structure we want to collect
|
|
17
|
+
interface UserProfileData {
|
|
18
|
+
name: string;
|
|
19
|
+
email: string;
|
|
20
|
+
age: number;
|
|
21
|
+
interests: string[];
|
|
22
|
+
preferredContact: "email" | "phone" | "sms";
|
|
23
|
+
newsletterOptIn: boolean;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// Define a tool that uses the collected data
|
|
27
|
+
const saveUserProfile: Tool<unknown, [], string, UserProfileData> = {
|
|
28
|
+
id: "save_user_profile",
|
|
29
|
+
description: "Save the collected user profile information",
|
|
30
|
+
parameters: {
|
|
31
|
+
type: "object",
|
|
32
|
+
properties: {},
|
|
33
|
+
},
|
|
34
|
+
handler: ({ data }) => {
|
|
35
|
+
console.log("Saving user profile:", data);
|
|
36
|
+
|
|
37
|
+
// Simulate saving to database
|
|
38
|
+
console.log("Profile data:", data);
|
|
39
|
+
|
|
40
|
+
const userData = data as Partial<UserProfileData>;
|
|
41
|
+
return {
|
|
42
|
+
data: `Profile saved successfully! Welcome ${userData?.name}!`,
|
|
43
|
+
};
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
// Create the agent
|
|
48
|
+
const agent = new Agent({
|
|
49
|
+
name: "ProfileBot",
|
|
50
|
+
description:
|
|
51
|
+
"A bot that collects user profile information using schema-driven extraction",
|
|
52
|
+
provider: new GeminiProvider({
|
|
53
|
+
apiKey: process.env.GEMINI_API_KEY!,
|
|
54
|
+
model: "models/gemini-2.5-flash",
|
|
55
|
+
}),
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
// Define the schema for data validation and extraction
|
|
59
|
+
const userProfileSchema = {
|
|
60
|
+
type: "object",
|
|
61
|
+
properties: {
|
|
62
|
+
name: {
|
|
63
|
+
type: "string",
|
|
64
|
+
description: "The user's full name",
|
|
65
|
+
minLength: 2,
|
|
66
|
+
maxLength: 100,
|
|
67
|
+
},
|
|
68
|
+
email: {
|
|
69
|
+
type: "string",
|
|
70
|
+
format: "email",
|
|
71
|
+
description: "The user's email address",
|
|
72
|
+
},
|
|
73
|
+
age: {
|
|
74
|
+
type: "number",
|
|
75
|
+
description: "The user's age in years",
|
|
76
|
+
minimum: 13,
|
|
77
|
+
maximum: 120,
|
|
78
|
+
},
|
|
79
|
+
interests: {
|
|
80
|
+
type: "array",
|
|
81
|
+
items: { type: "string" },
|
|
82
|
+
description: "User's interests and hobbies",
|
|
83
|
+
minItems: 1,
|
|
84
|
+
maxItems: 10,
|
|
85
|
+
},
|
|
86
|
+
preferredContact: {
|
|
87
|
+
type: "string",
|
|
88
|
+
enum: ["email", "phone", "sms"],
|
|
89
|
+
description: "Preferred contact method",
|
|
90
|
+
default: "email",
|
|
91
|
+
},
|
|
92
|
+
newsletterOptIn: {
|
|
93
|
+
type: "boolean",
|
|
94
|
+
description: "Whether user wants to receive newsletters",
|
|
95
|
+
default: false,
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
required: ["name", "email"],
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
// Create a route that collects profile information step by step
|
|
102
|
+
agent.createRoute<UserProfileData>({
|
|
103
|
+
title: "User Profile Collection",
|
|
104
|
+
description: "Collect comprehensive user profile information",
|
|
105
|
+
schema: userProfileSchema,
|
|
106
|
+
// Use sequential steps for a linear flow with smart skipIf conditions
|
|
107
|
+
steps: [
|
|
108
|
+
{
|
|
109
|
+
id: "ask_name",
|
|
110
|
+
description: "Ask for user's name",
|
|
111
|
+
prompt: "Hi! I'd like to create a profile for you. What's your name?",
|
|
112
|
+
collect: ["name"],
|
|
113
|
+
skipIf: (data: Partial<UserProfileData>) => !!data.name,
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
id: "ask_email",
|
|
117
|
+
description: "Ask for user's email",
|
|
118
|
+
prompt: "What's your email address?",
|
|
119
|
+
collect: ["email"],
|
|
120
|
+
requires: ["name"],
|
|
121
|
+
skipIf: (data: Partial<UserProfileData>) => !!data.email,
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
id: "ask_age",
|
|
125
|
+
description: "Ask for user's age (optional)",
|
|
126
|
+
prompt: "How old are you? (optional)",
|
|
127
|
+
collect: ["age"],
|
|
128
|
+
requires: ["name", "email"],
|
|
129
|
+
skipIf: (data: Partial<UserProfileData>) => data.age !== undefined,
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
id: "ask_interests",
|
|
133
|
+
description: "Ask for user's interests (optional)",
|
|
134
|
+
prompt: "What are your interests or hobbies? (optional)",
|
|
135
|
+
collect: ["interests"],
|
|
136
|
+
requires: ["name", "email"],
|
|
137
|
+
skipIf: (data: Partial<UserProfileData>) =>
|
|
138
|
+
!!(data.interests && data.interests.length > 0),
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
id: "ask_contact_preference",
|
|
142
|
+
description: "Ask for preferred contact method",
|
|
143
|
+
prompt: "What's your preferred contact method?",
|
|
144
|
+
collect: ["preferredContact"],
|
|
145
|
+
requires: ["name", "email"],
|
|
146
|
+
skipIf: (data: Partial<UserProfileData>) => !!data.preferredContact,
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
id: "ask_newsletter",
|
|
150
|
+
description: "Ask about newsletter subscription",
|
|
151
|
+
prompt: "Would you like to subscribe to our newsletter?",
|
|
152
|
+
collect: ["newsletterOptIn"],
|
|
153
|
+
requires: ["name", "email"],
|
|
154
|
+
skipIf: (data: Partial<UserProfileData>) =>
|
|
155
|
+
data.newsletterOptIn !== undefined,
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
id: "save_profile",
|
|
159
|
+
description: "Save the collected profile",
|
|
160
|
+
prompt:
|
|
161
|
+
"Thanks for providing your information! Let me save your profile.",
|
|
162
|
+
tools: [saveUserProfile],
|
|
163
|
+
requires: ["name", "email"],
|
|
164
|
+
},
|
|
165
|
+
],
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
// Example conversation demonstrating schema-driven extraction
|
|
169
|
+
async function demonstrateSchemaExtraction() {
|
|
170
|
+
console.log("=== Schema-Driven Data Extraction Demo ===\n");
|
|
171
|
+
|
|
172
|
+
// First message - user provides name and email
|
|
173
|
+
console.log("User: Hi, I'm John Doe and my email is john@example.com");
|
|
174
|
+
const response1 = await agent.respond({
|
|
175
|
+
history: [
|
|
176
|
+
{
|
|
177
|
+
role: "user",
|
|
178
|
+
content: "Hi, I'm John Doe and my email is john@example.com",
|
|
179
|
+
name: "John",
|
|
180
|
+
},
|
|
181
|
+
],
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
console.log("Bot:", response1.message);
|
|
185
|
+
console.log(
|
|
186
|
+
"Collected data:",
|
|
187
|
+
JSON.stringify(response1.session?.data as Partial<UserProfileData>, null, 2)
|
|
188
|
+
);
|
|
189
|
+
|
|
190
|
+
// Second message - user provides more information
|
|
191
|
+
console.log(
|
|
192
|
+
"\nUser: I'm 30 years old and I like hiking, reading, and photography"
|
|
193
|
+
);
|
|
194
|
+
const response2 = await agent.respond({
|
|
195
|
+
history: [
|
|
196
|
+
{
|
|
197
|
+
role: "user",
|
|
198
|
+
content: "Hi, I'm John Doe and my email is john@example.com",
|
|
199
|
+
name: "John",
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
role: "assistant",
|
|
203
|
+
content: response1.message,
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
role: "user",
|
|
207
|
+
content: "I'm 30 years old and I like hiking, reading, and photography",
|
|
208
|
+
name: "John",
|
|
209
|
+
},
|
|
210
|
+
],
|
|
211
|
+
session: response1.session,
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
console.log("Bot:", response2.message);
|
|
215
|
+
console.log(
|
|
216
|
+
"Collected data:",
|
|
217
|
+
JSON.stringify(response2.session?.data as Partial<UserProfileData>, null, 2)
|
|
218
|
+
);
|
|
219
|
+
|
|
220
|
+
// Third message - user provides contact preference and completes profile
|
|
221
|
+
console.log(
|
|
222
|
+
"\nUser: Please contact me by email and yes, I'd like the newsletter"
|
|
223
|
+
);
|
|
224
|
+
const response3 = await agent.respond({
|
|
225
|
+
history: [
|
|
226
|
+
{
|
|
227
|
+
role: "user",
|
|
228
|
+
content: "Hi, I'm John Doe and my email is john@example.com",
|
|
229
|
+
name: "John",
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
role: "assistant",
|
|
233
|
+
content: response1.message,
|
|
234
|
+
},
|
|
235
|
+
{
|
|
236
|
+
role: "user",
|
|
237
|
+
content: "I'm 30 years old and I like hiking, reading, and photography",
|
|
238
|
+
name: "John",
|
|
239
|
+
},
|
|
240
|
+
{
|
|
241
|
+
role: "assistant",
|
|
242
|
+
content: response2.message,
|
|
243
|
+
},
|
|
244
|
+
{
|
|
245
|
+
role: "user",
|
|
246
|
+
content: "Please contact me by email and yes, I'd like the newsletter",
|
|
247
|
+
name: "John",
|
|
248
|
+
},
|
|
249
|
+
],
|
|
250
|
+
session: response2.session,
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
console.log("Bot:", response3.message);
|
|
254
|
+
console.log(
|
|
255
|
+
"Final collected data:",
|
|
256
|
+
JSON.stringify(response3.session?.data as Partial<UserProfileData>, null, 2)
|
|
257
|
+
);
|
|
258
|
+
console.log("Route complete:", response3.isRouteComplete);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
// Demonstrate with a single comprehensive message
|
|
262
|
+
async function demonstrateSmartSkipping() {
|
|
263
|
+
console.log("\n=== Smart Skipping Demo ===\n");
|
|
264
|
+
|
|
265
|
+
console.log("User provides everything in one message:");
|
|
266
|
+
console.log(
|
|
267
|
+
"User: I'm Sarah Johnson, sarah@email.com, 28 years old. I enjoy cooking, travel, and music. Contact me by phone and yes to newsletter."
|
|
268
|
+
);
|
|
269
|
+
|
|
270
|
+
const response = await agent.respond({
|
|
271
|
+
history: [
|
|
272
|
+
{
|
|
273
|
+
role: "user",
|
|
274
|
+
content:
|
|
275
|
+
"I'm Sarah Johnson, sarah@email.com, 28 years old. I enjoy cooking, travel, and music. Contact me by phone and yes to newsletter.",
|
|
276
|
+
name: "Sarah",
|
|
277
|
+
},
|
|
278
|
+
],
|
|
279
|
+
});
|
|
280
|
+
|
|
281
|
+
console.log("Bot:", response.message);
|
|
282
|
+
console.log(
|
|
283
|
+
"Collected data:",
|
|
284
|
+
JSON.stringify(response.session?.data as Partial<UserProfileData>, null, 2)
|
|
285
|
+
);
|
|
286
|
+
console.log("Route complete:", response.isRouteComplete);
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
// Run the demonstrations
|
|
290
|
+
async function main() {
|
|
291
|
+
try {
|
|
292
|
+
await demonstrateSchemaExtraction();
|
|
293
|
+
await demonstrateSmartSkipping();
|
|
294
|
+
} catch (error) {
|
|
295
|
+
console.error("Error:", error);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
300
|
+
main().catch(console.error);
|
|
301
|
+
}
|
|
@@ -0,0 +1,394 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Management Example
|
|
3
|
+
*
|
|
4
|
+
* This example demonstrates how to manage conversation state across multiple turns
|
|
5
|
+
* using session management, persistence, and state restoration.
|
|
6
|
+
*
|
|
7
|
+
* Key concepts:
|
|
8
|
+
* - Session state management
|
|
9
|
+
* - Multi-turn conversations
|
|
10
|
+
* - Data persistence across turns
|
|
11
|
+
* - Session restoration
|
|
12
|
+
* - Route transitions with session state
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import {
|
|
16
|
+
Agent,
|
|
17
|
+
GeminiProvider,
|
|
18
|
+
MemoryAdapter,
|
|
19
|
+
type Tool,
|
|
20
|
+
} from "../../src/index";
|
|
21
|
+
|
|
22
|
+
// Define data types for our multi-step process
|
|
23
|
+
interface OrderData {
|
|
24
|
+
customerName: string;
|
|
25
|
+
productType: "laptop" | "phone" | "tablet";
|
|
26
|
+
budget: number;
|
|
27
|
+
preferredColor?: string;
|
|
28
|
+
urgentDelivery: boolean;
|
|
29
|
+
orderId?: string;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
interface OrderContext {
|
|
33
|
+
userId: string;
|
|
34
|
+
userName: string;
|
|
35
|
+
isVip: boolean;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
interface PaymentData {
|
|
39
|
+
orderId: string;
|
|
40
|
+
paymentMethod: "credit_card" | "paypal" | "bank_transfer";
|
|
41
|
+
amount: number;
|
|
42
|
+
confirmed: boolean;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Tools for order processing
|
|
46
|
+
const createOrder: Tool<unknown, [], string, OrderData> = {
|
|
47
|
+
id: "create_order",
|
|
48
|
+
description: "Create a new order from the collected order data",
|
|
49
|
+
parameters: {
|
|
50
|
+
type: "object",
|
|
51
|
+
properties: {},
|
|
52
|
+
},
|
|
53
|
+
handler: ({ data }) => {
|
|
54
|
+
const orderId = `ORD-${Date.now()}`;
|
|
55
|
+
const orderData = data as Partial<OrderData>;
|
|
56
|
+
console.log(`Creating order ${orderId} for ${orderData?.customerName}`);
|
|
57
|
+
|
|
58
|
+
return {
|
|
59
|
+
data: `Order ${orderId} created successfully!`,
|
|
60
|
+
dataUpdate: {
|
|
61
|
+
orderId,
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
const processPayment: Tool<unknown, [], string, PaymentData> = {
|
|
68
|
+
id: "process_payment",
|
|
69
|
+
description: "Process payment for an order",
|
|
70
|
+
parameters: {
|
|
71
|
+
type: "object",
|
|
72
|
+
properties: {},
|
|
73
|
+
},
|
|
74
|
+
handler: ({ data }) => {
|
|
75
|
+
const paymentData = data as Partial<PaymentData>;
|
|
76
|
+
console.log(`Processing payment for order ${paymentData?.orderId}`);
|
|
77
|
+
|
|
78
|
+
// Simulate payment processing
|
|
79
|
+
const success = Math.random() > 0.1; // 90% success rate
|
|
80
|
+
|
|
81
|
+
if (success) {
|
|
82
|
+
return {
|
|
83
|
+
data: `Payment processed successfully! Order ${paymentData?.orderId} is now confirmed.`,
|
|
84
|
+
dataUpdate: {
|
|
85
|
+
confirmed: true,
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
} else {
|
|
89
|
+
return {
|
|
90
|
+
data: "Payment failed. Please try again or contact support.",
|
|
91
|
+
dataUpdate: {
|
|
92
|
+
confirmed: false,
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
// Create agent with persistence
|
|
100
|
+
const agent = new Agent({
|
|
101
|
+
name: "OrderBot",
|
|
102
|
+
description:
|
|
103
|
+
"A bot that handles multi-step order processing with session management",
|
|
104
|
+
provider: new GeminiProvider({
|
|
105
|
+
apiKey: process.env.GEMINI_API_KEY!,
|
|
106
|
+
model: "models/gemini-2.5-flash",
|
|
107
|
+
}),
|
|
108
|
+
persistence: {
|
|
109
|
+
adapter: new MemoryAdapter(), // In production, use RedisAdapter, PrismaAdapter, etc.
|
|
110
|
+
},
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
// Order collection route with sequential steps
|
|
114
|
+
agent.createRoute<OrderData>({
|
|
115
|
+
title: "Product Order",
|
|
116
|
+
description: "Collect order details and create an order",
|
|
117
|
+
schema: {
|
|
118
|
+
type: "object",
|
|
119
|
+
properties: {
|
|
120
|
+
customerName: { type: "string" },
|
|
121
|
+
productType: { type: "string", enum: ["laptop", "phone", "tablet"] },
|
|
122
|
+
budget: { type: "number", minimum: 100 },
|
|
123
|
+
preferredColor: { type: "string" },
|
|
124
|
+
urgentDelivery: { type: "boolean" },
|
|
125
|
+
orderId: { type: "string" },
|
|
126
|
+
},
|
|
127
|
+
required: ["customerName", "productType", "budget"],
|
|
128
|
+
},
|
|
129
|
+
// Sequential steps for order collection
|
|
130
|
+
steps: [
|
|
131
|
+
{
|
|
132
|
+
id: "ask_name",
|
|
133
|
+
description: "Ask for customer name",
|
|
134
|
+
prompt: "Hi! I'd like to help you place an order. What's your name?",
|
|
135
|
+
collect: ["customerName"],
|
|
136
|
+
skipIf: (data: Partial<OrderData>) => !!data.customerName,
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
id: "ask_product",
|
|
140
|
+
description: "Ask for product type",
|
|
141
|
+
prompt: "What would you like to order? (laptop, phone, or tablet)",
|
|
142
|
+
collect: ["productType"],
|
|
143
|
+
requires: ["customerName"],
|
|
144
|
+
skipIf: (data: Partial<OrderData>) => !!data.productType,
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
id: "ask_budget",
|
|
148
|
+
description: "Ask for budget",
|
|
149
|
+
prompt: "What's your budget for this purchase?",
|
|
150
|
+
collect: ["budget"],
|
|
151
|
+
requires: ["customerName", "productType"],
|
|
152
|
+
skipIf: (data: Partial<OrderData>) => data.budget !== undefined,
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
id: "ask_color",
|
|
156
|
+
description: "Ask for preferred color",
|
|
157
|
+
prompt: "Do you have a preferred color?",
|
|
158
|
+
collect: ["preferredColor"],
|
|
159
|
+
requires: ["customerName", "productType", "budget"],
|
|
160
|
+
skipIf: (data: Partial<OrderData>) => !!data.preferredColor,
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
id: "ask_urgent",
|
|
164
|
+
description: "Ask about urgent delivery",
|
|
165
|
+
prompt: "Do you need urgent delivery?",
|
|
166
|
+
collect: ["urgentDelivery"],
|
|
167
|
+
requires: ["customerName", "productType", "budget"],
|
|
168
|
+
skipIf: (data: Partial<OrderData>) => data.urgentDelivery !== undefined,
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
id: "create_order",
|
|
172
|
+
description: "Create the order",
|
|
173
|
+
prompt: "Great! Let me create your order.",
|
|
174
|
+
tools: [createOrder],
|
|
175
|
+
requires: ["customerName", "productType", "budget"],
|
|
176
|
+
},
|
|
177
|
+
],
|
|
178
|
+
onComplete: {
|
|
179
|
+
nextStep: "Payment Processing",
|
|
180
|
+
condition: "Order has been created successfully",
|
|
181
|
+
},
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
// Payment route with sequential steps
|
|
185
|
+
agent.createRoute<PaymentData>({
|
|
186
|
+
title: "Payment Processing",
|
|
187
|
+
description: "Process payment for an order",
|
|
188
|
+
schema: {
|
|
189
|
+
type: "object",
|
|
190
|
+
properties: {
|
|
191
|
+
orderId: { type: "string" },
|
|
192
|
+
paymentMethod: {
|
|
193
|
+
type: "string",
|
|
194
|
+
enum: ["credit_card", "paypal", "bank_transfer"],
|
|
195
|
+
},
|
|
196
|
+
amount: { type: "number" },
|
|
197
|
+
confirmed: { type: "boolean" },
|
|
198
|
+
},
|
|
199
|
+
required: ["orderId", "paymentMethod", "amount"],
|
|
200
|
+
},
|
|
201
|
+
// Sequential steps for payment processing
|
|
202
|
+
steps: [
|
|
203
|
+
{
|
|
204
|
+
id: "ask_payment_method",
|
|
205
|
+
description: "Ask for payment method",
|
|
206
|
+
prompt:
|
|
207
|
+
"Now let's process payment for your order. What payment method would you prefer?",
|
|
208
|
+
collect: ["paymentMethod"],
|
|
209
|
+
skipIf: (data: Partial<PaymentData>) => !!data.paymentMethod,
|
|
210
|
+
},
|
|
211
|
+
{
|
|
212
|
+
id: "ask_amount",
|
|
213
|
+
description: "Ask for payment amount",
|
|
214
|
+
prompt: "What's the payment amount?",
|
|
215
|
+
collect: ["amount"],
|
|
216
|
+
requires: ["paymentMethod"],
|
|
217
|
+
skipIf: (data: Partial<PaymentData>) => data.amount !== undefined,
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
id: "process_payment",
|
|
221
|
+
description: "Process the payment",
|
|
222
|
+
prompt: "Processing your payment...",
|
|
223
|
+
tools: [processPayment],
|
|
224
|
+
requires: ["orderId", "paymentMethod", "amount"],
|
|
225
|
+
},
|
|
226
|
+
],
|
|
227
|
+
onComplete: "Order Complete", // End conversation when payment is complete
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
// Demonstration of automatic session management
|
|
231
|
+
async function demonstrateSessionManagement() {
|
|
232
|
+
console.log("=== Automatic Session Management Demo ===\n");
|
|
233
|
+
|
|
234
|
+
// Create agent with automatic session management
|
|
235
|
+
const sessionAgent = new Agent({
|
|
236
|
+
name: "OrderBot",
|
|
237
|
+
description: "A bot that handles multi-step order processing",
|
|
238
|
+
provider: new GeminiProvider({
|
|
239
|
+
apiKey: process.env.GEMINI_API_KEY!,
|
|
240
|
+
model: "models/gemini-2.5-flash",
|
|
241
|
+
}),
|
|
242
|
+
persistence: {
|
|
243
|
+
adapter: new MemoryAdapter(),
|
|
244
|
+
},
|
|
245
|
+
sessionId: "user-alice-123", // Automatically creates/loads this session
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
// Copy routes to the session agent
|
|
249
|
+
agent.getRoutes().forEach(route => {
|
|
250
|
+
sessionAgent.createRoute(route);
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
// Turn 1: Start order process - simple message API
|
|
254
|
+
console.log("Turn 1: Starting order process");
|
|
255
|
+
console.log("User: Hi, I'm Alice and I want to buy a laptop");
|
|
256
|
+
|
|
257
|
+
const response1 = await sessionAgent.chat("Hi, I'm Alice and I want to buy a laptop");
|
|
258
|
+
|
|
259
|
+
console.log("Bot:", response1.message);
|
|
260
|
+
console.log("Session ID:", sessionAgent.session.id);
|
|
261
|
+
console.log("Session data:", JSON.stringify(sessionAgent.session.getData<OrderData>(), null, 2));
|
|
262
|
+
console.log("History length:", sessionAgent.session.getHistory().length);
|
|
263
|
+
console.log();
|
|
264
|
+
|
|
265
|
+
// Turn 2: Provide budget - session automatically maintained
|
|
266
|
+
console.log("Turn 2: Providing budget");
|
|
267
|
+
console.log("User: My budget is $1500");
|
|
268
|
+
|
|
269
|
+
const response2 = await sessionAgent.chat("My budget is $1500");
|
|
270
|
+
|
|
271
|
+
console.log("Bot:", response2.message);
|
|
272
|
+
console.log("Session data:", JSON.stringify(sessionAgent.session.getData<OrderData>(), null, 2));
|
|
273
|
+
console.log("History length:", sessionAgent.session.getHistory().length);
|
|
274
|
+
console.log();
|
|
275
|
+
|
|
276
|
+
// Turn 3: Complete order details - session automatically updated
|
|
277
|
+
console.log("Turn 3: Completing order and transitioning to payment");
|
|
278
|
+
console.log("User: I want black color and urgent delivery please");
|
|
279
|
+
|
|
280
|
+
const response3 = await sessionAgent.chat("I want black color and urgent delivery please");
|
|
281
|
+
|
|
282
|
+
console.log("Bot:", response3.message);
|
|
283
|
+
console.log("Session data:", JSON.stringify(sessionAgent.session.getData<OrderData>(), null, 2));
|
|
284
|
+
console.log("Route complete:", response3.isRouteComplete);
|
|
285
|
+
console.log("History length:", sessionAgent.session.getHistory().length);
|
|
286
|
+
console.log();
|
|
287
|
+
|
|
288
|
+
// Turn 4: Process payment - automatic route transition
|
|
289
|
+
console.log("Turn 4: Processing payment in transitioned route");
|
|
290
|
+
console.log("User: I'll pay with credit card, amount is $1599");
|
|
291
|
+
|
|
292
|
+
const response4 = await sessionAgent.chat("I'll pay with credit card, amount is $1599");
|
|
293
|
+
|
|
294
|
+
console.log("Bot:", response4.message);
|
|
295
|
+
console.log("Session data:", JSON.stringify(sessionAgent.session.getData<PaymentData>(), null, 2));
|
|
296
|
+
console.log("Route complete:", response4.isRouteComplete);
|
|
297
|
+
console.log("Final history length:", sessionAgent.session.getHistory().length);
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
// Demonstrate automatic session persistence and restoration
|
|
301
|
+
async function demonstrateSessionPersistence() {
|
|
302
|
+
console.log("\n=== Automatic Session Persistence Demo ===\n");
|
|
303
|
+
|
|
304
|
+
// Create agent with specific sessionId for demonstration
|
|
305
|
+
const sessionId = "demo-session-456";
|
|
306
|
+
const persistentAgent = new Agent<OrderContext>({
|
|
307
|
+
name: "Order Assistant",
|
|
308
|
+
description: "Help customers place orders with automatic persistence",
|
|
309
|
+
provider: new GeminiProvider({
|
|
310
|
+
apiKey: process.env.GEMINI_API_KEY!,
|
|
311
|
+
model: "models/gemini-2.5-flash",
|
|
312
|
+
}),
|
|
313
|
+
context: {
|
|
314
|
+
userId: "user_alice",
|
|
315
|
+
userName: "Alice",
|
|
316
|
+
isVip: false,
|
|
317
|
+
},
|
|
318
|
+
persistence: {
|
|
319
|
+
adapter: new MemoryAdapter(),
|
|
320
|
+
autoSave: true, // Automatic persistence
|
|
321
|
+
},
|
|
322
|
+
sessionId, // Agent automatically loads or creates this session
|
|
323
|
+
});
|
|
324
|
+
|
|
325
|
+
// Copy routes to the persistent agent
|
|
326
|
+
agent.getRoutes().forEach(route => {
|
|
327
|
+
persistentAgent.createRoute(route);
|
|
328
|
+
});
|
|
329
|
+
|
|
330
|
+
console.log("Session ready:", persistentAgent.session.id);
|
|
331
|
+
|
|
332
|
+
// Start conversation - session automatically managed
|
|
333
|
+
const response1 = await persistentAgent.chat("I want to buy a phone for $800");
|
|
334
|
+
|
|
335
|
+
console.log("After first interaction:");
|
|
336
|
+
console.log("🤖 Agent:", response1.message);
|
|
337
|
+
console.log("Session data:", JSON.stringify(persistentAgent.session.getData<OrderData>(), null, 2));
|
|
338
|
+
console.log("History length:", persistentAgent.session.getHistory().length);
|
|
339
|
+
console.log("Session automatically saved to persistence ✓");
|
|
340
|
+
|
|
341
|
+
// Simulate server restart - create new agent instance with same sessionId
|
|
342
|
+
console.log("\n🔄 Simulating server restart - creating new agent instance...");
|
|
343
|
+
|
|
344
|
+
const restoredAgent = new Agent<OrderContext>({
|
|
345
|
+
name: "Order Assistant",
|
|
346
|
+
provider: new GeminiProvider({
|
|
347
|
+
apiKey: process.env.GEMINI_API_KEY!,
|
|
348
|
+
model: "models/gemini-2.5-flash",
|
|
349
|
+
}),
|
|
350
|
+
context: {
|
|
351
|
+
userId: "user_alice",
|
|
352
|
+
userName: "Alice",
|
|
353
|
+
isVip: false,
|
|
354
|
+
},
|
|
355
|
+
persistence: {
|
|
356
|
+
adapter: new MemoryAdapter(), // Same adapter instance for demo
|
|
357
|
+
autoSave: true,
|
|
358
|
+
},
|
|
359
|
+
sessionId, // Same sessionId - automatically loads existing session
|
|
360
|
+
});
|
|
361
|
+
|
|
362
|
+
// Copy routes to the restored agent
|
|
363
|
+
agent.getRoutes().forEach(route => {
|
|
364
|
+
restoredAgent.createRoute(route);
|
|
365
|
+
});
|
|
366
|
+
|
|
367
|
+
console.log("Session automatically restored:");
|
|
368
|
+
console.log("- Session ID:", restoredAgent.session.id);
|
|
369
|
+
console.log("- History length:", restoredAgent.session.getHistory().length);
|
|
370
|
+
console.log("- Restored data:", JSON.stringify(restoredAgent.session.getData<OrderData>(), null, 2));
|
|
371
|
+
|
|
372
|
+
// Continue conversation seamlessly
|
|
373
|
+
const response2 = await restoredAgent.chat("Actually, make it urgent delivery");
|
|
374
|
+
|
|
375
|
+
console.log("\nAfter continuing with restored session:");
|
|
376
|
+
console.log("🤖 Agent:", response2.message);
|
|
377
|
+
console.log("Session data:", JSON.stringify(restoredAgent.session.getData<OrderData>(), null, 2));
|
|
378
|
+
console.log("History length:", restoredAgent.session.getHistory().length);
|
|
379
|
+
console.log("Session automatically saved again ✓");
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
// Run demonstrations
|
|
383
|
+
async function main() {
|
|
384
|
+
try {
|
|
385
|
+
await demonstrateSessionManagement();
|
|
386
|
+
await demonstrateSessionPersistence();
|
|
387
|
+
} catch (error) {
|
|
388
|
+
console.error("Error:", error);
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
393
|
+
main().catch(console.error);
|
|
394
|
+
}
|