OllieChatfree & kind · by WeirdMM ← Back to chat

The API is discontinued.

The public OllieChat API (/v1/*) is no longer available. All requests to /v1/chat/completions, /v1/messages, /v1/models, and the media endpoints now return HTTP 410 Gone. The web app at olliechat-iota.vercel.app still works — the shutdown only affects programmatic access.

Heads up: everything below is kept for reference only — none of these endpoints accept requests anymore. Any api-key value (including "ollie") will still get a 410 response.

POST · OpenAI-compatible
/v1/chat/completions
Chat completions, streaming or not.
POST · Anthropic-compatible
/v1/messages
Anthropic Messages format.
POST · image generation
/v1/images/generations
Flux, Imagen, Nano Banana & more.
POST · video generation
/v1/video/generations
Kling, Seedance, Hunyuan & more.

Base URL

https://olliechat-iota.vercel.app

OpenAI — Python

from openai import OpenAI

client = OpenAI(
    base_url="https://olliechat-iota.vercel.app/v1",
    api_key="ollie",          # ignored — the API is keyless
)

resp = client.chat.completions.create(
    model="claude-sonnet-5",
    messages=[{"role": "user", "content": "Hello!"}],
)
print(resp.choices[0].message.content)

OpenAI — Python (streaming)

stream = client.chat.completions.create(
    model="claude-sonnet-5",
    messages=[{"role": "user", "content": "Write a haiku about the sea."}],
    stream=True,
)
for chunk in stream:
    print(chunk.choices[0].delta.content or "", end="", flush=True)

OpenAI — JavaScript

import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "https://olliechat-iota.vercel.app/v1",
  apiKey: "ollie", // ignored — the API is keyless
  dangerouslyAllowBrowser: true, // only if calling from the browser
});

const resp = await client.chat.completions.create({
  model: "claude-sonnet-5",
  messages: [{ role: "user", content: "Hello!" }],
});
console.log(resp.choices[0].message.content);

Anthropic — Python

from anthropic import Anthropic

client = Anthropic(
    base_url="https://olliechat-iota.vercel.app",
    api_key="ollie",          # ignored — the API is keyless
)

msg = client.messages.create(
    model="claude-sonnet-5",
    max_tokens=512,
    messages=[{"role": "user", "content": "Hello!"}],
)
print(msg.content[0].text)

curl — no key at all

# OpenAI-compatible
curl https://olliechat-iota.vercel.app/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{"model":"claude-sonnet-5","messages":[{"role":"user","content":"hi"}]}'

# Anthropic-compatible
curl https://olliechat-iota.vercel.app/v1/messages \
  -H "Content-Type: application/json" -H "anthropic-version: 2023-06-01" \
  -d '{"model":"claude-sonnet-5","max_tokens":256,"messages":[{"role":"user","content":"hi"}]}'

Command line (OllieCLI)

Prefer the terminal? Install the CLI from npm — keyless too, nothing to configure.

npm install -g @weirdmm/olliecli@latest

View on npm →

There's no dashboard or server-side config — you control everything per request, exactly like a normal OpenAI/Anthropic call. System prompt, tools, temperature and so on all go in the request body.

System prompt

Set the assistant's behaviour with a system prompt. In the OpenAI format it's the first message with role: "system"; in the Anthropic format it's the top-level system field.

# OpenAI format
resp = client.chat.completions.create(
    model="claude-sonnet-5",
    messages=[
        {"role": "system", "content": "You are a terse pirate. Answer in one sentence."},
        {"role": "user", "content": "What's the weather like?"},
    ],
)

# Anthropic format
msg = client.messages.create(
    model="claude-sonnet-5",
    max_tokens=512,
    system="You are a terse pirate. Answer in one sentence.",
    messages=[{"role": "user", "content": "What's the weather like?"}],
)

Custom tools (function calling)

Define your own tools in the request. The model replies asking to call one; you run it in your code and pass the result back, then it writes the final answer. This is standard OpenAI function calling.

tools = [{
    "type": "function",
    "function": {
        "name": "get_weather",
        "description": "Get the current weather for a city.",
        "parameters": {
            "type": "object",
            "properties": {"city": {"type": "string"}},
            "required": ["city"],
        },
    },
}]

messages = [{"role": "user", "content": "What's the weather in Tokyo?"}]

# 1) the model asks to call your tool
resp = client.chat.completions.create(
    model="claude-sonnet-5", messages=messages, tools=tools,
)
call = resp.choices[0].message.tool_calls[0]     # name + JSON arguments

# 2) run the tool yourself, then hand the result back
messages.append(resp.choices[0].message)
messages.append({
    "role": "tool",
    "tool_call_id": call.id,
    "content": "72F and sunny",                  # your function's output
})

# 3) the model writes the final answer using the result
final = client.chat.completions.create(
    model="claude-sonnet-5", messages=messages, tools=tools,
)
print(final.choices[0].message.content)

Anthropic-style tools work too — use the tools field with input_schema, and reply with a tool_result content block. See Anthropic's tool-use docs for the exact shape.

Thinking & other options

Everything is passed straight through to the model, so the usual parameters just work:

FieldWhat it does
reasoning_effortHow hard the model reasons before answering: low, medium, high, or xhigh (max). Reasoning models only.
streamtrue to stream tokens as Server-Sent Events.
temperatureSampling randomness (e.g. 0.2 for focused, 1.0 for creative).
top_pNucleus sampling, an alternative to temperature.
max_tokensCap the length of the reply. Required by the Anthropic /v1/messages endpoint.
tools / tool_choiceFunction calling (see above). tool_choice can force or disable tool use.
stopStop sequences that end the generation.
resp = client.chat.completions.create(
    model="claude-opus-4-8",
    messages=[{"role": "user", "content": "Prove there are infinitely many primes."}],
    reasoning_effort="high",     # think harder
    temperature=0.3,
    max_tokens=1200,
)

Image & video generation

Same base URL, same no-key deal. Generate images with /v1/images/generations and short video clips with /v1/video/generations. On the website you don't even need the API — just ask any chat model to “draw a…” or “make a video of…” and it generates the result right in the chat (you can pick which image/video model it uses under Settings).

curl https://olliechat-iota.vercel.app/v1/images/generations \
  -H "Content-Type: application/json" \
  -d '{"model":"image/nano-banana-pro","prompt":"a red fox in a snowy forest, cinematic"}'
# → { "data": [ { "url": "data:image/png;base64,..." } ] }

curl https://olliechat-iota.vercel.app/v1/video/generations \
  -H "Content-Type: application/json" \
  -d '{"model":"video/kling-3-5s","prompt":"a paper plane gliding over a city at sunset"}'
# → { "data": [ { "url": "https://.../clip.mp4" } ] }
Image results come back as a data: URL; video results as an .mp4 URL. Use the full image/… or video/… model id (listed below). Video capacity is shared — if the pool is busy you'll get a “try again” error.

Models

claude-opus-4.8 claude-sonnet-5 claude-haiku-4.5 gpt-5.6-sol gpt-5.6-luna gpt-4o gemini-3.1-pro-preview gemini-3.5-flash deepseek-v4-pro glm-5.2 qwen3-coder-next kimi-k2.6 minimax-m2.7 mistral-large-3 llama-4-maverick nemotron-3-super-120b-a12b
100+ chat models — GET /v1/models returns the live list. The provider prefix works too (anthropic/claude-opus-4.8). For reasoning, add -thinking to any model (e.g. claude-opus-4.8-thinking) or pass reasoning_effort (low|medium|high|xhigh) — on the website the effort selector does this for you.

Image models

image/nano-banana-pro image/nano-banana-fast image/flux-kontext-max image/imagen-4 image/seedream-5-pro image/recraft-4.1 image/grok-image

Video models

video/kling-3-5s video/seedance-2.0-5s video/hailuo-2.3-6s video/hunyuan-video-1.5-6s video/wan-2.7-5s video/grok-video-6s
Made with love by WeirdMM. — back to OllieChat · Discord