// Aggregate views: API Keys overview, Metrics, Skills library, Billing function KeysView({ instances, onOpenInstance }) { const openaiCount = instances.filter(i => i.apiProvider === "openai").length; const anthropicCount = instances.filter(i => i.apiProvider === "anthropic").length; return (
Per-instance BYO keys · {instances.length} instances · {openaiCount} OpenAI · {anthropicCount} Anthropic
| Instance | Provider | Key | Status | Month usage | Last used | |
|---|---|---|---|---|---|---|
|
|
{inst.apiProvider === "openai" ? "OpenAI" : "Anthropic"} | {sample} | {warn ? Quota 92% : Healthy} | {fmtEur(usage)} | {Math.floor(Math.random() * 59) + 1}m ago |
|
Token usage, cost, skill breakdown across all instances
| Instance | Provider | Input | Output | Messages | Cost | € / 1k msgs |
|---|---|---|---|---|---|---|
|
|
{inst.apiProvider} | {fmtNum(inst.tokensIn)} | {fmtNum(inst.tokensOut)} | {fmtNum(inst.messages)} | {fmtEur(inst.cost)} | {fmtEur(inst.cost / Math.max(1, inst.messages) * 1000)} |
{allSkills.length} installable skills · assign to any instance from the launch form or detail page
Customer invoices, subscriptions and model cost pass-through
| Customer | Plan | Status | Plan fee | Model cost MTD | Next invoice | |
|---|---|---|---|---|---|---|
|
{inst.name}
{inst.email}
|
{inst.plan} | €{fee.toFixed(2)} | {fmtEur(inst.cost)} | 2026-05-01 |
| # | Customer | Amount | Date | Status |
|---|---|---|---|---|
| {r.n} | {r.c} | €{r.a.toFixed(2)} | {r.d} | {r.s === "Paid" ? Paid : r.s === "Overdue" ? Overdue : Open} |