Spaces:
Running
Running
| import { useState, useEffect } from 'react'; | |
| import { Book, Globe, MessageSquare, Shield, Zap, Lightbulb, Code2 } from 'lucide-react'; | |
| import CodeBlock from '../components/CodeBlock'; | |
| import { cn } from '../lib/utils'; | |
| export default function Docs() { | |
| // 动态获取基础 URL | |
| const [baseUrl, setBaseUrl] = useState(''); | |
| useEffect(() => { | |
| // 获取当前访问的协议、域名/IP 和端口 | |
| const protocol = window.location.protocol; // http: 或 https: | |
| const host = window.location.host; // 包含域名/IP 和端口 | |
| setBaseUrl(`${protocol}//${host}`); | |
| }, []); | |
| return ( | |
| <div className="space-y-8 max-w-4xl mx-auto pb-12"> | |
| <div> | |
| <h2 className="text-2xl font-semibold text-zinc-900 mb-2 tracking-tight">API 文档</h2> | |
| <p className="text-zinc-500">Antigravity API 提供与 OpenAI 兼容的接口,可无缝对接现有应用。</p> | |
| </div> | |
| {/* Base URL */} | |
| <div className="bg-white rounded-xl border border-zinc-200 p-6 shadow-sm"> | |
| <h3 className="font-semibold text-zinc-900 mb-4 flex items-center gap-2 text-base"> | |
| <Globe className="w-5 h-5 text-zinc-900" /> | |
| 基础 URL | |
| </h3> | |
| <CodeBlock code={baseUrl || 'Loading...'} /> | |
| </div> | |
| {/* Endpoints */} | |
| <div className="space-y-6"> | |
| <EndpointCard | |
| method="GET" | |
| path="/v1/models" | |
| title="获取模型列表" | |
| desc="获取所有可用的 AI 模型列表。" | |
| req={`curl ${baseUrl}/v1/models \\ | |
| -H "Authorization: Bearer YOUR_API_KEY"`} | |
| res={`{ | |
| "object": "list", | |
| "data": [ | |
| { | |
| "id": "gemini-2.0-flash-exp", | |
| "object": "model", | |
| "created": 1234567890, | |
| "owned_by": "google" | |
| } | |
| ] | |
| }`} | |
| /> | |
| <EndpointCard | |
| method="POST" | |
| path="/v1/chat/completions" | |
| title="聊天补全" | |
| desc="创建聊天对话补全,支持流式和非流式响应。" | |
| req={`curl ${baseUrl}/v1/chat/completions \\ | |
| -H "Content-Type: application/json" \\ | |
| -H "Authorization: Bearer YOUR_API_KEY" \\ | |
| -d '{ | |
| "model": "gemini-2.0-flash-exp", | |
| "messages": [ | |
| {"role": "user", "content": "你好"} | |
| ], | |
| "stream": true | |
| }'`} | |
| res={`data: {"id":"chatcmpl-xxx","object":"chat.completion.chunk",...} | |
| data: [DONE]`} | |
| /> | |
| </div> | |
| {/* Auth Info */} | |
| <div className="grid md:grid-cols-2 gap-6"> | |
| <div className="bg-white rounded-xl border border-zinc-200 p-6 shadow-sm"> | |
| <h3 className="font-semibold text-zinc-900 mb-4 flex items-center gap-2 text-base"> | |
| <Shield className="w-5 h-5 text-zinc-900" /> | |
| 认证方式 | |
| </h3> | |
| <p className="text-zinc-600 text-sm mb-4 leading-relaxed"> | |
| 所有 API 请求都需要在请求头中包含有效的 API 密钥: | |
| </p> | |
| <CodeBlock code="Authorization: Bearer YOUR_API_KEY" /> | |
| </div> | |
| <div className="bg-white rounded-xl border border-zinc-200 p-6 shadow-sm"> | |
| <h3 className="font-semibold text-zinc-900 mb-4 flex items-center gap-2 text-base"> | |
| <Zap className="w-5 h-5 text-zinc-900" /> | |
| 频率限制 | |
| </h3> | |
| <p className="text-zinc-600 text-sm mb-4 leading-relaxed"> | |
| 当请求超过频率限制时,API 会返回 429 状态码。响应头包含限制详情: | |
| </p> | |
| <ul className="text-sm text-zinc-500 space-y-2 list-disc list-inside marker:text-zinc-300"> | |
| <li><code className="bg-zinc-100 px-1.5 py-0.5 rounded text-zinc-700 border border-zinc-200">X-RateLimit-Limit</code>: 最大请求数</li> | |
| <li><code className="bg-zinc-100 px-1.5 py-0.5 rounded text-zinc-700 border border-zinc-200">X-RateLimit-Remaining</code>: 剩余请求数</li> | |
| <li><code className="bg-zinc-100 px-1.5 py-0.5 rounded text-zinc-700 border border-zinc-200">X-RateLimit-Reset</code>: 重置等待秒数</li> | |
| </ul> | |
| </div> | |
| </div> | |
| </div> | |
| ); | |
| } | |
| function EndpointCard({ method, path, title, desc, req, res }) { | |
| return ( | |
| <div className="bg-white rounded-xl border border-zinc-200 overflow-hidden shadow-sm"> | |
| <div className="p-6 border-b border-zinc-100"> | |
| <div className="flex items-center gap-3 mb-3"> | |
| <span className={cn( | |
| "px-2.5 py-1 rounded-md text-xs font-bold tracking-wide", | |
| method === 'GET' ? "bg-blue-50 text-blue-700 border border-blue-100" : "bg-emerald-50 text-emerald-700 border border-emerald-100" | |
| )}> | |
| {method} | |
| </span> | |
| <code className="text-zinc-700 font-mono font-semibold text-sm bg-zinc-50 px-2 py-1 rounded border border-zinc-200/50">{path}</code> | |
| </div> | |
| <h3 className="text-lg font-semibold text-zinc-900 mb-2">{title}</h3> | |
| <p className="text-zinc-500 text-sm leading-relaxed">{desc}</p> | |
| </div> | |
| <div className="bg-zinc-50/50 p-6 space-y-6"> | |
| <div> | |
| <div className="text-xs font-bold text-zinc-400 uppercase tracking-wider mb-3 flex items-center gap-2"> | |
| <div className="w-1.5 h-1.5 rounded-full bg-zinc-300"></div> | |
| Request | |
| </div> | |
| <CodeBlock code={req} /> | |
| </div> | |
| <div> | |
| <div className="text-xs font-bold text-zinc-400 uppercase tracking-wider mb-3 flex items-center gap-2"> | |
| <div className="w-1.5 h-1.5 rounded-full bg-zinc-300"></div> | |
| Response | |
| </div> | |
| <CodeBlock code={res} /> | |
| </div> | |
| </div> | |
| </div> | |
| ); | |
| } | |