快速开始
| 设置 | 值 |
|---|---|
| Base URL | https://cheapllm.shop/v1 |
| API key | sk-cheap-...,来自你的 dashboard |
| 模型 | deepseek-v4.1-flash-1017 |
curl https://cheapllm.shop/v1/chat/completions \ -H "Authorization: Bearer $CHEAPLLM_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "deepseek-v4.1-flash-1017", "messages": [{"role": "user", "content": "Hello!"}] }'
在 Windows 上,使用 PowerShell:
Invoke-RestMethod -Method Post -Uri "https://cheapllm.shop/v1/chat/completions" ` -Headers @{ Authorization = "Bearer $env:CHEAPLLM_API_KEY" } -ContentType "application/json" ` -Body '{"model": "deepseek-v4.1-flash-1017", "messages": [{"role": "user", "content": "Hello!"}]}'
Python
from openai import OpenAI client = OpenAI(base_url="https://cheapllm.shop/v1", api_key="sk-cheap-...") resp = client.chat.completions.create( model="deepseek-v4.1-flash-1017", messages=[{"role": "user", "content": "Hello!"}], ) print(resp.choices[0].message.content)
Node / TypeScript
import OpenAI from "openai";
const client = new OpenAI({ baseURL: "https://cheapllm.shop/v1", apiKey: process.env.CHEAPLLM_API_KEY });
const resp = await client.chat.completions.create({
model: "deepseek-v4.1-flash-1017",
messages: [{ role: "user", content: "Hello!" }],
});
console.log(resp.choices[0].message.content);无需 SDK,直接使用 fetch
const r = await fetch("https://cheapllm.shop/v1/chat/completions", {
method: "POST",
headers: { "Authorization": `Bearer ${KEY}`, "Content-Type": "application/json" },
body: JSON.stringify({ model: "deepseek-v4.1-flash-1017", messages: [{ role: "user", content: "Hello!" }] }),
});
const data = await r.json();密钥
将你的 key 作为 Authorization: Bearer sk-cheap-... 发送。x-api-key 请求头同样可用,适用于使用它的客户端。
- 在 dashboard 中最多创建 25 个 key,每个应用或每位队友一个。
- key 仅在创建时显示一次。我们只存储指纹。
- 撤销将在下一次请求时生效。
- CORS 已开放,因此浏览器应用可以直接调用 API。不过不要在公开网页中携带 key;任何人都能读取它。
聊天补全
POST /v1/chat/completions 接受与 OpenAI 端点相同的请求体。最常用的字段:
| 字段 | 说明 |
|---|---|
model | deepseek-v4.1-flash-1017。可选,它是唯一的一个。 |
messages | 必填。system、user、assistant、tool 角色。 |
stream | true 用于服务器发送事件。见下文。 |
max_tokens | 回答的上限,包含推理内容。 |
temperature、top_p | 采样,照常。 |
stop | 字符串或字符串列表。 |
tools、tool_choice、response_format | 按原样传递给模型。 |
响应携带一个 usage 对象,包含 prompt_tokens 和 completion_tokens,以及一个 x-request-id 请求头,如果你联系我们时值得引用。
上下文窗口: tokens。
流式传输
使用 "stream": true 时你会得到 text/event-stream:每个分块一行 data: {...},以及最后的 data: [DONE]。添加 "stream_options": {"include_usage": true} 可获得包含 token 计数的最后一个分块。
stream = client.chat.completions.create(
model="deepseek-v4.1-flash-1017",
messages=[{"role": "user", "content": "Count to five, slowly."}],
stream=True,
stream_options={"include_usage": True},
)
for chunk in stream:
if chunk.choices:
print(chunk.choices[0].delta.content or "", end="", flush=True)
elif chunk.usage:
print("\n", chunk.usage)关闭连接会停止生成,因此取消的请求不再消耗时间。
推理
模型在回答前会思考。思考内容与回答分开到达,因此绝不会污染你的输出:
| 位置 | 推理 | 回答 |
|---|---|---|
| 流式传输 | delta.reasoning_content(也支持 delta.reasoning) | delta.content |
| 非流式 | message.reasoning_content | message.content |
completion_tokens 和 max_tokens。如果回答被截断,请提高 max_tokens。模型
GET /v1/models 列出可用的模型。目前只有一个模型:
{"object": "list", "data": [{"id": "deepseek-v4.1-flash-1017", "object": "model", "owned_by": "cheapllm"}]}
Model names containing deepseek are routed to it too, so tools with a hard-coded DeepSeek model name just work.
Limits
Free tier
During the beta every account is free, with no rate limit. When the beta ends, every account keeps a permanent free tier, with no card: at least 5,000 input tokens and 1,000 output tokens per hour (5,000 and 1,000 today), counted per account over a rolling hour, all keys together. These numbers can go up, never below that minimum. Past the free tier, usage is billed at $0.005 per million input tokens, $0.001 per million cached input tokens and $0.14 per million output tokens, with no rate limit. We'll email every account before the beta ends.
Rate and size limits
| Thing | Limit |
|---|---|
| Requests per minute | None |
| Tokens per minute | None |
| Parallel requests | None |
| Request body | 4 MB |
| Keys per account | 25 |
503. That's not a limit on you, it means the kitchen is full for a moment. Retry after the number of seconds in Retry-After; the official SDKs do this on their own.Errors
Errors come back as {"error": {"message", "type", "code"}}, like OpenAI's.
| Status | Meaning | What to do |
|---|---|---|
400 | Bad body, e.g. no messages | Read the message, fix the request |
401 | Missing, wrong or revoked key | Check the header, or make a new key |
404 | Unknown model or endpoint | Use deepseek-v4.1-flash-1017 |
413 | Body over 4 MB | Trim the prompt |
503 | Kitchen full, even after our retries | Retry after Retry-After seconds |
504 | Generation took too long | Lower max_tokens or stream |
Anthropic and Responses formats
Tools built for the Anthropic Messages API (Claude Code, the Anthropic SDKs) can use the same model. Point them at https://cheapllm.shop; they call POST /v1/messages. The key works as x-api-key or Authorization: Bearer. Any model name is accepted and routed to deepseek-v4.1-flash-1017.
curl https://cheapllm.shop/v1/messages \ -H "x-api-key: $CHEAPLLM_API_KEY" \ -H "anthropic-version: 2023-06-01" \ -H "content-type: application/json" \ -d '{"model": "deepseek-v4.1-flash-1017", "max_tokens": 1024, "messages": [{"role": "user", "content": "Hello!"}]}'
Supported: text, images, system prompts, tool use and tool results, streaming events, stop sequences. Thinking blocks are not returned. POST /v1/messages/count_tokens returns an estimate.
Tools built for the OpenAI Responses API (Codex CLI, recent OpenAI SDK code) can call POST /v1/responses on https://cheapllm.shop/v1: text and image input, instructions, function and custom tools, streaming events. Stateless only (store and previous_response_id are not kept).
Can't find it here? : it has read these docs and knows the 40 integrations.
Your tools
Step-by-step settings for Claude Code, OpenCode, Codex CLI, DeepSeek Harness, Cline, Roo Code, Kilo Code, Continue, Copilot, Cursor, Zed and many more are on the integrations page. In short: anything with an "OpenAI-compatible" or "custom base URL" setting works with the base URL, your key and the model name above.
Environment variables
export OPENAI_BASE_URL=https://cheapllm.shop/v1 export OPENAI_API_BASE=https://cheapllm.shop/v1 # older libraries export OPENAI_API_KEY=sk-cheap-...
Windows (PowerShell; setx keeps them for new windows):
setx OPENAI_BASE_URL "https://cheapllm.shop/v1" setx OPENAI_API_BASE "https://cheapllm.shop/v1" setx OPENAI_API_KEY "sk-cheap-..."
Or let the installer pick, install and configure your tools (all 40 from the integrations page): curl -fsSL https://cheapllm.shop/setup.sh | sh on macOS and Linux, irm https://cheapllm.shop/setup.ps1 | iex in Windows PowerShell.
Open WebUI
Admin settings, Connections, OpenAI API: add a connection with the base URL and your key. The model appears in the picker.
LibreChat
endpoints:
custom:
- name: "cheapllm"
apiKey: "${CHEAPLLM_API_KEY}"
baseURL: "https://cheapllm.shop/v1"
models:
default: ["deepseek-v4.1-flash-1017"]
Continue (VS Code, JetBrains)
models:
- name: cheapllm
provider: openai
model: deepseek-v4.1-flash-1017
apiBase: https://cheapllm.shop/v1
apiKey: sk-cheap-...
Aider
aider --openai-api-base https://cheapllm.shop/v1 --openai-api-key sk-cheap-... \ --model openai/deepseek-v4.1-flash-1017
Cursor
Settings, Models: paste your key in the OpenAI API key field, turn on "Override OpenAI Base URL" with the base URL, then add the model name as a custom model.
LangChain
from langchain_openai import ChatOpenAI llm = ChatOpenAI(model="deepseek-v4.1-flash-1017", base_url="https://cheapllm.shop/v1", api_key="sk-cheap-...")
Vercel AI SDK
import { createOpenAICompatible } from "@ai-sdk/openai-compatible";
const cheapllm = createOpenAICompatible({ name: "cheapllm", baseURL: "https://cheapllm.shop/v1", apiKey: process.env.CHEAPLLM_API_KEY });
const model = cheapllm("deepseek-v4.1-flash-1017");
Stuck? Write to [email protected] with the x-request-id of the failing call.