(feat): Add Baseten Provider (#9461)

Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com>
Co-authored-by: AlexKer <AlexKer@users.noreply.github.com>
Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com>
This commit is contained in:
Alex Ker 2025-11-21 17:49:15 -05:00 committed by GitHub
parent 7edc86bb52
commit fa764ba7f1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
31 changed files with 273 additions and 0 deletions

View file

@ -246,6 +246,7 @@ export const SECRET_STATE_KEYS = [
"featherlessApiKey",
"ioIntelligenceApiKey",
"vercelAiGatewayApiKey",
"basetenApiKey",
] as const
// Global secrets that are part of GlobalSettings (not ProviderSettings)

View file

@ -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<TypicalProvider, ModelIdKey> = {
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: [] },

View file

@ -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<string, ModelInfo>
export type BasetenModelId = keyof typeof basetenModels
export const basetenDefaultModelId = "moonshotai/Kimi-K2-Thinking" satisfies BasetenModelId

View file

@ -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":

View file

@ -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)

View file

@ -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<BasetenModelId> {
constructor(options: ApiHandlerOptions) {
super({
...options,
providerName: "Baseten",
baseURL: "https://inference.baseten.co/v1",
apiKey: options.basetenApiKey,
defaultProviderModelId: basetenDefaultModelId,
providerModels: basetenModels,
defaultTemperature: 0.5,
})
}
}

View file

@ -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"

View file

@ -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 = ({
<Mistral apiConfiguration={apiConfiguration} setApiConfigurationField={setApiConfigurationField} />
)}
{selectedProvider === "baseten" && (
<Baseten apiConfiguration={apiConfiguration} setApiConfigurationField={setApiConfigurationField} />
)}
{selectedProvider === "bedrock" && (
<Bedrock
apiConfiguration={apiConfiguration}

View file

@ -20,6 +20,7 @@ import {
fireworksModels,
featherlessModels,
minimaxModels,
basetenModels,
} from "@roo-code/types"
export const MODELS_BY_PROVIDER: Partial<Record<ProviderName, Record<string, ModelInfo>>> = {
@ -42,6 +43,7 @@ export const MODELS_BY_PROVIDER: Partial<Record<ProviderName, Record<string, Mod
fireworks: fireworksModels,
featherless: featherlessModels,
minimax: minimaxModels,
baseten: basetenModels,
}
export const PROVIDERS = [
@ -80,4 +82,5 @@ export const PROVIDERS = [
{ value: "roo", label: "Roo Code Cloud" },
{ value: "vercel-ai-gateway", label: "Vercel AI Gateway" },
{ value: "minimax", label: "MiniMax" },
{ value: "baseten", label: "Baseten" },
].sort((a, b) => a.label.localeCompare(b.label))

View file

@ -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(
<K extends keyof ProviderSettings, E>(
field: K,
transform: (event: E) => ProviderSettings[K] = inputEventTransform,
) =>
(event: E | Event) => {
setApiConfigurationField(field, transform(event as E))
},
[setApiConfigurationField],
)
return (
<>
<VSCodeTextField
value={apiConfiguration?.basetenApiKey || ""}
type="password"
onInput={handleInputChange("basetenApiKey")}
placeholder={t("settings:placeholders.apiKey")}
className="w-full">
<label className="block font-medium mb-1">{t("settings:providers.basetenApiKey")}</label>
</VSCodeTextField>
<div className="text-sm text-vscode-descriptionForeground -mt-2">
{t("settings:providers.apiKeyStorageNotice")}
</div>
{!apiConfiguration?.basetenApiKey && (
<VSCodeButtonLink href="https://app.baseten.co/settings/api_keys" appearance="secondary">
{t("settings:providers.getBasetenApiKey")}
</VSCodeButtonLink>
)}
</>
)
}

View file

@ -32,3 +32,4 @@ export { Featherless } from "./Featherless"
export { VercelAiGateway } from "./VercelAiGateway"
export { DeepInfra } from "./DeepInfra"
export { MiniMax } from "./MiniMax"
export { Baseten } from "./Baseten"

View file

@ -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]

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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 कुंजी",

View file

@ -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",

View file

@ -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",

View file

@ -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キー",

View file

@ -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 키",

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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-ключ",

View file

@ -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ı",

View file

@ -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",

View file

@ -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 密钥",

View file

@ -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 金鑰",

View file

@ -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