From 6eb26eccfa26cdc2c236e90dbfd9951094487e20 Mon Sep 17 00:00:00 2001 From: AlexKer Date: Thu, 20 Nov 2025 22:56:03 -0500 Subject: [PATCH 01/11] Add Baseten provider support - Add Baseten model definitions (10 models) in packages/types/src/providers/baseten.ts - Implement BasetenHandler extending BaseOpenAiCompatibleProvider - Add Baseten UI component for API key input - Add basetenApiKey to SECRET_STATE_KEYS (critical fix for welcome screen) - Register Baseten in provider settings, API handlers, and UI components - Add validation and translation support - Baseten appears last in provider dropdown as requested --- packages/types/src/global-settings.ts | 1 + packages/types/src/provider-settings.ts | 10 ++ packages/types/src/providers/baseten.ts | 127 ++++++++++++++++++ packages/types/src/providers/index.ts | 4 + src/api/index.ts | 3 + src/api/providers/baseten.ts | 75 +++++++++++ src/api/providers/index.ts | 1 + .../src/components/settings/ApiOptions.tsx | 8 ++ .../src/components/settings/constants.ts | 3 + .../components/settings/providers/Baseten.tsx | 50 +++++++ .../components/settings/providers/index.ts | 1 + .../components/ui/hooks/useSelectedModel.ts | 6 + webview-ui/src/i18n/locales/en/settings.json | 2 + webview-ui/src/utils/validate.ts | 5 + 14 files changed, 296 insertions(+) create mode 100644 packages/types/src/providers/baseten.ts create mode 100644 src/api/providers/baseten.ts create mode 100644 webview-ui/src/components/settings/providers/Baseten.tsx 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 7a84e6d2dea..967b10d11f6 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..aad9f8a1547 --- /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/ + +// Extended ModelInfo to include supportedFeatures, like tools +export interface BasetenModelInfo extends ModelInfo { + supportedFeatures?: string[] +} + +export const basetenModels = { + "moonshotai/Kimi-K2-Thinking": { + maxTokens: 163_800, + contextWindow: 262_000, + supportsImages: false, + supportsPromptCache: false, + 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, + 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, + 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, + inputPrice: 0.6, + outputPrice: 2.5, + cacheWritesPrice: 0, + cacheReadsPrice: 0, + description: "State of the art language model for agentic and coding tasks. Septemeber Update.", + }, +} as const satisfies Record + +export type BasetenModelId = keyof typeof basetenModels + +export const basetenDefaultModelId = "zai-org/GLM-4.6" 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..d33f059ab66 --- /dev/null +++ b/src/api/providers/baseten.ts @@ -0,0 +1,75 @@ +import { type BasetenModelId, basetenDefaultModelId, basetenModels } from "@roo-code/types" +import { Anthropic } from "@anthropic-ai/sdk" +import OpenAI from "openai" + +import type { ApiHandlerOptions } from "../../shared/api" +import type { ApiHandlerCreateMessageMetadata } from "../index" +import { ApiStream } from "../transform/stream" +import { calculateApiCostOpenAI } from "../../shared/cost" + +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, + }) + } + + override async *createMessage( + systemPrompt: string, + messages: Anthropic.Messages.MessageParam[], + metadata?: ApiHandlerCreateMessageMetadata, + ): ApiStream { + const stream = await this.createStream(systemPrompt, messages, metadata) + + for await (const chunk of stream) { + const delta = chunk.choices[0]?.delta + + if (delta?.content) { + yield { + type: "text", + text: delta.content, + } + } + + if (chunk.usage) { + // Check if usage has cached token details (some models support this) + const usage = chunk.usage as any + const inputTokens = usage?.prompt_tokens || 0 + const outputTokens = usage?.completion_tokens || 0 + + // Check for cached tokens in various possible locations + const cacheReadTokens = + usage?.prompt_tokens_details?.cached_tokens || usage?.prompt_cache_hit_tokens || 0 + + // Baseten currently doesn't track cache writes + const cacheWriteTokens = 0 + + // Calculate cost using OpenAI-compatible cost calculation + const { totalCost } = calculateApiCostOpenAI( + this.getModel().info, + inputTokens, + outputTokens, + cacheWriteTokens, + cacheReadTokens, + ) + + yield { + type: "usage", + inputTokens, + outputTokens, + cacheWriteTokens, + cacheReadTokens, + totalCost, + } + } + } + } +} 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/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/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 From 2fef8f4284e3cc8812a6148eddf5be0b6fc8ac84 Mon Sep 17 00:00:00 2001 From: AlexKer Date: Thu, 20 Nov 2025 23:38:43 -0500 Subject: [PATCH 02/11] Add Baseten provider support - Add Baseten provider type definitions with 10 models - Implement BasetenHandler extending BaseOpenAiCompatibleProvider - Add Baseten UI component for API key configuration - Add validation logic for Baseten API key - Include Baseten in provider settings schema and constants - Add Baseten translations (basetenApiKey, getBasetenApiKey) - Add basetenApiKey to SECRET_STATE_KEYS for proper storage - Add Baseten provider documentation - Default model: moonshotai/Kimi-K2-Thinking --- docs/providers/baseten.md | 102 ++++++++++++++++++++++++ packages/types/src/providers/baseten.ts | 2 +- 2 files changed, 103 insertions(+), 1 deletion(-) create mode 100644 docs/providers/baseten.md diff --git a/docs/providers/baseten.md b/docs/providers/baseten.md new file mode 100644 index 00000000000..23a983fc781 --- /dev/null +++ b/docs/providers/baseten.md @@ -0,0 +1,102 @@ +--- +title: "Baseten" +description: "Learn how to configure and use Baseten's Model APIs with Roo Code. Access frontier open-source models with enterprise-grade performance, reliability, and competitive pricing." +--- + +Baseten provides on-demand frontier model APIs designed for production applications, not just experimentation. Built on the Baseten Inference Stack, these APIs deliver optimized inference for leading open-source models from OpenAI, DeepSeek, Moonshot AI, and Alibaba Cloud. + +**Website:** [https://www.baseten.co/products/model-apis/](https://www.baseten.co/products/model-apis/) + +## Getting an API Key + +1. **Sign Up/Sign In:** Go to [Baseten](https://www.baseten.co/) and create an account or sign in. + +2. **Navigate to API Keys:** Access your dashboard and go to the API Keys section at [https://app.baseten.co/settings/api_keys](https://app.baseten.co/settings/api_keys). + +3. **Create a Key:** Generate a new API key. Give it a descriptive name (e.g., "Roo Code"). + +4. **Copy the Key:** Copy the API key immediately and store it securely. + +## Configuration in Roo Code + +1. **Open Roo Code Settings:** Click the settings icon (⚙️) in the Roo Code panel or open VS Code settings. + +2. **Select Provider:** Choose "Baseten" from the "API Provider" dropdown. + +3. **Enter API Key:** Paste your Baseten API key into the "Baseten API Key" field. + +4. **Select Model:** Choose your desired model from the "Model" dropdown. + +**IMPORTANT: For Kimi K2 Thinking:** To use the `moonshotai/Kimi-K2-Thinking` model, you must enable **Native Tool Call (Experimental)** in Roo Code settings. This setting allows Roo Code to call tools through their native tool processor and is required for this reasoning model to function properly. + +## Supported Models + +Roo Code supports all current models under Baseten Model APIs, including: + +For the most updated pricing, please visit: https://www.baseten.co/products/model-apis/ + +- `moonshotai/Kimi-K2-Thinking` (Moonshot AI) - Enhanced reasoning capabilities with step-by-step thought processes (262K context) - $0.60/$2.50 per 1M tokens + +- `zai-org/GLM-4.6` (Z AI) - Frontier open model with advanced agentic, reasoning and coding capabilities by Z AI (200k context) $0.60/$2.20 per 1M tokens + +- `moonshotai/Kimi-K2-Instruct-0905` (Moonshot AI) - September update with enhanced capabilities (262K context) - $0.60/$2.50 per 1M tokens + +- `openai/gpt-oss-120b` (OpenAI) - 120B MoE with strong reasoning capabilities (128K context) - $0.10/$0.50 per 1M tokens + +- `Qwen/Qwen3-Coder-480B-A35B-Instruct` - Advanced coding and reasoning (262K context) - $0.38/$1.53 per 1M tokens + +- `Qwen/Qwen3-235B-A22B-Instruct-2507` - Math and reasoning expert (262K context) - $0.22/$0.80 per 1M tokens + +- `deepseek-ai/DeepSeek-R1` - DeepSeek's first-generation reasoning model (163K context) - $2.55/$5.95 per 1M tokens + +- `deepseek-ai/DeepSeek-R1-0528` - Latest revision of DeepSeek's reasoning model (163K context) - $2.55/$5.95 per 1M tokens + +- `deepseek-ai/DeepSeek-V3.1` - Hybrid reasoning with advanced tool calling (163K context) - $0.50/$1.50 per 1M tokens + +- `deepseek-ai/DeepSeek-V3-0324` - Fast general-purpose with enhanced reasoning (163K context) - $0.77/$0.77 per 1M tokens + +## Production-First Architecture + +Baseten's Model APIs are built for production environments with several key advantages: + +### Enterprise-Grade Reliability + +- **Four nines of uptime** (99.99%) through active-active redundancy +- **Cloud-agnostic, multi-cluster autoscaling** for consistent availability +- **SOC 2 Type II certified** and **HIPAA compliant** for security requirements + +### Optimized Performance + +- **Pre-optimized models** shipped with the Baseten Inference Stack +- **Latest-generation GPUs** with multi-cloud infrastructure +- **Ultra-fast inference** optimized from the bottom up for production workloads + +### Cost Efficiency + +- **5-10x less expensive** than closed alternatives +- **Optimized multi-cloud infrastructure** for efficient resource utilization +- **Transparent pricing** with no hidden costs or rate limit surprises + +### Developer Experience + +- **OpenAI compatible API** - migrate by swapping a single URL +- **Drop-in replacement** for closed models with comprehensive observability and analytics +- **Seamless scaling** from Model APIs to dedicated deployments + +## Special Features + +### Function Calling & Tool Use + +All Baseten models support structured outputs, function calling, and tool use as part of the Baseten Inference Stack, making them ideal for agentic applications and coding workflows. + +## Tips and Notes + +- **Static Model List:** Roo Code uses a curated list of Baseten models. The default model is `moonshotai/Kimi-K2-Thinking`. + +- **Multi-Cloud Capacity Management (MCM):** Baseten's multi-cloud infrastructure ensures high availability and low latency globally. + +- **Support:** Baseten provides dedicated support for production deployments and can work with you on dedicated resources as you scale. + +## Pricing Information + +Current pricing is highly competitive and transparent. For the most up-to-date pricing, visit the [Baseten Model APIs page](https://www.baseten.co/products/model-apis/). Prices typically range from $0.10-$6.00 per million tokens, making Baseten significantly more cost-effective than many closed-model alternatives while providing access to state-of-the-art open-source models. diff --git a/packages/types/src/providers/baseten.ts b/packages/types/src/providers/baseten.ts index aad9f8a1547..0071ea0e667 100644 --- a/packages/types/src/providers/baseten.ts +++ b/packages/types/src/providers/baseten.ts @@ -124,4 +124,4 @@ export const basetenModels = { export type BasetenModelId = keyof typeof basetenModels -export const basetenDefaultModelId = "zai-org/GLM-4.6" satisfies BasetenModelId +export const basetenDefaultModelId = "moonshotai/Kimi-K2-Thinking" satisfies BasetenModelId From a1ce6eab83b2f50faa47b678db8c49f1355ba317 Mon Sep 17 00:00:00 2001 From: Alex Ker Date: Thu, 20 Nov 2025 23:50:50 -0500 Subject: [PATCH 03/11] Update packages/types/src/providers/baseten.ts Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com> --- packages/types/src/providers/baseten.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/types/src/providers/baseten.ts b/packages/types/src/providers/baseten.ts index 0071ea0e667..3a8c4cdb27f 100644 --- a/packages/types/src/providers/baseten.ts +++ b/packages/types/src/providers/baseten.ts @@ -118,7 +118,7 @@ export const basetenModels = { outputPrice: 2.5, cacheWritesPrice: 0, cacheReadsPrice: 0, - description: "State of the art language model for agentic and coding tasks. Septemeber Update.", + description: "State of the art language model for agentic and coding tasks. September Update.", }, } as const satisfies Record From d47be5de93a39d0702277b7768b0bd95dbd47234 Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Fri, 21 Nov 2025 00:18:36 -0500 Subject: [PATCH 04/11] Fix usage tracking --- src/api/providers/baseten.ts | 60 ++++++++++++++++++++---------------- 1 file changed, 33 insertions(+), 27 deletions(-) diff --git a/src/api/providers/baseten.ts b/src/api/providers/baseten.ts index d33f059ab66..22389e62764 100644 --- a/src/api/providers/baseten.ts +++ b/src/api/providers/baseten.ts @@ -4,7 +4,7 @@ import OpenAI from "openai" import type { ApiHandlerOptions } from "../../shared/api" import type { ApiHandlerCreateMessageMetadata } from "../index" -import { ApiStream } from "../transform/stream" +import { ApiStream, ApiStreamUsageChunk } from "../transform/stream" import { calculateApiCostOpenAI } from "../../shared/cost" import { BaseOpenAiCompatibleProvider } from "./base-openai-compatible-provider" @@ -29,6 +29,8 @@ export class BasetenHandler extends BaseOpenAiCompatibleProvider ): ApiStream { const stream = await this.createStream(systemPrompt, messages, metadata) + let lastUsage: OpenAI.CompletionUsage | undefined + for await (const chunk of stream) { const delta = chunk.choices[0]?.delta @@ -39,37 +41,41 @@ export class BasetenHandler extends BaseOpenAiCompatibleProvider } } + if (delta && "reasoning_content" in delta && delta.reasoning_content) { + yield { type: "reasoning", text: (delta.reasoning_content as string | undefined) || "" } + } + if (chunk.usage) { - // Check if usage has cached token details (some models support this) - const usage = chunk.usage as any - const inputTokens = usage?.prompt_tokens || 0 - const outputTokens = usage?.completion_tokens || 0 + lastUsage = chunk.usage + } + } - // Check for cached tokens in various possible locations - const cacheReadTokens = - usage?.prompt_tokens_details?.cached_tokens || usage?.prompt_cache_hit_tokens || 0 + if (lastUsage) { + yield this.processUsageMetrics(lastUsage) + } + } - // Baseten currently doesn't track cache writes - const cacheWriteTokens = 0 + protected processUsageMetrics(usage: any): ApiStreamUsageChunk { + const inputTokens = usage?.prompt_tokens || 0 + const outputTokens = usage?.completion_tokens || 0 + const cacheWriteTokens = usage?.prompt_tokens_details?.cache_write_tokens || 0 + const cacheReadTokens = usage?.prompt_tokens_details?.cached_tokens || 0 - // Calculate cost using OpenAI-compatible cost calculation - const { totalCost } = calculateApiCostOpenAI( - this.getModel().info, - inputTokens, - outputTokens, - cacheWriteTokens, - cacheReadTokens, - ) + const { totalCost } = calculateApiCostOpenAI( + this.getModel().info, + inputTokens, + outputTokens, + cacheWriteTokens, + cacheReadTokens, + ) - yield { - type: "usage", - inputTokens, - outputTokens, - cacheWriteTokens, - cacheReadTokens, - totalCost, - } - } + return { + type: "usage", + inputTokens, + outputTokens, + cacheWriteTokens: cacheWriteTokens || undefined, + cacheReadTokens: cacheReadTokens || undefined, + totalCost, } } } From 9d0eb8e64fbc918422626eadb009c1b92330e722 Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Fri, 21 Nov 2025 00:34:46 -0500 Subject: [PATCH 05/11] Configure native tools --- packages/types/src/providers/baseten.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/types/src/providers/baseten.ts b/packages/types/src/providers/baseten.ts index 3a8c4cdb27f..0cb6d734215 100644 --- a/packages/types/src/providers/baseten.ts +++ b/packages/types/src/providers/baseten.ts @@ -3,17 +3,14 @@ import type { ModelInfo } from "../model.js" // Baseten // https://baseten.co/products/model-apis/ -// Extended ModelInfo to include supportedFeatures, like tools -export interface BasetenModelInfo extends ModelInfo { - supportedFeatures?: string[] -} - 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, @@ -25,6 +22,7 @@ export const basetenModels = { contextWindow: 200_000, supportsImages: false, supportsPromptCache: false, + supportsNativeTools: true, inputPrice: 0.6, outputPrice: 2.2, cacheWritesPrice: 0, @@ -103,6 +101,7 @@ export const basetenModels = { contextWindow: 128_072, supportsImages: false, supportsPromptCache: false, + supportsNativeTools: true, inputPrice: 0.1, outputPrice: 0.5, cacheWritesPrice: 0, @@ -114,6 +113,7 @@ export const basetenModels = { contextWindow: 262_000, supportsImages: false, supportsPromptCache: false, + supportsNativeTools: true, inputPrice: 0.6, outputPrice: 2.5, cacheWritesPrice: 0, From 8c9148b5377abf667b850d519a916a40f2107a53 Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Fri, 21 Nov 2025 00:35:19 -0500 Subject: [PATCH 06/11] Improvements to base openai compatible --- .../base-openai-compatible-provider.ts | 35 +++++++++++++++---- 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/src/api/providers/base-openai-compatible-provider.ts b/src/api/providers/base-openai-compatible-provider.ts index 51db85410e1..dc6d03b5cca 100644 --- a/src/api/providers/base-openai-compatible-provider.ts +++ b/src/api/providers/base-openai-compatible-provider.ts @@ -5,13 +5,14 @@ import type { ModelInfo } from "@roo-code/types" import { type ApiHandlerOptions, getModelMaxOutputTokens } from "../../shared/api" import { XmlMatcher } from "../../utils/xml-matcher" -import { ApiStream } from "../transform/stream" +import { ApiStream, ApiStreamUsageChunk } from "../transform/stream" import { convertToOpenAiMessages } from "../transform/openai-format" import type { SingleCompletionHandler, ApiHandlerCreateMessageMetadata } from "../index" import { DEFAULT_HEADERS } from "./constants" import { BaseProvider } from "./base-provider" import { handleOpenAIError } from "./utils/openai-error-handler" +import { calculateApiCostOpenAI } from "../../shared/cost" type BaseOpenAiCompatibleProviderOptions = ApiHandlerOptions & { providerName: string @@ -119,6 +120,8 @@ export abstract class BaseOpenAiCompatibleProvider const toolCallAccumulator = new Map() + let lastUsage: OpenAI.CompletionUsage | undefined + for await (const chunk of stream) { // Check for provider-specific error responses (e.g., MiniMax base_resp) const chunkAny = chunk as any @@ -176,20 +179,40 @@ export abstract class BaseOpenAiCompatibleProvider } if (chunk.usage) { - yield { - type: "usage", - inputTokens: chunk.usage.prompt_tokens || 0, - outputTokens: chunk.usage.completion_tokens || 0, - } + lastUsage = chunk.usage } } + if (lastUsage) { + yield this.processUsageMetrics(lastUsage, this.getModel().info) + } + // Process any remaining content for (const processedChunk of matcher.final()) { yield processedChunk } } + protected processUsageMetrics(usage: any, modelInfo?: any): ApiStreamUsageChunk { + const inputTokens = usage?.prompt_tokens || 0 + const outputTokens = usage?.completion_tokens || 0 + const cacheWriteTokens = usage?.prompt_tokens_details?.cache_write_tokens || 0 + const cacheReadTokens = usage?.prompt_tokens_details?.cached_tokens || 0 + + const { totalCost } = modelInfo + ? calculateApiCostOpenAI(modelInfo, inputTokens, outputTokens, cacheWriteTokens, cacheReadTokens) + : { totalCost: 0 } + + return { + type: "usage", + inputTokens, + outputTokens, + cacheWriteTokens: cacheWriteTokens || undefined, + cacheReadTokens: cacheReadTokens || undefined, + totalCost, + } + } + async completePrompt(prompt: string): Promise { const { id: modelId } = this.getModel() From fd8b5a018303d7a23de93c7f0713cb67df9215a2 Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Fri, 21 Nov 2025 00:35:33 -0500 Subject: [PATCH 07/11] Just use base openai compatible --- src/api/providers/baseten.ts | 63 ------------------------------------ 1 file changed, 63 deletions(-) diff --git a/src/api/providers/baseten.ts b/src/api/providers/baseten.ts index 22389e62764..ca0c2867756 100644 --- a/src/api/providers/baseten.ts +++ b/src/api/providers/baseten.ts @@ -1,12 +1,6 @@ import { type BasetenModelId, basetenDefaultModelId, basetenModels } from "@roo-code/types" -import { Anthropic } from "@anthropic-ai/sdk" -import OpenAI from "openai" import type { ApiHandlerOptions } from "../../shared/api" -import type { ApiHandlerCreateMessageMetadata } from "../index" -import { ApiStream, ApiStreamUsageChunk } from "../transform/stream" -import { calculateApiCostOpenAI } from "../../shared/cost" - import { BaseOpenAiCompatibleProvider } from "./base-openai-compatible-provider" export class BasetenHandler extends BaseOpenAiCompatibleProvider { @@ -21,61 +15,4 @@ export class BasetenHandler extends BaseOpenAiCompatibleProvider defaultTemperature: 0.5, }) } - - override async *createMessage( - systemPrompt: string, - messages: Anthropic.Messages.MessageParam[], - metadata?: ApiHandlerCreateMessageMetadata, - ): ApiStream { - const stream = await this.createStream(systemPrompt, messages, metadata) - - let lastUsage: OpenAI.CompletionUsage | undefined - - for await (const chunk of stream) { - const delta = chunk.choices[0]?.delta - - if (delta?.content) { - yield { - type: "text", - text: delta.content, - } - } - - if (delta && "reasoning_content" in delta && delta.reasoning_content) { - yield { type: "reasoning", text: (delta.reasoning_content as string | undefined) || "" } - } - - if (chunk.usage) { - lastUsage = chunk.usage - } - } - - if (lastUsage) { - yield this.processUsageMetrics(lastUsage) - } - } - - protected processUsageMetrics(usage: any): ApiStreamUsageChunk { - const inputTokens = usage?.prompt_tokens || 0 - const outputTokens = usage?.completion_tokens || 0 - const cacheWriteTokens = usage?.prompt_tokens_details?.cache_write_tokens || 0 - const cacheReadTokens = usage?.prompt_tokens_details?.cached_tokens || 0 - - const { totalCost } = calculateApiCostOpenAI( - this.getModel().info, - inputTokens, - outputTokens, - cacheWriteTokens, - cacheReadTokens, - ) - - return { - type: "usage", - inputTokens, - outputTokens, - cacheWriteTokens: cacheWriteTokens || undefined, - cacheReadTokens: cacheReadTokens || undefined, - totalCost, - } - } } From 2d9fded1935b71ddf3de02e24806afd48c2c70a2 Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Fri, 21 Nov 2025 00:46:11 -0500 Subject: [PATCH 08/11] More flexible parsing of reasoning content --- .../providers/base-openai-compatible-provider.ts | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/api/providers/base-openai-compatible-provider.ts b/src/api/providers/base-openai-compatible-provider.ts index dc6d03b5cca..a7a69b3392f 100644 --- a/src/api/providers/base-openai-compatible-provider.ts +++ b/src/api/providers/base-openai-compatible-provider.ts @@ -140,10 +140,15 @@ export abstract class BaseOpenAiCompatibleProvider } } - if (delta && "reasoning_content" in delta) { - const reasoning_content = (delta.reasoning_content as string | undefined) || "" - if (reasoning_content?.trim()) { - yield { type: "reasoning", text: reasoning_content } + if (delta) { + for (const key of ["reasoning_content", "reasoning"] as const) { + if (key in delta) { + const reasoning_content = ((delta as any)[key] as string | undefined) || "" + if (reasoning_content?.trim()) { + yield { type: "reasoning", text: reasoning_content } + } + break + } } } From aad133238bce6d4cba5e3d6671ae999883fc9020 Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Fri, 21 Nov 2025 17:09:24 -0500 Subject: [PATCH 09/11] Update src/api/providers/base-openai-compatible-provider.ts --- src/api/providers/base-openai-compatible-provider.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/api/providers/base-openai-compatible-provider.ts b/src/api/providers/base-openai-compatible-provider.ts index bbc24562c9d..3d78ef75d16 100644 --- a/src/api/providers/base-openai-compatible-provider.ts +++ b/src/api/providers/base-openai-compatible-provider.ts @@ -211,10 +211,6 @@ export abstract class BaseOpenAiCompatibleProvider yield this.processUsageMetrics(lastUsage, this.getModel().info) } - if (lastUsage) { - yield this.processUsageMetrics(lastUsage, this.getModel().info) - } - // Process any remaining content for (const processedChunk of matcher.final()) { yield processedChunk From 8f13cd0168a22d4c3ac511482f332edf3d04cb3e Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Fri, 21 Nov 2025 17:10:34 -0500 Subject: [PATCH 10/11] Delete docs/providers/baseten.md --- docs/providers/baseten.md | 102 -------------------------------------- 1 file changed, 102 deletions(-) delete mode 100644 docs/providers/baseten.md diff --git a/docs/providers/baseten.md b/docs/providers/baseten.md deleted file mode 100644 index 23a983fc781..00000000000 --- a/docs/providers/baseten.md +++ /dev/null @@ -1,102 +0,0 @@ ---- -title: "Baseten" -description: "Learn how to configure and use Baseten's Model APIs with Roo Code. Access frontier open-source models with enterprise-grade performance, reliability, and competitive pricing." ---- - -Baseten provides on-demand frontier model APIs designed for production applications, not just experimentation. Built on the Baseten Inference Stack, these APIs deliver optimized inference for leading open-source models from OpenAI, DeepSeek, Moonshot AI, and Alibaba Cloud. - -**Website:** [https://www.baseten.co/products/model-apis/](https://www.baseten.co/products/model-apis/) - -## Getting an API Key - -1. **Sign Up/Sign In:** Go to [Baseten](https://www.baseten.co/) and create an account or sign in. - -2. **Navigate to API Keys:** Access your dashboard and go to the API Keys section at [https://app.baseten.co/settings/api_keys](https://app.baseten.co/settings/api_keys). - -3. **Create a Key:** Generate a new API key. Give it a descriptive name (e.g., "Roo Code"). - -4. **Copy the Key:** Copy the API key immediately and store it securely. - -## Configuration in Roo Code - -1. **Open Roo Code Settings:** Click the settings icon (⚙️) in the Roo Code panel or open VS Code settings. - -2. **Select Provider:** Choose "Baseten" from the "API Provider" dropdown. - -3. **Enter API Key:** Paste your Baseten API key into the "Baseten API Key" field. - -4. **Select Model:** Choose your desired model from the "Model" dropdown. - -**IMPORTANT: For Kimi K2 Thinking:** To use the `moonshotai/Kimi-K2-Thinking` model, you must enable **Native Tool Call (Experimental)** in Roo Code settings. This setting allows Roo Code to call tools through their native tool processor and is required for this reasoning model to function properly. - -## Supported Models - -Roo Code supports all current models under Baseten Model APIs, including: - -For the most updated pricing, please visit: https://www.baseten.co/products/model-apis/ - -- `moonshotai/Kimi-K2-Thinking` (Moonshot AI) - Enhanced reasoning capabilities with step-by-step thought processes (262K context) - $0.60/$2.50 per 1M tokens - -- `zai-org/GLM-4.6` (Z AI) - Frontier open model with advanced agentic, reasoning and coding capabilities by Z AI (200k context) $0.60/$2.20 per 1M tokens - -- `moonshotai/Kimi-K2-Instruct-0905` (Moonshot AI) - September update with enhanced capabilities (262K context) - $0.60/$2.50 per 1M tokens - -- `openai/gpt-oss-120b` (OpenAI) - 120B MoE with strong reasoning capabilities (128K context) - $0.10/$0.50 per 1M tokens - -- `Qwen/Qwen3-Coder-480B-A35B-Instruct` - Advanced coding and reasoning (262K context) - $0.38/$1.53 per 1M tokens - -- `Qwen/Qwen3-235B-A22B-Instruct-2507` - Math and reasoning expert (262K context) - $0.22/$0.80 per 1M tokens - -- `deepseek-ai/DeepSeek-R1` - DeepSeek's first-generation reasoning model (163K context) - $2.55/$5.95 per 1M tokens - -- `deepseek-ai/DeepSeek-R1-0528` - Latest revision of DeepSeek's reasoning model (163K context) - $2.55/$5.95 per 1M tokens - -- `deepseek-ai/DeepSeek-V3.1` - Hybrid reasoning with advanced tool calling (163K context) - $0.50/$1.50 per 1M tokens - -- `deepseek-ai/DeepSeek-V3-0324` - Fast general-purpose with enhanced reasoning (163K context) - $0.77/$0.77 per 1M tokens - -## Production-First Architecture - -Baseten's Model APIs are built for production environments with several key advantages: - -### Enterprise-Grade Reliability - -- **Four nines of uptime** (99.99%) through active-active redundancy -- **Cloud-agnostic, multi-cluster autoscaling** for consistent availability -- **SOC 2 Type II certified** and **HIPAA compliant** for security requirements - -### Optimized Performance - -- **Pre-optimized models** shipped with the Baseten Inference Stack -- **Latest-generation GPUs** with multi-cloud infrastructure -- **Ultra-fast inference** optimized from the bottom up for production workloads - -### Cost Efficiency - -- **5-10x less expensive** than closed alternatives -- **Optimized multi-cloud infrastructure** for efficient resource utilization -- **Transparent pricing** with no hidden costs or rate limit surprises - -### Developer Experience - -- **OpenAI compatible API** - migrate by swapping a single URL -- **Drop-in replacement** for closed models with comprehensive observability and analytics -- **Seamless scaling** from Model APIs to dedicated deployments - -## Special Features - -### Function Calling & Tool Use - -All Baseten models support structured outputs, function calling, and tool use as part of the Baseten Inference Stack, making them ideal for agentic applications and coding workflows. - -## Tips and Notes - -- **Static Model List:** Roo Code uses a curated list of Baseten models. The default model is `moonshotai/Kimi-K2-Thinking`. - -- **Multi-Cloud Capacity Management (MCM):** Baseten's multi-cloud infrastructure ensures high availability and low latency globally. - -- **Support:** Baseten provides dedicated support for production deployments and can work with you on dedicated resources as you scale. - -## Pricing Information - -Current pricing is highly competitive and transparent. For the most up-to-date pricing, visit the [Baseten Model APIs page](https://www.baseten.co/products/model-apis/). Prices typically range from $0.10-$6.00 per million tokens, making Baseten significantly more cost-effective than many closed-model alternatives while providing access to state-of-the-art open-source models. From 3619046c62160e5fef56a8f8420b66606e4f5174 Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Fri, 21 Nov 2025 17:21:09 -0500 Subject: [PATCH 11/11] Add translations --- webview-ui/src/i18n/locales/ca/settings.json | 2 ++ webview-ui/src/i18n/locales/de/settings.json | 2 ++ webview-ui/src/i18n/locales/es/settings.json | 2 ++ webview-ui/src/i18n/locales/fr/settings.json | 2 ++ webview-ui/src/i18n/locales/hi/settings.json | 2 ++ webview-ui/src/i18n/locales/id/settings.json | 2 ++ webview-ui/src/i18n/locales/it/settings.json | 2 ++ webview-ui/src/i18n/locales/ja/settings.json | 2 ++ webview-ui/src/i18n/locales/ko/settings.json | 2 ++ webview-ui/src/i18n/locales/nl/settings.json | 2 ++ webview-ui/src/i18n/locales/pl/settings.json | 2 ++ webview-ui/src/i18n/locales/pt-BR/settings.json | 2 ++ webview-ui/src/i18n/locales/ru/settings.json | 2 ++ webview-ui/src/i18n/locales/tr/settings.json | 2 ++ webview-ui/src/i18n/locales/vi/settings.json | 2 ++ webview-ui/src/i18n/locales/zh-CN/settings.json | 2 ++ webview-ui/src/i18n/locales/zh-TW/settings.json | 2 ++ 17 files changed, 34 insertions(+) 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/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 金鑰",