diff --git a/packages/types/src/global-settings.ts b/packages/types/src/global-settings.ts index 3697ef35bb6..f1e31404f28 100644 --- a/packages/types/src/global-settings.ts +++ b/packages/types/src/global-settings.ts @@ -246,6 +246,7 @@ export const SECRET_STATE_KEYS = [ "featherlessApiKey", "ioIntelligenceApiKey", "vercelAiGatewayApiKey", + "basetenApiKey", ] as const // Global secrets that are part of GlobalSettings (not ProviderSettings) diff --git a/packages/types/src/provider-settings.ts b/packages/types/src/provider-settings.ts index 21eb75abd96..88e8bf56779 100644 --- a/packages/types/src/provider-settings.ts +++ b/packages/types/src/provider-settings.ts @@ -4,6 +4,7 @@ import { modelInfoSchema, reasoningEffortSettingSchema, verbosityLevelsSchema, s import { codebaseIndexProviderSchema } from "./codebase-index.js" import { anthropicModels, + basetenModels, bedrockModels, cerebrasModels, claudeCodeModels, @@ -120,6 +121,7 @@ export const providerNames = [ ...fauxProviders, "anthropic", "bedrock", + "baseten", "cerebras", "claude-code", "doubao", @@ -424,6 +426,10 @@ const vercelAiGatewaySchema = baseProviderSettingsSchema.extend({ vercelAiGatewayModelId: z.string().optional(), }) +const basetenSchema = apiModelIdProviderModelSchema.extend({ + basetenApiKey: z.string().optional(), +}) + const defaultSchema = z.object({ apiProvider: z.undefined(), }) @@ -454,6 +460,7 @@ export const providerSettingsSchemaDiscriminated = z.discriminatedUnion("apiProv fakeAiSchema.merge(z.object({ apiProvider: z.literal("fake-ai") })), xaiSchema.merge(z.object({ apiProvider: z.literal("xai") })), groqSchema.merge(z.object({ apiProvider: z.literal("groq") })), + basetenSchema.merge(z.object({ apiProvider: z.literal("baseten") })), huggingFaceSchema.merge(z.object({ apiProvider: z.literal("huggingface") })), chutesSchema.merge(z.object({ apiProvider: z.literal("chutes") })), litellmSchema.merge(z.object({ apiProvider: z.literal("litellm") })), @@ -496,6 +503,7 @@ export const providerSettingsSchema = z.object({ ...fakeAiSchema.shape, ...xaiSchema.shape, ...groqSchema.shape, + ...basetenSchema.shape, ...huggingFaceSchema.shape, ...chutesSchema.shape, ...litellmSchema.shape, @@ -583,6 +591,7 @@ export const modelIdKeysByProvider: Record = { requesty: "requestyModelId", xai: "apiModelId", groq: "apiModelId", + baseten: "apiModelId", chutes: "apiModelId", litellm: "litellmModelId", huggingface: "huggingFaceModelId", @@ -715,6 +724,7 @@ export const MODELS_BY_PROVIDER: Record< }, xai: { id: "xai", label: "xAI (Grok)", models: Object.keys(xaiModels) }, zai: { id: "zai", label: "Zai", models: Object.keys(internationalZAiModels) }, + baseten: { id: "baseten", label: "BaseTen", models: Object.keys(basetenModels) }, // Dynamic providers; models pulled from remote APIs. glama: { id: "glama", label: "Glama", models: [] }, diff --git a/packages/types/src/providers/baseten.ts b/packages/types/src/providers/baseten.ts new file mode 100644 index 00000000000..0cb6d734215 --- /dev/null +++ b/packages/types/src/providers/baseten.ts @@ -0,0 +1,127 @@ +import type { ModelInfo } from "../model.js" + +// Baseten +// https://baseten.co/products/model-apis/ + +export const basetenModels = { + "moonshotai/Kimi-K2-Thinking": { + maxTokens: 163_800, + contextWindow: 262_000, + supportsImages: false, + supportsPromptCache: false, + supportsNativeTools: true, + defaultToolProtocol: "native", + inputPrice: 0.6, + outputPrice: 2.5, + cacheWritesPrice: 0, + cacheReadsPrice: 0, + description: "Kimi K2 Thinking - A model with enhanced reasoning capabilities from Kimi K2", + }, + "zai-org/GLM-4.6": { + maxTokens: 200_000, + contextWindow: 200_000, + supportsImages: false, + supportsPromptCache: false, + supportsNativeTools: true, + inputPrice: 0.6, + outputPrice: 2.2, + cacheWritesPrice: 0, + cacheReadsPrice: 0, + description: "Frontier open model with advanced agentic, reasoning and coding capabilities", + }, + "deepseek-ai/DeepSeek-R1": { + maxTokens: 131_072, + contextWindow: 163_840, + supportsImages: false, + supportsPromptCache: false, + inputPrice: 2.55, + outputPrice: 5.95, + cacheWritesPrice: 0, + cacheReadsPrice: 0, + description: "DeepSeek's first-generation reasoning model", + }, + "deepseek-ai/DeepSeek-R1-0528": { + maxTokens: 131_072, + contextWindow: 163_840, + supportsImages: false, + supportsPromptCache: false, + inputPrice: 2.55, + outputPrice: 5.95, + cacheWritesPrice: 0, + cacheReadsPrice: 0, + description: "The latest revision of DeepSeek's first-generation reasoning model", + }, + "deepseek-ai/DeepSeek-V3-0324": { + maxTokens: 131_072, + contextWindow: 163_840, + supportsImages: false, + supportsPromptCache: false, + inputPrice: 0.77, + outputPrice: 0.77, + cacheWritesPrice: 0, + cacheReadsPrice: 0, + description: "Fast general-purpose LLM with enhanced reasoning capabilities", + }, + "deepseek-ai/DeepSeek-V3.1": { + maxTokens: 131_072, + contextWindow: 163_840, + supportsImages: false, + supportsPromptCache: false, + inputPrice: 0.5, + outputPrice: 1.5, + cacheWritesPrice: 0, + cacheReadsPrice: 0, + description: + "Extremely capable general-purpose LLM with hybrid reasoning capabilities and advanced tool calling", + }, + "Qwen/Qwen3-235B-A22B-Instruct-2507": { + maxTokens: 262_144, + contextWindow: 262_144, + supportsImages: false, + supportsPromptCache: false, + inputPrice: 0.22, + outputPrice: 0.8, + cacheWritesPrice: 0, + cacheReadsPrice: 0, + description: "Mixture-of-experts LLM with math and reasoning capabilities", + }, + "Qwen/Qwen3-Coder-480B-A35B-Instruct": { + maxTokens: 262_144, + contextWindow: 262_144, + supportsImages: false, + supportsPromptCache: false, + inputPrice: 0.38, + outputPrice: 1.53, + cacheWritesPrice: 0, + cacheReadsPrice: 0, + description: "Mixture-of-experts LLM with advanced coding and reasoning capabilities", + }, + "openai/gpt-oss-120b": { + maxTokens: 128_072, + contextWindow: 128_072, + supportsImages: false, + supportsPromptCache: false, + supportsNativeTools: true, + inputPrice: 0.1, + outputPrice: 0.5, + cacheWritesPrice: 0, + cacheReadsPrice: 0, + description: "Extremely capable general-purpose LLM with strong, controllable reasoning capabilities", + }, + "moonshotai/Kimi-K2-Instruct-0905": { + maxTokens: 168_000, + contextWindow: 262_000, + supportsImages: false, + supportsPromptCache: false, + supportsNativeTools: true, + inputPrice: 0.6, + outputPrice: 2.5, + cacheWritesPrice: 0, + cacheReadsPrice: 0, + description: "State of the art language model for agentic and coding tasks. September Update.", + }, +} as const satisfies Record + +export type BasetenModelId = keyof typeof basetenModels + +export const basetenDefaultModelId = "moonshotai/Kimi-K2-Thinking" satisfies BasetenModelId diff --git a/packages/types/src/providers/index.ts b/packages/types/src/providers/index.ts index 3db2c7fb100..5a0e577eab7 100644 --- a/packages/types/src/providers/index.ts +++ b/packages/types/src/providers/index.ts @@ -1,4 +1,5 @@ export * from "./anthropic.js" +export * from "./baseten.js" export * from "./bedrock.js" export * from "./cerebras.js" export * from "./chutes.js" @@ -33,6 +34,7 @@ export * from "./deepinfra.js" export * from "./minimax.js" import { anthropicDefaultModelId } from "./anthropic.js" +import { basetenDefaultModelId } from "./baseten.js" import { bedrockDefaultModelId } from "./bedrock.js" import { cerebrasDefaultModelId } from "./cerebras.js" import { chutesDefaultModelId } from "./chutes.js" @@ -93,6 +95,8 @@ export function getProviderDefaultModelId( return "meta-llama/Llama-3.3-70B-Instruct" case "chutes": return chutesDefaultModelId + case "baseten": + return basetenDefaultModelId case "bedrock": return bedrockDefaultModelId case "vertex": diff --git a/src/api/index.ts b/src/api/index.ts index 05c74930787..dd9208aa967 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -42,6 +42,7 @@ import { VercelAiGatewayHandler, DeepInfraHandler, MiniMaxHandler, + BasetenHandler, } from "./providers" import { NativeOllamaHandler } from "./providers/native-ollama" @@ -190,6 +191,8 @@ export function buildApiHandler(configuration: ProviderSettings): ApiHandler { return new VercelAiGatewayHandler(options) case "minimax": return new MiniMaxHandler(options) + case "baseten": + return new BasetenHandler(options) default: apiProvider satisfies "gemini-cli" | undefined return new AnthropicHandler(options) diff --git a/src/api/providers/baseten.ts b/src/api/providers/baseten.ts new file mode 100644 index 00000000000..ca0c2867756 --- /dev/null +++ b/src/api/providers/baseten.ts @@ -0,0 +1,18 @@ +import { type BasetenModelId, basetenDefaultModelId, basetenModels } from "@roo-code/types" + +import type { ApiHandlerOptions } from "../../shared/api" +import { BaseOpenAiCompatibleProvider } from "./base-openai-compatible-provider" + +export class BasetenHandler extends BaseOpenAiCompatibleProvider { + constructor(options: ApiHandlerOptions) { + super({ + ...options, + providerName: "Baseten", + baseURL: "https://inference.baseten.co/v1", + apiKey: options.basetenApiKey, + defaultProviderModelId: basetenDefaultModelId, + providerModels: basetenModels, + defaultTemperature: 0.5, + }) + } +} diff --git a/src/api/providers/index.ts b/src/api/providers/index.ts index 533023d0374..34bc119e617 100644 --- a/src/api/providers/index.ts +++ b/src/api/providers/index.ts @@ -35,3 +35,4 @@ export { FeatherlessHandler } from "./featherless" export { VercelAiGatewayHandler } from "./vercel-ai-gateway" export { DeepInfraHandler } from "./deepinfra" export { MiniMaxHandler } from "./minimax" +export { BasetenHandler } from "./baseten" diff --git a/webview-ui/src/components/settings/ApiOptions.tsx b/webview-ui/src/components/settings/ApiOptions.tsx index adf312dea65..87696350995 100644 --- a/webview-ui/src/components/settings/ApiOptions.tsx +++ b/webview-ui/src/components/settings/ApiOptions.tsx @@ -26,6 +26,7 @@ import { groqDefaultModelId, cerebrasDefaultModelId, chutesDefaultModelId, + basetenDefaultModelId, bedrockDefaultModelId, vertexDefaultModelId, sambaNovaDefaultModelId, @@ -67,6 +68,7 @@ import { import { Anthropic, + Baseten, Bedrock, Cerebras, Chutes, @@ -274,6 +276,7 @@ const ApiOptions = ({ const selectedProviderModels = useMemo(() => { const models = MODELS_BY_PROVIDER[selectedProvider] + if (!models) return [] const filteredModels = filterModels(models, selectedProvider, organizationAllowList) @@ -355,6 +358,7 @@ const ApiOptions = ({ xai: { field: "apiModelId", default: xaiDefaultModelId }, groq: { field: "apiModelId", default: groqDefaultModelId }, chutes: { field: "apiModelId", default: chutesDefaultModelId }, + baseten: { field: "apiModelId", default: basetenDefaultModelId }, bedrock: { field: "apiModelId", default: bedrockDefaultModelId }, vertex: { field: "apiModelId", default: vertexDefaultModelId }, sambanova: { field: "apiModelId", default: sambaNovaDefaultModelId }, @@ -564,6 +568,10 @@ const ApiOptions = ({ )} + {selectedProvider === "baseten" && ( + + )} + {selectedProvider === "bedrock" && ( >> = { @@ -42,6 +43,7 @@ export const MODELS_BY_PROVIDER: Partial a.label.localeCompare(b.label)) diff --git a/webview-ui/src/components/settings/providers/Baseten.tsx b/webview-ui/src/components/settings/providers/Baseten.tsx new file mode 100644 index 00000000000..f4b26beab42 --- /dev/null +++ b/webview-ui/src/components/settings/providers/Baseten.tsx @@ -0,0 +1,50 @@ +import { useCallback } from "react" +import { VSCodeTextField } from "@vscode/webview-ui-toolkit/react" + +import type { ProviderSettings } from "@roo-code/types" + +import { useAppTranslation } from "@src/i18n/TranslationContext" +import { VSCodeButtonLink } from "@src/components/common/VSCodeButtonLink" + +import { inputEventTransform } from "../transforms" + +type BasetenProps = { + apiConfiguration: ProviderSettings + setApiConfigurationField: (field: keyof ProviderSettings, value: ProviderSettings[keyof ProviderSettings]) => void +} + +export const Baseten = ({ apiConfiguration, setApiConfigurationField }: BasetenProps) => { + const { t } = useAppTranslation() + + const handleInputChange = useCallback( + ( + field: K, + transform: (event: E) => ProviderSettings[K] = inputEventTransform, + ) => + (event: E | Event) => { + setApiConfigurationField(field, transform(event as E)) + }, + [setApiConfigurationField], + ) + + return ( + <> + + + +
+ {t("settings:providers.apiKeyStorageNotice")} +
+ {!apiConfiguration?.basetenApiKey && ( + + {t("settings:providers.getBasetenApiKey")} + + )} + + ) +} diff --git a/webview-ui/src/components/settings/providers/index.ts b/webview-ui/src/components/settings/providers/index.ts index baf6ccba2ef..fbd9bc4eb24 100644 --- a/webview-ui/src/components/settings/providers/index.ts +++ b/webview-ui/src/components/settings/providers/index.ts @@ -32,3 +32,4 @@ export { Featherless } from "./Featherless" export { VercelAiGateway } from "./VercelAiGateway" export { DeepInfra } from "./DeepInfra" export { MiniMax } from "./MiniMax" +export { Baseten } from "./Baseten" diff --git a/webview-ui/src/components/ui/hooks/useSelectedModel.ts b/webview-ui/src/components/ui/hooks/useSelectedModel.ts index c2a57942d24..3df7236713c 100644 --- a/webview-ui/src/components/ui/hooks/useSelectedModel.ts +++ b/webview-ui/src/components/ui/hooks/useSelectedModel.ts @@ -25,6 +25,7 @@ import { fireworksModels, featherlessModels, ioIntelligenceModels, + basetenModels, qwenCodeModels, BEDROCK_1M_CONTEXT_MODEL_IDS, isDynamicProvider, @@ -196,6 +197,11 @@ function getSelectedModel({ const info = routerModels.chutes?.[id] return { id, info } } + case "baseten": { + const id = apiConfiguration.apiModelId ?? defaultModelId + const info = basetenModels[id as keyof typeof basetenModels] + return { id, info } + } case "bedrock": { const id = apiConfiguration.apiModelId ?? defaultModelId const baseInfo = bedrockModels[id as keyof typeof bedrockModels] diff --git a/webview-ui/src/i18n/locales/ca/settings.json b/webview-ui/src/i18n/locales/ca/settings.json index 2b074745170..ac16c70661b 100644 --- a/webview-ui/src/i18n/locales/ca/settings.json +++ b/webview-ui/src/i18n/locales/ca/settings.json @@ -279,6 +279,8 @@ "anthropic1MContextBetaDescription": "Amplia la finestra de context a 1 milió de tokens per a Claude Sonnet 4", "awsBedrock1MContextBetaLabel": "Activa la finestra de context d'1M (Beta)", "awsBedrock1MContextBetaDescription": "Amplia la finestra de context a 1 milió de tokens per a Claude Sonnet 4", + "basetenApiKey": "Clau API de Baseten", + "getBasetenApiKey": "Obtenir clau API de Baseten", "cerebrasApiKey": "Clau API de Cerebras", "getCerebrasApiKey": "Obtenir clau API de Cerebras", "chutesApiKey": "Clau API de Chutes", diff --git a/webview-ui/src/i18n/locales/de/settings.json b/webview-ui/src/i18n/locales/de/settings.json index 480895e9c99..36de5fd2258 100644 --- a/webview-ui/src/i18n/locales/de/settings.json +++ b/webview-ui/src/i18n/locales/de/settings.json @@ -281,6 +281,8 @@ "anthropic1MContextBetaDescription": "Erweitert das Kontextfenster für Claude Sonnet 4 auf 1 Million Token", "awsBedrock1MContextBetaLabel": "1M Kontextfenster aktivieren (Beta)", "awsBedrock1MContextBetaDescription": "Erweitert das Kontextfenster für Claude Sonnet 4 auf 1 Million Token", + "basetenApiKey": "Baseten API-Schlüssel", + "getBasetenApiKey": "Baseten API-Schlüssel erhalten", "cerebrasApiKey": "Cerebras API-Schlüssel", "getCerebrasApiKey": "Cerebras API-Schlüssel erhalten", "chutesApiKey": "Chutes API-Schlüssel", diff --git a/webview-ui/src/i18n/locales/en/settings.json b/webview-ui/src/i18n/locales/en/settings.json index 635252e5a50..b77e3e0abf3 100644 --- a/webview-ui/src/i18n/locales/en/settings.json +++ b/webview-ui/src/i18n/locales/en/settings.json @@ -284,6 +284,8 @@ "anthropic1MContextBetaDescription": "Extends context window to 1 million tokens for Claude Sonnet 4", "awsBedrock1MContextBetaLabel": "Enable 1M context window (Beta)", "awsBedrock1MContextBetaDescription": "Extends context window to 1 million tokens for Claude Sonnet 4", + "basetenApiKey": "Baseten API Key", + "getBasetenApiKey": "Get Baseten API Key", "cerebrasApiKey": "Cerebras API Key", "getCerebrasApiKey": "Get Cerebras API Key", "chutesApiKey": "Chutes API Key", diff --git a/webview-ui/src/i18n/locales/es/settings.json b/webview-ui/src/i18n/locales/es/settings.json index e65f96b8217..580bedf7062 100644 --- a/webview-ui/src/i18n/locales/es/settings.json +++ b/webview-ui/src/i18n/locales/es/settings.json @@ -279,6 +279,8 @@ "anthropic1MContextBetaDescription": "Amplía la ventana de contexto a 1 millón de tokens para Claude Sonnet 4", "awsBedrock1MContextBetaLabel": "Habilitar ventana de contexto de 1M (Beta)", "awsBedrock1MContextBetaDescription": "Amplía la ventana de contexto a 1 millón de tokens para Claude Sonnet 4", + "basetenApiKey": "Clave API de Baseten", + "getBasetenApiKey": "Obtener clave API de Baseten", "cerebrasApiKey": "Clave API de Cerebras", "getCerebrasApiKey": "Obtener clave API de Cerebras", "chutesApiKey": "Clave API de Chutes", diff --git a/webview-ui/src/i18n/locales/fr/settings.json b/webview-ui/src/i18n/locales/fr/settings.json index 9f0e10e8544..7593726dabf 100644 --- a/webview-ui/src/i18n/locales/fr/settings.json +++ b/webview-ui/src/i18n/locales/fr/settings.json @@ -279,6 +279,8 @@ "anthropic1MContextBetaDescription": "Étend la fenêtre de contexte à 1 million de tokens pour Claude Sonnet 4", "awsBedrock1MContextBetaLabel": "Activer la fenêtre de contexte de 1M (Bêta)", "awsBedrock1MContextBetaDescription": "Étend la fenêtre de contexte à 1 million de tokens pour Claude Sonnet 4", + "basetenApiKey": "Clé API Baseten", + "getBasetenApiKey": "Obtenir la clé API Baseten", "cerebrasApiKey": "Clé API Cerebras", "getCerebrasApiKey": "Obtenir la clé API Cerebras", "chutesApiKey": "Clé API Chutes", diff --git a/webview-ui/src/i18n/locales/hi/settings.json b/webview-ui/src/i18n/locales/hi/settings.json index 399f17501af..f28272725ca 100644 --- a/webview-ui/src/i18n/locales/hi/settings.json +++ b/webview-ui/src/i18n/locales/hi/settings.json @@ -279,6 +279,8 @@ "anthropic1MContextBetaDescription": "Claude Sonnet 4 के लिए संदर्भ विंडो को 1 मिलियन टोकन तक बढ़ाता है", "awsBedrock1MContextBetaLabel": "1M संदर्भ विंडो सक्षम करें (बीटा)", "awsBedrock1MContextBetaDescription": "Claude Sonnet 4 के लिए संदर्भ विंडो को 1 मिलियन टोकन तक बढ़ाता है", + "basetenApiKey": "Baseten API कुंजी", + "getBasetenApiKey": "Baseten API कुंजी प्राप्त करें", "cerebrasApiKey": "Cerebras API कुंजी", "getCerebrasApiKey": "Cerebras API कुंजी प्राप्त करें", "chutesApiKey": "Chutes API कुंजी", diff --git a/webview-ui/src/i18n/locales/id/settings.json b/webview-ui/src/i18n/locales/id/settings.json index 6e0129103ae..a489dadb6cb 100644 --- a/webview-ui/src/i18n/locales/id/settings.json +++ b/webview-ui/src/i18n/locales/id/settings.json @@ -283,6 +283,8 @@ "anthropic1MContextBetaDescription": "Memperluas jendela konteks menjadi 1 juta token untuk Claude Sonnet 4", "awsBedrock1MContextBetaLabel": "Aktifkan jendela konteks 1M (Beta)", "awsBedrock1MContextBetaDescription": "Memperluas jendela konteks menjadi 1 juta token untuk Claude Sonnet 4", + "basetenApiKey": "Baseten API Key", + "getBasetenApiKey": "Dapatkan Baseten API Key", "cerebrasApiKey": "Cerebras API Key", "getCerebrasApiKey": "Dapatkan Cerebras API Key", "chutesApiKey": "Chutes API Key", diff --git a/webview-ui/src/i18n/locales/it/settings.json b/webview-ui/src/i18n/locales/it/settings.json index 4d230483fce..02e182a37a4 100644 --- a/webview-ui/src/i18n/locales/it/settings.json +++ b/webview-ui/src/i18n/locales/it/settings.json @@ -279,6 +279,8 @@ "anthropic1MContextBetaDescription": "Estende la finestra di contesto a 1 milione di token per Claude Sonnet 4", "awsBedrock1MContextBetaLabel": "Abilita finestra di contesto da 1M (Beta)", "awsBedrock1MContextBetaDescription": "Estende la finestra di contesto a 1 milione di token per Claude Sonnet 4", + "basetenApiKey": "Chiave API Baseten", + "getBasetenApiKey": "Ottieni chiave API Baseten", "cerebrasApiKey": "Chiave API Cerebras", "getCerebrasApiKey": "Ottieni chiave API Cerebras", "chutesApiKey": "Chiave API Chutes", diff --git a/webview-ui/src/i18n/locales/ja/settings.json b/webview-ui/src/i18n/locales/ja/settings.json index 7127b65fa1c..5a895c7134e 100644 --- a/webview-ui/src/i18n/locales/ja/settings.json +++ b/webview-ui/src/i18n/locales/ja/settings.json @@ -279,6 +279,8 @@ "anthropic1MContextBetaDescription": "Claude Sonnet 4のコンテキストウィンドウを100万トークンに拡張します", "awsBedrock1MContextBetaLabel": "1Mコンテキストウィンドウを有効にする(ベータ版)", "awsBedrock1MContextBetaDescription": "Claude Sonnet 4のコンテキストウィンドウを100万トークンに拡張します", + "basetenApiKey": "Baseten APIキー", + "getBasetenApiKey": "Baseten APIキーを取得", "cerebrasApiKey": "Cerebras APIキー", "getCerebrasApiKey": "Cerebras APIキーを取得", "chutesApiKey": "Chutes APIキー", diff --git a/webview-ui/src/i18n/locales/ko/settings.json b/webview-ui/src/i18n/locales/ko/settings.json index c746e53dc23..12d1aeaf026 100644 --- a/webview-ui/src/i18n/locales/ko/settings.json +++ b/webview-ui/src/i18n/locales/ko/settings.json @@ -279,6 +279,8 @@ "anthropic1MContextBetaDescription": "Claude Sonnet 4의 컨텍스트 창을 100만 토큰으로 확장", "awsBedrock1MContextBetaLabel": "1M 컨텍스트 창 활성화 (베타)", "awsBedrock1MContextBetaDescription": "Claude Sonnet 4의 컨텍스트 창을 100만 토큰으로 확장", + "basetenApiKey": "Baseten API 키", + "getBasetenApiKey": "Baseten API 키 가져오기", "cerebrasApiKey": "Cerebras API 키", "getCerebrasApiKey": "Cerebras API 키 가져오기", "chutesApiKey": "Chutes API 키", diff --git a/webview-ui/src/i18n/locales/nl/settings.json b/webview-ui/src/i18n/locales/nl/settings.json index 7f1c416f437..0258b85210a 100644 --- a/webview-ui/src/i18n/locales/nl/settings.json +++ b/webview-ui/src/i18n/locales/nl/settings.json @@ -279,6 +279,8 @@ "anthropic1MContextBetaDescription": "Breidt het contextvenster uit tot 1 miljoen tokens voor Claude Sonnet 4", "awsBedrock1MContextBetaLabel": "1M contextvenster inschakelen (bèta)", "awsBedrock1MContextBetaDescription": "Breidt het contextvenster uit tot 1 miljoen tokens voor Claude Sonnet 4", + "basetenApiKey": "Baseten API-sleutel", + "getBasetenApiKey": "Baseten API-sleutel verkrijgen", "cerebrasApiKey": "Cerebras API-sleutel", "getCerebrasApiKey": "Cerebras API-sleutel verkrijgen", "chutesApiKey": "Chutes API-sleutel", diff --git a/webview-ui/src/i18n/locales/pl/settings.json b/webview-ui/src/i18n/locales/pl/settings.json index 5b5d886ac5c..672753a90c0 100644 --- a/webview-ui/src/i18n/locales/pl/settings.json +++ b/webview-ui/src/i18n/locales/pl/settings.json @@ -279,6 +279,8 @@ "anthropic1MContextBetaDescription": "Rozszerza okno kontekstowe do 1 miliona tokenów dla Claude Sonnet 4", "awsBedrock1MContextBetaLabel": "Włącz okno kontekstowe 1M (Beta)", "awsBedrock1MContextBetaDescription": "Rozszerza okno kontekstowe do 1 miliona tokenów dla Claude Sonnet 4", + "basetenApiKey": "Klucz API Baseten", + "getBasetenApiKey": "Uzyskaj klucz API Baseten", "cerebrasApiKey": "Klucz API Cerebras", "getCerebrasApiKey": "Pobierz klucz API Cerebras", "chutesApiKey": "Klucz API Chutes", diff --git a/webview-ui/src/i18n/locales/pt-BR/settings.json b/webview-ui/src/i18n/locales/pt-BR/settings.json index 2a4f96e0017..980870c30b4 100644 --- a/webview-ui/src/i18n/locales/pt-BR/settings.json +++ b/webview-ui/src/i18n/locales/pt-BR/settings.json @@ -279,6 +279,8 @@ "anthropic1MContextBetaDescription": "Estende a janela de contexto para 1 milhão de tokens para o Claude Sonnet 4", "awsBedrock1MContextBetaLabel": "Ativar janela de contexto de 1M (Beta)", "awsBedrock1MContextBetaDescription": "Estende a janela de contexto para 1 milhão de tokens para o Claude Sonnet 4", + "basetenApiKey": "Chave de API Baseten", + "getBasetenApiKey": "Obter chave de API Baseten", "cerebrasApiKey": "Chave de API Cerebras", "getCerebrasApiKey": "Obter chave de API Cerebras", "chutesApiKey": "Chave de API Chutes", diff --git a/webview-ui/src/i18n/locales/ru/settings.json b/webview-ui/src/i18n/locales/ru/settings.json index 8c48ed1e31b..267f083c90a 100644 --- a/webview-ui/src/i18n/locales/ru/settings.json +++ b/webview-ui/src/i18n/locales/ru/settings.json @@ -279,6 +279,8 @@ "anthropic1MContextBetaDescription": "Расширяет контекстное окно до 1 миллиона токенов для Claude Sonnet 4", "awsBedrock1MContextBetaLabel": "Включить контекстное окно 1M (бета)", "awsBedrock1MContextBetaDescription": "Расширяет контекстное окно до 1 миллиона токенов для Claude Sonnet 4", + "basetenApiKey": "Baseten API-ключ", + "getBasetenApiKey": "Получить Baseten API-ключ", "cerebrasApiKey": "Cerebras API-ключ", "getCerebrasApiKey": "Получить Cerebras API-ключ", "chutesApiKey": "Chutes API-ключ", diff --git a/webview-ui/src/i18n/locales/tr/settings.json b/webview-ui/src/i18n/locales/tr/settings.json index f4c5da3acfa..acbf07bc3ab 100644 --- a/webview-ui/src/i18n/locales/tr/settings.json +++ b/webview-ui/src/i18n/locales/tr/settings.json @@ -279,6 +279,8 @@ "anthropic1MContextBetaDescription": "Claude Sonnet 4 için bağlam penceresini 1 milyon token'a genişletir", "awsBedrock1MContextBetaLabel": "1M bağlam penceresini etkinleştir (Beta)", "awsBedrock1MContextBetaDescription": "Claude Sonnet 4 için bağlam penceresini 1 milyon token'a genişletir", + "basetenApiKey": "Baseten API Anahtarı", + "getBasetenApiKey": "Baseten API Anahtarı Al", "cerebrasApiKey": "Cerebras API Anahtarı", "getCerebrasApiKey": "Cerebras API Anahtarını Al", "chutesApiKey": "Chutes API Anahtarı", diff --git a/webview-ui/src/i18n/locales/vi/settings.json b/webview-ui/src/i18n/locales/vi/settings.json index 0f4e74c9abe..e8d752ca5d6 100644 --- a/webview-ui/src/i18n/locales/vi/settings.json +++ b/webview-ui/src/i18n/locales/vi/settings.json @@ -279,6 +279,8 @@ "anthropic1MContextBetaDescription": "Mở rộng cửa sổ ngữ cảnh lên 1 triệu token cho Claude Sonnet 4", "awsBedrock1MContextBetaLabel": "Bật cửa sổ ngữ cảnh 1M (Beta)", "awsBedrock1MContextBetaDescription": "Mở rộng cửa sổ ngữ cảnh lên 1 triệu token cho Claude Sonnet 4", + "basetenApiKey": "Khóa API Baseten", + "getBasetenApiKey": "Lấy khóa API Baseten", "cerebrasApiKey": "Khóa API Cerebras", "getCerebrasApiKey": "Lấy khóa API Cerebras", "chutesApiKey": "Khóa API Chutes", diff --git a/webview-ui/src/i18n/locales/zh-CN/settings.json b/webview-ui/src/i18n/locales/zh-CN/settings.json index ac11ea477b3..004e4fdc943 100644 --- a/webview-ui/src/i18n/locales/zh-CN/settings.json +++ b/webview-ui/src/i18n/locales/zh-CN/settings.json @@ -279,6 +279,8 @@ "anthropic1MContextBetaDescription": "为 Claude Sonnet 4 将上下文窗口扩展至 100 万个 token", "awsBedrock1MContextBetaLabel": "启用 1M 上下文窗口 (Beta)", "awsBedrock1MContextBetaDescription": "为 Claude Sonnet 4 将上下文窗口扩展至 100 万个 token", + "basetenApiKey": "Baseten API 密钥", + "getBasetenApiKey": "获取 Baseten API 密钥", "cerebrasApiKey": "Cerebras API 密钥", "getCerebrasApiKey": "获取 Cerebras API 密钥", "chutesApiKey": "Chutes API 密钥", diff --git a/webview-ui/src/i18n/locales/zh-TW/settings.json b/webview-ui/src/i18n/locales/zh-TW/settings.json index eeff20d4109..14a7095192e 100644 --- a/webview-ui/src/i18n/locales/zh-TW/settings.json +++ b/webview-ui/src/i18n/locales/zh-TW/settings.json @@ -279,6 +279,8 @@ "anthropic1MContextBetaDescription": "為 Claude Sonnet 4 將上下文視窗擴展至 100 萬個 token", "awsBedrock1MContextBetaLabel": "啟用 1M 上下文視窗 (Beta)", "awsBedrock1MContextBetaDescription": "為 Claude Sonnet 4 將上下文視窗擴展至 100 萬個 token", + "basetenApiKey": "Baseten API 金鑰", + "getBasetenApiKey": "取得 Baseten API 金鑰", "cerebrasApiKey": "Cerebras API 金鑰", "getCerebrasApiKey": "取得 Cerebras API 金鑰", "chutesApiKey": "Chutes API 金鑰", diff --git a/webview-ui/src/utils/validate.ts b/webview-ui/src/utils/validate.ts index d15f82e4caf..947b18ac3b0 100644 --- a/webview-ui/src/utils/validate.ts +++ b/webview-ui/src/utils/validate.ts @@ -156,6 +156,11 @@ function validateModelsAndKeysProvided(apiConfiguration: ProviderSettings): stri return i18next.t("settings:validation.apiKey") } break + case "baseten": + if (!apiConfiguration.basetenApiKey) { + return i18next.t("settings:validation.apiKey") + } + break } return undefined