@falai/agent 2.7.0 → 3.1.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 +1 -1
- package/dist/adapters/MemoryAdapter.d.ts +1 -1
- package/dist/adapters/MemoryAdapter.d.ts.map +1 -1
- package/dist/adapters/MemoryAdapter.js +3 -3
- 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 +3 -3
- 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 +1 -1
- package/dist/adapters/RedisAdapter.d.ts.map +1 -1
- package/dist/adapters/RedisAdapter.js +3 -3
- 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 +3 -3
- 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 +1 -1
- package/dist/adapters/sessionRow.d.ts.map +1 -1
- 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 +14 -14
- 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 +12 -12
- 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 +1 -1
- package/dist/cjs/adapters/RedisAdapter.d.ts.map +1 -1
- package/dist/cjs/adapters/RedisAdapter.js +13 -13
- 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 +8 -8
- 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 +1 -1
- package/dist/cjs/adapters/sessionRow.d.ts.map +1 -1
- package/dist/cjs/core/Agent.d.ts +11 -11
- package/dist/cjs/core/Agent.d.ts.map +1 -1
- package/dist/cjs/core/Agent.js +65 -65
- package/dist/cjs/core/Agent.js.map +1 -1
- package/dist/cjs/core/AutoChainExecutor.d.ts +5 -5
- package/dist/cjs/core/AutoChainExecutor.d.ts.map +1 -1
- package/dist/cjs/core/AutoChainExecutor.js +26 -26
- 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 +2 -2
- package/dist/cjs/core/CompactionEngine.d.ts.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 +64 -64
- 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/ResponseModal.d.ts +10 -10
- package/dist/cjs/core/ResponseModal.d.ts.map +1 -1
- package/dist/cjs/core/ResponseModal.js +69 -69
- package/dist/cjs/core/ResponseModal.js.map +1 -1
- package/dist/cjs/core/ResponsePipeline.d.ts +15 -7
- package/dist/cjs/core/ResponsePipeline.d.ts.map +1 -1
- package/dist/cjs/core/ResponsePipeline.js +99 -91
- 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 +12 -12
- package/dist/cjs/core/SessionFinalizer.js.map +1 -1
- package/dist/cjs/core/SessionManager.d.ts +5 -5
- package/dist/cjs/core/SessionManager.d.ts.map +1 -1
- package/dist/cjs/core/SessionManager.js +8 -8
- 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 +14 -14
- 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 +17 -17
- package/dist/cjs/core/Step.js.map +1 -1
- package/dist/cjs/core/StepLifecycle.d.ts +3 -3
- package/dist/cjs/core/StepLifecycle.d.ts.map +1 -1
- package/dist/cjs/core/StepLifecycle.js +10 -10
- 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 +5 -5
- package/dist/cjs/core/StreamingToolExecutor.js.map +1 -1
- package/dist/cjs/core/ToolLoopExecutor.d.ts +4 -4
- package/dist/cjs/core/ToolLoopExecutor.d.ts.map +1 -1
- package/dist/cjs/core/ToolLoopExecutor.js +51 -51
- package/dist/cjs/core/ToolLoopExecutor.js.map +1 -1
- package/dist/cjs/core/ToolManager.d.ts +5 -5
- package/dist/cjs/core/ToolManager.d.ts.map +1 -1
- package/dist/cjs/core/ToolManager.js +66 -66
- 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 +2 -2
- package/dist/cjs/core/flow-namespace.d.ts.map +1 -1
- package/dist/cjs/core/flow-namespace.js +4 -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 -48
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +96 -91
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/providers/AnthropicProvider.d.ts +25 -42
- package/dist/cjs/providers/AnthropicProvider.d.ts.map +1 -1
- package/dist/cjs/providers/AnthropicProvider.js +32 -408
- 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 +24 -83
- package/dist/cjs/providers/GeminiProvider.d.ts.map +1 -1
- package/dist/cjs/providers/GeminiProvider.js +33 -514
- 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 -144
- package/dist/cjs/providers/OpenAICompatibleProvider.d.ts.map +1 -1
- package/dist/cjs/providers/OpenAICompatibleProvider.js +42 -523
- 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 +20 -27
- 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 +102 -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 +11 -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 +7 -7
- 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 +2 -2
- package/dist/cjs/types/tool.d.ts.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 -67
- package/dist/cjs/utils/index.js.map +1 -1
- package/dist/cjs/utils/serialize.d.ts +2 -2
- package/dist/cjs/utils/serialize.d.ts.map +1 -1
- package/dist/cjs/utils/session.d.ts +3 -3
- package/dist/cjs/utils/session.d.ts.map +1 -1
- package/dist/cjs/utils/session.js +4 -4
- 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 +11 -11
- package/dist/core/Agent.d.ts.map +1 -1
- package/dist/core/Agent.js +13 -13
- package/dist/core/Agent.js.map +1 -1
- package/dist/core/AutoChainExecutor.d.ts +5 -5
- package/dist/core/AutoChainExecutor.d.ts.map +1 -1
- package/dist/core/AutoChainExecutor.js +5 -5
- 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 +2 -2
- package/dist/core/CompactionEngine.d.ts.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 +4 -4
- 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/ResponseModal.d.ts +10 -10
- package/dist/core/ResponseModal.d.ts.map +1 -1
- package/dist/core/ResponseModal.js +14 -14
- package/dist/core/ResponseModal.js.map +1 -1
- package/dist/core/ResponsePipeline.d.ts +15 -7
- package/dist/core/ResponsePipeline.d.ts.map +1 -1
- package/dist/core/ResponsePipeline.js +25 -17
- 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 +3 -3
- package/dist/core/SessionFinalizer.js.map +1 -1
- package/dist/core/SessionManager.d.ts +5 -5
- package/dist/core/SessionManager.d.ts.map +1 -1
- package/dist/core/SessionManager.js +3 -3
- 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 +3 -3
- 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 +4 -4
- package/dist/core/Step.js.map +1 -1
- package/dist/core/StepLifecycle.d.ts +3 -3
- package/dist/core/StepLifecycle.d.ts.map +1 -1
- package/dist/core/StepLifecycle.js +2 -2
- 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 +2 -2
- package/dist/core/StreamingToolExecutor.js.map +1 -1
- package/dist/core/ToolLoopExecutor.d.ts +4 -4
- package/dist/core/ToolLoopExecutor.d.ts.map +1 -1
- package/dist/core/ToolLoopExecutor.js +3 -3
- package/dist/core/ToolLoopExecutor.js.map +1 -1
- package/dist/core/ToolManager.d.ts +5 -5
- package/dist/core/ToolManager.d.ts.map +1 -1
- package/dist/core/ToolManager.js +4 -4
- 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 +2 -2
- package/dist/core/flow-namespace.d.ts.map +1 -1
- package/dist/core/flow-namespace.js +1 -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 -48
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +34 -31
- package/dist/index.js.map +1 -1
- package/dist/providers/AnthropicProvider.d.ts +25 -42
- package/dist/providers/AnthropicProvider.d.ts.map +1 -1
- package/dist/providers/AnthropicProvider.js +32 -405
- 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 +24 -83
- package/dist/providers/GeminiProvider.d.ts.map +1 -1
- package/dist/providers/GeminiProvider.js +33 -514
- 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 -144
- package/dist/providers/OpenAICompatibleProvider.d.ts.map +1 -1
- package/dist/providers/OpenAICompatibleProvider.js +41 -522
- 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 +19 -23
- 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 +102 -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 +11 -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 +7 -7
- 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 +2 -2
- package/dist/types/tool.d.ts.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 +2 -2
- package/dist/utils/serialize.d.ts.map +1 -1
- package/dist/utils/session.d.ts +3 -3
- package/dist/utils/session.d.ts.map +1 -1
- package/dist/utils/session.js +2 -2
- 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/reference/branches.md +2 -0
- package/docs/reference/errors.md +5 -5
- package/docs/reference/providers.md +42 -43
- package/examples/01-quickstart.ts +1 -1
- package/examples/04-instructions.ts +1 -1
- package/examples/05-branching.ts +2 -2
- package/examples/08-persistence.ts +1 -1
- package/examples/tsconfig.json +6 -3
- package/package.json +11 -8
- package/src/adapters/MemoryAdapter.ts +4 -4
- package/src/adapters/MongoAdapter.ts +3 -3
- package/src/adapters/OpenSearchAdapter.ts +4 -4
- package/src/adapters/PostgreSQLAdapter.ts +4 -4
- package/src/adapters/PrismaAdapter.ts +4 -4
- package/src/adapters/RedisAdapter.ts +4 -4
- package/src/adapters/SQLiteAdapter.ts +4 -4
- package/src/adapters/index.ts +13 -13
- package/src/adapters/sessionRow.ts +1 -1
- package/src/core/Agent.ts +18 -18
- package/src/core/AutoChainExecutor.ts +9 -9
- package/src/core/BranchEvaluator.ts +5 -5
- package/src/core/CompactionEngine.ts +2 -2
- 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 +8 -8
- 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/ResponseModal.ts +24 -24
- package/src/core/ResponsePipeline.ts +43 -23
- package/src/core/SessionFinalizer.ts +7 -7
- package/src/core/SessionManager.ts +7 -7
- package/src/core/SignalCoordinator.ts +7 -7
- package/src/core/SignalEvaluator.ts +6 -6
- package/src/core/SignalProcessor.ts +9 -9
- package/src/core/Step.ts +9 -9
- package/src/core/StepLifecycle.ts +6 -6
- package/src/core/StreamingToolExecutor.ts +4 -4
- package/src/core/ToolLoopExecutor.ts +7 -7
- package/src/core/ToolManager.ts +9 -9
- package/src/core/createAgent.ts +2 -2
- package/src/core/flow-namespace.ts +3 -3
- package/src/core/toolGates.ts +2 -2
- package/src/index.ts +59 -48
- package/src/providers/AnthropicProvider.ts +46 -548
- package/src/providers/DeepSeekProvider.ts +27 -92
- package/src/providers/GeminiProvider.ts +44 -680
- package/src/providers/GenericOpenAICompatibleProvider.ts +19 -27
- package/src/providers/OpenAICompatibleProvider.ts +60 -763
- package/src/providers/OpenAIProvider.ts +31 -55
- package/src/providers/OpenRouterProvider.ts +40 -70
- package/src/providers/ProviderAdapter.ts +377 -0
- package/src/providers/index.ts +21 -23
- package/src/types/agent.ts +11 -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 +7 -7
- package/src/types/history.ts +1 -1
- package/src/types/index.ts +17 -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 +2 -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 +11 -31
- package/src/utils/serialize.ts +2 -2
- package/src/utils/session.ts +6 -6
- package/src/utils/template.ts +3 -3
- package/dist/cjs/providers/errorClassification.d.ts +0 -68
- package/dist/cjs/providers/errorClassification.d.ts.map +0 -1
- package/dist/cjs/providers/errorClassification.js +0 -150
- package/dist/cjs/providers/errorClassification.js.map +0 -1
- package/dist/cjs/utils/retry.d.ts +0 -165
- package/dist/cjs/utils/retry.d.ts.map +0 -1
- package/dist/cjs/utils/retry.js +0 -338
- package/dist/cjs/utils/retry.js.map +0 -1
- package/dist/providers/errorClassification.d.ts +0 -68
- package/dist/providers/errorClassification.d.ts.map +0 -1
- package/dist/providers/errorClassification.js +0 -142
- package/dist/providers/errorClassification.js.map +0 -1
- package/dist/utils/retry.d.ts +0 -165
- package/dist/utils/retry.d.ts.map +0 -1
- package/dist/utils/retry.js +0 -327
- package/dist/utils/retry.js.map +0 -1
- package/src/providers/errorClassification.ts +0 -206
- package/src/utils/retry.ts +0 -523
|
@@ -1,704 +1,68 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Google Gemini
|
|
2
|
+
* Google Gemini.
|
|
3
|
+
*
|
|
4
|
+
* Thought signatures, the `functionResponse`-by-name pairing, implicit cache
|
|
5
|
+
* hits and the thinking levels are all in `@providerkit/core`, written against
|
|
6
|
+
* the REST API rather than the SDK.
|
|
7
|
+
*
|
|
8
|
+
* v3 sends a response schema alongside tools when a caller asks for both. v2
|
|
9
|
+
* dropped the schema in that case, from a 2024-era constraint that no longer
|
|
10
|
+
* holds — a sibling codebase runs the combination in production today.
|
|
3
11
|
*/
|
|
4
12
|
|
|
5
|
-
import
|
|
6
|
-
GoogleGenAI as GoogleGenAIType,
|
|
7
|
-
GenerateContentConfig,
|
|
8
|
-
GenerateContentResponse,
|
|
9
|
-
Schema,
|
|
10
|
-
FunctionDeclaration,
|
|
11
|
-
} from "@google/genai";
|
|
12
|
-
import { GoogleGenAI, Type } from "@google/genai";
|
|
13
|
+
import { createGeminiProvider } from "@providerkit/core";
|
|
13
14
|
|
|
14
|
-
import type {
|
|
15
|
-
|
|
16
|
-
GenerateMessageInput,
|
|
17
|
-
GenerateMessageOutput,
|
|
18
|
-
GenerateMessageStreamChunk,
|
|
19
|
-
AgentStructuredResponse,
|
|
20
|
-
StructuredSchema,
|
|
21
|
-
} from "../types";
|
|
22
|
-
import type { ProviderCapabilities } from "../types/ai";
|
|
23
|
-
import type { HistoryItem } from "../types/history";
|
|
24
|
-
import { withTimeoutAndRetry, withStreamRetry, withBackupFallback, streamWithBackupFallback, backupFallbackLogging, resolveRetryConfig, combineAbortSignals } from "../utils/retry";
|
|
25
|
-
import { assertUsableCompletion } from "../utils/completion";
|
|
26
|
-
import { tryParseJSONResponse } from "../utils/json";
|
|
27
|
-
import { logger } from "../utils/logger";
|
|
28
|
-
import {
|
|
29
|
-
classifyProviderError,
|
|
30
|
-
isBackupEligible,
|
|
31
|
-
isRetriableProviderError,
|
|
32
|
-
toProviderError,
|
|
33
|
-
type ErrorClassificationOptions,
|
|
34
|
-
} from "./errorClassification";
|
|
15
|
+
import type { ProviderCapabilities } from "../types/ai.js";
|
|
16
|
+
import { ProviderAdapter, type RequestConfig } from "./ProviderAdapter.js";
|
|
35
17
|
|
|
36
|
-
/**
|
|
37
|
-
* Configuration options for Gemini provider
|
|
38
|
-
* Uses types from @google/genai package
|
|
39
|
-
*/
|
|
40
18
|
export interface GeminiProviderOptions {
|
|
41
|
-
/** Gemini API key
|
|
42
|
-
apiKey
|
|
43
|
-
/** Model to use (required)
|
|
19
|
+
/** Gemini API key */
|
|
20
|
+
apiKey: string;
|
|
21
|
+
/** Model to use (required) — e.g. "gemini-3.1-pro-preview" */
|
|
44
22
|
model: string;
|
|
45
|
-
/** Backup models to try if primary fails (default: []) */
|
|
23
|
+
/** Backup models to try if the primary fails (default: []) */
|
|
46
24
|
backupModels?: string[];
|
|
47
|
-
/**
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
* Intended for tests injecting scripted transports; production callers
|
|
57
|
-
* should pass `apiKey` instead.
|
|
58
|
-
*/
|
|
59
|
-
client?: GoogleGenAIType;
|
|
25
|
+
/** Any endpoint speaking the Gemini generateContent dialect. */
|
|
26
|
+
baseUrl?: string;
|
|
27
|
+
/** Request defaults sent with every call */
|
|
28
|
+
config?: RequestConfig;
|
|
29
|
+
/** Idle-stream deadline and retry budget */
|
|
30
|
+
retryConfig?: { timeout?: number; retries?: number };
|
|
31
|
+
/** Replacement `fetch`, for tests that script the wire. Replaces v2's
|
|
32
|
+
* injected SDK client — see {@link AnthropicProviderOptions.fetchImpl}. */
|
|
33
|
+
fetchImpl?: typeof fetch;
|
|
60
34
|
}
|
|
61
35
|
|
|
62
|
-
|
|
63
|
-
* Gemini-specific error classification signals ("overloaded" code plus
|
|
64
|
-
* the "not available"/"INTERNAL" message patterns Gemini emits).
|
|
65
|
-
*/
|
|
66
|
-
const CLASSIFICATION_OPTIONS: ErrorClassificationOptions = {
|
|
67
|
-
overloadedCodes: ["overloaded"],
|
|
68
|
-
overloadedMessages: ["not available", "INTERNAL"],
|
|
69
|
-
};
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
* Determines if an error should trigger backup model usage.
|
|
73
|
-
* Derived from the normalized error classification.
|
|
74
|
-
*/
|
|
75
|
-
const shouldUseBackupModel = (error: unknown): boolean =>
|
|
76
|
-
isBackupEligible(classifyProviderError(error, CLASSIFICATION_OPTIONS));
|
|
77
|
-
|
|
78
|
-
/**
|
|
79
|
-
* Gemini provider implementation with backup models and retry logic
|
|
80
|
-
*/
|
|
81
|
-
export class GeminiProvider implements AiProvider {
|
|
36
|
+
export class GeminiProvider extends ProviderAdapter {
|
|
82
37
|
public readonly name = "gemini";
|
|
83
38
|
public readonly capabilities: ProviderCapabilities = {
|
|
84
39
|
supportsTools: true,
|
|
85
40
|
supportsNativeJsonSchema: true,
|
|
86
41
|
supportsStreaming: true,
|
|
87
42
|
supportsStreamingToolCalls: true,
|
|
88
|
-
supportsPromptCaching:
|
|
43
|
+
supportsPromptCaching: true,
|
|
89
44
|
};
|
|
90
|
-
private genAI: GoogleGenAIType;
|
|
91
|
-
private primaryModel: string;
|
|
92
|
-
private backupModels: string[];
|
|
93
|
-
private config?: Partial<GenerateContentConfig>;
|
|
94
|
-
private retryConfig: { timeout: number; retries: number };
|
|
95
45
|
|
|
96
46
|
constructor(options: GeminiProviderOptions) {
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
if (!client && !apiKey) {
|
|
100
|
-
throw new Error("Gemini API key is required");
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
if (!model) {
|
|
47
|
+
if (!options.apiKey) throw new Error("Gemini API key is required");
|
|
48
|
+
if (!options.model) {
|
|
104
49
|
throw new Error("Model is required. Example: 'gemini-3.1-pro-preview'");
|
|
105
50
|
}
|
|
106
51
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
systemInstructions: string[];
|
|
123
|
-
} {
|
|
124
|
-
const contents: Array<{ role: string; parts: Array<Record<string, unknown>> }> = [];
|
|
125
|
-
const systemInstructions: string[] = [];
|
|
126
|
-
|
|
127
|
-
for (const item of history) {
|
|
128
|
-
switch (item.role) {
|
|
129
|
-
case "system":
|
|
130
|
-
systemInstructions.push(item.content);
|
|
131
|
-
break;
|
|
132
|
-
case "user":
|
|
133
|
-
contents.push({ role: "user", parts: [{ text: item.content }] });
|
|
134
|
-
break;
|
|
135
|
-
case "assistant":
|
|
136
|
-
if (item.tool_calls && item.tool_calls.length > 0) {
|
|
137
|
-
const parts: Array<Record<string, unknown>> = [];
|
|
138
|
-
if (item.content) {
|
|
139
|
-
parts.push({ text: item.content });
|
|
140
|
-
}
|
|
141
|
-
for (const tc of item.tool_calls) {
|
|
142
|
-
parts.push({
|
|
143
|
-
functionCall: { name: tc.name, args: tc.arguments },
|
|
144
|
-
});
|
|
145
|
-
}
|
|
146
|
-
contents.push({ role: "model", parts });
|
|
147
|
-
} else {
|
|
148
|
-
contents.push({ role: "model", parts: [{ text: item.content || "" }] });
|
|
149
|
-
}
|
|
150
|
-
break;
|
|
151
|
-
case "tool":
|
|
152
|
-
contents.push({
|
|
153
|
-
role: "user",
|
|
154
|
-
parts: [
|
|
155
|
-
{
|
|
156
|
-
functionResponse: {
|
|
157
|
-
name: item.name,
|
|
158
|
-
response: typeof item.content === "object" ? item.content : { result: item.content },
|
|
159
|
-
},
|
|
160
|
-
},
|
|
161
|
-
],
|
|
162
|
-
});
|
|
163
|
-
break;
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
return { contents, systemInstructions };
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
/**
|
|
171
|
-
* Convert tool parameter schemas (JSON Schema) to Gemini's Schema format.
|
|
172
|
-
* Gemini's FunctionDeclaration.parameters expects its own Schema type,
|
|
173
|
-
* not raw JSON Schema. This method handles the conversion, including
|
|
174
|
-
* edge cases like empty objects that Gemini rejects.
|
|
175
|
-
*
|
|
176
|
-
* @private
|
|
177
|
-
*/
|
|
178
|
-
private convertToolParameters(parameters: unknown): Schema | undefined {
|
|
179
|
-
if (!parameters || typeof parameters !== "object") {
|
|
180
|
-
return undefined;
|
|
181
|
-
}
|
|
182
|
-
try {
|
|
183
|
-
return this.adaptSchemaForGemini(parameters as StructuredSchema);
|
|
184
|
-
} catch (error) {
|
|
185
|
-
logger.warn(`[GeminiProvider] Failed to convert tool parameters, passing as-is:`, error);
|
|
186
|
-
return parameters as Schema;
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
/**
|
|
191
|
-
* Safely extract text from a Gemini response or chunk.
|
|
192
|
-
* Bypasses the SDK's `.text` getter entirely to avoid warnings about
|
|
193
|
-
* non-text parts (e.g., "thoughtSignature") in the response.
|
|
194
|
-
* Manually concatenates only text parts from candidates.
|
|
195
|
-
*
|
|
196
|
-
* @private
|
|
197
|
-
*/
|
|
198
|
-
private safeExtractText(responseOrChunk: { text?: string; candidates?: Array<{ content?: { parts?: Array<{ text?: string; thought?: boolean; functionCall?: unknown }> } }> }): string {
|
|
199
|
-
// Always extract text parts manually to avoid SDK warnings about
|
|
200
|
-
// non-text parts like "thoughtSignature" in the response.
|
|
201
|
-
const parts = responseOrChunk.candidates?.[0]?.content?.parts;
|
|
202
|
-
if (parts) {
|
|
203
|
-
// Exclude reasoning parts (thought: true) — with includeThoughts enabled
|
|
204
|
-
// they carry text but must never leak into the user-facing message.
|
|
205
|
-
return parts
|
|
206
|
-
.filter((p) => p.text != null && !p.thought)
|
|
207
|
-
.map((p) => p.text)
|
|
208
|
-
.join("");
|
|
209
|
-
}
|
|
210
|
-
// Fallback: try the .text getter if no candidates structure exists
|
|
211
|
-
try {
|
|
212
|
-
return responseOrChunk.text || "";
|
|
213
|
-
} catch {
|
|
214
|
-
return "";
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
/**
|
|
219
|
-
* Build Gemini function declarations from framework tool definitions.
|
|
220
|
-
* Converts JSON Schema parameters to Gemini's Schema format.
|
|
221
|
-
*
|
|
222
|
-
* @private
|
|
223
|
-
*/
|
|
224
|
-
private buildFunctionDeclarations(
|
|
225
|
-
tools: Array<{ id: string; name?: string; description?: string; parameters?: unknown }>
|
|
226
|
-
): FunctionDeclaration[] {
|
|
227
|
-
return tools.map((tool) => ({
|
|
228
|
-
name: tool.name || tool.id,
|
|
229
|
-
description: tool.description || "",
|
|
230
|
-
parameters: this.convertToolParameters(tool.parameters),
|
|
231
|
-
}));
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
/**
|
|
235
|
-
* Adapt common schema format to Gemini's specific requirements.
|
|
236
|
-
* Gemini has strict validation:
|
|
237
|
-
* - OBJECT types MUST have non-empty properties
|
|
238
|
-
* - Empty objects cause 400 Bad Request errors
|
|
239
|
-
* - Uses Gemini's Schema type with Type enums
|
|
240
|
-
*
|
|
241
|
-
* @private
|
|
242
|
-
*/
|
|
243
|
-
private adaptSchemaForGemini(schema: StructuredSchema): Schema {
|
|
244
|
-
const geminiSchema: Schema = {};
|
|
245
|
-
|
|
246
|
-
// Convert type
|
|
247
|
-
if (schema.type) {
|
|
248
|
-
if (Array.isArray(schema.type)) {
|
|
249
|
-
// For now, take the first type (Gemini doesn't support union types the same way)
|
|
250
|
-
geminiSchema.type = this.mapToGeminiType(schema.type[0]);
|
|
251
|
-
} else {
|
|
252
|
-
geminiSchema.type = this.mapToGeminiType(schema.type);
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
// Handle description
|
|
257
|
-
if (schema.description) {
|
|
258
|
-
geminiSchema.description = schema.description;
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
// Handle nullable
|
|
262
|
-
if (schema.nullable !== undefined) {
|
|
263
|
-
geminiSchema.nullable = schema.nullable;
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
// Handle enum
|
|
267
|
-
if (schema.enum) {
|
|
268
|
-
geminiSchema.enum = schema.enum as string[];
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
// Handle object properties - Gemini requires non-empty properties for OBJECT type
|
|
272
|
-
if (
|
|
273
|
-
geminiSchema.type === Type.OBJECT ||
|
|
274
|
-
schema.type === "object" ||
|
|
275
|
-
(Array.isArray(schema.type) && schema.type.includes("object"))
|
|
276
|
-
) {
|
|
277
|
-
if (!schema.properties || Object.keys(schema.properties).length === 0) {
|
|
278
|
-
logger.warn(
|
|
279
|
-
"[GeminiProvider] Gemini requires OBJECT types to have non-empty properties. Converting empty object to STRING."
|
|
280
|
-
);
|
|
281
|
-
geminiSchema.type = Type.STRING;
|
|
282
|
-
return geminiSchema;
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
// Recursively convert nested properties
|
|
286
|
-
geminiSchema.properties = {};
|
|
287
|
-
for (const [key, value] of Object.entries(schema.properties)) {
|
|
288
|
-
geminiSchema.properties[key] = this.adaptSchemaForGemini(value);
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
// Handle required fields
|
|
292
|
-
if (schema.required && schema.required.length > 0) {
|
|
293
|
-
geminiSchema.required = schema.required;
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
// Handle array items
|
|
298
|
-
if (
|
|
299
|
-
geminiSchema.type === Type.ARRAY ||
|
|
300
|
-
schema.type === "array" ||
|
|
301
|
-
(Array.isArray(schema.type) && schema.type.includes("array"))
|
|
302
|
-
) {
|
|
303
|
-
if (schema.items) {
|
|
304
|
-
geminiSchema.items = this.adaptSchemaForGemini(schema.items);
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
return geminiSchema;
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
/**
|
|
312
|
-
* Map common JSON Schema type strings to Gemini's Type enum
|
|
313
|
-
* @private
|
|
314
|
-
*/
|
|
315
|
-
private mapToGeminiType(type: string): Type {
|
|
316
|
-
switch (type.toLowerCase()) {
|
|
317
|
-
case "string":
|
|
318
|
-
return Type.STRING;
|
|
319
|
-
case "number":
|
|
320
|
-
return Type.NUMBER;
|
|
321
|
-
case "integer":
|
|
322
|
-
return Type.INTEGER;
|
|
323
|
-
case "boolean":
|
|
324
|
-
return Type.BOOLEAN;
|
|
325
|
-
case "array":
|
|
326
|
-
return Type.ARRAY;
|
|
327
|
-
case "object":
|
|
328
|
-
return Type.OBJECT;
|
|
329
|
-
default:
|
|
330
|
-
logger.warn(
|
|
331
|
-
`[GeminiProvider] Unknown type "${type}", defaulting to STRING`
|
|
332
|
-
);
|
|
333
|
-
return Type.STRING;
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
async generateMessage<
|
|
338
|
-
TContext = unknown,
|
|
339
|
-
TStructured = AgentStructuredResponse
|
|
340
|
-
>(
|
|
341
|
-
input: GenerateMessageInput<TContext>
|
|
342
|
-
): Promise<GenerateMessageOutput<TStructured>> {
|
|
343
|
-
return this.generateWithBackup<TContext, TStructured>(input);
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
async *generateMessageStream<
|
|
347
|
-
TContext = unknown,
|
|
348
|
-
TStructured = AgentStructuredResponse
|
|
349
|
-
>(
|
|
350
|
-
input: GenerateMessageInput<TContext>
|
|
351
|
-
): AsyncGenerator<GenerateMessageStreamChunk<TStructured>> {
|
|
352
|
-
yield* this.generateStreamWithBackup<TContext, TStructured>(input);
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
private async generateWithBackup<
|
|
356
|
-
TContext = unknown,
|
|
357
|
-
TStructured = AgentStructuredResponse
|
|
358
|
-
>(
|
|
359
|
-
input: GenerateMessageInput<TContext>
|
|
360
|
-
): Promise<GenerateMessageOutput<TStructured>> {
|
|
361
|
-
const observer = backupFallbackLogging("[GEMINI]", shouldUseBackupModel);
|
|
362
|
-
|
|
363
|
-
try {
|
|
364
|
-
return await withBackupFallback({
|
|
365
|
-
models: [this.primaryModel, ...this.backupModels],
|
|
366
|
-
attempt: (model) =>
|
|
367
|
-
this.generateWithModel<TContext, TStructured>(model, input),
|
|
368
|
-
shouldTryBackup: shouldUseBackupModel,
|
|
369
|
-
...observer.callbacks,
|
|
370
|
-
});
|
|
371
|
-
} catch (error: unknown) {
|
|
372
|
-
observer.logExhausted(error);
|
|
373
|
-
throw toProviderError(error, this.name, CLASSIFICATION_OPTIONS);
|
|
374
|
-
}
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
private async generateWithModel<
|
|
378
|
-
TContext = unknown,
|
|
379
|
-
TStructured = AgentStructuredResponse
|
|
380
|
-
>(
|
|
381
|
-
model: string,
|
|
382
|
-
input: GenerateMessageInput<TContext>
|
|
383
|
-
): Promise<GenerateMessageOutput<TStructured>> {
|
|
384
|
-
const operation = async (signal: AbortSignal): Promise<GenerateMessageOutput> => {
|
|
385
|
-
// Schema-required: configure response schema
|
|
386
|
-
const configOverride: Partial<GenerateContentConfig> = { ...this.config };
|
|
387
|
-
|
|
388
|
-
// Handle tools and JSON schema - Gemini doesn't support both simultaneously
|
|
389
|
-
const hasTools = input.tools && input.tools.length > 0;
|
|
390
|
-
const hasJsonSchema = input.parameters?.jsonSchema;
|
|
391
|
-
|
|
392
|
-
if (hasTools && hasJsonSchema) {
|
|
393
|
-
logger.debug(`[GeminiProvider] Both tools and JSON schema provided. Prioritizing function calling - JSON schema will be ignored.`);
|
|
394
|
-
}
|
|
395
|
-
|
|
396
|
-
if (hasTools) {
|
|
397
|
-
const toolNames = input.tools?.map((tool) => tool.name || tool.id) || [];
|
|
398
|
-
logger.debug(`[GeminiProvider] Configuring ${toolNames.length} tools for model ${model}:`, toolNames);
|
|
399
|
-
const functionDeclarations = this.buildFunctionDeclarations(input.tools!);
|
|
400
|
-
configOverride.tools = [{ functionDeclarations }];
|
|
401
|
-
|
|
402
|
-
} else if (hasJsonSchema) {
|
|
403
|
-
// Only set JSON schema if no tools are present
|
|
404
|
-
configOverride.responseMimeType = "application/json";
|
|
405
|
-
// Adapt common schema format to Gemini's specific requirements
|
|
406
|
-
configOverride.responseSchema = input.parameters ? this.adaptSchemaForGemini(
|
|
407
|
-
input.parameters.jsonSchema
|
|
408
|
-
) : {};
|
|
409
|
-
}
|
|
410
|
-
|
|
411
|
-
let response: GenerateContentResponse;
|
|
412
|
-
try {
|
|
413
|
-
// Build contents from history
|
|
414
|
-
const { contents: historyContents, systemInstructions } = this.buildGeminiContents(input.history);
|
|
415
|
-
|
|
416
|
-
// Append the current prompt as the final user content
|
|
417
|
-
historyContents.push({ role: "user", parts: [{ text: input.prompt }] });
|
|
418
|
-
|
|
419
|
-
// Set system instruction from history if present
|
|
420
|
-
if (systemInstructions.length > 0) {
|
|
421
|
-
const existingSystem = configOverride.systemInstruction;
|
|
422
|
-
if (typeof existingSystem === "string") {
|
|
423
|
-
configOverride.systemInstruction = `${existingSystem}\n\n${systemInstructions.join("\n\n")}`;
|
|
424
|
-
} else {
|
|
425
|
-
configOverride.systemInstruction = systemInstructions.join("\n\n");
|
|
426
|
-
}
|
|
427
|
-
}
|
|
428
|
-
|
|
429
|
-
const reqSignal = combineAbortSignals(input.signal, signal);
|
|
430
|
-
response = await this.genAI.models.generateContent({
|
|
431
|
-
model,
|
|
432
|
-
contents: historyContents,
|
|
433
|
-
config: {
|
|
434
|
-
...configOverride,
|
|
435
|
-
...(reqSignal ? { abortSignal: reqSignal } : {}),
|
|
436
|
-
},
|
|
437
|
-
});
|
|
438
|
-
} catch (error: unknown) {
|
|
439
|
-
logger.error(`[GeminiProvider] API call failed:`, error);
|
|
440
|
-
throw error;
|
|
441
|
-
}
|
|
442
|
-
|
|
443
|
-
// Extract tool calls from response first
|
|
444
|
-
const toolCalls: Array<{
|
|
445
|
-
toolName: string;
|
|
446
|
-
arguments: Record<string, unknown>;
|
|
447
|
-
}> = [];
|
|
448
|
-
|
|
449
|
-
// Check for function calls in the response content
|
|
450
|
-
if (response.candidates && response.candidates[0]?.content?.parts) {
|
|
451
|
-
for (const part of response.candidates[0].content.parts) {
|
|
452
|
-
if (part.functionCall) {
|
|
453
|
-
toolCalls.push({
|
|
454
|
-
toolName: part.functionCall.name || "",
|
|
455
|
-
arguments: (part.functionCall.args as Record<string, unknown>) || {},
|
|
456
|
-
});
|
|
457
|
-
}
|
|
458
|
-
}
|
|
459
|
-
}
|
|
460
|
-
|
|
461
|
-
// Safely extract text — avoids SDK warning about non-text parts
|
|
462
|
-
const message = this.safeExtractText(response);
|
|
463
|
-
|
|
464
|
-
// Debug logging for response structure
|
|
465
|
-
if (!message && toolCalls.length === 0) {
|
|
466
|
-
logger.debug(`[GeminiProvider] Debug - Response structure:`, {
|
|
467
|
-
candidatesCount: response.candidates?.length || 0,
|
|
468
|
-
firstCandidateParts: response.candidates?.[0]?.content?.parts?.length || 0,
|
|
469
|
-
});
|
|
470
|
-
}
|
|
471
|
-
|
|
472
|
-
// Only throw error if we have no text AND no function calls
|
|
473
|
-
if (!message && toolCalls.length === 0) {
|
|
474
|
-
logger.error(`[GeminiProvider] Empty response - no text or function calls`);
|
|
475
|
-
logger.error(`[GeminiProvider] Response candidates:`, response.candidates);
|
|
476
|
-
throw new Error("No response from Gemini");
|
|
477
|
-
}
|
|
478
|
-
|
|
479
|
-
// Log when we have function calls but no text (this is normal)
|
|
480
|
-
if (toolCalls.length > 0 && !message) {
|
|
481
|
-
logger.debug(`[GeminiProvider] Function calls detected without text message:`, toolCalls.map(tc => tc.toolName));
|
|
482
|
-
}
|
|
483
|
-
|
|
484
|
-
// Parse JSON response if schema was provided
|
|
485
|
-
let structured: AgentStructuredResponse | undefined;
|
|
486
|
-
if (input.parameters?.jsonSchema) {
|
|
487
|
-
const parsed = tryParseJSONResponse(message);
|
|
488
|
-
if (parsed) {
|
|
489
|
-
structured = parsed as AgentStructuredResponse;
|
|
490
|
-
} else {
|
|
491
|
-
logger.warn("[GeminiProvider] Failed to parse JSON response, treating as plain text");
|
|
492
|
-
}
|
|
493
|
-
}
|
|
494
|
-
|
|
495
|
-
// If tools were used, include them in structured response
|
|
496
|
-
if (toolCalls.length > 0) {
|
|
497
|
-
structured = {
|
|
498
|
-
message: structured?.message || message,
|
|
499
|
-
toolCalls,
|
|
500
|
-
...structured,
|
|
501
|
-
} as AgentStructuredResponse;
|
|
502
|
-
}
|
|
503
|
-
|
|
504
|
-
// A parsed-but-blank message with no tool calls is as empty as no text;
|
|
505
|
-
// the shared guard throws so withTimeoutAndRetry retries instead of
|
|
506
|
-
// returning {"message":""}.
|
|
507
|
-
assertUsableCompletion(structured, message, toolCalls.length, "Gemini");
|
|
508
|
-
|
|
509
|
-
return {
|
|
510
|
-
message,
|
|
511
|
-
metadata: {
|
|
512
|
-
model,
|
|
513
|
-
tokensUsed: response.usageMetadata?.totalTokenCount,
|
|
514
|
-
promptTokens: response.usageMetadata?.promptTokenCount,
|
|
515
|
-
completionTokens: response.usageMetadata?.candidatesTokenCount,
|
|
516
|
-
},
|
|
517
|
-
structured,
|
|
518
|
-
};
|
|
519
|
-
};
|
|
520
|
-
|
|
521
|
-
return withTimeoutAndRetry(
|
|
522
|
-
operation,
|
|
523
|
-
this.retryConfig.timeout,
|
|
524
|
-
this.retryConfig.retries,
|
|
525
|
-
`Gemini ${model}`,
|
|
526
|
-
(error) => isRetriableProviderError(error, CLASSIFICATION_OPTIONS)
|
|
527
|
-
) as Promise<GenerateMessageOutput<TStructured>>;
|
|
528
|
-
}
|
|
529
|
-
|
|
530
|
-
private async *generateStreamWithBackup<
|
|
531
|
-
TContext = unknown,
|
|
532
|
-
TStructured = AgentStructuredResponse
|
|
533
|
-
>(
|
|
534
|
-
input: GenerateMessageInput<TContext>
|
|
535
|
-
): AsyncGenerator<GenerateMessageStreamChunk<TStructured>> {
|
|
536
|
-
const observer = backupFallbackLogging("[GEMINI]", shouldUseBackupModel, { streaming: true });
|
|
537
|
-
|
|
538
|
-
try {
|
|
539
|
-
yield* streamWithBackupFallback({
|
|
540
|
-
models: [this.primaryModel, ...this.backupModels],
|
|
541
|
-
attempt: (model) =>
|
|
542
|
-
withStreamRetry(
|
|
543
|
-
(signal) => this.generateStreamWithModel<TContext, TStructured>(model, input, signal),
|
|
544
|
-
{ maxRetries: this.retryConfig.retries, firstChunkTimeoutMs: this.retryConfig.timeout, operationName: `Gemini ${model} stream`, isRetriable: (error) => isRetriableProviderError(error, CLASSIFICATION_OPTIONS) }
|
|
545
|
-
),
|
|
546
|
-
shouldTryBackup: shouldUseBackupModel,
|
|
547
|
-
...observer.callbacks,
|
|
548
|
-
});
|
|
549
|
-
} catch (error: unknown) {
|
|
550
|
-
observer.logExhausted(error);
|
|
551
|
-
throw toProviderError(error, this.name, CLASSIFICATION_OPTIONS);
|
|
552
|
-
}
|
|
553
|
-
}
|
|
554
|
-
|
|
555
|
-
private async *generateStreamWithModel<
|
|
556
|
-
TContext = unknown,
|
|
557
|
-
TStructured = AgentStructuredResponse
|
|
558
|
-
>(
|
|
559
|
-
model: string,
|
|
560
|
-
input: GenerateMessageInput<TContext>,
|
|
561
|
-
attemptSignal?: AbortSignal
|
|
562
|
-
): AsyncGenerator<GenerateMessageStreamChunk<TStructured>> {
|
|
563
|
-
// Caller cancellation + the retry helper's per-attempt deadline, as one.
|
|
564
|
-
const reqSignal = combineAbortSignals(input.signal, attemptSignal);
|
|
565
|
-
// Streaming: request JSON if schema provided
|
|
566
|
-
const configOverride: Partial<GenerateContentConfig> = { ...this.config };
|
|
567
|
-
|
|
568
|
-
// Handle tools and JSON schema - Gemini doesn't support both simultaneously
|
|
569
|
-
const hasTools = input.tools && input.tools.length > 0;
|
|
570
|
-
const hasJsonSchema = input.parameters?.jsonSchema;
|
|
571
|
-
|
|
572
|
-
if (hasTools && hasJsonSchema) {
|
|
573
|
-
logger.debug(`[GeminiProvider] Both tools and JSON schema provided. Prioritizing function calling - JSON schema will be ignored.`);
|
|
574
|
-
}
|
|
575
|
-
|
|
576
|
-
if (hasTools) {
|
|
577
|
-
const toolNames = input.tools?.map((tool) => tool.name || tool.id) || [];
|
|
578
|
-
logger.debug(`[GeminiProvider] Configuring ${toolNames.length} tools for streaming:`, toolNames);
|
|
579
|
-
const functionDeclarations = this.buildFunctionDeclarations(input.tools!);
|
|
580
|
-
configOverride.tools = [{ functionDeclarations }];
|
|
581
|
-
|
|
582
|
-
} else if (hasJsonSchema) {
|
|
583
|
-
// Only set JSON schema if no tools are present
|
|
584
|
-
configOverride.responseMimeType = "application/json";
|
|
585
|
-
// Adapt common schema format to Gemini's specific requirements
|
|
586
|
-
configOverride.responseSchema = input.parameters ? this.adaptSchemaForGemini(
|
|
587
|
-
input.parameters.jsonSchema
|
|
588
|
-
) : {};
|
|
589
|
-
}
|
|
590
|
-
|
|
591
|
-
let stream;
|
|
592
|
-
try {
|
|
593
|
-
// Build contents from history
|
|
594
|
-
const { contents: historyContents, systemInstructions } = this.buildGeminiContents(input.history);
|
|
595
|
-
|
|
596
|
-
// Append the current prompt as the final user content
|
|
597
|
-
historyContents.push({ role: "user", parts: [{ text: input.prompt }] });
|
|
598
|
-
|
|
599
|
-
// Set system instruction from history if present
|
|
600
|
-
if (systemInstructions.length > 0) {
|
|
601
|
-
const existingSystem = configOverride.systemInstruction;
|
|
602
|
-
if (typeof existingSystem === "string") {
|
|
603
|
-
configOverride.systemInstruction = `${existingSystem}\n\n${systemInstructions.join("\n\n")}`;
|
|
604
|
-
} else {
|
|
605
|
-
configOverride.systemInstruction = systemInstructions.join("\n\n");
|
|
606
|
-
}
|
|
607
|
-
}
|
|
608
|
-
|
|
609
|
-
stream = await this.genAI.models.generateContentStream({
|
|
610
|
-
model,
|
|
611
|
-
contents: historyContents,
|
|
612
|
-
config: {
|
|
613
|
-
...configOverride,
|
|
614
|
-
...(reqSignal ? { abortSignal: reqSignal } : {}),
|
|
615
|
-
},
|
|
616
|
-
});
|
|
617
|
-
} catch (error: unknown) {
|
|
618
|
-
logger.error(`[GeminiProvider] Streaming API call failed:`, error);
|
|
619
|
-
throw error;
|
|
620
|
-
}
|
|
621
|
-
|
|
622
|
-
let accumulated = "";
|
|
623
|
-
let promptTokenCount = 0;
|
|
624
|
-
let candidatesTokenCount = 0;
|
|
625
|
-
let totalTokenCount = 0;
|
|
626
|
-
const toolCalls: Array<{
|
|
627
|
-
toolName: string;
|
|
628
|
-
arguments: Record<string, unknown>;
|
|
629
|
-
}> = [];
|
|
630
|
-
|
|
631
|
-
for await (const chunk of stream) {
|
|
632
|
-
if (reqSignal?.aborted) break;
|
|
633
|
-
|
|
634
|
-
// Safely extract text — chunk.text can throw when chunk has only function calls
|
|
635
|
-
const delta = this.safeExtractText(chunk);
|
|
636
|
-
|
|
637
|
-
// Extract tool calls from chunk
|
|
638
|
-
if (chunk.candidates && chunk.candidates[0]?.content?.parts) {
|
|
639
|
-
for (const part of chunk.candidates[0].content.parts) {
|
|
640
|
-
if (part.functionCall) {
|
|
641
|
-
toolCalls.push({
|
|
642
|
-
toolName: part.functionCall.name || "",
|
|
643
|
-
arguments: (part.functionCall.args as Record<string, unknown>) || {},
|
|
644
|
-
});
|
|
645
|
-
}
|
|
646
|
-
}
|
|
647
|
-
}
|
|
648
|
-
|
|
649
|
-
if (delta) {
|
|
650
|
-
accumulated += delta;
|
|
651
|
-
yield {
|
|
652
|
-
delta,
|
|
653
|
-
accumulated,
|
|
654
|
-
done: false,
|
|
655
|
-
};
|
|
656
|
-
}
|
|
657
|
-
|
|
658
|
-
// Update token counts if available
|
|
659
|
-
if (chunk.usageMetadata) {
|
|
660
|
-
promptTokenCount = chunk.usageMetadata.promptTokenCount || 0;
|
|
661
|
-
candidatesTokenCount = chunk.usageMetadata.candidatesTokenCount || 0;
|
|
662
|
-
totalTokenCount = chunk.usageMetadata.totalTokenCount || 0;
|
|
663
|
-
}
|
|
664
|
-
}
|
|
665
|
-
|
|
666
|
-
// Parse JSON response if schema was provided
|
|
667
|
-
let structured: AgentStructuredResponse | undefined;
|
|
668
|
-
if (input.parameters?.jsonSchema && accumulated) {
|
|
669
|
-
const parsed = tryParseJSONResponse(accumulated);
|
|
670
|
-
if (parsed) {
|
|
671
|
-
structured = parsed as AgentStructuredResponse;
|
|
672
|
-
} else {
|
|
673
|
-
logger.warn("[GeminiProvider] Failed to parse JSON response in stream, treating as plain text");
|
|
674
|
-
}
|
|
675
|
-
}
|
|
676
|
-
|
|
677
|
-
// Include tool calls in structured response (even without JSON schema)
|
|
678
|
-
if (toolCalls.length > 0) {
|
|
679
|
-
structured = {
|
|
680
|
-
message: structured?.message || accumulated,
|
|
681
|
-
...structured,
|
|
682
|
-
toolCalls,
|
|
683
|
-
} as AgentStructuredResponse;
|
|
684
|
-
}
|
|
685
|
-
|
|
686
|
-
// Empty-completion guard — same definition as the non-streaming path, so the
|
|
687
|
-
// stream retries / falls back to backup instead of emitting an empty message.
|
|
688
|
-
assertUsableCompletion(structured, accumulated, toolCalls.length, "Gemini");
|
|
689
|
-
|
|
690
|
-
// Yield final chunk
|
|
691
|
-
yield {
|
|
692
|
-
delta: "",
|
|
693
|
-
accumulated,
|
|
694
|
-
done: true,
|
|
695
|
-
metadata: {
|
|
696
|
-
model,
|
|
697
|
-
tokensUsed: totalTokenCount,
|
|
698
|
-
promptTokens: promptTokenCount,
|
|
699
|
-
completionTokens: candidatesTokenCount,
|
|
700
|
-
},
|
|
701
|
-
structured: structured as TStructured | undefined,
|
|
702
|
-
};
|
|
52
|
+
super({
|
|
53
|
+
provider: createGeminiProvider({
|
|
54
|
+
apiKey: options.apiKey,
|
|
55
|
+
model: options.model,
|
|
56
|
+
id: "gemini",
|
|
57
|
+
...(options.baseUrl ? { baseUrl: options.baseUrl } : {}),
|
|
58
|
+
...(options.config?.maxTokens ? { maxTokens: options.config.maxTokens } : {}),
|
|
59
|
+
...(options.config?.effort ? { effort: options.config.effort } : {}),
|
|
60
|
+
...(options.fetchImpl ? { fetchImpl: options.fetchImpl } : {}),
|
|
61
|
+
}),
|
|
62
|
+
model: options.model,
|
|
63
|
+
...(options.config ? { defaults: options.config } : {}),
|
|
64
|
+
...(options.backupModels ? { backupModels: options.backupModels } : {}),
|
|
65
|
+
...(options.retryConfig ? { retryConfig: options.retryConfig } : {}),
|
|
66
|
+
});
|
|
703
67
|
}
|
|
704
68
|
}
|