@falai/agent 2.2.3 → 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 -96
- package/dist/cjs/core/ResponseModal.d.ts.map +1 -1
- package/dist/cjs/core/ResponseModal.js +184 -1183
- 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 +13 -27
- package/dist/cjs/core/SignalEvaluator.js.map +1 -1
- package/dist/cjs/core/SignalProcessor.d.ts.map +1 -1
- package/dist/cjs/core/SignalProcessor.js +1 -3
- package/dist/cjs/core/SignalProcessor.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 +21 -11
- 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 -96
- package/dist/core/ResponseModal.d.ts.map +1 -1
- package/dist/core/ResponseModal.js +177 -1175
- 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 +13 -27
- package/dist/core/SignalEvaluator.js.map +1 -1
- package/dist/core/SignalProcessor.d.ts.map +1 -1
- package/dist/core/SignalProcessor.js +1 -3
- package/dist/core/SignalProcessor.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 +21 -11
- 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 +3 -1
- 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 +18 -8
- 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 +241 -1465
- 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 +14 -30
- package/src/core/SignalProcessor.ts +1 -4
- 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 +23 -11
- 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
|
@@ -5,24 +5,23 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import OpenAI from "openai";
|
|
8
|
-
import type {
|
|
9
|
-
|
|
8
|
+
import type {
|
|
9
|
+
ChatCompletionChunk,
|
|
10
|
+
ChatCompletionCreateParamsNonStreaming,
|
|
11
|
+
ChatCompletionCreateParamsStreaming,
|
|
12
|
+
} from "openai/resources/chat/completions";
|
|
10
13
|
|
|
11
14
|
import type {
|
|
12
|
-
AiProvider,
|
|
13
15
|
GenerateMessageInput,
|
|
14
16
|
GenerateMessageOutput,
|
|
15
|
-
GenerateMessageStreamChunk,
|
|
16
|
-
AgentStructuredResponse,
|
|
17
17
|
StructuredSchema,
|
|
18
18
|
} from "../types";
|
|
19
|
-
import type {
|
|
20
|
-
import {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
};
|
|
19
|
+
import type { ProviderCapabilities } from "../types/ai";
|
|
20
|
+
import { logger } from "../utils";
|
|
21
|
+
import {
|
|
22
|
+
OpenAICompatibleProvider,
|
|
23
|
+
type OpenAICompatibleRequestConfig,
|
|
24
|
+
} from "./OpenAICompatibleProvider";
|
|
26
25
|
|
|
27
26
|
/**
|
|
28
27
|
* Configuration options for DeepSeek provider
|
|
@@ -38,9 +37,7 @@ export interface DeepSeekProviderOptions {
|
|
|
38
37
|
/** Custom base URL (default: "https://api.deepseek.com") */
|
|
39
38
|
baseURL?: string;
|
|
40
39
|
/** Default parameters - uses ChatCompletionCreateParamsNonStreaming from openai package */
|
|
41
|
-
config?:
|
|
42
|
-
Omit<ChatCompletionCreateParamsNonStreaming, "model" | "messages">
|
|
43
|
-
>;
|
|
40
|
+
config?: OpenAICompatibleRequestConfig;
|
|
44
41
|
/** Retry configuration */
|
|
45
42
|
retryConfig?: {
|
|
46
43
|
timeout?: number;
|
|
@@ -48,98 +45,33 @@ export interface DeepSeekProviderOptions {
|
|
|
48
45
|
};
|
|
49
46
|
}
|
|
50
47
|
|
|
51
|
-
/**
|
|
52
|
-
* Type guard for errors with status/code properties
|
|
53
|
-
*/
|
|
54
|
-
interface ErrorWithStatus {
|
|
55
|
-
status?: number;
|
|
56
|
-
code?: string;
|
|
57
|
-
message?: string;
|
|
58
|
-
type?: string;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* Type guard to check if error is ErrorWithStatus
|
|
63
|
-
*/
|
|
64
|
-
function isErrorWithStatus(error: unknown): error is ErrorWithStatus {
|
|
65
|
-
return (
|
|
66
|
-
typeof error === "object" &&
|
|
67
|
-
error !== null &&
|
|
68
|
-
("status" in error || "code" in error || "message" in error)
|
|
69
|
-
);
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* Safely extract error message
|
|
74
|
-
*/
|
|
75
|
-
function getErrorMessage(error: unknown): string {
|
|
76
|
-
if (error instanceof Error) {
|
|
77
|
-
return error.message;
|
|
78
|
-
}
|
|
79
|
-
if (isErrorWithStatus(error) && error.message) {
|
|
80
|
-
return error.message;
|
|
81
|
-
}
|
|
82
|
-
return String(error);
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* Determines if an error should trigger backup model usage
|
|
87
|
-
*/
|
|
88
|
-
const shouldUseBackupModel = (error: unknown): boolean => {
|
|
89
|
-
if (!isErrorWithStatus(error)) {
|
|
90
|
-
return false;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
// Server errors
|
|
94
|
-
if (error.status === 500 || error.status === 503) {
|
|
95
|
-
return true;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
// Rate limiting
|
|
99
|
-
if (error.status === 429) {
|
|
100
|
-
return true;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
// Model overloaded or unavailable
|
|
104
|
-
if (error.code === "model_not_found" || error.code === "model_overloaded") {
|
|
105
|
-
return true;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
const message = getErrorMessage(error);
|
|
109
|
-
if (
|
|
110
|
-
message.includes("overloaded") ||
|
|
111
|
-
message.includes("unavailable") ||
|
|
112
|
-
message.includes("internal error") ||
|
|
113
|
-
message.includes("Internal error")
|
|
114
|
-
) {
|
|
115
|
-
return true;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
return false;
|
|
119
|
-
};
|
|
120
|
-
|
|
121
48
|
/**
|
|
122
49
|
* DeepSeek provider implementation using the OpenAI-compatible API.
|
|
123
50
|
* Supports deepseek-chat and deepseek-reasoner with optional thinking mode.
|
|
124
51
|
*
|
|
125
52
|
* DeepSeek streams reasoning content via `delta.reasoning_content` when
|
|
126
53
|
* thinking mode is enabled. Tool calls follow the standard OpenAI format.
|
|
54
|
+
* Structured output uses chat completions with a json_schema response
|
|
55
|
+
* format (DeepSeek does not expose the responses.parse API).
|
|
127
56
|
*/
|
|
128
|
-
export class DeepSeekProvider
|
|
57
|
+
export class DeepSeekProvider extends OpenAICompatibleProvider {
|
|
129
58
|
public readonly name = "deepseek";
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
59
|
+
public readonly capabilities: ProviderCapabilities = {
|
|
60
|
+
supportsTools: true,
|
|
61
|
+
supportsNativeJsonSchema: true,
|
|
62
|
+
supportsStreaming: true,
|
|
63
|
+
supportsStreamingToolCalls: true,
|
|
64
|
+
supportsPromptCaching: false,
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
protected readonly logLabel = "DEEPSEEK";
|
|
68
|
+
protected readonly displayName = "DeepSeek";
|
|
137
69
|
|
|
138
70
|
constructor(options: DeepSeekProviderOptions) {
|
|
139
71
|
const {
|
|
140
72
|
apiKey,
|
|
141
73
|
model,
|
|
142
|
-
backupModels
|
|
74
|
+
backupModels,
|
|
143
75
|
baseURL = "https://api.deepseek.com",
|
|
144
76
|
config,
|
|
145
77
|
retryConfig,
|
|
@@ -155,512 +87,68 @@ export class DeepSeekProvider implements AiProvider {
|
|
|
155
87
|
);
|
|
156
88
|
}
|
|
157
89
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
90
|
+
super({
|
|
91
|
+
client: new OpenAI({
|
|
92
|
+
apiKey,
|
|
93
|
+
baseURL,
|
|
94
|
+
}),
|
|
95
|
+
model,
|
|
96
|
+
backupModels,
|
|
97
|
+
config,
|
|
98
|
+
retryConfig,
|
|
161
99
|
});
|
|
162
|
-
this.primaryModel = model;
|
|
163
|
-
this.backupModels = backupModels;
|
|
164
|
-
this.config = config;
|
|
165
|
-
this.retryConfig = {
|
|
166
|
-
timeout: retryConfig?.timeout || DEFAULT_RETRY_CONFIG.timeout,
|
|
167
|
-
retries: retryConfig?.retries || DEFAULT_RETRY_CONFIG.retries,
|
|
168
|
-
};
|
|
169
100
|
}
|
|
170
101
|
|
|
171
102
|
/**
|
|
172
|
-
*
|
|
173
|
-
*
|
|
103
|
+
* DeepSeek has no responses.parse API; structured output goes through
|
|
104
|
+
* chat completions with a json_schema response_format.
|
|
174
105
|
*/
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
messages.push({ role: "system", content: item.content });
|
|
182
|
-
break;
|
|
183
|
-
case "user":
|
|
184
|
-
messages.push({ role: "user", content: item.content });
|
|
185
|
-
break;
|
|
186
|
-
case "assistant":
|
|
187
|
-
if (item.tool_calls && item.tool_calls.length > 0) {
|
|
188
|
-
messages.push({
|
|
189
|
-
role: "assistant",
|
|
190
|
-
content: item.content || null,
|
|
191
|
-
tool_calls: item.tool_calls.map((tc) => ({
|
|
192
|
-
id: tc.id,
|
|
193
|
-
type: "function",
|
|
194
|
-
function: {
|
|
195
|
-
name: tc.name,
|
|
196
|
-
arguments: JSON.stringify(tc.arguments),
|
|
197
|
-
},
|
|
198
|
-
})),
|
|
199
|
-
});
|
|
200
|
-
} else {
|
|
201
|
-
messages.push({ role: "assistant", content: item.content || "" });
|
|
202
|
-
}
|
|
203
|
-
break;
|
|
204
|
-
case "tool":
|
|
205
|
-
messages.push({
|
|
206
|
-
role: "tool",
|
|
207
|
-
tool_call_id: item.tool_call_id,
|
|
208
|
-
content:
|
|
209
|
-
typeof item.content === "string"
|
|
210
|
-
? item.content
|
|
211
|
-
: JSON.stringify(item.content),
|
|
212
|
-
});
|
|
213
|
-
break;
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
return messages;
|
|
106
|
+
protected override async executeStructuredGenerate(
|
|
107
|
+
model: string,
|
|
108
|
+
input: GenerateMessageInput<unknown>,
|
|
109
|
+
_jsonSchema: StructuredSchema
|
|
110
|
+
): Promise<GenerateMessageOutput> {
|
|
111
|
+
return this.executeChatCompletion(model, input);
|
|
218
112
|
}
|
|
219
113
|
|
|
220
114
|
/**
|
|
221
|
-
*
|
|
222
|
-
*
|
|
115
|
+
* DeepSeek supports native json_schema enforcement in chat completions
|
|
116
|
+
* (both streaming and non-streaming).
|
|
223
117
|
*/
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
return this.generateWithBackup<TContext, TStructured>(input);
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
async *generateMessageStream<
|
|
238
|
-
TContext = unknown,
|
|
239
|
-
TStructured = AgentStructuredResponse,
|
|
240
|
-
>(
|
|
241
|
-
input: GenerateMessageInput<TContext>
|
|
242
|
-
): AsyncGenerator<GenerateMessageStreamChunk<TStructured>> {
|
|
243
|
-
yield* this.generateStreamWithBackup<TContext, TStructured>(input);
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
private async generateWithBackup<
|
|
247
|
-
TContext = unknown,
|
|
248
|
-
TStructured = AgentStructuredResponse,
|
|
249
|
-
>(
|
|
250
|
-
input: GenerateMessageInput<TContext>
|
|
251
|
-
): Promise<GenerateMessageOutput<TStructured>> {
|
|
252
|
-
try {
|
|
253
|
-
return await this.generateWithModel<TContext, TStructured>(
|
|
254
|
-
this.primaryModel,
|
|
255
|
-
input
|
|
256
|
-
);
|
|
257
|
-
} catch (primaryError: unknown) {
|
|
258
|
-
const primaryErrMsg = getErrorMessage(primaryError);
|
|
259
|
-
logger.warn(
|
|
260
|
-
`[DEEPSEEK] Primary model ${this.primaryModel} failed: ${primaryErrMsg}`
|
|
261
|
-
);
|
|
262
|
-
|
|
263
|
-
if (!shouldUseBackupModel(primaryError)) {
|
|
264
|
-
throw primaryError;
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
logger.debug(`[DEEPSEEK] Trying backup models`);
|
|
268
|
-
|
|
269
|
-
let lastBackupError: unknown = primaryError;
|
|
270
|
-
|
|
271
|
-
for (let i = 0; i < this.backupModels.length; i++) {
|
|
272
|
-
const backupModel = this.backupModels[i];
|
|
273
|
-
logger.debug(
|
|
274
|
-
`[DEEPSEEK] Trying backup model ${i + 1}/${this.backupModels.length}: ${backupModel}`
|
|
275
|
-
);
|
|
276
|
-
|
|
277
|
-
try {
|
|
278
|
-
const result = await this.generateWithModel(backupModel, input);
|
|
279
|
-
logger.debug(`[DEEPSEEK] Backup model ${backupModel} succeeded`);
|
|
280
|
-
return result as GenerateMessageOutput<TStructured>;
|
|
281
|
-
} catch (backupError: unknown) {
|
|
282
|
-
const backupErrMsg = getErrorMessage(backupError);
|
|
283
|
-
logger.warn(
|
|
284
|
-
`[DEEPSEEK] Backup model ${backupModel} failed: ${backupErrMsg}`
|
|
285
|
-
);
|
|
286
|
-
lastBackupError = backupError;
|
|
287
|
-
|
|
288
|
-
if (
|
|
289
|
-
!shouldUseBackupModel(backupError) &&
|
|
290
|
-
i < this.backupModels.length - 1
|
|
291
|
-
) {
|
|
292
|
-
logger.debug(
|
|
293
|
-
`[DEEPSEEK] Backup model error doesn't qualify for further attempts`
|
|
294
|
-
);
|
|
295
|
-
break;
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
const lastBackupErrMsg = getErrorMessage(lastBackupError);
|
|
301
|
-
logger.error(
|
|
302
|
-
`[DEEPSEEK] All models failed. Primary: ${primaryErrMsg}, Last backup: ${lastBackupErrMsg}`
|
|
303
|
-
);
|
|
304
|
-
throw lastBackupError;
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
private async generateWithModel<
|
|
309
|
-
TContext = unknown,
|
|
310
|
-
TStructured = AgentStructuredResponse,
|
|
311
|
-
>(
|
|
312
|
-
model: string,
|
|
313
|
-
input: GenerateMessageInput<TContext>
|
|
314
|
-
): Promise<GenerateMessageOutput<TStructured>> {
|
|
315
|
-
const operation = async (): Promise<GenerateMessageOutput> => {
|
|
316
|
-
const historyMessages = this.buildMessages(input.history);
|
|
317
|
-
historyMessages.push({ role: "user", content: input.prompt });
|
|
318
|
-
|
|
319
|
-
const params: ChatCompletionCreateParamsNonStreaming = {
|
|
320
|
-
model,
|
|
321
|
-
messages:
|
|
322
|
-
historyMessages as ChatCompletionCreateParamsNonStreaming["messages"],
|
|
323
|
-
...this.config,
|
|
324
|
-
};
|
|
325
|
-
|
|
326
|
-
// Override with input parameters if provided
|
|
327
|
-
if (input.parameters?.maxOutputTokens !== undefined) {
|
|
328
|
-
params.max_tokens = input.parameters.maxOutputTokens;
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
// Add tools if provided
|
|
332
|
-
if (input.tools && input.tools.length > 0) {
|
|
333
|
-
params.tools = input.tools.map((tool) => ({
|
|
334
|
-
type: "function" as const,
|
|
335
|
-
function: {
|
|
336
|
-
name: tool.name || tool.id,
|
|
337
|
-
description: tool.description,
|
|
338
|
-
parameters: tool.parameters as FunctionParameters,
|
|
339
|
-
},
|
|
340
|
-
}));
|
|
341
|
-
params.tool_choice = "auto";
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
// Use structured output if JSON schema is provided
|
|
345
|
-
if (input.parameters?.jsonSchema) {
|
|
346
|
-
params.response_format = {
|
|
347
|
-
type: "json_schema" as const,
|
|
348
|
-
json_schema: {
|
|
349
|
-
name: input.parameters.schemaName || "structured_output",
|
|
350
|
-
schema: this.adaptSchema(input.parameters.jsonSchema),
|
|
351
|
-
},
|
|
352
|
-
} as ChatCompletionCreateParamsNonStreaming["response_format"];
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
const response = await this.client.chat.completions.create(params);
|
|
356
|
-
|
|
357
|
-
const message = response.choices[0]?.message?.content || "";
|
|
358
|
-
|
|
359
|
-
let toolCalls: Array<{
|
|
360
|
-
toolName: string;
|
|
361
|
-
arguments: Record<string, unknown>;
|
|
362
|
-
}> = [];
|
|
363
|
-
if (response.choices?.[0]?.message?.tool_calls) {
|
|
364
|
-
toolCalls = response.choices[0].message.tool_calls
|
|
365
|
-
.filter((toolCall) => toolCall.type === "function")
|
|
366
|
-
.map((toolCall) => {
|
|
367
|
-
let toolCallArguments: Record<string, unknown> = {};
|
|
368
|
-
try {
|
|
369
|
-
toolCallArguments = JSON.parse(
|
|
370
|
-
toolCall.function.arguments
|
|
371
|
-
) as Record<string, unknown>;
|
|
372
|
-
} catch (error) {
|
|
373
|
-
logger.warn(
|
|
374
|
-
`[DEEPSEEK] Failed to parse tool call arguments: ${getErrorMessage(error)}`
|
|
375
|
-
);
|
|
376
|
-
toolCallArguments = {};
|
|
377
|
-
}
|
|
378
|
-
return {
|
|
379
|
-
toolName: toolCall.function.name,
|
|
380
|
-
arguments: toolCallArguments,
|
|
381
|
-
};
|
|
382
|
-
});
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
// Only throw error if we have no text AND no function calls
|
|
386
|
-
if (!message && toolCalls.length === 0) {
|
|
387
|
-
throw new Error("No response from DeepSeek");
|
|
388
|
-
}
|
|
389
|
-
|
|
390
|
-
// Parse structured output if schema was provided
|
|
391
|
-
let structured: AgentStructuredResponse | undefined;
|
|
392
|
-
if (input.parameters?.jsonSchema && message) {
|
|
393
|
-
try {
|
|
394
|
-
structured = JSON.parse(message) as AgentStructuredResponse;
|
|
395
|
-
} catch (error) {
|
|
396
|
-
logger.warn("[DEEPSEEK] Failed to parse JSON response:", error);
|
|
397
|
-
}
|
|
398
|
-
}
|
|
399
|
-
|
|
400
|
-
// If tools were used, include them in structured response
|
|
401
|
-
if (toolCalls.length > 0) {
|
|
402
|
-
structured = {
|
|
403
|
-
...(structured || {}),
|
|
404
|
-
message: structured?.message || message,
|
|
405
|
-
toolCalls,
|
|
406
|
-
} as AgentStructuredResponse;
|
|
407
|
-
}
|
|
408
|
-
|
|
409
|
-
return {
|
|
410
|
-
message,
|
|
411
|
-
metadata: {
|
|
412
|
-
model: response.model,
|
|
413
|
-
finishReason: response.choices[0]?.finish_reason,
|
|
414
|
-
tokensUsed: response.usage?.total_tokens,
|
|
415
|
-
promptTokens: response.usage?.prompt_tokens,
|
|
416
|
-
completionTokens: response.usage?.completion_tokens,
|
|
417
|
-
},
|
|
418
|
-
structured,
|
|
419
|
-
};
|
|
118
|
+
protected override structuredResponseFormat(
|
|
119
|
+
jsonSchema: StructuredSchema,
|
|
120
|
+
schemaName: string | undefined
|
|
121
|
+
): ChatCompletionCreateParamsNonStreaming["response_format"] {
|
|
122
|
+
return {
|
|
123
|
+
type: "json_schema" as const,
|
|
124
|
+
json_schema: {
|
|
125
|
+
name: schemaName || "structured_output",
|
|
126
|
+
schema: this.adaptSchema(jsonSchema),
|
|
127
|
+
},
|
|
420
128
|
};
|
|
421
|
-
|
|
422
|
-
return withTimeoutAndRetry(
|
|
423
|
-
operation,
|
|
424
|
-
this.retryConfig.timeout,
|
|
425
|
-
this.retryConfig.retries,
|
|
426
|
-
`DeepSeek ${model}`
|
|
427
|
-
) as Promise<GenerateMessageOutput<TStructured>>;
|
|
428
129
|
}
|
|
429
130
|
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
):
|
|
436
|
-
|
|
437
|
-
yield* this.generateStreamWithModel<TContext, TStructured>(
|
|
438
|
-
this.primaryModel,
|
|
439
|
-
input
|
|
440
|
-
);
|
|
441
|
-
} catch (primaryError: unknown) {
|
|
442
|
-
const primaryErrMsg = getErrorMessage(primaryError);
|
|
443
|
-
logger.warn(
|
|
444
|
-
`[DEEPSEEK] Primary model ${this.primaryModel} failed: ${primaryErrMsg}`
|
|
445
|
-
);
|
|
446
|
-
|
|
447
|
-
if (!shouldUseBackupModel(primaryError)) {
|
|
448
|
-
throw primaryError;
|
|
449
|
-
}
|
|
450
|
-
|
|
451
|
-
logger.debug(`[DEEPSEEK] Trying backup models for streaming`);
|
|
452
|
-
|
|
453
|
-
let lastBackupError: unknown = primaryError;
|
|
454
|
-
|
|
455
|
-
for (let i = 0; i < this.backupModels.length; i++) {
|
|
456
|
-
const backupModel = this.backupModels[i];
|
|
457
|
-
logger.debug(
|
|
458
|
-
`[DEEPSEEK] Trying backup model ${i + 1}/${this.backupModels.length}: ${backupModel}`
|
|
459
|
-
);
|
|
460
|
-
|
|
461
|
-
try {
|
|
462
|
-
yield* this.generateStreamWithModel<TContext, TStructured>(
|
|
463
|
-
backupModel,
|
|
464
|
-
input
|
|
465
|
-
);
|
|
466
|
-
logger.debug(`[DEEPSEEK] Backup model ${backupModel} succeeded`);
|
|
467
|
-
return;
|
|
468
|
-
} catch (backupError: unknown) {
|
|
469
|
-
const backupErrMsg = getErrorMessage(backupError);
|
|
470
|
-
logger.warn(
|
|
471
|
-
`[DEEPSEEK] Backup model ${backupModel} failed: ${backupErrMsg}`
|
|
472
|
-
);
|
|
473
|
-
lastBackupError = backupError;
|
|
474
|
-
|
|
475
|
-
if (
|
|
476
|
-
!shouldUseBackupModel(backupError) &&
|
|
477
|
-
i < this.backupModels.length - 1
|
|
478
|
-
) {
|
|
479
|
-
logger.debug(
|
|
480
|
-
`[DEEPSEEK] Backup model error doesn't qualify for further attempts`
|
|
481
|
-
);
|
|
482
|
-
break;
|
|
483
|
-
}
|
|
484
|
-
}
|
|
485
|
-
}
|
|
486
|
-
|
|
487
|
-
const lastBackupErrMsg = getErrorMessage(lastBackupError);
|
|
488
|
-
logger.error(
|
|
489
|
-
`[DEEPSEEK] All models failed. Primary: ${primaryErrMsg}, Last backup: ${lastBackupErrMsg}`
|
|
490
|
-
);
|
|
491
|
-
throw lastBackupError;
|
|
492
|
-
}
|
|
131
|
+
/**
|
|
132
|
+
* DeepSeek reports usage in streaming chunks when explicitly requested.
|
|
133
|
+
*/
|
|
134
|
+
protected override configureStreamParams(
|
|
135
|
+
params: ChatCompletionCreateParamsStreaming
|
|
136
|
+
): void {
|
|
137
|
+
params.stream_options = { include_usage: true };
|
|
493
138
|
}
|
|
494
139
|
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
model,
|
|
508
|
-
messages:
|
|
509
|
-
historyMessages as ChatCompletionCreateParamsNonStreaming["messages"],
|
|
510
|
-
stream: true as const,
|
|
511
|
-
stream_options: { include_usage: true },
|
|
512
|
-
};
|
|
513
|
-
|
|
514
|
-
// Override with input parameters if provided
|
|
515
|
-
if (input.parameters?.maxOutputTokens !== undefined) {
|
|
516
|
-
params.max_tokens = input.parameters.maxOutputTokens;
|
|
517
|
-
}
|
|
518
|
-
|
|
519
|
-
// Add tools if provided
|
|
520
|
-
if (input.tools && input.tools.length > 0) {
|
|
521
|
-
params.tools = input.tools.map((tool) => ({
|
|
522
|
-
type: "function" as const,
|
|
523
|
-
function: {
|
|
524
|
-
name: tool.name || tool.id,
|
|
525
|
-
description: tool.description,
|
|
526
|
-
parameters: tool.parameters as FunctionParameters,
|
|
527
|
-
},
|
|
528
|
-
}));
|
|
529
|
-
params.tool_choice = "auto";
|
|
530
|
-
}
|
|
531
|
-
|
|
532
|
-
// Request JSON schema output if schema is provided
|
|
533
|
-
if (input.parameters?.jsonSchema) {
|
|
534
|
-
params.response_format = {
|
|
535
|
-
type: "json_schema" as const,
|
|
536
|
-
json_schema: {
|
|
537
|
-
name: input.parameters.schemaName || "structured_output",
|
|
538
|
-
schema: this.adaptSchema(input.parameters.jsonSchema),
|
|
539
|
-
},
|
|
540
|
-
} as ChatCompletionCreateParamsNonStreaming["response_format"];
|
|
541
|
-
}
|
|
542
|
-
|
|
543
|
-
const stream = await this.client.chat.completions.create(params);
|
|
544
|
-
|
|
545
|
-
let accumulated = "";
|
|
546
|
-
let currentModel = model;
|
|
547
|
-
let finishReason: string | undefined;
|
|
548
|
-
let promptTokens: number | undefined;
|
|
549
|
-
let completionTokens: number | undefined;
|
|
550
|
-
let totalTokens: number | undefined;
|
|
551
|
-
const toolCalls: Array<{
|
|
552
|
-
toolName: string;
|
|
553
|
-
arguments: Record<string, unknown>;
|
|
554
|
-
}> = [];
|
|
555
|
-
|
|
556
|
-
for await (const chunk of stream) {
|
|
557
|
-
currentModel = chunk.model;
|
|
558
|
-
const choice = chunk.choices?.[0];
|
|
559
|
-
|
|
560
|
-
// DeepSeek may include usage in chunks with include_usage
|
|
561
|
-
if (chunk.usage) {
|
|
562
|
-
promptTokens = chunk.usage.prompt_tokens;
|
|
563
|
-
completionTokens = chunk.usage.completion_tokens;
|
|
564
|
-
totalTokens = chunk.usage.total_tokens;
|
|
565
|
-
}
|
|
566
|
-
|
|
567
|
-
if (!choice) continue;
|
|
568
|
-
|
|
569
|
-
const delta = choice.delta as Record<string, unknown>;
|
|
570
|
-
|
|
571
|
-
// Extract tool calls from delta
|
|
572
|
-
const deltaToolCalls = delta?.tool_calls as
|
|
573
|
-
| Array<{
|
|
574
|
-
index: number;
|
|
575
|
-
id?: string;
|
|
576
|
-
function?: { name?: string; arguments?: string };
|
|
577
|
-
}>
|
|
578
|
-
| undefined;
|
|
579
|
-
|
|
580
|
-
if (deltaToolCalls) {
|
|
581
|
-
for (const toolCall of deltaToolCalls) {
|
|
582
|
-
if (toolCall.function) {
|
|
583
|
-
let toolCallArguments: Record<string, unknown> = {};
|
|
584
|
-
try {
|
|
585
|
-
toolCallArguments = toolCall.function.arguments
|
|
586
|
-
? (JSON.parse(toolCall.function.arguments) as Record<
|
|
587
|
-
string,
|
|
588
|
-
unknown
|
|
589
|
-
>)
|
|
590
|
-
: {};
|
|
591
|
-
} catch (error) {
|
|
592
|
-
logger.warn(
|
|
593
|
-
`[DEEPSEEK] Failed to parse tool call arguments in stream: ${getErrorMessage(error)}`
|
|
594
|
-
);
|
|
595
|
-
toolCallArguments = {};
|
|
596
|
-
}
|
|
597
|
-
toolCalls.push({
|
|
598
|
-
toolName: toolCall.function.name || "",
|
|
599
|
-
arguments: toolCallArguments,
|
|
600
|
-
});
|
|
601
|
-
}
|
|
602
|
-
}
|
|
603
|
-
}
|
|
604
|
-
|
|
605
|
-
// DeepSeek streams reasoning via `reasoning_content` on the delta
|
|
606
|
-
const reasoning =
|
|
607
|
-
(delta?.reasoning_content as string | undefined) ?? undefined;
|
|
608
|
-
if (reasoning) {
|
|
609
|
-
logger.debug(`[DEEPSEEK] Reasoning: ${reasoning}`);
|
|
610
|
-
}
|
|
611
|
-
|
|
612
|
-
const content = (delta?.content as string | undefined) ?? "";
|
|
613
|
-
if (content) {
|
|
614
|
-
accumulated += content;
|
|
615
|
-
yield {
|
|
616
|
-
delta: content,
|
|
617
|
-
accumulated,
|
|
618
|
-
done: false,
|
|
619
|
-
};
|
|
620
|
-
}
|
|
621
|
-
|
|
622
|
-
if (choice.finish_reason) {
|
|
623
|
-
finishReason = choice.finish_reason;
|
|
624
|
-
}
|
|
625
|
-
}
|
|
626
|
-
|
|
627
|
-
// Parse JSON response if schema was provided
|
|
628
|
-
let structured: TStructured | undefined;
|
|
629
|
-
if (input.parameters?.jsonSchema && accumulated) {
|
|
630
|
-
try {
|
|
631
|
-
structured = JSON.parse(accumulated) as TStructured;
|
|
632
|
-
} catch (error) {
|
|
633
|
-
logger.warn(
|
|
634
|
-
"[DEEPSEEK] Failed to parse JSON response in stream:",
|
|
635
|
-
error
|
|
636
|
-
);
|
|
637
|
-
}
|
|
638
|
-
}
|
|
639
|
-
|
|
640
|
-
// Include tool calls in structured response
|
|
641
|
-
if (toolCalls.length > 0) {
|
|
642
|
-
structured = {
|
|
643
|
-
...(structured || {}),
|
|
644
|
-
message:
|
|
645
|
-
(structured as AgentStructuredResponse | undefined)?.message ||
|
|
646
|
-
accumulated,
|
|
647
|
-
toolCalls,
|
|
648
|
-
} as TStructured;
|
|
140
|
+
/**
|
|
141
|
+
* DeepSeek streams reasoning via `reasoning_content` on the delta.
|
|
142
|
+
*/
|
|
143
|
+
protected override onStreamDelta(
|
|
144
|
+
delta: ChatCompletionChunk.Choice.Delta
|
|
145
|
+
): void {
|
|
146
|
+
const reasoning =
|
|
147
|
+
((delta as Record<string, unknown>).reasoning_content as
|
|
148
|
+
| string
|
|
149
|
+
| undefined) ?? undefined;
|
|
150
|
+
if (reasoning) {
|
|
151
|
+
logger.debug(`[${this.logLabel}] Reasoning: ${reasoning}`);
|
|
649
152
|
}
|
|
650
|
-
|
|
651
|
-
// Yield final chunk
|
|
652
|
-
yield {
|
|
653
|
-
delta: "",
|
|
654
|
-
accumulated,
|
|
655
|
-
done: true,
|
|
656
|
-
metadata: {
|
|
657
|
-
model: currentModel,
|
|
658
|
-
finishReason,
|
|
659
|
-
tokensUsed: totalTokens,
|
|
660
|
-
promptTokens,
|
|
661
|
-
completionTokens,
|
|
662
|
-
},
|
|
663
|
-
structured,
|
|
664
|
-
};
|
|
665
153
|
}
|
|
666
154
|
}
|