1"use client";23import { Code, PageHeader } from "@/components/ui";45export default function DocsPage() {6 const origin = typeof location !== "undefined" ? location.origin : "https://www.llm-api.io";7 return (8 <div className="max-w-3xl">9 <PageHeader title="API" sub="OpenAI-compatible. Point any SDK at the base URL below with an API key from the Keys page." />10 <div className="flex flex-col gap-6 text-sm">11 <section className="card p-4">12 <div className="font-medium mb-2">Base URL</div>13 <Code>{`${origin}/v1`}</Code>14 <div className="text-xs text-ink-3 mt-2">Endpoints: <code className="mono">GET /v1/models</code>, <code className="mono">POST /v1/chat/completions</code>, <code className="mono">POST /v1/completions</code>, <code className="mono">POST /v1/embeddings</code>, <code className="mono">POST /v1/rerank</code>. Interactive OpenAPI schema at <a className="text-accent" href="/openapi" target="_blank">/openapi</a>.</div>15 </section>16 <section className="card p-4">17 <div className="font-medium mb-2">Python (openai SDK)</div>18 <Code>{`from openai import OpenAI1920client = OpenAI(base_url="${origin}/v1", api_key="llm_live_xxxxx")2122# Any installed model id, an alias (fast, coder, reasoning…) or "auto"23r = client.chat.completions.create(24 model="default",25 messages=[{"role": "user", "content": "Explain monetary policy in two sentences."}],26)27print(r.choices[0].message.content)2829# Streaming30for chunk in client.chat.completions.create(model="default", messages=[{"role":"user","content":"Count to 10"}], stream=True):31 if chunk.choices and chunk.choices[0].delta.content:32 print(chunk.choices[0].delta.content, end="", flush=True)3334# Embeddings (embedding model or alias "embedding")35e = client.embeddings.create(model="embedding", input=["hello world"])`}</Code>36 </section>37 <section className="card p-4">38 <div className="font-medium mb-2">curl</div>39 <Code>{`curl ${origin}/v1/models -H "Authorization: Bearer llm_live_xxxxx"4041curl ${origin}/v1/chat/completions \\42 -H "Authorization: Bearer llm_live_xxxxx" \\43 -H "Content-Type: application/json" \\44 -d '{"model": "default", "messages": [{"role": "user", "content": "Hello"}], "stream": true}'`}</Code>45 </section>46 <section className="card p-4">47 <div className="font-medium mb-2">Behaviour</div>48 <ul className="list-disc pl-5 text-ink-2 flex flex-col gap-1">49 <li>If the requested model is not loaded, the request waits while it is loaded from SSD (the previous model is unloaded first if memory requires it). Load times are typically 1–30 s depending on size.</li>50 <li>Model switches are serialized. Concurrent requests for the same model are queued at the worker.</li>51 <li>Reasoning models return <code className="mono">reasoning_content</code> in the message / delta. Disable thinking with <code className="mono">{"\"chat_template_kwargs\": {\"enable_thinking\": false}"}</code>.</li>52 <li>Tool calling: pass <code className="mono">tools</code>; calls come back as <code className="mono">tool_calls</code> for models with a tool-capable chat template.</li>53 <li>Every response includes a <code className="mono">timings</code> object (TTFT, tokens/s, peak memory) in addition to <code className="mono">usage</code>.</li>54 <li>Errors follow the OpenAI shape: <code className="mono">{"{\"error\": {\"message\", \"type\", \"code\"}}"}</code>, e.g. <code className="mono">MODEL_NOT_FOUND</code>, <code className="mono">MODEL_TOO_LARGE</code>, <code className="mono">CONTEXT_TOO_LARGE</code>, <code className="mono">WORKER_CRASHED</code>.</li>55 </ul>56 </section>57 <section className="card p-4">58 <div className="font-medium mb-2">Management API</div>59 <div className="text-ink-2">Same host, prefix <code className="mono">/api</code>, requires the dashboard session or an API key with the <code className="mono">admin</code> scope: <code className="mono">GET /api/models</code>, <code className="mono">POST /api/models/:id/load|unload|benchmark|pin</code>, <code className="mono">POST /api/models/download</code>, <code className="mono">GET /api/system</code>, <code className="mono">GET /api/events</code> (SSE).</div>60 </section>61 </div>62 </div>63 );64}65