feat(vertex): add 1M context window beta support for Claude Sonnet 4 (#10209)

This commit is contained in:
Hannes Rudolph 2025-12-19 10:24:45 -07:00 committed by GitHub
parent 2dec78ccb4
commit 3f1f8be2d1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
23 changed files with 333 additions and 44 deletions

View file

@ -237,6 +237,7 @@ const vertexSchema = apiModelIdProviderModelSchema.extend({
vertexRegion: z.string().optional(),
enableUrlContext: z.boolean().optional(),
enableGrounding: z.boolean().optional(),
vertex1MContext: z.boolean().optional(), // Enable 'context-1m-2025-08-07' beta for 1M context window.
})
const openAiSchema = baseProviderSettingsSchema.extend({

View file

@ -275,29 +275,49 @@ export const vertexModels = {
},
"claude-sonnet-4@20250514": {
maxTokens: 8192,
contextWindow: 200_000,
contextWindow: 200_000, // Default 200K, extendable to 1M with beta flag 'context-1m-2025-08-07'
supportsImages: true,
supportsPromptCache: true,
supportsNativeTools: true,
defaultToolProtocol: "native",
inputPrice: 3.0,
outputPrice: 15.0,
cacheWritesPrice: 3.75,
cacheReadsPrice: 0.3,
inputPrice: 3.0, // $3 per million input tokens (≤200K context)
outputPrice: 15.0, // $15 per million output tokens (≤200K context)
cacheWritesPrice: 3.75, // $3.75 per million tokens
cacheReadsPrice: 0.3, // $0.30 per million tokens
supportsReasoningBudget: true,
// Tiered pricing for extended context (requires beta flag 'context-1m-2025-08-07')
tiers: [
{
contextWindow: 1_000_000, // 1M tokens with beta flag
inputPrice: 6.0, // $6 per million input tokens (>200K context)
outputPrice: 22.5, // $22.50 per million output tokens (>200K context)
cacheWritesPrice: 7.5, // $7.50 per million tokens (>200K context)
cacheReadsPrice: 0.6, // $0.60 per million tokens (>200K context)
},
],
},
"claude-sonnet-4-5@20250929": {
maxTokens: 8192,
contextWindow: 200_000,
contextWindow: 200_000, // Default 200K, extendable to 1M with beta flag 'context-1m-2025-08-07'
supportsImages: true,
supportsPromptCache: true,
supportsNativeTools: true,
defaultToolProtocol: "native",
inputPrice: 3.0,
outputPrice: 15.0,
cacheWritesPrice: 3.75,
cacheReadsPrice: 0.3,
inputPrice: 3.0, // $3 per million input tokens (≤200K context)
outputPrice: 15.0, // $15 per million output tokens (≤200K context)
cacheWritesPrice: 3.75, // $3.75 per million tokens
cacheReadsPrice: 0.3, // $0.30 per million tokens
supportsReasoningBudget: true,
// Tiered pricing for extended context (requires beta flag 'context-1m-2025-08-07')
tiers: [
{
contextWindow: 1_000_000, // 1M tokens with beta flag
inputPrice: 6.0, // $6 per million input tokens (>200K context)
outputPrice: 22.5, // $22.50 per million output tokens (>200K context)
cacheWritesPrice: 7.5, // $7.50 per million tokens (>200K context)
cacheReadsPrice: 0.6, // $0.60 per million tokens (>200K context)
},
],
},
"claude-haiku-4-5@20251001": {
maxTokens: 8192,
@ -517,6 +537,10 @@ export const vertexModels = {
},
} as const satisfies Record<string, ModelInfo>
// Vertex AI models that support 1M context window beta
// Uses the same beta header 'context-1m-2025-08-07' as Anthropic and Bedrock
export const VERTEX_1M_CONTEXT_MODEL_IDS = ["claude-sonnet-4@20250514", "claude-sonnet-4-5@20250929"] as const
export const VERTEX_REGIONS = [
{ value: "global", label: "global" },
{ value: "us-central1", label: "us-central1" },

View file

@ -3,6 +3,8 @@
import { Anthropic } from "@anthropic-ai/sdk"
import { AnthropicVertex } from "@anthropic-ai/vertex-sdk"
import { VERTEX_1M_CONTEXT_MODEL_IDS } from "@roo-code/types"
import { ApiStreamChunk } from "../../transform/stream"
import { AnthropicVertexHandler } from "../anthropic-vertex"
@ -159,35 +161,39 @@ describe("VertexHandler", () => {
outputTokens: 5,
})
expect(mockCreate).toHaveBeenCalledWith({
model: "claude-3-5-sonnet-v2@20241022",
max_tokens: 8192,
temperature: 0,
system: [
{
type: "text",
text: "You are a helpful assistant",
cache_control: { type: "ephemeral" },
},
],
messages: [
{
role: "user",
content: [
{
type: "text",
text: "Hello",
cache_control: { type: "ephemeral" },
},
],
},
{
role: "assistant",
content: "Hi there!",
},
],
stream: true,
})
expect(mockCreate).toHaveBeenCalledWith(
{
model: "claude-3-5-sonnet-v2@20241022",
max_tokens: 8192,
temperature: 0,
thinking: undefined,
system: [
{
type: "text",
text: "You are a helpful assistant",
cache_control: { type: "ephemeral" },
},
],
messages: [
{
role: "user",
content: [
{
type: "text",
text: "Hello",
cache_control: { type: "ephemeral" },
},
],
},
{
role: "assistant",
content: "Hi there!",
},
],
stream: true,
},
undefined,
)
})
it("should handle multiple content blocks with line breaks for Claude", async () => {
@ -401,6 +407,7 @@ describe("VertexHandler", () => {
}),
],
}),
undefined,
)
})
@ -858,6 +865,162 @@ describe("VertexHandler", () => {
expect(result.reasoningBudget).toBeUndefined()
expect(result.temperature).toBe(0)
})
it("should enable 1M context for Claude Sonnet 4 when beta flag is set", () => {
const handler = new AnthropicVertexHandler({
apiModelId: VERTEX_1M_CONTEXT_MODEL_IDS[0],
vertexProjectId: "test-project",
vertexRegion: "us-central1",
vertex1MContext: true,
})
const model = handler.getModel()
expect(model.info.contextWindow).toBe(1_000_000)
expect(model.info.inputPrice).toBe(6.0)
expect(model.info.outputPrice).toBe(22.5)
expect(model.betas).toContain("context-1m-2025-08-07")
})
it("should enable 1M context for Claude Sonnet 4.5 when beta flag is set", () => {
const handler = new AnthropicVertexHandler({
apiModelId: VERTEX_1M_CONTEXT_MODEL_IDS[1],
vertexProjectId: "test-project",
vertexRegion: "us-central1",
vertex1MContext: true,
})
const model = handler.getModel()
expect(model.info.contextWindow).toBe(1_000_000)
expect(model.info.inputPrice).toBe(6.0)
expect(model.info.outputPrice).toBe(22.5)
expect(model.betas).toContain("context-1m-2025-08-07")
})
it("should not enable 1M context when flag is disabled", () => {
const handler = new AnthropicVertexHandler({
apiModelId: VERTEX_1M_CONTEXT_MODEL_IDS[0],
vertexProjectId: "test-project",
vertexRegion: "us-central1",
vertex1MContext: false,
})
const model = handler.getModel()
expect(model.info.contextWindow).toBe(200_000)
expect(model.info.inputPrice).toBe(3.0)
expect(model.info.outputPrice).toBe(15.0)
expect(model.betas).toBeUndefined()
})
it("should not enable 1M context for non-supported models even with flag", () => {
const handler = new AnthropicVertexHandler({
apiModelId: "claude-3-5-sonnet-v2@20241022",
vertexProjectId: "test-project",
vertexRegion: "us-central1",
vertex1MContext: true,
})
const model = handler.getModel()
expect(model.info.contextWindow).toBe(200_000)
expect(model.betas).toBeUndefined()
})
})
describe("1M context beta header", () => {
const mockMessages: Anthropic.Messages.MessageParam[] = [
{
role: "user",
content: "Hello",
},
]
const systemPrompt = "You are a helpful assistant"
it("should include anthropic-beta header when 1M context is enabled", async () => {
const handler = new AnthropicVertexHandler({
apiModelId: VERTEX_1M_CONTEXT_MODEL_IDS[0],
vertexProjectId: "test-project",
vertexRegion: "us-central1",
vertex1MContext: true,
})
const mockStream = [
{
type: "message_start",
message: {
usage: {
input_tokens: 10,
output_tokens: 0,
},
},
},
]
const asyncIterator = {
async *[Symbol.asyncIterator]() {
for (const chunk of mockStream) {
yield chunk
}
},
}
const mockCreate = vitest.fn().mockResolvedValue(asyncIterator)
;(handler["client"].messages as any).create = mockCreate
const stream = handler.createMessage(systemPrompt, mockMessages)
for await (const _chunk of stream) {
// Just consume
}
// Verify the API was called with the beta header
expect(mockCreate).toHaveBeenCalledWith(
expect.anything(),
expect.objectContaining({
headers: { "anthropic-beta": "context-1m-2025-08-07" },
}),
)
})
it("should not include anthropic-beta header when 1M context is disabled", async () => {
const handler = new AnthropicVertexHandler({
apiModelId: VERTEX_1M_CONTEXT_MODEL_IDS[0],
vertexProjectId: "test-project",
vertexRegion: "us-central1",
vertex1MContext: false,
})
const mockStream = [
{
type: "message_start",
message: {
usage: {
input_tokens: 10,
output_tokens: 0,
},
},
},
]
const asyncIterator = {
async *[Symbol.asyncIterator]() {
for (const chunk of mockStream) {
yield chunk
}
},
}
const mockCreate = vitest.fn().mockResolvedValue(asyncIterator)
;(handler["client"].messages as any).create = mockCreate
const stream = handler.createMessage(systemPrompt, mockMessages)
for await (const _chunk of stream) {
// Just consume
}
// Verify the API was called without the beta header
expect(mockCreate).toHaveBeenCalledWith(expect.anything(), undefined)
})
})
describe("thinking model configuration", () => {
@ -946,6 +1109,7 @@ describe("VertexHandler", () => {
thinking: { type: "enabled", budget_tokens: 4096 },
temperature: 1.0, // Thinking requires temperature 1.0
}),
undefined,
)
})
})
@ -1032,6 +1196,7 @@ describe("VertexHandler", () => {
]),
tool_choice: { type: "auto", disable_parallel_tool_use: true },
}),
undefined,
)
})
@ -1080,6 +1245,7 @@ describe("VertexHandler", () => {
expect.not.objectContaining({
tools: expect.anything(),
}),
undefined,
)
})

