| <!doctype html> |
| <html lang="zh-CN"> |
| <head> |
| <meta charset="utf-8" /> |
| <meta name="viewport" content="width=device-width, initial-scale=1" /> |
| <link rel="icon" type="image/x-icon" href="/web/favicon.ico"> |
| <link rel="apple-touch-icon" href="/web/apple-touch-icon.png"> |
| <link rel="manifest" href="/web/manifest.json"> |
| <meta name="theme-color" content="#3b82f6"> |
| <title data-i18n="index.title">Claude Code & Codex Proxy 代理服务</title> |
| <link rel="stylesheet" href="/web/assets/css/styles.css?v=__VERSION__"> |
| <script> |
| window.__prefetch_summary = fetch('/public/summary?range=today') |
| .then(r => r.json()) |
| .catch(() => null); |
| </script> |
| <script defer src="/web/assets/locales/zh-CN.js?v=__VERSION__"></script> |
| <script defer src="/web/assets/locales/en.js?v=__VERSION__"></script> |
| <script defer src="/web/assets/js/i18n.js?v=__VERSION__"></script> |
| <script defer src="/web/assets/js/date-range-selector.js?v=__VERSION__"></script> |
| <script defer src="/web/assets/js/ui.js?v=__VERSION__"></script> |
| <script defer src="/web/assets/js/index.js?v=__VERSION__"></script> |
| </head> |
| <body class="page-index"> |
| <div class="app-container"> |
|
|
| |
| <main class="main-content index-main-content"> |
| <div class="content-area"> |
| |
| <header class="mb-6"> |
| <div class="hero-header animate-slide-up"> |
| <div class="hero-icon"> |
| <svg width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"> |
| <path d="M13 2L3 14h9l-1 8 10-12h-9l1-8z"/> |
| </svg> |
| </div> |
| <div> |
| <h1 class="hero-title" data-i18n="index.heroTitle"> |
| Claude Code & Codex API 代理服务 |
| </h1> |
| <p class="hero-subtitle" data-i18n="index.heroSubtitle"> |
| 智能路由 · 故障切换 · 统计分析 |
| </p> |
| </div> |
| </div> |
| </header> |
|
|
| |
| <section class="mb-4"> |
| <div class="time-range-container"> |
| <div id="index-time-range" class="time-range-selector"></div> |
| </div> |
| </section> |
|
|
| |
| <section class="mb-6"> |
| <div class="grid grid-cols-2 animate-slide-up animate-delay-1 gap-space-3"> |
| |
| <div class="channel-card" id="type-anthropic-card"> |
| <div class="channel-card-header"> |
| <div class="channel-card-title"> |
| <div class="channel-icon channel-icon--anthropic"> |
| <svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"> |
| <path d="M12 2L2 22h20L12 2zm0 4.5L18.5 20h-13L12 6.5z"/> |
| </svg> |
| </div> |
| <span>Claude Code</span> |
| </div> |
| <div class="channel-cost"> |
| <span class="cost-label" data-i18n="common.cost">成本</span> |
| <span class="cost-value" id="type-anthropic-cost">$0.00</span> |
| </div> |
| </div> |
| |
| <div class="channel-metrics"> |
| <div class="metric-item"> |
| <div class="metric-value metric-total" id="type-anthropic-requests">0</div> |
| <div class="metric-label" data-i18n="index.metrics.totalRequests">总请求</div> |
| </div> |
| <div class="metric-item"> |
| <div class="metric-value metric-success" id="type-anthropic-success">0</div> |
| <div class="metric-label" data-i18n="index.metrics.success">成功</div> |
| </div> |
| <div class="metric-item"> |
| <div class="metric-value metric-error" id="type-anthropic-error">0</div> |
| <div class="metric-label" data-i18n="index.metrics.failed">失败</div> |
| </div> |
| <div class="metric-item"> |
| <div class="metric-value metric-rate" id="type-anthropic-rate">0.0%</div> |
| <div class="metric-label" data-i18n="index.metrics.successRate">成功率</div> |
| </div> |
| </div> |
| |
| <div class="token-stats"> |
| <div class="token-item"> |
| <span class="token-label" data-i18n="common.input">输入</span> |
| <span class="token-value" id="type-anthropic-input">0</span> |
| </div> |
| <div class="token-item"> |
| <span class="token-label" data-i18n="common.output">输出</span> |
| <span class="token-value" id="type-anthropic-output">0</span> |
| </div> |
| <div class="token-item"> |
| <span class="token-label" data-i18n="common.cacheRead">缓存读</span> |
| <span class="token-value token-cache" id="type-anthropic-cache-read">0</span> |
| </div> |
| <div class="token-item"> |
| <span class="token-label" data-i18n="common.cacheCreate">缓存创</span> |
| <span class="token-value token-cache" id="type-anthropic-cache-create">0</span> |
| </div> |
| </div> |
| </div> |
|
|
| |
| <div class="channel-card" id="type-codex-card"> |
| <div class="channel-card-header"> |
| <div class="channel-card-title"> |
| <div class="channel-icon channel-icon--codex"> |
| <svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"> |
| <path d="M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z"/> |
| </svg> |
| </div> |
| <span>Codex</span> |
| </div> |
| <div class="channel-cost"> |
| <span class="cost-label" data-i18n="common.cost">成本</span> |
| <span class="cost-value" id="type-codex-cost">$0.00</span> |
| </div> |
| </div> |
| |
| <div class="channel-metrics"> |
| <div class="metric-item"> |
| <div class="metric-value metric-total" id="type-codex-requests">0</div> |
| <div class="metric-label" data-i18n="index.metrics.totalRequests">总请求</div> |
| </div> |
| <div class="metric-item"> |
| <div class="metric-value metric-success" id="type-codex-success">0</div> |
| <div class="metric-label" data-i18n="index.metrics.success">成功</div> |
| </div> |
| <div class="metric-item"> |
| <div class="metric-value metric-error" id="type-codex-error">0</div> |
| <div class="metric-label" data-i18n="index.metrics.failed">失败</div> |
| </div> |
| <div class="metric-item"> |
| <div class="metric-value metric-rate" id="type-codex-rate">0.0%</div> |
| <div class="metric-label" data-i18n="index.metrics.successRate">成功率</div> |
| </div> |
| </div> |
| |
| <div class="token-stats"> |
| <div class="token-item"> |
| <span class="token-label" data-i18n="common.input">输入</span> |
| <span class="token-value" id="type-codex-input">0</span> |
| </div> |
| <div class="token-item"> |
| <span class="token-label" data-i18n="common.output">输出</span> |
| <span class="token-value" id="type-codex-output">0</span> |
| </div> |
| <div class="token-item"> |
| <span class="token-label" data-i18n="common.cacheRead">缓存读</span> |
| <span class="token-value token-cache" id="type-codex-cache-read">0</span> |
| </div> |
| <div class="token-item"> |
| <span class="token-label" data-i18n="common.cacheCreate">缓存创</span> |
| <span class="token-value token-cache" id="type-codex-cache-create">0</span> |
| </div> |
| </div> |
| </div> |
|
|
| |
| <div class="channel-card" id="type-openai-card"> |
| <div class="channel-card-header"> |
| <div class="channel-card-title"> |
| <div class="channel-icon channel-icon--openai"> |
| <svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"> |
| <path d="M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z"/> |
| </svg> |
| </div> |
| <span>OpenAI</span> |
| </div> |
| <div class="channel-cost"> |
| <span class="cost-label" data-i18n="common.cost">成本</span> |
| <span class="cost-value" id="type-openai-cost">$0.00</span> |
| </div> |
| </div> |
| |
| <div class="channel-metrics"> |
| <div class="metric-item"> |
| <div class="metric-value metric-total" id="type-openai-requests">0</div> |
| <div class="metric-label" data-i18n="index.metrics.totalRequests">总请求</div> |
| </div> |
| <div class="metric-item"> |
| <div class="metric-value metric-success" id="type-openai-success">0</div> |
| <div class="metric-label" data-i18n="index.metrics.success">成功</div> |
| </div> |
| <div class="metric-item"> |
| <div class="metric-value metric-error" id="type-openai-error">0</div> |
| <div class="metric-label" data-i18n="index.metrics.failed">失败</div> |
| </div> |
| <div class="metric-item"> |
| <div class="metric-value metric-rate" id="type-openai-rate">0.0%</div> |
| <div class="metric-label" data-i18n="index.metrics.successRate">成功率</div> |
| </div> |
| </div> |
| |
| <div class="token-stats"> |
| <div class="token-item"> |
| <span class="token-label" data-i18n="common.input">输入</span> |
| <span class="token-value" id="type-openai-input">0</span> |
| </div> |
| <div class="token-item"> |
| <span class="token-label" data-i18n="common.output">输出</span> |
| <span class="token-value" id="type-openai-output">0</span> |
| </div> |
| <div class="token-item"> |
| <span class="token-label" data-i18n="common.cacheRead">缓存读</span> |
| <span class="token-value token-cache" id="type-openai-cache-read">0</span> |
| </div> |
| </div> |
| </div> |
|
|
| |
| <div class="channel-card" id="type-gemini-card"> |
| <div class="channel-card-header"> |
| <div class="channel-card-title"> |
| <div class="channel-icon channel-icon--gemini"> |
| <svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"> |
| <path d="M12 2L2 7v10l10 5 10-5V7L12 2zm0 2.18L19.82 8 12 11.82 4.18 8 12 4.18zM4 9.48l7 3.5v7.84l-7-3.5V9.48zm16 0v7.84l-7 3.5v-7.84l7-3.5z"/> |
| </svg> |
| </div> |
| <span>Google Gemini</span> |
| </div> |
| <div class="channel-cost"> |
| <span class="cost-label" data-i18n="common.cost">成本</span> |
| <span class="cost-value" id="type-gemini-cost">$0.00</span> |
| </div> |
| </div> |
| |
| <div class="channel-metrics"> |
| <div class="metric-item"> |
| <div class="metric-value metric-total" id="type-gemini-requests">0</div> |
| <div class="metric-label" data-i18n="index.metrics.totalRequests">总请求</div> |
| </div> |
| <div class="metric-item"> |
| <div class="metric-value metric-success" id="type-gemini-success">0</div> |
| <div class="metric-label" data-i18n="index.metrics.success">成功</div> |
| </div> |
| <div class="metric-item"> |
| <div class="metric-value metric-error" id="type-gemini-error">0</div> |
| <div class="metric-label" data-i18n="index.metrics.failed">失败</div> |
| </div> |
| <div class="metric-item"> |
| <div class="metric-value metric-rate" id="type-gemini-rate">0.0%</div> |
| <div class="metric-label" data-i18n="index.metrics.successRate">成功率</div> |
| </div> |
| </div> |
| |
| <div class="token-stats"> |
| <div class="token-item"> |
| <span class="token-label" data-i18n="common.input">输入</span> |
| <span class="token-value" id="type-gemini-input">0</span> |
| </div> |
| <div class="token-item"> |
| <span class="token-label" data-i18n="common.output">输出</span> |
| <span class="token-value" id="type-gemini-output">0</span> |
| </div> |
| <div class="token-item"> |
| <span class="token-label" data-i18n="common.cacheRead">缓存读</span> |
| <span class="token-value token-cache" id="type-gemini-cache-read">0</span> |
| </div> |
| </div> |
| </div> |
| </div> |
| </section> |
| |
| <section class="mb-6"> |
| <div class="flex index-summary-grid animate-slide-up animate-delay-2 gap-space-3 flex-nowrap"> |
| <div class="summary-card summary-card-success"> |
| <div class="summary-icon"> |
| <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"> |
| <path d="M20 6L9 17l-5-5"/> |
| </svg> |
| </div> |
| <div class="summary-content"> |
| <div class="summary-value"><span class="metric-success" id="success-requests">--</span>/<span class="metric-error" id="error-requests">--</span> <span class="summary-value-note">(<span id="success-rate">--</span>)</span></div> |
| <div class="summary-label" data-i18n="index.metrics.successFailed">成功/失败 (成功率)</div> |
| </div> |
| </div> |
| <div class="summary-card summary-card-primary" title="每分钟请求数"> |
| <div class="summary-icon"> |
| <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"> |
| <circle cx="12" cy="12" r="10"/> |
| <path d="M12 6v6l4 2"/> |
| </svg> |
| </div> |
| <div class="summary-content"> |
| <div class="summary-value" id="total-rpm">--</div> |
| <div class="summary-label" data-i18n="index.metrics.rpm">RPM(峰值 平均 最近)</div> |
| </div> |
| </div> |
| </div> |
| </section> |
|
|
| |
| <section class="mb-8"> |
| <div class="glass-card animate-slide-up animate-delay-3"> |
| <h3 class="text-xl font-semibold mb-6"> |
| <svg class="inline-block w-5 h-5 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24"> |
| <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 9l3 3-3 3m5 0h3M5 20h14a2 2 0 002-2V6a2 2 0 00-2-2H5a2 2 0 00-2-2v16z"/> |
| </svg> |
| <span data-i18n="index.apiSection">API 接口</span> |
| </h3> |
| <div class="index-api-list"> |
| <div class="index-api-entry"> |
| <div class="index-api-method index-api-method--post">POST</div> |
| <div class="index-api-path">/v1/messages</div> |
| <div class="index-api-desc" data-i18n="index.apiClaudeDesc">Claude API 透明代理</div> |
| </div> |
| <div class="index-api-entry"> |
| <div class="index-api-method index-api-method--post">POST</div> |
| <div class="index-api-path">/v1/responses</div> |
| <div class="index-api-desc" data-i18n="index.apiCodexDesc">Codex API 透明代理</div> |
| </div> |
| <div class="index-api-entry"> |
| <div class="index-api-method index-api-method--post">POST</div> |
| <div class="index-api-path">/v1beta</div> |
| <div class="index-api-desc" data-i18n="index.apiGeminiDesc">Gemini 透明代理</div> |
| </div> |
| <div class="index-api-entry"> |
| <div class="index-api-method index-api-method--get">GET</div> |
| <div class="index-api-path">/public/summary</div> |
| <div class="index-api-desc" data-i18n="index.apiSummaryDesc">公开统计数据</div> |
| </div> |
| </div> |
| <div class="index-api-tip"> |
| <div class="index-api-tip-title" data-i18n="common.info">提示</div> |
| <div class="index-api-tip-body" data-i18n="index.apiTip"> |
| 管理功能需要登录访问,代理服务公开使用 |
| </div> |
| </div> |
| </div> |
| </section> |
|
|
| </div> |
| </main> |
| </div> |
|
|
| </body> |
| </html> |
|
|