@falai/agent 0.9.2 → 1.0.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 +281 -42
- package/dist/adapters/MemoryAdapter.d.ts.map +1 -0
- package/dist/adapters/MemoryAdapter.js.map +1 -0
- package/dist/adapters/MongoAdapter.d.ts.map +1 -0
- package/dist/adapters/MongoAdapter.js.map +1 -0
- package/dist/adapters/OpenSearchAdapter.d.ts.map +1 -0
- package/dist/adapters/OpenSearchAdapter.js.map +1 -0
- package/dist/adapters/PostgreSQLAdapter.d.ts.map +1 -0
- package/dist/adapters/PostgreSQLAdapter.js.map +1 -0
- package/dist/adapters/PrismaAdapter.d.ts.map +1 -0
- package/dist/{src/adapters → adapters}/PrismaAdapter.js +3 -2
- package/dist/adapters/PrismaAdapter.js.map +1 -0
- package/dist/adapters/RedisAdapter.d.ts.map +1 -0
- package/dist/{src/adapters → adapters}/RedisAdapter.js +3 -3
- package/dist/adapters/RedisAdapter.js.map +1 -0
- package/dist/adapters/SQLiteAdapter.d.ts.map +1 -0
- package/dist/adapters/SQLiteAdapter.js.map +1 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/cjs/adapters/MemoryAdapter.js.map +1 -0
- package/dist/cjs/adapters/MongoAdapter.js.map +1 -0
- package/dist/cjs/adapters/OpenSearchAdapter.js.map +1 -0
- package/dist/cjs/adapters/PostgreSQLAdapter.js.map +1 -0
- package/dist/{src → cjs}/adapters/PrismaAdapter.d.ts.map +1 -1
- package/dist/cjs/{src/adapters → adapters}/PrismaAdapter.js +3 -2
- package/dist/cjs/adapters/PrismaAdapter.js.map +1 -0
- package/dist/cjs/{src/adapters → adapters}/RedisAdapter.js +2 -2
- package/dist/cjs/adapters/RedisAdapter.js.map +1 -0
- package/dist/cjs/adapters/SQLiteAdapter.js.map +1 -0
- package/dist/cjs/adapters/index.js.map +1 -0
- package/dist/cjs/constants/index.js.map +1 -0
- package/dist/cjs/{src/core → core}/Agent.d.ts +16 -1
- package/dist/cjs/core/Agent.d.ts.map +1 -0
- package/dist/cjs/{src/core → core}/Agent.js +63 -2
- package/dist/cjs/core/Agent.js.map +1 -0
- package/dist/cjs/core/BatchExecutor.d.ts +353 -0
- package/dist/cjs/core/BatchExecutor.d.ts.map +1 -0
- package/dist/cjs/core/BatchExecutor.js +850 -0
- package/dist/cjs/core/BatchExecutor.js.map +1 -0
- package/dist/cjs/core/BatchPromptBuilder.d.ts +86 -0
- package/dist/cjs/core/BatchPromptBuilder.d.ts.map +1 -0
- package/dist/cjs/core/BatchPromptBuilder.js +217 -0
- package/dist/cjs/core/BatchPromptBuilder.js.map +1 -0
- package/dist/cjs/core/Events.js.map +1 -0
- package/dist/cjs/core/PersistenceManager.js.map +1 -0
- package/dist/{src → cjs}/core/PromptComposer.d.ts +1 -1
- package/dist/cjs/core/PromptComposer.d.ts.map +1 -0
- package/dist/cjs/{src/core → core}/PromptComposer.js +44 -7
- package/dist/cjs/core/PromptComposer.js.map +1 -0
- package/dist/{src → cjs}/core/ResponseEngine.d.ts.map +1 -1
- package/dist/cjs/core/ResponseEngine.js +211 -0
- package/dist/cjs/core/ResponseEngine.js.map +1 -0
- package/dist/{src → cjs}/core/ResponseModal.d.ts +45 -0
- package/dist/cjs/core/ResponseModal.d.ts.map +1 -0
- package/dist/cjs/{src/core → core}/ResponseModal.js +752 -74
- package/dist/cjs/core/ResponseModal.js.map +1 -0
- package/dist/{src → cjs}/core/ResponsePipeline.d.ts +2 -2
- package/dist/cjs/core/ResponsePipeline.d.ts.map +1 -0
- package/dist/cjs/{src/core → core}/ResponsePipeline.js +13 -6
- package/dist/cjs/core/ResponsePipeline.js.map +1 -0
- package/dist/{src → cjs}/core/Route.d.ts +34 -5
- package/dist/cjs/core/Route.d.ts.map +1 -0
- package/dist/cjs/{src/core → core}/Route.js +196 -19
- package/dist/cjs/core/Route.js.map +1 -0
- package/dist/cjs/{src/core → core}/RoutingEngine.d.ts +30 -5
- package/dist/cjs/core/RoutingEngine.d.ts.map +1 -0
- package/dist/cjs/{src/core → core}/RoutingEngine.js +330 -80
- package/dist/cjs/core/RoutingEngine.js.map +1 -0
- package/dist/cjs/core/SessionManager.js.map +1 -0
- package/dist/{src → cjs}/core/Step.d.ts +31 -10
- package/dist/cjs/core/Step.d.ts.map +1 -0
- package/dist/cjs/{src/core → core}/Step.js +105 -10
- package/dist/cjs/core/Step.js.map +1 -0
- package/dist/cjs/core/ToolManager.js.map +1 -0
- package/dist/{src → cjs}/index.d.ts +4 -1
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/{src/index.js → index.js} +12 -1
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/{src/providers → providers}/AnthropicProvider.js +18 -18
- package/dist/cjs/providers/AnthropicProvider.js.map +1 -0
- package/dist/{src → cjs}/providers/GeminiProvider.d.ts.map +1 -1
- package/dist/cjs/{src/providers → providers}/GeminiProvider.js +123 -51
- package/dist/cjs/providers/GeminiProvider.js.map +1 -0
- package/dist/cjs/{src/providers → providers}/OpenAIProvider.js +19 -19
- package/dist/cjs/providers/OpenAIProvider.js.map +1 -0
- package/dist/cjs/{src/providers → providers}/OpenRouterProvider.js +19 -19
- package/dist/cjs/providers/OpenRouterProvider.js.map +1 -0
- package/dist/cjs/providers/index.js.map +1 -0
- package/dist/cjs/{src/types → types}/agent.d.ts +15 -3
- package/dist/cjs/types/agent.d.ts.map +1 -0
- package/dist/cjs/types/agent.js.map +1 -0
- package/dist/{src → cjs}/types/ai.js.map +1 -1
- package/dist/cjs/types/history.js.map +1 -0
- package/dist/cjs/{src/types → types}/index.d.ts +2 -1
- package/dist/{src → cjs}/types/index.d.ts.map +1 -1
- package/dist/cjs/{src/types → types}/index.js +6 -1
- package/dist/cjs/types/index.js.map +1 -0
- package/dist/cjs/types/persistence.js.map +1 -0
- package/dist/cjs/{src/types → types}/route.d.ts +111 -12
- package/dist/cjs/types/route.d.ts.map +1 -0
- package/dist/cjs/{src/types → types}/route.js.map +1 -1
- package/dist/cjs/types/session.js.map +1 -0
- package/dist/cjs/types/template.d.ts +88 -0
- package/dist/cjs/types/template.d.ts.map +1 -0
- package/dist/cjs/types/tool.js.map +1 -0
- package/dist/cjs/utils/clone.js.map +1 -0
- package/dist/cjs/utils/condition.d.ts +38 -0
- package/dist/cjs/utils/condition.d.ts.map +1 -0
- package/dist/cjs/utils/condition.js +168 -0
- package/dist/cjs/utils/condition.js.map +1 -0
- package/dist/cjs/utils/event.js.map +1 -0
- package/dist/cjs/utils/history.js.map +1 -0
- package/dist/cjs/utils/id.js.map +1 -0
- package/dist/cjs/{src/utils → utils}/index.d.ts +3 -1
- package/dist/cjs/utils/index.d.ts.map +1 -0
- package/dist/cjs/{src/utils → utils}/index.js +12 -1
- package/dist/cjs/utils/index.js.map +1 -0
- package/dist/cjs/utils/json.d.ts +16 -0
- package/dist/cjs/utils/json.d.ts.map +1 -0
- package/dist/cjs/utils/json.js +47 -0
- package/dist/cjs/utils/json.js.map +1 -0
- package/dist/cjs/utils/logger.js.map +1 -0
- package/dist/{src → cjs}/utils/retry.d.ts +0 -3
- package/dist/cjs/utils/retry.d.ts.map +1 -0
- package/dist/cjs/{src/utils → utils}/retry.js +8 -7
- package/dist/cjs/utils/retry.js.map +1 -0
- package/dist/cjs/utils/session.js.map +1 -0
- package/dist/{src → cjs}/utils/template.d.ts +48 -0
- package/dist/cjs/utils/template.d.ts.map +1 -0
- package/dist/cjs/{src/utils → utils}/template.js +100 -0
- package/dist/cjs/utils/template.js.map +1 -0
- package/dist/constants/index.d.ts.map +1 -0
- package/dist/constants/index.js.map +1 -0
- package/dist/{src/core → core}/Agent.d.ts +16 -1
- package/dist/core/Agent.d.ts.map +1 -0
- package/dist/{src/core → core}/Agent.js +64 -3
- package/dist/core/Agent.js.map +1 -0
- package/dist/core/BatchExecutor.d.ts +353 -0
- package/dist/core/BatchExecutor.d.ts.map +1 -0
- package/dist/core/BatchExecutor.js +845 -0
- package/dist/core/BatchExecutor.js.map +1 -0
- package/dist/core/BatchPromptBuilder.d.ts +86 -0
- package/dist/core/BatchPromptBuilder.d.ts.map +1 -0
- package/dist/core/BatchPromptBuilder.js +213 -0
- package/dist/core/BatchPromptBuilder.js.map +1 -0
- package/dist/core/Events.d.ts.map +1 -0
- package/dist/core/Events.js.map +1 -0
- package/dist/core/PersistenceManager.d.ts.map +1 -0
- package/dist/core/PersistenceManager.js.map +1 -0
- package/dist/{cjs/src/core → core}/PromptComposer.d.ts +1 -1
- package/dist/core/PromptComposer.d.ts.map +1 -0
- package/dist/{src/core → core}/PromptComposer.js +45 -8
- package/dist/core/PromptComposer.js.map +1 -0
- package/dist/core/ResponseEngine.d.ts.map +1 -0
- package/dist/core/ResponseEngine.js +207 -0
- package/dist/core/ResponseEngine.js.map +1 -0
- package/dist/{cjs/src/core → core}/ResponseModal.d.ts +45 -0
- package/dist/core/ResponseModal.d.ts.map +1 -0
- package/dist/{src/core → core}/ResponseModal.js +752 -74
- package/dist/core/ResponseModal.js.map +1 -0
- package/dist/{cjs/src/core → core}/ResponsePipeline.d.ts +2 -2
- package/dist/core/ResponsePipeline.d.ts.map +1 -0
- package/dist/{src/core → core}/ResponsePipeline.js +13 -6
- package/dist/core/ResponsePipeline.js.map +1 -0
- package/dist/{cjs/src/core → core}/Route.d.ts +34 -5
- package/dist/core/Route.d.ts.map +1 -0
- package/dist/{src/core → core}/Route.js +195 -18
- package/dist/core/Route.js.map +1 -0
- package/dist/{src/core → core}/RoutingEngine.d.ts +30 -5
- package/dist/core/RoutingEngine.d.ts.map +1 -0
- package/dist/{src/core → core}/RoutingEngine.js +310 -60
- package/dist/core/RoutingEngine.js.map +1 -0
- package/dist/core/SessionManager.d.ts.map +1 -0
- package/dist/core/SessionManager.js.map +1 -0
- package/dist/{cjs/src/core → core}/Step.d.ts +31 -10
- package/dist/core/Step.d.ts.map +1 -0
- package/dist/{src/core → core}/Step.js +104 -9
- package/dist/core/Step.js.map +1 -0
- package/dist/core/ToolManager.d.ts.map +1 -0
- package/dist/core/ToolManager.js.map +1 -0
- package/dist/{cjs/src/index.d.ts → index.d.ts} +4 -1
- package/dist/index.d.ts.map +1 -0
- package/dist/{src/index.js → index.js} +3 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/AnthropicProvider.d.ts.map +1 -0
- package/dist/{src/providers → providers}/AnthropicProvider.js +17 -17
- package/dist/providers/AnthropicProvider.js.map +1 -0
- package/dist/providers/GeminiProvider.d.ts.map +1 -0
- package/dist/{src/providers → providers}/GeminiProvider.js +123 -51
- package/dist/providers/GeminiProvider.js.map +1 -0
- package/dist/providers/OpenAIProvider.d.ts.map +1 -0
- package/dist/{src/providers → providers}/OpenAIProvider.js +18 -18
- package/dist/providers/OpenAIProvider.js.map +1 -0
- package/dist/providers/OpenRouterProvider.d.ts.map +1 -0
- package/dist/{src/providers → providers}/OpenRouterProvider.js +18 -18
- package/dist/providers/OpenRouterProvider.js.map +1 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/{src/types → types}/agent.d.ts +15 -3
- package/dist/types/agent.d.ts.map +1 -0
- package/dist/types/agent.js.map +1 -0
- package/dist/types/ai.d.ts.map +1 -0
- package/dist/types/ai.js.map +1 -0
- package/dist/types/history.d.ts.map +1 -0
- package/dist/types/history.js.map +1 -0
- package/dist/{src/types → types}/index.d.ts +2 -1
- package/dist/types/index.d.ts.map +1 -0
- package/dist/{src/types → types}/index.js +1 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/persistence.d.ts.map +1 -0
- package/dist/types/persistence.js.map +1 -0
- package/dist/{src/types → types}/route.d.ts +111 -12
- package/dist/types/route.d.ts.map +1 -0
- package/dist/{src/types → types}/route.js.map +1 -1
- package/dist/types/routing.d.ts.map +1 -0
- package/dist/{cjs/src/types → types}/routing.js.map +1 -1
- package/dist/types/schema.d.ts.map +1 -0
- package/dist/{cjs/src/types → types}/schema.js.map +1 -1
- package/dist/types/session.d.ts.map +1 -0
- package/dist/{src/types → types}/session.js.map +1 -1
- package/dist/types/template.d.ts +88 -0
- package/dist/types/template.d.ts.map +1 -0
- package/dist/{cjs/src/types → types}/template.js.map +1 -1
- package/dist/types/tool.d.ts.map +1 -0
- package/dist/types/tool.js.map +1 -0
- package/dist/utils/clone.d.ts.map +1 -0
- package/dist/utils/clone.js.map +1 -0
- package/dist/utils/condition.d.ts +38 -0
- package/dist/utils/condition.d.ts.map +1 -0
- package/dist/utils/condition.js +161 -0
- package/dist/utils/condition.js.map +1 -0
- package/dist/utils/event.d.ts.map +1 -0
- package/dist/utils/event.js.map +1 -0
- package/dist/utils/history.d.ts.map +1 -0
- package/dist/utils/history.js.map +1 -0
- package/dist/utils/id.d.ts.map +1 -0
- package/dist/utils/id.js.map +1 -0
- package/dist/{src/utils → utils}/index.d.ts +3 -1
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/{src/utils → utils}/index.js +5 -1
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/json.d.ts +16 -0
- package/dist/utils/json.d.ts.map +1 -0
- package/dist/utils/json.js +43 -0
- package/dist/utils/json.js.map +1 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/{cjs/src/utils → utils}/retry.d.ts +0 -3
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/{src/utils → utils}/retry.js +5 -4
- package/dist/utils/retry.js.map +1 -0
- package/dist/utils/session.d.ts.map +1 -0
- package/dist/utils/session.js.map +1 -0
- package/dist/{cjs/src/utils → utils}/template.d.ts +48 -0
- package/dist/utils/template.d.ts.map +1 -0
- package/dist/{src/utils → utils}/template.js +98 -0
- package/dist/utils/template.js.map +1 -0
- package/docs/README.md +1 -0
- package/docs/api/README.md +237 -12
- package/docs/api/overview.md +206 -3
- package/docs/architecture/data-extraction-flow.md +363 -0
- package/docs/architecture/multi-step-execution.md +243 -0
- package/docs/core/agent/README.md +156 -5
- package/docs/core/agent/rules-and-prohibitions.md +113 -0
- package/docs/core/agent/session-management.md +1 -1
- package/docs/core/ai-integration/prompt-composition.md +135 -0
- package/docs/core/ai-integration/response-processing.md +146 -0
- package/docs/core/conversation-flows/data-collection.md +143 -0
- package/docs/core/conversation-flows/routes.md +2 -2
- package/docs/core/conversation-flows/step-transitions.md +132 -0
- package/docs/core/conversation-flows/steps.md +112 -0
- package/docs/core/error-handling.md +193 -0
- package/docs/core/routing/intelligent-routing.md +118 -0
- package/docs/guides/getting-started/README.md +284 -3
- package/docs/guides/migration/README.md +27 -0
- package/docs/guides/migration/flexible-routing-conditions.md +375 -0
- package/docs/guides/migration/multi-step-execution.md +373 -0
- package/examples/advanced-patterns/knowledge-based-agent.ts +101 -24
- package/examples/advanced-patterns/persistent-onboarding.ts +40 -5
- package/examples/advanced-patterns/route-lifecycle-hooks.ts +82 -12
- package/examples/advanced-patterns/streaming-responses.ts +2 -2
- package/examples/ai-providers/anthropic-integration.ts +4 -4
- package/examples/ai-providers/openai-integration.ts +1 -1
- package/examples/condition-patterns/function-only-conditions.ts +365 -0
- package/examples/condition-patterns/mixed-array-conditions.ts +477 -0
- package/examples/condition-patterns/route-skipif-patterns.ts +468 -0
- package/examples/condition-patterns/step-skipif-patterns.ts +0 -0
- package/examples/condition-patterns/string-only-conditions.ts +296 -0
- package/examples/conversation-flows/completion-transitions.ts +48 -7
- package/examples/core-concepts/basic-agent.ts +54 -33
- package/examples/core-concepts/schema-driven-extraction.ts +33 -9
- package/examples/core-concepts/session-management.ts +51 -16
- package/examples/integrations/database-integration.ts +6 -6
- package/examples/integrations/healthcare-integration.ts +10 -10
- package/examples/integrations/search-integration.ts +8 -8
- package/examples/integrations/server-session-management.ts +8 -8
- package/examples/persistence/database-persistence.ts +15 -15
- package/examples/persistence/memory-sessions.ts +3 -3
- package/examples/persistence/redis-persistence.ts +7 -9
- package/examples/tools/data-enrichment-tools.ts +4 -4
- package/package.json +6 -4
- package/src/adapters/PrismaAdapter.ts +3 -2
- package/src/adapters/RedisAdapter.ts +3 -3
- package/src/core/Agent.ts +78 -2
- package/src/core/BatchExecutor.ts +1166 -0
- package/src/core/BatchPromptBuilder.ts +293 -0
- package/src/core/PromptComposer.ts +53 -16
- package/src/core/ResponseEngine.ts +168 -29
- package/src/core/ResponseModal.ts +954 -74
- package/src/core/ResponsePipeline.ts +17 -9
- package/src/core/Route.ts +223 -22
- package/src/core/RoutingEngine.ts +426 -83
- package/src/core/Step.ts +144 -16
- package/src/index.ts +19 -0
- package/src/providers/AnthropicProvider.ts +17 -17
- package/src/providers/GeminiProvider.ts +129 -60
- package/src/providers/OpenAIProvider.ts +18 -18
- package/src/providers/OpenRouterProvider.ts +18 -18
- package/src/types/agent.ts +15 -3
- package/src/types/index.ts +12 -1
- package/src/types/route.ts +131 -12
- package/src/types/template.ts +70 -2
- package/src/utils/condition.ts +190 -0
- package/src/utils/index.ts +12 -0
- package/src/utils/json.ts +46 -0
- package/src/utils/retry.ts +5 -4
- package/src/utils/template.ts +109 -0
- package/dist/cjs/src/adapters/MemoryAdapter.d.ts.map +0 -1
- package/dist/cjs/src/adapters/MemoryAdapter.js.map +0 -1
- package/dist/cjs/src/adapters/MongoAdapter.d.ts.map +0 -1
- package/dist/cjs/src/adapters/MongoAdapter.js.map +0 -1
- package/dist/cjs/src/adapters/OpenSearchAdapter.d.ts.map +0 -1
- package/dist/cjs/src/adapters/OpenSearchAdapter.js.map +0 -1
- package/dist/cjs/src/adapters/PostgreSQLAdapter.d.ts.map +0 -1
- package/dist/cjs/src/adapters/PostgreSQLAdapter.js.map +0 -1
- package/dist/cjs/src/adapters/PrismaAdapter.d.ts.map +0 -1
- package/dist/cjs/src/adapters/PrismaAdapter.js.map +0 -1
- package/dist/cjs/src/adapters/RedisAdapter.d.ts.map +0 -1
- package/dist/cjs/src/adapters/RedisAdapter.js.map +0 -1
- package/dist/cjs/src/adapters/SQLiteAdapter.d.ts.map +0 -1
- package/dist/cjs/src/adapters/SQLiteAdapter.js.map +0 -1
- package/dist/cjs/src/adapters/index.d.ts.map +0 -1
- package/dist/cjs/src/adapters/index.js.map +0 -1
- package/dist/cjs/src/constants/index.d.ts.map +0 -1
- package/dist/cjs/src/constants/index.js.map +0 -1
- package/dist/cjs/src/core/Agent.d.ts.map +0 -1
- package/dist/cjs/src/core/Agent.js.map +0 -1
- package/dist/cjs/src/core/Events.d.ts.map +0 -1
- package/dist/cjs/src/core/Events.js.map +0 -1
- package/dist/cjs/src/core/PersistenceManager.d.ts.map +0 -1
- package/dist/cjs/src/core/PersistenceManager.js.map +0 -1
- package/dist/cjs/src/core/PromptComposer.d.ts.map +0 -1
- package/dist/cjs/src/core/PromptComposer.js.map +0 -1
- package/dist/cjs/src/core/ResponseEngine.d.ts.map +0 -1
- package/dist/cjs/src/core/ResponseEngine.js +0 -84
- package/dist/cjs/src/core/ResponseEngine.js.map +0 -1
- package/dist/cjs/src/core/ResponseModal.d.ts.map +0 -1
- package/dist/cjs/src/core/ResponseModal.js.map +0 -1
- package/dist/cjs/src/core/ResponsePipeline.d.ts.map +0 -1
- package/dist/cjs/src/core/ResponsePipeline.js.map +0 -1
- package/dist/cjs/src/core/Route.d.ts.map +0 -1
- package/dist/cjs/src/core/Route.js.map +0 -1
- package/dist/cjs/src/core/RoutingEngine.d.ts.map +0 -1
- package/dist/cjs/src/core/RoutingEngine.js.map +0 -1
- package/dist/cjs/src/core/SessionManager.d.ts.map +0 -1
- package/dist/cjs/src/core/SessionManager.js.map +0 -1
- package/dist/cjs/src/core/Step.d.ts.map +0 -1
- package/dist/cjs/src/core/Step.js.map +0 -1
- package/dist/cjs/src/core/ToolManager.d.ts.map +0 -1
- package/dist/cjs/src/core/ToolManager.js.map +0 -1
- package/dist/cjs/src/index.d.ts.map +0 -1
- package/dist/cjs/src/index.js.map +0 -1
- package/dist/cjs/src/providers/AnthropicProvider.d.ts.map +0 -1
- package/dist/cjs/src/providers/AnthropicProvider.js.map +0 -1
- package/dist/cjs/src/providers/GeminiProvider.d.ts.map +0 -1
- package/dist/cjs/src/providers/GeminiProvider.js.map +0 -1
- package/dist/cjs/src/providers/OpenAIProvider.d.ts.map +0 -1
- package/dist/cjs/src/providers/OpenAIProvider.js.map +0 -1
- package/dist/cjs/src/providers/OpenRouterProvider.d.ts.map +0 -1
- package/dist/cjs/src/providers/OpenRouterProvider.js.map +0 -1
- package/dist/cjs/src/providers/index.d.ts.map +0 -1
- package/dist/cjs/src/providers/index.js.map +0 -1
- package/dist/cjs/src/types/agent.d.ts.map +0 -1
- package/dist/cjs/src/types/agent.js.map +0 -1
- package/dist/cjs/src/types/ai.d.ts.map +0 -1
- package/dist/cjs/src/types/ai.js.map +0 -1
- package/dist/cjs/src/types/history.d.ts.map +0 -1
- package/dist/cjs/src/types/history.js.map +0 -1
- package/dist/cjs/src/types/index.d.ts.map +0 -1
- package/dist/cjs/src/types/index.js.map +0 -1
- package/dist/cjs/src/types/persistence.d.ts.map +0 -1
- package/dist/cjs/src/types/persistence.js.map +0 -1
- package/dist/cjs/src/types/route.d.ts.map +0 -1
- package/dist/cjs/src/types/routing.d.ts.map +0 -1
- package/dist/cjs/src/types/schema.d.ts.map +0 -1
- package/dist/cjs/src/types/session.d.ts.map +0 -1
- package/dist/cjs/src/types/session.js.map +0 -1
- package/dist/cjs/src/types/template.d.ts +0 -30
- package/dist/cjs/src/types/template.d.ts.map +0 -1
- package/dist/cjs/src/types/tool.d.ts.map +0 -1
- package/dist/cjs/src/types/tool.js.map +0 -1
- package/dist/cjs/src/utils/clone.d.ts.map +0 -1
- package/dist/cjs/src/utils/clone.js.map +0 -1
- package/dist/cjs/src/utils/event.d.ts.map +0 -1
- package/dist/cjs/src/utils/event.js.map +0 -1
- package/dist/cjs/src/utils/history.d.ts.map +0 -1
- package/dist/cjs/src/utils/history.js.map +0 -1
- package/dist/cjs/src/utils/id.d.ts.map +0 -1
- package/dist/cjs/src/utils/id.js.map +0 -1
- package/dist/cjs/src/utils/index.d.ts.map +0 -1
- package/dist/cjs/src/utils/index.js.map +0 -1
- package/dist/cjs/src/utils/logger.d.ts.map +0 -1
- package/dist/cjs/src/utils/logger.js.map +0 -1
- package/dist/cjs/src/utils/retry.d.ts.map +0 -1
- package/dist/cjs/src/utils/retry.js.map +0 -1
- package/dist/cjs/src/utils/session.d.ts.map +0 -1
- package/dist/cjs/src/utils/session.js.map +0 -1
- package/dist/cjs/src/utils/template.d.ts.map +0 -1
- package/dist/cjs/src/utils/template.js.map +0 -1
- package/dist/src/adapters/MemoryAdapter.js.map +0 -1
- package/dist/src/adapters/MongoAdapter.js.map +0 -1
- package/dist/src/adapters/OpenSearchAdapter.js.map +0 -1
- package/dist/src/adapters/PostgreSQLAdapter.js.map +0 -1
- package/dist/src/adapters/PrismaAdapter.js.map +0 -1
- package/dist/src/adapters/RedisAdapter.js.map +0 -1
- package/dist/src/adapters/SQLiteAdapter.js.map +0 -1
- package/dist/src/adapters/index.js.map +0 -1
- package/dist/src/constants/index.js.map +0 -1
- package/dist/src/core/Agent.d.ts.map +0 -1
- package/dist/src/core/Agent.js.map +0 -1
- package/dist/src/core/Events.js.map +0 -1
- package/dist/src/core/PersistenceManager.js.map +0 -1
- package/dist/src/core/PromptComposer.d.ts.map +0 -1
- package/dist/src/core/PromptComposer.js.map +0 -1
- package/dist/src/core/ResponseEngine.js +0 -80
- package/dist/src/core/ResponseEngine.js.map +0 -1
- package/dist/src/core/ResponseModal.d.ts.map +0 -1
- package/dist/src/core/ResponseModal.js.map +0 -1
- package/dist/src/core/ResponsePipeline.d.ts.map +0 -1
- package/dist/src/core/ResponsePipeline.js.map +0 -1
- package/dist/src/core/Route.d.ts.map +0 -1
- package/dist/src/core/Route.js.map +0 -1
- package/dist/src/core/RoutingEngine.d.ts.map +0 -1
- package/dist/src/core/RoutingEngine.js.map +0 -1
- package/dist/src/core/SessionManager.js.map +0 -1
- package/dist/src/core/Step.d.ts.map +0 -1
- package/dist/src/core/Step.js.map +0 -1
- package/dist/src/core/ToolManager.js.map +0 -1
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/index.js.map +0 -1
- package/dist/src/providers/AnthropicProvider.js.map +0 -1
- package/dist/src/providers/GeminiProvider.js.map +0 -1
- package/dist/src/providers/OpenAIProvider.js.map +0 -1
- package/dist/src/providers/OpenRouterProvider.js.map +0 -1
- package/dist/src/providers/index.js.map +0 -1
- package/dist/src/types/agent.d.ts.map +0 -1
- package/dist/src/types/agent.js.map +0 -1
- package/dist/src/types/history.js.map +0 -1
- package/dist/src/types/index.js.map +0 -1
- package/dist/src/types/persistence.js.map +0 -1
- package/dist/src/types/route.d.ts.map +0 -1
- package/dist/src/types/template.d.ts +0 -30
- package/dist/src/types/template.d.ts.map +0 -1
- package/dist/src/types/tool.js.map +0 -1
- package/dist/src/utils/clone.js.map +0 -1
- package/dist/src/utils/event.js.map +0 -1
- package/dist/src/utils/history.js.map +0 -1
- package/dist/src/utils/id.js.map +0 -1
- package/dist/src/utils/index.d.ts.map +0 -1
- package/dist/src/utils/index.js.map +0 -1
- package/dist/src/utils/logger.js.map +0 -1
- package/dist/src/utils/retry.d.ts.map +0 -1
- package/dist/src/utils/retry.js.map +0 -1
- package/dist/src/utils/session.js.map +0 -1
- package/dist/src/utils/template.d.ts.map +0 -1
- package/dist/src/utils/template.js.map +0 -1
- /package/dist/{cjs/src/adapters → adapters}/MemoryAdapter.d.ts +0 -0
- /package/dist/{src/adapters → adapters}/MemoryAdapter.js +0 -0
- /package/dist/{cjs/src/adapters → adapters}/MongoAdapter.d.ts +0 -0
- /package/dist/{src/adapters → adapters}/MongoAdapter.js +0 -0
- /package/dist/{cjs/src/adapters → adapters}/OpenSearchAdapter.d.ts +0 -0
- /package/dist/{src/adapters → adapters}/OpenSearchAdapter.js +0 -0
- /package/dist/{cjs/src/adapters → adapters}/PostgreSQLAdapter.d.ts +0 -0
- /package/dist/{src/adapters → adapters}/PostgreSQLAdapter.js +0 -0
- /package/dist/{cjs/src/adapters → adapters}/PrismaAdapter.d.ts +0 -0
- /package/dist/{cjs/src/adapters → adapters}/RedisAdapter.d.ts +0 -0
- /package/dist/{cjs/src/adapters → adapters}/SQLiteAdapter.d.ts +0 -0
- /package/dist/{src/adapters → adapters}/SQLiteAdapter.js +0 -0
- /package/dist/{cjs/src/adapters → adapters}/index.d.ts +0 -0
- /package/dist/{src/adapters → adapters}/index.js +0 -0
- /package/dist/{src → cjs}/adapters/MemoryAdapter.d.ts +0 -0
- /package/dist/{src → cjs}/adapters/MemoryAdapter.d.ts.map +0 -0
- /package/dist/cjs/{src/adapters → adapters}/MemoryAdapter.js +0 -0
- /package/dist/{src → cjs}/adapters/MongoAdapter.d.ts +0 -0
- /package/dist/{src → cjs}/adapters/MongoAdapter.d.ts.map +0 -0
- /package/dist/cjs/{src/adapters → adapters}/MongoAdapter.js +0 -0
- /package/dist/{src → cjs}/adapters/OpenSearchAdapter.d.ts +0 -0
- /package/dist/{src → cjs}/adapters/OpenSearchAdapter.d.ts.map +0 -0
- /package/dist/cjs/{src/adapters → adapters}/OpenSearchAdapter.js +0 -0
- /package/dist/{src → cjs}/adapters/PostgreSQLAdapter.d.ts +0 -0
- /package/dist/{src → cjs}/adapters/PostgreSQLAdapter.d.ts.map +0 -0
- /package/dist/cjs/{src/adapters → adapters}/PostgreSQLAdapter.js +0 -0
- /package/dist/{src → cjs}/adapters/PrismaAdapter.d.ts +0 -0
- /package/dist/{src → cjs}/adapters/RedisAdapter.d.ts +0 -0
- /package/dist/{src → cjs}/adapters/RedisAdapter.d.ts.map +0 -0
- /package/dist/{src → cjs}/adapters/SQLiteAdapter.d.ts +0 -0
- /package/dist/{src → cjs}/adapters/SQLiteAdapter.d.ts.map +0 -0
- /package/dist/cjs/{src/adapters → adapters}/SQLiteAdapter.js +0 -0
- /package/dist/{src → cjs}/adapters/index.d.ts +0 -0
- /package/dist/{src → cjs}/adapters/index.d.ts.map +0 -0
- /package/dist/cjs/{src/adapters → adapters}/index.js +0 -0
- /package/dist/cjs/{src/constants → constants}/index.d.ts +0 -0
- /package/dist/{src → cjs}/constants/index.d.ts.map +0 -0
- /package/dist/cjs/{src/constants → constants}/index.js +0 -0
- /package/dist/cjs/{src/core → core}/Events.d.ts +0 -0
- /package/dist/{src → cjs}/core/Events.d.ts.map +0 -0
- /package/dist/cjs/{src/core → core}/Events.js +0 -0
- /package/dist/cjs/{src/core → core}/PersistenceManager.d.ts +0 -0
- /package/dist/{src → cjs}/core/PersistenceManager.d.ts.map +0 -0
- /package/dist/cjs/{src/core → core}/PersistenceManager.js +0 -0
- /package/dist/cjs/{src/core → core}/ResponseEngine.d.ts +0 -0
- /package/dist/cjs/{src/core → core}/SessionManager.d.ts +0 -0
- /package/dist/{src → cjs}/core/SessionManager.d.ts.map +0 -0
- /package/dist/cjs/{src/core → core}/SessionManager.js +0 -0
- /package/dist/cjs/{src/core → core}/ToolManager.d.ts +0 -0
- /package/dist/{src → cjs}/core/ToolManager.d.ts.map +0 -0
- /package/dist/cjs/{src/core → core}/ToolManager.js +0 -0
- /package/dist/cjs/{src/providers → providers}/AnthropicProvider.d.ts +0 -0
- /package/dist/{src → cjs}/providers/AnthropicProvider.d.ts.map +0 -0
- /package/dist/cjs/{src/providers → providers}/GeminiProvider.d.ts +0 -0
- /package/dist/cjs/{src/providers → providers}/OpenAIProvider.d.ts +0 -0
- /package/dist/{src → cjs}/providers/OpenAIProvider.d.ts.map +0 -0
- /package/dist/cjs/{src/providers → providers}/OpenRouterProvider.d.ts +0 -0
- /package/dist/{src → cjs}/providers/OpenRouterProvider.d.ts.map +0 -0
- /package/dist/cjs/{src/providers → providers}/index.d.ts +0 -0
- /package/dist/{src → cjs}/providers/index.d.ts.map +0 -0
- /package/dist/cjs/{src/providers → providers}/index.js +0 -0
- /package/dist/cjs/{src/types → types}/agent.js +0 -0
- /package/dist/cjs/{src/types → types}/ai.d.ts +0 -0
- /package/dist/{src → cjs}/types/ai.d.ts.map +0 -0
- /package/dist/cjs/{src/types → types}/ai.js +0 -0
- /package/dist/cjs/{src/types → types}/history.d.ts +0 -0
- /package/dist/{src → cjs}/types/history.d.ts.map +0 -0
- /package/dist/cjs/{src/types → types}/history.js +0 -0
- /package/dist/cjs/{src/types → types}/persistence.d.ts +0 -0
- /package/dist/{src → cjs}/types/persistence.d.ts.map +0 -0
- /package/dist/cjs/{src/types → types}/persistence.js +0 -0
- /package/dist/cjs/{src/types → types}/route.js +0 -0
- /package/dist/cjs/{src/types → types}/routing.d.ts +0 -0
- /package/dist/{src → cjs}/types/routing.d.ts.map +0 -0
- /package/dist/cjs/{src/types → types}/routing.js +0 -0
- /package/dist/{src → cjs}/types/routing.js.map +0 -0
- /package/dist/cjs/{src/types → types}/schema.d.ts +0 -0
- /package/dist/{src → cjs}/types/schema.d.ts.map +0 -0
- /package/dist/cjs/{src/types → types}/schema.js +0 -0
- /package/dist/{src → cjs}/types/schema.js.map +0 -0
- /package/dist/cjs/{src/types → types}/session.d.ts +0 -0
- /package/dist/{src → cjs}/types/session.d.ts.map +0 -0
- /package/dist/cjs/{src/types → types}/session.js +0 -0
- /package/dist/cjs/{src/types → types}/template.js +0 -0
- /package/dist/{src → cjs}/types/template.js.map +0 -0
- /package/dist/cjs/{src/types → types}/tool.d.ts +0 -0
- /package/dist/{src → cjs}/types/tool.d.ts.map +0 -0
- /package/dist/cjs/{src/types → types}/tool.js +0 -0
- /package/dist/cjs/{src/utils → utils}/clone.d.ts +0 -0
- /package/dist/{src → cjs}/utils/clone.d.ts.map +0 -0
- /package/dist/cjs/{src/utils → utils}/clone.js +0 -0
- /package/dist/cjs/{src/utils → utils}/event.d.ts +0 -0
- /package/dist/{src → cjs}/utils/event.d.ts.map +0 -0
- /package/dist/cjs/{src/utils → utils}/event.js +0 -0
- /package/dist/cjs/{src/utils → utils}/history.d.ts +0 -0
- /package/dist/{src → cjs}/utils/history.d.ts.map +0 -0
- /package/dist/cjs/{src/utils → utils}/history.js +0 -0
- /package/dist/cjs/{src/utils → utils}/id.d.ts +0 -0
- /package/dist/{src → cjs}/utils/id.d.ts.map +0 -0
- /package/dist/cjs/{src/utils → utils}/id.js +0 -0
- /package/dist/cjs/{src/utils → utils}/logger.d.ts +0 -0
- /package/dist/{src → cjs}/utils/logger.d.ts.map +0 -0
- /package/dist/cjs/{src/utils → utils}/logger.js +0 -0
- /package/dist/cjs/{src/utils → utils}/session.d.ts +0 -0
- /package/dist/{src → cjs}/utils/session.d.ts.map +0 -0
- /package/dist/cjs/{src/utils → utils}/session.js +0 -0
- /package/dist/{src/constants → constants}/index.d.ts +0 -0
- /package/dist/{src/constants → constants}/index.js +0 -0
- /package/dist/{src/core → core}/Events.d.ts +0 -0
- /package/dist/{src/core → core}/Events.js +0 -0
- /package/dist/{src/core → core}/PersistenceManager.d.ts +0 -0
- /package/dist/{src/core → core}/PersistenceManager.js +0 -0
- /package/dist/{src/core → core}/ResponseEngine.d.ts +0 -0
- /package/dist/{src/core → core}/SessionManager.d.ts +0 -0
- /package/dist/{src/core → core}/SessionManager.js +0 -0
- /package/dist/{src/core → core}/ToolManager.d.ts +0 -0
- /package/dist/{src/core → core}/ToolManager.js +0 -0
- /package/dist/{src/providers → providers}/AnthropicProvider.d.ts +0 -0
- /package/dist/{src/providers → providers}/GeminiProvider.d.ts +0 -0
- /package/dist/{src/providers → providers}/OpenAIProvider.d.ts +0 -0
- /package/dist/{src/providers → providers}/OpenRouterProvider.d.ts +0 -0
- /package/dist/{src/providers → providers}/index.d.ts +0 -0
- /package/dist/{src/providers → providers}/index.js +0 -0
- /package/dist/{src/types → types}/agent.js +0 -0
- /package/dist/{src/types → types}/ai.d.ts +0 -0
- /package/dist/{src/types → types}/ai.js +0 -0
- /package/dist/{src/types → types}/history.d.ts +0 -0
- /package/dist/{src/types → types}/history.js +0 -0
- /package/dist/{src/types → types}/persistence.d.ts +0 -0
- /package/dist/{src/types → types}/persistence.js +0 -0
- /package/dist/{src/types → types}/route.js +0 -0
- /package/dist/{src/types → types}/routing.d.ts +0 -0
- /package/dist/{src/types → types}/routing.js +0 -0
- /package/dist/{src/types → types}/schema.d.ts +0 -0
- /package/dist/{src/types → types}/schema.js +0 -0
- /package/dist/{src/types → types}/session.d.ts +0 -0
- /package/dist/{src/types → types}/session.js +0 -0
- /package/dist/{src/types → types}/template.js +0 -0
- /package/dist/{src/types → types}/tool.d.ts +0 -0
- /package/dist/{src/types → types}/tool.js +0 -0
- /package/dist/{src/utils → utils}/clone.d.ts +0 -0
- /package/dist/{src/utils → utils}/clone.js +0 -0
- /package/dist/{src/utils → utils}/event.d.ts +0 -0
- /package/dist/{src/utils → utils}/event.js +0 -0
- /package/dist/{src/utils → utils}/history.d.ts +0 -0
- /package/dist/{src/utils → utils}/history.js +0 -0
- /package/dist/{src/utils → utils}/id.d.ts +0 -0
- /package/dist/{src/utils → utils}/id.js +0 -0
- /package/dist/{src/utils → utils}/logger.d.ts +0 -0
- /package/dist/{src/utils → utils}/logger.js +0 -0
- /package/dist/{src/utils → utils}/session.d.ts +0 -0
- /package/dist/{src/utils → utils}/session.js +0 -0
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BatchPromptBuilder - Combines multiple Step prompts into a single coherent prompt
|
|
3
|
+
*
|
|
4
|
+
* Responsible for building a combined prompt for batch execution of multiple Steps
|
|
5
|
+
* in a single LLM call.
|
|
6
|
+
*
|
|
7
|
+
* **Validates: Requirements 4.1, 4.2, 4.3, 4.4**
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import type { StepOptions } from '../types/route';
|
|
11
|
+
import type { AgentOptions } from '../types/agent';
|
|
12
|
+
import type { SessionState } from '../types/session';
|
|
13
|
+
import type { Event } from '../types/history';
|
|
14
|
+
import type { Route } from './Route';
|
|
15
|
+
import { render, renderMany, createTemplateContext } from '../utils/template';
|
|
16
|
+
import { PromptComposer } from './PromptComposer';
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Parameters for building a batch prompt
|
|
20
|
+
*/
|
|
21
|
+
export interface BuildBatchPromptParams<TContext, TData> {
|
|
22
|
+
/** Steps included in this batch */
|
|
23
|
+
steps: StepOptions<TContext, TData>[];
|
|
24
|
+
/** The route containing the steps */
|
|
25
|
+
route: Route<TContext, TData>;
|
|
26
|
+
/** Conversation history */
|
|
27
|
+
history: Event[];
|
|
28
|
+
/** Agent context */
|
|
29
|
+
context: TContext;
|
|
30
|
+
/** Current session state */
|
|
31
|
+
session: SessionState<TData>;
|
|
32
|
+
/** Agent options for identity/personality */
|
|
33
|
+
agentOptions: AgentOptions<TContext, TData>;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Result of building a batch prompt
|
|
38
|
+
*/
|
|
39
|
+
export interface BatchPromptResult {
|
|
40
|
+
/** The combined prompt string */
|
|
41
|
+
prompt: string;
|
|
42
|
+
/** All collect fields from all steps in the batch */
|
|
43
|
+
collectFields: string[];
|
|
44
|
+
/** Number of steps included in the prompt */
|
|
45
|
+
stepCount: number;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* BatchPromptBuilder class - builds combined prompts for batch execution
|
|
50
|
+
*
|
|
51
|
+
* Combines multiple Step prompts into a single coherent prompt that:
|
|
52
|
+
* - Preserves the intent of each Step's individual prompt
|
|
53
|
+
* - Includes data collection instructions for all collect fields
|
|
54
|
+
* - Produces a single LLM call regardless of the number of Steps
|
|
55
|
+
*
|
|
56
|
+
* **Validates: Requirements 4.1, 4.2, 4.3, 4.4**
|
|
57
|
+
*/
|
|
58
|
+
export class BatchPromptBuilder<TContext = unknown, TData = unknown> {
|
|
59
|
+
/**
|
|
60
|
+
* Build a combined prompt for a batch of Steps
|
|
61
|
+
*
|
|
62
|
+
* @param params - Parameters for building the batch prompt
|
|
63
|
+
* @returns BatchPromptResult with the combined prompt and metadata
|
|
64
|
+
*
|
|
65
|
+
* **Validates: Requirements 4.1, 4.2, 4.3, 4.4**
|
|
66
|
+
*/
|
|
67
|
+
async buildBatchPrompt(params: BuildBatchPromptParams<TContext, TData>): Promise<BatchPromptResult> {
|
|
68
|
+
const { steps, route, history, context, session, agentOptions } = params;
|
|
69
|
+
|
|
70
|
+
// Create template context for rendering
|
|
71
|
+
const templateContext = createTemplateContext<TContext, TData>({
|
|
72
|
+
context,
|
|
73
|
+
data: session.data,
|
|
74
|
+
session,
|
|
75
|
+
history,
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
// Collect all collect fields from all steps
|
|
79
|
+
const collectFields: string[] = [];
|
|
80
|
+
for (const step of steps) {
|
|
81
|
+
if (step.collect && step.collect.length > 0) {
|
|
82
|
+
for (const field of step.collect) {
|
|
83
|
+
const fieldStr = String(field);
|
|
84
|
+
if (!collectFields.includes(fieldStr)) {
|
|
85
|
+
collectFields.push(fieldStr);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Build the combined prompt using PromptComposer for consistency
|
|
92
|
+
const composer = new PromptComposer<TContext, TData>(templateContext);
|
|
93
|
+
|
|
94
|
+
// Add agent meta information
|
|
95
|
+
await composer.addAgentMeta(agentOptions);
|
|
96
|
+
|
|
97
|
+
// Add route-specific identity/personality if available
|
|
98
|
+
if (route.identity) {
|
|
99
|
+
const identity = await render(route.identity, templateContext);
|
|
100
|
+
if (identity) {
|
|
101
|
+
await composer.addInstruction(`**Route Identity:** ${identity}`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
if (route.personality) {
|
|
106
|
+
const personality = await render(route.personality, templateContext);
|
|
107
|
+
if (personality) {
|
|
108
|
+
await composer.addInstruction(`**Route Personality:** ${personality}`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// Add knowledge base if available
|
|
113
|
+
await composer.addKnowledgeBase(agentOptions.knowledgeBase, route.getKnowledgeBase());
|
|
114
|
+
|
|
115
|
+
// Add glossary terms
|
|
116
|
+
const allTerms = [...(agentOptions.terms || []), ...route.getTerms()];
|
|
117
|
+
await composer.addGlossary(allTerms);
|
|
118
|
+
|
|
119
|
+
// Add guidelines
|
|
120
|
+
const allGuidelines = [...(agentOptions.guidelines || []), ...route.getGuidelines()];
|
|
121
|
+
await composer.addGuidelines(allGuidelines);
|
|
122
|
+
|
|
123
|
+
// Add combined rules (agent + route)
|
|
124
|
+
const allRules = [...(agentOptions.rules || []), ...route.getRules()];
|
|
125
|
+
if (allRules.length > 0) {
|
|
126
|
+
const renderedRules = await renderMany(allRules, templateContext);
|
|
127
|
+
if (renderedRules.length > 0) {
|
|
128
|
+
await composer.addInstruction(`Rules:\n- ${renderedRules.join('\n- ')}`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// Add combined prohibitions (agent + route)
|
|
133
|
+
const allProhibitions = [...(agentOptions.prohibitions || []), ...route.getProhibitions()];
|
|
134
|
+
if (allProhibitions.length > 0) {
|
|
135
|
+
const renderedProhibitions = await renderMany(allProhibitions, templateContext);
|
|
136
|
+
if (renderedProhibitions.length > 0) {
|
|
137
|
+
await composer.addInstruction(`Prohibitions:\n- ${renderedProhibitions.join('\n- ')}`);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// Add interaction history
|
|
142
|
+
await composer.addInteractionHistory(history, 'Recent conversation context:');
|
|
143
|
+
|
|
144
|
+
// Build the step sections
|
|
145
|
+
const stepSections = await this.buildStepSections(steps, templateContext);
|
|
146
|
+
|
|
147
|
+
// Add the conversation flow section
|
|
148
|
+
if (steps.length > 1) {
|
|
149
|
+
await composer.addInstruction(
|
|
150
|
+
`## Current Conversation Flow\n\n` +
|
|
151
|
+
`You are handling multiple aspects of this conversation in a single response.\n\n` +
|
|
152
|
+
stepSections
|
|
153
|
+
);
|
|
154
|
+
} else if (steps.length === 1) {
|
|
155
|
+
await composer.addInstruction(
|
|
156
|
+
`## Current Step\n\n` +
|
|
157
|
+
stepSections
|
|
158
|
+
);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// Add data collection section if there are fields to collect
|
|
162
|
+
if (collectFields.length > 0) {
|
|
163
|
+
const collectionSection = this.buildDataCollectionSection(collectFields, agentOptions);
|
|
164
|
+
await composer.addInstruction(collectionSection);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// Add response format instructions
|
|
168
|
+
const responseFormat = this.buildResponseFormatSection(collectFields);
|
|
169
|
+
await composer.addInstruction(responseFormat);
|
|
170
|
+
|
|
171
|
+
// Build the final prompt
|
|
172
|
+
const prompt = await composer.build();
|
|
173
|
+
|
|
174
|
+
return {
|
|
175
|
+
prompt,
|
|
176
|
+
collectFields,
|
|
177
|
+
stepCount: steps.length,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Build the step sections of the prompt
|
|
183
|
+
*
|
|
184
|
+
* @param steps - Steps to include in the prompt
|
|
185
|
+
* @param templateContext - Template context for rendering
|
|
186
|
+
* @returns Formatted step sections string
|
|
187
|
+
*/
|
|
188
|
+
private async buildStepSections(
|
|
189
|
+
steps: StepOptions<TContext, TData>[],
|
|
190
|
+
templateContext: ReturnType<typeof createTemplateContext<TContext, TData>>
|
|
191
|
+
): Promise<string> {
|
|
192
|
+
const sections: string[] = [];
|
|
193
|
+
|
|
194
|
+
for (let i = 0; i < steps.length; i++) {
|
|
195
|
+
const step = steps[i];
|
|
196
|
+
const stepNumber = i + 1;
|
|
197
|
+
|
|
198
|
+
// Build step header
|
|
199
|
+
const description = step.description || `Step ${stepNumber}`;
|
|
200
|
+
let section = `### Step ${stepNumber}: ${description}\n`;
|
|
201
|
+
|
|
202
|
+
// Render and add step prompt if available
|
|
203
|
+
if (step.prompt) {
|
|
204
|
+
const renderedPrompt = await render(step.prompt, templateContext);
|
|
205
|
+
if (renderedPrompt) {
|
|
206
|
+
section += `\n${renderedPrompt}\n`;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// Add collect fields for this step if any
|
|
211
|
+
if (step.collect && step.collect.length > 0) {
|
|
212
|
+
const collectList = step.collect.map(f => `\`${String(f)}\``).join(', ');
|
|
213
|
+
section += `\n**Collect:** ${collectList}\n`;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
sections.push(section);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
return sections.join('\n');
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Build the data collection section of the prompt
|
|
224
|
+
*
|
|
225
|
+
* @param collectFields - Fields to collect from the response
|
|
226
|
+
* @param agentOptions - Agent options containing schema information
|
|
227
|
+
* @returns Formatted data collection section string
|
|
228
|
+
*/
|
|
229
|
+
private buildDataCollectionSection(
|
|
230
|
+
collectFields: string[],
|
|
231
|
+
agentOptions: AgentOptions<TContext, TData>
|
|
232
|
+
): string {
|
|
233
|
+
const lines: string[] = [
|
|
234
|
+
'## Data Collection',
|
|
235
|
+
'',
|
|
236
|
+
'Extract the following information from your response:',
|
|
237
|
+
''
|
|
238
|
+
];
|
|
239
|
+
|
|
240
|
+
// Get schema information if available
|
|
241
|
+
const schema = agentOptions.schema;
|
|
242
|
+
|
|
243
|
+
for (const field of collectFields) {
|
|
244
|
+
let fieldDescription = field;
|
|
245
|
+
|
|
246
|
+
// Try to get field type/description from schema
|
|
247
|
+
if (schema?.properties && schema.properties[field]) {
|
|
248
|
+
const fieldSchema = schema.properties[field] as Record<string, unknown>;
|
|
249
|
+
const rawType = fieldSchema.type;
|
|
250
|
+
const rawDescription = fieldSchema.description;
|
|
251
|
+
|
|
252
|
+
// Safely convert to string, handling objects and primitives
|
|
253
|
+
const type = typeof rawType === 'string' ? rawType : 'string';
|
|
254
|
+
const description = typeof rawDescription === 'string' ? rawDescription : '';
|
|
255
|
+
|
|
256
|
+
if (description) {
|
|
257
|
+
fieldDescription = `${field} (${type}): ${description}`;
|
|
258
|
+
} else {
|
|
259
|
+
fieldDescription = `${field} (${type})`;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
lines.push(`- ${fieldDescription}`);
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
return lines.join('\n');
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* Build the response format section of the prompt
|
|
271
|
+
*
|
|
272
|
+
* @param collectFields - Fields to collect from the response
|
|
273
|
+
* @returns Formatted response format section string
|
|
274
|
+
*/
|
|
275
|
+
private buildResponseFormatSection(collectFields: string[]): string {
|
|
276
|
+
const lines: string[] = [
|
|
277
|
+
'## Response Format',
|
|
278
|
+
'',
|
|
279
|
+
'Return JSON with:',
|
|
280
|
+
'- `message`: Your response to the user'
|
|
281
|
+
];
|
|
282
|
+
|
|
283
|
+
if (collectFields.length > 0) {
|
|
284
|
+
lines.push('');
|
|
285
|
+
lines.push('Include the following collected fields as top-level properties:');
|
|
286
|
+
for (const field of collectFields) {
|
|
287
|
+
lines.push(`- \`${field}\``);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
return lines.join('\n');
|
|
292
|
+
}
|
|
293
|
+
}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import type { Event, Term, Guideline, AgentOptions } from "../types";
|
|
2
2
|
import type { Route } from "./Route";
|
|
3
|
-
import { render, renderMany, formatKnowledgeBase } from "../utils/template";
|
|
3
|
+
import { render, renderMany, formatKnowledgeBase, createTemplateContext } from "../utils/template";
|
|
4
4
|
import { TemplateContext } from "../types/template";
|
|
5
|
+
import { extractAIContextStrings, ConditionEvaluator } from "../utils/condition";
|
|
5
6
|
|
|
6
7
|
export class PromptComposer<TContext = unknown, TData = unknown> {
|
|
7
8
|
private parts: string[] = [];
|
|
8
9
|
private renderContext: TemplateContext<TContext, TData>;
|
|
9
10
|
|
|
10
|
-
constructor(context: TemplateContext<TContext, TData> = {}) {
|
|
11
|
+
constructor(context: TemplateContext<TContext, TData> = createTemplateContext({})) {
|
|
11
12
|
this.renderContext = context;
|
|
12
13
|
}
|
|
13
14
|
|
|
@@ -100,22 +101,60 @@ export class PromptComposer<TContext = unknown, TData = unknown> {
|
|
|
100
101
|
return this;
|
|
101
102
|
}
|
|
102
103
|
|
|
103
|
-
async addGuidelines(guidelines: Guideline<TContext>[]): Promise<this> {
|
|
104
|
+
async addGuidelines(guidelines: Guideline<TContext, TData>[]): Promise<this> {
|
|
104
105
|
const enabled = guidelines.filter((g) => g.enabled !== false);
|
|
105
106
|
if (!enabled.length) return this;
|
|
106
107
|
|
|
108
|
+
const evaluator = new ConditionEvaluator(this.renderContext);
|
|
109
|
+
const activeGuidelines: Guideline<TContext, TData>[] = [];
|
|
110
|
+
const allAIContextStrings: string[] = [];
|
|
111
|
+
|
|
112
|
+
// Evaluate guideline conditions to determine which are active
|
|
113
|
+
for (const guideline of enabled) {
|
|
114
|
+
if (guideline.condition) {
|
|
115
|
+
const evaluation = await evaluator.evaluateCondition(guideline.condition, 'AND');
|
|
116
|
+
|
|
117
|
+
// Collect AI context strings for prompt
|
|
118
|
+
allAIContextStrings.push(...evaluation.aiContextStrings);
|
|
119
|
+
|
|
120
|
+
// Include guideline if:
|
|
121
|
+
// 1. No programmatic conditions (only strings) - always active
|
|
122
|
+
// 2. Programmatic conditions evaluate to true
|
|
123
|
+
if (!evaluation.hasProgrammaticConditions || evaluation.programmaticResult) {
|
|
124
|
+
activeGuidelines.push(guideline);
|
|
125
|
+
}
|
|
126
|
+
} else {
|
|
127
|
+
// No condition means always active
|
|
128
|
+
activeGuidelines.push(guideline);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
if (!activeGuidelines.length && !allAIContextStrings.length) return this;
|
|
133
|
+
|
|
107
134
|
const renderedGuidelines = await Promise.all(
|
|
108
|
-
|
|
135
|
+
activeGuidelines.map(async (g, i) => {
|
|
109
136
|
const action = await render(g.action, this.renderContext);
|
|
110
137
|
if (g.condition) {
|
|
111
|
-
|
|
112
|
-
|
|
138
|
+
// Use AI context strings if available, otherwise render the condition
|
|
139
|
+
const conditionStrings = extractAIContextStrings(g.condition);
|
|
140
|
+
if (conditionStrings.length > 0) {
|
|
141
|
+
const conditionText = conditionStrings.join(" AND ");
|
|
142
|
+
return `- Guideline #${i + 1}: When ${conditionText}, then ${action}`;
|
|
143
|
+
}
|
|
113
144
|
}
|
|
114
145
|
return `- Guideline #${i + 1}: ${action}`;
|
|
115
146
|
})
|
|
116
147
|
);
|
|
117
148
|
|
|
118
|
-
|
|
149
|
+
// Add any additional AI context from inactive guidelines
|
|
150
|
+
if (allAIContextStrings.length > 0) {
|
|
151
|
+
const uniqueContextStrings = Array.from(new Set(allAIContextStrings));
|
|
152
|
+
const contextSection = `\n\n**Additional Context:** ${uniqueContextStrings.join(", ")}`;
|
|
153
|
+
this.parts.push(`## Guidelines\n\n${renderedGuidelines.join("\n")}${contextSection}`);
|
|
154
|
+
} else {
|
|
155
|
+
this.parts.push(`## Guidelines\n\n${renderedGuidelines.join("\n")}`);
|
|
156
|
+
}
|
|
157
|
+
|
|
119
158
|
return this;
|
|
120
159
|
}
|
|
121
160
|
|
|
@@ -143,11 +182,10 @@ export class PromptComposer<TContext = unknown, TData = unknown> {
|
|
|
143
182
|
|
|
144
183
|
const renderedRoutes = await Promise.all(
|
|
145
184
|
routes.map(async (r, i) => {
|
|
185
|
+
const whenContextStrings = r.when ? extractAIContextStrings(r.when) : [];
|
|
146
186
|
const conditions =
|
|
147
|
-
|
|
148
|
-
? `\n\n **Triggered when:** ${(
|
|
149
|
-
await renderMany(r.conditions, this.renderContext)
|
|
150
|
-
).join(" OR ")}`
|
|
187
|
+
whenContextStrings.length > 0
|
|
188
|
+
? `\n\n **Triggered when:** ${whenContextStrings.join(" OR ")}`
|
|
151
189
|
: "";
|
|
152
190
|
const desc = r.description
|
|
153
191
|
? `\n\n **Description:** ${r.description}`
|
|
@@ -164,12 +202,11 @@ export class PromptComposer<TContext = unknown, TData = unknown> {
|
|
|
164
202
|
const prohibitionsInfo =
|
|
165
203
|
prohibitions.length > 0
|
|
166
204
|
? `\n\n **Prohibitions:**\n ${prohibitions
|
|
167
|
-
|
|
168
|
-
|
|
205
|
+
.map((x) => ` - ${x}`)
|
|
206
|
+
.join("\n ")}`
|
|
169
207
|
: "";
|
|
170
|
-
return `### Route ${i + 1}: ${
|
|
171
|
-
|
|
172
|
-
}${desc}${conditions}${rulesInfo}${prohibitionsInfo}`;
|
|
208
|
+
return `### Route ${i + 1}: ${r.title
|
|
209
|
+
}${desc}${conditions}${rulesInfo}${prohibitionsInfo}`;
|
|
173
210
|
})
|
|
174
211
|
);
|
|
175
212
|
|
|
@@ -10,7 +10,7 @@ import type {
|
|
|
10
10
|
import type { Route } from "./Route";
|
|
11
11
|
import type { Step } from "./Step";
|
|
12
12
|
import { PromptComposer } from "./PromptComposer";
|
|
13
|
-
import { render } from "../utils/template";
|
|
13
|
+
import { createTemplateContext, render } from "../utils/template";
|
|
14
14
|
|
|
15
15
|
export interface BuildResponsePromptParams<
|
|
16
16
|
TContext = unknown,
|
|
@@ -44,36 +44,47 @@ export interface BuildFallbackPromptParams<TContext = unknown, TData = unknown>
|
|
|
44
44
|
|
|
45
45
|
export class ResponseEngine<TContext = unknown, TData = unknown> {
|
|
46
46
|
responseSchemaForRoute(
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
47
|
+
route: Route<TContext, TData>,
|
|
48
|
+
currentStep?: Step<TContext, TData>,
|
|
49
|
+
agentSchema?: StructuredSchema
|
|
50
|
+
): StructuredSchema {
|
|
51
|
+
const base: StructuredSchema = {
|
|
52
|
+
type: "object",
|
|
53
|
+
properties: {
|
|
54
|
+
message: { type: "string", description: "Final user-facing message" },
|
|
55
|
+
},
|
|
56
|
+
required: ["message"],
|
|
57
|
+
additionalProperties: false,
|
|
58
|
+
};
|
|
59
59
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
60
|
+
// Add data field only if route has responseOutputSchema
|
|
61
|
+
if (route.responseOutputSchema) {
|
|
62
|
+
base.properties!.data = route.responseOutputSchema;
|
|
63
|
+
}
|
|
64
64
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
65
|
+
// Add collect fields from current step
|
|
66
|
+
if (currentStep?.collect) {
|
|
67
|
+
if (agentSchema?.properties) {
|
|
68
|
+
// Use agent schema definitions for collect fields
|
|
69
|
+
for (const field of currentStep.collect) {
|
|
70
|
+
const fieldSchema = agentSchema.properties[field as string];
|
|
71
|
+
if (fieldSchema) {
|
|
72
|
+
base.properties![field as string] = fieldSchema;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
} else {
|
|
76
|
+
// No agent schema - generate dynamic schema from collect fields
|
|
77
|
+
for (const field of currentStep.collect) {
|
|
78
|
+
base.properties![field as string] = {
|
|
79
|
+
type: "string",
|
|
80
|
+
description: `Collected value for ${String(field)}`,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
71
83
|
}
|
|
72
84
|
}
|
|
73
|
-
}
|
|
74
85
|
|
|
75
|
-
|
|
76
|
-
|
|
86
|
+
return base;
|
|
87
|
+
}
|
|
77
88
|
|
|
78
89
|
async buildResponsePrompt(
|
|
79
90
|
params: BuildResponsePromptParams<TContext, TData>
|
|
@@ -91,8 +102,9 @@ export class ResponseEngine<TContext = unknown, TData = unknown> {
|
|
|
91
102
|
combinedTerms,
|
|
92
103
|
context,
|
|
93
104
|
session,
|
|
105
|
+
agentSchema,
|
|
94
106
|
} = params;
|
|
95
|
-
const templateContext = { context, session, history };
|
|
107
|
+
const templateContext = createTemplateContext({ context, session, history });
|
|
96
108
|
const pc = new PromptComposer(templateContext);
|
|
97
109
|
|
|
98
110
|
// Create combined agent options with route overrides
|
|
@@ -143,9 +155,136 @@ export class ResponseEngine<TContext = unknown, TData = unknown> {
|
|
|
143
155
|
|
|
144
156
|
await pc.addInteractionHistory(history);
|
|
145
157
|
await pc.addLastMessage(lastMessage);
|
|
158
|
+
|
|
159
|
+
// Add data collection instructions - include ALL route fields, not just current step
|
|
160
|
+
// Collect all fields from route's required and optional fields
|
|
161
|
+
const allRouteFields = new Set<string>();
|
|
162
|
+
|
|
163
|
+
if (route.requiredFields) {
|
|
164
|
+
route.requiredFields.forEach(field => allRouteFields.add(String(field)));
|
|
165
|
+
}
|
|
166
|
+
if (route.optionalFields) {
|
|
167
|
+
route.optionalFields.forEach(field => allRouteFields.add(String(field)));
|
|
168
|
+
}
|
|
169
|
+
if (currentStep?.collect) {
|
|
170
|
+
currentStep.collect.forEach(field => allRouteFields.add(String(field)));
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
if (allRouteFields.size > 0) {
|
|
174
|
+
const stepCollectFields = new Set(currentStep?.collect?.map(f => String(f)) || []);
|
|
175
|
+
const fieldDescriptions: string[] = [];
|
|
176
|
+
|
|
177
|
+
for (const field of allRouteFields) {
|
|
178
|
+
if (agentSchema?.properties) {
|
|
179
|
+
const fieldSchema = agentSchema.properties[field];
|
|
180
|
+
if (fieldSchema) {
|
|
181
|
+
const fieldName = field;
|
|
182
|
+
const fieldDesc = fieldSchema.description || fieldName;
|
|
183
|
+
const fieldType = Array.isArray(fieldSchema.type) ? fieldSchema.type[0] : fieldSchema.type;
|
|
184
|
+
|
|
185
|
+
let fieldInfo = ` • ${fieldName} (${fieldType})`;
|
|
186
|
+
|
|
187
|
+
// Add enum values if present
|
|
188
|
+
if (fieldSchema.enum && Array.isArray(fieldSchema.enum)) {
|
|
189
|
+
fieldInfo += ` [${fieldSchema.enum.join(' | ')}]`;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
// Add description
|
|
193
|
+
fieldInfo += `: ${fieldDesc}`;
|
|
194
|
+
|
|
195
|
+
// Mark if this is the current step's focus
|
|
196
|
+
if (stepCollectFields.has(field)) {
|
|
197
|
+
fieldInfo += ` ← FOCUS FOR THIS STEP`;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
fieldDescriptions.push(fieldInfo);
|
|
201
|
+
}
|
|
202
|
+
} else {
|
|
203
|
+
// No agent schema - generate dynamic description from field name
|
|
204
|
+
let fieldInfo = ` • ${field} (string): ${field}`;
|
|
205
|
+
if (stepCollectFields.has(field)) {
|
|
206
|
+
fieldInfo += ` ← FOCUS FOR THIS STEP`;
|
|
207
|
+
}
|
|
208
|
+
fieldDescriptions.push(fieldInfo);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
if (fieldDescriptions.length > 0) {
|
|
213
|
+
const instruction = [
|
|
214
|
+
`## Data Collection Rules`,
|
|
215
|
+
``,
|
|
216
|
+
`CRITICAL: You MUST extract ALL relevant information from the user's message, not just what this step asks for.`,
|
|
217
|
+
``,
|
|
218
|
+
`Available fields to extract:`,
|
|
219
|
+
...fieldDescriptions,
|
|
220
|
+
``,
|
|
221
|
+
`**How to collect data:**`,
|
|
222
|
+
`1. Read the user's message carefully`,
|
|
223
|
+
`2. Extract EVERY piece of information that matches ANY field above`,
|
|
224
|
+
`3. Users often provide multiple details at once (e.g., "I need a checkup next Tuesday at 2 PM")`,
|
|
225
|
+
`4. Include ALL extracted fields in your JSON response as top-level properties`,
|
|
226
|
+
`5. Field names must match EXACTLY as shown above`,
|
|
227
|
+
`6. Only include fields that the user actually mentioned`,
|
|
228
|
+
``,
|
|
229
|
+
`**Example:** If user says "I need a checkup next Tuesday at 2 PM", extract:`,
|
|
230
|
+
`- appointmentType: "checkup"`,
|
|
231
|
+
`- preferredDate: "next Tuesday"`,
|
|
232
|
+
`- preferredTime: "2 PM"`,
|
|
233
|
+
].join('\n');
|
|
234
|
+
|
|
235
|
+
await pc.addInstruction(instruction);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
// Add response format instructions with explicit JSON structure
|
|
240
|
+
// Generate example JSON based on actual schema fields
|
|
241
|
+
const exampleFields: string[] = [' "message": "your response to the user"'];
|
|
242
|
+
|
|
243
|
+
for (const field of allRouteFields) {
|
|
244
|
+
if (agentSchema?.properties) {
|
|
245
|
+
const fieldSchema = agentSchema.properties[field];
|
|
246
|
+
if (fieldSchema) {
|
|
247
|
+
const fieldType = Array.isArray(fieldSchema.type) ? fieldSchema.type[0] : fieldSchema.type;
|
|
248
|
+
let exampleValue = '"value if extracted"';
|
|
249
|
+
|
|
250
|
+
// Generate type-appropriate example
|
|
251
|
+
if (fieldSchema.enum && Array.isArray(fieldSchema.enum) && fieldSchema.enum.length > 0) {
|
|
252
|
+
exampleValue = `"${fieldSchema.enum[0]}"`;
|
|
253
|
+
} else if (fieldType === 'string') {
|
|
254
|
+
exampleValue = '"extracted value"';
|
|
255
|
+
} else if (fieldType === 'number' || fieldType === 'integer') {
|
|
256
|
+
exampleValue = '0';
|
|
257
|
+
} else if (fieldType === 'boolean') {
|
|
258
|
+
exampleValue = 'true';
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
exampleFields.push(` "${field}": ${exampleValue}`);
|
|
262
|
+
}
|
|
263
|
+
} else {
|
|
264
|
+
// No agent schema - use string as default
|
|
265
|
+
exampleFields.push(` "${field}": "extracted value"`);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
|
|
146
269
|
await pc.addInstruction(
|
|
147
|
-
|
|
270
|
+
[
|
|
271
|
+
`## Response Format`,
|
|
272
|
+
``,
|
|
273
|
+
`You MUST return ONLY valid JSON in this exact format:`,
|
|
274
|
+
`{`,
|
|
275
|
+
...exampleFields.map((f, i) => i < exampleFields.length - 1 ? `${f},` : f),
|
|
276
|
+
`}`,
|
|
277
|
+
``,
|
|
278
|
+
`CRITICAL RULES:`,
|
|
279
|
+
`- Return ONLY the JSON object, no other text`,
|
|
280
|
+
`- The "message" field is REQUIRED and must contain your response to the user`,
|
|
281
|
+
`- Include ALL extracted data fields as top-level properties`,
|
|
282
|
+
`- Only include data fields that were actually mentioned by the user`,
|
|
283
|
+
`- Do not wrap the JSON in markdown code blocks`,
|
|
284
|
+
`- Do not add any explanatory text before or after the JSON`,
|
|
285
|
+
].join('\n')
|
|
148
286
|
);
|
|
287
|
+
|
|
149
288
|
return pc.build();
|
|
150
289
|
}
|
|
151
290
|
|
|
@@ -154,7 +293,7 @@ export class ResponseEngine<TContext = unknown, TData = unknown> {
|
|
|
154
293
|
): Promise<string> {
|
|
155
294
|
const { history, agentOptions, terms, guidelines, context, session } =
|
|
156
295
|
params;
|
|
157
|
-
const templateContext = { context, session, history };
|
|
296
|
+
const templateContext = createTemplateContext({ context, session, history });
|
|
158
297
|
const pc = new PromptComposer(templateContext);
|
|
159
298
|
|
|
160
299
|
await pc.addAgentMeta(agentOptions);
|