{{/* People, their limits and their use: one page in three tabs, because all three are about the same tree. Each tab keeps its old address. Forms and links work as plain navigation; htmx, when it loads, swaps only #people, so a change does not jump the page. */}} {{define "admin_people"}} {{t "people.title"}} · llmgw

{{t "people.title"}}

{{t "people.sub"}}

{{template "nav" .Nav}}
{{if .Users}}
{{with .Detail}}{{end}}
{{template "people_body" .Users}}
{{else if .Quotas}}{{template "limits_body" .Quotas}} {{else if .Usage}}{{template "usage_body" .Usage}} {{end}}
{{end}} {{/* One branch or person: its limits, its capacity and its use, together. */}} {{define "people-detail"}}{{$d := .}}{{$sel := printf "%s:%s" .Kind .ID}}
{{t (print "people.kind." .Kind)}}

{{.Name}}

{{if and .Path (ne .Path .Name)}}

{{.Path}}

{{end}} ×
{{with .Memberships}}

{{t "people.in"}} {{range $i, $m := .}}{{if $i}}, {{end}}{{$m.Path}}{{end}}

{{else}}{{if eq (printf "%s" $d.Kind) "user"}}

{{t "people.on_own"}}

{{end}}{{end}} {{if or .Limits .Person}}

{{t "people.limits"}}

{{if not .BudgetsBind}}

{{t "people.budgets_unpriced"}}

{{end}} {{with .Limits}}
{{t "people.rpm"}}
{{template "quota-value" dict "Own" .Shown.RPM "Up" .RPMUp "From" .RPMFrom}}
{{t "people.tpm"}}
{{template "quota-value" dict "Own" .Shown.TPM "Up" .TPMUp "From" .TPMFrom}}
{{t "people.budget"}}
{{if .Budget}}{{.Shown.Budget}}{{if .Period}}/{{.Shown.Period}}{{end}}{{else}}{{template "quota-value" dict "Up" .BudgetUp "From" .BudgetFrom}}{{end}}
{{t "people.spent" $d.QuotaWindow}}
{{.Spend}}{{if .HasPct}} {{t "quotas.pct" .Percent}}{{end}}
{{t "people.models"}}
{{if .Models}}{{th "people.models_only" .Models}}{{else if .ModelsFrom}}{{t "people.models_limited_by" .ModelsFrom}}{{else}}{{t "people.models_every"}}{{end}}
{{if .Member}}
{{t "people.each_member"}}
{{.Member}}
{{end}}
{{if .Shadowed}}

{{.Shadowed}}

{{end}}
{{if .HasAny}}{{t "people.change_limits"}}{{else}}{{t "people.set_limits"}}{{end}} {{template "quota-form" (dict "Scope" (printf "%s" .Scope) "ID" .ID "CSRF" $d.CSRF "Sel" $sel "F" (dict "RPM" .RPM "TPM" .TPM "Budget" .Budget "Period" .Period "Models" .Models "HasAny" .HasAny) "Title" (t "people.quota_for" .Crumb) "Note" (t "people.note.shared"))}}
{{t "people.limit_each_member"}} {{template "quota-form" (dict "Scope" (printf "%s-member" .Scope) "ID" .ID "F" .MemberRaw "CSRF" $d.CSRF "Sel" $sel "Title" (t "people.each_member_of" .Crumb) "Note" (t "people.note.each_member"))}}
{{end}} {{with .Person}}
{{t "people.rpm"}}
{{or .Shown.RPM "—"}}
{{t "people.tpm"}}
{{or .Shown.TPM "—"}}
{{t "people.budget"}}
{{if .Budget}}{{.Shown.Budget}}{{if .Period}}/{{.Shown.Period}}{{end}}{{else}}—{{end}}
{{t "people.spent" $d.QuotaWindow}}
{{.Spend}}{{if .HasPct}} {{t "quotas.pct" .Percent}}{{end}}
{{t "people.models"}}
{{if .Models}}{{th "people.models_only" .Models}}{{else}}{{t "people.models_every"}}{{end}}
{{if .HasAny}}{{t "people.change_limits"}}{{else}}{{t "people.set_limits"}}{{end}} {{template "quota-form" (dict "Scope" "user" "ID" .ID "CSRF" $d.CSRF "Sel" $sel "F" (dict "RPM" .RPM "TPM" .TPM "Budget" .Budget "Period" .Period "Models" .Models "HasAny" .HasAny) "Title" (t "people.everywhere" .Email) "Note" (t "people.note.person"))}}
{{end}} {{end}} {{if .HasCapacity}}

{{t "people.capacity"}}

{{with .Capacity}}
GPUs
{{or .GPUs "—"}}
{{t "people.cores"}}
{{or .Cores "—"}}
{{t "people.memory_gb"}}
{{or .Memory "—"}}

{{t "people.capacity_note"}} {{t "people.change"}}

{{else}}

{{t "people.no_capacity"}} {{t "people.set_one"}}

{{end}} {{end}} {{if .HasUsage}}

{{t "people.use" .UsageWindow}}

{{if .Totals.Name}}

{{t "people.n_requests" (compact .Totals.Requests)}} · {{t "people.n_tokens" (compact .Totals.Tokens)}}{{if .Priced}} · {{t "people.spent_amount" .Totals.Spend}}{{end}}{{if .Totals.Errors}} · {{t "people.n_errors" (count .Totals.Errors)}}{{end}}

{{if and .HasStats .Stats.Requests}}{{with .Stats}}
{{t "people.error_rate"}}
{{pct1 .ErrorRate}}%
{{t "people.refused"}}
{{if .Limited}}{{compact .Limited}}{{else}}{{t "common.none"}}{{end}}
{{t "people.first_token"}}
p50 {{pctile .TTFT 50}} · p95 {{pctile .TTFT 95}} · p99 {{pctile .TTFT 99}}
{{t "people.latency"}}
p50 {{pctile .Latency 50}} · p95 {{pctile .Latency 95}} · p99 {{pctile .Latency 99}}
{{end}}{{end}} {{template "tschart" dict "t" .Requests "title" (t "people.chart.requests") "note" ""}} {{template "tschart" dict "t" .Tokens "title" (t "people.chart.tokens") "note" ""}} {{if .Priced}}{{template "tschart" dict "t" .Spend "title" (t "people.chart.spend") "note" ""}}{{end}} {{else}}

{{t "people.nothing_used"}}

{{end}} {{end}} {{end}}