@vybestack/llxprt-code-core 0.1.12 → 0.1.13-hotfix1
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/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 +523 -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
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2025 Vybestack LLC
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=IToolFormatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IToolFormatter.js","sourceRoot":"","sources":["../../../src/tools/IToolFormatter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2025 Vybestack LLC
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
import { IToolFormatter, ToolFormat, OpenAITool, ResponsesTool } from './IToolFormatter.js';
|
|
17
|
+
import { ITool } from '../providers/ITool.js';
|
|
18
|
+
import { IMessage } from '../providers/IMessage.js';
|
|
19
|
+
export declare class ToolFormatter implements IToolFormatter {
|
|
20
|
+
/**
|
|
21
|
+
* Converts Gemini schema format (with uppercase Type enums) to standard JSON Schema format
|
|
22
|
+
*/
|
|
23
|
+
private convertGeminiSchemaToStandard;
|
|
24
|
+
toProviderFormat(tools: ITool[], format: 'openai'): OpenAITool[];
|
|
25
|
+
toProviderFormat(tools: ITool[], format: ToolFormat): unknown;
|
|
26
|
+
fromProviderFormat(rawToolCall: unknown, format: ToolFormat): IMessage['tool_calls'];
|
|
27
|
+
/**
|
|
28
|
+
* Handles streaming tool call accumulation for OpenAI-compatible providers
|
|
29
|
+
* This accumulates partial tool calls from streaming responses
|
|
30
|
+
*/
|
|
31
|
+
accumulateStreamingToolCall(deltaToolCall: {
|
|
32
|
+
index?: number;
|
|
33
|
+
id?: string;
|
|
34
|
+
type?: string;
|
|
35
|
+
function?: {
|
|
36
|
+
name?: string;
|
|
37
|
+
arguments?: string;
|
|
38
|
+
};
|
|
39
|
+
}, accumulatedToolCalls: NonNullable<IMessage['tool_calls']>, format: ToolFormat): void;
|
|
40
|
+
/**
|
|
41
|
+
* Formats tools specifically for the OpenAI Responses API
|
|
42
|
+
* The Responses API expects a flatter format than the regular OpenAI API
|
|
43
|
+
*/
|
|
44
|
+
toResponsesTool(tools: ITool[]): ResponsesTool[];
|
|
45
|
+
}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2025 Vybestack LLC
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
export class ToolFormatter {
|
|
17
|
+
/**
|
|
18
|
+
* Converts Gemini schema format (with uppercase Type enums) to standard JSON Schema format
|
|
19
|
+
*/
|
|
20
|
+
convertGeminiSchemaToStandard(schema) {
|
|
21
|
+
if (!schema || typeof schema !== 'object') {
|
|
22
|
+
return schema;
|
|
23
|
+
}
|
|
24
|
+
const newSchema = { ...schema };
|
|
25
|
+
// Handle properties
|
|
26
|
+
if (newSchema.properties && typeof newSchema.properties === 'object') {
|
|
27
|
+
const newProperties = {};
|
|
28
|
+
for (const [key, value] of Object.entries(newSchema.properties)) {
|
|
29
|
+
newProperties[key] = this.convertGeminiSchemaToStandard(value);
|
|
30
|
+
}
|
|
31
|
+
newSchema.properties = newProperties;
|
|
32
|
+
}
|
|
33
|
+
// Handle items
|
|
34
|
+
if (newSchema.items) {
|
|
35
|
+
if (Array.isArray(newSchema.items)) {
|
|
36
|
+
newSchema.items = newSchema.items.map((item) => this.convertGeminiSchemaToStandard(item));
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
newSchema.items = this.convertGeminiSchemaToStandard(newSchema.items);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// Convert type from UPPERCASE enum to lowercase string
|
|
43
|
+
if (newSchema.type) {
|
|
44
|
+
newSchema.type = String(newSchema.type).toLowerCase();
|
|
45
|
+
}
|
|
46
|
+
return newSchema;
|
|
47
|
+
}
|
|
48
|
+
toProviderFormat(tools, format) {
|
|
49
|
+
switch (format) {
|
|
50
|
+
case 'openai':
|
|
51
|
+
case 'deepseek': // DeepSeek uses same format as OpenAI for now
|
|
52
|
+
case 'qwen': // Qwen uses same format as OpenAI for now
|
|
53
|
+
return tools.map((tool) => ({
|
|
54
|
+
type: 'function',
|
|
55
|
+
function: {
|
|
56
|
+
name: tool.function.name,
|
|
57
|
+
description: tool.function.description,
|
|
58
|
+
parameters: this.convertGeminiSchemaToStandard(tool.function.parameters),
|
|
59
|
+
},
|
|
60
|
+
}));
|
|
61
|
+
case 'anthropic':
|
|
62
|
+
return tools.map((tool) => ({
|
|
63
|
+
name: tool.function.name,
|
|
64
|
+
description: tool.function.description || '',
|
|
65
|
+
input_schema: {
|
|
66
|
+
type: 'object',
|
|
67
|
+
...tool.function.parameters,
|
|
68
|
+
},
|
|
69
|
+
}));
|
|
70
|
+
case 'hermes':
|
|
71
|
+
// Hermes uses text-based format, tools are provided as system prompt
|
|
72
|
+
// Return a text description of tools for the system prompt
|
|
73
|
+
return tools.map((tool) => ({
|
|
74
|
+
name: tool.function.name,
|
|
75
|
+
description: tool.function.description || '',
|
|
76
|
+
parameters: tool.function.parameters,
|
|
77
|
+
}));
|
|
78
|
+
case 'xml':
|
|
79
|
+
// XML format also uses text-based format similar to Hermes
|
|
80
|
+
// Tools are typically described in the system prompt
|
|
81
|
+
return tools.map((tool) => ({
|
|
82
|
+
name: tool.function.name,
|
|
83
|
+
description: tool.function.description || '',
|
|
84
|
+
parameters: tool.function.parameters,
|
|
85
|
+
}));
|
|
86
|
+
default:
|
|
87
|
+
throw new Error(`Tool format '${format}' not yet implemented`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
fromProviderFormat(rawToolCall, format) {
|
|
91
|
+
switch (format) {
|
|
92
|
+
case 'openai':
|
|
93
|
+
case 'deepseek':
|
|
94
|
+
case 'qwen': {
|
|
95
|
+
const openAiToolCall = rawToolCall;
|
|
96
|
+
if (!openAiToolCall ||
|
|
97
|
+
!openAiToolCall.function ||
|
|
98
|
+
!openAiToolCall.function.name ||
|
|
99
|
+
!openAiToolCall.function.arguments) {
|
|
100
|
+
throw new Error(`Invalid ${format} tool call format`);
|
|
101
|
+
}
|
|
102
|
+
return [
|
|
103
|
+
{
|
|
104
|
+
id: openAiToolCall.id,
|
|
105
|
+
type: 'function',
|
|
106
|
+
function: {
|
|
107
|
+
name: openAiToolCall.function.name,
|
|
108
|
+
arguments: openAiToolCall.function.arguments,
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
];
|
|
112
|
+
}
|
|
113
|
+
case 'anthropic': {
|
|
114
|
+
const anthropicToolCall = rawToolCall;
|
|
115
|
+
if (!anthropicToolCall ||
|
|
116
|
+
!anthropicToolCall.id ||
|
|
117
|
+
!anthropicToolCall.name) {
|
|
118
|
+
throw new Error(`Invalid ${format} tool call format`);
|
|
119
|
+
}
|
|
120
|
+
return [
|
|
121
|
+
{
|
|
122
|
+
id: anthropicToolCall.id,
|
|
123
|
+
type: 'function',
|
|
124
|
+
function: {
|
|
125
|
+
name: anthropicToolCall.name,
|
|
126
|
+
arguments: anthropicToolCall.input
|
|
127
|
+
? JSON.stringify(anthropicToolCall.input)
|
|
128
|
+
: '',
|
|
129
|
+
},
|
|
130
|
+
},
|
|
131
|
+
];
|
|
132
|
+
}
|
|
133
|
+
case 'hermes': {
|
|
134
|
+
// Hermes format comes from TextToolCallParser
|
|
135
|
+
const hermesToolCall = rawToolCall;
|
|
136
|
+
if (!hermesToolCall || !hermesToolCall.name) {
|
|
137
|
+
throw new Error(`Invalid ${format} tool call format`);
|
|
138
|
+
}
|
|
139
|
+
return [
|
|
140
|
+
{
|
|
141
|
+
id: `hermes_${Date.now()}_${Math.random().toString(36).substring(7)}`,
|
|
142
|
+
type: 'function',
|
|
143
|
+
function: {
|
|
144
|
+
name: hermesToolCall.name,
|
|
145
|
+
arguments: JSON.stringify(hermesToolCall.arguments || {}),
|
|
146
|
+
},
|
|
147
|
+
},
|
|
148
|
+
];
|
|
149
|
+
}
|
|
150
|
+
case 'xml': {
|
|
151
|
+
// XML format also comes from TextToolCallParser
|
|
152
|
+
const xmlToolCall = rawToolCall;
|
|
153
|
+
if (!xmlToolCall || !xmlToolCall.name) {
|
|
154
|
+
throw new Error(`Invalid ${format} tool call format`);
|
|
155
|
+
}
|
|
156
|
+
return [
|
|
157
|
+
{
|
|
158
|
+
id: `xml_${Date.now()}_${Math.random().toString(36).substring(7)}`,
|
|
159
|
+
type: 'function',
|
|
160
|
+
function: {
|
|
161
|
+
name: xmlToolCall.name,
|
|
162
|
+
arguments: JSON.stringify(xmlToolCall.arguments || {}),
|
|
163
|
+
},
|
|
164
|
+
},
|
|
165
|
+
];
|
|
166
|
+
}
|
|
167
|
+
default:
|
|
168
|
+
throw new Error(`Tool format '${format}' not yet implemented`);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Handles streaming tool call accumulation for OpenAI-compatible providers
|
|
173
|
+
* This accumulates partial tool calls from streaming responses
|
|
174
|
+
*/
|
|
175
|
+
accumulateStreamingToolCall(deltaToolCall, accumulatedToolCalls, format) {
|
|
176
|
+
switch (format) {
|
|
177
|
+
case 'openai':
|
|
178
|
+
case 'deepseek':
|
|
179
|
+
case 'qwen':
|
|
180
|
+
// All use same accumulation logic for now
|
|
181
|
+
if (deltaToolCall.index !== undefined) {
|
|
182
|
+
if (!accumulatedToolCalls[deltaToolCall.index]) {
|
|
183
|
+
accumulatedToolCalls[deltaToolCall.index] = {
|
|
184
|
+
id: deltaToolCall.id || '',
|
|
185
|
+
type: 'function',
|
|
186
|
+
function: { name: '', arguments: '' },
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
const tc = accumulatedToolCalls[deltaToolCall.index];
|
|
190
|
+
if (deltaToolCall.id)
|
|
191
|
+
tc.id = deltaToolCall.id;
|
|
192
|
+
if (deltaToolCall.function?.name)
|
|
193
|
+
tc.function.name = deltaToolCall.function.name;
|
|
194
|
+
if (deltaToolCall.function?.arguments)
|
|
195
|
+
tc.function.arguments += deltaToolCall.function.arguments;
|
|
196
|
+
}
|
|
197
|
+
break;
|
|
198
|
+
default:
|
|
199
|
+
throw new Error(`Streaming accumulation for format '${format}' not yet implemented`);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Formats tools specifically for the OpenAI Responses API
|
|
204
|
+
* The Responses API expects a flatter format than the regular OpenAI API
|
|
205
|
+
*/
|
|
206
|
+
toResponsesTool(tools) {
|
|
207
|
+
return tools.map((tool) => ({
|
|
208
|
+
type: 'function',
|
|
209
|
+
name: tool.function.name,
|
|
210
|
+
description: tool.function.description || null,
|
|
211
|
+
parameters: this.convertGeminiSchemaToStandard(tool.function.parameters) || null,
|
|
212
|
+
strict: null,
|
|
213
|
+
}));
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=ToolFormatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ToolFormatter.js","sourceRoot":"","sources":["../../../src/tools/ToolFormatter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2025 Vybestack LLC
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2025 Vybestack LLC
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
import { describe, it, expect, beforeEach } from 'vitest';
|
|
17
|
+
import { ToolFormatter } from './ToolFormatter.js';
|
|
18
|
+
describe('ToolFormatter', () => {
|
|
19
|
+
let formatter;
|
|
20
|
+
beforeEach(() => {
|
|
21
|
+
formatter = new ToolFormatter();
|
|
22
|
+
});
|
|
23
|
+
it('should correctly format tools for OpenAI provider', () => {
|
|
24
|
+
const tools = [
|
|
25
|
+
{
|
|
26
|
+
type: 'function',
|
|
27
|
+
function: {
|
|
28
|
+
name: 'sum',
|
|
29
|
+
description: 'Add two numbers',
|
|
30
|
+
parameters: {
|
|
31
|
+
type: 'object',
|
|
32
|
+
properties: {
|
|
33
|
+
a: { type: 'number' },
|
|
34
|
+
b: { type: 'number' },
|
|
35
|
+
},
|
|
36
|
+
required: ['a', 'b'],
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
];
|
|
41
|
+
const expected = [
|
|
42
|
+
{
|
|
43
|
+
type: 'function',
|
|
44
|
+
function: {
|
|
45
|
+
name: 'sum',
|
|
46
|
+
description: 'Add two numbers',
|
|
47
|
+
parameters: {
|
|
48
|
+
type: 'object',
|
|
49
|
+
properties: {
|
|
50
|
+
a: { type: 'number' },
|
|
51
|
+
b: { type: 'number' },
|
|
52
|
+
},
|
|
53
|
+
required: ['a', 'b'],
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
];
|
|
58
|
+
expect(formatter.toProviderFormat(tools, 'openai')).toEqual(expected);
|
|
59
|
+
});
|
|
60
|
+
it('should throw an error for invalid OpenAI tool call format', () => {
|
|
61
|
+
const rawToolCall = {};
|
|
62
|
+
expect(() => formatter.fromProviderFormat(rawToolCall, 'openai')).toThrow('Invalid openai tool call format');
|
|
63
|
+
});
|
|
64
|
+
it('should correctly parse OpenAI tool calls from provider format', () => {
|
|
65
|
+
const rawToolCall = {
|
|
66
|
+
id: 'call_123',
|
|
67
|
+
function: {
|
|
68
|
+
name: 'sum',
|
|
69
|
+
arguments: '{"a": 5, "b": 3}',
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
const expected = [
|
|
73
|
+
{
|
|
74
|
+
id: 'call_123',
|
|
75
|
+
type: 'function',
|
|
76
|
+
function: {
|
|
77
|
+
name: 'sum',
|
|
78
|
+
arguments: '{"a": 5, "b": 3}',
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
];
|
|
82
|
+
expect(formatter.fromProviderFormat(rawToolCall, 'openai')).toEqual(expected);
|
|
83
|
+
});
|
|
84
|
+
it('should correctly format tools for Anthropic provider', () => {
|
|
85
|
+
const tools = [
|
|
86
|
+
{
|
|
87
|
+
type: 'function',
|
|
88
|
+
function: {
|
|
89
|
+
name: 'search',
|
|
90
|
+
description: 'Search for information',
|
|
91
|
+
parameters: {
|
|
92
|
+
type: 'object',
|
|
93
|
+
properties: {
|
|
94
|
+
query: { type: 'string', description: 'Search query' },
|
|
95
|
+
limit: { type: 'number', description: 'Max results' },
|
|
96
|
+
},
|
|
97
|
+
required: ['query'],
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
];
|
|
102
|
+
const expected = [
|
|
103
|
+
{
|
|
104
|
+
name: 'search',
|
|
105
|
+
description: 'Search for information',
|
|
106
|
+
input_schema: {
|
|
107
|
+
type: 'object',
|
|
108
|
+
properties: {
|
|
109
|
+
query: { type: 'string', description: 'Search query' },
|
|
110
|
+
limit: { type: 'number', description: 'Max results' },
|
|
111
|
+
},
|
|
112
|
+
required: ['query'],
|
|
113
|
+
},
|
|
114
|
+
},
|
|
115
|
+
];
|
|
116
|
+
expect(formatter.toProviderFormat(tools, 'anthropic')).toEqual(expected);
|
|
117
|
+
});
|
|
118
|
+
it('should handle empty description for Anthropic provider', () => {
|
|
119
|
+
const tools = [
|
|
120
|
+
{
|
|
121
|
+
type: 'function',
|
|
122
|
+
function: {
|
|
123
|
+
name: 'calculate',
|
|
124
|
+
parameters: {
|
|
125
|
+
type: 'object',
|
|
126
|
+
properties: { x: { type: 'number' } },
|
|
127
|
+
},
|
|
128
|
+
},
|
|
129
|
+
},
|
|
130
|
+
];
|
|
131
|
+
const result = formatter.toProviderFormat(tools, 'anthropic');
|
|
132
|
+
expect(result[0].description).toBe('');
|
|
133
|
+
});
|
|
134
|
+
it('should not throw for implemented formats in toProviderFormat', () => {
|
|
135
|
+
const tools = [
|
|
136
|
+
{
|
|
137
|
+
type: 'function',
|
|
138
|
+
function: {
|
|
139
|
+
name: 'test',
|
|
140
|
+
description: 'Test function',
|
|
141
|
+
parameters: {},
|
|
142
|
+
},
|
|
143
|
+
},
|
|
144
|
+
];
|
|
145
|
+
// All these formats are now implemented and should not throw
|
|
146
|
+
expect(() => formatter.toProviderFormat(tools, 'openai')).not.toThrow();
|
|
147
|
+
expect(() => formatter.toProviderFormat(tools, 'anthropic')).not.toThrow();
|
|
148
|
+
expect(() => formatter.toProviderFormat(tools, 'hermes')).not.toThrow();
|
|
149
|
+
expect(() => formatter.toProviderFormat(tools, 'xml')).not.toThrow();
|
|
150
|
+
expect(() => formatter.toProviderFormat(tools, 'deepseek')).not.toThrow();
|
|
151
|
+
expect(() => formatter.toProviderFormat(tools, 'qwen')).not.toThrow();
|
|
152
|
+
});
|
|
153
|
+
it('should correctly format tools for Hermes provider', () => {
|
|
154
|
+
const tools = [
|
|
155
|
+
{
|
|
156
|
+
type: 'function',
|
|
157
|
+
function: {
|
|
158
|
+
name: 'get_stock_fundamentals',
|
|
159
|
+
description: 'Get fundamental data for a stock',
|
|
160
|
+
parameters: {
|
|
161
|
+
type: 'object',
|
|
162
|
+
properties: {
|
|
163
|
+
symbol: { type: 'string', description: 'Stock symbol' },
|
|
164
|
+
},
|
|
165
|
+
required: ['symbol'],
|
|
166
|
+
},
|
|
167
|
+
},
|
|
168
|
+
},
|
|
169
|
+
];
|
|
170
|
+
const expected = [
|
|
171
|
+
{
|
|
172
|
+
name: 'get_stock_fundamentals',
|
|
173
|
+
description: 'Get fundamental data for a stock',
|
|
174
|
+
parameters: {
|
|
175
|
+
type: 'object',
|
|
176
|
+
properties: {
|
|
177
|
+
symbol: { type: 'string', description: 'Stock symbol' },
|
|
178
|
+
},
|
|
179
|
+
required: ['symbol'],
|
|
180
|
+
},
|
|
181
|
+
},
|
|
182
|
+
];
|
|
183
|
+
expect(formatter.toProviderFormat(tools, 'hermes')).toEqual(expected);
|
|
184
|
+
});
|
|
185
|
+
it('should correctly parse Anthropic tool calls from provider format', () => {
|
|
186
|
+
const rawToolCall = {
|
|
187
|
+
id: 'toolu_01abc123',
|
|
188
|
+
type: 'tool_use',
|
|
189
|
+
name: 'search',
|
|
190
|
+
input: { query: 'test search', limit: 10 },
|
|
191
|
+
};
|
|
192
|
+
const expected = [
|
|
193
|
+
{
|
|
194
|
+
id: 'toolu_01abc123',
|
|
195
|
+
type: 'function',
|
|
196
|
+
function: {
|
|
197
|
+
name: 'search',
|
|
198
|
+
arguments: '{"query":"test search","limit":10}',
|
|
199
|
+
},
|
|
200
|
+
},
|
|
201
|
+
];
|
|
202
|
+
expect(formatter.fromProviderFormat(rawToolCall, 'anthropic')).toEqual(expected);
|
|
203
|
+
});
|
|
204
|
+
it('should handle Anthropic tool calls without input', () => {
|
|
205
|
+
const rawToolCall = {
|
|
206
|
+
id: 'toolu_01xyz789',
|
|
207
|
+
name: 'get_time',
|
|
208
|
+
};
|
|
209
|
+
const expected = [
|
|
210
|
+
{
|
|
211
|
+
id: 'toolu_01xyz789',
|
|
212
|
+
type: 'function',
|
|
213
|
+
function: {
|
|
214
|
+
name: 'get_time',
|
|
215
|
+
arguments: '',
|
|
216
|
+
},
|
|
217
|
+
},
|
|
218
|
+
];
|
|
219
|
+
expect(formatter.fromProviderFormat(rawToolCall, 'anthropic')).toEqual(expected);
|
|
220
|
+
});
|
|
221
|
+
it('should throw an error for invalid Anthropic tool call format', () => {
|
|
222
|
+
const invalidCalls = [
|
|
223
|
+
{},
|
|
224
|
+
{ id: 'test' }, // missing name
|
|
225
|
+
{ name: 'test' }, // missing id
|
|
226
|
+
null,
|
|
227
|
+
];
|
|
228
|
+
invalidCalls.forEach((rawToolCall) => {
|
|
229
|
+
expect(() => formatter.fromProviderFormat(rawToolCall, 'anthropic')).toThrow('Invalid anthropic tool call format');
|
|
230
|
+
});
|
|
231
|
+
});
|
|
232
|
+
it('should correctly parse Hermes tool calls from provider format', () => {
|
|
233
|
+
const rawToolCall = {
|
|
234
|
+
name: 'get_stock_fundamentals',
|
|
235
|
+
arguments: { symbol: 'AAPL' },
|
|
236
|
+
};
|
|
237
|
+
const result = formatter.fromProviderFormat(rawToolCall, 'hermes');
|
|
238
|
+
expect(result).toHaveLength(1);
|
|
239
|
+
expect(result[0].type).toBe('function');
|
|
240
|
+
expect(result[0].function.name).toBe('get_stock_fundamentals');
|
|
241
|
+
expect(result[0].function.arguments).toBe('{"symbol":"AAPL"}');
|
|
242
|
+
expect(result[0].id).toMatch(/^hermes_/); // Should have generated ID
|
|
243
|
+
});
|
|
244
|
+
it('should handle Hermes tool calls without arguments', () => {
|
|
245
|
+
const rawToolCall = {
|
|
246
|
+
name: 'get_current_time',
|
|
247
|
+
arguments: {},
|
|
248
|
+
};
|
|
249
|
+
const result = formatter.fromProviderFormat(rawToolCall, 'hermes');
|
|
250
|
+
expect(result).toHaveLength(1);
|
|
251
|
+
expect(result[0].function.name).toBe('get_current_time');
|
|
252
|
+
expect(result[0].function.arguments).toBe('{}');
|
|
253
|
+
});
|
|
254
|
+
it('should throw error for invalid Hermes tool call format', () => {
|
|
255
|
+
const invalidCalls = [
|
|
256
|
+
{},
|
|
257
|
+
{ arguments: {} }, // missing name
|
|
258
|
+
null,
|
|
259
|
+
];
|
|
260
|
+
invalidCalls.forEach((rawToolCall) => {
|
|
261
|
+
expect(() => formatter.fromProviderFormat(rawToolCall, 'hermes')).toThrow('Invalid hermes tool call format');
|
|
262
|
+
});
|
|
263
|
+
});
|
|
264
|
+
it('should correctly format tools for XML provider', () => {
|
|
265
|
+
const tools = [
|
|
266
|
+
{
|
|
267
|
+
type: 'function',
|
|
268
|
+
function: {
|
|
269
|
+
name: 'weather_tool',
|
|
270
|
+
description: 'Get weather information',
|
|
271
|
+
parameters: {
|
|
272
|
+
type: 'object',
|
|
273
|
+
properties: {
|
|
274
|
+
location: { type: 'string', description: 'City name' },
|
|
275
|
+
units: { type: 'string', enum: ['celsius', 'fahrenheit'] },
|
|
276
|
+
},
|
|
277
|
+
required: ['location'],
|
|
278
|
+
},
|
|
279
|
+
},
|
|
280
|
+
},
|
|
281
|
+
];
|
|
282
|
+
const expected = [
|
|
283
|
+
{
|
|
284
|
+
name: 'weather_tool',
|
|
285
|
+
description: 'Get weather information',
|
|
286
|
+
parameters: {
|
|
287
|
+
type: 'object',
|
|
288
|
+
properties: {
|
|
289
|
+
location: { type: 'string', description: 'City name' },
|
|
290
|
+
units: { type: 'string', enum: ['celsius', 'fahrenheit'] },
|
|
291
|
+
},
|
|
292
|
+
required: ['location'],
|
|
293
|
+
},
|
|
294
|
+
},
|
|
295
|
+
];
|
|
296
|
+
expect(formatter.toProviderFormat(tools, 'xml')).toEqual(expected);
|
|
297
|
+
});
|
|
298
|
+
it('should correctly parse XML tool calls from provider format', () => {
|
|
299
|
+
const rawToolCall = {
|
|
300
|
+
name: 'weather_tool',
|
|
301
|
+
arguments: { location: 'Paris', units: 'celsius' },
|
|
302
|
+
};
|
|
303
|
+
const result = formatter.fromProviderFormat(rawToolCall, 'xml');
|
|
304
|
+
expect(result).toHaveLength(1);
|
|
305
|
+
expect(result[0].type).toBe('function');
|
|
306
|
+
expect(result[0].function.name).toBe('weather_tool');
|
|
307
|
+
expect(result[0].function.arguments).toBe('{"location":"Paris","units":"celsius"}');
|
|
308
|
+
expect(result[0].id).toMatch(/^xml_/); // Should have generated ID
|
|
309
|
+
});
|
|
310
|
+
it('should handle XML tool calls without arguments', () => {
|
|
311
|
+
const rawToolCall = {
|
|
312
|
+
name: 'get_time',
|
|
313
|
+
arguments: {},
|
|
314
|
+
};
|
|
315
|
+
const result = formatter.fromProviderFormat(rawToolCall, 'xml');
|
|
316
|
+
expect(result).toHaveLength(1);
|
|
317
|
+
expect(result[0].function.name).toBe('get_time');
|
|
318
|
+
expect(result[0].function.arguments).toBe('{}');
|
|
319
|
+
});
|
|
320
|
+
it('should throw error for invalid XML tool call format', () => {
|
|
321
|
+
const invalidCalls = [
|
|
322
|
+
{},
|
|
323
|
+
{ arguments: {} }, // missing name
|
|
324
|
+
null,
|
|
325
|
+
];
|
|
326
|
+
invalidCalls.forEach((rawToolCall) => {
|
|
327
|
+
expect(() => formatter.fromProviderFormat(rawToolCall, 'xml')).toThrow('Invalid xml tool call format');
|
|
328
|
+
});
|
|
329
|
+
});
|
|
330
|
+
it('should format tools correctly for DeepSeek and Qwen providers', () => {
|
|
331
|
+
const tools = [
|
|
332
|
+
{
|
|
333
|
+
type: 'function',
|
|
334
|
+
function: {
|
|
335
|
+
name: 'test_function',
|
|
336
|
+
description: 'A test function',
|
|
337
|
+
parameters: { type: 'object', properties: {} },
|
|
338
|
+
},
|
|
339
|
+
},
|
|
340
|
+
];
|
|
341
|
+
// DeepSeek and Qwen use the same format as OpenAI
|
|
342
|
+
const deepseekResult = formatter.toProviderFormat(tools, 'deepseek');
|
|
343
|
+
const qwenResult = formatter.toProviderFormat(tools, 'qwen');
|
|
344
|
+
const openaiResult = formatter.toProviderFormat(tools, 'openai');
|
|
345
|
+
expect(deepseekResult).toEqual(openaiResult);
|
|
346
|
+
expect(qwenResult).toEqual(openaiResult);
|
|
347
|
+
});
|
|
348
|
+
});
|
|
349
|
+
//# sourceMappingURL=ToolFormatter.test.js.map
|