import { useState } from "react"; import { Check, Copy, KeyRound, AlertTriangle } from "lucide-react"; import { api, type AccountInfo, type KeyResponse } from "../api"; function KeyReveal({ data }: { data: KeyResponse }) { const [copied, setCopied] = useState(false); return (
请立即复制保存此密钥,它只显示这一次,无法再次查看。
{data.api_key}
配额:每分钟 {data.rate_limit_per_min} 次 · 累计{" "} {data.quota_total.toLocaleString()}
调用时通过请求头携带: X-API-Key: {data.api_key.slice(0, 12)}…
); } export default function Account() { const [mode, setMode] = useState<"register" | "manage">("register"); const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [issued, setIssued] = useState(null); const [info, setInfo] = useState(null); const reset = () => { setError(null); setIssued(null); setInfo(null); }; async function submit(e: React.FormEvent) { e.preventDefault(); reset(); if (password.length < 8) { setError("密码至少需要 8 位"); return; } setLoading(true); try { if (mode === "register") { setIssued(await api.register(email, password)); } else { setInfo(await api.account(email, password)); } } catch (err) { setError(err instanceof Error ? err.message : "操作失败"); } finally { setLoading(false); } } async function regenerate() { reset(); setLoading(true); try { setIssued(await api.regenerate(email, password)); } catch (err) { setError(err instanceof Error ? err.message : "操作失败"); } finally { setLoading(false); } } return (

API 密钥

匿名调用免费,但每个来源 IP 累计共 1000 次。注册一个账号即可自助领取专属 API 密钥,获得更高的每分钟频率与累计调用配额。

setEmail(e.target.value)} placeholder="you@example.com" className="w-full border rounded-md px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-brand-500" />
setPassword(e.target.value)} placeholder="••••••••" className="w-full border rounded-md px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-brand-500" />
{error &&
{error}
}
{issued && } {info && (
邮箱:{info.email}
密钥前缀:{info.key_prefix}…
每分钟频率:{info.rate_limit_per_min}
累计配额:已用 {info.quota_used.toLocaleString()} /{" "} {info.quota_total.toLocaleString()} 次(剩余{" "} {info.quota_remaining.toLocaleString()}
)}
); }