@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
|
@@ -20,6 +20,8 @@ import type {
|
|
|
20
20
|
StructuredSchema,
|
|
21
21
|
} from "../types";
|
|
22
22
|
import { withTimeoutAndRetry } from "../utils/retry";
|
|
23
|
+
import { tryParseJSONResponse } from "../utils/json";
|
|
24
|
+
import { logger } from "../utils/logger";
|
|
23
25
|
|
|
24
26
|
const DEFAULT_RETRY_CONFIG = {
|
|
25
27
|
timeout: 60000,
|
|
@@ -194,7 +196,7 @@ export class GeminiProvider implements AiProvider {
|
|
|
194
196
|
(Array.isArray(schema.type) && schema.type.includes("object"))
|
|
195
197
|
) {
|
|
196
198
|
if (!schema.properties || Object.keys(schema.properties).length === 0) {
|
|
197
|
-
|
|
199
|
+
logger.warn(
|
|
198
200
|
"[GeminiProvider] Gemini requires OBJECT types to have non-empty properties. Converting empty object to STRING."
|
|
199
201
|
);
|
|
200
202
|
geminiSchema.type = Type.STRING;
|
|
@@ -246,7 +248,7 @@ export class GeminiProvider implements AiProvider {
|
|
|
246
248
|
case "object":
|
|
247
249
|
return Type.OBJECT;
|
|
248
250
|
default:
|
|
249
|
-
|
|
251
|
+
logger.warn(
|
|
250
252
|
`[GeminiProvider] Unknown type "${type}", defaulting to STRING`
|
|
251
253
|
);
|
|
252
254
|
return Type.STRING;
|
|
@@ -282,7 +284,7 @@ export class GeminiProvider implements AiProvider {
|
|
|
282
284
|
return await this.generateWithModel(this.primaryModel, input);
|
|
283
285
|
} catch (primaryError: unknown) {
|
|
284
286
|
const primaryErrMsg = getErrorMessage(primaryError);
|
|
285
|
-
|
|
287
|
+
logger.warn(
|
|
286
288
|
`[GEMINI] Primary model ${this.primaryModel} failed: ${primaryErrMsg}`
|
|
287
289
|
);
|
|
288
290
|
|
|
@@ -290,25 +292,24 @@ export class GeminiProvider implements AiProvider {
|
|
|
290
292
|
throw primaryError;
|
|
291
293
|
}
|
|
292
294
|
|
|
293
|
-
|
|
295
|
+
logger.debug(`[GEMINI] Trying backup models`);
|
|
294
296
|
|
|
295
297
|
let lastBackupError: unknown = primaryError;
|
|
296
298
|
|
|
297
299
|
for (let i = 0; i < this.backupModels.length; i++) {
|
|
298
300
|
const backupModel = this.backupModels[i];
|
|
299
|
-
|
|
300
|
-
`[GEMINI] Trying backup model ${i + 1}/${
|
|
301
|
-
this.backupModels.length
|
|
301
|
+
logger.debug(
|
|
302
|
+
`[GEMINI] Trying backup model ${i + 1}/${this.backupModels.length
|
|
302
303
|
}: ${backupModel}`
|
|
303
304
|
);
|
|
304
305
|
|
|
305
306
|
try {
|
|
306
307
|
const result = await this.generateWithModel(backupModel, input);
|
|
307
|
-
|
|
308
|
+
logger.debug(`[GEMINI] Backup model ${backupModel} succeeded`);
|
|
308
309
|
return result as GenerateMessageOutput<TStructured>;
|
|
309
310
|
} catch (backupError: unknown) {
|
|
310
311
|
const backupErrMsg = getErrorMessage(backupError);
|
|
311
|
-
|
|
312
|
+
logger.warn(
|
|
312
313
|
`[GEMINI] Backup model ${backupModel} failed: ${backupErrMsg}`
|
|
313
314
|
);
|
|
314
315
|
lastBackupError = backupError;
|
|
@@ -317,7 +318,7 @@ export class GeminiProvider implements AiProvider {
|
|
|
317
318
|
!shouldUseBackupModel(backupError) &&
|
|
318
319
|
i < this.backupModels.length - 1
|
|
319
320
|
) {
|
|
320
|
-
|
|
321
|
+
logger.debug(
|
|
321
322
|
`[GEMINI] Backup model error doesn't qualify for further attempts`
|
|
322
323
|
);
|
|
323
324
|
break;
|
|
@@ -326,7 +327,7 @@ export class GeminiProvider implements AiProvider {
|
|
|
326
327
|
}
|
|
327
328
|
|
|
328
329
|
const lastBackupErrMsg = getErrorMessage(lastBackupError);
|
|
329
|
-
|
|
330
|
+
logger.error(
|
|
330
331
|
`[GEMINI] All models failed. Primary: ${primaryErrMsg}, Last backup: ${lastBackupErrMsg}`
|
|
331
332
|
);
|
|
332
333
|
throw lastBackupError;
|
|
@@ -344,40 +345,49 @@ export class GeminiProvider implements AiProvider {
|
|
|
344
345
|
// Schema-required: configure response schema
|
|
345
346
|
const configOverride: Partial<GenerateContentConfig> = { ...this.config };
|
|
346
347
|
|
|
347
|
-
//
|
|
348
|
-
|
|
348
|
+
// Handle tools and JSON schema - Gemini doesn't support both simultaneously
|
|
349
|
+
const hasTools = input.tools && input.tools.length > 0;
|
|
350
|
+
const hasJsonSchema = input.parameters?.jsonSchema;
|
|
351
|
+
|
|
352
|
+
if (hasTools && hasJsonSchema) {
|
|
353
|
+
logger.debug(`[GeminiProvider] Both tools and JSON schema provided. Prioritizing function calling - JSON schema will be ignored.`);
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
if (hasTools) {
|
|
357
|
+
const toolNames = input.tools?.map((tool) => tool.name || tool.id) || [];
|
|
358
|
+
logger.debug(`[GeminiProvider] Configuring ${toolNames.length} tools for model ${model}:`, toolNames);
|
|
349
359
|
configOverride.tools = [
|
|
350
360
|
{
|
|
351
|
-
functionDeclarations: input.tools
|
|
361
|
+
functionDeclarations: input.tools?.map((tool) => ({
|
|
352
362
|
name: tool.name || tool.id,
|
|
353
363
|
description: tool.description || "",
|
|
354
364
|
parameters: tool.parameters as FunctionDeclaration["parameters"], // JSON schema
|
|
355
365
|
})),
|
|
356
366
|
},
|
|
357
367
|
];
|
|
358
|
-
}
|
|
359
368
|
|
|
360
|
-
if (
|
|
369
|
+
} else if (hasJsonSchema) {
|
|
370
|
+
// Only set JSON schema if no tools are present
|
|
361
371
|
configOverride.responseMimeType = "application/json";
|
|
362
372
|
// Adapt common schema format to Gemini's specific requirements
|
|
363
|
-
configOverride.responseSchema = this.adaptSchemaForGemini(
|
|
373
|
+
configOverride.responseSchema = input.parameters ? this.adaptSchemaForGemini(
|
|
364
374
|
input.parameters.jsonSchema
|
|
365
|
-
);
|
|
375
|
+
) : {};
|
|
366
376
|
}
|
|
367
377
|
|
|
368
|
-
|
|
369
|
-
|
|
378
|
+
let response: GenerateContentResponse;
|
|
379
|
+
try {
|
|
380
|
+
response = await this.genAI.models.generateContent({
|
|
370
381
|
model,
|
|
371
382
|
contents: input.prompt,
|
|
372
383
|
config: configOverride,
|
|
373
384
|
});
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
throw new Error("No response from Gemini");
|
|
385
|
+
} catch (error: unknown) {
|
|
386
|
+
logger.error(`[GeminiProvider] API call failed:`, error);
|
|
387
|
+
throw error;
|
|
378
388
|
}
|
|
379
389
|
|
|
380
|
-
// Extract tool calls from response
|
|
390
|
+
// Extract tool calls from response first
|
|
381
391
|
const toolCalls: Array<{
|
|
382
392
|
toolName: string;
|
|
383
393
|
arguments: Record<string, unknown>;
|
|
@@ -395,21 +405,68 @@ export class GeminiProvider implements AiProvider {
|
|
|
395
405
|
}
|
|
396
406
|
}
|
|
397
407
|
|
|
408
|
+
// Debug logging for response structure
|
|
409
|
+
if (!response.text && toolCalls.length === 0) {
|
|
410
|
+
logger.debug(`[GeminiProvider] Debug - Response structure:`, {
|
|
411
|
+
hasText: !!response.text,
|
|
412
|
+
candidatesCount: response.candidates?.length || 0,
|
|
413
|
+
firstCandidateContent: response.candidates?.[0]?.content,
|
|
414
|
+
firstCandidateParts: response.candidates?.[0]?.content?.parts?.length || 0,
|
|
415
|
+
});
|
|
416
|
+
}
|
|
417
|
+
// Try to get text from response, handling function calls properly
|
|
418
|
+
let message = "";
|
|
419
|
+
try {
|
|
420
|
+
message = response.text || "";
|
|
421
|
+
} catch (textError) {
|
|
422
|
+
// Sometimes response.text throws when there are function calls
|
|
423
|
+
logger.debug(`[GeminiProvider] Could not get response.text (likely due to function calls):`, textError);
|
|
424
|
+
|
|
425
|
+
// Try to extract text parts manually
|
|
426
|
+
if (response.candidates && response.candidates[0]?.content?.parts) {
|
|
427
|
+
const textParts = response.candidates[0].content.parts
|
|
428
|
+
.filter(part => part.text)
|
|
429
|
+
.map(part => part.text)
|
|
430
|
+
.join('');
|
|
431
|
+
message = textParts;
|
|
432
|
+
logger.debug(`[GeminiProvider] Extracted text from parts:`, message);
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
// Only throw error if we have no text AND no function calls
|
|
437
|
+
if (!message && toolCalls.length === 0) {
|
|
438
|
+
logger.error(`[GeminiProvider] Empty response - no text or function calls`);
|
|
439
|
+
logger.error(`[GeminiProvider] Response candidates:`, response.candidates);
|
|
440
|
+
throw new Error("No response from Gemini");
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
// Log when we have function calls but no text (this is normal)
|
|
444
|
+
if (toolCalls.length > 0 && !message) {
|
|
445
|
+
logger.debug(`[GeminiProvider] Function calls detected without text message:`, toolCalls.map(tc => tc.toolName));
|
|
446
|
+
} else if (toolCalls.length > 0 && message) {
|
|
447
|
+
logger.debug(`[GeminiProvider] Response has both text and function calls:`, {
|
|
448
|
+
messageLength: message.length,
|
|
449
|
+
toolCalls: toolCalls.map(tc => tc.toolName),
|
|
450
|
+
});
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
|
|
454
|
+
|
|
398
455
|
// Parse JSON response if schema was provided
|
|
399
456
|
let structured: AgentStructuredResponse | undefined;
|
|
400
457
|
if (input.parameters?.jsonSchema) {
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
458
|
+
const parsed = tryParseJSONResponse(message);
|
|
459
|
+
if (parsed) {
|
|
460
|
+
structured = parsed as AgentStructuredResponse;
|
|
461
|
+
} else {
|
|
462
|
+
logger.warn("[GeminiProvider] Failed to parse JSON response, treating as plain text");
|
|
406
463
|
}
|
|
407
464
|
}
|
|
408
465
|
|
|
409
466
|
// If tools were used, include them in structured response
|
|
410
467
|
if (toolCalls.length > 0) {
|
|
411
468
|
structured = {
|
|
412
|
-
message,
|
|
469
|
+
message: structured?.message || message,
|
|
413
470
|
toolCalls,
|
|
414
471
|
...structured,
|
|
415
472
|
} as AgentStructuredResponse;
|
|
@@ -446,7 +503,7 @@ export class GeminiProvider implements AiProvider {
|
|
|
446
503
|
yield* this.generateStreamWithModel(this.primaryModel, input);
|
|
447
504
|
} catch (primaryError: unknown) {
|
|
448
505
|
const primaryErrMsg = getErrorMessage(primaryError);
|
|
449
|
-
|
|
506
|
+
logger.warn(
|
|
450
507
|
`[GEMINI] Primary model ${this.primaryModel} failed: ${primaryErrMsg}`
|
|
451
508
|
);
|
|
452
509
|
|
|
@@ -454,25 +511,24 @@ export class GeminiProvider implements AiProvider {
|
|
|
454
511
|
throw primaryError;
|
|
455
512
|
}
|
|
456
513
|
|
|
457
|
-
|
|
514
|
+
logger.debug(`[GEMINI] Trying backup models for streaming`);
|
|
458
515
|
|
|
459
516
|
let lastBackupError: unknown = primaryError;
|
|
460
517
|
|
|
461
518
|
for (let i = 0; i < this.backupModels.length; i++) {
|
|
462
519
|
const backupModel = this.backupModels[i];
|
|
463
|
-
|
|
464
|
-
`[GEMINI] Trying backup model ${i + 1}/${
|
|
465
|
-
this.backupModels.length
|
|
520
|
+
logger.debug(
|
|
521
|
+
`[GEMINI] Trying backup model ${i + 1}/${this.backupModels.length
|
|
466
522
|
}: ${backupModel}`
|
|
467
523
|
);
|
|
468
524
|
|
|
469
525
|
try {
|
|
470
526
|
yield* this.generateStreamWithModel(backupModel, input);
|
|
471
|
-
|
|
527
|
+
logger.debug(`[GEMINI] Backup model ${backupModel} succeeded`);
|
|
472
528
|
return;
|
|
473
529
|
} catch (backupError: unknown) {
|
|
474
530
|
const backupErrMsg = getErrorMessage(backupError);
|
|
475
|
-
|
|
531
|
+
logger.warn(
|
|
476
532
|
`[GEMINI] Backup model ${backupModel} failed: ${backupErrMsg}`
|
|
477
533
|
);
|
|
478
534
|
lastBackupError = backupError;
|
|
@@ -481,7 +537,7 @@ export class GeminiProvider implements AiProvider {
|
|
|
481
537
|
!shouldUseBackupModel(backupError) &&
|
|
482
538
|
i < this.backupModels.length - 1
|
|
483
539
|
) {
|
|
484
|
-
|
|
540
|
+
logger.debug(
|
|
485
541
|
`[GEMINI] Backup model error doesn't qualify for further attempts`
|
|
486
542
|
);
|
|
487
543
|
break;
|
|
@@ -490,7 +546,7 @@ export class GeminiProvider implements AiProvider {
|
|
|
490
546
|
}
|
|
491
547
|
|
|
492
548
|
const lastBackupErrMsg = getErrorMessage(lastBackupError);
|
|
493
|
-
|
|
549
|
+
logger.error(
|
|
494
550
|
`[GEMINI] All models failed. Primary: ${primaryErrMsg}, Last backup: ${lastBackupErrMsg}`
|
|
495
551
|
);
|
|
496
552
|
throw lastBackupError;
|
|
@@ -507,32 +563,47 @@ export class GeminiProvider implements AiProvider {
|
|
|
507
563
|
// Streaming: request JSON if schema provided
|
|
508
564
|
const configOverride: Partial<GenerateContentConfig> = { ...this.config };
|
|
509
565
|
|
|
510
|
-
//
|
|
511
|
-
|
|
566
|
+
// Handle tools and JSON schema - Gemini doesn't support both simultaneously
|
|
567
|
+
const hasTools = input.tools && input.tools.length > 0;
|
|
568
|
+
const hasJsonSchema = input.parameters?.jsonSchema;
|
|
569
|
+
|
|
570
|
+
if (hasTools && hasJsonSchema) {
|
|
571
|
+
logger.debug(`[GeminiProvider] Both tools and JSON schema provided. Prioritizing function calling - JSON schema will be ignored.`);
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
if (hasTools) {
|
|
575
|
+
const toolNames = input.tools?.map((tool) => tool.name || tool.id) || [];
|
|
576
|
+
logger.debug(`[GeminiProvider] Configuring ${toolNames.length} tools for streaming:`, toolNames);
|
|
512
577
|
configOverride.tools = [
|
|
513
578
|
{
|
|
514
|
-
functionDeclarations: input.tools
|
|
579
|
+
functionDeclarations: input.tools?.map((tool) => ({
|
|
515
580
|
name: tool.name || tool.id,
|
|
516
581
|
description: tool.description || "",
|
|
517
582
|
parameters: tool.parameters as FunctionDeclaration["parameters"],
|
|
518
583
|
})),
|
|
519
584
|
},
|
|
520
585
|
];
|
|
521
|
-
}
|
|
522
586
|
|
|
523
|
-
if (
|
|
587
|
+
} else if (hasJsonSchema) {
|
|
588
|
+
// Only set JSON schema if no tools are present
|
|
524
589
|
configOverride.responseMimeType = "application/json";
|
|
525
590
|
// Adapt common schema format to Gemini's specific requirements
|
|
526
|
-
configOverride.responseSchema = this.adaptSchemaForGemini(
|
|
591
|
+
configOverride.responseSchema = input.parameters ? this.adaptSchemaForGemini(
|
|
527
592
|
input.parameters.jsonSchema
|
|
528
|
-
);
|
|
593
|
+
) : {};
|
|
529
594
|
}
|
|
530
595
|
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
596
|
+
let stream;
|
|
597
|
+
try {
|
|
598
|
+
stream = await this.genAI.models.generateContentStream({
|
|
599
|
+
model,
|
|
600
|
+
contents: input.prompt,
|
|
601
|
+
config: configOverride,
|
|
602
|
+
});
|
|
603
|
+
} catch (error: unknown) {
|
|
604
|
+
logger.error(`[GeminiProvider] Streaming API call failed:`, error);
|
|
605
|
+
throw error;
|
|
606
|
+
}
|
|
536
607
|
|
|
537
608
|
let accumulated = "";
|
|
538
609
|
let promptTokenCount = 0;
|
|
@@ -578,20 +649,18 @@ export class GeminiProvider implements AiProvider {
|
|
|
578
649
|
// Parse JSON response if schema was provided
|
|
579
650
|
let structured: AgentStructuredResponse | undefined;
|
|
580
651
|
if (input.parameters?.jsonSchema && accumulated) {
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
error
|
|
587
|
-
);
|
|
652
|
+
const parsed = tryParseJSONResponse(accumulated);
|
|
653
|
+
if (parsed) {
|
|
654
|
+
structured = parsed as AgentStructuredResponse;
|
|
655
|
+
} else {
|
|
656
|
+
logger.warn("[GeminiProvider] Failed to parse JSON response in stream, treating as plain text");
|
|
588
657
|
}
|
|
589
658
|
}
|
|
590
659
|
|
|
591
660
|
// If tools were used, include them in structured response
|
|
592
661
|
if (toolCalls.length > 0) {
|
|
593
662
|
structured = {
|
|
594
|
-
message: accumulated,
|
|
663
|
+
message: structured?.message || accumulated,
|
|
595
664
|
toolCalls,
|
|
596
665
|
...structured,
|
|
597
666
|
} as AgentStructuredResponse;
|
|
@@ -13,7 +13,7 @@ import type {
|
|
|
13
13
|
AgentStructuredResponse,
|
|
14
14
|
StructuredSchema,
|
|
15
15
|
} from "../types";
|
|
16
|
-
import { withTimeoutAndRetry } from "../utils
|
|
16
|
+
import { withTimeoutAndRetry, logger } from "../utils";
|
|
17
17
|
import { FunctionParameters } from "openai/resources/shared.mjs";
|
|
18
18
|
|
|
19
19
|
const DEFAULT_RETRY_CONFIG = {
|
|
@@ -207,7 +207,7 @@ export class OpenAIProvider implements AiProvider {
|
|
|
207
207
|
);
|
|
208
208
|
} catch (primaryError: unknown) {
|
|
209
209
|
const primaryErrMsg = getErrorMessage(primaryError);
|
|
210
|
-
|
|
210
|
+
logger.warn(
|
|
211
211
|
`[OPENAI] Primary model ${this.primaryModel} failed: ${primaryErrMsg}`
|
|
212
212
|
);
|
|
213
213
|
|
|
@@ -215,13 +215,13 @@ export class OpenAIProvider implements AiProvider {
|
|
|
215
215
|
throw primaryError;
|
|
216
216
|
}
|
|
217
217
|
|
|
218
|
-
|
|
218
|
+
logger.debug(`[OPENAI] Trying backup models`);
|
|
219
219
|
|
|
220
220
|
let lastBackupError: unknown = primaryError;
|
|
221
221
|
|
|
222
222
|
for (let i = 0; i < this.backupModels.length; i++) {
|
|
223
223
|
const backupModel = this.backupModels[i];
|
|
224
|
-
|
|
224
|
+
logger.debug(
|
|
225
225
|
`[OPENAI] Trying backup model ${i + 1}/${
|
|
226
226
|
this.backupModels.length
|
|
227
227
|
}: ${backupModel}`
|
|
@@ -229,11 +229,11 @@ export class OpenAIProvider implements AiProvider {
|
|
|
229
229
|
|
|
230
230
|
try {
|
|
231
231
|
const result = await this.generateWithModel(backupModel, input);
|
|
232
|
-
|
|
232
|
+
logger.debug(`[OPENAI] Backup model ${backupModel} succeeded`);
|
|
233
233
|
return result as GenerateMessageOutput<TStructured>;
|
|
234
234
|
} catch (backupError: unknown) {
|
|
235
235
|
const backupErrMsg = getErrorMessage(backupError);
|
|
236
|
-
|
|
236
|
+
logger.warn(
|
|
237
237
|
`[OPENAI] Backup model ${backupModel} failed: ${backupErrMsg}`
|
|
238
238
|
);
|
|
239
239
|
lastBackupError = backupError;
|
|
@@ -242,7 +242,7 @@ export class OpenAIProvider implements AiProvider {
|
|
|
242
242
|
!shouldUseBackupModel(backupError) &&
|
|
243
243
|
i < this.backupModels.length - 1
|
|
244
244
|
) {
|
|
245
|
-
|
|
245
|
+
logger.debug(
|
|
246
246
|
`[OPENAI] Backup model error doesn't qualify for further attempts`
|
|
247
247
|
);
|
|
248
248
|
break;
|
|
@@ -251,7 +251,7 @@ export class OpenAIProvider implements AiProvider {
|
|
|
251
251
|
}
|
|
252
252
|
|
|
253
253
|
const lastBackupErrMsg = getErrorMessage(lastBackupError);
|
|
254
|
-
|
|
254
|
+
logger.error(
|
|
255
255
|
`[OPENAI] All models failed. Primary: ${primaryErrMsg}, Last backup: ${lastBackupErrMsg}`
|
|
256
256
|
);
|
|
257
257
|
throw lastBackupError;
|
|
@@ -355,7 +355,7 @@ export class OpenAIProvider implements AiProvider {
|
|
|
355
355
|
toolCall.function.arguments
|
|
356
356
|
) as Record<string, unknown>;
|
|
357
357
|
} catch (error) {
|
|
358
|
-
|
|
358
|
+
logger.warn(
|
|
359
359
|
`[OPENAI] Failed to parse tool call arguments: ${getErrorMessage(
|
|
360
360
|
error
|
|
361
361
|
)}`
|
|
@@ -408,7 +408,7 @@ export class OpenAIProvider implements AiProvider {
|
|
|
408
408
|
);
|
|
409
409
|
} catch (primaryError: unknown) {
|
|
410
410
|
const primaryErrMsg = getErrorMessage(primaryError);
|
|
411
|
-
|
|
411
|
+
logger.warn(
|
|
412
412
|
`[OPENAI] Primary model ${this.primaryModel} failed: ${primaryErrMsg}`
|
|
413
413
|
);
|
|
414
414
|
|
|
@@ -416,13 +416,13 @@ export class OpenAIProvider implements AiProvider {
|
|
|
416
416
|
throw primaryError;
|
|
417
417
|
}
|
|
418
418
|
|
|
419
|
-
|
|
419
|
+
logger.debug(`[OPENAI] Trying backup models for streaming`);
|
|
420
420
|
|
|
421
421
|
let lastBackupError: unknown = primaryError;
|
|
422
422
|
|
|
423
423
|
for (let i = 0; i < this.backupModels.length; i++) {
|
|
424
424
|
const backupModel = this.backupModels[i];
|
|
425
|
-
|
|
425
|
+
logger.debug(
|
|
426
426
|
`[OPENAI] Trying backup model ${i + 1}/${
|
|
427
427
|
this.backupModels.length
|
|
428
428
|
}: ${backupModel}`
|
|
@@ -433,11 +433,11 @@ export class OpenAIProvider implements AiProvider {
|
|
|
433
433
|
backupModel,
|
|
434
434
|
input
|
|
435
435
|
);
|
|
436
|
-
|
|
436
|
+
logger.debug(`[OPENAI] Backup model ${backupModel} succeeded`);
|
|
437
437
|
return;
|
|
438
438
|
} catch (backupError: unknown) {
|
|
439
439
|
const backupErrMsg = getErrorMessage(backupError);
|
|
440
|
-
|
|
440
|
+
logger.warn(
|
|
441
441
|
`[OPENAI] Backup model ${backupModel} failed: ${backupErrMsg}`
|
|
442
442
|
);
|
|
443
443
|
lastBackupError = backupError;
|
|
@@ -446,7 +446,7 @@ export class OpenAIProvider implements AiProvider {
|
|
|
446
446
|
!shouldUseBackupModel(backupError) &&
|
|
447
447
|
i < this.backupModels.length - 1
|
|
448
448
|
) {
|
|
449
|
-
|
|
449
|
+
logger.debug(
|
|
450
450
|
`[OPENAI] Backup model error doesn't qualify for further attempts`
|
|
451
451
|
);
|
|
452
452
|
break;
|
|
@@ -455,7 +455,7 @@ export class OpenAIProvider implements AiProvider {
|
|
|
455
455
|
}
|
|
456
456
|
|
|
457
457
|
const lastBackupErrMsg = getErrorMessage(lastBackupError);
|
|
458
|
-
|
|
458
|
+
logger.error(
|
|
459
459
|
`[OPENAI] All models failed. Primary: ${primaryErrMsg}, Last backup: ${lastBackupErrMsg}`
|
|
460
460
|
);
|
|
461
461
|
throw lastBackupError;
|
|
@@ -535,7 +535,7 @@ export class OpenAIProvider implements AiProvider {
|
|
|
535
535
|
>)
|
|
536
536
|
: {};
|
|
537
537
|
} catch (error) {
|
|
538
|
-
|
|
538
|
+
logger.warn(
|
|
539
539
|
`[OPENAI] Failed to parse tool call arguments in stream: ${getErrorMessage(
|
|
540
540
|
error
|
|
541
541
|
)}`
|
|
@@ -577,7 +577,7 @@ export class OpenAIProvider implements AiProvider {
|
|
|
577
577
|
try {
|
|
578
578
|
structured = JSON.parse(accumulated) as TStructured;
|
|
579
579
|
} catch (error) {
|
|
580
|
-
|
|
580
|
+
logger.warn(
|
|
581
581
|
"[OPENAI] Failed to parse JSON response in stream:",
|
|
582
582
|
error
|
|
583
583
|
);
|
|
@@ -15,7 +15,7 @@ import type {
|
|
|
15
15
|
GenerateMessageStreamChunk,
|
|
16
16
|
StructuredSchema,
|
|
17
17
|
} from "../types";
|
|
18
|
-
import { withTimeoutAndRetry } from "../utils
|
|
18
|
+
import { withTimeoutAndRetry, logger } from "../utils";
|
|
19
19
|
|
|
20
20
|
const DEFAULT_RETRY_CONFIG = {
|
|
21
21
|
timeout: 60000,
|
|
@@ -214,7 +214,7 @@ export class OpenRouterProvider implements AiProvider {
|
|
|
214
214
|
return await this.generateWithModel(this.primaryModel, input);
|
|
215
215
|
} catch (primaryError: unknown) {
|
|
216
216
|
const primaryErrMsg = getErrorMessage(primaryError);
|
|
217
|
-
|
|
217
|
+
logger.warn(
|
|
218
218
|
`[OPENROUTER] Primary model ${this.primaryModel} failed: ${primaryErrMsg}`
|
|
219
219
|
);
|
|
220
220
|
|
|
@@ -222,13 +222,13 @@ export class OpenRouterProvider implements AiProvider {
|
|
|
222
222
|
throw primaryError;
|
|
223
223
|
}
|
|
224
224
|
|
|
225
|
-
|
|
225
|
+
logger.debug(`[OPENROUTER] Trying backup models`);
|
|
226
226
|
|
|
227
227
|
let lastBackupError: unknown = primaryError;
|
|
228
228
|
|
|
229
229
|
for (let i = 0; i < this.backupModels.length; i++) {
|
|
230
230
|
const backupModel = this.backupModels[i];
|
|
231
|
-
|
|
231
|
+
logger.debug(
|
|
232
232
|
`[OPENROUTER] Trying backup model ${i + 1}/${
|
|
233
233
|
this.backupModels.length
|
|
234
234
|
}: ${backupModel}`
|
|
@@ -236,11 +236,11 @@ export class OpenRouterProvider implements AiProvider {
|
|
|
236
236
|
|
|
237
237
|
try {
|
|
238
238
|
const result = await this.generateWithModel(backupModel, input);
|
|
239
|
-
|
|
239
|
+
logger.debug(`[OPENROUTER] Backup model ${backupModel} succeeded`);
|
|
240
240
|
return result as GenerateMessageOutput<TStructured>;
|
|
241
241
|
} catch (backupError: unknown) {
|
|
242
242
|
const backupErrMsg = getErrorMessage(backupError);
|
|
243
|
-
|
|
243
|
+
logger.warn(
|
|
244
244
|
`[OPENROUTER] Backup model ${backupModel} failed: ${backupErrMsg}`
|
|
245
245
|
);
|
|
246
246
|
lastBackupError = backupError;
|
|
@@ -249,7 +249,7 @@ export class OpenRouterProvider implements AiProvider {
|
|
|
249
249
|
!shouldUseBackupModel(backupError) &&
|
|
250
250
|
i < this.backupModels.length - 1
|
|
251
251
|
) {
|
|
252
|
-
|
|
252
|
+
logger.debug(
|
|
253
253
|
`[OPENROUTER] Backup model error doesn't qualify for further attempts`
|
|
254
254
|
);
|
|
255
255
|
break;
|
|
@@ -258,7 +258,7 @@ export class OpenRouterProvider implements AiProvider {
|
|
|
258
258
|
}
|
|
259
259
|
|
|
260
260
|
const lastBackupErrMsg = getErrorMessage(lastBackupError);
|
|
261
|
-
|
|
261
|
+
logger.error(
|
|
262
262
|
`[OPENROUTER] All models failed. Primary: ${primaryErrMsg}, Last backup: ${lastBackupErrMsg}`
|
|
263
263
|
);
|
|
264
264
|
throw lastBackupError;
|
|
@@ -364,7 +364,7 @@ export class OpenRouterProvider implements AiProvider {
|
|
|
364
364
|
toolCall.function.arguments
|
|
365
365
|
) as Record<string, unknown>;
|
|
366
366
|
} catch (error) {
|
|
367
|
-
|
|
367
|
+
logger.warn(
|
|
368
368
|
`[OPENROUTER] Failed to parse tool call arguments: ${getErrorMessage(
|
|
369
369
|
error
|
|
370
370
|
)}`
|
|
@@ -413,7 +413,7 @@ export class OpenRouterProvider implements AiProvider {
|
|
|
413
413
|
yield* this.generateStreamWithModel(this.primaryModel, input);
|
|
414
414
|
} catch (primaryError: unknown) {
|
|
415
415
|
const primaryErrMsg = getErrorMessage(primaryError);
|
|
416
|
-
|
|
416
|
+
logger.warn(
|
|
417
417
|
`[OPENROUTER] Primary model ${this.primaryModel} failed: ${primaryErrMsg}`
|
|
418
418
|
);
|
|
419
419
|
|
|
@@ -421,13 +421,13 @@ export class OpenRouterProvider implements AiProvider {
|
|
|
421
421
|
throw primaryError;
|
|
422
422
|
}
|
|
423
423
|
|
|
424
|
-
|
|
424
|
+
logger.debug(`[OPENROUTER] Trying backup models for streaming`);
|
|
425
425
|
|
|
426
426
|
let lastBackupError: unknown = primaryError;
|
|
427
427
|
|
|
428
428
|
for (let i = 0; i < this.backupModels.length; i++) {
|
|
429
429
|
const backupModel = this.backupModels[i];
|
|
430
|
-
|
|
430
|
+
logger.debug(
|
|
431
431
|
`[OPENROUTER] Trying backup model ${i + 1}/${
|
|
432
432
|
this.backupModels.length
|
|
433
433
|
}: ${backupModel}`
|
|
@@ -435,11 +435,11 @@ export class OpenRouterProvider implements AiProvider {
|
|
|
435
435
|
|
|
436
436
|
try {
|
|
437
437
|
yield* this.generateStreamWithModel(backupModel, input);
|
|
438
|
-
|
|
438
|
+
logger.debug(`[OPENROUTER] Backup model ${backupModel} succeeded`);
|
|
439
439
|
return;
|
|
440
440
|
} catch (backupError: unknown) {
|
|
441
441
|
const backupErrMsg = getErrorMessage(backupError);
|
|
442
|
-
|
|
442
|
+
logger.warn(
|
|
443
443
|
`[OPENROUTER] Backup model ${backupModel} failed: ${backupErrMsg}`
|
|
444
444
|
);
|
|
445
445
|
lastBackupError = backupError;
|
|
@@ -448,7 +448,7 @@ export class OpenRouterProvider implements AiProvider {
|
|
|
448
448
|
!shouldUseBackupModel(backupError) &&
|
|
449
449
|
i < this.backupModels.length - 1
|
|
450
450
|
) {
|
|
451
|
-
|
|
451
|
+
logger.debug(
|
|
452
452
|
`[OPENROUTER] Backup model error doesn't qualify for further attempts`
|
|
453
453
|
);
|
|
454
454
|
break;
|
|
@@ -457,7 +457,7 @@ export class OpenRouterProvider implements AiProvider {
|
|
|
457
457
|
}
|
|
458
458
|
|
|
459
459
|
const lastBackupErrMsg = getErrorMessage(lastBackupError);
|
|
460
|
-
|
|
460
|
+
logger.error(
|
|
461
461
|
`[OPENROUTER] All models failed. Primary: ${primaryErrMsg}, Last backup: ${lastBackupErrMsg}`
|
|
462
462
|
);
|
|
463
463
|
throw lastBackupError;
|
|
@@ -537,7 +537,7 @@ export class OpenRouterProvider implements AiProvider {
|
|
|
537
537
|
>)
|
|
538
538
|
: {};
|
|
539
539
|
} catch (error) {
|
|
540
|
-
|
|
540
|
+
logger.warn(
|
|
541
541
|
`[OPENROUTER] Failed to parse tool call arguments in stream: ${getErrorMessage(
|
|
542
542
|
error
|
|
543
543
|
)}`
|
|
@@ -579,7 +579,7 @@ export class OpenRouterProvider implements AiProvider {
|
|
|
579
579
|
try {
|
|
580
580
|
structured = JSON.parse(accumulated) as TStructured;
|
|
581
581
|
} catch (error) {
|
|
582
|
-
|
|
582
|
+
logger.warn(
|
|
583
583
|
"[OPENROUTER] Failed to parse JSON response in stream:",
|
|
584
584
|
error
|
|
585
585
|
);
|