playground

One endpoint.
Every model.

on-brand ai content

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.

8 models SSE streaming 3 base-url styles

Start in one paste.

your live url, already filled in
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 /.

The model shelf.

raw JSON ↗
loading catalog…

Click a card to load it below — no jumping, your scroll stays put. Unknown ids get a clean OpenAI-style 404 model_not_found.

Every route.

contract ↗
MethodPathWhat
GET/v1/modelsFull catalog, OpenAI object:"list" format
GET/v1/models/{id}One model
POST/v1/chat/completionsChat — stream:true → SSE (data:{…}[DONE])
POST/v1/completionsLegacy text completion
GET/healthStatus — add ?probe=1 for a live upstream ping
GETapi.php?route=selftestPHP env + real upstream round-trip

Try it live.

real upstream · real streaming
Console stream
stateless — send the full conversation in messages, exactly like OpenAI
Normalstream-ready