Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
93 changes: 30 additions & 63 deletions packages/gui-extensions/src/debug/bar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,9 @@ import { Icon } from "@opencode/ui/icon"
import { IconButton } from "@opencode/ui/icon-button"
import { Tooltip } from "@opencode/ui/tooltip"
import { createKeyed, useExtension } from "../sdk"
import {
applyProviderMetricEvent,
isProviderMetricEvent,
projectedProviderMetrics,
type ProviderMetrics,
type ProviderMetricState,
} from "./metrics"
import { motionGlobals, motionTuning } from "@opencode/ui/motion-tuning"
import { duration } from "@opencode/util/duration"
import { SessionTurn } from "@opencode/util/session-turn"

type Mem = Performance & {
memory?: {
Expand Down Expand Up @@ -75,14 +70,6 @@ const mb = (n?: number) => {
return `${v >= 1024 ? v.toFixed(0) : v.toFixed(1)}MB`
}

const duration = (n?: number) => {
if (n === undefined || Number.isNaN(n)) return

if (n < 1_000) return `${Math.round(n)}ms`

return `${(n / 1_000).toFixed(n < 10_000 ? 1 : 0)}s`
}

const bad = (n: number | undefined, limit: number, low = false) => {
if (n === undefined || Number.isNaN(n)) return false

Expand Down Expand Up @@ -241,43 +228,37 @@ export default function DebugBar(props: {
{ equals: (a, b) => a?.data === b?.data && a?.id === b?.id },
)

// History comes from the already-loaded message projection; live requests refine it in place.
const projected = createMemo(() => {
// The numbers on the TUI's latest assistant footer, which follows a step that ended the turn, failed, or is retrying.
const turn = createMemo(() => {
const current = target()

if (!current) return

return projectedProviderMetrics(current.data.session.message.list(current.id))
const messages = current.data.session.message.list(current.id)

const index = messages.findLastIndex(
(item) =>
item.type === "assistant" &&
Boolean(item.retry || item.error || (item.finish && !["tool-calls", "unknown"].includes(item.finish))),
)

if (index === -1) return

const options = { index, legacy: SessionTurn.legacy(messages) }
// The TUI hides a zero duration, which means the step has not completed.
const elapsed = SessionTurn.duration(messages, messages[index], options)

return {
duration: elapsed ? duration(elapsed) : undefined,
tps: SessionTurn.tokensPerSecond(messages, messages[index], options),
}
})

// Missed events during an outage are never replayed, so live metrics hold only for the target and the outage count
// they were measured under: after a disconnect the refreshed projection wins until the next live request.
const outages = createMemo((count: number = 0) => (target()?.server.connected ? count : count + 1))
// The Motion workspace's global speed, kept in view while tuning.
const [globals, setGlobals] = createSignal({ speed: motionGlobals.speed.value, slow: motionGlobals.slow.value })
onCleanup(
motionTuning.subscribe(() => setGlobals({ speed: motionGlobals.speed.value, slow: motionGlobals.slow.value })),
)
const [live, setLive] = createSignal<{ target: object; outages: number; metrics: ProviderMetrics }>()

const metrics = () => {
const current = live()

return current && current.target === target() && current.outages === outages() ? current.metrics : projected()
}

createKeyed(target, (current) => {
const accumulator: ProviderMetricState = {}

onCleanup(
current.data.listen(({ details }) => {
if (!isProviderMetricEvent(details) || details.data.sessionID !== current.id) return
applyProviderMetricEvent(accumulator, details)

if (accumulator.latest) setLive({ target: current, outages: outages(), metrics: accumulator.latest })
}),
)
})

const na = () => ctx.t("na").toUpperCase()
const heap = () => (state.heap.limit ? (state.heap.used ?? 0) / state.heap.limit : undefined)
Expand Down Expand Up @@ -627,31 +608,17 @@ export default function DebugBar(props: {
</Tooltip>
</Show>
<Cell
label={ctx.t("tps.label")}
tip={ctx.t("tps.tip")}
value={fixed(metrics()?.tps, 1) ?? na()}
dim={metrics()?.tps === undefined}
inline={props.inline}
/>
<Cell
label={ctx.t("ttft.label")}
tip={ctx.t("ttft.tip")}
value={duration(metrics()?.ttft) ?? na()}
dim={metrics()?.ttft === undefined}
label={ctx.t("duration.label")}
tip={ctx.t("duration.tip")}
value={turn()?.duration ?? na()}
dim={turn()?.duration === undefined}
inline={props.inline}
/>
<Cell
label={ctx.t("ttfa.label")}
tip={ctx.t("ttfa.tip")}
value={duration(metrics()?.ttfa) ?? na()}
dim={metrics()?.ttfa === undefined}
inline={props.inline}
/>
<Cell
label={ctx.t("e2e.label")}
tip={ctx.t("e2e.tip")}
value={duration(metrics()?.e2e) ?? na()}
dim={metrics()?.e2e === undefined}
label={ctx.t("tps.label")}
tip={ctx.t("tps.tip")}
value={fixed(turn()?.tps, 1) ?? na()}
dim={turn()?.tps === undefined}
inline={props.inline}
/>
<Show when={props.diagnostics}>
Expand Down
10 changes: 3 additions & 7 deletions packages/gui-extensions/src/debug/i18n/am.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,10 @@ export default {
ariaLabel: "የልማት አፈጻጸም ምርመራዎች",
providerAriaLabel: "የአቅራቢ አፈጻጸም ምርመራ",
na: "n/a",
"ttft.label": "TTFT",
"ttft.tip": "የአቅራቢው ጥያቄ ከተላከበት ጊዜ እስከ ሞዴሉ የመጀመሪያ ውጤት ድረስ ያለው ጊዜ።",
"ttfa.label": "TTFA",
"ttfa.tip": "የአቅራቢው ጥያቄ ከተላከበት ጊዜ እስከ የመጀመሪያው የመልስ ጽሑፍ ድረስ ያለው ጊዜ።",
"duration.label": "TIME",
"duration.tip": "የመጨረሻውን ዙር ከጀመረው ጥያቄ እስከ ምላሹ መጠናቀቅ ድረስ ያለው ጊዜ።",
"tps.label": "TPS",
"tps.tip": "ከሞዴሉ የመጀመሪያ ውጤት በኋላ በሰከንድ የሚወጡ ቶከኖች።",
"e2e.label": "E2E",
"e2e.tip": "የአቅራቢው ጥያቄ ከተላከበት ጊዜ እስከ የምላሽ ዥረቱ መጨረሻ ድረስ ያለው ጊዜ።",
"tps.tip": "በመጨረሻው ዙር የሞዴል ጥያቄዎች ውስጥ በሰከንድ የሚወጡ የውጤት እና የማሰብ ቶከኖች፣ የመሳሪያ ጊዜን ሳይጨምር።",
"nav.label": "NAV",
"nav.tip": "የክፍለ ጊዜ ገጽን የነካው የመጨረሻው የተጠናቀቀ የመንገድ ሽግግር፣ ከራውተር ጅምር እስከ ከተረጋጋ በኋላ የመጀመሪያው ስዕል ድረስ የሚለካ።",
"fps.label": "FPS",
Expand Down
10 changes: 3 additions & 7 deletions packages/gui-extensions/src/debug/i18n/ar.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,10 @@ export default {
ariaLabel: "تشخيص أداء التطوير",
providerAriaLabel: "تشخيص أداء المزوّد",
na: "غير متاح",
"ttft.label": "TTFT",
"ttft.tip": "الوقت من إرسال طلب المزوّد إلى أول مخرجات للنموذج.",
"ttfa.label": "TTFA",
"ttfa.tip": "الوقت من إرسال طلب المزوّد إلى أول نص في الإجابة.",
"duration.label": "TIME",
"duration.tip": "الوقت من الطلب الذي بدأ الدورة الأخيرة حتى اكتمال استجابتها.",
"tps.label": "TPS",
"tps.tip": "رموز الإخراج في الثانية بعد أول مخرجات للنموذج.",
"e2e.label": "E2E",
"e2e.tip": "الوقت من إرسال طلب المزوّد حتى انتهاء تدفق استجابته.",
"tps.tip": "رموز الإخراج والاستدلال في الثانية عبر طلبات النموذج في الدورة الأخيرة، باستثناء وقت الأدوات.",
"nav.label": "NAV",
"nav.tip": "آخر انتقال مكتمل للمسار يتضمن صفحة جلسة، مُقاسًا من بدء التوجيه حتى أول رسم بعد استقراره.",
"fps.label": "FPS",
Expand Down
10 changes: 3 additions & 7 deletions packages/gui-extensions/src/debug/i18n/az.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,10 @@ export default {
ariaLabel: "Tərtibatçı performans diaqnostikası",
providerAriaLabel: "Provayder performansının diaqnostikası",
na: "yox",
"ttft.label": "TTFT",
"ttft.tip": "Provayder sorğusunun göndərilməsindən modelin ilk çıxışına qədər olan vaxt.",
"ttfa.label": "TTFA",
"ttfa.tip": "Provayder sorğusunun göndərilməsindən cavabın ilk mətninə qədər olan vaxt.",
"duration.label": "TIME",
"duration.tip": "Son növbəni başladan sorğudan cavabının tamamlanmasına qədər keçən vaxt.",
"tps.label": "TPS",
"tps.tip": "Modelin ilk çıxışından sonra saniyədə çıxış tokenlərinin sayı.",
"e2e.label": "E2E",
"e2e.tip": "Provayder sorğusunun göndərilməsindən cavab axınının bitməsinə qədər olan vaxt.",
"tps.tip": "Son növbənin model sorğuları üzrə saniyədə çıxış və düşünmə tokenləri, alət vaxtı istisna olmaqla.",
"nav.label": "NAV",
"nav.tip":
"Sessiya səhifəsinə aid son tamamlanmış marşrut keçidi; marşrutlaşdırıcının başladığı andan keçid tamamlandıqdan sonrakı ilk göstərilməyədək ölçülür.",
Expand Down
11 changes: 4 additions & 7 deletions packages/gui-extensions/src/debug/i18n/bg.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,11 @@ export default {
ariaLabel: "Диагностика на ефективността на разработката",
providerAriaLabel: "Диагностика на производителността на доставчика",
na: "няма",
"ttft.label": "TTFT",
"ttft.tip": "Време от изпращането на заявката към доставчика до първия изход от модела.",
"ttfa.label": "TTFA",
"ttfa.tip": "Време от изпращането на заявката към доставчика до първия текст на отговора.",
"duration.label": "TIME",
"duration.tip": "Време от заявката, започнала последния ход, до завършването на отговора.",
"tps.label": "TPS",
"tps.tip": "Изходни токени в секунда след първия изход от модела.",
"e2e.label": "E2E",
"e2e.tip": "Време от изпращането на заявката към доставчика до края на потока с отговора.",
"tps.tip":
"Изходни токени и токени за разсъждение в секунда за заявките към модела в последния ход, без времето на инструментите.",
"nav.label": "NAV",
"nav.tip":
"Последен завършен преход на маршрута, докосващ страница на сесия, измерен от началото на рутера до първото боядисване след установяването му.",
Expand Down
10 changes: 3 additions & 7 deletions packages/gui-extensions/src/debug/i18n/bn.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,10 @@ export default {
ariaLabel: "উন্নয়ন কর্মক্ষমতা ডায়গনিস্টিক",
providerAriaLabel: "প্রদানকারীর কর্মক্ষমতা নির্ণয়",
na: "n/a",
"ttft.label": "TTFT",
"ttft.tip": "প্রদানকারীর অনুরোধ পাঠানো থেকে মডেলের প্রথম আউটপুট পর্যন্ত সময়।",
"ttfa.label": "TTFA",
"ttfa.tip": "প্রদানকারীর অনুরোধ পাঠানো থেকে উত্তরের প্রথম লেখা পর্যন্ত সময়।",
"duration.label": "TIME",
"duration.tip": "সর্বশেষ টার্ন শুরু করা প্রম্পট থেকে তার উত্তর সম্পূর্ণ হওয়া পর্যন্ত সময়।",
"tps.label": "TPS",
"tps.tip": "মডেলের প্রথম আউটপুটের পর প্রতি সেকেন্ডে আউটপুট টোকেনের সংখ্যা।",
"e2e.label": "E2E",
"e2e.tip": "প্রদানকারীর অনুরোধ পাঠানো থেকে তার প্রতিক্রিয়া স্ট্রিম শেষ হওয়া পর্যন্ত সময়।",
"tps.tip": "সর্বশেষ টার্নের মডেল অনুরোধগুলিতে প্রতি সেকেন্ডে আউটপুট ও রিজনিং টোকেন, টুলের সময় বাদে।",
"nav.label": "এনএভি",
"nav.tip":
"একটি সেশন পৃষ্ঠা স্পর্শ করে শেষ সম্পন্ন রুট ট্রানজিশন, রাউটার শুরু থেকে এটি স্থির হওয়ার পরে প্রথম পেইন্ট পর্যন্ত পরিমাপ করা হয়।",
Expand Down
11 changes: 4 additions & 7 deletions packages/gui-extensions/src/debug/i18n/br.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,11 @@ export default {
ariaLabel: "Diagnóstico de desempenho de desenvolvimento",
providerAriaLabel: "Diagnóstico de desempenho do provedor",
na: "n/a",
"ttft.label": "TTFT",
"ttft.tip": "Tempo entre o envio da solicitação ao provedor e a primeira saída do modelo.",
"ttfa.label": "TTFA",
"ttfa.tip": "Tempo entre o envio da solicitação ao provedor e o primeiro texto da resposta.",
"duration.label": "TIME",
"duration.tip": "Tempo entre o prompt que iniciou o último turno e a conclusão da resposta.",
"tps.label": "TPS",
"tps.tip": "Tokens de saída por segundo após a primeira saída do modelo.",
"e2e.label": "E2E",
"e2e.tip": "Tempo entre o envio da solicitação ao provedor e o fim do fluxo de resposta.",
"tps.tip":
"Tokens de saída e de raciocínio por segundo nas requisições ao modelo do último turno, sem contar o tempo das ferramentas.",
"nav.label": "NAV",
"nav.tip":
"Última transição de rota concluída tocando em uma página de sessão, medida desde o início do roteador até a primeira pintura após o estabelecimento.",
Expand Down
11 changes: 4 additions & 7 deletions packages/gui-extensions/src/debug/i18n/bs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,11 @@ export default {
ariaLabel: "Dijagnostika performansi razvoja",
providerAriaLabel: "Dijagnostika performansi pružaoca usluge",
na: "n/a",
"ttft.label": "TTFT",
"ttft.tip": "Vrijeme od slanja zahtjeva pružaocu do prvog izlaza modela.",
"ttfa.label": "TTFA",
"ttfa.tip": "Vrijeme od slanja zahtjeva pružaocu do prvog teksta odgovora.",
"duration.label": "TIME",
"duration.tip": "Vrijeme od upita koji je započeo posljednji potez do završetka odgovora.",
"tps.label": "TPS",
"tps.tip": "Izlazni tokeni u sekundi nakon prvog izlaza modela.",
"e2e.label": "E2E",
"e2e.tip": "Vrijeme od slanja zahtjeva pružaocu do završetka toka odgovora.",
"tps.tip":
"Izlazni tokeni i tokeni rasuđivanja u sekundi kroz zahtjeve modelu u posljednjem potezu, bez vremena alata.",
"nav.label": "NAV",
"nav.tip":
"Posljednji završeni prelazak rute koji dotiče stranicu sesije, mjeren od početka rutera do prvog iscrtavanja nakon smirivanja.",
Expand Down
11 changes: 4 additions & 7 deletions packages/gui-extensions/src/debug/i18n/ca.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,11 @@ export default {
ariaLabel: "Diagnòstic de rendiment del desenvolupament",
providerAriaLabel: "Diagnòstic del rendiment del proveïdor",
na: "n/a",
"ttft.label": "TTFT",
"ttft.tip": "Temps des de l’enviament de la sol·licitud al proveïdor fins a la primera sortida del model.",
"ttfa.label": "TTFA",
"ttfa.tip": "Temps des de l’enviament de la sol·licitud al proveïdor fins al primer text de resposta.",
"duration.label": "TIME",
"duration.tip": "Temps des de la sol·licitud que va iniciar l'últim torn fins que la resposta va acabar.",
"tps.label": "TPS",
"tps.tip": "Fitxes de sortida per segon després de la primera sortida del model.",
"e2e.label": "E2E",
"e2e.tip": "Temps des de l’enviament de la sol·licitud al proveïdor fins que finalitza el flux de resposta.",
"tps.tip":
"Fitxes de sortida i de raonament per segon en les peticions al model de l'últim torn, sense comptar el temps de les eines.",
"nav.label": "NAV",
"nav.tip":
"L'última transició de ruta completada tocant una pàgina de sessió, mesurada des de l'inici de l'encaminador fins a la primera pintura després que s'instal·li.",
Expand Down
11 changes: 4 additions & 7 deletions packages/gui-extensions/src/debug/i18n/cs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,11 @@ export default {
ariaLabel: "Diagnostika vývoje výkonnosti",
providerAriaLabel: "Diagnostika výkonu poskytovatele",
na: "n/a",
"ttft.label": "TTFT",
"ttft.tip": "Doba od odeslání požadavku poskytovateli do prvního výstupu modelu.",
"ttfa.label": "TTFA",
"ttfa.tip": "Doba od odeslání požadavku poskytovateli do prvního textu odpovědi.",
"duration.label": "TIME",
"duration.tip": "Doba od výzvy, která zahájila poslední tah, do dokončení odpovědi.",
"tps.label": "TPS",
"tps.tip": "Počet výstupních tokenů za sekundu po prvním výstupu modelu.",
"e2e.label": "E2E",
"e2e.tip": "Doba od odeslání požadavku poskytovateli do ukončení proudu odpovědi.",
"tps.tip":
"Výstupní tokeny a tokeny uvažování za sekundu napříč požadavky na model v posledním tahu, bez času nástrojů.",
"nav.label": "NAV",
"nav.tip":
"Poslední dokončený přechod trasy dotykem stránky relace, měřeno od spuštění routeru do prvního nátěru po jeho usazení.",
Expand Down
11 changes: 4 additions & 7 deletions packages/gui-extensions/src/debug/i18n/da.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,11 @@ export default {
ariaLabel: "Udviklingsydelsesdiagnostik",
providerAriaLabel: "Diagnosticering af udbyderens ydeevne",
na: "n/a",
"ttft.label": "TTFT",
"ttft.tip": "Tid fra afsendelse af udbyderanmodningen til modellens første output.",
"ttfa.label": "TTFA",
"ttfa.tip": "Tid fra afsendelse af udbyderanmodningen til den første svartekst.",
"duration.label": "TIME",
"duration.tip": "Tid fra prompten, der startede den seneste tur, til svaret var færdigt.",
"tps.label": "TPS",
"tps.tip": "Outputtokens pr. sekund efter modellens første output.",
"e2e.label": "E2E",
"e2e.tip": "Tid fra afsendelse af udbyderanmodningen, til dens svarstream sluttede.",
"tps.tip":
"Output- og ræsonneringstokens pr. sekund på tværs af den seneste turs modelforespørgsler, uden værktøjstid.",
"nav.label": "NAV",
"nav.tip":
"Sidste gennemførte ruteovergang, der berører en sessionsside, målt fra routerstart til den første optegning efter den falder til ro.",
Expand Down
10 changes: 3 additions & 7 deletions packages/gui-extensions/src/debug/i18n/de.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,10 @@ export default {
ariaLabel: "Leistungsdiagnose für die Entwicklung",
providerAriaLabel: "Leistungsdiagnose des Anbieters",
na: "n.v.",
"ttft.label": "TTFT",
"ttft.tip": "Zeit vom Senden der Anbieteranfrage bis zur ersten Modellausgabe.",
"ttfa.label": "TTFA",
"ttfa.tip": "Zeit vom Senden der Anbieteranfrage bis zum ersten Antworttext.",
"duration.label": "TIME",
"duration.tip": "Zeit vom Prompt, der die letzte Runde gestartet hat, bis zum Abschluss der Antwort.",
"tps.label": "TPS",
"tps.tip": "Ausgabetokens pro Sekunde nach der ersten Modellausgabe.",
"e2e.label": "E2E",
"e2e.tip": "Zeit vom Senden der Anbieteranfrage bis zum Ende ihres Antwortstreams.",
"tps.tip": "Ausgabe- und Reasoning-Tokens pro Sekunde über die Modellanfragen der letzten Runde, ohne Werkzeugzeit.",
"nav.label": "NAV",
"nav.tip":
"Letzter abgeschlossener Routenübergang zu einer Sitzungsseite, gemessen vom Start des Routers bis zum ersten Rendering nach Abschluss des Übergangs.",
Expand Down
Loading
Loading