Drop-in chat API for your stack — streaming included, memory handled the OpenAI way. No key, no account, no billing. Just point your SDK and build.
from openai import OpenAI client = OpenAI( base_url="…/v1", api_key="none", ) stream = client.chat.completions.create( model="deepseek-v4-flash", messages=[ {"role": "user", "content": "What can CodAGT do?"} ], stream=True, ) for chunk in stream: text = chunk.choices[0].delta.content or "" print(text, end="", flush=True)
import OpenAI from "openai"; const client = new OpenAI({ baseURL: "…/v1", apiKey: "none", }); const stream = await client.chat.completions.create({ model: "deepseek-v4-flash", messages: [{ role: "user", content: "What can CodAGT do?" }], stream: true, }); for await (const chunk of stream) { process.stdout.write(chunk.choices[0]?.delta?.content ?? ""); }
curl -N "…/v1/chat/completions" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer none" \ -d '{ "model": "deepseek-v4-flash", "stream": true, "messages": [{"role":"user","content":"What can CodAGT do?"}] }'
All three base-url styles route to the same API: <site>/<folder>/v1 · /api · bare /.
Click a card to load it below — no jumping, your scroll stays put. Unknown ids get a clean OpenAI-style 404 model_not_found.
| Method | Path | What |
|---|---|---|
| GET | /v1/models | Full catalog, OpenAI object:"list" format |
| GET | /v1/models/{id} | One model |
| POST | /v1/chat/completions | Chat — stream:true → SSE (data:{…} … [DONE]) |
| POST | /v1/completions | Legacy text completion |
| GET | /health | Status — add ?probe=1 for a live upstream ping |
| GET | api.php?route=selftest | PHP env + real upstream round-trip |