import { useEffect, useMemo, useState } from 'react'; import type { BaseModelCatalogItem, CatalogProvider, IntegrationPlatform, PlatformModel, PricingRule, RateLimitWindow, } from '@easyai-ai-gateway/contracts'; import { getHealth, listBaseModels, listCatalogProviders, listModels, listPlatforms, listPricingRules, listRateLimitWindows, type HealthResponse, } from './api'; type LoadState = 'idle' | 'loading' | 'ready' | 'error'; export function App() { const [token, setToken] = useState(''); const [health, setHealth] = useState(null); const [platforms, setPlatforms] = useState([]); const [models, setModels] = useState([]); const [providers, setProviders] = useState([]); const [baseModels, setBaseModels] = useState([]); const [pricingRules, setPricingRules] = useState([]); const [rateLimitWindows, setRateLimitWindows] = useState([]); const [state, setState] = useState('idle'); const [error, setError] = useState(''); useEffect(() => { getHealth() .then(setHealth) .catch((err: Error) => setError(err.message)); }, []); const stats = useMemo(() => { const enabledPlatforms = platforms.filter((item) => item.status === 'enabled').length; const enabledModels = models.filter((item) => item.enabled).length; const activeProviders = providers.filter((item) => item.status === 'active').length; const activeRateWindows = rateLimitWindows.filter((item) => item.resetAt >= new Date().toISOString()).length; return [ { label: '平台', value: platforms.length, tone: 'blue' }, { label: '启用平台', value: enabledPlatforms, tone: 'green' }, { label: '基准模型', value: baseModels.length, tone: 'violet' }, { label: 'Provider', value: activeProviders || providers.length || enabledModels, tone: 'amber' }, { label: '定价规则', value: pricingRules.length, tone: 'cyan' }, { label: '限流窗口', value: activeRateWindows, tone: 'rose' }, ]; }, [baseModels.length, models, platforms, pricingRules.length, providers, rateLimitWindows]); async function refresh() { setState('loading'); setError(''); try { const [ platformResponse, modelResponse, providerResponse, baseModelResponse, pricingRuleResponse, rateLimitWindowResponse, ] = await Promise.all([ listPlatforms(token), listModels(token), listCatalogProviders(token), listBaseModels(token), listPricingRules(token), listRateLimitWindows(token), ]); setPlatforms(platformResponse.items); setModels(modelResponse.items); setProviders(providerResponse.items); setBaseModels(baseModelResponse.items); setPricingRules(pricingRuleResponse.items); setRateLimitWindows(rateLimitWindowResponse.items); setState('ready'); } catch (err) { setState('error'); setError(err instanceof Error ? err.message : '加载失败'); } } return (

EasyAI

AI Gateway Console

{health?.service ?? 'API 未连接'}
{error &&
{error}
}
{stats.map((item) => (
{item.label} {item.value}
))}

平台

{platforms.length}
Provider 名称 状态 优先级
{platforms.map((item) => (
{item.provider} {item.name} {item.status} {item.priority}
))} {!platforms.length &&

暂无平台数据

}

模型

{models.length}
模型 类型 平台 启用
{models.map((item) => (
{item.modelName} {item.modelType} {item.provider ?? item.platformName} {item.enabled ? '是' : '否'}
))} {!models.length &&

暂无模型数据

}

基准模型库

{baseModels.length}
Provider 模型 类型 版本
{baseModels.map((item) => (
{item.providerKey} {item.canonicalModelKey} {item.modelType} {item.pricingVersion}
))} {!baseModels.length &&

暂无基准模型

}

TPM/RPM 窗口

{rateLimitWindows.length}
Scope 指标 使用 预占
{rateLimitWindows.map((item) => (
{item.scopeKey} {item.metric} {item.usedValue}/{item.limitValue} {item.reservedValue}
))} {!rateLimitWindows.length &&

暂无限流窗口

}
); }