CPU
{{(sysCur.cpu_percent||0).toFixed(1)}}%
内存
{{(sysCur.mem_percent||0).toFixed(1)}}%
{{sysCur.mem_used_mb||0}} / {{sysCur.mem_total_mb||0}} MB
磁盘
{{(sysCur.disk_percent||0).toFixed(1)}}%
{{sysCur.disk_used_gb||0}} / {{sysCur.disk_total_gb||0}} GB
Goroutines
{{sysCur.goroutines||0}}
堆内存
{{sysCur.heap_mb||0}} MB
DB 连接
{{sysCur.db_conns||0}}
{{row.label}}{{sysHist.length?row.fmt(sysHist[sysHist.length-1][row.key]):'-'}}
暂无数据,采集器每 60 秒记录一次
当前运行:版本 {{ relBuild.version }}
· commit {{ relBuild.commit }}
· 构建于 {{ relBuild.built_at }}
· md5 {{ relCurrentMd5.slice(0,12) }}
| 版本 | 功能说明 | 构建时间 | commit | 部署时间 | 状态 | 操作 |
| {{ r.version }} {{ r.title }} |
{{ r.description || '-' }} |
{{ r.built_at || '-' }} |
{{ r.git_commit || '-' }} |
{{ (r.deployed_at||'').slice(0,19).replace('T',' ') }} |
运行中
补录
历史
|
|
| 暂无上线记录 |
| 时间 | 操作 | 对象 / 详情 | 来源 IP |
| {{ (l.timestamp||'').slice(0,19).replace('T',' ') }} |
{{ l.action }} |
{{ l.detail || '-' }} |
{{ l.ip }} |
| 暂无审计记录(新功能上线后产生的写操作才会落库) |
共 {{ auditTotal }} 条
第 {{ auditPage }} / {{ Math.max(1,Math.ceil(auditTotal/50)) }} 页
系统状态
{{ st.status==='running'?'运行中':'N/A' }}
账户总数
{{ st.total_creds || 0 }}
活跃账户
{{ (st.by_status||{}).active || 0 }}
冷却/离线
{{ (st.by_status||{}).cooling || 0 }}
已暂停
{{ (st.by_status||{}).disabled || 0 }}
已作废
{{ (st.by_status||{}).deprecated || 0 }}
{{ groupLabel(gname) }}
{{ info.total||0 }}个 {{ info.active||0 }}活跃
总请求数
{{ (st.request_stats||{}).total_all_time || 0 }}
平均延迟
{{ (st.request_stats||{}).avg_latency_ms || 0 }}ms
成功
{{ (st.request_stats||{}).success_count || 0 }}
失败
{{ (st.request_stats||{}).error_count || 0 }}
账户额度概览
{{ q.provider }}
{{ q.totalAccounts }}个账户 | {{ q.usedReqs }}/{{ q.quotaLabel }}
暂无账户,请到"账户管理"添加 API Key / Token / Cookie 后查看额度
{{ dashRangeLabel }}统计
{{ dashRangeLabel }}请求数
{{ (st.recent_24h||{}).total_requests || 0 }}
{{ dashRangeLabel }}成功
{{ (st.recent_24h||{}).success || 0 }}
{{ dashRangeLabel }}失败
{{ (st.recent_24h||{}).errors || 0 }}
{{ dashRangeLabel }}平均延迟
{{ (st.recent_24h||{}).avg_latency_ms || 0 }}ms
{{ dashRangeLabel }}输入 Token
{{ fmtNum((st.recent_24h||{}).prompt_tokens) }}
{{ dashRangeLabel }}输出 Token
{{ fmtNum((st.recent_24h||{}).completion_tokens) }}
{{ dashRangeLabel }}总 Token
{{ fmtNum((st.recent_24h||{}).total_tokens) }}
{{ dashRangeLabel }}费用(美元)
${{ fmtUSD((st.recent_24h||{}).cost_usd) }}
请求趋势({{ dashRangeLabel }})
成功
失败
{{ (chartData.hourly[0]||{}).hour||'' }}
→
{{ (chartData.hourly[chartData.hourly.length-1]||{}).hour||'' }}
暂无请求数据。有 API 请求后此处会显示趋势图。
供应商用量({{ dashRangeLabel }})
{{ ps.provider }}
{{ ps.total }}次 ({{ ps.avg_ms }}ms)
暂无用量数据。有请求后自动统计各供应商使用情况。
模型用量 Top 15({{ dashRangeLabel }})
按请求数排名
{{ i+1 }}
{{ ms.model }}
{{ ms.total }}次 · {{ fmtNum(ms.total_tokens) }}tok · ${{ fmtUSD(ms.cost_usd) }}
暂无模型用量数据。有请求后自动按模型统计排名。
Token 消耗({{ dashRangeLabel }})
按供应商拆分输入 / 输出 Token,含费用
供应商
输入(蓝) / 输出(紫)
Token 数 · 费用
{{ ps.provider }}
{{ fmtNum(ps.prompt_tokens) }} /
{{ fmtNum(ps.completion_tokens) }} =
{{ fmtNum(ps.total_tokens) }}
${{ fmtUSD(ps.cost_usd) }}
合计 输入 {{ fmtNum(tokenTotals.prompt) }}
输出 {{ fmtNum(tokenTotals.completion) }}
总计 {{ fmtNum(tokenTotals.total) }}
费用 ${{ fmtUSD(tokenTotals.cost) }}
暂无 Token 数据。有计费请求后自动统计。
Top 20 账户用量({{ dashRangeLabel }})
按请求量排名 · 含 Token 与费用
#账户请求Token费用
{{ i+1 }}
{{ a.name }}{{ a.api_key_hint||'(未命名)' }}
···{{ a.api_key_suffix }}
{{ a.total }} ({{ a.errors }}err)
{{ fmtNum(a.total_tokens) }}
${{ fmtUSD(a.cost_usd) }}
暂无账户用量数据。有请求后自动按账户统计排名。
Top 20 供应商账号用量({{ dashRangeLabel }})
上游凭据 · 按请求量排名 · 含 Token 与费用
#供应商账号请求Token费用
{{ i+1 }}
{{ cr.credential_name||('#'+cr.credential_id) }}
· {{ cr.provider }}
{{ cr.total }} ({{ cr.errors }}err)
{{ fmtNum(cr.total_tokens) }}
${{ fmtUSD(cr.cost_usd) }}
暂无供应商账号用量数据。
巡检状态
间隔: {{ st.patrol.interval_min || 30 }}分钟 | 上次: {{ fmtTime(st.patrol.last_run) }}
{{ r.provider }}
{{ r.cred_name }}
已恢复
仍离线
{{ r.error }}
{{ r.latency_ms }}ms
{{ st.patrol&&st.patrol.running?'巡检运行中,暂无结果':'暂无巡检记录' }}
供应商概览
{{ p.credential_count }}
账户
{{ p.active_cred_count }}
活跃
{{ m }}
+{{ p.models.length-5 }}
{{ p.credential_count }}
账户
{{ p.active_cred_count }}
活跃
{{ m }}
+{{ p.models.length-10 }} 展开
收起
{{ p._testResult.status==='ok'?'连接成功 ('+p._testResult.latency_ms+'ms, '+p._testResult.model_count+'个模型)':p._testResult.error||p._testResult.message||'无可用账户' }}
加载中...
{{ usageModal.data.total_requests }}
总请求
{{ usageModal.data.success }}
成功
{{ usageModal.data.errors }}
失败
{{ usageModal.data.avg_latency_ms }}ms
平均延迟
{{ fmtTokens(usageModal.data.prompt_tokens) }}
输入 Tokens
{{ fmtTokens(usageModal.data.completion_tokens) }}
输出 Tokens
{{ fmtTokens(usageModal.data.total_tokens) }}
总 Tokens
按模型分布
| 模型 | 请求 | 输入 Tokens | 输出 Tokens | 总 Tokens |
| {{ m.model }} | {{ m.requests }} | {{ fmtTokens(m.prompt_tokens) }} | {{ fmtTokens(m.completion_tokens) }} | {{ fmtTokens(m.total_tokens) }} |
时段趋势
{{ (usageModal.data.hourly[0]||{}).hour }}{{ (usageModal.data.hourly[usageModal.data.hourly.length-1]||{}).hour }}
| ID | 别名 | 目标模型 | 目标供应商 | 状态 | 操作 |
| {{ a.id }} |
{{ a.alias }} |
{{ a.target_model }} |
{{ a.target_provider || '自动' }} |
{{ a.enabled?'启用':'停用' }} |
|
| 暂无别名。创建别名可将自定义模型名映射到真实模型。 |
| ID | 模型 | 原因 | 操作 |
| {{ b.id }} |
{{ b.model }} |
{{ b.reason || '-' }} |
|
| 黑名单为空。添加模型名称可将其从模型列表中屏蔽。 |
ℹ️ 上游调试走 /admin/playground,无需 API Key,直接测试上游模型。
模型列表
聊天补全
图片生成
视频生成
语音合成
健康检查
{{ testLatency }}ms
响应
{{ testResult || '点击按钮获取模型列表...' }}
请求(走 admin/playground,直接测上游模型)
{{ testLatency }}ms
响应
{{ testResult || '响应内容将在此处显示...' }}
{{ testLatency }}ms
响应
{{ testResult || '响应内容将在此处显示...' }}
{{ testLatency }}ms
响应
{{ testResult || '响应内容将在此处显示...' }}
{{ testLatency }}ms
响应
{{ testResult || '响应内容将在此处显示...' }}
{{ testLatency }}ms
响应
{{ testResult || '点击检查按钮...' }}
ℹ️ 外部接口调试走真实的 /v1/ 端点,需要 API Key 认证,完全模拟外部调用方的体验。
模型列表
聊天补全
图片生成
视频生成
语音合成
健康检查
请先选择 API Key
加载中...
HTTP {{ extStatus }} {{ extLatency }}ms
{{ extResult || '选择 API Key 后自动加载模型列表...' }}
HTTP {{ extStatus }}
{{ extLatency }}ms
响应
{{ extResult || '响应内容将在此处显示...' }}
{{ extCurl }}
HTTP {{ extStatus }}
{{ extLatency }}ms
原始响应
{{ extResult || '响应内容将在此处显示...' }}
HTTP {{ extStatus }}
{{ extLatency }}ms
原始响应
{{ extResult || '响应内容将在此处显示...' }}
HTTP {{ extStatus }}
{{ extLatency }}ms
响应
{{ extResult || '响应内容将在此处显示...' }}
HTTP {{ extStatus }}
{{ extLatency }}ms
响应
{{ extResult || '点击检查按钮...' }}
共 {{ logTotal }} 条
| 时间 | 分组 | Key | 供应商 | 账户 | 模型 | 路径 | 状态码 | 延迟 | 类型 | 客户端IP | 请求参数 | 响应结果 | 详情 |
| {{ fmtTime(l.timestamp) }} |
{{ l.group }}- |
{{ l.api_key_suffix?('****'+l.api_key_suffix):'-' }} |
{{ l.provider }} |
#{{ l.credential_id }}
{{ l.credential_name }}
-
|
{{ l.model }} |
{{ l.request_path||'-' }} |
{{ l.status_code }} |
{{ l.latency_ms }}ms |
{{ l.stream?'流式':'普通' }} |
{{ l.client_ip }} |
{{ l.request_params||'-' }}
|
{{ l.response_body||'-' }}
|
|
| 暂无日志 |
{{ quotaData.summary.total }}
总账户数
{{ quotaData.summary.unlimited }}
无限制
{{ quotaData.summary.low_quota }}
配额不足
{{ quotaData.summary.exhausted }}
已耗尽
| ID{{quotaSortDir==='asc'?' ▲':' ▼'}} |
供应商{{quotaSortDir==='asc'?' ▲':' ▼'}} |
名称{{quotaSortDir==='asc'?' ▲':' ▼'}} |
分组{{quotaSortDir==='asc'?' ▲':' ▼'}} |
状态{{quotaSortDir==='asc'?' ▲':' ▼'}} |
配额{{quotaSortDir==='asc'?' ▲':' ▼'}} |
已用{{quotaSortDir==='asc'?' ▲':' ▼'}} |
使用率{{quotaSortDir==='asc'?' ▲':' ▼'}} |
最后使用{{quotaSortDir==='asc'?' ▲':' ▼'}} |
操作 |
| {{ q.id }} |
{{ q.display_provider }} |
{{ q.name }} |
{{ q.group }} |
{{ q.status }} ({{ q.offline_reason }}) |
∞ 无限
0 (已耗尽)
{{ q.quota }}
|
{{ q.request_count.toLocaleString() }} |
{{ q.quota_percent.toFixed(0) }}%
-
|
{{ q.last_used_at ? new Date(q.last_used_at).toLocaleString('zh-CN',{month:'2-digit',day:'2-digit',hour:'2-digit',minute:'2-digit'}) : '-' }} |
|
| 暂无数据 |
共 {{ allFilteredQuota.length }} 条,第 {{ quotaPage }}/{{ quotaTotalPages }} 页
{{ quotaPage }} / {{ quotaTotalPages }}
🔐
暂无 API Key
当前 /v1/ 接口开放访问。创建 API Key 后将自动启用鉴权。
| ID | 名称 | 分组 | Key | 状态 | 请求数 | 速率限制 | 过期时间 | 最后使用 | 创建时间 | 操作 |
| {{ k.id }} |
{{ k.name }} |
{{ groupLabel(k.group) }} |
{{ k.key }} |
{{ k.status==='active'?'启用':'禁用' }} |
{{ k.request_count }} |
{{ k.rate_limit===0?'无限制':k.rate_limit+'/分钟' }} |
{{ k.expires_at&&k.expires_at!=='0001-01-01T00:00:00Z'?fmtTime(k.expires_at):'永不' }} |
{{ fmtTime(k.last_used_at) }} |
{{ fmtTime(k.created_at) }} |
|
使用方式:在调用 /v1/ 接口时,通过以下任一方式传入 API Key:
• Header: Authorization: Bearer rp-xxx...
• Header: X-API-Key: rp-xxx...
• Query: ?key=rp-xxx...
Base URL
{{ apiBaseURL }}
认证方式
所有 API 请求需要携带 API Key(如已配置):
Authorization: Bearer rp-your-api-key
也支持 X-API-Key Header 或 ?key= Query 参数。
当前未配置 API Key,接口开放访问。
GET /v1/models
获取所有可用模型列表。
curl {{ apiBaseURL }}/v1/models \
-H "Authorization: Bearer YOUR_API_KEY"
响应示例
{
"object": "list",
"data": [
{"id": "gpt-4o", "object": "model", "owned_by": "openai"},
{"id": "claude-sonnet-4-20250514", "object": "model", "owned_by": "claude"},
{"id": "my-alias", "object": "model", "owned_by": "alias:openai"}
]
}
POST /v1/chat/completions
发送聊天补全请求。完全兼容 OpenAI Chat Completions API 格式。
curl {{ apiBaseURL }}/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY" \
-d '{
"model": "gpt-4o",
"messages": [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Hello!"}
],
"max_tokens": 1000,
"stream": false
}'
请求参数
| 参数 | 类型 | 必填 | 说明 |
| model | string | 是 | 模型名称(支持别名映射) |
| messages | array | 是 | 消息列表,每条包含 role 和 content |
| max_tokens | integer | 否 | 最大生成 token 数 |
| stream | boolean | 否 | 是否使用 SSE 流式输出 |
| temperature | number | 否 | 采样温度 (0-2) |
响应示例
{
"id": "chatcmpl-xxx",
"object": "chat.completion",
"choices": [{
"index": 0,
"message": {"role": "assistant", "content": "Hello! How can I help you?"},
"finish_reason": "stop"
}],
"usage": {"prompt_tokens": 20, "completion_tokens": 10, "total_tokens": 30}
}
支持的供应商和模型
{{ p.name }}
{{ (p.models||[]).slice(0,5).join(', ') }}{{ (p.models||[]).length>5?' ...(+'+(p.models.length-5)+')':'' }}
集成示例
Python (openai SDK)
from openai import OpenAI
client = OpenAI(
base_url="{{ apiBaseURL }}/v1",
api_key="rp-your-api-key"
)
resp = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "Hello!"}]
)
print(resp.choices[0].message.content)
Node.js (openai SDK)
import OpenAI from 'openai';
const client = new OpenAI({
baseURL: '{{ apiBaseURL }}/v1',
apiKey: 'rp-your-api-key'
});
const resp = await client.chat.completions.create({
model: 'gpt-4o',
messages: [{ role: 'user', content: 'Hello!' }]
});
console.log(resp.choices[0].message.content);
错误码
| HTTP 状态码 | 类型 | 说明 |
| 401 | authentication_error | API Key 缺失或无效 |
| 400 | invalid_request | 请求参数错误(如缺少 model) |
| 502 | proxy_error | 上游供应商请求失败 |
| ID | 标识 (slug) | 显示名称 | 描述 | 关联账户数 | 创建时间 | 操作 |
| {{ g.id }} |
{{ g.name }} |
{{ g.label }} |
{{ g.description || '-' }} |
{{ g.cred_count }} |
{{ g.created_at }} |
|
| 暂无分组 |
请求路由 (Conductor)