@falai/agent 2.2.4 → 2.4.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 +2 -2
- package/dist/adapters/MemoryAdapter.d.ts.map +1 -1
- package/dist/adapters/MemoryAdapter.js +10 -1
- package/dist/adapters/MemoryAdapter.js.map +1 -1
- package/dist/adapters/MongoAdapter.d.ts.map +1 -1
- package/dist/adapters/MongoAdapter.js +33 -2
- package/dist/adapters/MongoAdapter.js.map +1 -1
- package/dist/adapters/OpenSearchAdapter.d.ts.map +1 -1
- package/dist/adapters/OpenSearchAdapter.js +15 -1
- package/dist/adapters/OpenSearchAdapter.js.map +1 -1
- package/dist/adapters/PostgreSQLAdapter.d.ts.map +1 -1
- package/dist/adapters/PostgreSQLAdapter.js +35 -5
- package/dist/adapters/PostgreSQLAdapter.js.map +1 -1
- package/dist/adapters/PrismaAdapter.d.ts.map +1 -1
- package/dist/adapters/PrismaAdapter.js +58 -15
- package/dist/adapters/PrismaAdapter.js.map +1 -1
- package/dist/adapters/RedisAdapter.d.ts.map +1 -1
- package/dist/adapters/RedisAdapter.js +10 -1
- package/dist/adapters/RedisAdapter.js.map +1 -1
- package/dist/adapters/SQLiteAdapter.d.ts.map +1 -1
- package/dist/adapters/SQLiteAdapter.js +38 -6
- package/dist/adapters/SQLiteAdapter.js.map +1 -1
- package/dist/cjs/adapters/MemoryAdapter.d.ts.map +1 -1
- package/dist/cjs/adapters/MemoryAdapter.js +10 -1
- package/dist/cjs/adapters/MemoryAdapter.js.map +1 -1
- package/dist/cjs/adapters/MongoAdapter.d.ts.map +1 -1
- package/dist/cjs/adapters/MongoAdapter.js +33 -2
- package/dist/cjs/adapters/MongoAdapter.js.map +1 -1
- package/dist/cjs/adapters/OpenSearchAdapter.d.ts.map +1 -1
- package/dist/cjs/adapters/OpenSearchAdapter.js +15 -1
- package/dist/cjs/adapters/OpenSearchAdapter.js.map +1 -1
- package/dist/cjs/adapters/PostgreSQLAdapter.d.ts.map +1 -1
- package/dist/cjs/adapters/PostgreSQLAdapter.js +35 -5
- package/dist/cjs/adapters/PostgreSQLAdapter.js.map +1 -1
- package/dist/cjs/adapters/PrismaAdapter.d.ts.map +1 -1
- package/dist/cjs/adapters/PrismaAdapter.js +58 -15
- package/dist/cjs/adapters/PrismaAdapter.js.map +1 -1
- package/dist/cjs/adapters/RedisAdapter.d.ts.map +1 -1
- package/dist/cjs/adapters/RedisAdapter.js +10 -1
- package/dist/cjs/adapters/RedisAdapter.js.map +1 -1
- package/dist/cjs/adapters/SQLiteAdapter.d.ts.map +1 -1
- package/dist/cjs/adapters/SQLiteAdapter.js +38 -6
- package/dist/cjs/adapters/SQLiteAdapter.js.map +1 -1
- package/dist/cjs/core/Agent.d.ts +28 -18
- package/dist/cjs/core/Agent.d.ts.map +1 -1
- package/dist/cjs/core/Agent.js +58 -68
- package/dist/cjs/core/Agent.js.map +1 -1
- package/dist/cjs/core/AutoChainExecutor.d.ts.map +1 -1
- package/dist/cjs/core/AutoChainExecutor.js +14 -20
- package/dist/cjs/core/AutoChainExecutor.js.map +1 -1
- package/dist/cjs/core/BranchEvaluator.d.ts +4 -3
- package/dist/cjs/core/BranchEvaluator.d.ts.map +1 -1
- package/dist/cjs/core/BranchEvaluator.js +18 -23
- package/dist/cjs/core/BranchEvaluator.js.map +1 -1
- package/dist/cjs/core/Flow.d.ts +2 -1
- package/dist/cjs/core/Flow.d.ts.map +1 -1
- package/dist/cjs/core/Flow.js +10 -3
- package/dist/cjs/core/Flow.js.map +1 -1
- package/dist/cjs/core/FlowRouter.d.ts +1 -0
- package/dist/cjs/core/FlowRouter.d.ts.map +1 -1
- package/dist/cjs/core/FlowRouter.js +28 -5
- package/dist/cjs/core/FlowRouter.js.map +1 -1
- package/dist/cjs/core/PersistenceManager.d.ts +3 -0
- package/dist/cjs/core/PersistenceManager.d.ts.map +1 -1
- package/dist/cjs/core/PersistenceManager.js +57 -5
- package/dist/cjs/core/PersistenceManager.js.map +1 -1
- package/dist/cjs/core/PromptComposer.d.ts.map +1 -1
- package/dist/cjs/core/PromptComposer.js +24 -10
- package/dist/cjs/core/PromptComposer.js.map +1 -1
- package/dist/cjs/core/ResponseGenerationError.d.ts +30 -0
- package/dist/cjs/core/ResponseGenerationError.d.ts.map +1 -0
- package/dist/cjs/core/ResponseGenerationError.js +37 -0
- package/dist/cjs/core/ResponseGenerationError.js.map +1 -0
- package/dist/cjs/core/ResponseModal.d.ts +43 -102
- package/dist/cjs/core/ResponseModal.d.ts.map +1 -1
- package/dist/cjs/core/ResponseModal.js +178 -1194
- package/dist/cjs/core/ResponseModal.js.map +1 -1
- package/dist/cjs/core/ResponsePipeline.d.ts +58 -152
- package/dist/cjs/core/ResponsePipeline.d.ts.map +1 -1
- package/dist/cjs/core/ResponsePipeline.js +408 -457
- package/dist/cjs/core/ResponsePipeline.js.map +1 -1
- package/dist/cjs/core/SessionFinalizer.d.ts +34 -0
- package/dist/cjs/core/SessionFinalizer.d.ts.map +1 -0
- package/dist/cjs/core/SessionFinalizer.js +61 -0
- package/dist/cjs/core/SessionFinalizer.js.map +1 -0
- package/dist/cjs/core/SessionManager.d.ts +1 -1
- package/dist/cjs/core/SessionManager.d.ts.map +1 -1
- package/dist/cjs/core/SessionManager.js +18 -7
- package/dist/cjs/core/SessionManager.js.map +1 -1
- package/dist/cjs/core/SignalCoordinator.d.ts +103 -0
- package/dist/cjs/core/SignalCoordinator.d.ts.map +1 -0
- package/dist/cjs/core/SignalCoordinator.js +207 -0
- package/dist/cjs/core/SignalCoordinator.js.map +1 -0
- package/dist/cjs/core/SignalEvaluator.d.ts +2 -2
- package/dist/cjs/core/SignalEvaluator.d.ts.map +1 -1
- package/dist/cjs/core/SignalEvaluator.js +11 -26
- package/dist/cjs/core/SignalEvaluator.js.map +1 -1
- package/dist/cjs/core/Step.d.ts +3 -1
- package/dist/cjs/core/Step.d.ts.map +1 -1
- package/dist/cjs/core/Step.js +10 -3
- package/dist/cjs/core/Step.js.map +1 -1
- package/dist/cjs/core/StepLifecycle.d.ts +33 -0
- package/dist/cjs/core/StepLifecycle.d.ts.map +1 -0
- package/dist/cjs/core/StepLifecycle.js +97 -0
- package/dist/cjs/core/StepLifecycle.js.map +1 -0
- package/dist/cjs/core/ToolLoopExecutor.d.ts +104 -0
- package/dist/cjs/core/ToolLoopExecutor.d.ts.map +1 -0
- package/dist/cjs/core/ToolLoopExecutor.js +391 -0
- package/dist/cjs/core/ToolLoopExecutor.js.map +1 -0
- package/dist/cjs/core/ToolManager.d.ts +1 -1
- package/dist/cjs/core/ToolManager.d.ts.map +1 -1
- package/dist/cjs/core/ToolManager.js.map +1 -1
- package/dist/cjs/index.d.ts +4 -5
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +7 -6
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/providers/AnthropicProvider.d.ts +2 -0
- package/dist/cjs/providers/AnthropicProvider.d.ts.map +1 -1
- package/dist/cjs/providers/AnthropicProvider.js +28 -56
- package/dist/cjs/providers/AnthropicProvider.js.map +1 -1
- package/dist/cjs/providers/DeepSeekProvider.d.ts +25 -21
- package/dist/cjs/providers/DeepSeekProvider.d.ts.map +1 -1
- package/dist/cjs/providers/DeepSeekProvider.js +48 -407
- package/dist/cjs/providers/DeepSeekProvider.js.map +1 -1
- package/dist/cjs/providers/GeminiProvider.d.ts +2 -0
- package/dist/cjs/providers/GeminiProvider.d.ts.map +1 -1
- package/dist/cjs/providers/GeminiProvider.js +27 -56
- package/dist/cjs/providers/GeminiProvider.js.map +1 -1
- package/dist/cjs/providers/OpenAICompatibleProvider.d.ts +129 -0
- package/dist/cjs/providers/OpenAICompatibleProvider.d.ts.map +1 -0
- package/dist/cjs/providers/OpenAICompatibleProvider.js +485 -0
- package/dist/cjs/providers/OpenAICompatibleProvider.js.map +1 -0
- package/dist/cjs/providers/OpenAIProvider.d.ts +9 -28
- package/dist/cjs/providers/OpenAIProvider.d.ts.map +1 -1
- package/dist/cjs/providers/OpenAIProvider.js +23 -417
- package/dist/cjs/providers/OpenAIProvider.js.map +1 -1
- package/dist/cjs/providers/OpenRouterProvider.d.ts +10 -27
- package/dist/cjs/providers/OpenRouterProvider.d.ts.map +1 -1
- package/dist/cjs/providers/OpenRouterProvider.js +28 -417
- package/dist/cjs/providers/OpenRouterProvider.js.map +1 -1
- package/dist/cjs/providers/errorClassification.d.ts +61 -0
- package/dist/cjs/providers/errorClassification.d.ts.map +1 -0
- package/dist/cjs/providers/errorClassification.js +123 -0
- package/dist/cjs/providers/errorClassification.js.map +1 -0
- package/dist/cjs/providers/index.d.ts +4 -0
- package/dist/cjs/providers/index.d.ts.map +1 -1
- package/dist/cjs/providers/index.js +7 -1
- package/dist/cjs/providers/index.js.map +1 -1
- package/dist/cjs/types/agent.d.ts +2 -1
- package/dist/cjs/types/agent.d.ts.map +1 -1
- package/dist/cjs/types/ai.d.ts +20 -0
- package/dist/cjs/types/ai.d.ts.map +1 -1
- package/dist/cjs/types/errors.d.ts +33 -0
- package/dist/cjs/types/errors.d.ts.map +1 -1
- package/dist/cjs/types/errors.js +37 -1
- package/dist/cjs/types/errors.js.map +1 -1
- package/dist/cjs/types/flow.d.ts +10 -5
- package/dist/cjs/types/flow.d.ts.map +1 -1
- package/dist/cjs/types/history.d.ts +1 -1
- package/dist/cjs/types/history.d.ts.map +1 -1
- package/dist/cjs/types/index.d.ts +5 -4
- package/dist/cjs/types/index.d.ts.map +1 -1
- package/dist/cjs/types/index.js +3 -1
- package/dist/cjs/types/index.js.map +1 -1
- package/dist/cjs/types/persistence.d.ts +43 -2
- package/dist/cjs/types/persistence.d.ts.map +1 -1
- package/dist/cjs/types/session.d.ts +8 -0
- package/dist/cjs/types/session.d.ts.map +1 -1
- package/dist/cjs/types/signals.d.ts +12 -2
- package/dist/cjs/types/signals.d.ts.map +1 -1
- package/dist/cjs/types/template.d.ts +3 -1
- package/dist/cjs/types/template.d.ts.map +1 -1
- package/dist/cjs/types/tool.d.ts +4 -4
- package/dist/cjs/types/tool.d.ts.map +1 -1
- package/dist/cjs/utils/condition.d.ts +19 -0
- package/dist/cjs/utils/condition.d.ts.map +1 -1
- package/dist/cjs/utils/condition.js +86 -15
- package/dist/cjs/utils/condition.js.map +1 -1
- package/dist/cjs/utils/session.d.ts +1 -0
- package/dist/cjs/utils/session.d.ts.map +1 -1
- package/dist/cjs/utils/session.js +1 -0
- package/dist/cjs/utils/session.js.map +1 -1
- package/dist/core/Agent.d.ts +28 -18
- package/dist/core/Agent.d.ts.map +1 -1
- package/dist/core/Agent.js +58 -68
- package/dist/core/Agent.js.map +1 -1
- package/dist/core/AutoChainExecutor.d.ts.map +1 -1
- package/dist/core/AutoChainExecutor.js +14 -20
- package/dist/core/AutoChainExecutor.js.map +1 -1
- package/dist/core/BranchEvaluator.d.ts +4 -3
- package/dist/core/BranchEvaluator.d.ts.map +1 -1
- package/dist/core/BranchEvaluator.js +18 -23
- package/dist/core/BranchEvaluator.js.map +1 -1
- package/dist/core/Flow.d.ts +2 -1
- package/dist/core/Flow.d.ts.map +1 -1
- package/dist/core/Flow.js +10 -3
- package/dist/core/Flow.js.map +1 -1
- package/dist/core/FlowRouter.d.ts +1 -0
- package/dist/core/FlowRouter.d.ts.map +1 -1
- package/dist/core/FlowRouter.js +28 -5
- package/dist/core/FlowRouter.js.map +1 -1
- package/dist/core/PersistenceManager.d.ts +3 -0
- package/dist/core/PersistenceManager.d.ts.map +1 -1
- package/dist/core/PersistenceManager.js +58 -6
- package/dist/core/PersistenceManager.js.map +1 -1
- package/dist/core/PromptComposer.d.ts.map +1 -1
- package/dist/core/PromptComposer.js +24 -10
- package/dist/core/PromptComposer.js.map +1 -1
- package/dist/core/ResponseGenerationError.d.ts +30 -0
- package/dist/core/ResponseGenerationError.d.ts.map +1 -0
- package/dist/core/ResponseGenerationError.js +33 -0
- package/dist/core/ResponseGenerationError.js.map +1 -0
- package/dist/core/ResponseModal.d.ts +43 -102
- package/dist/core/ResponseModal.d.ts.map +1 -1
- package/dist/core/ResponseModal.js +171 -1186
- package/dist/core/ResponseModal.js.map +1 -1
- package/dist/core/ResponsePipeline.d.ts +58 -152
- package/dist/core/ResponsePipeline.d.ts.map +1 -1
- package/dist/core/ResponsePipeline.js +409 -458
- package/dist/core/ResponsePipeline.js.map +1 -1
- package/dist/core/SessionFinalizer.d.ts +34 -0
- package/dist/core/SessionFinalizer.d.ts.map +1 -0
- package/dist/core/SessionFinalizer.js +57 -0
- package/dist/core/SessionFinalizer.js.map +1 -0
- package/dist/core/SessionManager.d.ts +1 -1
- package/dist/core/SessionManager.d.ts.map +1 -1
- package/dist/core/SessionManager.js +18 -7
- package/dist/core/SessionManager.js.map +1 -1
- package/dist/core/SignalCoordinator.d.ts +103 -0
- package/dist/core/SignalCoordinator.d.ts.map +1 -0
- package/dist/core/SignalCoordinator.js +203 -0
- package/dist/core/SignalCoordinator.js.map +1 -0
- package/dist/core/SignalEvaluator.d.ts +2 -2
- package/dist/core/SignalEvaluator.d.ts.map +1 -1
- package/dist/core/SignalEvaluator.js +11 -26
- package/dist/core/SignalEvaluator.js.map +1 -1
- package/dist/core/Step.d.ts +3 -1
- package/dist/core/Step.d.ts.map +1 -1
- package/dist/core/Step.js +10 -3
- package/dist/core/Step.js.map +1 -1
- package/dist/core/StepLifecycle.d.ts +33 -0
- package/dist/core/StepLifecycle.d.ts.map +1 -0
- package/dist/core/StepLifecycle.js +93 -0
- package/dist/core/StepLifecycle.js.map +1 -0
- package/dist/core/ToolLoopExecutor.d.ts +104 -0
- package/dist/core/ToolLoopExecutor.d.ts.map +1 -0
- package/dist/core/ToolLoopExecutor.js +387 -0
- package/dist/core/ToolLoopExecutor.js.map +1 -0
- package/dist/core/ToolManager.d.ts +1 -1
- package/dist/core/ToolManager.d.ts.map +1 -1
- package/dist/core/ToolManager.js.map +1 -1
- package/dist/index.d.ts +4 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/providers/AnthropicProvider.d.ts +2 -0
- package/dist/providers/AnthropicProvider.d.ts.map +1 -1
- package/dist/providers/AnthropicProvider.js +22 -50
- package/dist/providers/AnthropicProvider.js.map +1 -1
- package/dist/providers/DeepSeekProvider.d.ts +25 -21
- package/dist/providers/DeepSeekProvider.d.ts.map +1 -1
- package/dist/providers/DeepSeekProvider.js +49 -408
- package/dist/providers/DeepSeekProvider.js.map +1 -1
- package/dist/providers/GeminiProvider.d.ts +2 -0
- package/dist/providers/GeminiProvider.d.ts.map +1 -1
- package/dist/providers/GeminiProvider.js +21 -50
- package/dist/providers/GeminiProvider.js.map +1 -1
- package/dist/providers/OpenAICompatibleProvider.d.ts +129 -0
- package/dist/providers/OpenAICompatibleProvider.d.ts.map +1 -0
- package/dist/providers/OpenAICompatibleProvider.js +481 -0
- package/dist/providers/OpenAICompatibleProvider.js.map +1 -0
- package/dist/providers/OpenAIProvider.d.ts +9 -28
- package/dist/providers/OpenAIProvider.d.ts.map +1 -1
- package/dist/providers/OpenAIProvider.js +23 -417
- package/dist/providers/OpenAIProvider.js.map +1 -1
- package/dist/providers/OpenRouterProvider.d.ts +10 -27
- package/dist/providers/OpenRouterProvider.d.ts.map +1 -1
- package/dist/providers/OpenRouterProvider.js +28 -417
- package/dist/providers/OpenRouterProvider.js.map +1 -1
- package/dist/providers/errorClassification.d.ts +61 -0
- package/dist/providers/errorClassification.d.ts.map +1 -0
- package/dist/providers/errorClassification.js +116 -0
- package/dist/providers/errorClassification.js.map +1 -0
- package/dist/providers/index.d.ts +4 -0
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +2 -0
- package/dist/providers/index.js.map +1 -1
- package/dist/types/agent.d.ts +2 -1
- package/dist/types/agent.d.ts.map +1 -1
- package/dist/types/ai.d.ts +20 -0
- package/dist/types/ai.d.ts.map +1 -1
- package/dist/types/errors.d.ts +33 -0
- package/dist/types/errors.d.ts.map +1 -1
- package/dist/types/errors.js +34 -0
- package/dist/types/errors.js.map +1 -1
- package/dist/types/flow.d.ts +10 -5
- package/dist/types/flow.d.ts.map +1 -1
- package/dist/types/history.d.ts +1 -1
- package/dist/types/history.d.ts.map +1 -1
- package/dist/types/index.d.ts +5 -4
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/persistence.d.ts +43 -2
- package/dist/types/persistence.d.ts.map +1 -1
- package/dist/types/session.d.ts +8 -0
- package/dist/types/session.d.ts.map +1 -1
- package/dist/types/signals.d.ts +12 -2
- package/dist/types/signals.d.ts.map +1 -1
- package/dist/types/template.d.ts +3 -1
- package/dist/types/template.d.ts.map +1 -1
- package/dist/types/tool.d.ts +4 -4
- package/dist/types/tool.d.ts.map +1 -1
- package/dist/utils/condition.d.ts +19 -0
- package/dist/utils/condition.d.ts.map +1 -1
- package/dist/utils/condition.js +84 -15
- package/dist/utils/condition.js.map +1 -1
- package/dist/utils/session.d.ts +1 -0
- package/dist/utils/session.d.ts.map +1 -1
- package/dist/utils/session.js +1 -0
- package/dist/utils/session.js.map +1 -1
- package/docs/README.md +1 -1
- package/docs/guides/branching.md +1 -1
- package/docs/guides/compaction.md +12 -5
- package/docs/guides/conditions.md +15 -2
- package/docs/guides/error-handling.md +59 -9
- package/docs/guides/instructions.md +2 -2
- package/docs/guides/persistence.md +69 -2
- package/docs/guides/streaming.md +2 -0
- package/docs/migration/README.md +5 -1
- package/docs/migration/v2-3-to-v2-4.md +316 -0
- package/docs/reference/adapters.md +55 -7
- package/docs/reference/branches.md +2 -2
- package/docs/reference/create-agent.md +3 -3
- package/docs/reference/errors.md +66 -1
- package/docs/reference/flow.md +1 -1
- package/docs/reference/instruction.md +4 -4
- package/docs/reference/providers.md +100 -3
- package/docs/reference/signals.md +11 -3
- package/docs/reference/step.md +2 -2
- package/docs/reference/tool.md +3 -1
- package/docs/start/05-go-to-production.md +3 -0
- package/package.json +1 -1
- package/src/adapters/MemoryAdapter.ts +15 -1
- package/src/adapters/MongoAdapter.ts +41 -2
- package/src/adapters/OpenSearchAdapter.ts +24 -1
- package/src/adapters/PostgreSQLAdapter.ts +45 -5
- package/src/adapters/PrismaAdapter.ts +82 -16
- package/src/adapters/RedisAdapter.ts +19 -1
- package/src/adapters/SQLiteAdapter.ts +47 -5
- package/src/core/Agent.ts +70 -85
- package/src/core/AutoChainExecutor.ts +27 -57
- package/src/core/BranchEvaluator.ts +24 -30
- package/src/core/Flow.ts +10 -3
- package/src/core/FlowRouter.ts +36 -4
- package/src/core/PersistenceManager.ts +79 -10
- package/src/core/PromptComposer.ts +25 -12
- package/src/core/ResponseGenerationError.ts +56 -0
- package/src/core/ResponseModal.ts +233 -1482
- package/src/core/ResponsePipeline.ts +492 -662
- package/src/core/SessionFinalizer.ts +78 -0
- package/src/core/SessionManager.ts +21 -9
- package/src/core/SignalCoordinator.ts +263 -0
- package/src/core/SignalEvaluator.ts +12 -29
- package/src/core/Step.ts +11 -3
- package/src/core/StepLifecycle.ts +139 -0
- package/src/core/ToolLoopExecutor.ts +492 -0
- package/src/core/ToolManager.ts +2 -1
- package/src/index.ts +7 -5
- package/src/providers/AnthropicProvider.ts +30 -72
- package/src/providers/DeepSeekProvider.ts +74 -586
- package/src/providers/GeminiProvider.ts +29 -70
- package/src/providers/OpenAICompatibleProvider.ts +738 -0
- package/src/providers/OpenAIProvider.ts +29 -602
- package/src/providers/OpenRouterProvider.ts +38 -596
- package/src/providers/errorClassification.ts +172 -0
- package/src/providers/index.ts +13 -0
- package/src/types/agent.ts +2 -1
- package/src/types/ai.ts +22 -0
- package/src/types/errors.ts +57 -0
- package/src/types/flow.ts +10 -5
- package/src/types/history.ts +1 -2
- package/src/types/index.ts +5 -1
- package/src/types/persistence.ts +50 -2
- package/src/types/session.ts +9 -0
- package/src/types/signals.ts +14 -2
- package/src/types/template.ts +3 -1
- package/src/types/tool.ts +10 -10
- package/src/utils/condition.ts +115 -18
- package/src/utils/session.ts +2 -0
|
@@ -3,68 +3,14 @@
|
|
|
3
3
|
* OpenRouter provides access to multiple AI models through a unified OpenAI-compatible API
|
|
4
4
|
*/
|
|
5
5
|
import OpenAI from "openai";
|
|
6
|
-
import {
|
|
7
|
-
const DEFAULT_RETRY_CONFIG = {
|
|
8
|
-
timeout: 60000,
|
|
9
|
-
retries: 3,
|
|
10
|
-
};
|
|
11
|
-
/**
|
|
12
|
-
* Type guard to check if error is ErrorWithStatus
|
|
13
|
-
*/
|
|
14
|
-
function isErrorWithStatus(error) {
|
|
15
|
-
return (typeof error === "object" &&
|
|
16
|
-
error !== null &&
|
|
17
|
-
("status" in error || "code" in error || "message" in error));
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Safely extract error message
|
|
21
|
-
*/
|
|
22
|
-
function getErrorMessage(error) {
|
|
23
|
-
if (error instanceof Error) {
|
|
24
|
-
return error.message;
|
|
25
|
-
}
|
|
26
|
-
if (isErrorWithStatus(error) && error.message) {
|
|
27
|
-
return error.message;
|
|
28
|
-
}
|
|
29
|
-
return String(error);
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Determines if an error should trigger backup model usage
|
|
33
|
-
*/
|
|
34
|
-
const shouldUseBackupModel = (error) => {
|
|
35
|
-
if (!isErrorWithStatus(error)) {
|
|
36
|
-
return false;
|
|
37
|
-
}
|
|
38
|
-
// Server errors
|
|
39
|
-
if (error.status === 500 || error.status === 503) {
|
|
40
|
-
return true;
|
|
41
|
-
}
|
|
42
|
-
// Rate limiting
|
|
43
|
-
if (error.status === 429) {
|
|
44
|
-
return true;
|
|
45
|
-
}
|
|
46
|
-
// Model not available or overloaded
|
|
47
|
-
if (error.code === "model_not_found" || error.code === "model_overloaded") {
|
|
48
|
-
return true;
|
|
49
|
-
}
|
|
50
|
-
const message = getErrorMessage(error);
|
|
51
|
-
if (message.includes("overloaded") ||
|
|
52
|
-
message.includes("unavailable") ||
|
|
53
|
-
message.includes("internal error") ||
|
|
54
|
-
message.includes("Internal error") ||
|
|
55
|
-
message.includes("capacity")) {
|
|
56
|
-
return true;
|
|
57
|
-
}
|
|
58
|
-
return false;
|
|
59
|
-
};
|
|
6
|
+
import { OpenAICompatibleProvider, } from "./OpenAICompatibleProvider";
|
|
60
7
|
/**
|
|
61
8
|
* OpenRouter provider implementation
|
|
62
9
|
* Provides access to multiple AI models through OpenRouter's unified API
|
|
63
10
|
*/
|
|
64
|
-
export class OpenRouterProvider {
|
|
11
|
+
export class OpenRouterProvider extends OpenAICompatibleProvider {
|
|
65
12
|
constructor(options) {
|
|
66
|
-
|
|
67
|
-
const { apiKey, model, backupModels = [], siteUrl, siteName, config, retryConfig, } = options;
|
|
13
|
+
const { apiKey, model, backupModels, siteUrl, siteName, config, retryConfig, } = options;
|
|
68
14
|
if (!apiKey) {
|
|
69
15
|
throw new Error("OpenRouter API key is required");
|
|
70
16
|
}
|
|
@@ -72,369 +18,34 @@ export class OpenRouterProvider {
|
|
|
72
18
|
throw new Error("Model is required. See https://openrouter.ai/models");
|
|
73
19
|
}
|
|
74
20
|
// Initialize OpenAI client with OpenRouter base URL
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
});
|
|
83
|
-
this.primaryModel = model;
|
|
84
|
-
this.backupModels = backupModels;
|
|
85
|
-
this.config = config;
|
|
86
|
-
this.retryConfig = {
|
|
87
|
-
timeout: retryConfig?.timeout || DEFAULT_RETRY_CONFIG.timeout,
|
|
88
|
-
retries: retryConfig?.retries || DEFAULT_RETRY_CONFIG.retries,
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
/**
|
|
92
|
-
* Build OpenRouter-formatted messages from HistoryItem[] array.
|
|
93
|
-
* OpenRouter uses OpenAI-compatible format.
|
|
94
|
-
*/
|
|
95
|
-
buildOpenRouterMessages(history) {
|
|
96
|
-
const messages = [];
|
|
97
|
-
for (const item of history) {
|
|
98
|
-
switch (item.role) {
|
|
99
|
-
case "system":
|
|
100
|
-
messages.push({ role: "system", content: item.content });
|
|
101
|
-
break;
|
|
102
|
-
case "user":
|
|
103
|
-
messages.push({ role: "user", content: item.content });
|
|
104
|
-
break;
|
|
105
|
-
case "assistant":
|
|
106
|
-
if (item.tool_calls && item.tool_calls.length > 0) {
|
|
107
|
-
messages.push({
|
|
108
|
-
role: "assistant",
|
|
109
|
-
content: item.content || null,
|
|
110
|
-
tool_calls: item.tool_calls.map(tc => ({
|
|
111
|
-
id: tc.id,
|
|
112
|
-
type: "function",
|
|
113
|
-
function: {
|
|
114
|
-
name: tc.name,
|
|
115
|
-
arguments: JSON.stringify(tc.arguments),
|
|
116
|
-
},
|
|
117
|
-
})),
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
else {
|
|
121
|
-
messages.push({ role: "assistant", content: item.content || "" });
|
|
122
|
-
}
|
|
123
|
-
break;
|
|
124
|
-
case "tool":
|
|
125
|
-
messages.push({
|
|
126
|
-
role: "tool",
|
|
127
|
-
tool_call_id: item.tool_call_id,
|
|
128
|
-
content: typeof item.content === "string" ? item.content : JSON.stringify(item.content),
|
|
129
|
-
});
|
|
130
|
-
break;
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
return messages;
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* Adapt common schema format to OpenRouter's format.
|
|
137
|
-
* OpenRouter is OpenAI-compatible and uses standard JSON Schema.
|
|
138
|
-
*
|
|
139
|
-
* @private
|
|
140
|
-
*/
|
|
141
|
-
adaptSchemaForOpenRouter(schema) {
|
|
142
|
-
// OpenRouter is OpenAI-compatible and uses standard JSON Schema
|
|
143
|
-
// Our StructuredSchema is already JSON Schema compatible
|
|
144
|
-
return schema;
|
|
145
|
-
}
|
|
146
|
-
async generateMessage(input) {
|
|
147
|
-
return this.generateWithBackup(input);
|
|
148
|
-
}
|
|
149
|
-
async *generateMessageStream(input) {
|
|
150
|
-
yield* this.generateStreamWithBackup(input);
|
|
151
|
-
}
|
|
152
|
-
async generateWithBackup(input) {
|
|
153
|
-
// Try primary model first
|
|
154
|
-
try {
|
|
155
|
-
return await this.generateWithModel(this.primaryModel, input);
|
|
156
|
-
}
|
|
157
|
-
catch (primaryError) {
|
|
158
|
-
const primaryErrMsg = getErrorMessage(primaryError);
|
|
159
|
-
logger.warn(`[OPENROUTER] Primary model ${this.primaryModel} failed: ${primaryErrMsg}`);
|
|
160
|
-
if (!shouldUseBackupModel(primaryError)) {
|
|
161
|
-
throw primaryError;
|
|
162
|
-
}
|
|
163
|
-
logger.debug(`[OPENROUTER] Trying backup models`);
|
|
164
|
-
let lastBackupError = primaryError;
|
|
165
|
-
for (let i = 0; i < this.backupModels.length; i++) {
|
|
166
|
-
const backupModel = this.backupModels[i];
|
|
167
|
-
logger.debug(`[OPENROUTER] Trying backup model ${i + 1}/${this.backupModels.length}: ${backupModel}`);
|
|
168
|
-
try {
|
|
169
|
-
const result = await this.generateWithModel(backupModel, input);
|
|
170
|
-
logger.debug(`[OPENROUTER] Backup model ${backupModel} succeeded`);
|
|
171
|
-
return result;
|
|
172
|
-
}
|
|
173
|
-
catch (backupError) {
|
|
174
|
-
const backupErrMsg = getErrorMessage(backupError);
|
|
175
|
-
logger.warn(`[OPENROUTER] Backup model ${backupModel} failed: ${backupErrMsg}`);
|
|
176
|
-
lastBackupError = backupError;
|
|
177
|
-
if (!shouldUseBackupModel(backupError) &&
|
|
178
|
-
i < this.backupModels.length - 1) {
|
|
179
|
-
logger.debug(`[OPENROUTER] Backup model error doesn't qualify for further attempts`);
|
|
180
|
-
break;
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
const lastBackupErrMsg = getErrorMessage(lastBackupError);
|
|
185
|
-
logger.error(`[OPENROUTER] All models failed. Primary: ${primaryErrMsg}, Last backup: ${lastBackupErrMsg}`);
|
|
186
|
-
throw lastBackupError;
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
async generateWithModel(model, input) {
|
|
190
|
-
const operation = async () => {
|
|
191
|
-
const historyMessages = this.buildOpenRouterMessages(input.history);
|
|
192
|
-
historyMessages.push({ role: "user", content: input.prompt });
|
|
193
|
-
const params = {
|
|
194
|
-
model,
|
|
195
|
-
messages: historyMessages,
|
|
196
|
-
...this.config,
|
|
197
|
-
};
|
|
198
|
-
// Override with input parameters if provided
|
|
199
|
-
if (input.parameters?.maxOutputTokens !== undefined) {
|
|
200
|
-
params.max_tokens = input.parameters.maxOutputTokens;
|
|
201
|
-
}
|
|
202
|
-
// Add tools if provided
|
|
203
|
-
if (input.tools && input.tools.length > 0) {
|
|
204
|
-
params.tools = input.tools.map((tool) => ({
|
|
205
|
-
type: "function",
|
|
206
|
-
function: {
|
|
207
|
-
name: tool.name || tool.id,
|
|
208
|
-
description: tool.description,
|
|
209
|
-
parameters: tool.parameters, // JSON schema
|
|
210
|
-
},
|
|
211
|
-
}));
|
|
212
|
-
params.tool_choice = "auto";
|
|
213
|
-
}
|
|
214
|
-
// Use structured output API if JSON schema is provided
|
|
215
|
-
if (input.parameters?.jsonSchema) {
|
|
216
|
-
const response = await this.client.responses.parse({
|
|
217
|
-
model,
|
|
218
|
-
instructions: input.prompt,
|
|
219
|
-
input: "",
|
|
220
|
-
reasoning: {
|
|
221
|
-
effort: input.parameters?.reasoning?.effort || "low",
|
|
222
|
-
},
|
|
223
|
-
text: {
|
|
224
|
-
format: {
|
|
225
|
-
type: "json_schema",
|
|
226
|
-
name: input.parameters?.schemaName || "structured_output",
|
|
227
|
-
// Adapt common schema format to OpenRouter's format
|
|
228
|
-
schema: this.adaptSchemaForOpenRouter(input.parameters.jsonSchema),
|
|
229
|
-
},
|
|
230
|
-
},
|
|
231
|
-
});
|
|
232
|
-
if (!response.output_parsed) {
|
|
233
|
-
throw new Error("No parsed output returned from OpenRouter");
|
|
234
|
-
}
|
|
235
|
-
const structured = response.output_parsed;
|
|
236
|
-
const message = structured.message;
|
|
237
|
-
return {
|
|
238
|
-
message,
|
|
239
|
-
metadata: {
|
|
240
|
-
model: response.model,
|
|
241
|
-
tokensUsed: response.usage?.total_tokens,
|
|
242
|
-
promptTokens: response.usage?.input_tokens,
|
|
243
|
-
completionTokens: response.usage?.output_tokens,
|
|
244
|
-
},
|
|
245
|
-
structured,
|
|
246
|
-
};
|
|
247
|
-
}
|
|
248
|
-
// Fall back to regular chat completions API if no schema provided
|
|
249
|
-
const response = await this.client.chat.completions.create(params);
|
|
250
|
-
const message = response.choices[0]?.message?.content || "";
|
|
251
|
-
let toolCalls = [];
|
|
252
|
-
if (response.choices?.[0]?.message?.tool_calls) {
|
|
253
|
-
toolCalls = response.choices[0].message.tool_calls
|
|
254
|
-
.filter((toolCall) => toolCall.type === "function")
|
|
255
|
-
.map((toolCall) => {
|
|
256
|
-
let toolCallArguments = {};
|
|
257
|
-
try {
|
|
258
|
-
toolCallArguments = JSON.parse(toolCall.function.arguments);
|
|
259
|
-
}
|
|
260
|
-
catch (error) {
|
|
261
|
-
logger.warn(`[OPENROUTER] Failed to parse tool call arguments: ${getErrorMessage(error)}`);
|
|
262
|
-
toolCallArguments = {};
|
|
263
|
-
}
|
|
264
|
-
return {
|
|
265
|
-
toolName: toolCall.function.name,
|
|
266
|
-
arguments: toolCallArguments,
|
|
267
|
-
};
|
|
268
|
-
});
|
|
269
|
-
}
|
|
270
|
-
// Only throw error if we have no text AND no function calls
|
|
271
|
-
if (!message && toolCalls.length === 0) {
|
|
272
|
-
throw new Error("No response from OpenRouter");
|
|
273
|
-
}
|
|
274
|
-
return {
|
|
275
|
-
message,
|
|
276
|
-
metadata: {
|
|
277
|
-
model: response.model,
|
|
278
|
-
finishReason: response.choices[0]?.finish_reason,
|
|
279
|
-
tokensUsed: response.usage?.total_tokens,
|
|
280
|
-
promptTokens: response.usage?.prompt_tokens,
|
|
281
|
-
completionTokens: response.usage?.completion_tokens,
|
|
21
|
+
super({
|
|
22
|
+
client: new OpenAI({
|
|
23
|
+
apiKey,
|
|
24
|
+
baseURL: "https://openrouter.ai/api/v1",
|
|
25
|
+
defaultHeaders: {
|
|
26
|
+
"HTTP-Referer": siteUrl || "",
|
|
27
|
+
"X-Title": siteName || "",
|
|
282
28
|
},
|
|
283
|
-
|
|
284
|
-
? { message, toolCalls }
|
|
285
|
-
: undefined,
|
|
286
|
-
};
|
|
287
|
-
};
|
|
288
|
-
return withTimeoutAndRetry(operation, this.retryConfig.timeout, this.retryConfig.retries, `OpenRouter ${model}`);
|
|
289
|
-
}
|
|
290
|
-
async *generateStreamWithBackup(input) {
|
|
291
|
-
// Try primary model first
|
|
292
|
-
try {
|
|
293
|
-
yield* this.generateStreamWithModel(this.primaryModel, input);
|
|
294
|
-
}
|
|
295
|
-
catch (primaryError) {
|
|
296
|
-
const primaryErrMsg = getErrorMessage(primaryError);
|
|
297
|
-
logger.warn(`[OPENROUTER] Primary model ${this.primaryModel} failed: ${primaryErrMsg}`);
|
|
298
|
-
if (!shouldUseBackupModel(primaryError)) {
|
|
299
|
-
throw primaryError;
|
|
300
|
-
}
|
|
301
|
-
logger.debug(`[OPENROUTER] Trying backup models for streaming`);
|
|
302
|
-
let lastBackupError = primaryError;
|
|
303
|
-
for (let i = 0; i < this.backupModels.length; i++) {
|
|
304
|
-
const backupModel = this.backupModels[i];
|
|
305
|
-
logger.debug(`[OPENROUTER] Trying backup model ${i + 1}/${this.backupModels.length}: ${backupModel}`);
|
|
306
|
-
try {
|
|
307
|
-
yield* this.generateStreamWithModel(backupModel, input);
|
|
308
|
-
logger.debug(`[OPENROUTER] Backup model ${backupModel} succeeded`);
|
|
309
|
-
return;
|
|
310
|
-
}
|
|
311
|
-
catch (backupError) {
|
|
312
|
-
const backupErrMsg = getErrorMessage(backupError);
|
|
313
|
-
logger.warn(`[OPENROUTER] Backup model ${backupModel} failed: ${backupErrMsg}`);
|
|
314
|
-
lastBackupError = backupError;
|
|
315
|
-
if (!shouldUseBackupModel(backupError) &&
|
|
316
|
-
i < this.backupModels.length - 1) {
|
|
317
|
-
logger.debug(`[OPENROUTER] Backup model error doesn't qualify for further attempts`);
|
|
318
|
-
break;
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
const lastBackupErrMsg = getErrorMessage(lastBackupError);
|
|
323
|
-
logger.error(`[OPENROUTER] All models failed. Primary: ${primaryErrMsg}, Last backup: ${lastBackupErrMsg}`);
|
|
324
|
-
throw lastBackupError;
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
async *generateStreamWithModel(model, input) {
|
|
328
|
-
const historyMessages = this.buildOpenRouterMessages(input.history);
|
|
329
|
-
historyMessages.push({ role: "user", content: input.prompt });
|
|
330
|
-
const params = {
|
|
331
|
-
...this.config,
|
|
29
|
+
}),
|
|
332
30
|
model,
|
|
333
|
-
|
|
334
|
-
|
|
31
|
+
backupModels,
|
|
32
|
+
config,
|
|
33
|
+
retryConfig,
|
|
34
|
+
});
|
|
35
|
+
this.name = "openrouter";
|
|
36
|
+
this.capabilities = {
|
|
37
|
+
supportsTools: true,
|
|
38
|
+
supportsNativeJsonSchema: true,
|
|
39
|
+
supportsStreaming: true,
|
|
40
|
+
supportsStreamingToolCalls: true,
|
|
41
|
+
supportsPromptCaching: false,
|
|
335
42
|
};
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
params.tools = input.tools.map((tool) => ({
|
|
343
|
-
type: "function",
|
|
344
|
-
function: {
|
|
345
|
-
name: tool.name || tool.id,
|
|
346
|
-
description: tool.description,
|
|
347
|
-
parameters: tool.parameters, // JSON schema
|
|
348
|
-
},
|
|
349
|
-
}));
|
|
350
|
-
params.tool_choice = "auto";
|
|
351
|
-
}
|
|
352
|
-
// Streaming path does not support responses.parse; if schema present,
|
|
353
|
-
// request JSON object and parse at the end.
|
|
354
|
-
if (input.parameters?.jsonSchema) {
|
|
355
|
-
params.response_format = { type: "json_object" };
|
|
356
|
-
}
|
|
357
|
-
const stream = await this.client.chat.completions.create(params);
|
|
358
|
-
let accumulated = "";
|
|
359
|
-
let currentModel = model;
|
|
360
|
-
let finishReason;
|
|
361
|
-
let promptTokens;
|
|
362
|
-
let completionTokens;
|
|
363
|
-
let totalTokens;
|
|
364
|
-
const toolCalls = [];
|
|
365
|
-
for await (const chunk of stream) {
|
|
366
|
-
currentModel = chunk.model;
|
|
367
|
-
const delta = chunk.choices[0]?.delta?.content || "";
|
|
368
|
-
// Extract tool calls from delta
|
|
369
|
-
if (chunk.choices[0]?.delta?.tool_calls) {
|
|
370
|
-
for (const toolCall of chunk.choices[0].delta.tool_calls) {
|
|
371
|
-
if (toolCall.function) {
|
|
372
|
-
let toolCallArguments = {};
|
|
373
|
-
try {
|
|
374
|
-
toolCallArguments = toolCall.function.arguments
|
|
375
|
-
? JSON.parse(toolCall.function.arguments)
|
|
376
|
-
: {};
|
|
377
|
-
}
|
|
378
|
-
catch (error) {
|
|
379
|
-
logger.warn(`[OPENROUTER] Failed to parse tool call arguments in stream: ${getErrorMessage(error)}`);
|
|
380
|
-
toolCallArguments = {};
|
|
381
|
-
}
|
|
382
|
-
toolCalls.push({
|
|
383
|
-
toolName: toolCall.function.name || "",
|
|
384
|
-
arguments: toolCallArguments,
|
|
385
|
-
});
|
|
386
|
-
}
|
|
387
|
-
}
|
|
388
|
-
}
|
|
389
|
-
if (delta) {
|
|
390
|
-
accumulated += delta;
|
|
391
|
-
yield {
|
|
392
|
-
delta,
|
|
393
|
-
accumulated,
|
|
394
|
-
done: false,
|
|
395
|
-
};
|
|
396
|
-
}
|
|
397
|
-
if (chunk.choices[0]?.finish_reason) {
|
|
398
|
-
finishReason = chunk.choices[0].finish_reason;
|
|
399
|
-
}
|
|
400
|
-
// OpenRouter may include usage in the final chunk
|
|
401
|
-
if (chunk.usage) {
|
|
402
|
-
promptTokens = chunk.usage.prompt_tokens;
|
|
403
|
-
completionTokens = chunk.usage.completion_tokens;
|
|
404
|
-
totalTokens = chunk.usage.total_tokens;
|
|
405
|
-
}
|
|
406
|
-
}
|
|
407
|
-
// Parse JSON response if schema was provided
|
|
408
|
-
let structured;
|
|
409
|
-
if (input.parameters?.jsonSchema && accumulated) {
|
|
410
|
-
try {
|
|
411
|
-
structured = JSON.parse(accumulated);
|
|
412
|
-
}
|
|
413
|
-
catch (error) {
|
|
414
|
-
logger.warn("[OPENROUTER] Failed to parse JSON response in stream:", error);
|
|
415
|
-
}
|
|
416
|
-
}
|
|
417
|
-
// If tools were used, include them in structured response
|
|
418
|
-
if (toolCalls.length > 0) {
|
|
419
|
-
structured = {
|
|
420
|
-
...(structured || {}),
|
|
421
|
-
message: structured?.message || accumulated,
|
|
422
|
-
toolCalls,
|
|
423
|
-
};
|
|
424
|
-
}
|
|
425
|
-
// Yield final chunk
|
|
426
|
-
yield {
|
|
427
|
-
delta: "",
|
|
428
|
-
accumulated,
|
|
429
|
-
done: true,
|
|
430
|
-
metadata: {
|
|
431
|
-
model: currentModel,
|
|
432
|
-
finishReason,
|
|
433
|
-
tokensUsed: totalTokens,
|
|
434
|
-
promptTokens,
|
|
435
|
-
completionTokens,
|
|
436
|
-
},
|
|
437
|
-
structured,
|
|
43
|
+
this.logLabel = "OPENROUTER";
|
|
44
|
+
this.displayName = "OpenRouter";
|
|
45
|
+
/** OpenRouter additionally reports capacity issues in error messages */
|
|
46
|
+
this.classificationOptions = {
|
|
47
|
+
overloadedCodes: ["model_not_found", "model_overloaded"],
|
|
48
|
+
overloadedMessages: ["capacity"],
|
|
438
49
|
};
|
|
439
50
|
}
|
|
440
51
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OpenRouterProvider.js","sourceRoot":"","sources":["../../src/providers/OpenRouterProvider.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"OpenRouterProvider.js","sourceRoot":"","sources":["../../src/providers/OpenRouterProvider.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,MAAM,MAAM,QAAQ,CAAC;AAI5B,OAAO,EACL,wBAAwB,GAEzB,MAAM,4BAA4B,CAAC;AA0BpC;;;GAGG;AACH,MAAM,OAAO,kBAAmB,SAAQ,wBAAwB;IAoB9D,YAAY,OAAkC;QAC5C,MAAM,EACJ,MAAM,EACN,KAAK,EACL,YAAY,EACZ,OAAO,EACP,QAAQ,EACR,MAAM,EACN,WAAW,GACZ,GAAG,OAAO,CAAC;QAEZ,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACpD,CAAC;QAED,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACzE,CAAC;QAED,oDAAoD;QACpD,KAAK,CAAC;YACJ,MAAM,EAAE,IAAI,MAAM,CAAC;gBACjB,MAAM;gBACN,OAAO,EAAE,8BAA8B;gBACvC,cAAc,EAAE;oBACd,cAAc,EAAE,OAAO,IAAI,EAAE;oBAC7B,SAAS,EAAE,QAAQ,IAAI,EAAE;iBAC1B;aACF,CAAC;YACF,KAAK;YACL,YAAY;YACZ,MAAM;YACN,WAAW;SACZ,CAAC,CAAC;QApDW,SAAI,GAAG,YAAY,CAAC;QACpB,iBAAY,GAAyB;YACnD,aAAa,EAAE,IAAI;YACnB,wBAAwB,EAAE,IAAI;YAC9B,iBAAiB,EAAE,IAAI;YACvB,0BAA0B,EAAE,IAAI;YAChC,qBAAqB,EAAE,KAAK;SAC7B,CAAC;QAEiB,aAAQ,GAAG,YAAY,CAAC;QACxB,gBAAW,GAAG,YAAY,CAAC;QAE9C,wEAAwE;QAC5C,0BAAqB,GAC/C;YACE,eAAe,EAAE,CAAC,iBAAiB,EAAE,kBAAkB,CAAC;YACxD,kBAAkB,EAAE,CAAC,UAAU,CAAC;SACjC,CAAC;IAoCJ,CAAC;CACF"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared provider error utilities: classification of SDK/HTTP errors onto
|
|
3
|
+
* normalized ProviderErrorCode values, backup-model eligibility, and
|
|
4
|
+
* wrapping of terminal failures in ProviderError.
|
|
5
|
+
*
|
|
6
|
+
* The classification is derived once and reused for both backup-model
|
|
7
|
+
* decisions and final error wrapping, so the two can never drift apart.
|
|
8
|
+
*/
|
|
9
|
+
import { ProviderError, type ProviderErrorCode } from "../types/errors";
|
|
10
|
+
/**
|
|
11
|
+
* Shape of errors with status/code properties thrown by provider SDKs
|
|
12
|
+
*/
|
|
13
|
+
export interface ErrorWithStatus {
|
|
14
|
+
status?: number;
|
|
15
|
+
code?: string;
|
|
16
|
+
message?: string;
|
|
17
|
+
type?: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Type guard to check if error is ErrorWithStatus
|
|
21
|
+
*/
|
|
22
|
+
export declare function isErrorWithStatus(error: unknown): error is ErrorWithStatus;
|
|
23
|
+
/**
|
|
24
|
+
* Safely extract error message
|
|
25
|
+
*/
|
|
26
|
+
export declare function getErrorMessage(error: unknown): string;
|
|
27
|
+
/**
|
|
28
|
+
* Provider-specific signals treated as "overloaded/unavailable", in
|
|
29
|
+
* addition to the shared defaults (HTTP 500/503 and the common message
|
|
30
|
+
* substrings below).
|
|
31
|
+
*/
|
|
32
|
+
export interface ErrorClassificationOptions {
|
|
33
|
+
/** Extra HTTP statuses treated as overloaded (e.g. Anthropic's 529) */
|
|
34
|
+
overloadedStatuses?: readonly number[];
|
|
35
|
+
/** Error `code` values treated as overloaded/unavailable (e.g. "model_not_found") */
|
|
36
|
+
overloadedCodes?: readonly string[];
|
|
37
|
+
/** Error `type` values treated as overloaded (e.g. Anthropic's "overloaded_error") */
|
|
38
|
+
overloadedTypes?: readonly string[];
|
|
39
|
+
/** Extra message substrings treated as overloaded (e.g. OpenRouter's "capacity") */
|
|
40
|
+
overloadedMessages?: readonly string[];
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Classify an unknown error into a normalized ProviderErrorCode.
|
|
44
|
+
*
|
|
45
|
+
* Overload/availability checks run first so that backup-model decisions
|
|
46
|
+
* (rate_limited/overloaded) match the historical shouldUseBackupModel
|
|
47
|
+
* predicate exactly.
|
|
48
|
+
*/
|
|
49
|
+
export declare function classifyProviderError(error: unknown, options?: ErrorClassificationOptions): ProviderErrorCode;
|
|
50
|
+
/**
|
|
51
|
+
* Whether an error code qualifies for trying backup models.
|
|
52
|
+
* Mirrors the historical shouldUseBackupModel predicate.
|
|
53
|
+
*/
|
|
54
|
+
export declare function isBackupEligible(code: ProviderErrorCode): boolean;
|
|
55
|
+
/**
|
|
56
|
+
* Wrap a terminal failure (after retries/backup exhaustion) in a
|
|
57
|
+
* normalized ProviderError, preserving the original error as `cause`.
|
|
58
|
+
* Already-wrapped errors pass through untouched.
|
|
59
|
+
*/
|
|
60
|
+
export declare function toProviderError(error: unknown, provider: string, options?: ErrorClassificationOptions): ProviderError;
|
|
61
|
+
//# sourceMappingURL=errorClassification.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errorClassification.d.ts","sourceRoot":"","sources":["../../src/providers/errorClassification.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,aAAa,EAAE,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAExE;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,eAAe,CAM1E;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAQtD;AAED;;;;GAIG;AACH,MAAM,WAAW,0BAA0B;IACzC,uEAAuE;IACvE,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,qFAAqF;IACrF,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,sFAAsF;IACtF,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,oFAAoF;IACpF,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACxC;AAaD;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,OAAO,EACd,OAAO,GAAE,0BAA+B,GACvC,iBAAiB,CA4DnB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAEjE;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,0BAA0B,GACnC,aAAa,CAUf"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared provider error utilities: classification of SDK/HTTP errors onto
|
|
3
|
+
* normalized ProviderErrorCode values, backup-model eligibility, and
|
|
4
|
+
* wrapping of terminal failures in ProviderError.
|
|
5
|
+
*
|
|
6
|
+
* The classification is derived once and reused for both backup-model
|
|
7
|
+
* decisions and final error wrapping, so the two can never drift apart.
|
|
8
|
+
*/
|
|
9
|
+
import { ProviderError } from "../types/errors";
|
|
10
|
+
/**
|
|
11
|
+
* Type guard to check if error is ErrorWithStatus
|
|
12
|
+
*/
|
|
13
|
+
export function isErrorWithStatus(error) {
|
|
14
|
+
return (typeof error === "object" &&
|
|
15
|
+
error !== null &&
|
|
16
|
+
("status" in error || "code" in error || "message" in error));
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Safely extract error message
|
|
20
|
+
*/
|
|
21
|
+
export function getErrorMessage(error) {
|
|
22
|
+
if (error instanceof Error) {
|
|
23
|
+
return error.message;
|
|
24
|
+
}
|
|
25
|
+
if (isErrorWithStatus(error) && error.message) {
|
|
26
|
+
return error.message;
|
|
27
|
+
}
|
|
28
|
+
return String(error);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Message substrings every provider historically treated as
|
|
32
|
+
* overloaded/unavailable for backup-model purposes.
|
|
33
|
+
*/
|
|
34
|
+
const DEFAULT_OVERLOADED_MESSAGES = [
|
|
35
|
+
"overloaded",
|
|
36
|
+
"unavailable",
|
|
37
|
+
"internal error",
|
|
38
|
+
"Internal error",
|
|
39
|
+
];
|
|
40
|
+
/**
|
|
41
|
+
* Classify an unknown error into a normalized ProviderErrorCode.
|
|
42
|
+
*
|
|
43
|
+
* Overload/availability checks run first so that backup-model decisions
|
|
44
|
+
* (rate_limited/overloaded) match the historical shouldUseBackupModel
|
|
45
|
+
* predicate exactly.
|
|
46
|
+
*/
|
|
47
|
+
export function classifyProviderError(error, options = {}) {
|
|
48
|
+
if (!isErrorWithStatus(error)) {
|
|
49
|
+
return "unknown";
|
|
50
|
+
}
|
|
51
|
+
const { status, code, type } = error;
|
|
52
|
+
const message = getErrorMessage(error);
|
|
53
|
+
// Server errors / overload
|
|
54
|
+
if (status === 500 || status === 503) {
|
|
55
|
+
return "overloaded";
|
|
56
|
+
}
|
|
57
|
+
// Rate limiting
|
|
58
|
+
if (status === 429) {
|
|
59
|
+
return "rate_limited";
|
|
60
|
+
}
|
|
61
|
+
// Provider-specific overload/unavailability signals
|
|
62
|
+
if (status !== undefined && options.overloadedStatuses?.includes(status)) {
|
|
63
|
+
return "overloaded";
|
|
64
|
+
}
|
|
65
|
+
if (code !== undefined && options.overloadedCodes?.includes(code)) {
|
|
66
|
+
return "overloaded";
|
|
67
|
+
}
|
|
68
|
+
if (type !== undefined && options.overloadedTypes?.includes(type)) {
|
|
69
|
+
return "overloaded";
|
|
70
|
+
}
|
|
71
|
+
const overloadedMessages = options.overloadedMessages
|
|
72
|
+
? [...DEFAULT_OVERLOADED_MESSAGES, ...options.overloadedMessages]
|
|
73
|
+
: DEFAULT_OVERLOADED_MESSAGES;
|
|
74
|
+
if (overloadedMessages.some((pattern) => message.includes(pattern))) {
|
|
75
|
+
return "overloaded";
|
|
76
|
+
}
|
|
77
|
+
// Non-retriable classifications (never triggered backup models)
|
|
78
|
+
if (status === 401 || status === 403) {
|
|
79
|
+
return "auth";
|
|
80
|
+
}
|
|
81
|
+
if (status === 400 || status === 404 || status === 422) {
|
|
82
|
+
return "invalid_request";
|
|
83
|
+
}
|
|
84
|
+
if (status === 408 ||
|
|
85
|
+
message.includes("timed out") ||
|
|
86
|
+
message.includes("timeout")) {
|
|
87
|
+
return "timeout";
|
|
88
|
+
}
|
|
89
|
+
if (message.includes("fetch failed") ||
|
|
90
|
+
message.includes("ECONNREFUSED") ||
|
|
91
|
+
message.includes("ECONNRESET") ||
|
|
92
|
+
message.includes("ETIMEDOUT") ||
|
|
93
|
+
message.includes("network")) {
|
|
94
|
+
return "network";
|
|
95
|
+
}
|
|
96
|
+
return "unknown";
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Whether an error code qualifies for trying backup models.
|
|
100
|
+
* Mirrors the historical shouldUseBackupModel predicate.
|
|
101
|
+
*/
|
|
102
|
+
export function isBackupEligible(code) {
|
|
103
|
+
return code === "rate_limited" || code === "overloaded";
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Wrap a terminal failure (after retries/backup exhaustion) in a
|
|
107
|
+
* normalized ProviderError, preserving the original error as `cause`.
|
|
108
|
+
* Already-wrapped errors pass through untouched.
|
|
109
|
+
*/
|
|
110
|
+
export function toProviderError(error, provider, options) {
|
|
111
|
+
if (error instanceof ProviderError) {
|
|
112
|
+
return error;
|
|
113
|
+
}
|
|
114
|
+
return new ProviderError(classifyProviderError(error, options), provider, getErrorMessage(error), error);
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=errorClassification.js.map
|