View file

@ -9,6 +9,7 @@ import {
vertexModels,
ANTHROPIC_DEFAULT_MAX_TOKENS,
TOOL_PROTOCOL,
VERTEX_1M_CONTEXT_MODEL_IDS,
} from "@roo-code/types"
import { ApiHandlerOptions } from "../../shared/api"
@ -69,7 +70,7 @@ export class AnthropicVertexHandler extends BaseProvider implements SingleComple
messages: Anthropic.Messages.MessageParam[],
metadata?: ApiHandlerCreateMessageMetadata,
): ApiStream {
let { id, info, temperature, maxTokens, reasoning: thinking } = this.getModel()
let { id, info, temperature, maxTokens, reasoning: thinking, betas } = this.getModel()
const { supportsPromptCache } = info
@ -120,7 +121,10 @@ export class AnthropicVertexHandler extends BaseProvider implements SingleComple
...nativeToolParams,
}
const stream = await this.client.messages.create(params)
// and prompt caching
const requestOptions = betas?.length ? { headers: { "anthropic-beta": betas.join(",") } } : undefined
const stream = await this.client.messages.create(params, requestOptions)
for await (const chunk of stream) {
switch (chunk.type) {
@ -218,14 +222,49 @@ export class AnthropicVertexHandler extends BaseProvider implements SingleComple
getModel() {
const modelId = this.options.apiModelId
let id = modelId && modelId in vertexModels ? (modelId as VertexModelId) : vertexDefaultModelId
const info: ModelInfo = vertexModels[id]
let info: ModelInfo = vertexModels[id]
// Check if 1M context beta should be enabled for supported models
const supports1MContext = VERTEX_1M_CONTEXT_MODEL_IDS.includes(
id as (typeof VERTEX_1M_CONTEXT_MODEL_IDS)[number],
)
const enable1MContext = supports1MContext && this.options.vertex1MContext
// If 1M context beta is enabled, update the model info with tier pricing
if (enable1MContext) {
const tier = info.tiers?.[0]
if (tier) {
info = {
...info,
contextWindow: tier.contextWindow,
inputPrice: tier.inputPrice,
outputPrice: tier.outputPrice,
cacheWritesPrice: tier.cacheWritesPrice,
cacheReadsPrice: tier.cacheReadsPrice,
}
}
}
const params = getModelParams({ format: "anthropic", modelId: id, model: info, settings: this.options })
// Build betas array for request headers
const betas: string[] = []
// Add 1M context beta flag if enabled for supported models
if (enable1MContext) {
betas.push("context-1m-2025-08-07")
}
// The `:thinking` suffix indicates that the model is a "Hybrid"
// reasoning model and that reasoning is required to be enabled.
// The actual model ID honored by Anthropic's API does not have this
// suffix.
return { id: id.endsWith(":thinking") ? id.replace(":thinking", "") : id, info, ...params }
return {
id: id.endsWith(":thinking") ? id.replace(":thinking", "") : id,
info,
betas: betas.length > 0 ? betas : undefined,
...params,
}
}
async completePrompt(prompt: string) {

View file

@ -2,7 +2,7 @@ import { useCallback } from "react"
import { Checkbox } from "vscrui"
import { VSCodeLink, VSCodeTextField } from "@vscode/webview-ui-toolkit/react"
import { type ProviderSettings, VERTEX_REGIONS } from "@roo-code/types"
import { type ProviderSettings, VERTEX_REGIONS, VERTEX_1M_CONTEXT_MODEL_IDS } from "@roo-code/types"
import { useAppTranslation } from "@src/i18n/TranslationContext"
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@src/components/ui"
@ -18,6 +18,13 @@ type VertexProps = {
export const Vertex = ({ apiConfiguration, setApiConfigurationField, simplifySettings }: VertexProps) => {
const { t } = useAppTranslation()
// Check if the selected model supports 1M context (Claude Sonnet 4 / 4.5)
const supports1MContextBeta =
!!apiConfiguration?.apiModelId &&
VERTEX_1M_CONTEXT_MODEL_IDS.includes(
apiConfiguration.apiModelId as (typeof VERTEX_1M_CONTEXT_MODEL_IDS)[number],
)
const handleInputChange = useCallback(
<K extends keyof ProviderSettings, E>(
field: K,
@ -94,6 +101,22 @@ export const Vertex = ({ apiConfiguration, setApiConfigurationField, simplifySet
</Select>
</div>
{supports1MContextBeta && (
<div>
<Checkbox
data-testid="checkbox-vertex-1m-context"
checked={apiConfiguration?.vertex1MContext ?? false}
onChange={(checked: boolean) => {
setApiConfigurationField("vertex1MContext", checked)
}}>
{t("settings:providers.vertex1MContextBetaLabel")}
</Checkbox>
<div className="text-sm text-vscode-descriptionForeground mt-1 ml-6">
{t("settings:providers.vertex1MContextBetaDescription")}
</div>
</div>
)}
{!simplifySettings && apiConfiguration.apiModelId?.startsWith("gemini") && (
<div className="mt-6">
<Checkbox

View file

@ -301,6 +301,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",
"vertex1MContextBetaLabel": "Activa la finestra de context d'1M (Beta)",
"vertex1MContextBetaDescription": "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",

View file

@ -303,6 +303,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",
"vertex1MContextBetaLabel": "1M Kontextfenster aktivieren (Beta)",
"vertex1MContextBetaDescription": "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",

View file

@ -310,6 +310,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",
"vertex1MContextBetaLabel": "Enable 1M context window (Beta)",
"vertex1MContextBetaDescription": "Extends context window to 1 million tokens for Claude Sonnet 4",
"basetenApiKey": "Baseten API Key",
"getBasetenApiKey": "Get Baseten API Key",
"cerebrasApiKey": "Cerebras API Key",

View file

@ -301,6 +301,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",
"vertex1MContextBetaLabel": "Habilitar ventana de contexto de 1M (Beta)",
"vertex1MContextBetaDescription": "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",

View file

@ -301,6 +301,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",
"vertex1MContextBetaLabel": "Activer la fenêtre de contexte de 1M (Bêta)",
"vertex1MContextBetaDescription": "É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",

View file

@ -301,6 +301,8 @@
"anthropic1MContextBetaDescription": "Claude Sonnet 4 के लिए संदर्भ विंडो को 1 मिलियन टोकन तक बढ़ाता है",
"awsBedrock1MContextBetaLabel": "1M संदर्भ विंडो सक्षम करें (बीटा)",
"awsBedrock1MContextBetaDescription": "Claude Sonnet 4 के लिए संदर्भ विंडो को 1 मिलियन टोकन तक बढ़ाता है",
"vertex1MContextBetaLabel": "1M संदर्भ विंडो सक्षम करें (बीटा)",
"vertex1MContextBetaDescription": "Claude Sonnet 4 के लिए संदर्भ विंडो को 1 मिलियन टोकन तक बढ़ाता है",
"basetenApiKey": "Baseten API कुंजी",
"getBasetenApiKey": "Baseten API कुंजी प्राप्त करें",
"cerebrasApiKey": "Cerebras API कुंजी",

View file

@ -305,6 +305,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",
"vertex1MContextBetaLabel": "Aktifkan jendela konteks 1M (Beta)",
"vertex1MContextBetaDescription": "Memperluas jendela konteks menjadi 1 juta token untuk Claude Sonnet 4",
"basetenApiKey": "Baseten API Key",
"getBasetenApiKey": "Dapatkan Baseten API Key",
"cerebrasApiKey": "Cerebras API Key",

View file

@ -301,6 +301,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",
"vertex1MContextBetaLabel": "Abilita finestra di contesto da 1M (Beta)",
"vertex1MContextBetaDescription": "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",

View file

@ -301,6 +301,8 @@
"anthropic1MContextBetaDescription": "Claude Sonnet 4のコンテキストウィンドウを100万トークンに拡張します",
"awsBedrock1MContextBetaLabel": "1Mコンテキストウィンドウを有効にするベータ版",
"awsBedrock1MContextBetaDescription": "Claude Sonnet 4のコンテキストウィンドウを100万トークンに拡張します",
"vertex1MContextBetaLabel": "1Mコンテキストウィンドウを有効にするベータ版",
"vertex1MContextBetaDescription": "Claude Sonnet 4のコンテキストウィンドウを100万トークンに拡張します",
"basetenApiKey": "Baseten APIキー",
"getBasetenApiKey": "Baseten APIキーを取得",
"cerebrasApiKey": "Cerebras APIキー",

View file

@ -301,6 +301,8 @@
"anthropic1MContextBetaDescription": "Claude Sonnet 4의 컨텍스트 창을 100만 토큰으로 확장",
"awsBedrock1MContextBetaLabel": "1M 컨텍스트 창 활성화 (베타)",
"awsBedrock1MContextBetaDescription": "Claude Sonnet 4의 컨텍스트 창을 100만 토큰으로 확장",
"vertex1MContextBetaLabel": "1M 컨텍스트 창 활성화 (베타)",
"vertex1MContextBetaDescription": "Claude Sonnet 4의 컨텍스트 창을 100만 토큰으로 확장",
"basetenApiKey": "Baseten API 키",
"getBasetenApiKey": "Baseten API 키 가져오기",
"cerebrasApiKey": "Cerebras API 키",

View file

@ -301,6 +301,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",
"vertex1MContextBetaLabel": "1M contextvenster inschakelen (bèta)",
"vertex1MContextBetaDescription": "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",

View file

@ -301,6 +301,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",
"vertex1MContextBetaLabel": "Włącz okno kontekstowe 1M (Beta)",
"vertex1MContextBetaDescription": "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",

View file

@ -301,6 +301,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",
"vertex1MContextBetaLabel": "Ativar janela de contexto de 1M (Beta)",
"vertex1MContextBetaDescription": "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",

View file

@ -301,6 +301,8 @@
"anthropic1MContextBetaDescription": "Расширяет контекстное окно до 1 миллиона токенов для Claude Sonnet 4",
"awsBedrock1MContextBetaLabel": "Включить контекстное окно 1M (бета)",
"awsBedrock1MContextBetaDescription": "Расширяет контекстное окно до 1 миллиона токенов для Claude Sonnet 4",
"vertex1MContextBetaLabel": "Включить контекстное окно 1M (бета)",
"vertex1MContextBetaDescription": "Расширяет контекстное окно до 1 миллиона токенов для Claude Sonnet 4",
"basetenApiKey": "Baseten API-ключ",
"getBasetenApiKey": "Получить Baseten API-ключ",
"cerebrasApiKey": "Cerebras API-ключ",

View file

@ -301,6 +301,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",
"vertex1MContextBetaLabel": "1M bağlam penceresini etkinleştir (Beta)",
"vertex1MContextBetaDescription": "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ı",

View file

@ -301,6 +301,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",
"vertex1MContextBetaLabel": "Bật cửa sổ ngữ cảnh 1M (Beta)",
"vertex1MContextBetaDescription": "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",

View file

@ -301,6 +301,8 @@
"anthropic1MContextBetaDescription": "为 Claude Sonnet 4 将上下文窗口扩展至 100 万个 token",
"awsBedrock1MContextBetaLabel": "启用 1M 上下文窗口 (Beta)",
"awsBedrock1MContextBetaDescription": "为 Claude Sonnet 4 将上下文窗口扩展至 100 万个 token",
"vertex1MContextBetaLabel": "启用 1M 上下文窗口 (Beta)",
"vertex1MContextBetaDescription": "为 Claude Sonnet 4 将上下文窗口扩展至 100 万个 token",
"basetenApiKey": "Baseten API 密钥",
"getBasetenApiKey": "获取 Baseten API 密钥",
"cerebrasApiKey": "Cerebras API 密钥",

View file

@ -301,6 +301,8 @@
"anthropic1MContextBetaDescription": "為 Claude Sonnet 4 將上下文視窗擴展至 100 萬個 token",
"awsBedrock1MContextBetaLabel": "啟用 1M 上下文視窗 (Beta)",
"awsBedrock1MContextBetaDescription": "為 Claude Sonnet 4 將上下文視窗擴展至 100 萬個 token",
"vertex1MContextBetaLabel": "啟用 1M 上下文視窗 (Beta)",
"vertex1MContextBetaDescription": "為 Claude Sonnet 4 將上下文視窗擴展至 100 萬個 token",
"basetenApiKey": "Baseten API 金鑰",
"getBasetenApiKey": "取得 Baseten API 金鑰",
"cerebrasApiKey": "Cerebras API 金鑰",