"use client"; import Link from "next/link"; import * as React from "react"; import type { AdminOrganization, AdminUsageRow, ReadinessResponse } from "@agy/contracts"; import { Badge, Card, CardHint, CardTitle, ErrorState, LoadingState, Stat } from "@agy/ui"; import { ApiError, api } from "@/lib/api"; /** * Platform owner overview. * * Everything on this page is invisible to normal customers by design — the whole * point of the AI Control Plane is that model identity never reaches a tenant. */ export default function AdminOverviewPage() { const [readiness, setReadiness] = React.useState(null); const [organizations, setOrganizations] = React.useState([]); const [usage, setUsage] = React.useState([]); const [loading, setLoading] = React.useState(true); const [error, setError] = React.useState(null); const load = React.useCallback(async () => { setLoading(true); setError(null); try { const [nextReadiness, nextOrganizations, nextUsage] = await Promise.all([ api.readiness(), api.adminOrganizations(), api.adminUsage(), ]); setReadiness(nextReadiness); setOrganizations(nextOrganizations); setUsage(nextUsage); } catch (err) { setError(err instanceof ApiError ? err.message : "دریافت وضعیت ناموفق بود."); } finally { setLoading(false); } }, []); React.useEffect(() => { void load(); }, [load]); if (loading) return ; if (error) return ; const totalBilled = usage.reduce((sum, row) => sum + row.total_price, 0); return (

کنسول مالک سامانه

مدیریت ارائه‌دهنده‌ها، مدل‌ها، سیاست مسیریابی و تعرفه‌ها.

s + o.member_count, 0)} />
آداپتورهای فعال این مقادیر از محیط خوانده می‌شوند. هر مقدار «mock» یعنی آن سرویس بیرونی هنوز متصل نشده است.
{Object.entries(readiness?.checks.adapters ?? {}).map(([key, value]) => ( {key}: {value} ))}
{[ { title: "ارائه‌دهنده‌ها و کلیدها", hint: "ساخت ارائه‌دهنده و ذخیرهٔ کلید رمزنگاری‌شده. کلید خام هرگز نمایش داده نمی‌شود.", path: "/admin/providers", }, { title: "مدل‌ها", hint: "نام داخلی، توانایی‌ها و قیمت ورودی/خروجی — فقط برای مالک سامانه.", path: "/admin/models", }, { title: "سیاست مسیریابی", hint: "حالت‌های fast / cheap / balanced / reasoning / vision / coding و اجرای آزمایشی.", path: "/admin/routing", }, { title: "تعرفه‌ها", hint: "قیمت مشتری و برآورد هزینهٔ داخلی به تفکیک واحد مصرف.", path: "/admin/rate-cards", }, { title: "سازمان‌ها", hint: "فهرست همهٔ سازمان‌ها، تعداد اعضا و مصرف تجمیعی هرکدام.", path: "/admin/organizations", }, ].map((item) => ( {item.title} {item.hint} ))}
); }