@falai/agent 2.6.1 → 3.0.0
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 +1 -1
- package/dist/adapters/MemoryAdapter.d.ts.map +1 -1
- package/dist/adapters/MemoryAdapter.js +32 -36
- package/dist/adapters/MemoryAdapter.js.map +1 -1
- package/dist/adapters/MongoAdapter.d.ts +1 -1
- package/dist/adapters/MongoAdapter.d.ts.map +1 -1
- package/dist/adapters/MongoAdapter.js +2 -2
- package/dist/adapters/MongoAdapter.js.map +1 -1
- package/dist/adapters/OpenSearchAdapter.d.ts +1 -1
- package/dist/adapters/OpenSearchAdapter.d.ts.map +1 -1
- package/dist/adapters/OpenSearchAdapter.js +3 -3
- package/dist/adapters/OpenSearchAdapter.js.map +1 -1
- package/dist/adapters/PostgreSQLAdapter.d.ts +1 -1
- package/dist/adapters/PostgreSQLAdapter.d.ts.map +1 -1
- package/dist/adapters/PostgreSQLAdapter.js +18 -13
- package/dist/adapters/PostgreSQLAdapter.js.map +1 -1
- package/dist/adapters/PrismaAdapter.d.ts +1 -1
- package/dist/adapters/PrismaAdapter.d.ts.map +1 -1
- package/dist/adapters/PrismaAdapter.js +3 -3
- package/dist/adapters/PrismaAdapter.js.map +1 -1
- package/dist/adapters/RedisAdapter.d.ts +2 -1
- package/dist/adapters/RedisAdapter.d.ts.map +1 -1
- package/dist/adapters/RedisAdapter.js +77 -27
- package/dist/adapters/RedisAdapter.js.map +1 -1
- package/dist/adapters/SQLiteAdapter.d.ts +1 -1
- package/dist/adapters/SQLiteAdapter.d.ts.map +1 -1
- package/dist/adapters/SQLiteAdapter.js +9 -31
- package/dist/adapters/SQLiteAdapter.js.map +1 -1
- package/dist/adapters/index.d.ts +13 -13
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +7 -7
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/sessionRow.d.ts +22 -0
- package/dist/adapters/sessionRow.d.ts.map +1 -0
- package/dist/adapters/sessionRow.js +48 -0
- package/dist/adapters/sessionRow.js.map +1 -0
- package/dist/cjs/adapters/MemoryAdapter.d.ts +1 -1
- package/dist/cjs/adapters/MemoryAdapter.d.ts.map +1 -1
- package/dist/cjs/adapters/MemoryAdapter.js +39 -43
- package/dist/cjs/adapters/MemoryAdapter.js.map +1 -1
- package/dist/cjs/adapters/MongoAdapter.d.ts +1 -1
- package/dist/cjs/adapters/MongoAdapter.d.ts.map +1 -1
- package/dist/cjs/adapters/MongoAdapter.js +4 -4
- package/dist/cjs/adapters/MongoAdapter.js.map +1 -1
- package/dist/cjs/adapters/OpenSearchAdapter.d.ts +1 -1
- package/dist/cjs/adapters/OpenSearchAdapter.d.ts.map +1 -1
- package/dist/cjs/adapters/OpenSearchAdapter.js +6 -6
- package/dist/cjs/adapters/OpenSearchAdapter.js.map +1 -1
- package/dist/cjs/adapters/PostgreSQLAdapter.d.ts +1 -1
- package/dist/cjs/adapters/PostgreSQLAdapter.d.ts.map +1 -1
- package/dist/cjs/adapters/PostgreSQLAdapter.js +20 -15
- package/dist/cjs/adapters/PostgreSQLAdapter.js.map +1 -1
- package/dist/cjs/adapters/PrismaAdapter.d.ts +1 -1
- package/dist/cjs/adapters/PrismaAdapter.d.ts.map +1 -1
- package/dist/cjs/adapters/PrismaAdapter.js +7 -7
- package/dist/cjs/adapters/PrismaAdapter.js.map +1 -1
- package/dist/cjs/adapters/RedisAdapter.d.ts +2 -1
- package/dist/cjs/adapters/RedisAdapter.d.ts.map +1 -1
- package/dist/cjs/adapters/RedisAdapter.js +81 -31
- package/dist/cjs/adapters/RedisAdapter.js.map +1 -1
- package/dist/cjs/adapters/SQLiteAdapter.d.ts +1 -1
- package/dist/cjs/adapters/SQLiteAdapter.d.ts.map +1 -1
- package/dist/cjs/adapters/SQLiteAdapter.js +11 -33
- package/dist/cjs/adapters/SQLiteAdapter.js.map +1 -1
- package/dist/cjs/adapters/index.d.ts +13 -13
- package/dist/cjs/adapters/index.d.ts.map +1 -1
- package/dist/cjs/adapters/index.js +14 -14
- package/dist/cjs/adapters/index.js.map +1 -1
- package/dist/cjs/adapters/sessionRow.d.ts +22 -0
- package/dist/cjs/adapters/sessionRow.d.ts.map +1 -0
- package/dist/cjs/adapters/sessionRow.js +52 -0
- package/dist/cjs/adapters/sessionRow.js.map +1 -0
- package/dist/cjs/core/Agent.d.ts +19 -11
- package/dist/cjs/core/Agent.d.ts.map +1 -1
- package/dist/cjs/core/Agent.js +102 -64
- package/dist/cjs/core/Agent.js.map +1 -1
- package/dist/cjs/core/AutoChainExecutor.d.ts +12 -22
- package/dist/cjs/core/AutoChainExecutor.d.ts.map +1 -1
- package/dist/cjs/core/AutoChainExecutor.js +46 -49
- package/dist/cjs/core/AutoChainExecutor.js.map +1 -1
- package/dist/cjs/core/BranchEvaluator.d.ts +4 -4
- package/dist/cjs/core/BranchEvaluator.d.ts.map +1 -1
- package/dist/cjs/core/BranchEvaluator.js +6 -6
- package/dist/cjs/core/BranchEvaluator.js.map +1 -1
- package/dist/cjs/core/CompactionEngine.d.ts +16 -3
- package/dist/cjs/core/CompactionEngine.d.ts.map +1 -1
- package/dist/cjs/core/CompactionEngine.js +30 -6
- package/dist/cjs/core/CompactionEngine.js.map +1 -1
- package/dist/cjs/core/DirectiveChainTracker.d.ts +1 -1
- package/dist/cjs/core/DirectiveChainTracker.d.ts.map +1 -1
- package/dist/cjs/core/DirectiveChainTracker.js +5 -5
- package/dist/cjs/core/DirectiveChainTracker.js.map +1 -1
- package/dist/cjs/core/Events.d.ts +1 -1
- package/dist/cjs/core/Events.d.ts.map +1 -1
- package/dist/cjs/core/Events.js +15 -15
- package/dist/cjs/core/Events.js.map +1 -1
- package/dist/cjs/core/Flow.d.ts +4 -4
- package/dist/cjs/core/Flow.d.ts.map +1 -1
- package/dist/cjs/core/Flow.js +15 -15
- package/dist/cjs/core/Flow.js.map +1 -1
- package/dist/cjs/core/FlowRouter.d.ts +4 -4
- package/dist/cjs/core/FlowRouter.d.ts.map +1 -1
- package/dist/cjs/core/FlowRouter.js +92 -70
- package/dist/cjs/core/FlowRouter.js.map +1 -1
- package/dist/cjs/core/PersistenceManager.d.ts +1 -1
- package/dist/cjs/core/PersistenceManager.d.ts.map +1 -1
- package/dist/cjs/core/PersistenceManager.js +10 -10
- package/dist/cjs/core/PersistenceManager.js.map +1 -1
- package/dist/cjs/core/PromptComposer.d.ts +4 -4
- package/dist/cjs/core/PromptComposer.d.ts.map +1 -1
- package/dist/cjs/core/PromptComposer.js +13 -13
- package/dist/cjs/core/PromptComposer.js.map +1 -1
- package/dist/cjs/core/PromptSectionCache.d.ts +2 -2
- package/dist/cjs/core/PromptSectionCache.d.ts.map +1 -1
- package/dist/cjs/core/ResponseEngine.d.ts +4 -4
- package/dist/cjs/core/ResponseEngine.d.ts.map +1 -1
- package/dist/cjs/core/ResponseEngine.js +7 -7
- package/dist/cjs/core/ResponseEngine.js.map +1 -1
- package/dist/cjs/core/ResponseGenerationError.d.ts.map +1 -1
- package/dist/cjs/core/ResponseGenerationError.js +3 -5
- package/dist/cjs/core/ResponseGenerationError.js.map +1 -1
- package/dist/cjs/core/ResponseModal.d.ts +39 -10
- package/dist/cjs/core/ResponseModal.d.ts.map +1 -1
- package/dist/cjs/core/ResponseModal.js +195 -72
- package/dist/cjs/core/ResponseModal.js.map +1 -1
- package/dist/cjs/core/ResponsePipeline.d.ts +50 -12
- package/dist/cjs/core/ResponsePipeline.d.ts.map +1 -1
- package/dist/cjs/core/ResponsePipeline.js +301 -158
- package/dist/cjs/core/ResponsePipeline.js.map +1 -1
- package/dist/cjs/core/SessionFinalizer.d.ts +4 -4
- package/dist/cjs/core/SessionFinalizer.d.ts.map +1 -1
- package/dist/cjs/core/SessionFinalizer.js +36 -9
- package/dist/cjs/core/SessionFinalizer.js.map +1 -1
- package/dist/cjs/core/SessionManager.d.ts +15 -6
- package/dist/cjs/core/SessionManager.d.ts.map +1 -1
- package/dist/cjs/core/SessionManager.js +49 -22
- package/dist/cjs/core/SessionManager.js.map +1 -1
- package/dist/cjs/core/SignalCoordinator.d.ts +5 -5
- package/dist/cjs/core/SignalCoordinator.d.ts.map +1 -1
- package/dist/cjs/core/SignalCoordinator.js +12 -12
- package/dist/cjs/core/SignalCoordinator.js.map +1 -1
- package/dist/cjs/core/SignalEvaluator.d.ts +4 -4
- package/dist/cjs/core/SignalEvaluator.d.ts.map +1 -1
- package/dist/cjs/core/SignalEvaluator.js +6 -6
- package/dist/cjs/core/SignalEvaluator.js.map +1 -1
- package/dist/cjs/core/SignalProcessor.d.ts +6 -6
- package/dist/cjs/core/SignalProcessor.d.ts.map +1 -1
- package/dist/cjs/core/SignalProcessor.js +17 -89
- package/dist/cjs/core/SignalProcessor.js.map +1 -1
- package/dist/cjs/core/Step.d.ts +5 -5
- package/dist/cjs/core/Step.d.ts.map +1 -1
- package/dist/cjs/core/Step.js +65 -17
- package/dist/cjs/core/Step.js.map +1 -1
- package/dist/cjs/core/StepLifecycle.d.ts +18 -8
- package/dist/cjs/core/StepLifecycle.d.ts.map +1 -1
- package/dist/cjs/core/StepLifecycle.js +103 -20
- package/dist/cjs/core/StepLifecycle.js.map +1 -1
- package/dist/cjs/core/StreamingToolExecutor.d.ts +1 -1
- package/dist/cjs/core/StreamingToolExecutor.d.ts.map +1 -1
- package/dist/cjs/core/StreamingToolExecutor.js +30 -6
- package/dist/cjs/core/StreamingToolExecutor.js.map +1 -1
- package/dist/cjs/core/ToolLoopExecutor.d.ts +8 -4
- package/dist/cjs/core/ToolLoopExecutor.d.ts.map +1 -1
- package/dist/cjs/core/ToolLoopExecutor.js +189 -97
- package/dist/cjs/core/ToolLoopExecutor.js.map +1 -1
- package/dist/cjs/core/ToolManager.d.ts +6 -6
- package/dist/cjs/core/ToolManager.d.ts.map +1 -1
- package/dist/cjs/core/ToolManager.js +102 -79
- package/dist/cjs/core/ToolManager.js.map +1 -1
- package/dist/cjs/core/createAgent.d.ts +2 -2
- package/dist/cjs/core/createAgent.d.ts.map +1 -1
- package/dist/cjs/core/createAgent.js +2 -2
- package/dist/cjs/core/createAgent.js.map +1 -1
- package/dist/cjs/core/flow-namespace.d.ts +16 -1
- package/dist/cjs/core/flow-namespace.d.ts.map +1 -1
- package/dist/cjs/core/flow-namespace.js +26 -4
- package/dist/cjs/core/flow-namespace.js.map +1 -1
- package/dist/cjs/core/toolGates.d.ts +1 -1
- package/dist/cjs/core/toolGates.d.ts.map +1 -1
- package/dist/cjs/core/toolGates.js +3 -3
- package/dist/cjs/core/toolGates.js.map +1 -1
- package/dist/cjs/index.d.ts +50 -45
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +96 -88
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/providers/AnthropicProvider.d.ts +25 -35
- package/dist/cjs/providers/AnthropicProvider.d.ts.map +1 -1
- package/dist/cjs/providers/AnthropicProvider.js +30 -426
- package/dist/cjs/providers/AnthropicProvider.js.map +1 -1
- package/dist/cjs/providers/DeepSeekProvider.d.ts +13 -34
- package/dist/cjs/providers/DeepSeekProvider.d.ts.map +1 -1
- package/dist/cjs/providers/DeepSeekProvider.js +17 -51
- package/dist/cjs/providers/DeepSeekProvider.js.map +1 -1
- package/dist/cjs/providers/GeminiProvider.d.ts +22 -75
- package/dist/cjs/providers/GeminiProvider.d.ts.map +1 -1
- package/dist/cjs/providers/GeminiProvider.js +32 -558
- package/dist/cjs/providers/GeminiProvider.js.map +1 -1
- package/dist/cjs/providers/GenericOpenAICompatibleProvider.d.ts +9 -10
- package/dist/cjs/providers/GenericOpenAICompatibleProvider.d.ts.map +1 -1
- package/dist/cjs/providers/GenericOpenAICompatibleProvider.js +14 -20
- package/dist/cjs/providers/GenericOpenAICompatibleProvider.js.map +1 -1
- package/dist/cjs/providers/OpenAICompatibleProvider.d.ts +26 -135
- package/dist/cjs/providers/OpenAICompatibleProvider.d.ts.map +1 -1
- package/dist/cjs/providers/OpenAICompatibleProvider.js +40 -496
- package/dist/cjs/providers/OpenAICompatibleProvider.js.map +1 -1
- package/dist/cjs/providers/OpenAIProvider.d.ts +14 -20
- package/dist/cjs/providers/OpenAIProvider.d.ts.map +1 -1
- package/dist/cjs/providers/OpenAIProvider.js +21 -28
- package/dist/cjs/providers/OpenAIProvider.js.map +1 -1
- package/dist/cjs/providers/OpenRouterProvider.d.ts +20 -24
- package/dist/cjs/providers/OpenRouterProvider.d.ts.map +1 -1
- package/dist/cjs/providers/OpenRouterProvider.js +22 -38
- package/dist/cjs/providers/OpenRouterProvider.js.map +1 -1
- package/dist/cjs/providers/ProviderAdapter.d.ts +94 -0
- package/dist/cjs/providers/ProviderAdapter.d.ts.map +1 -0
- package/dist/cjs/providers/ProviderAdapter.js +257 -0
- package/dist/cjs/providers/ProviderAdapter.js.map +1 -0
- package/dist/cjs/providers/index.d.ts +21 -18
- package/dist/cjs/providers/index.d.ts.map +1 -1
- package/dist/cjs/providers/index.js +23 -21
- package/dist/cjs/providers/index.js.map +1 -1
- package/dist/cjs/types/agent.d.ts +37 -11
- package/dist/cjs/types/agent.d.ts.map +1 -1
- package/dist/cjs/types/ai.d.ts +11 -21
- package/dist/cjs/types/ai.d.ts.map +1 -1
- package/dist/cjs/types/compaction.d.ts +2 -2
- package/dist/cjs/types/compaction.d.ts.map +1 -1
- package/dist/cjs/types/errors.d.ts +16 -20
- package/dist/cjs/types/errors.d.ts.map +1 -1
- package/dist/cjs/types/errors.js +17 -18
- package/dist/cjs/types/errors.js.map +1 -1
- package/dist/cjs/types/flow.d.ts +56 -39
- 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 +17 -17
- package/dist/cjs/types/index.d.ts.map +1 -1
- package/dist/cjs/types/index.js +14 -14
- package/dist/cjs/types/index.js.map +1 -1
- package/dist/cjs/types/persistence.d.ts +2 -2
- package/dist/cjs/types/persistence.d.ts.map +1 -1
- package/dist/cjs/types/session.d.ts +4 -4
- package/dist/cjs/types/session.d.ts.map +1 -1
- package/dist/cjs/types/signals.d.ts +3 -3
- package/dist/cjs/types/signals.d.ts.map +1 -1
- package/dist/cjs/types/template.d.ts +2 -2
- package/dist/cjs/types/template.d.ts.map +1 -1
- package/dist/cjs/types/tool.d.ts +4 -2
- package/dist/cjs/types/tool.d.ts.map +1 -1
- package/dist/cjs/types/tool.js.map +1 -1
- package/dist/cjs/utils/condition.d.ts +1 -1
- package/dist/cjs/utils/condition.d.ts.map +1 -1
- package/dist/cjs/utils/condition.js +6 -6
- package/dist/cjs/utils/condition.js.map +1 -1
- package/dist/cjs/utils/event.d.ts +1 -1
- package/dist/cjs/utils/event.d.ts.map +1 -1
- package/dist/cjs/utils/event.js +2 -2
- package/dist/cjs/utils/event.js.map +1 -1
- package/dist/cjs/utils/history.d.ts +2 -2
- package/dist/cjs/utils/history.d.ts.map +1 -1
- package/dist/cjs/utils/history.js +15 -15
- package/dist/cjs/utils/history.js.map +1 -1
- package/dist/cjs/utils/index.d.ts +11 -13
- package/dist/cjs/utils/index.d.ts.map +1 -1
- package/dist/cjs/utils/index.js +57 -58
- package/dist/cjs/utils/index.js.map +1 -1
- package/dist/cjs/utils/serialize.d.ts +17 -0
- package/dist/cjs/utils/serialize.d.ts.map +1 -1
- package/dist/cjs/utils/serialize.js +33 -0
- package/dist/cjs/utils/serialize.js.map +1 -1
- package/dist/cjs/utils/session.d.ts +23 -3
- package/dist/cjs/utils/session.d.ts.map +1 -1
- package/dist/cjs/utils/session.js +40 -8
- package/dist/cjs/utils/session.js.map +1 -1
- package/dist/cjs/utils/template.d.ts +3 -3
- package/dist/cjs/utils/template.d.ts.map +1 -1
- package/dist/cjs/utils/template.js +5 -5
- package/dist/cjs/utils/template.js.map +1 -1
- package/dist/constants/index.d.ts +1 -0
- package/dist/constants/index.js +1 -1
- package/dist/core/Agent.d.ts +19 -11
- package/dist/core/Agent.d.ts.map +1 -1
- package/dist/core/Agent.js +53 -15
- package/dist/core/Agent.js.map +1 -1
- package/dist/core/AutoChainExecutor.d.ts +12 -22
- package/dist/core/AutoChainExecutor.d.ts.map +1 -1
- package/dist/core/AutoChainExecutor.js +27 -30
- package/dist/core/AutoChainExecutor.js.map +1 -1
- package/dist/core/BranchEvaluator.d.ts +4 -4
- package/dist/core/BranchEvaluator.d.ts.map +1 -1
- package/dist/core/BranchEvaluator.js +2 -2
- package/dist/core/BranchEvaluator.js.map +1 -1
- package/dist/core/CompactionEngine.d.ts +16 -3
- package/dist/core/CompactionEngine.d.ts.map +1 -1
- package/dist/core/CompactionEngine.js +30 -6
- package/dist/core/CompactionEngine.js.map +1 -1
- package/dist/core/DirectiveChainTracker.d.ts +1 -1
- package/dist/core/DirectiveChainTracker.d.ts.map +1 -1
- package/dist/core/DirectiveChainTracker.js +2 -2
- package/dist/core/DirectiveChainTracker.js.map +1 -1
- package/dist/core/Events.d.ts +1 -1
- package/dist/core/Events.d.ts.map +1 -1
- package/dist/core/Events.js +1 -1
- package/dist/core/Events.js.map +1 -1
- package/dist/core/Flow.d.ts +4 -4
- package/dist/core/Flow.d.ts.map +1 -1
- package/dist/core/Flow.js +3 -3
- package/dist/core/Flow.js.map +1 -1
- package/dist/core/FlowRouter.d.ts +4 -4
- package/dist/core/FlowRouter.d.ts.map +1 -1
- package/dist/core/FlowRouter.js +36 -14
- package/dist/core/FlowRouter.js.map +1 -1
- package/dist/core/PersistenceManager.d.ts +1 -1
- package/dist/core/PersistenceManager.d.ts.map +1 -1
- package/dist/core/PersistenceManager.js +3 -3
- package/dist/core/PersistenceManager.js.map +1 -1
- package/dist/core/PromptComposer.d.ts +4 -4
- package/dist/core/PromptComposer.d.ts.map +1 -1
- package/dist/core/PromptComposer.js +3 -3
- package/dist/core/PromptComposer.js.map +1 -1
- package/dist/core/PromptSectionCache.d.ts +2 -2
- package/dist/core/PromptSectionCache.d.ts.map +1 -1
- package/dist/core/ResponseEngine.d.ts +4 -4
- package/dist/core/ResponseEngine.d.ts.map +1 -1
- package/dist/core/ResponseEngine.js +2 -2
- package/dist/core/ResponseEngine.js.map +1 -1
- package/dist/core/ResponseGenerationError.d.ts.map +1 -1
- package/dist/core/ResponseGenerationError.js +3 -5
- package/dist/core/ResponseGenerationError.js.map +1 -1
- package/dist/core/ResponseModal.d.ts +39 -10
- package/dist/core/ResponseModal.d.ts.map +1 -1
- package/dist/core/ResponseModal.js +152 -29
- package/dist/core/ResponseModal.js.map +1 -1
- package/dist/core/ResponsePipeline.d.ts +50 -12
- package/dist/core/ResponsePipeline.d.ts.map +1 -1
- package/dist/core/ResponsePipeline.js +232 -89
- package/dist/core/ResponsePipeline.js.map +1 -1
- package/dist/core/SessionFinalizer.d.ts +4 -4
- package/dist/core/SessionFinalizer.d.ts.map +1 -1
- package/dist/core/SessionFinalizer.js +32 -5
- package/dist/core/SessionFinalizer.js.map +1 -1
- package/dist/core/SessionManager.d.ts +15 -6
- package/dist/core/SessionManager.d.ts.map +1 -1
- package/dist/core/SessionManager.js +46 -19
- package/dist/core/SessionManager.js.map +1 -1
- package/dist/core/SignalCoordinator.d.ts +5 -5
- package/dist/core/SignalCoordinator.d.ts.map +1 -1
- package/dist/core/SignalCoordinator.js +2 -2
- package/dist/core/SignalCoordinator.js.map +1 -1
- package/dist/core/SignalEvaluator.d.ts +4 -4
- package/dist/core/SignalEvaluator.d.ts.map +1 -1
- package/dist/core/SignalEvaluator.js +2 -2
- package/dist/core/SignalEvaluator.js.map +1 -1
- package/dist/core/SignalProcessor.d.ts +6 -6
- package/dist/core/SignalProcessor.d.ts.map +1 -1
- package/dist/core/SignalProcessor.js +7 -79
- package/dist/core/SignalProcessor.js.map +1 -1
- package/dist/core/Step.d.ts +5 -5
- package/dist/core/Step.d.ts.map +1 -1
- package/dist/core/Step.js +53 -5
- package/dist/core/Step.js.map +1 -1
- package/dist/core/StepLifecycle.d.ts +18 -8
- package/dist/core/StepLifecycle.d.ts.map +1 -1
- package/dist/core/StepLifecycle.js +98 -15
- package/dist/core/StepLifecycle.js.map +1 -1
- package/dist/core/StreamingToolExecutor.d.ts +1 -1
- package/dist/core/StreamingToolExecutor.d.ts.map +1 -1
- package/dist/core/StreamingToolExecutor.js +29 -5
- package/dist/core/StreamingToolExecutor.js.map +1 -1
- package/dist/core/ToolLoopExecutor.d.ts +8 -4
- package/dist/core/ToolLoopExecutor.d.ts.map +1 -1
- package/dist/core/ToolLoopExecutor.js +157 -65
- package/dist/core/ToolLoopExecutor.js.map +1 -1
- package/dist/core/ToolManager.d.ts +6 -6
- package/dist/core/ToolManager.d.ts.map +1 -1
- package/dist/core/ToolManager.js +44 -21
- package/dist/core/ToolManager.js.map +1 -1
- package/dist/core/createAgent.d.ts +2 -2
- package/dist/core/createAgent.d.ts.map +1 -1
- package/dist/core/createAgent.js +1 -1
- package/dist/core/createAgent.js.map +1 -1
- package/dist/core/flow-namespace.d.ts +16 -1
- package/dist/core/flow-namespace.d.ts.map +1 -1
- package/dist/core/flow-namespace.js +23 -1
- package/dist/core/flow-namespace.js.map +1 -1
- package/dist/core/toolGates.d.ts +1 -1
- package/dist/core/toolGates.d.ts.map +1 -1
- package/dist/core/toolGates.js +1 -1
- package/dist/core/toolGates.js.map +1 -1
- package/dist/index.d.ts +50 -45
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +34 -30
- package/dist/index.js.map +1 -1
- package/dist/providers/AnthropicProvider.d.ts +25 -35
- package/dist/providers/AnthropicProvider.d.ts.map +1 -1
- package/dist/providers/AnthropicProvider.js +30 -423
- package/dist/providers/AnthropicProvider.js.map +1 -1
- package/dist/providers/DeepSeekProvider.d.ts +13 -34
- package/dist/providers/DeepSeekProvider.d.ts.map +1 -1
- package/dist/providers/DeepSeekProvider.js +16 -47
- package/dist/providers/DeepSeekProvider.js.map +1 -1
- package/dist/providers/GeminiProvider.d.ts +22 -75
- package/dist/providers/GeminiProvider.d.ts.map +1 -1
- package/dist/providers/GeminiProvider.js +32 -558
- package/dist/providers/GeminiProvider.js.map +1 -1
- package/dist/providers/GenericOpenAICompatibleProvider.d.ts +9 -10
- package/dist/providers/GenericOpenAICompatibleProvider.d.ts.map +1 -1
- package/dist/providers/GenericOpenAICompatibleProvider.js +13 -16
- package/dist/providers/GenericOpenAICompatibleProvider.js.map +1 -1
- package/dist/providers/OpenAICompatibleProvider.d.ts +26 -135
- package/dist/providers/OpenAICompatibleProvider.d.ts.map +1 -1
- package/dist/providers/OpenAICompatibleProvider.js +39 -495
- package/dist/providers/OpenAICompatibleProvider.js.map +1 -1
- package/dist/providers/OpenAIProvider.d.ts +14 -20
- package/dist/providers/OpenAIProvider.d.ts.map +1 -1
- package/dist/providers/OpenAIProvider.js +20 -24
- package/dist/providers/OpenAIProvider.js.map +1 -1
- package/dist/providers/OpenRouterProvider.d.ts +20 -24
- package/dist/providers/OpenRouterProvider.d.ts.map +1 -1
- package/dist/providers/OpenRouterProvider.js +21 -34
- package/dist/providers/OpenRouterProvider.js.map +1 -1
- package/dist/providers/ProviderAdapter.d.ts +94 -0
- package/dist/providers/ProviderAdapter.d.ts.map +1 -0
- package/dist/providers/ProviderAdapter.js +251 -0
- package/dist/providers/ProviderAdapter.js.map +1 -0
- package/dist/providers/index.d.ts +21 -18
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +13 -10
- package/dist/providers/index.js.map +1 -1
- package/dist/types/agent.d.ts +37 -11
- package/dist/types/agent.d.ts.map +1 -1
- package/dist/types/ai.d.ts +11 -21
- package/dist/types/ai.d.ts.map +1 -1
- package/dist/types/compaction.d.ts +2 -2
- package/dist/types/compaction.d.ts.map +1 -1
- package/dist/types/errors.d.ts +16 -20
- package/dist/types/errors.d.ts.map +1 -1
- package/dist/types/errors.js +15 -16
- package/dist/types/errors.js.map +1 -1
- package/dist/types/flow.d.ts +56 -39
- 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 +17 -17
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +4 -4
- package/dist/types/index.js.map +1 -1
- package/dist/types/persistence.d.ts +2 -2
- package/dist/types/persistence.d.ts.map +1 -1
- package/dist/types/session.d.ts +4 -4
- package/dist/types/session.d.ts.map +1 -1
- package/dist/types/signals.d.ts +3 -3
- package/dist/types/signals.d.ts.map +1 -1
- package/dist/types/template.d.ts +2 -2
- package/dist/types/template.d.ts.map +1 -1
- package/dist/types/tool.d.ts +4 -2
- package/dist/types/tool.d.ts.map +1 -1
- package/dist/types/tool.js.map +1 -1
- package/dist/utils/condition.d.ts +1 -1
- package/dist/utils/condition.d.ts.map +1 -1
- package/dist/utils/condition.js +2 -2
- package/dist/utils/condition.js.map +1 -1
- package/dist/utils/event.d.ts +1 -1
- package/dist/utils/event.d.ts.map +1 -1
- package/dist/utils/event.js +1 -1
- package/dist/utils/event.js.map +1 -1
- package/dist/utils/history.d.ts +2 -2
- package/dist/utils/history.d.ts.map +1 -1
- package/dist/utils/history.js +1 -1
- package/dist/utils/history.js.map +1 -1
- package/dist/utils/index.d.ts +11 -13
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +11 -12
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/serialize.d.ts +17 -0
- package/dist/utils/serialize.d.ts.map +1 -1
- package/dist/utils/serialize.js +31 -0
- package/dist/utils/serialize.js.map +1 -1
- package/dist/utils/session.d.ts +23 -3
- package/dist/utils/session.d.ts.map +1 -1
- package/dist/utils/session.js +35 -6
- package/dist/utils/session.js.map +1 -1
- package/dist/utils/template.d.ts +3 -3
- package/dist/utils/template.d.ts.map +1 -1
- package/dist/utils/template.js +1 -1
- package/dist/utils/template.js.map +1 -1
- package/docs/concepts/architecture.md +3 -3
- package/docs/concepts/directives.md +1 -1
- package/docs/guides/error-handling.md +46 -45
- package/docs/guides/flow-control.md +8 -1
- package/docs/guides/instructions.md +15 -6
- package/docs/guides/persistence.md +12 -5
- package/docs/guides/streaming.md +10 -0
- package/docs/migration/README.md +4 -0
- package/docs/migration/v2-3-to-v2-4.md +4 -0
- package/docs/migration/v2-6-to-v2-7.md +246 -0
- package/docs/reference/adapters.md +15 -1
- package/docs/reference/branches.md +2 -0
- package/docs/reference/create-agent.md +28 -0
- package/docs/reference/directive.md +1 -1
- package/docs/reference/errors.md +30 -32
- package/docs/reference/providers.md +63 -60
- package/docs/reference/step.md +28 -21
- package/docs/reference/tool.md +14 -5
- package/docs/start/02-first-agent.md +8 -4
- package/docs/start/03-collect-data.md +19 -10
- package/examples/01-quickstart.ts +2 -2
- package/examples/02-data-extraction.ts +1 -1
- package/examples/03-tools.ts +1 -1
- package/examples/04-instructions.ts +2 -2
- package/examples/05-branching.ts +3 -3
- package/examples/06-flow-control.ts +3 -3
- package/examples/07-streaming.ts +1 -1
- package/examples/08-persistence.ts +2 -2
- package/examples/09-signals.ts +1 -1
- package/examples/tsconfig.json +6 -3
- package/package.json +9 -7
- package/src/adapters/MemoryAdapter.ts +33 -37
- package/src/adapters/MongoAdapter.ts +3 -3
- package/src/adapters/OpenSearchAdapter.ts +4 -4
- package/src/adapters/PostgreSQLAdapter.ts +26 -21
- package/src/adapters/PrismaAdapter.ts +4 -4
- package/src/adapters/RedisAdapter.ts +84 -37
- package/src/adapters/SQLiteAdapter.ts +13 -34
- package/src/adapters/index.ts +13 -13
- package/src/adapters/sessionRow.ts +57 -0
- package/src/core/Agent.ts +64 -18
- package/src/core/AutoChainExecutor.ts +44 -57
- package/src/core/BranchEvaluator.ts +5 -5
- package/src/core/CompactionEngine.ts +42 -8
- package/src/core/DirectiveChainTracker.ts +3 -3
- package/src/core/Events.ts +2 -2
- package/src/core/Flow.ts +9 -9
- package/src/core/FlowRouter.ts +46 -20
- package/src/core/PersistenceManager.ts +4 -4
- package/src/core/PromptComposer.ts +8 -8
- package/src/core/PromptSectionCache.ts +2 -2
- package/src/core/ResponseEngine.ts +6 -6
- package/src/core/ResponseGenerationError.ts +3 -6
- package/src/core/ResponseModal.ts +205 -39
- package/src/core/ResponsePipeline.ts +301 -107
- package/src/core/SessionFinalizer.ts +40 -10
- package/src/core/SessionManager.ts +61 -27
- package/src/core/SignalCoordinator.ts +7 -7
- package/src/core/SignalEvaluator.ts +6 -6
- package/src/core/SignalProcessor.ts +13 -93
- package/src/core/Step.ts +87 -10
- package/src/core/StepLifecycle.ts +129 -26
- package/src/core/StreamingToolExecutor.ts +33 -8
- package/src/core/ToolLoopExecutor.ts +206 -80
- package/src/core/ToolManager.ts +53 -26
- package/src/core/createAgent.ts +2 -2
- package/src/core/flow-namespace.ts +31 -2
- package/src/core/toolGates.ts +2 -2
- package/src/index.ts +59 -45
- package/src/providers/AnthropicProvider.ts +44 -595
- package/src/providers/DeepSeekProvider.ts +27 -92
- package/src/providers/GeminiProvider.ts +41 -752
- package/src/providers/GenericOpenAICompatibleProvider.ts +19 -27
- package/src/providers/OpenAICompatibleProvider.ts +58 -764
- package/src/providers/OpenAIProvider.ts +31 -55
- package/src/providers/OpenRouterProvider.ts +40 -70
- package/src/providers/ProviderAdapter.ts +368 -0
- package/src/providers/index.ts +21 -23
- package/src/types/agent.ts +36 -11
- package/src/types/ai.ts +11 -21
- package/src/types/compaction.ts +2 -2
- package/src/types/errors.ts +17 -35
- package/src/types/flow.ts +44 -46
- package/src/types/history.ts +1 -1
- package/src/types/index.ts +18 -17
- package/src/types/persistence.ts +2 -2
- package/src/types/session.ts +4 -4
- package/src/types/signals.ts +3 -3
- package/src/types/template.ts +2 -2
- package/src/types/tool.ts +4 -2
- package/src/utils/condition.ts +3 -3
- package/src/utils/event.ts +1 -1
- package/src/utils/history.ts +3 -3
- package/src/utils/index.ts +14 -15
- package/src/utils/serialize.ts +38 -0
- package/src/utils/session.ts +46 -9
- package/src/utils/template.ts +3 -3
- package/dist/cjs/core/DirectiveBus.d.ts +0 -88
- package/dist/cjs/core/DirectiveBus.d.ts.map +0 -1
- package/dist/cjs/core/DirectiveBus.js +0 -196
- package/dist/cjs/core/DirectiveBus.js.map +0 -1
- package/dist/cjs/providers/errorClassification.d.ts +0 -61
- package/dist/cjs/providers/errorClassification.d.ts.map +0 -1
- package/dist/cjs/providers/errorClassification.js +0 -123
- package/dist/cjs/providers/errorClassification.js.map +0 -1
- package/dist/cjs/utils/retry.d.ts +0 -67
- package/dist/cjs/utils/retry.d.ts.map +0 -1
- package/dist/cjs/utils/retry.js +0 -201
- package/dist/cjs/utils/retry.js.map +0 -1
- package/dist/core/DirectiveBus.d.ts +0 -88
- package/dist/core/DirectiveBus.d.ts.map +0 -1
- package/dist/core/DirectiveBus.js +0 -192
- package/dist/core/DirectiveBus.js.map +0 -1
- package/dist/providers/errorClassification.d.ts +0 -61
- package/dist/providers/errorClassification.d.ts.map +0 -1
- package/dist/providers/errorClassification.js +0 -116
- package/dist/providers/errorClassification.js.map +0 -1
- package/dist/utils/retry.d.ts +0 -67
- package/dist/utils/retry.d.ts.map +0 -1
- package/dist/utils/retry.js +0 -193
- package/dist/utils/retry.js.map +0 -1
- package/src/core/DirectiveBus.ts +0 -248
- package/src/providers/errorClassification.ts +0 -172
- package/src/utils/retry.ts +0 -274
|
@@ -1,786 +1,80 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Shared base
|
|
3
|
-
*
|
|
2
|
+
* Shared base for OpenAI-compatible chat-completions providers (OpenAI,
|
|
3
|
+
* DeepSeek, OpenRouter, and anything else speaking the dialect).
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* the protected hooks.
|
|
5
|
+
* Everything that used to live here — message building, tool-call assembly,
|
|
6
|
+
* streaming, retry, backup models, error wrapping — is now in
|
|
7
|
+
* `@providerkit/core` and `ProviderAdapter`. What is left is the one decision
|
|
8
|
+
* this layer still owns: which wire a structured request goes out on.
|
|
10
9
|
*/
|
|
11
10
|
|
|
12
|
-
import
|
|
13
|
-
import type {
|
|
14
|
-
ChatCompletionChunk,
|
|
15
|
-
ChatCompletionCreateParamsNonStreaming,
|
|
16
|
-
ChatCompletionCreateParamsStreaming,
|
|
17
|
-
} from "openai/resources/chat/completions";
|
|
18
|
-
import { FunctionParameters } from "openai/resources/shared.mjs";
|
|
11
|
+
import { createOpenAIProvider, createResponsesProvider, type Provider } from "@providerkit/core";
|
|
19
12
|
|
|
20
|
-
import type
|
|
21
|
-
AiProvider,
|
|
22
|
-
GenerateMessageInput,
|
|
23
|
-
GenerateMessageOutput,
|
|
24
|
-
GenerateMessageStreamChunk,
|
|
25
|
-
AgentStructuredResponse,
|
|
26
|
-
StructuredSchema,
|
|
27
|
-
} from "../types";
|
|
28
|
-
import type { ProviderCapabilities } from "../types/ai";
|
|
29
|
-
import type { HistoryItem } from "../types/history";
|
|
30
|
-
import { withTimeoutAndRetry, withStreamRetry, resolveRetryConfig, logger, assertUsableCompletion, combineAbortSignals } from "../utils";
|
|
31
|
-
import {
|
|
32
|
-
classifyProviderError,
|
|
33
|
-
getErrorMessage,
|
|
34
|
-
isBackupEligible,
|
|
35
|
-
toProviderError,
|
|
36
|
-
type ErrorClassificationOptions,
|
|
37
|
-
} from "./errorClassification";
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Default request parameters shared by OpenAI-compatible providers
|
|
41
|
-
*/
|
|
42
|
-
export type OpenAICompatibleRequestConfig = Partial<
|
|
43
|
-
Omit<ChatCompletionCreateParamsNonStreaming, "model" | "messages">
|
|
44
|
-
>;
|
|
13
|
+
import { ProviderAdapter, type ProviderAdapterInit, type RequestConfig } from "./ProviderAdapter.js";
|
|
45
14
|
|
|
46
15
|
/**
|
|
47
16
|
* How structured (JSON-schema) output is requested from the endpoint:
|
|
48
|
-
* - `"responses_parse"`
|
|
49
|
-
*
|
|
50
|
-
* - `"json_schema"` — chat completions with a `json_schema`
|
|
51
|
-
* The broadest enforced mode (DeepSeek, Groq, Together, Fireworks, vLLM
|
|
52
|
-
* - `"json_object"` — chat completions with
|
|
53
|
-
*
|
|
17
|
+
* - `"responses_parse"` — OpenAI's Responses API, which enforces the schema
|
|
18
|
+
* natively. Most compatible endpoints do not implement it.
|
|
19
|
+
* - `"json_schema"` — chat completions with a `json_schema` response format.
|
|
20
|
+
* The broadest enforced mode (DeepSeek, Groq, Together, Fireworks, vLLM…).
|
|
21
|
+
* - `"json_object"` — chat completions with plain JSON mode, for servers with
|
|
22
|
+
* no schema enforcement at all. The caller validates.
|
|
54
23
|
*/
|
|
55
24
|
export type StructuredOutputMode = "responses_parse" | "json_schema" | "json_object";
|
|
56
25
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
/** Backup models to try if primary fails (default: []) */
|
|
66
|
-
backupModels?: string[];
|
|
67
|
-
/** Default request parameters */
|
|
68
|
-
config?: OpenAICompatibleRequestConfig;
|
|
69
|
-
/** Retry configuration */
|
|
70
|
-
retryConfig?: {
|
|
71
|
-
timeout?: number;
|
|
72
|
-
retries?: number;
|
|
73
|
-
};
|
|
74
|
-
/**
|
|
75
|
-
* How structured output is requested (default `"responses_parse"`). Lifts the
|
|
76
|
-
* strategy that used to be a per-subclass override into shared config.
|
|
77
|
-
*/
|
|
26
|
+
export interface OpenAICompatibleProviderInit
|
|
27
|
+
extends Omit<ProviderAdapterInit, "provider"> {
|
|
28
|
+
apiKey: string;
|
|
29
|
+
baseUrl?: string;
|
|
30
|
+
/** Names the provider in errors, and picks core's effort dialect. */
|
|
31
|
+
id: string;
|
|
32
|
+
headers?: Record<string, string>;
|
|
33
|
+
config?: RequestConfig;
|
|
78
34
|
structuredOutput?: StructuredOutputMode;
|
|
35
|
+
/** OpenRouter upstream-host pin, to keep a conversation's prompt cache warm. */
|
|
36
|
+
providerOrder?: string[];
|
|
37
|
+
/** Replacement `fetch`, for tests that script the wire. */
|
|
38
|
+
fetchImpl?: typeof fetch;
|
|
79
39
|
}
|
|
80
40
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
* backup models and retry logic.
|
|
84
|
-
*/
|
|
85
|
-
export abstract class OpenAICompatibleProvider implements AiProvider {
|
|
86
|
-
public abstract readonly name: string;
|
|
87
|
-
public abstract readonly capabilities: ProviderCapabilities;
|
|
88
|
-
|
|
89
|
-
/** Uppercase tag used in log lines, e.g. "OPENAI" */
|
|
90
|
-
protected abstract readonly logLabel: string;
|
|
91
|
-
/** Human-readable name used in retry/error messages, e.g. "OpenAI" */
|
|
92
|
-
protected abstract readonly displayName: string;
|
|
93
|
-
|
|
94
|
-
protected readonly client: OpenAI;
|
|
95
|
-
protected readonly primaryModel: string;
|
|
96
|
-
protected readonly backupModels: string[];
|
|
97
|
-
protected readonly config?: OpenAICompatibleRequestConfig;
|
|
98
|
-
protected readonly retryConfig: { timeout: number; retries: number };
|
|
99
|
-
/** Structured-output strategy; see {@link StructuredOutputMode}. */
|
|
100
|
-
protected readonly structuredOutput: StructuredOutputMode;
|
|
101
|
-
|
|
102
|
-
/**
|
|
103
|
-
* Provider-specific error classification signals.
|
|
104
|
-
* model_not_found/model_overloaded historically triggered backup models.
|
|
105
|
-
*/
|
|
106
|
-
protected readonly classificationOptions: ErrorClassificationOptions = {
|
|
107
|
-
overloadedCodes: ["model_not_found", "model_overloaded"],
|
|
108
|
-
};
|
|
41
|
+
export abstract class OpenAICompatibleProvider extends ProviderAdapter {
|
|
42
|
+
protected readonly config?: RequestConfig;
|
|
109
43
|
|
|
110
44
|
protected constructor(init: OpenAICompatibleProviderInit) {
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
// ---------------------------------------------------------------------
|
|
120
|
-
// Public API
|
|
121
|
-
// ---------------------------------------------------------------------
|
|
122
|
-
|
|
123
|
-
async generateMessage<
|
|
124
|
-
TContext = unknown,
|
|
125
|
-
TStructured = AgentStructuredResponse
|
|
126
|
-
>(
|
|
127
|
-
input: GenerateMessageInput<TContext>
|
|
128
|
-
): Promise<GenerateMessageOutput<TStructured>> {
|
|
129
|
-
return this.generateWithBackup<TContext, TStructured>(input);
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
async *generateMessageStream<
|
|
133
|
-
TContext = unknown,
|
|
134
|
-
TStructured = AgentStructuredResponse
|
|
135
|
-
>(
|
|
136
|
-
input: GenerateMessageInput<TContext>
|
|
137
|
-
): AsyncGenerator<GenerateMessageStreamChunk<TStructured>> {
|
|
138
|
-
yield* this.generateStreamWithBackup<TContext, TStructured>(input);
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
// ---------------------------------------------------------------------
|
|
142
|
-
// Provider-specific hooks
|
|
143
|
-
// ---------------------------------------------------------------------
|
|
144
|
-
|
|
145
|
-
/**
|
|
146
|
-
* Generate a structured (JSON schema) response. Default uses the
|
|
147
|
-
* responses.parse API (OpenAI, OpenRouter). Subclasses whose API lacks
|
|
148
|
-
* responses.parse (e.g. DeepSeek) override this to use chat completions
|
|
149
|
-
* with a structured response_format instead.
|
|
150
|
-
*/
|
|
151
|
-
protected async executeStructuredGenerate(
|
|
152
|
-
model: string,
|
|
153
|
-
input: GenerateMessageInput<unknown>,
|
|
154
|
-
jsonSchema: StructuredSchema
|
|
155
|
-
): Promise<GenerateMessageOutput> {
|
|
156
|
-
// Non-native modes go through chat completions, where
|
|
157
|
-
// `structuredResponseFormat` selects the response_format.
|
|
158
|
-
if (this.structuredOutput !== "responses_parse") {
|
|
159
|
-
return this.executeChatCompletion(model, input);
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
const response = await this.client.responses.parse(
|
|
163
|
-
{
|
|
164
|
-
model,
|
|
165
|
-
instructions: input.prompt,
|
|
166
|
-
input: "",
|
|
167
|
-
reasoning: {
|
|
168
|
-
effort: input.parameters?.reasoning?.effort || "low",
|
|
169
|
-
},
|
|
170
|
-
text: {
|
|
171
|
-
format: {
|
|
172
|
-
type: "json_schema",
|
|
173
|
-
name: input.parameters?.schemaName || "structured_output",
|
|
174
|
-
// Adapt common schema format to the provider's format
|
|
175
|
-
schema: this.adaptSchema(jsonSchema),
|
|
176
|
-
},
|
|
177
|
-
},
|
|
178
|
-
},
|
|
179
|
-
{ signal: input.signal }
|
|
180
|
-
);
|
|
181
|
-
|
|
182
|
-
if (!response.output_parsed) {
|
|
183
|
-
throw new Error(`No parsed output returned from ${this.displayName}`);
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
const structured = response.output_parsed as AgentStructuredResponse;
|
|
187
|
-
const message = structured.message;
|
|
188
|
-
|
|
189
|
-
return {
|
|
190
|
-
message,
|
|
191
|
-
metadata: {
|
|
192
|
-
model: response.model,
|
|
193
|
-
tokensUsed: response.usage?.total_tokens,
|
|
194
|
-
promptTokens: response.usage?.input_tokens,
|
|
195
|
-
completionTokens: response.usage?.output_tokens,
|
|
196
|
-
},
|
|
197
|
-
structured,
|
|
198
|
-
};
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
/**
|
|
202
|
-
* response_format applied to chat-completions requests when a JSON schema is
|
|
203
|
-
* present, selected by {@link StructuredOutputMode}: `"json_schema"` for native
|
|
204
|
-
* enforcement, else a generic JSON object parsed at the end. (`"responses_parse"`
|
|
205
|
-
* never reaches chat completions for non-streaming, but streaming has no parse
|
|
206
|
-
* API, so it falls back to `json_object` here.)
|
|
207
|
-
*/
|
|
208
|
-
protected structuredResponseFormat(
|
|
209
|
-
jsonSchema: StructuredSchema,
|
|
210
|
-
schemaName: string | undefined
|
|
211
|
-
): ChatCompletionCreateParamsNonStreaming["response_format"] {
|
|
212
|
-
if (this.structuredOutput === "json_schema") {
|
|
213
|
-
return {
|
|
214
|
-
type: "json_schema" as const,
|
|
215
|
-
json_schema: {
|
|
216
|
-
name: schemaName || "structured_output",
|
|
217
|
-
schema: this.adaptSchema(jsonSchema),
|
|
218
|
-
},
|
|
219
|
-
};
|
|
220
|
-
}
|
|
221
|
-
return { type: "json_object" };
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
/**
|
|
225
|
-
* Hook for provider-specific streaming request parameters
|
|
226
|
-
* (e.g. DeepSeek's stream_options.include_usage).
|
|
227
|
-
*/
|
|
228
|
-
protected configureStreamParams(
|
|
229
|
-
_params: ChatCompletionCreateParamsStreaming
|
|
230
|
-
): void {
|
|
231
|
-
// Default: no extra parameters
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
/**
|
|
235
|
-
* Hook for provider-specific stream delta handling
|
|
236
|
-
* (e.g. DeepSeek's reasoning_content).
|
|
237
|
-
*/
|
|
238
|
-
protected onStreamDelta(_delta: ChatCompletionChunk.Choice.Delta): void {
|
|
239
|
-
// Default: no extra handling
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
// ---------------------------------------------------------------------
|
|
243
|
-
// Shared building blocks
|
|
244
|
-
// ---------------------------------------------------------------------
|
|
245
|
-
|
|
246
|
-
/**
|
|
247
|
-
* Adapt common schema format to the provider's format.
|
|
248
|
-
* OpenAI-compatible APIs use standard JSON Schema, so this is a
|
|
249
|
-
* passthrough.
|
|
250
|
-
*/
|
|
251
|
-
protected adaptSchema(schema: StructuredSchema): Record<string, unknown> {
|
|
252
|
-
// Our StructuredSchema is already JSON Schema compatible
|
|
253
|
-
return schema;
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
/**
|
|
257
|
-
* Build OpenAI-formatted messages from HistoryItem[] array.
|
|
258
|
-
* Maps directly to ChatCompletionMessageParam format.
|
|
259
|
-
*/
|
|
260
|
-
protected buildChatMessages(history: HistoryItem[]): Array<unknown> {
|
|
261
|
-
const messages: Array<unknown> = [];
|
|
262
|
-
|
|
263
|
-
for (const item of history) {
|
|
264
|
-
switch (item.role) {
|
|
265
|
-
case "system":
|
|
266
|
-
messages.push({ role: "system", content: item.content });
|
|
267
|
-
break;
|
|
268
|
-
case "user":
|
|
269
|
-
messages.push({ role: "user", content: item.content });
|
|
270
|
-
break;
|
|
271
|
-
case "assistant":
|
|
272
|
-
if (item.tool_calls && item.tool_calls.length > 0) {
|
|
273
|
-
messages.push({
|
|
274
|
-
role: "assistant",
|
|
275
|
-
content: item.content || null,
|
|
276
|
-
tool_calls: item.tool_calls.map((tc) => ({
|
|
277
|
-
id: tc.id,
|
|
278
|
-
type: "function",
|
|
279
|
-
function: {
|
|
280
|
-
name: tc.name,
|
|
281
|
-
arguments: JSON.stringify(tc.arguments),
|
|
282
|
-
},
|
|
283
|
-
})),
|
|
284
|
-
});
|
|
285
|
-
} else {
|
|
286
|
-
messages.push({ role: "assistant", content: item.content || "" });
|
|
287
|
-
}
|
|
288
|
-
break;
|
|
289
|
-
case "tool":
|
|
290
|
-
messages.push({
|
|
291
|
-
role: "tool",
|
|
292
|
-
tool_call_id: item.tool_call_id,
|
|
293
|
-
content:
|
|
294
|
-
typeof item.content === "string"
|
|
295
|
-
? item.content
|
|
296
|
-
: JSON.stringify(item.content),
|
|
297
|
-
});
|
|
298
|
-
break;
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
return messages;
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
/**
|
|
306
|
-
* Map framework tool definitions to OpenAI function tools.
|
|
307
|
-
*/
|
|
308
|
-
private buildToolParams(
|
|
309
|
-
tools: NonNullable<GenerateMessageInput<unknown>["tools"]>
|
|
310
|
-
): ChatCompletionCreateParamsNonStreaming["tools"] {
|
|
311
|
-
return tools.map((tool) => ({
|
|
312
|
-
type: "function" as const,
|
|
313
|
-
function: {
|
|
314
|
-
name: tool.name || tool.id,
|
|
315
|
-
description: tool.description,
|
|
316
|
-
parameters: tool.parameters as FunctionParameters, // JSON schema
|
|
317
|
-
},
|
|
318
|
-
}));
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
/**
|
|
322
|
-
* Parse tool calls from a (complete or delta) tool_calls array,
|
|
323
|
-
* tolerating malformed JSON arguments.
|
|
324
|
-
*/
|
|
325
|
-
private parseToolCallArguments(
|
|
326
|
-
rawArguments: string | undefined,
|
|
327
|
-
streaming: boolean
|
|
328
|
-
): Record<string, unknown> {
|
|
329
|
-
if (!rawArguments) {
|
|
330
|
-
return {};
|
|
331
|
-
}
|
|
332
|
-
try {
|
|
333
|
-
return JSON.parse(rawArguments) as Record<string, unknown>;
|
|
334
|
-
} catch (error) {
|
|
335
|
-
logger.warn(
|
|
336
|
-
`[${this.logLabel}] Failed to parse tool call arguments${
|
|
337
|
-
streaming ? " in stream" : ""
|
|
338
|
-
}: ${getErrorMessage(error)}`
|
|
339
|
-
);
|
|
340
|
-
return {};
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
/**
|
|
345
|
-
* Determines if an error should trigger backup model usage.
|
|
346
|
-
* Derived from the normalized error classification.
|
|
347
|
-
*/
|
|
348
|
-
protected shouldUseBackupModel(error: unknown): boolean {
|
|
349
|
-
return isBackupEligible(
|
|
350
|
-
classifyProviderError(error, this.classificationOptions)
|
|
351
|
-
);
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
/**
|
|
355
|
-
* Wrap a terminal failure in a normalized ProviderError.
|
|
356
|
-
*/
|
|
357
|
-
protected wrapTerminalError(error: unknown): Error {
|
|
358
|
-
return toProviderError(error, this.name, this.classificationOptions);
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
// ---------------------------------------------------------------------
|
|
362
|
-
// Generation with backup models
|
|
363
|
-
// ---------------------------------------------------------------------
|
|
364
|
-
|
|
365
|
-
private async generateWithBackup<
|
|
366
|
-
TContext = unknown,
|
|
367
|
-
TStructured = AgentStructuredResponse
|
|
368
|
-
>(
|
|
369
|
-
input: GenerateMessageInput<TContext>
|
|
370
|
-
): Promise<GenerateMessageOutput<TStructured>> {
|
|
371
|
-
// Try primary model first
|
|
372
|
-
try {
|
|
373
|
-
return await this.generateWithModel<TContext, TStructured>(
|
|
374
|
-
this.primaryModel,
|
|
375
|
-
input
|
|
376
|
-
);
|
|
377
|
-
} catch (primaryError: unknown) {
|
|
378
|
-
const primaryErrMsg = getErrorMessage(primaryError);
|
|
379
|
-
logger.warn(
|
|
380
|
-
`[${this.logLabel}] Primary model ${this.primaryModel} failed: ${primaryErrMsg}`
|
|
381
|
-
);
|
|
382
|
-
|
|
383
|
-
if (!this.shouldUseBackupModel(primaryError)) {
|
|
384
|
-
throw this.wrapTerminalError(primaryError);
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
logger.debug(`[${this.logLabel}] Trying backup models`);
|
|
388
|
-
|
|
389
|
-
let lastBackupError: unknown = primaryError;
|
|
390
|
-
|
|
391
|
-
for (let i = 0; i < this.backupModels.length; i++) {
|
|
392
|
-
const backupModel = this.backupModels[i];
|
|
393
|
-
logger.debug(
|
|
394
|
-
`[${this.logLabel}] Trying backup model ${i + 1}/${
|
|
395
|
-
this.backupModels.length
|
|
396
|
-
}: ${backupModel}`
|
|
397
|
-
);
|
|
398
|
-
|
|
399
|
-
try {
|
|
400
|
-
const result = await this.generateWithModel<TContext, TStructured>(
|
|
401
|
-
backupModel,
|
|
402
|
-
input
|
|
403
|
-
);
|
|
404
|
-
logger.debug(`[${this.logLabel}] Backup model ${backupModel} succeeded`);
|
|
405
|
-
return result;
|
|
406
|
-
} catch (backupError: unknown) {
|
|
407
|
-
const backupErrMsg = getErrorMessage(backupError);
|
|
408
|
-
logger.warn(
|
|
409
|
-
`[${this.logLabel}] Backup model ${backupModel} failed: ${backupErrMsg}`
|
|
410
|
-
);
|
|
411
|
-
lastBackupError = backupError;
|
|
412
|
-
|
|
413
|
-
if (
|
|
414
|
-
!this.shouldUseBackupModel(backupError) &&
|
|
415
|
-
i < this.backupModels.length - 1
|
|
416
|
-
) {
|
|
417
|
-
logger.debug(
|
|
418
|
-
`[${this.logLabel}] Backup model error doesn't qualify for further attempts`
|
|
419
|
-
);
|
|
420
|
-
break;
|
|
421
|
-
}
|
|
422
|
-
}
|
|
423
|
-
}
|
|
424
|
-
|
|
425
|
-
const lastBackupErrMsg = getErrorMessage(lastBackupError);
|
|
426
|
-
logger.error(
|
|
427
|
-
`[${this.logLabel}] All models failed. Primary: ${primaryErrMsg}, Last backup: ${lastBackupErrMsg}`
|
|
428
|
-
);
|
|
429
|
-
throw this.wrapTerminalError(lastBackupError);
|
|
430
|
-
}
|
|
431
|
-
}
|
|
432
|
-
|
|
433
|
-
private async *generateStreamWithBackup<
|
|
434
|
-
TContext = unknown,
|
|
435
|
-
TStructured = AgentStructuredResponse
|
|
436
|
-
>(
|
|
437
|
-
input: GenerateMessageInput<TContext>
|
|
438
|
-
): AsyncGenerator<GenerateMessageStreamChunk<TStructured>> {
|
|
439
|
-
// Try primary model first
|
|
440
|
-
try {
|
|
441
|
-
yield* withStreamRetry(
|
|
442
|
-
(signal) => this.generateStreamWithModel<TContext, TStructured>(this.primaryModel, input, signal),
|
|
443
|
-
{ maxRetries: this.retryConfig.retries, firstChunkTimeoutMs: this.retryConfig.timeout, operationName: `${this.logLabel} ${this.primaryModel} stream` }
|
|
444
|
-
);
|
|
445
|
-
} catch (primaryError: unknown) {
|
|
446
|
-
const primaryErrMsg = getErrorMessage(primaryError);
|
|
447
|
-
logger.warn(
|
|
448
|
-
`[${this.logLabel}] Primary model ${this.primaryModel} failed: ${primaryErrMsg}`
|
|
449
|
-
);
|
|
450
|
-
|
|
451
|
-
if (!this.shouldUseBackupModel(primaryError)) {
|
|
452
|
-
throw this.wrapTerminalError(primaryError);
|
|
453
|
-
}
|
|
454
|
-
|
|
455
|
-
logger.debug(`[${this.logLabel}] Trying backup models for streaming`);
|
|
456
|
-
|
|
457
|
-
let lastBackupError: unknown = primaryError;
|
|
458
|
-
|
|
459
|
-
for (let i = 0; i < this.backupModels.length; i++) {
|
|
460
|
-
const backupModel = this.backupModels[i];
|
|
461
|
-
logger.debug(
|
|
462
|
-
`[${this.logLabel}] Trying backup model ${i + 1}/${
|
|
463
|
-
this.backupModels.length
|
|
464
|
-
}: ${backupModel}`
|
|
465
|
-
);
|
|
466
|
-
|
|
467
|
-
try {
|
|
468
|
-
yield* withStreamRetry(
|
|
469
|
-
(signal) => this.generateStreamWithModel<TContext, TStructured>(backupModel, input, signal),
|
|
470
|
-
{ maxRetries: this.retryConfig.retries, firstChunkTimeoutMs: this.retryConfig.timeout, operationName: `${this.logLabel} ${backupModel} stream` }
|
|
471
|
-
);
|
|
472
|
-
logger.debug(`[${this.logLabel}] Backup model ${backupModel} succeeded`);
|
|
473
|
-
return;
|
|
474
|
-
} catch (backupError: unknown) {
|
|
475
|
-
const backupErrMsg = getErrorMessage(backupError);
|
|
476
|
-
logger.warn(
|
|
477
|
-
`[${this.logLabel}] Backup model ${backupModel} failed: ${backupErrMsg}`
|
|
478
|
-
);
|
|
479
|
-
lastBackupError = backupError;
|
|
480
|
-
|
|
481
|
-
if (
|
|
482
|
-
!this.shouldUseBackupModel(backupError) &&
|
|
483
|
-
i < this.backupModels.length - 1
|
|
484
|
-
) {
|
|
485
|
-
logger.debug(
|
|
486
|
-
`[${this.logLabel}] Backup model error doesn't qualify for further attempts`
|
|
487
|
-
);
|
|
488
|
-
break;
|
|
489
|
-
}
|
|
490
|
-
}
|
|
491
|
-
}
|
|
492
|
-
|
|
493
|
-
const lastBackupErrMsg = getErrorMessage(lastBackupError);
|
|
494
|
-
logger.error(
|
|
495
|
-
`[${this.logLabel}] All models failed. Primary: ${primaryErrMsg}, Last backup: ${lastBackupErrMsg}`
|
|
496
|
-
);
|
|
497
|
-
throw this.wrapTerminalError(lastBackupError);
|
|
498
|
-
}
|
|
499
|
-
}
|
|
500
|
-
|
|
501
|
-
// ---------------------------------------------------------------------
|
|
502
|
-
// Non-streaming generation
|
|
503
|
-
// ---------------------------------------------------------------------
|
|
504
|
-
|
|
505
|
-
private async generateWithModel<
|
|
506
|
-
TContext = unknown,
|
|
507
|
-
TStructured = AgentStructuredResponse
|
|
508
|
-
>(
|
|
509
|
-
model: string,
|
|
510
|
-
input: GenerateMessageInput<TContext>
|
|
511
|
-
): Promise<GenerateMessageOutput<TStructured>> {
|
|
512
|
-
const operation = async (signal: AbortSignal): Promise<GenerateMessageOutput> => {
|
|
513
|
-
// Thread the per-attempt timeout signal through input.signal so whichever
|
|
514
|
-
// path runs — responses.parse (structured) or chat.completions — cancels
|
|
515
|
-
// its upstream call when the deadline fires.
|
|
516
|
-
const reqInput = { ...input, signal: combineAbortSignals(input.signal, signal) };
|
|
517
|
-
// Use structured output path if JSON schema is provided
|
|
518
|
-
if (reqInput.parameters?.jsonSchema) {
|
|
519
|
-
return this.executeStructuredGenerate(
|
|
520
|
-
model,
|
|
521
|
-
reqInput,
|
|
522
|
-
reqInput.parameters.jsonSchema
|
|
523
|
-
);
|
|
524
|
-
}
|
|
525
|
-
return this.executeChatCompletion(model, reqInput);
|
|
526
|
-
};
|
|
527
|
-
|
|
528
|
-
return withTimeoutAndRetry(
|
|
529
|
-
operation,
|
|
530
|
-
this.retryConfig.timeout,
|
|
531
|
-
this.retryConfig.retries,
|
|
532
|
-
`${this.displayName} ${model}`
|
|
533
|
-
) as Promise<GenerateMessageOutput<TStructured>>;
|
|
534
|
-
}
|
|
535
|
-
|
|
536
|
-
/**
|
|
537
|
-
* Non-streaming chat-completions request: builds messages/tools,
|
|
538
|
-
* extracts text and tool calls, and merges structured output.
|
|
539
|
-
*/
|
|
540
|
-
protected async executeChatCompletion(
|
|
541
|
-
model: string,
|
|
542
|
-
input: GenerateMessageInput<unknown>
|
|
543
|
-
): Promise<GenerateMessageOutput> {
|
|
544
|
-
const historyMessages = this.buildChatMessages(input.history);
|
|
545
|
-
historyMessages.push({ role: "user", content: input.prompt });
|
|
546
|
-
|
|
547
|
-
const params: ChatCompletionCreateParamsNonStreaming = {
|
|
548
|
-
model,
|
|
549
|
-
messages:
|
|
550
|
-
historyMessages as ChatCompletionCreateParamsNonStreaming["messages"],
|
|
551
|
-
...this.config,
|
|
552
|
-
};
|
|
553
|
-
|
|
554
|
-
// Override with input parameters if provided
|
|
555
|
-
if (input.parameters?.maxOutputTokens !== undefined) {
|
|
556
|
-
params.max_tokens = input.parameters.maxOutputTokens;
|
|
557
|
-
}
|
|
558
|
-
|
|
559
|
-
// Add tools if provided
|
|
560
|
-
if (input.tools && input.tools.length > 0) {
|
|
561
|
-
params.tools = this.buildToolParams(input.tools);
|
|
562
|
-
params.tool_choice = "auto";
|
|
563
|
-
}
|
|
564
|
-
|
|
565
|
-
// Use structured output format if JSON schema is provided
|
|
566
|
-
if (input.parameters?.jsonSchema) {
|
|
567
|
-
params.response_format = this.structuredResponseFormat(
|
|
568
|
-
input.parameters.jsonSchema,
|
|
569
|
-
input.parameters.schemaName
|
|
570
|
-
);
|
|
571
|
-
}
|
|
572
|
-
|
|
573
|
-
const response = await this.client.chat.completions.create(params, {
|
|
574
|
-
signal: input.signal,
|
|
45
|
+
const mode = init.structuredOutput ?? "responses_parse";
|
|
46
|
+
super({
|
|
47
|
+
provider: buildProvider(init, mode),
|
|
48
|
+
model: init.model,
|
|
49
|
+
...(init.config ? { defaults: init.config } : {}),
|
|
50
|
+
...(init.backupModels ? { backupModels: init.backupModels } : {}),
|
|
51
|
+
...(init.retryConfig ? { retryConfig: init.retryConfig } : {}),
|
|
575
52
|
});
|
|
576
|
-
|
|
577
|
-
const message = response.choices[0]?.message?.content || "";
|
|
578
|
-
|
|
579
|
-
let toolCalls: Array<{
|
|
580
|
-
toolName: string;
|
|
581
|
-
arguments: Record<string, unknown>;
|
|
582
|
-
}> = [];
|
|
583
|
-
if (response.choices?.[0]?.message?.tool_calls) {
|
|
584
|
-
toolCalls = response.choices[0].message.tool_calls
|
|
585
|
-
.filter((toolCall) => toolCall.type === "function")
|
|
586
|
-
.map((toolCall) => ({
|
|
587
|
-
toolName: toolCall.function.name,
|
|
588
|
-
arguments: this.parseToolCallArguments(
|
|
589
|
-
toolCall.function.arguments,
|
|
590
|
-
false
|
|
591
|
-
),
|
|
592
|
-
}));
|
|
593
|
-
}
|
|
594
|
-
|
|
595
|
-
// Only throw error if we have no text AND no function calls
|
|
596
|
-
if (!message && toolCalls.length === 0) {
|
|
597
|
-
throw new Error(`No response from ${this.displayName}`);
|
|
598
|
-
}
|
|
599
|
-
|
|
600
|
-
// Parse structured output if schema was provided
|
|
601
|
-
let structured: AgentStructuredResponse | undefined;
|
|
602
|
-
if (input.parameters?.jsonSchema && message) {
|
|
603
|
-
try {
|
|
604
|
-
structured = JSON.parse(message) as AgentStructuredResponse;
|
|
605
|
-
} catch (error) {
|
|
606
|
-
logger.warn(`[${this.logLabel}] Failed to parse JSON response:`, error);
|
|
607
|
-
}
|
|
608
|
-
}
|
|
609
|
-
|
|
610
|
-
// If tools were used, include them in structured response
|
|
611
|
-
if (toolCalls.length > 0) {
|
|
612
|
-
structured = {
|
|
613
|
-
...(structured || {}),
|
|
614
|
-
message: structured?.message || message,
|
|
615
|
-
toolCalls,
|
|
616
|
-
} as AgentStructuredResponse;
|
|
617
|
-
}
|
|
618
|
-
|
|
619
|
-
// A parsed-but-blank message with no tool calls is as empty as no text;
|
|
620
|
-
// the shared guard throws so withTimeoutAndRetry retries instead of
|
|
621
|
-
// returning {"message":""}.
|
|
622
|
-
assertUsableCompletion(structured, message, toolCalls.length, this.displayName);
|
|
623
|
-
|
|
624
|
-
return {
|
|
625
|
-
message,
|
|
626
|
-
metadata: {
|
|
627
|
-
model: response.model,
|
|
628
|
-
finishReason: response.choices[0]?.finish_reason,
|
|
629
|
-
tokensUsed: response.usage?.total_tokens,
|
|
630
|
-
promptTokens: response.usage?.prompt_tokens,
|
|
631
|
-
completionTokens: response.usage?.completion_tokens,
|
|
632
|
-
},
|
|
633
|
-
structured,
|
|
634
|
-
};
|
|
53
|
+
this.config = init.config;
|
|
635
54
|
}
|
|
55
|
+
}
|
|
636
56
|
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
attemptSignal?: AbortSignal
|
|
648
|
-
): AsyncGenerator<GenerateMessageStreamChunk<TStructured>> {
|
|
649
|
-
// Build messages from history and append prompt as final user message
|
|
650
|
-
const historyMessages = this.buildChatMessages(input.history);
|
|
651
|
-
historyMessages.push({ role: "user" as const, content: input.prompt });
|
|
652
|
-
|
|
653
|
-
const params: ChatCompletionCreateParamsStreaming = {
|
|
654
|
-
...this.config,
|
|
655
|
-
model,
|
|
656
|
-
messages:
|
|
657
|
-
historyMessages as ChatCompletionCreateParamsNonStreaming["messages"],
|
|
658
|
-
stream: true as const,
|
|
659
|
-
};
|
|
660
|
-
this.configureStreamParams(params);
|
|
661
|
-
|
|
662
|
-
// Override with input parameters if provided
|
|
663
|
-
if (input.parameters?.maxOutputTokens !== undefined) {
|
|
664
|
-
params.max_tokens = input.parameters.maxOutputTokens;
|
|
665
|
-
}
|
|
666
|
-
|
|
667
|
-
// Add tools if provided
|
|
668
|
-
if (input.tools && input.tools.length > 0) {
|
|
669
|
-
params.tools = this.buildToolParams(input.tools);
|
|
670
|
-
params.tool_choice = "auto";
|
|
671
|
-
}
|
|
672
|
-
|
|
673
|
-
// Streaming path does not support responses.parse; if schema present,
|
|
674
|
-
// request structured output and parse at the end.
|
|
675
|
-
if (input.parameters?.jsonSchema) {
|
|
676
|
-
params.response_format = this.structuredResponseFormat(
|
|
677
|
-
input.parameters.jsonSchema,
|
|
678
|
-
input.parameters.schemaName
|
|
679
|
-
);
|
|
680
|
-
}
|
|
681
|
-
|
|
682
|
-
const stream = await this.client.chat.completions.create(params, {
|
|
683
|
-
signal: combineAbortSignals(input.signal, attemptSignal),
|
|
57
|
+
function buildProvider(init: OpenAICompatibleProviderInit, mode: StructuredOutputMode): Provider {
|
|
58
|
+
if (mode === "responses_parse") {
|
|
59
|
+
return createResponsesProvider({
|
|
60
|
+
apiKey: init.apiKey,
|
|
61
|
+
model: init.model,
|
|
62
|
+
id: init.id,
|
|
63
|
+
...(init.baseUrl ? { baseUrl: `${init.baseUrl}` } : {}),
|
|
64
|
+
...(init.headers ? { headers: init.headers } : {}),
|
|
65
|
+
...(init.config?.maxTokens ? { maxTokens: init.config.maxTokens } : {}),
|
|
66
|
+
...(init.fetchImpl ? { fetchImpl: init.fetchImpl } : {}),
|
|
684
67
|
});
|
|
685
|
-
|
|
686
|
-
let accumulated = "";
|
|
687
|
-
let currentModel = model;
|
|
688
|
-
let finishReason: string | undefined;
|
|
689
|
-
let promptTokens: number | undefined;
|
|
690
|
-
let completionTokens: number | undefined;
|
|
691
|
-
let totalTokens: number | undefined;
|
|
692
|
-
const toolCalls: Array<{
|
|
693
|
-
toolName: string;
|
|
694
|
-
arguments: Record<string, unknown>;
|
|
695
|
-
}> = [];
|
|
696
|
-
|
|
697
|
-
for await (const chunk of stream) {
|
|
698
|
-
currentModel = chunk.model;
|
|
699
|
-
|
|
700
|
-
// Some providers include usage in (possibly choice-less) chunks
|
|
701
|
-
if (chunk.usage) {
|
|
702
|
-
promptTokens = chunk.usage.prompt_tokens;
|
|
703
|
-
completionTokens = chunk.usage.completion_tokens;
|
|
704
|
-
totalTokens = chunk.usage.total_tokens;
|
|
705
|
-
}
|
|
706
|
-
|
|
707
|
-
const choice = chunk.choices?.[0];
|
|
708
|
-
if (!choice) continue;
|
|
709
|
-
|
|
710
|
-
// Extract tool calls from delta
|
|
711
|
-
if (choice.delta?.tool_calls) {
|
|
712
|
-
for (const toolCall of choice.delta.tool_calls) {
|
|
713
|
-
if (toolCall.function) {
|
|
714
|
-
toolCalls.push({
|
|
715
|
-
toolName: toolCall.function.name || "",
|
|
716
|
-
arguments: this.parseToolCallArguments(
|
|
717
|
-
toolCall.function.arguments,
|
|
718
|
-
true
|
|
719
|
-
),
|
|
720
|
-
});
|
|
721
|
-
}
|
|
722
|
-
}
|
|
723
|
-
}
|
|
724
|
-
|
|
725
|
-
// Provider-specific delta handling (e.g. DeepSeek reasoning_content)
|
|
726
|
-
this.onStreamDelta(choice.delta);
|
|
727
|
-
|
|
728
|
-
const delta = choice.delta?.content || "";
|
|
729
|
-
if (delta) {
|
|
730
|
-
accumulated += delta;
|
|
731
|
-
yield {
|
|
732
|
-
delta,
|
|
733
|
-
accumulated,
|
|
734
|
-
done: false,
|
|
735
|
-
};
|
|
736
|
-
}
|
|
737
|
-
|
|
738
|
-
if (choice.finish_reason) {
|
|
739
|
-
finishReason = choice.finish_reason;
|
|
740
|
-
}
|
|
741
|
-
}
|
|
742
|
-
|
|
743
|
-
// Parse JSON response if schema was provided
|
|
744
|
-
let structured: TStructured | undefined;
|
|
745
|
-
if (input.parameters?.jsonSchema && accumulated) {
|
|
746
|
-
try {
|
|
747
|
-
structured = JSON.parse(accumulated) as TStructured;
|
|
748
|
-
} catch (error) {
|
|
749
|
-
logger.warn(
|
|
750
|
-
`[${this.logLabel}] Failed to parse JSON response in stream:`,
|
|
751
|
-
error
|
|
752
|
-
);
|
|
753
|
-
}
|
|
754
|
-
}
|
|
755
|
-
|
|
756
|
-
// Include tool calls in structured response (even without JSON schema)
|
|
757
|
-
if (toolCalls.length > 0) {
|
|
758
|
-
structured = {
|
|
759
|
-
...(structured || {}),
|
|
760
|
-
message:
|
|
761
|
-
(structured as AgentStructuredResponse | undefined)?.message ||
|
|
762
|
-
accumulated,
|
|
763
|
-
toolCalls,
|
|
764
|
-
} as TStructured;
|
|
765
|
-
}
|
|
766
|
-
|
|
767
|
-
// Empty-completion guard — same definition as the non-streaming path, so the
|
|
768
|
-
// stream retries / falls back to backup instead of emitting an empty message.
|
|
769
|
-
assertUsableCompletion(structured, accumulated, toolCalls.length, this.displayName);
|
|
770
|
-
|
|
771
|
-
// Yield final chunk
|
|
772
|
-
yield {
|
|
773
|
-
delta: "",
|
|
774
|
-
accumulated,
|
|
775
|
-
done: true,
|
|
776
|
-
metadata: {
|
|
777
|
-
model: currentModel,
|
|
778
|
-
finishReason,
|
|
779
|
-
tokensUsed: totalTokens,
|
|
780
|
-
promptTokens,
|
|
781
|
-
completionTokens,
|
|
782
|
-
},
|
|
783
|
-
structured,
|
|
784
|
-
};
|
|
785
68
|
}
|
|
69
|
+
return createOpenAIProvider({
|
|
70
|
+
apiKey: init.apiKey,
|
|
71
|
+
model: init.model,
|
|
72
|
+
id: init.id,
|
|
73
|
+
jsonMode: mode === "json_schema" ? "schema" : "object",
|
|
74
|
+
...(init.baseUrl ? { baseUrl: init.baseUrl } : {}),
|
|
75
|
+
...(init.headers ? { headers: init.headers } : {}),
|
|
76
|
+
...(init.config?.maxTokens ? { maxTokens: init.config.maxTokens } : {}),
|
|
77
|
+
...(init.providerOrder ? { providerOrder: init.providerOrder } : {}),
|
|
78
|
+
...(init.fetchImpl ? { fetchImpl: init.fetchImpl } : {}),
|
|
79
|
+
});
|
|
786
80
|
}
|