@vybestack/llxprt-code-core 0.1.12 → 0.1.13
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/LICENSE +202 -0
- package/README.md +256 -0
- package/dist/src/adapters/IStreamAdapter.d.ts +18 -0
- package/dist/src/adapters/IStreamAdapter.js +7 -0
- package/dist/src/adapters/IStreamAdapter.js.map +1 -0
- package/dist/src/code_assist/oauth2.d.ts +1 -1
- package/dist/src/code_assist/oauth2.js +51 -29
- package/dist/src/code_assist/oauth2.js.map +1 -1
- package/dist/src/code_assist/oauth2.test.js +36 -7
- package/dist/src/code_assist/oauth2.test.js.map +1 -1
- package/dist/src/code_assist/server.test.js +10 -2
- package/dist/src/code_assist/server.test.js.map +1 -1
- package/dist/src/config/config.d.ts +28 -5
- package/dist/src/config/config.js +29 -4
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +2 -3
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/core/client.d.ts +4 -2
- package/dist/src/core/client.js +68 -7
- package/dist/src/core/client.js.map +1 -1
- package/dist/src/core/client.test.js +8 -0
- package/dist/src/core/client.test.js.map +1 -1
- package/dist/src/core/contentGenerator.d.ts +3 -2
- package/dist/src/core/contentGenerator.js +6 -8
- package/dist/src/core/contentGenerator.js.map +1 -1
- package/dist/src/core/contentGenerator.test.js +12 -5
- package/dist/src/core/contentGenerator.test.js.map +1 -1
- package/dist/src/core/coreToolScheduler.test.js +4 -2
- package/dist/src/core/coreToolScheduler.test.js.map +1 -1
- package/dist/src/core/geminiChat.js +50 -3
- package/dist/src/core/geminiChat.js.map +1 -1
- package/dist/src/core/modelCheck.d.ts +1 -1
- package/dist/src/core/modelCheck.js +10 -3
- package/dist/src/core/modelCheck.js.map +1 -1
- package/dist/src/core/nonInteractiveToolExecutor.test.js +3 -0
- package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -1
- package/dist/src/core/prompts.d.ts +1 -1
- package/dist/src/core/prompts.js +14 -2
- package/dist/src/core/prompts.js.map +1 -1
- package/dist/src/core/turn.js +6 -0
- package/dist/src/core/turn.js.map +1 -1
- package/dist/src/index.d.ts +29 -1
- package/dist/src/index.js +33 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcp/oauth-provider.d.ts +142 -0
- package/dist/src/mcp/oauth-provider.js +446 -0
- package/dist/src/mcp/oauth-provider.js.map +1 -0
- package/dist/src/mcp/oauth-provider.test.js +520 -0
- package/dist/src/mcp/oauth-provider.test.js.map +1 -0
- package/dist/src/mcp/oauth-token-storage.d.ts +81 -0
- package/dist/src/mcp/oauth-token-storage.js +149 -0
- package/dist/src/mcp/oauth-token-storage.js.map +1 -0
- package/dist/src/mcp/oauth-token-storage.test.d.ts +6 -0
- package/dist/src/mcp/oauth-token-storage.test.js +205 -0
- package/dist/src/mcp/oauth-token-storage.test.js.map +1 -0
- package/dist/src/mcp/oauth-utils.d.ts +109 -0
- package/dist/src/mcp/oauth-utils.js +183 -0
- package/dist/src/mcp/oauth-utils.js.map +1 -0
- package/dist/src/mcp/oauth-utils.test.d.ts +6 -0
- package/dist/src/mcp/oauth-utils.test.js +144 -0
- package/dist/src/mcp/oauth-utils.test.js.map +1 -0
- package/dist/src/parsers/TextToolCallParser.d.ts +35 -0
- package/dist/src/parsers/TextToolCallParser.js +248 -0
- package/dist/src/parsers/TextToolCallParser.js.map +1 -0
- package/dist/src/parsers/TextToolCallParser.test.d.ts +1 -0
- package/dist/src/parsers/TextToolCallParser.test.js +225 -0
- package/dist/src/parsers/TextToolCallParser.test.js.map +1 -0
- package/dist/src/providers/ContentGeneratorRole.d.ts +14 -0
- package/dist/src/providers/ContentGeneratorRole.js +16 -0
- package/dist/src/providers/ContentGeneratorRole.js.map +1 -0
- package/dist/src/providers/IMessage.d.ts +38 -0
- package/dist/src/providers/IMessage.js +17 -0
- package/dist/src/providers/IMessage.js.map +1 -0
- package/dist/src/providers/IModel.d.ts +23 -0
- package/dist/src/providers/IModel.js +17 -0
- package/dist/src/providers/IModel.js.map +1 -0
- package/dist/src/providers/IProvider.d.ts +36 -0
- package/dist/src/providers/IProvider.js +17 -0
- package/dist/src/providers/IProvider.js.map +1 -0
- package/dist/src/providers/IProviderConfig.d.ts +31 -0
- package/dist/src/providers/IProviderConfig.js +7 -0
- package/dist/src/providers/IProviderConfig.js.map +1 -0
- package/dist/src/providers/IProviderManager.d.ts +53 -0
- package/dist/src/providers/IProviderManager.js +7 -0
- package/dist/src/providers/IProviderManager.js.map +1 -0
- package/dist/src/providers/ITool.d.ts +23 -0
- package/dist/src/providers/ITool.js +17 -0
- package/dist/src/providers/ITool.js.map +1 -0
- package/dist/src/providers/ProviderContentGenerator.d.ts +1 -1
- package/dist/src/providers/ProviderManager.d.ts +24 -0
- package/dist/src/providers/ProviderManager.gemini-switch.test.d.ts +6 -0
- package/dist/src/providers/ProviderManager.gemini-switch.test.js +57 -0
- package/dist/src/providers/ProviderManager.gemini-switch.test.js.map +1 -0
- package/dist/src/providers/ProviderManager.js +116 -0
- package/dist/src/providers/ProviderManager.js.map +1 -0
- package/dist/src/providers/ProviderManager.test.d.ts +6 -0
- package/dist/src/providers/ProviderManager.test.js +284 -0
- package/dist/src/providers/ProviderManager.test.js.map +1 -0
- package/dist/src/providers/adapters/GeminiCompatibleWrapper.d.ts +2 -1
- package/dist/src/providers/adapters/GeminiCompatibleWrapper.js +15 -2
- package/dist/src/providers/adapters/GeminiCompatibleWrapper.js.map +1 -1
- package/dist/src/providers/adapters/GeminiCompatibleWrapper.test.js +20 -0
- package/dist/src/providers/adapters/GeminiCompatibleWrapper.test.js.map +1 -1
- package/dist/src/providers/anthropic/AnthropicProvider.d.ts +57 -0
- package/dist/src/providers/anthropic/AnthropicProvider.js +490 -0
- package/dist/src/providers/anthropic/AnthropicProvider.js.map +1 -0
- package/dist/src/providers/anthropic/AnthropicProvider.test.d.ts +1 -0
- package/dist/src/providers/anthropic/AnthropicProvider.test.js +486 -0
- package/dist/src/providers/anthropic/AnthropicProvider.test.js.map +1 -0
- package/dist/src/providers/errors.d.ts +13 -0
- package/dist/src/providers/errors.js +19 -0
- package/dist/src/providers/errors.js.map +1 -0
- package/dist/src/providers/gemini/GeminiProvider.d.ts +97 -0
- package/dist/src/providers/gemini/GeminiProvider.integration.test.d.ts +6 -0
- package/dist/src/providers/gemini/GeminiProvider.integration.test.js +90 -0
- package/dist/src/providers/gemini/GeminiProvider.integration.test.js.map +1 -0
- package/dist/src/providers/gemini/GeminiProvider.js +937 -0
- package/dist/src/providers/gemini/GeminiProvider.js.map +1 -0
- package/dist/src/providers/gemini/GeminiProvider.test.d.ts +6 -0
- package/dist/src/providers/gemini/GeminiProvider.test.js +136 -0
- package/dist/src/providers/gemini/GeminiProvider.test.js.map +1 -0
- package/dist/src/providers/integration/TEST_INSTRUCTIONS.md +197 -0
- package/dist/src/providers/integration/multi-provider.integration.test.d.ts +6 -0
- package/dist/src/providers/integration/multi-provider.integration.test.js +292 -0
- package/dist/src/providers/integration/multi-provider.integration.test.js.map +1 -0
- package/dist/src/providers/openai/ConversationCache.accumTokens.test.d.ts +1 -0
- package/dist/src/providers/openai/ConversationCache.accumTokens.test.js +97 -0
- package/dist/src/providers/openai/ConversationCache.accumTokens.test.js.map +1 -0
- package/dist/src/providers/openai/ConversationCache.d.ts +20 -0
- package/dist/src/providers/openai/ConversationCache.js +109 -0
- package/dist/src/providers/openai/ConversationCache.js.map +1 -0
- package/dist/src/providers/openai/ConversationCache.test.d.ts +1 -0
- package/dist/src/providers/openai/ConversationCache.test.js +113 -0
- package/dist/src/providers/openai/ConversationCache.test.js.map +1 -0
- package/dist/src/providers/openai/IChatGenerateParams.d.ts +11 -0
- package/dist/src/providers/openai/IChatGenerateParams.js +2 -0
- package/dist/src/providers/openai/IChatGenerateParams.js.map +1 -0
- package/dist/src/providers/openai/OpenAIProvider.callResponses.stateless.test.d.ts +1 -0
- package/dist/src/providers/openai/OpenAIProvider.callResponses.stateless.test.js +189 -0
- package/dist/src/providers/openai/OpenAIProvider.callResponses.stateless.test.js.map +1 -0
- package/dist/src/providers/openai/OpenAIProvider.d.ts +80 -0
- package/dist/src/providers/openai/OpenAIProvider.integration.test.d.ts +6 -0
- package/dist/src/providers/openai/OpenAIProvider.integration.test.js +125 -0
- package/dist/src/providers/openai/OpenAIProvider.integration.test.js.map +1 -0
- package/dist/src/providers/openai/OpenAIProvider.js +518 -0
- package/dist/src/providers/openai/OpenAIProvider.js.map +1 -0
- package/dist/src/providers/openai/OpenAIProvider.responses.test.d.ts +1 -0
- package/dist/src/providers/openai/OpenAIProvider.responses.test.js +326 -0
- package/dist/src/providers/openai/OpenAIProvider.responses.test.js.map +1 -0
- package/dist/src/providers/openai/OpenAIProvider.responsesIntegration.test.d.ts +1 -0
- package/dist/src/providers/openai/OpenAIProvider.responsesIntegration.test.js +213 -0
- package/dist/src/providers/openai/OpenAIProvider.responsesIntegration.test.js.map +1 -0
- package/dist/src/providers/openai/OpenAIProvider.shouldUseResponses.test.d.ts +1 -0
- package/dist/src/providers/openai/OpenAIProvider.shouldUseResponses.test.js +58 -0
- package/dist/src/providers/openai/OpenAIProvider.shouldUseResponses.test.js.map +1 -0
- package/dist/src/providers/openai/OpenAIProvider.stateful.integration.test.d.ts +6 -0
- package/dist/src/providers/openai/OpenAIProvider.stateful.integration.test.js +105 -0
- package/dist/src/providers/openai/OpenAIProvider.stateful.integration.test.js.map +1 -0
- package/dist/src/providers/openai/OpenAIProvider.switch.test.d.ts +1 -0
- package/dist/src/providers/openai/OpenAIProvider.switch.test.js +256 -0
- package/dist/src/providers/openai/OpenAIProvider.switch.test.js.map +1 -0
- package/dist/src/providers/openai/OpenAIProvider.test.d.ts +16 -0
- package/dist/src/providers/openai/OpenAIProvider.test.js +214 -0
- package/dist/src/providers/openai/OpenAIProvider.test.js.map +1 -0
- package/dist/src/providers/openai/RESPONSES_API_MODELS.d.ts +2 -0
- package/dist/src/providers/openai/RESPONSES_API_MODELS.js +14 -0
- package/dist/src/providers/openai/RESPONSES_API_MODELS.js.map +1 -0
- package/dist/src/providers/openai/ResponsesContextTrim.integration.test.d.ts +1 -0
- package/dist/src/providers/openai/ResponsesContextTrim.integration.test.js +210 -0
- package/dist/src/providers/openai/ResponsesContextTrim.integration.test.js.map +1 -0
- package/dist/src/providers/openai/__tests__/formatArrayResponse.test.d.ts +1 -0
- package/dist/src/providers/openai/__tests__/formatArrayResponse.test.js +65 -0
- package/dist/src/providers/openai/__tests__/formatArrayResponse.test.js.map +1 -0
- package/dist/src/providers/openai/buildResponsesRequest.d.ts +73 -0
- package/dist/src/providers/openai/buildResponsesRequest.js +165 -0
- package/dist/src/providers/openai/buildResponsesRequest.js.map +1 -0
- package/dist/src/providers/openai/buildResponsesRequest.stripToolCalls.test.d.ts +1 -0
- package/dist/src/providers/openai/buildResponsesRequest.stripToolCalls.test.js +129 -0
- package/dist/src/providers/openai/buildResponsesRequest.stripToolCalls.test.js.map +1 -0
- package/dist/src/providers/openai/buildResponsesRequest.test.d.ts +1 -0
- package/dist/src/providers/openai/buildResponsesRequest.test.js +406 -0
- package/dist/src/providers/openai/buildResponsesRequest.test.js.map +1 -0
- package/dist/src/providers/openai/buildResponsesRequest.undefined.test.d.ts +1 -0
- package/dist/src/providers/openai/buildResponsesRequest.undefined.test.js +50 -0
- package/dist/src/providers/openai/buildResponsesRequest.undefined.test.js.map +1 -0
- package/dist/src/providers/openai/docs/accessing-provider-info.md +172 -0
- package/dist/src/providers/openai/docs/params-mapping.md +91 -0
- package/dist/src/providers/openai/docs/responses-api-tool-calls.md +96 -0
- package/dist/src/providers/openai/estimateRemoteTokens.d.ts +26 -0
- package/dist/src/providers/openai/estimateRemoteTokens.js +75 -0
- package/dist/src/providers/openai/estimateRemoteTokens.js.map +1 -0
- package/dist/src/providers/openai/estimateRemoteTokens.test.d.ts +1 -0
- package/dist/src/providers/openai/estimateRemoteTokens.test.js +125 -0
- package/dist/src/providers/openai/estimateRemoteTokens.test.js.map +1 -0
- package/dist/src/providers/openai/getOpenAIProviderInfo.d.ts +46 -0
- package/dist/src/providers/openai/getOpenAIProviderInfo.js +75 -0
- package/dist/src/providers/openai/getOpenAIProviderInfo.js.map +1 -0
- package/dist/src/providers/openai/parseResponsesStream.d.ts +3 -0
- package/dist/src/providers/openai/parseResponsesStream.js +462 -0
- package/dist/src/providers/openai/parseResponsesStream.js.map +1 -0
- package/dist/src/providers/openai/parseResponsesStream.responsesToolCalls.test.d.ts +1 -0
- package/dist/src/providers/openai/parseResponsesStream.responsesToolCalls.test.js +192 -0
- package/dist/src/providers/openai/parseResponsesStream.responsesToolCalls.test.js.map +1 -0
- package/dist/src/providers/openai/parseResponsesStream.test.d.ts +1 -0
- package/dist/src/providers/openai/parseResponsesStream.test.js +151 -0
- package/dist/src/providers/openai/parseResponsesStream.test.js.map +1 -0
- package/dist/src/providers/tokenizers/AnthropicTokenizer.d.ts +19 -0
- package/dist/src/providers/tokenizers/AnthropicTokenizer.js +37 -0
- package/dist/src/providers/tokenizers/AnthropicTokenizer.js.map +1 -0
- package/dist/src/providers/tokenizers/ITokenizer.d.ts +18 -0
- package/dist/src/providers/tokenizers/ITokenizer.js +17 -0
- package/dist/src/providers/tokenizers/ITokenizer.js.map +1 -0
- package/dist/src/providers/tokenizers/OpenAITokenizer.d.ts +24 -0
- package/dist/src/providers/tokenizers/OpenAITokenizer.js +56 -0
- package/dist/src/providers/tokenizers/OpenAITokenizer.js.map +1 -0
- package/dist/src/providers/types/IProviderConfig.d.ts +102 -0
- package/dist/src/providers/types/IProviderConfig.js +17 -0
- package/dist/src/providers/types/IProviderConfig.js.map +1 -0
- package/dist/src/providers/types.d.ts +4 -69
- package/dist/src/services/ideContext.d.ts +2 -0
- package/dist/src/services/ideContext.js +8 -0
- package/dist/src/services/ideContext.js.map +1 -1
- package/dist/src/services/ideContext.test.js +10 -0
- package/dist/src/services/ideContext.test.js.map +1 -1
- package/dist/src/services/loopDetectionService.d.ts +17 -1
- package/dist/src/services/loopDetectionService.js +117 -2
- package/dist/src/services/loopDetectionService.js.map +1 -1
- package/dist/src/services/loopDetectionService.test.js +109 -2
- package/dist/src/services/loopDetectionService.test.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +2 -0
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +40 -2
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +2 -0
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +4 -0
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
- package/dist/src/telemetry/sdk.js +0 -2
- package/dist/src/telemetry/sdk.js.map +1 -1
- package/dist/src/telemetry/types.d.ts +2 -1
- package/dist/src/telemetry/types.js +1 -0
- package/dist/src/telemetry/types.js.map +1 -1
- package/dist/src/telemetry/uiTelemetry.d.ts +1 -0
- package/dist/src/telemetry/uiTelemetry.js +7 -0
- package/dist/src/telemetry/uiTelemetry.js.map +1 -1
- package/dist/src/telemetry/uiTelemetry.test.js +92 -0
- package/dist/src/telemetry/uiTelemetry.test.js.map +1 -1
- package/dist/src/tools/IToolFormatter.d.ts +40 -0
- package/dist/src/tools/IToolFormatter.js +17 -0
- package/dist/src/tools/IToolFormatter.js.map +1 -0
- package/dist/src/tools/ToolFormatter.d.ts +45 -0
- package/dist/src/tools/ToolFormatter.js +216 -0
- package/dist/src/tools/ToolFormatter.js.map +1 -0
- package/dist/src/tools/ToolFormatter.test.d.ts +16 -0
- package/dist/src/tools/ToolFormatter.test.js +349 -0
- package/dist/src/tools/ToolFormatter.test.js.map +1 -0
- package/dist/src/tools/ToolFormatter.toResponsesTool.test.d.ts +1 -0
- package/dist/src/tools/ToolFormatter.toResponsesTool.test.js +241 -0
- package/dist/src/tools/ToolFormatter.toResponsesTool.test.js.map +1 -0
- package/dist/src/tools/edit.d.ts +7 -1
- package/dist/src/tools/edit.js +19 -7
- package/dist/src/tools/edit.js.map +1 -1
- package/dist/src/tools/glob.js +2 -2
- package/dist/src/tools/glob.js.map +1 -1
- package/dist/src/tools/grep.js +2 -2
- package/dist/src/tools/grep.js.map +1 -1
- package/dist/src/tools/ls.js +2 -2
- package/dist/src/tools/ls.js.map +1 -1
- package/dist/src/tools/mcp-client.d.ts +0 -2
- package/dist/src/tools/mcp-client.js +8 -20
- package/dist/src/tools/mcp-client.js.map +1 -1
- package/dist/src/tools/mcp-client.test.js +1 -72
- package/dist/src/tools/mcp-client.test.js.map +1 -1
- package/dist/src/tools/mcp-tool.d.ts +11 -5
- package/dist/src/tools/mcp-tool.js +33 -9
- package/dist/src/tools/mcp-tool.js.map +1 -1
- package/dist/src/tools/mcp-tool.test.js +40 -24
- package/dist/src/tools/mcp-tool.test.js.map +1 -1
- package/dist/src/tools/memoryTool.js +2 -2
- package/dist/src/tools/memoryTool.js.map +1 -1
- package/dist/src/tools/read-file.d.ts +2 -1
- package/dist/src/tools/read-file.js +5 -2
- package/dist/src/tools/read-file.js.map +1 -1
- package/dist/src/tools/read-many-files.js +2 -2
- package/dist/src/tools/read-many-files.js.map +1 -1
- package/dist/src/tools/shell.js +2 -2
- package/dist/src/tools/shell.js.map +1 -1
- package/dist/src/tools/todo-read.js +2 -2
- package/dist/src/tools/todo-read.js.map +1 -1
- package/dist/src/tools/todo-write.js +2 -2
- package/dist/src/tools/todo-write.js.map +1 -1
- package/dist/src/tools/tool-registry.d.ts +0 -1
- package/dist/src/tools/tool-registry.js +11 -8
- package/dist/src/tools/tool-registry.js.map +1 -1
- package/dist/src/tools/tool-registry.test.js +36 -10
- package/dist/src/tools/tool-registry.test.js.map +1 -1
- package/dist/src/tools/tools.d.ts +37 -2
- package/dist/src/tools/tools.js +25 -2
- package/dist/src/tools/tools.js.map +1 -1
- package/dist/src/tools/web-fetch.integration.test.d.ts +6 -0
- package/dist/src/tools/web-fetch.integration.test.js +532 -0
- package/dist/src/tools/web-fetch.integration.test.js.map +1 -0
- package/dist/src/tools/web-fetch.js +57 -50
- package/dist/src/tools/web-fetch.js.map +1 -1
- package/dist/src/tools/web-search.js +34 -6
- package/dist/src/tools/web-search.js.map +1 -1
- package/dist/src/tools/web-search.test.d.ts +6 -0
- package/dist/src/tools/web-search.test.js +229 -0
- package/dist/src/tools/web-search.test.js.map +1 -0
- package/dist/src/tools/write-file.js +12 -5
- package/dist/src/tools/write-file.js.map +1 -1
- package/dist/src/utils/browser.d.ts +13 -0
- package/dist/src/utils/browser.js +49 -0
- package/dist/src/utils/browser.js.map +1 -0
- package/dist/src/utils/errors.js +4 -4
- package/dist/src/utils/errors.js.map +1 -1
- package/dist/src/utils/memoryDiscovery.js +5 -1
- package/dist/src/utils/memoryDiscovery.js.map +1 -1
- package/dist/src/utils/quotaErrorDetection.js +0 -2
- package/dist/src/utils/quotaErrorDetection.js.map +1 -1
- package/dist/src/utils/retry.d.ts +6 -0
- package/dist/src/utils/retry.js +1 -1
- package/dist/src/utils/retry.js.map +1 -1
- package/dist/src/utils/user_account.js +6 -1
- package/dist/src/utils/user_account.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -3
- package/dist/src/tools/web-fetch.test.js +0 -70
- package/dist/src/tools/web-fetch.test.js.map +0 -1
- package/dist/vybestack-llxprt-code-core-0.1.12.tgz +0 -0
- /package/dist/src/{tools/web-fetch.test.d.ts → mcp/oauth-provider.test.d.ts} +0 -0
|
@@ -14,12 +14,17 @@ describe('GeminiCompatibleWrapper', () => {
|
|
|
14
14
|
name: 'test-provider',
|
|
15
15
|
getCurrentModel: () => 'test-model',
|
|
16
16
|
setModel: vi.fn(),
|
|
17
|
+
getModels: vi.fn().mockResolvedValue([]),
|
|
17
18
|
generateChatCompletion: vi.fn().mockImplementation(async function* () {
|
|
18
19
|
yield {
|
|
19
20
|
role: 'assistant',
|
|
20
21
|
content: 'Test response',
|
|
21
22
|
};
|
|
22
23
|
}),
|
|
24
|
+
getServerTools: () => [],
|
|
25
|
+
invokeServerTool: vi
|
|
26
|
+
.fn()
|
|
27
|
+
.mockRejectedValue(new Error('Server tools not supported')),
|
|
23
28
|
};
|
|
24
29
|
const wrapper = new GeminiCompatibleWrapper(mockProvider);
|
|
25
30
|
// Test tools with Type enum values
|
|
@@ -103,12 +108,17 @@ describe('GeminiCompatibleWrapper', () => {
|
|
|
103
108
|
name: 'test-provider',
|
|
104
109
|
getCurrentModel: () => 'test-model',
|
|
105
110
|
setModel: vi.fn(),
|
|
111
|
+
getModels: vi.fn().mockResolvedValue([]),
|
|
106
112
|
generateChatCompletion: vi.fn().mockImplementation(async function* () {
|
|
107
113
|
yield {
|
|
108
114
|
role: 'assistant',
|
|
109
115
|
content: 'Test response',
|
|
110
116
|
};
|
|
111
117
|
}),
|
|
118
|
+
getServerTools: () => [],
|
|
119
|
+
invokeServerTool: vi
|
|
120
|
+
.fn()
|
|
121
|
+
.mockRejectedValue(new Error('Server tools not supported')),
|
|
112
122
|
};
|
|
113
123
|
const wrapper = new GeminiCompatibleWrapper(mockProvider);
|
|
114
124
|
// Test tools with plain string types (already lowercase)
|
|
@@ -162,7 +172,12 @@ describe('GeminiCompatibleWrapper', () => {
|
|
|
162
172
|
name: 'test-provider',
|
|
163
173
|
getCurrentModel: () => 'test-model',
|
|
164
174
|
setModel: vi.fn(),
|
|
175
|
+
getModels: vi.fn().mockResolvedValue([]),
|
|
165
176
|
generateChatCompletion: vi.fn(),
|
|
177
|
+
getServerTools: () => [],
|
|
178
|
+
invokeServerTool: vi
|
|
179
|
+
.fn()
|
|
180
|
+
.mockRejectedValue(new Error('Server tools not supported')),
|
|
166
181
|
};
|
|
167
182
|
const wrapper = new GeminiCompatibleWrapper(mockProvider);
|
|
168
183
|
// Test content with both functionResponse and PDF inlineData
|
|
@@ -218,7 +233,12 @@ describe('GeminiCompatibleWrapper', () => {
|
|
|
218
233
|
name: 'test-provider',
|
|
219
234
|
getCurrentModel: () => 'test-model',
|
|
220
235
|
setModel: vi.fn(),
|
|
236
|
+
getModels: vi.fn().mockResolvedValue([]),
|
|
221
237
|
generateChatCompletion: vi.fn(),
|
|
238
|
+
getServerTools: () => [],
|
|
239
|
+
invokeServerTool: vi
|
|
240
|
+
.fn()
|
|
241
|
+
.mockRejectedValue(new Error('Server tools not supported')),
|
|
222
242
|
};
|
|
223
243
|
const wrapper = new GeminiCompatibleWrapper(mockProvider);
|
|
224
244
|
// Test content with only functionResponse
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GeminiCompatibleWrapper.test.js","sourceRoot":"","sources":["../../../../src/providers/adapters/GeminiCompatibleWrapper.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAQ,MAAM,QAAQ,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAEvE,OAAO,EAAE,IAAI,EAAQ,MAAM,eAAe,CAAC;AAE3C,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,QAAQ,CAAC,mCAAmC,EAAE,GAAG,EAAE;QACjD,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;YACpE,yBAAyB;YACzB,MAAM,YAAY,GAAa;gBAC7B,IAAI,EAAE,eAAe;gBACrB,eAAe,EAAE,GAAG,EAAE,CAAC,YAAY;gBACnC,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE;gBACjB,sBAAsB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK,SAAS,CAAC;oBAChE,MAAM;wBACJ,IAAI,EAAE,WAAW;wBACjB,OAAO,EAAE,eAAe;qBACzB,CAAC;gBACJ,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"GeminiCompatibleWrapper.test.js","sourceRoot":"","sources":["../../../../src/providers/adapters/GeminiCompatibleWrapper.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { IProvider } from '../IProvider.js';
|
|
2
|
+
import { IModel } from '../IModel.js';
|
|
3
|
+
import { ITool } from '../ITool.js';
|
|
4
|
+
import { IMessage } from '../IMessage.js';
|
|
5
|
+
import type { ToolFormat } from '../../tools/IToolFormatter.js';
|
|
6
|
+
export declare class AnthropicProvider implements IProvider {
|
|
7
|
+
name: string;
|
|
8
|
+
private anthropic;
|
|
9
|
+
private toolFormatter;
|
|
10
|
+
toolFormat: ToolFormat;
|
|
11
|
+
private apiKey;
|
|
12
|
+
private baseURL?;
|
|
13
|
+
private currentModel;
|
|
14
|
+
private modelCache;
|
|
15
|
+
private readonly modelCacheTTL;
|
|
16
|
+
private readonly retryableErrorMessages;
|
|
17
|
+
private modelTokenPatterns;
|
|
18
|
+
constructor(apiKey: string, baseURL?: string);
|
|
19
|
+
getModels(): Promise<IModel[]>;
|
|
20
|
+
generateChatCompletion(messages: IMessage[], tools?: ITool[], _toolFormat?: string): AsyncIterableIterator<unknown>;
|
|
21
|
+
setApiKey(apiKey: string): void;
|
|
22
|
+
setBaseUrl(baseUrl?: string): void;
|
|
23
|
+
setModel(modelId: string): void;
|
|
24
|
+
getCurrentModel(): string;
|
|
25
|
+
/**
|
|
26
|
+
* Helper method to get the latest Claude 4 model ID for a given tier.
|
|
27
|
+
* This can be used when you want to ensure you're using the latest model.
|
|
28
|
+
* @param tier - The model tier: 'opus', 'sonnet', or 'haiku'
|
|
29
|
+
* @returns The latest model ID for that tier
|
|
30
|
+
*/
|
|
31
|
+
getLatestClaude4Model(tier?: 'opus' | 'sonnet' | 'haiku'): string;
|
|
32
|
+
/**
|
|
33
|
+
* Resolves a model ID that may contain "-latest" to the actual model ID.
|
|
34
|
+
* Caches the result to avoid frequent API calls.
|
|
35
|
+
*/
|
|
36
|
+
private resolveLatestModel;
|
|
37
|
+
private getMaxTokensForModel;
|
|
38
|
+
private getContextWindowForModel;
|
|
39
|
+
private isRetryableError;
|
|
40
|
+
/**
|
|
41
|
+
* Validates and potentially fixes the message history to ensure proper tool_use/tool_result pairing.
|
|
42
|
+
* This prevents the "tool_use ids were found without tool_result blocks" error after a failed request.
|
|
43
|
+
*/
|
|
44
|
+
private validateAndFixMessages;
|
|
45
|
+
/**
|
|
46
|
+
* Anthropic always requires payment (API key)
|
|
47
|
+
*/
|
|
48
|
+
isPaidMode(): boolean;
|
|
49
|
+
/**
|
|
50
|
+
* Get the list of server tools supported by this provider
|
|
51
|
+
*/
|
|
52
|
+
getServerTools(): string[];
|
|
53
|
+
/**
|
|
54
|
+
* Invoke a server tool (native provider tool)
|
|
55
|
+
*/
|
|
56
|
+
invokeServerTool(_toolName: string, _params: unknown, _config?: unknown): Promise<unknown>;
|
|
57
|
+
}
|
|
@@ -0,0 +1,490 @@
|
|
|
1
|
+
import Anthropic from '@anthropic-ai/sdk';
|
|
2
|
+
import { retryWithBackoff } from '../../utils/retry.js';
|
|
3
|
+
import { ToolFormatter } from '../../tools/ToolFormatter.js';
|
|
4
|
+
export class AnthropicProvider {
|
|
5
|
+
name = 'anthropic';
|
|
6
|
+
anthropic;
|
|
7
|
+
toolFormatter;
|
|
8
|
+
toolFormat = 'anthropic';
|
|
9
|
+
apiKey;
|
|
10
|
+
baseURL;
|
|
11
|
+
currentModel = 'claude-sonnet-4-latest'; // Default model using latest alias
|
|
12
|
+
// Model cache for latest resolution
|
|
13
|
+
modelCache = null;
|
|
14
|
+
modelCacheTTL = 5 * 60 * 1000; // 5 minutes
|
|
15
|
+
// Retry configuration
|
|
16
|
+
retryableErrorMessages = [
|
|
17
|
+
'overloaded',
|
|
18
|
+
'rate_limit',
|
|
19
|
+
'server_error',
|
|
20
|
+
'service_unavailable',
|
|
21
|
+
];
|
|
22
|
+
// Model patterns for max output tokens
|
|
23
|
+
modelTokenPatterns = [
|
|
24
|
+
{ pattern: /claude-.*opus-4/i, tokens: 32000 },
|
|
25
|
+
{ pattern: /claude-.*sonnet-4/i, tokens: 64000 },
|
|
26
|
+
{ pattern: /claude-.*haiku-4/i, tokens: 200000 }, // Future-proofing for Haiku 4
|
|
27
|
+
{ pattern: /claude-.*3-7.*sonnet/i, tokens: 64000 },
|
|
28
|
+
{ pattern: /claude-.*3-5.*sonnet/i, tokens: 8192 },
|
|
29
|
+
{ pattern: /claude-.*3-5.*haiku/i, tokens: 8192 },
|
|
30
|
+
{ pattern: /claude-.*3.*opus/i, tokens: 4096 },
|
|
31
|
+
{ pattern: /claude-.*3.*haiku/i, tokens: 4096 },
|
|
32
|
+
];
|
|
33
|
+
constructor(apiKey, baseURL) {
|
|
34
|
+
this.apiKey = apiKey;
|
|
35
|
+
this.baseURL = baseURL;
|
|
36
|
+
this.anthropic = new Anthropic({
|
|
37
|
+
apiKey,
|
|
38
|
+
baseURL,
|
|
39
|
+
});
|
|
40
|
+
this.toolFormatter = new ToolFormatter();
|
|
41
|
+
}
|
|
42
|
+
async getModels() {
|
|
43
|
+
if (!this.apiKey || this.apiKey.trim() === '') {
|
|
44
|
+
throw new Error('Anthropic API key is required to fetch models');
|
|
45
|
+
}
|
|
46
|
+
try {
|
|
47
|
+
// Fetch models from Anthropic API (beta endpoint)
|
|
48
|
+
const models = [];
|
|
49
|
+
// Handle pagination
|
|
50
|
+
for await (const model of this.anthropic.beta.models.list()) {
|
|
51
|
+
models.push({
|
|
52
|
+
id: model.id,
|
|
53
|
+
name: model.display_name || model.id,
|
|
54
|
+
provider: 'anthropic',
|
|
55
|
+
supportedToolFormats: ['anthropic'],
|
|
56
|
+
contextWindow: this.getContextWindowForModel(model.id),
|
|
57
|
+
maxOutputTokens: this.getMaxTokensForModel(model.id),
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
// Add "latest" aliases for Claude 4 tiers (opus, sonnet). We pick the newest
|
|
61
|
+
// version of each tier based on the sorted order created above.
|
|
62
|
+
const addLatestAlias = (tier) => {
|
|
63
|
+
const latest = models
|
|
64
|
+
.filter((m) => m.id.startsWith(`claude-${tier}-4-`))
|
|
65
|
+
.sort((a, b) => b.id.localeCompare(a.id))[0];
|
|
66
|
+
if (latest) {
|
|
67
|
+
models.push({
|
|
68
|
+
...latest,
|
|
69
|
+
id: `claude-${tier}-4-latest`,
|
|
70
|
+
name: latest.name.replace(/-\d{8}$/, '-latest'),
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
addLatestAlias('opus');
|
|
75
|
+
addLatestAlias('sonnet');
|
|
76
|
+
return models;
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
console.error('Failed to fetch Anthropic models:', error);
|
|
80
|
+
return []; // Return empty array on error
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
async *generateChatCompletion(messages, tools, _toolFormat) {
|
|
84
|
+
if (!this.apiKey || this.apiKey.trim() === '') {
|
|
85
|
+
throw new Error('Anthropic API key is required to generate chat completions');
|
|
86
|
+
}
|
|
87
|
+
let attemptCount = 0;
|
|
88
|
+
const apiCall = async () => {
|
|
89
|
+
attemptCount++;
|
|
90
|
+
// Resolve model if it uses -latest placeholder
|
|
91
|
+
const resolvedModel = await this.resolveLatestModel(this.currentModel);
|
|
92
|
+
// Validate and fix message history to prevent tool_use/tool_result mismatches
|
|
93
|
+
const validatedMessages = attemptCount > 1 ? this.validateAndFixMessages(messages) : messages;
|
|
94
|
+
// Use the resolved model for the API call
|
|
95
|
+
const modelForApi = resolvedModel;
|
|
96
|
+
// Extract system message if present and handle tool responses
|
|
97
|
+
let systemMessage;
|
|
98
|
+
const anthropicMessages = [];
|
|
99
|
+
for (const msg of validatedMessages) {
|
|
100
|
+
if (msg.role === 'system') {
|
|
101
|
+
systemMessage = msg.content;
|
|
102
|
+
}
|
|
103
|
+
else if (msg.role === 'tool') {
|
|
104
|
+
// Anthropic expects tool responses as user messages with tool_result content
|
|
105
|
+
anthropicMessages.push({
|
|
106
|
+
role: 'user',
|
|
107
|
+
content: [
|
|
108
|
+
{
|
|
109
|
+
type: 'tool_result',
|
|
110
|
+
tool_use_id: msg.tool_call_id || 'unknown',
|
|
111
|
+
content: msg.content,
|
|
112
|
+
},
|
|
113
|
+
],
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
else if (msg.role === 'assistant' && msg.tool_calls) {
|
|
117
|
+
// Handle assistant messages with tool calls
|
|
118
|
+
const content = [];
|
|
119
|
+
if (msg.content) {
|
|
120
|
+
content.push({ type: 'text', text: msg.content });
|
|
121
|
+
}
|
|
122
|
+
for (const toolCall of msg.tool_calls) {
|
|
123
|
+
content.push({
|
|
124
|
+
type: 'tool_use',
|
|
125
|
+
id: toolCall.id,
|
|
126
|
+
name: toolCall.function.name,
|
|
127
|
+
input: toolCall.function.arguments
|
|
128
|
+
? JSON.parse(toolCall.function.arguments)
|
|
129
|
+
: {},
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
anthropicMessages.push({
|
|
133
|
+
role: 'assistant',
|
|
134
|
+
content,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
// Regular user/assistant messages
|
|
139
|
+
anthropicMessages.push({
|
|
140
|
+
role: msg.role,
|
|
141
|
+
content: msg.content,
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
// Convert ITool[] to Anthropic's tool format if tools are provided
|
|
146
|
+
const anthropicTools = tools
|
|
147
|
+
? this.toolFormatter.toProviderFormat(tools, 'anthropic')
|
|
148
|
+
: undefined;
|
|
149
|
+
// Create the stream with proper typing
|
|
150
|
+
const createOptions = {
|
|
151
|
+
model: modelForApi,
|
|
152
|
+
messages: anthropicMessages,
|
|
153
|
+
max_tokens: this.getMaxTokensForModel(resolvedModel),
|
|
154
|
+
stream: true,
|
|
155
|
+
};
|
|
156
|
+
// Add system message as top-level parameter if present
|
|
157
|
+
if (systemMessage) {
|
|
158
|
+
createOptions.system = systemMessage;
|
|
159
|
+
}
|
|
160
|
+
if (anthropicTools) {
|
|
161
|
+
createOptions.tools = anthropicTools;
|
|
162
|
+
}
|
|
163
|
+
return this.anthropic.messages.create(createOptions);
|
|
164
|
+
};
|
|
165
|
+
try {
|
|
166
|
+
const stream = await retryWithBackoff(apiCall, {
|
|
167
|
+
shouldRetry: (error) => this.isRetryableError(error),
|
|
168
|
+
});
|
|
169
|
+
let currentUsage;
|
|
170
|
+
// Track current tool call being streamed
|
|
171
|
+
let currentToolCall;
|
|
172
|
+
// Process the stream
|
|
173
|
+
for await (const chunk of stream) {
|
|
174
|
+
if (chunk.type === 'message_start') {
|
|
175
|
+
// Initial usage info
|
|
176
|
+
if (chunk.message.usage) {
|
|
177
|
+
const usage = chunk.message.usage;
|
|
178
|
+
if (usage.input_tokens !== null && usage.output_tokens !== null) {
|
|
179
|
+
currentUsage = {
|
|
180
|
+
input_tokens: usage.input_tokens,
|
|
181
|
+
output_tokens: usage.output_tokens,
|
|
182
|
+
};
|
|
183
|
+
yield {
|
|
184
|
+
role: 'assistant',
|
|
185
|
+
content: '',
|
|
186
|
+
usage: {
|
|
187
|
+
prompt_tokens: currentUsage.input_tokens,
|
|
188
|
+
completion_tokens: currentUsage.output_tokens,
|
|
189
|
+
total_tokens: currentUsage.input_tokens + currentUsage.output_tokens,
|
|
190
|
+
},
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
else if (chunk.type === 'content_block_start') {
|
|
196
|
+
// Handle tool use blocks
|
|
197
|
+
if (chunk.content_block.type === 'tool_use') {
|
|
198
|
+
currentToolCall = {
|
|
199
|
+
id: chunk.content_block.id,
|
|
200
|
+
name: chunk.content_block.name,
|
|
201
|
+
input: '',
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
else if (chunk.type === 'content_block_delta') {
|
|
206
|
+
// Yield content chunks
|
|
207
|
+
if (chunk.delta.type === 'text_delta') {
|
|
208
|
+
yield {
|
|
209
|
+
role: 'assistant',
|
|
210
|
+
content: chunk.delta.text,
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
else if (chunk.delta.type === 'input_json_delta' &&
|
|
214
|
+
currentToolCall) {
|
|
215
|
+
// Handle input deltas for tool calls
|
|
216
|
+
currentToolCall.input += chunk.delta.partial_json;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
else if (chunk.type === 'content_block_stop') {
|
|
220
|
+
// Complete the tool call
|
|
221
|
+
if (currentToolCall) {
|
|
222
|
+
const toolCallResult = this.toolFormatter.fromProviderFormat({
|
|
223
|
+
id: currentToolCall.id,
|
|
224
|
+
type: 'tool_use',
|
|
225
|
+
name: currentToolCall.name,
|
|
226
|
+
input: currentToolCall.input
|
|
227
|
+
? JSON.parse(currentToolCall.input)
|
|
228
|
+
: undefined,
|
|
229
|
+
}, 'anthropic');
|
|
230
|
+
yield {
|
|
231
|
+
role: 'assistant',
|
|
232
|
+
content: '',
|
|
233
|
+
tool_calls: toolCallResult,
|
|
234
|
+
};
|
|
235
|
+
currentToolCall = undefined;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
else if (chunk.type === 'message_delta') {
|
|
239
|
+
// Update usage if provided
|
|
240
|
+
if (chunk.usage &&
|
|
241
|
+
chunk.usage.input_tokens !== null &&
|
|
242
|
+
chunk.usage.output_tokens !== null) {
|
|
243
|
+
currentUsage = {
|
|
244
|
+
input_tokens: chunk.usage.input_tokens,
|
|
245
|
+
output_tokens: chunk.usage.output_tokens,
|
|
246
|
+
};
|
|
247
|
+
yield {
|
|
248
|
+
role: 'assistant',
|
|
249
|
+
content: '',
|
|
250
|
+
usage: {
|
|
251
|
+
prompt_tokens: currentUsage.input_tokens,
|
|
252
|
+
completion_tokens: currentUsage.output_tokens,
|
|
253
|
+
total_tokens: currentUsage.input_tokens + currentUsage.output_tokens,
|
|
254
|
+
},
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
else if (chunk.type === 'message_stop') {
|
|
259
|
+
// Final usage info
|
|
260
|
+
if (currentUsage) {
|
|
261
|
+
yield {
|
|
262
|
+
role: 'assistant',
|
|
263
|
+
content: '',
|
|
264
|
+
usage: {
|
|
265
|
+
prompt_tokens: currentUsage.input_tokens,
|
|
266
|
+
completion_tokens: currentUsage.output_tokens,
|
|
267
|
+
total_tokens: currentUsage.input_tokens + currentUsage.output_tokens,
|
|
268
|
+
},
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
catch (error) {
|
|
275
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
276
|
+
throw new Error(`Anthropic API error: ${errorMessage}`);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
setApiKey(apiKey) {
|
|
280
|
+
this.apiKey = apiKey;
|
|
281
|
+
// Create a new Anthropic client with the updated API key
|
|
282
|
+
this.anthropic = new Anthropic({
|
|
283
|
+
apiKey,
|
|
284
|
+
baseURL: this.baseURL,
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
setBaseUrl(baseUrl) {
|
|
288
|
+
// If no baseUrl is provided, clear to default (undefined)
|
|
289
|
+
this.baseURL = baseUrl && baseUrl.trim() !== '' ? baseUrl : undefined;
|
|
290
|
+
// Create a new Anthropic client with the updated (or cleared) base URL
|
|
291
|
+
this.anthropic = new Anthropic({
|
|
292
|
+
apiKey: this.apiKey,
|
|
293
|
+
baseURL: this.baseURL,
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
setModel(modelId) {
|
|
297
|
+
this.currentModel = modelId;
|
|
298
|
+
}
|
|
299
|
+
getCurrentModel() {
|
|
300
|
+
return this.currentModel;
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Helper method to get the latest Claude 4 model ID for a given tier.
|
|
304
|
+
* This can be used when you want to ensure you're using the latest model.
|
|
305
|
+
* @param tier - The model tier: 'opus', 'sonnet', or 'haiku'
|
|
306
|
+
* @returns The latest model ID for that tier
|
|
307
|
+
*/
|
|
308
|
+
getLatestClaude4Model(tier = 'sonnet') {
|
|
309
|
+
switch (tier) {
|
|
310
|
+
case 'opus':
|
|
311
|
+
return 'claude-opus-4-latest';
|
|
312
|
+
case 'sonnet':
|
|
313
|
+
return 'claude-sonnet-4-latest';
|
|
314
|
+
case 'haiku':
|
|
315
|
+
// Haiku 4 not yet available, but future-proofed
|
|
316
|
+
return 'claude-haiku-4-latest';
|
|
317
|
+
default:
|
|
318
|
+
return 'claude-sonnet-4-latest';
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Resolves a model ID that may contain "-latest" to the actual model ID.
|
|
323
|
+
* Caches the result to avoid frequent API calls.
|
|
324
|
+
*/
|
|
325
|
+
async resolveLatestModel(modelId) {
|
|
326
|
+
// If it's not a latest alias, return as-is
|
|
327
|
+
if (!modelId.endsWith('-latest')) {
|
|
328
|
+
return modelId;
|
|
329
|
+
}
|
|
330
|
+
// Check cache
|
|
331
|
+
const now = Date.now();
|
|
332
|
+
if (this.modelCache &&
|
|
333
|
+
now - this.modelCache.timestamp < this.modelCacheTTL) {
|
|
334
|
+
// Find the corresponding model from cache
|
|
335
|
+
const model = this.modelCache.models.find((m) => m.id === modelId);
|
|
336
|
+
if (model) {
|
|
337
|
+
// The latest aliases are synthetic, find the real model
|
|
338
|
+
const tier = modelId.includes('opus') ? 'opus' : 'sonnet';
|
|
339
|
+
const realModel = this.modelCache.models
|
|
340
|
+
.filter((m) => m.id.startsWith(`claude-${tier}-4-`) && !m.id.endsWith('-latest'))
|
|
341
|
+
.sort((a, b) => b.id.localeCompare(a.id))[0];
|
|
342
|
+
return realModel ? realModel.id : modelId;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
// Fetch fresh models
|
|
346
|
+
const models = await this.getModels();
|
|
347
|
+
this.modelCache = { models, timestamp: now };
|
|
348
|
+
// Find the real model for this latest alias
|
|
349
|
+
const tier = modelId.includes('opus') ? 'opus' : 'sonnet';
|
|
350
|
+
const realModel = models
|
|
351
|
+
.filter((m) => m.id.startsWith(`claude-${tier}-4-`) && !m.id.endsWith('-latest'))
|
|
352
|
+
.sort((a, b) => b.id.localeCompare(a.id))[0];
|
|
353
|
+
return realModel ? realModel.id : modelId;
|
|
354
|
+
}
|
|
355
|
+
getMaxTokensForModel(modelId) {
|
|
356
|
+
// Handle latest aliases explicitly
|
|
357
|
+
if (modelId === 'claude-opus-4-latest' ||
|
|
358
|
+
modelId.includes('claude-opus-4')) {
|
|
359
|
+
return 32000;
|
|
360
|
+
}
|
|
361
|
+
if (modelId === 'claude-sonnet-4-latest' ||
|
|
362
|
+
modelId.includes('claude-sonnet-4')) {
|
|
363
|
+
return 64000;
|
|
364
|
+
}
|
|
365
|
+
// Try to match model patterns
|
|
366
|
+
for (const { pattern, tokens } of this.modelTokenPatterns) {
|
|
367
|
+
if (pattern.test(modelId)) {
|
|
368
|
+
return tokens;
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
// Default for unknown models
|
|
372
|
+
return 4096;
|
|
373
|
+
}
|
|
374
|
+
getContextWindowForModel(modelId) {
|
|
375
|
+
// Claude 4 models have larger context windows
|
|
376
|
+
if (modelId.includes('claude-opus-4')) {
|
|
377
|
+
return 500000;
|
|
378
|
+
}
|
|
379
|
+
if (modelId.includes('claude-sonnet-4')) {
|
|
380
|
+
return 400000;
|
|
381
|
+
}
|
|
382
|
+
// Claude 3.7 models
|
|
383
|
+
if (modelId.includes('claude-3-7')) {
|
|
384
|
+
return 300000;
|
|
385
|
+
}
|
|
386
|
+
// Default for Claude 3.x models
|
|
387
|
+
return 200000;
|
|
388
|
+
}
|
|
389
|
+
isRetryableError(error) {
|
|
390
|
+
if (!(error instanceof Error))
|
|
391
|
+
return false;
|
|
392
|
+
const errorMessage = error.message.toLowerCase();
|
|
393
|
+
if (error.message.includes('rate_limit_error'))
|
|
394
|
+
return true;
|
|
395
|
+
// Check for Anthropic-specific error patterns
|
|
396
|
+
if (error.message.includes('Anthropic API error:')) {
|
|
397
|
+
// Extract the actual error content
|
|
398
|
+
const match = error.message.match(/{"type":"error","error":({.*})}/);
|
|
399
|
+
if (match) {
|
|
400
|
+
try {
|
|
401
|
+
const errorData = JSON.parse(match[1]);
|
|
402
|
+
const errorType = errorData.type?.toLowerCase() || '';
|
|
403
|
+
const errorMsg = errorData.message?.toLowerCase() || '';
|
|
404
|
+
return this.retryableErrorMessages.some((retryable) => errorType.includes(retryable) || errorMsg.includes(retryable));
|
|
405
|
+
}
|
|
406
|
+
catch {
|
|
407
|
+
// If parsing fails, fall back to string matching
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
// Direct error message checking
|
|
412
|
+
return this.retryableErrorMessages.some((msg) => errorMessage.includes(msg));
|
|
413
|
+
}
|
|
414
|
+
/**
|
|
415
|
+
* Validates and potentially fixes the message history to ensure proper tool_use/tool_result pairing.
|
|
416
|
+
* This prevents the "tool_use ids were found without tool_result blocks" error after a failed request.
|
|
417
|
+
*/
|
|
418
|
+
validateAndFixMessages(messages) {
|
|
419
|
+
const fixedMessages = [];
|
|
420
|
+
let pendingToolCalls = [];
|
|
421
|
+
for (let i = 0; i < messages.length; i++) {
|
|
422
|
+
const msg = messages[i];
|
|
423
|
+
if (msg.role === 'assistant' && msg.tool_calls) {
|
|
424
|
+
// Track tool calls from assistant
|
|
425
|
+
fixedMessages.push(msg);
|
|
426
|
+
pendingToolCalls = msg.tool_calls.map((tc) => ({
|
|
427
|
+
id: tc.id,
|
|
428
|
+
name: tc.function.name,
|
|
429
|
+
}));
|
|
430
|
+
}
|
|
431
|
+
else if (msg.role === 'tool' && pendingToolCalls.length > 0) {
|
|
432
|
+
// Match tool results with pending tool calls
|
|
433
|
+
fixedMessages.push(msg);
|
|
434
|
+
// Remove the matched tool call
|
|
435
|
+
pendingToolCalls = pendingToolCalls.filter((tc) => tc.id !== msg.tool_call_id);
|
|
436
|
+
}
|
|
437
|
+
else if (msg.role === 'assistant' ||
|
|
438
|
+
msg.role === 'user' ||
|
|
439
|
+
msg.role === 'system') {
|
|
440
|
+
// If we have pending tool calls and encounter a non-tool message,
|
|
441
|
+
// we need to add dummy tool results to maintain consistency
|
|
442
|
+
if (pendingToolCalls.length > 0 && msg.role !== 'system') {
|
|
443
|
+
// Add dummy tool results for unmatched tool calls
|
|
444
|
+
for (const toolCall of pendingToolCalls) {
|
|
445
|
+
fixedMessages.push({
|
|
446
|
+
role: 'tool',
|
|
447
|
+
tool_call_id: toolCall.id,
|
|
448
|
+
content: 'Error: Tool execution was interrupted. Please retry.',
|
|
449
|
+
});
|
|
450
|
+
}
|
|
451
|
+
pendingToolCalls = [];
|
|
452
|
+
}
|
|
453
|
+
fixedMessages.push(msg);
|
|
454
|
+
}
|
|
455
|
+
else {
|
|
456
|
+
fixedMessages.push(msg);
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
// Handle any remaining pending tool calls at the end
|
|
460
|
+
if (pendingToolCalls.length > 0) {
|
|
461
|
+
for (const toolCall of pendingToolCalls) {
|
|
462
|
+
fixedMessages.push({
|
|
463
|
+
role: 'tool',
|
|
464
|
+
tool_call_id: toolCall.id,
|
|
465
|
+
content: 'Error: Tool execution was interrupted. Please retry.',
|
|
466
|
+
});
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
return fixedMessages;
|
|
470
|
+
}
|
|
471
|
+
/**
|
|
472
|
+
* Anthropic always requires payment (API key)
|
|
473
|
+
*/
|
|
474
|
+
isPaidMode() {
|
|
475
|
+
return true;
|
|
476
|
+
}
|
|
477
|
+
/**
|
|
478
|
+
* Get the list of server tools supported by this provider
|
|
479
|
+
*/
|
|
480
|
+
getServerTools() {
|
|
481
|
+
return [];
|
|
482
|
+
}
|
|
483
|
+
/**
|
|
484
|
+
* Invoke a server tool (native provider tool)
|
|
485
|
+
*/
|
|
486
|
+
async invokeServerTool(_toolName, _params, _config) {
|
|
487
|
+
throw new Error('Server tools not supported by Anthropic provider');
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
//# sourceMappingURL=AnthropicProvider.js.map
|