import { useState } from "react"; import { Copy, Check, ExternalLink } from "lucide-react"; export default function DocsView() { const [copied, setCopied] = useState(null); const [active, setActive] = useState("overview"); // BUG FIX #7: Removed unused `codeTab` / `setCodeTab` state that was // declared but never referenced in JSX, creating dead React state on every // render and confusing future developers. const BASE = window.location.origin; const copy = (text, key) => { navigator.clipboard.writeText(text); setCopied(key); setTimeout(() => setCopied(null), 1500); }; const sections = [ { id: "overview", title: "Overview", content: (

AI Gateway Hub proxies any AI provider through a single{" "} OpenAI-compatible{" "} API endpoint. Add any model via the UI, then call it using the standard OpenAI SDK from any language.

{[ { label: "Base URL", value: `${BASE}/v1`, badge: "green" }, { label: "Auth", value: "Any bearer token (passthrough)", badge: "cyan" }, { label: "Protocol", value: "OpenAI API v1", badge: "purple" }, ].map(({ label, value, badge }) => (
{label}

{value}

))}
), }, { id: "python", title: "Python (openai SDK)", lang: "python", code: `from openai import OpenAI # Point the official OpenAI SDK at your gateway client = OpenAI( base_url="${BASE}/v1", api_key="any-string", # No real key needed for keyless providers ) # Chat completions response = client.chat.completions.create( model="anthropic-claude-3-5-sonnet-20241022", # Your registered alias messages=[ {"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": "Explain quantum entanglement simply."}, ], temperature=0.7, ) print(response.choices[0].message.content) # Streaming stream = client.chat.completions.create( model="ollama-llama3", messages=[{"role": "user", "content": "Write a haiku."}], stream=True, ) for chunk in stream: print(chunk.choices[0].delta.content or "", end="", flush=True) # Embeddings embedding = client.embeddings.create( model="openai-text-embedding-3-small", input="Hello world", ) print(embedding.data[0].embedding[:5])`, }, { id: "nodejs", title: "Node.js / TypeScript", lang: "javascript", code: `import OpenAI from "openai"; const client = new OpenAI({ baseURL: "${BASE}/v1", apiKey: "any-string", }); // Chat completions const response = await client.chat.completions.create({ model: "anthropic-claude-3-5-sonnet-20241022", messages: [ { role: "system", content: "You are a helpful assistant." }, { role: "user", content: "What is the capital of France?" }, ], }); console.log(response.choices[0].message.content); // Streaming const stream = await client.chat.completions.create({ model: "ollama-llama3", messages: [{ role: "user", content: "Count to 10." }], stream: true, }); for await (const chunk of stream) { process.stdout.write(chunk.choices[0]?.delta?.content ?? ""); }`, }, { id: "curl", title: "cURL", lang: "bash", code: `# Chat completion curl ${BASE}/v1/chat/completions \\ -H "Content-Type: application/json" \\ -H "Authorization: Bearer any-key" \\ -d '{ "model": "anthropic-claude-3-5-sonnet-20241022", "messages": [ {"role": "user", "content": "Hello, who are you?"} ] }' # List available models curl ${BASE}/v1/models \\ -H "Authorization: Bearer any-key" # Embeddings curl ${BASE}/v1/embeddings \\ -H "Content-Type: application/json" \\ -H "Authorization: Bearer any-key" \\ -d '{ "model": "openai-text-embedding-3-small", "input": "The food was delicious." }'`, }, { id: "langchain", title: "LangChain", lang: "python", code: `from langchain_openai import ChatOpenAI, OpenAIEmbeddings # Drop-in replacement — just change base_url llm = ChatOpenAI( base_url="${BASE}/v1", api_key="any-key", model="anthropic-claude-3-5-sonnet-20241022", temperature=0, ) result = llm.invoke("What are the benefits of LangChain?") print(result.content) # Embeddings embeddings = OpenAIEmbeddings( base_url="${BASE}/v1", api_key="any-key", model="openai-text-embedding-3-small", ) vector = embeddings.embed_query("Hello world")`, }, { id: "litellm_sdk", title: "LiteLLM SDK", lang: "python", code: `import litellm # Call via gateway response = litellm.completion( model="openai/anthropic-claude-3-5-sonnet-20241022", api_base="${BASE}/v1", api_key="any-key", messages=[{"role": "user", "content": "Hello!"}], ) print(response.choices[0].message.content)`, }, { id: "endpoints", title: "Supported Endpoints", content: (
{[ { method: "POST", path: "/v1/chat/completions", desc: "Chat completions (streaming supported)" }, { method: "POST", path: "/v1/completions", desc: "Text completions" }, { method: "POST", path: "/v1/embeddings", desc: "Text embeddings" }, { method: "POST", path: "/v1/images/generations", desc: "Image generation (DALL-E / Stable Diffusion)" }, { method: "POST", path: "/v1/audio/speech", desc: "Text-to-speech" }, { method: "POST", path: "/v1/audio/transcriptions",desc: "Speech-to-text (Whisper)" }, { method: "GET", path: "/v1/models", desc: "List all registered models" }, ].map(({ method, path, desc }) => (
{method} {path} {desc}
))}
), }, ]; return (

Integration Docs

Use any OpenAI-compatible client to connect to your registered models.

{/* Sidebar */} {/* Content */}
{/* Mobile tab strip */}
{sections.map(s => ( ))}
{sections .filter(s => s.id === active) .map(s => (

{s.title}

{s.content && s.content} {s.code && (
{s.code}
)}
))}
); }