From 13c8137d0b896d28269237cec719467bfdafa065 Mon Sep 17 00:00:00 2001 From: Prasang Prajapati Date: Thu, 11 Sep 2025 18:19:27 -0400 Subject: [PATCH] fix margins and text --- packages/types/src/providers/watsonx.ts | 86 ++-------------- src/api/providers/fetchers/watsonx.ts | 53 +++++----- src/api/providers/watsonx.ts | 9 +- .../settings/providers/WatsonxAI.tsx | 98 ++++++++++--------- 4 files changed, 94 insertions(+), 152 deletions(-) diff --git a/packages/types/src/providers/watsonx.ts b/packages/types/src/providers/watsonx.ts index f4998b87a0..5846125c65 100644 --- a/packages/types/src/providers/watsonx.ts +++ b/packages/types/src/providers/watsonx.ts @@ -5,93 +5,21 @@ export const watsonxAiDefaultModelId = "" // Common model properties export const baseModelInfo: ModelInfo = { - maxTokens: 4096, - contextWindow: 128000, + maxTokens: 131072, + contextWindow: 131072, supportsImages: false, - supportsPromptCache: true, - supportsReasoningEffort: false, + supportsPromptCache: false, + supportsReasoningEffort: true, supportsReasoningBudget: false, requiredReasoningBudget: false, - inputPrice: 0, - outputPrice: 0, + inputPrice: 5.22, + outputPrice: 5.22, } export const watsonxAiModels = { // IBM Granite model "ibm/granite-3-3-8b-instruct": { ...baseModelInfo, - description: "Granite 3.3 8b Instruct - IBM-trained, dense decoder-only model", - }, - "ibm/granite-3-2-8b-instruct": { - ...baseModelInfo, - description: "Granite 3.2 8b Instruct - Text-only model capable of reasoning", - }, - "ibm/granite-3-2b-instruct": { - ...baseModelInfo, - description: "Granite 3 2b Instruct - IBM-trained, dense decoder-only model", - }, - "ibm/granite-3-8b-instruct": { - ...baseModelInfo, - description: "Granite 3 8b Instruct - IBM-trained, dense decoder-only model", - }, - "ibm/granite-guardian-3-2b": { - ...baseModelInfo, - description: "Granite Guardian 3 2b - IBM-trained, dense decoder-only model", - }, - "ibm/granite-guardian-3-8b": { - ...baseModelInfo, - description: "Granite Guardian 3 8b - IBM-trained, dense decoder-only model", - }, - "ibm/granite-vision-3-2-2b": { - ...baseModelInfo, - supportsImages: true, - description: "Granite 3 Vision - Image-text, text-out model capable of understanding images", - }, - // Meta Llama models - "meta-llama/llama-3-2-11b-vision-instruct": { - ...baseModelInfo, - supportsImages: true, - description: "Llama 3 2 11b Vision Instruct - Auto-regressive language model with transformer architecture", - }, - "meta-llama/llama-3-2-1b-instruct": { - ...baseModelInfo, - description: "Llama 3 2 1b Instruct - Auto-regressive language model with transformer architecture", - }, - "meta-llama/llama-3-2-3b-instruct": { - ...baseModelInfo, - description: "Llama 3 2 3b Instruct - Auto-regressive language model with transformer architecture", - }, - "meta-llama/llama-3-2-90b-vision-instruct": { - ...baseModelInfo, - supportsImages: true, - description: "Llama 3 2 90b Vision Instruct - Auto-regressive language model with transformer architecture", - }, - "meta-llama/llama-3-3-70b-instruct": { - ...baseModelInfo, - description: "Llama 3 3 70b Instruct - FP8 quantized version of the original FP16 weights", - }, - "meta-llama/llama-3-405b-instruct": { - ...baseModelInfo, - contextWindow: 128000, - description: "Llama 3 405b Instruct - Meta's largest open-source foundation model with 405 billion parameters", - }, - "meta-llama/llama-4-maverick-17b-1-0": { - ...baseModelInfo, - contextWindow: 128000, - description: "Llama 4 Maverick - 17 billion active parameter model with 128 experts", - }, - "meta-llama/llama-guard-3-11b-vision": { - ...baseModelInfo, - supportsImages: true, - description: "Llama Guard 3 11b Vision - Auto-regressive language model with transformer architecture", - }, - // Mistral AI models - "mistralai/mistral-medium-2505": { - ...baseModelInfo, - description: "Mistral Medium - Latest iteration of the Mistral Medium model family", - }, - "mistralai/mistral-small-3-1-24b-instruct-2503": { - ...baseModelInfo, - description: "Mistral Small 3.1 24B Base 2503 - Instruction-finetuned version of Mistral Small", + description: "", }, } as const satisfies Record diff --git a/src/api/providers/fetchers/watsonx.ts b/src/api/providers/fetchers/watsonx.ts index 3087dd1bca..e9255dbdbf 100644 --- a/src/api/providers/fetchers/watsonx.ts +++ b/src/api/providers/fetchers/watsonx.ts @@ -63,35 +63,42 @@ export async function getWatsonxModels( let knownModels: Record = {} try { - const response = await service.listFoundationModelSpecs() + let response + if (embedded) { + response = await service.listFoundationModelSpecs({ filters: "function_embedding" }) + } else { + response = await service.listFoundationModelSpecs({ filters: "!function_embedding" }) + } if (response && response.result) { const result = response.result as any - const modelsList = result.models || result.resources || result.foundation_models || [] - if (Array.isArray(modelsList)) { + const modelsList = result.resources + if (Array.isArray(modelsList) && modelsList.length > 0) { for (const model of modelsList) { const modelId = model.id || model.name || model.model_id - const modelInfo = JSON.stringify(model).toLowerCase() - if (modelId && !embedded && !modelInfo.includes("embed") && !modelInfo.includes("rtrvr")) { - const contextWindow = model.context_length || model.max_input_tokens || 8192 - const maxTokens = model.max_output_tokens || Math.floor(contextWindow / 2) + const contextWindow = model.context_length || model.max_input_tokens || 8192 + const maxTokens = model.max_output_tokens || Math.floor(contextWindow / 2) - knownModels[modelId] = { - contextWindow, - maxTokens, - supportsPromptCache: false, - } - } else { - if (modelId && embedded && modelInfo.includes("embed") && modelInfo.includes("rtrvr")) { - const contextWindow = model.context_length || model.max_input_tokens || 8192 - const maxTokens = model.max_output_tokens || Math.floor(contextWindow / 2) - - knownModels[modelId] = { - contextWindow, - maxTokens, - supportsPromptCache: false, - } - } + let description = "" + if (model.long_description) { + description = model.long_description + } else if (model.short_description) { + description = model.short_description + } + const supportsImages = model.modality === "multimodal" || model.modality === "vision" || false + const inputPrice = model.pricing?.input_price || 0 + const outputPrice = model.pricing?.output_price || 0 + knownModels[modelId] = { + contextWindow, + maxTokens, + supportsPromptCache: false, + supportsImages, + supportsReasoningEffort: false, + supportsReasoningBudget: false, + requiredReasoningBudget: false, + inputPrice, + outputPrice, + description, } } } diff --git a/src/api/providers/watsonx.ts b/src/api/providers/watsonx.ts index 425a366817..5ddb197828 100644 --- a/src/api/providers/watsonx.ts +++ b/src/api/providers/watsonx.ts @@ -8,6 +8,7 @@ import { BaseProvider } from "./base-provider" import type { SingleCompletionHandler, ApiHandlerCreateMessageMetadata } from "../index" import { WatsonXAI } from "@ibm-cloud/watsonx-ai" import { convertToWatsonxAiMessages } from "../transform/watsonxai-format" +import { calculateApiCostOpenAI } from "../../shared/cost" export class WatsonxAIHandler extends BaseProvider implements SingleCompletionHandler { private options: ApiHandlerOptions @@ -145,11 +146,15 @@ export class WatsonxAIHandler extends BaseProvider implements SingleCompletionHa usageInfo = response.result.usage || {} const outputTokens = usageInfo.completion_tokens + const inputTokens = usageInfo?.prompt_tokens || 0 + const modelInfo = this.getModel().info + const totalCost = calculateApiCostOpenAI(modelInfo, inputTokens, outputTokens) + yield { type: "usage", - inputTokens: usageInfo?.prompt_tokens, + inputTokens: inputTokens, outputTokens, - totalCost: 0, // Actual cost calculation could be added if available + totalCost: totalCost, } } catch (error) { await vscode.window.showErrorMessage(error.message) diff --git a/webview-ui/src/components/settings/providers/WatsonxAI.tsx b/webview-ui/src/components/settings/providers/WatsonxAI.tsx index c372133f7c..7bd5564a23 100644 --- a/webview-ui/src/components/settings/providers/WatsonxAI.tsx +++ b/webview-ui/src/components/settings/providers/WatsonxAI.tsx @@ -248,7 +248,7 @@ export const WatsonxAI = ({ return ( <> {/* Platform Selection */} -
+
- - - - - {Object.entries(WATSONX_REGIONS).map(([regionCode, regionName]) => ( - - {regionName} - - ))} - - -
- Selected endpoint: {REGION_TO_URL[selectedRegion as keyof typeof REGION_TO_URL]} -
+
+ + +
+ Selected endpoint: {REGION_TO_URL[selectedRegion as keyof typeof REGION_TO_URL]}
- +
)} {/* IBM Cloud Pak for Data specific fields */} {apiConfiguration.watsonxPlatform === "cloudPak" && ( - <> +
-
+
Enter the full URL of your IBM Cloud Pak for Data instance
- +
)} -
+
{apiConfiguration.watsonxPlatform === "ibmCloud" && ( - <> +
-
+
{t("settings:providers.apiKeyStorageNotice")}
- +
)} {apiConfiguration.watsonxPlatform === "cloudPak" && ( <> - - - +
+ + + +
-
+