mirror of
https://github.com/Kilo-Org/kilocode.git
synced 2026-10-29 18:52:45 +08:00
feat(vscode): add cache cost and average total cost to model picker
This commit is contained in:
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user