feat(vscode): add cache cost and average total cost to model picker

This commit is contained in:
Josh Holmer
2026-04-22 21:06:28 -04:00
parent 74df868527
commit c8d75ae4f1
23 changed files with 374 additions and 18 deletions
@@ -1,5 +1,5 @@
import { describe, it, expect } from "bun:test"
import { fmtPrice } from "../../webview-ui/src/components/shared/model-preview-utils"
import { avgPrice, fmtCachedPrice, fmtPrice } from "../../webview-ui/src/components/shared/model-preview-utils"
// Prices arriving at fmtPrice are already in $/M tokens (converted by parseApiPrice).
// This test suite guards against the double-multiplication bug where fmtPrice was
@@ -34,3 +34,35 @@ describe("fmtPrice", () => {
expect(fmtPrice(75)).toBe("$75.00/1M")
})
})
describe("fmtCachedPrice", () => {
it("formats supported cached prices using the same $/1M formatter", () => {
expect(fmtCachedPrice({ input: 3, cache: { read: 0.3 } })).toBe("$0.30/1M")
})
it("shows free cached pricing when input is free and cache_read is zero", () => {
expect(fmtCachedPrice({ input: 0, cache: { read: 0 } })).toBe("Free")
})
it("returns null when cache_read is zero but input is paid", () => {
expect(fmtCachedPrice({ input: 3, cache: { read: 0 } })).toBeNull()
})
it("returns null when cache_read is missing but input is paid", () => {
expect(fmtCachedPrice({ input: 3 })).toBeNull()
})
})
describe("avgPrice", () => {
it("uses the cache-heavy ratio when cache_read is supported", () => {
expect(avgPrice({ input: 3, output: 15, cache: { read: 0.3 } })).toBe(2.31)
})
it("uses the fallback ratio when cache_read is zero", () => {
expect(avgPrice({ input: 3, output: 15, cache: { read: 0 } })).toBe(4.2)
})
it("uses the fallback ratio when cache_read is missing", () => {
expect(avgPrice({ input: 3, output: 15 })).toBe(4.2)
})
})
@@ -1,11 +1,12 @@
import { Component, Show, For, useContext } from "solid-js"
import { Show, For, useContext, type Component } from "solid-js"
import type { EnrichedModel } from "../../context/provider"
import { SessionContext } from "../../context/session"
import { Markdown } from "@kilocode/kilo-ui/markdown"
import { Icon } from "@kilocode/kilo-ui/icon"
import { Tooltip } from "@kilocode/kilo-ui/tooltip"
import { useLanguage } from "../../context/language"
import { sanitizeName } from "./model-selector-utils"
import { fmtPrice } from "./model-preview-utils"
import { avgPrice, fmtCachedPrice, fmtPrice } from "./model-preview-utils"
interface Props {
model: EnrichedModel | null
@@ -22,12 +23,12 @@ function fmtDate(s: string): string {
return d.toLocaleDateString(undefined, { year: "numeric", month: "short" })
}
const MODALITY_LABELS: Record<string, string> = {
text: "Text",
image: "Images",
audio: "Audio",
video: "Video",
pdf: "PDF",
const MODALITY_KEYS: Record<string, string> = {
text: "model.preview.modality.text",
image: "model.preview.modality.image",
audio: "model.preview.modality.audio",
video: "model.preview.modality.video",
pdf: "model.preview.modality.pdf",
}
export const ModelPreview: Component<Props> = (props) => {
@@ -40,6 +41,11 @@ export const ModelPreview: Component<Props> = (props) => {
<Show when={m()}>
{(model) => {
const cost = () => model().cost
const cachedText = () => {
if (!cost()) return ""
return fmtCachedPrice(cost()!) ?? language.t("model.preview.value.notSupported")
}
const avg = () => (cost() ? avgPrice(cost()!) : undefined)
const ctx = () => model().limit?.context ?? model().contextLength
const caps = () => model().capabilities
const inputs = () => caps()?.input
@@ -47,13 +53,18 @@ export const ModelPreview: Component<Props> = (props) => {
inputs()
? (Object.entries(inputs()!) as [string, boolean][])
.filter(([, v]) => v)
.map(([k]) => MODALITY_LABELS[k] ?? k)
.map(([k]) => {
const key = MODALITY_KEYS[k]
return key ? language.t(key) : k
})
: []
return (
<>
<Show when={model().isFree}>
<span class="model-preview-badge model-preview-badge--free model-preview-badge--top-right">Free</span>
<span class="model-preview-badge model-preview-badge--free model-preview-badge--top-right">
{language.t("model.tag.free")}
</span>
</Show>
{/* Header — name + provider + star */}
<div class="model-preview-header">
@@ -88,21 +99,29 @@ export const ModelPreview: Component<Props> = (props) => {
<div class="model-preview-grid">
{/* Release date */}
<Show when={model().releaseDate}>
<span class="model-preview-label">Released</span>
<span class="model-preview-label">{language.t("model.preview.label.released")}</span>
<span class="model-preview-value">{fmtDate(model().releaseDate!)}</span>
</Show>
{/* Pricing — hidden for free models */}
<Show when={cost() && !model().isFree}>
<span class="model-preview-label">Input</span>
<span class="model-preview-label">{language.t("model.preview.label.input")}</span>
<span class="model-preview-value">{fmtPrice(cost()!.input)}</span>
<span class="model-preview-label">Output</span>
<span class="model-preview-label">{language.t("model.preview.label.output")}</span>
<span class="model-preview-value">{fmtPrice(cost()!.output)}</span>
<span class="model-preview-label">{language.t("model.preview.label.cached")}</span>
<span class="model-preview-value">{cachedText()}</span>
<Tooltip value={language.t("model.preview.tooltip.average")} placement="top">
<span class="model-preview-label model-preview-label--hint" tabIndex={0}>
{language.t("model.preview.label.average")}
</span>
</Tooltip>
<span class="model-preview-value">{fmtPrice(avg()!)}</span>
</Show>
{/* Context window */}
<Show when={ctx()}>
<span class="model-preview-label">Context</span>
<span class="model-preview-label">{language.t("model.preview.label.context")}</span>
<span class="model-preview-value">{fmtContext(ctx()!)}</span>
</Show>
</div>
@@ -111,7 +130,9 @@ export const ModelPreview: Component<Props> = (props) => {
<Show when={caps()?.reasoning || activeModalities().length > 0}>
<div class="model-preview-caps">
<Show when={caps()?.reasoning}>
<span class="model-preview-badge model-preview-badge--reasoning">Reasoning</span>
<span class="model-preview-badge model-preview-badge--reasoning">
{language.t("model.preview.badge.reasoning")}
</span>
</Show>
<For each={activeModalities()}>{(label) => <span class="model-preview-badge">{label}</span>}</For>
</div>
@@ -7,3 +7,18 @@ export function fmtPrice(n: number): string {
if (n < 0.01) return `$${n.toFixed(4)}/1M`
return `$${n.toFixed(2)}/1M`
}
export function fmtCachedPrice(cost: { input: number; cache?: { read: number } }): string | null {
const read = cost.cache?.read
if (read !== undefined && read > 0) return fmtPrice(read)
if (cost.input === 0) return fmtPrice(0)
return null
}
export function avgPrice(cost: { input: number; output: number; cache?: { read: number } }): number {
const read = cost.cache?.read
if (read !== undefined && read > 0) {
return read * 0.7 + cost.input * 0.2 + cost.output * 0.1
}
return cost.input * 0.9 + cost.output * 0.1
}
+15
View File
@@ -181,6 +181,21 @@ export const dict = {
"model.tooltip.reasoning.allowed": "يسمح بالاستنتاج",
"model.tooltip.reasoning.none": "بدون استنتاج",
"model.tooltip.context": "حد السياق {{limit}}",
"model.preview.label.released": "الإصدار",
"model.preview.label.input": "الإدخال",
"model.preview.label.output": "الإخراج",
"model.preview.label.cached": "مخزن مؤقتاً",
"model.preview.label.average": "متوسط التكلفة التقديرية",
"model.preview.label.context": "السياق",
"model.preview.value.notSupported": "غير مدعوم",
"model.preview.tooltip.average":
"يعتمد متوسط التكلفة التقديرية على نسبة نموذجية لرموز الإدخال والإخراج والقراءة المخزنة مؤقتاً.",
"model.preview.badge.reasoning": "التفكير",
"model.preview.modality.text": "نص",
"model.preview.modality.image": "صور",
"model.preview.modality.audio": "صوت",
"model.preview.modality.video": "فيديو",
"model.preview.modality.pdf": "PDF",
"common.search.placeholder": "بحث",
"common.goBack": "رجوع",
+15
View File
@@ -182,6 +182,21 @@ export const dict = {
"model.tooltip.reasoning.allowed": "Permite raciocínio",
"model.tooltip.reasoning.none": "Sem raciocínio",
"model.tooltip.context": "Limite de contexto {{limit}}",
"model.preview.label.released": "Lançado",
"model.preview.label.input": "Entrada",
"model.preview.label.output": "Saída",
"model.preview.label.cached": "Em cache",
"model.preview.label.average": "Custo Médio Est.",
"model.preview.label.context": "Contexto",
"model.preview.value.notSupported": "Não suportado",
"model.preview.tooltip.average":
"O custo médio estimado é baseado em uma proporção típica de tokens de entrada, saída e leitura de cache.",
"model.preview.badge.reasoning": "Raciocínio",
"model.preview.modality.text": "Texto",
"model.preview.modality.image": "Imagens",
"model.preview.modality.audio": "Áudio",
"model.preview.modality.video": "Vídeo",
"model.preview.modality.pdf": "PDF",
"common.search.placeholder": "Buscar",
"common.goBack": "Voltar",
+15
View File
@@ -183,6 +183,21 @@ export const dict = {
"model.tooltip.reasoning.allowed": "Podržava rasuđivanje",
"model.tooltip.reasoning.none": "Bez rasuđivanja",
"model.tooltip.context": "Limit konteksta {{limit}}",
"model.preview.label.released": "Objavljeno",
"model.preview.label.input": "Ulaz",
"model.preview.label.output": "Izlaz",
"model.preview.label.cached": "Keširano",
"model.preview.label.average": "Procj. prosječni trošak",
"model.preview.label.context": "Kontekst",
"model.preview.value.notSupported": "Nije podržano",
"model.preview.tooltip.average":
"Procijenjeni prosječni trošak zasniva se na tipičnom omjeru ulaznih i izlaznih tokena, te tokena pročitanih iz keša.",
"model.preview.badge.reasoning": "Zaključivanje",
"model.preview.modality.text": "Tekst",
"model.preview.modality.image": "Slike",
"model.preview.modality.audio": "Audio",
"model.preview.modality.video": "Video",
"model.preview.modality.pdf": "PDF",
"common.search.placeholder": "Pretraži",
"common.goBack": "Nazad",
+15
View File
@@ -183,6 +183,21 @@ export const dict = {
"model.tooltip.reasoning.allowed": "Tillader tænkning",
"model.tooltip.reasoning.none": "Ingen tænkning",
"model.tooltip.context": "Kontekstgrænse {{limit}}",
"model.preview.label.released": "Udgivet",
"model.preview.label.input": "Input",
"model.preview.label.output": "Output",
"model.preview.label.cached": "Cached",
"model.preview.label.average": "Est. gennemsnitspris",
"model.preview.label.context": "Kontekst",
"model.preview.value.notSupported": "Ikke understøttet",
"model.preview.tooltip.average":
"Den estimerede gennemsnitspris er baseret på et typisk forhold mellem input-, output- og cache-læsetokens.",
"model.preview.badge.reasoning": "Ræsonnering",
"model.preview.modality.text": "Tekst",
"model.preview.modality.image": "Billeder",
"model.preview.modality.audio": "Lyd",
"model.preview.modality.video": "Video",
"model.preview.modality.pdf": "PDF",
"common.search.placeholder": "Søg",
"common.goBack": "Gå tilbage",
"common.goForward": "Fremad",
+15
View File
@@ -187,6 +187,21 @@ export const dict = {
"model.tooltip.reasoning.allowed": "Erlaubt Reasoning",
"model.tooltip.reasoning.none": "Kein Reasoning",
"model.tooltip.context": "Kontextlimit {{limit}}",
"model.preview.label.released": "Veröffentlicht",
"model.preview.label.input": "Eingabe",
"model.preview.label.output": "Ausgabe",
"model.preview.label.cached": "Zwischengespeichert",
"model.preview.label.average": "Geschätzte Ø-Kosten",
"model.preview.label.context": "Kontext",
"model.preview.value.notSupported": "Nicht unterstützt",
"model.preview.tooltip.average":
"Die geschätzten Durchschnittskosten basieren auf einem typischen Verhältnis von Eingabe-, Ausgabe- und Cache-Lese-Token.",
"model.preview.badge.reasoning": "Reasoning",
"model.preview.modality.text": "Text",
"model.preview.modality.image": "Bilder",
"model.preview.modality.audio": "Audio",
"model.preview.modality.video": "Video",
"model.preview.modality.pdf": "PDF",
"common.search.placeholder": "Suchen",
"common.goBack": "Zurück",
"common.goForward": "Vorwärts",
@@ -183,6 +183,21 @@ export const dict = {
"model.tooltip.reasoning.allowed": "Allows reasoning",
"model.tooltip.reasoning.none": "No reasoning",
"model.tooltip.context": "Context limit {{limit}}",
"model.preview.label.released": "Released",
"model.preview.label.input": "Input",
"model.preview.label.output": "Output",
"model.preview.label.cached": "Cached",
"model.preview.label.average": "Est. Average Cost",
"model.preview.label.context": "Context",
"model.preview.value.notSupported": "Not supported",
"model.preview.tooltip.average":
"The estimated average cost is based on a typical ratio of input, output, and cache read tokens.",
"model.preview.badge.reasoning": "Reasoning",
"model.preview.modality.text": "Text",
"model.preview.modality.image": "Images",
"model.preview.modality.audio": "Audio",
"model.preview.modality.video": "Video",
"model.preview.modality.pdf": "PDF",
"common.search.placeholder": "Search",
"common.goBack": "Back",
+15
View File
@@ -183,6 +183,21 @@ export const dict = {
"model.tooltip.reasoning.allowed": "Permite razonamiento",
"model.tooltip.reasoning.none": "Sin razonamiento",
"model.tooltip.context": "Límite de contexto {{limit}}",
"model.preview.label.released": "Lanzamiento",
"model.preview.label.input": "Entrada",
"model.preview.label.output": "Salida",
"model.preview.label.cached": "En caché",
"model.preview.label.average": "Costo prom. est.",
"model.preview.label.context": "Contexto",
"model.preview.value.notSupported": "No admitido",
"model.preview.tooltip.average":
"El costo promedio estimado se basa en una proporción típica de tokens de entrada, salida y lectura en caché.",
"model.preview.badge.reasoning": "Razonamiento",
"model.preview.modality.text": "Texto",
"model.preview.modality.image": "Imágenes",
"model.preview.modality.audio": "Audio",
"model.preview.modality.video": "Video",
"model.preview.modality.pdf": "PDF",
"common.search.placeholder": "Buscar",
"common.goBack": "Volver",
"common.goForward": "Adelante",
+15
View File
@@ -184,6 +184,21 @@ export const dict = {
"model.tooltip.reasoning.allowed": "Autorise le raisonnement",
"model.tooltip.reasoning.none": "Sans raisonnement",
"model.tooltip.context": "Limite de contexte {{limit}}",
"model.preview.label.released": "Sortie",
"model.preview.label.input": "Entrée",
"model.preview.label.output": "Sortie",
"model.preview.label.cached": "En cache",
"model.preview.label.average": "Coût moyen est.",
"model.preview.label.context": "Contexte",
"model.preview.value.notSupported": "Non pris en charge",
"model.preview.tooltip.average":
"Le coût moyen estimé est basé sur un ratio typique de jetons d'entrée, de sortie et de lecture en cache.",
"model.preview.badge.reasoning": "Raisonnement",
"model.preview.modality.text": "Texte",
"model.preview.modality.image": "Images",
"model.preview.modality.audio": "Audio",
"model.preview.modality.video": "Vidéo",
"model.preview.modality.pdf": "PDF",
"common.search.placeholder": "Rechercher",
"common.goBack": "Retour",
"common.goForward": "Suivant",
+15
View File
@@ -182,6 +182,21 @@ export const dict = {
"model.tooltip.reasoning.allowed": "推論を許可",
"model.tooltip.reasoning.none": "推論なし",
"model.tooltip.context": "コンテキスト上限 {{limit}}",
"model.preview.label.released": "リリース",
"model.preview.label.input": "入力",
"model.preview.label.output": "出力",
"model.preview.label.cached": "キャッシュ",
"model.preview.label.average": "推定平均コスト",
"model.preview.label.context": "コンテキスト",
"model.preview.value.notSupported": "未対応",
"model.preview.tooltip.average":
"推定平均コストは、入力、出力、およびキャッシュ読み取りトークンの一般的な比率に基づいています。",
"model.preview.badge.reasoning": "推論",
"model.preview.modality.text": "テキスト",
"model.preview.modality.image": "画像",
"model.preview.modality.audio": "音声",
"model.preview.modality.video": "動画",
"model.preview.modality.pdf": "PDF",
"common.search.placeholder": "検索",
"common.goBack": "戻る",
"common.goForward": "進む",
+14
View File
@@ -186,6 +186,20 @@ export const dict = {
"model.tooltip.reasoning.allowed": "추론 허용",
"model.tooltip.reasoning.none": "추론 없음",
"model.tooltip.context": "컨텍스트 제한 {{limit}}",
"model.preview.label.released": "출시",
"model.preview.label.input": "입력",
"model.preview.label.output": "출력",
"model.preview.label.cached": "캐시됨",
"model.preview.label.average": "예상 평균 비용",
"model.preview.label.context": "컨텍스트",
"model.preview.value.notSupported": "미지원",
"model.preview.tooltip.average": "예상 평균 비용은 입력, 출력 및 캐시 읽기 토큰의 일반적인 비율을 기반으로 합니다.",
"model.preview.badge.reasoning": "추론",
"model.preview.modality.text": "텍스트",
"model.preview.modality.image": "이미지",
"model.preview.modality.audio": "오디오",
"model.preview.modality.video": "비디오",
"model.preview.modality.pdf": "PDF",
"common.search.placeholder": "검색",
"common.goBack": "뒤로 가기",
"common.goForward": "앞으로 가기",
+15
View File
@@ -183,6 +183,21 @@ export const dict = {
"model.tooltip.reasoning.allowed": "Staat redeneren toe",
"model.tooltip.reasoning.none": "Geen redenering",
"model.tooltip.context": "Contextlimiet {{limit}}",
"model.preview.label.released": "Uitgebracht",
"model.preview.label.input": "Input",
"model.preview.label.output": "Output",
"model.preview.label.cached": "Gecachet",
"model.preview.label.average": "Gesch. gem. kosten",
"model.preview.label.context": "Context",
"model.preview.value.notSupported": "Niet ondersteund",
"model.preview.tooltip.average":
"De geschatte gemiddelde kosten zijn gebaseerd op een typische verhouding van input-, output- en cache-leestokens.",
"model.preview.badge.reasoning": "Redeneren",
"model.preview.modality.text": "Tekst",
"model.preview.modality.image": "Afbeeldingen",
"model.preview.modality.audio": "Audio",
"model.preview.modality.video": "Video",
"model.preview.modality.pdf": "PDF",
"common.search.placeholder": "Zoeken",
"common.goBack": "Terug",
+15
View File
@@ -185,6 +185,21 @@ export const dict = {
"model.tooltip.reasoning.allowed": "Tillater resonnering",
"model.tooltip.reasoning.none": "Ingen resonnering",
"model.tooltip.context": "Kontekstgrense {{limit}}",
"model.preview.label.released": "Utgitt",
"model.preview.label.input": "Inndata",
"model.preview.label.output": "Utdata",
"model.preview.label.cached": "Bufret",
"model.preview.label.average": "Est. snittkostnad",
"model.preview.label.context": "Kontekst",
"model.preview.value.notSupported": "Ikke støttet",
"model.preview.tooltip.average":
"Den estimerte snittkostnaden er basert på et typisk forhold mellom inndata-, utdata- og leste buffer-tokens.",
"model.preview.badge.reasoning": "Resonnering",
"model.preview.modality.text": "Tekst",
"model.preview.modality.image": "Bilder",
"model.preview.modality.audio": "Lyd",
"model.preview.modality.video": "Video",
"model.preview.modality.pdf": "PDF",
"common.search.placeholder": "Søk",
"common.goBack": "Gå tilbake",
+15
View File
@@ -182,6 +182,21 @@ export const dict = {
"model.tooltip.reasoning.allowed": "Obsługuje wnioskowanie",
"model.tooltip.reasoning.none": "Brak wnioskowania",
"model.tooltip.context": "Limit kontekstu {{limit}}",
"model.preview.label.released": "Wydano",
"model.preview.label.input": "Wejście",
"model.preview.label.output": "Wyjście",
"model.preview.label.cached": "W pamięci podręcznej",
"model.preview.label.average": "Szac. średni koszt",
"model.preview.label.context": "Kontekst",
"model.preview.value.notSupported": "Nieobsługiwane",
"model.preview.tooltip.average":
"Szacowany średni koszt opiera się na typowym stosunku tokenów wejściowych, wyjściowych i pobranych z pamięci podręcznej.",
"model.preview.badge.reasoning": "Rozumowanie",
"model.preview.modality.text": "Tekst",
"model.preview.modality.image": "Obrazy",
"model.preview.modality.audio": "Audio",
"model.preview.modality.video": "Wideo",
"model.preview.modality.pdf": "PDF",
"common.search.placeholder": "Szukaj",
"common.goBack": "Wstecz",
+15 -1
View File
@@ -182,7 +182,21 @@ export const dict = {
"model.tooltip.reasoning.allowed": "Разрешает рассуждение",
"model.tooltip.reasoning.none": "Без рассуждения",
"model.tooltip.context": "Лимит контекста {{limit}}",
"model.preview.label.released": "Выпущена",
"model.preview.label.input": "Ввод",
"model.preview.label.output": "Вывод",
"model.preview.label.cached": "В кэше",
"model.preview.label.average": "Средняя стоимость",
"model.preview.label.context": "Контекст",
"model.preview.value.notSupported": "Не поддерживается",
"model.preview.tooltip.average":
"Примерная средняя стоимость основана на типичном соотношении токенов ввода, вывода и чтения из кэша.",
"model.preview.badge.reasoning": "Рассуждение",
"model.preview.modality.text": "Текст",
"model.preview.modality.image": "Изображения",
"model.preview.modality.audio": "Аудио",
"model.preview.modality.video": "Видео",
"model.preview.modality.pdf": "PDF",
"common.search.placeholder": "Поиск",
"common.goBack": "Назад",
"common.goForward": "Вперёд",
+15
View File
@@ -182,6 +182,21 @@ export const dict = {
"model.tooltip.reasoning.allowed": "อนุญาตการใช้เหตุผล",
"model.tooltip.reasoning.none": "ไม่มีการใช้เหตุผล",
"model.tooltip.context": "ขีดจำกัดบริบท {{limit}}",
"model.preview.label.released": "เปิดตัว",
"model.preview.label.input": "อินพุต",
"model.preview.label.output": "เอาต์พุต",
"model.preview.label.cached": "แคช",
"model.preview.label.average": "ต้นทุนเฉลี่ยโดยประมาณ",
"model.preview.label.context": "บริบท",
"model.preview.value.notSupported": "ไม่รองรับ",
"model.preview.tooltip.average":
"ต้นทุนเฉลี่ยโดยประมาณนี้คำนวณจากอัตราส่วนทั่วไปของโทเค็นอินพุต เอาต์พุต และการอ่านแคช",
"model.preview.badge.reasoning": "การให้เหตุผล",
"model.preview.modality.text": "ข้อความ",
"model.preview.modality.image": "รูปภาพ",
"model.preview.modality.audio": "เสียง",
"model.preview.modality.video": "วิดีโอ",
"model.preview.modality.pdf": "PDF",
"common.search.placeholder": "ค้นหา",
"common.goBack": "ย้อนกลับ",
+15
View File
@@ -182,6 +182,21 @@ export const dict = {
"model.tooltip.reasoning.allowed": "Akıl yürütme destekler",
"model.tooltip.reasoning.none": "Akıl yürütme yok",
"model.tooltip.context": "Bağlam limiti {{limit}}",
"model.preview.label.released": "Yayınlanma",
"model.preview.label.input": "Girdi",
"model.preview.label.output": "Çıktı",
"model.preview.label.cached": "Önbellek",
"model.preview.label.average": "Tahmini Ort. Maliyet",
"model.preview.label.context": "Bağlam",
"model.preview.value.notSupported": "Desteklenmiyor",
"model.preview.tooltip.average":
"Tahmini ortalama maliyet; girdi, çıktı ve önbellek okuma tokenlerinin tipik bir oranına dayanmaktadır.",
"model.preview.badge.reasoning": "Akıl Yürütme",
"model.preview.modality.text": "Metin",
"model.preview.modality.image": "Görseller",
"model.preview.modality.audio": "Ses",
"model.preview.modality.video": "Video",
"model.preview.modality.pdf": "PDF",
"common.search.placeholder": "Ara",
"common.goBack": "Geri git",
+15
View File
@@ -183,6 +183,21 @@ export const dict = {
"model.tooltip.reasoning.allowed": "Підтримує міркування",
"model.tooltip.reasoning.none": "Без міркування",
"model.tooltip.context": "Ліміт контексту {{limit}}",
"model.preview.label.released": "Випущено",
"model.preview.label.input": "Вхідні",
"model.preview.label.output": "Вихідні",
"model.preview.label.cached": "Кешовані",
"model.preview.label.average": "Орієнт. сер. вартість",
"model.preview.label.context": "Контекст",
"model.preview.value.notSupported": "Не підтримується",
"model.preview.tooltip.average":
"Орієнтовна середня вартість базується на типовому співвідношенні вхідних, вихідних токенів та читання кешу.",
"model.preview.badge.reasoning": "Міркування",
"model.preview.modality.text": "Текст",
"model.preview.modality.image": "Зображення",
"model.preview.modality.audio": "Аудіо",
"model.preview.modality.video": "Відео",
"model.preview.modality.pdf": "PDF",
"common.search.placeholder": "Пошук",
"common.goBack": "Назад",
+14
View File
@@ -183,6 +183,20 @@ export const dict = {
"model.tooltip.reasoning.allowed": "支持推理",
"model.tooltip.reasoning.none": "不支持推理",
"model.tooltip.context": "上下文上限 {{limit}}",
"model.preview.label.released": "发布",
"model.preview.label.input": "输入",
"model.preview.label.output": "输出",
"model.preview.label.cached": "缓存",
"model.preview.label.average": "预估平均成本",
"model.preview.label.context": "上下文",
"model.preview.value.notSupported": "不支持",
"model.preview.tooltip.average": "预估平均成本基于输入、输出和缓存读取 token 的典型比例计算。",
"model.preview.badge.reasoning": "推理",
"model.preview.modality.text": "文本",
"model.preview.modality.image": "图像",
"model.preview.modality.audio": "音频",
"model.preview.modality.video": "视频",
"model.preview.modality.pdf": "PDF",
"common.search.placeholder": "搜索",
"common.goBack": "返回",
"common.goForward": "前进",
+14
View File
@@ -183,6 +183,20 @@ export const dict = {
"model.tooltip.reasoning.allowed": "支援推理",
"model.tooltip.reasoning.none": "不支援推理",
"model.tooltip.context": "上下文上限 {{limit}}",
"model.preview.label.released": "發布",
"model.preview.label.input": "輸入",
"model.preview.label.output": "輸出",
"model.preview.label.cached": "快取",
"model.preview.label.average": "預估平均成本",
"model.preview.label.context": "上下文",
"model.preview.value.notSupported": "不支援",
"model.preview.tooltip.average": "預估平均成本是基於輸入、輸出和快取讀取 token 的典型比例計算而得。",
"model.preview.badge.reasoning": "推理",
"model.preview.modality.text": "文字",
"model.preview.modality.image": "圖片",
"model.preview.modality.audio": "音訊",
"model.preview.modality.video": "影片",
"model.preview.modality.pdf": "PDF",
"common.search.placeholder": "搜尋",
"common.goBack": "上一頁",
"common.goForward": "下一頁",
@@ -355,7 +355,14 @@ export interface ProviderModel {
options?: { description?: string }
recommendedIndex?: number
isFree?: boolean
cost?: { input: number; output: number }
cost?: {
input: number
output: number
cache?: {
read: number
write: number
}
}
}
export interface Provider {