返回博客

快速开始指南

用 HTTPie 向 CheapTokens 发出第一个请求:环境变量中的密钥、= 和 :=

一条可读的 http 命令,用环境变量中的密钥发送聊天补全,然后展示答案和 token 用量在哪里。

作者:CheapTokens Team发布于 4 分钟阅读

一个终端,显示带有 bearer 密钥变量和 JSON 字段的 http 命令
本页内容
  1. = 和 := 实际做什么
  2. 答案在哪里
  3. 更换模型:只改一个字段
  4. 一次测试请求的成本
  5. 如果它不工作

你想确认密钥有效、模型 id 正确,而且希望一行就能搞定。HTTPie 的 http 命令就能做到这一点,而且比 curl 少得多引号转义:你只需输入字段,它就会构建 JSON。下面是完整请求,文章其余部分会逐一解释每个部分。

bash
export CHEAPTOKENS_API_KEY="paste-your-key-here"

http --body -A bearer -a "$CHEAPTOKENS_API_KEY" \
  POST https://api.cheaptokens.dev/v1/chat/completions \
  model=deepseek-ai/DeepSeek-V4-Flash-0731 \
  max_tokens:=200 \
  'messages:=[{"role":"user","content":"In one sentence, what is a token?"}]'

该 API 兼容 OpenAI,因此基础 URL 是 https://api.cheaptokens.dev/v1,聊天请求发往其下的 /chat/completions。模型 id 是完整的那一个,即 deepseek-ai/DeepSeek-V4-Flash-0731(价格表中的短名称不被接受)。如果你之前没有存储过密钥,请先安全地存储 API 密钥:直接输入 export 这一行会把密钥写进 shell 历史记录,所以配置文件或密钥管理器是更好的存放位置。

终端中的请求:来自变量的 bearer 密钥、作为字符串的模型、作为数字的 max_tokens、作为原始数组的 messages
同一个请求在终端中的样子

= 和 := 实际做什么#

这是 HTTPie 中你唯一必须学习的部分。HTTPie 的 JSON 文档(版本 3.2.4,日期为 2024 年 11 月 1 日,阅读于 2026 年 11 月 9 日)说明 = 设置字符串字段,而 := 设置原始 JSON 值:数字、布尔值、数组或对象。以这种方式给出的字段默认会作为 JSON 请求体发送,因此你不需要自己添加 Content-Type 头。

在我们的请求中,这会产生三种不同的形态:

  • model=deepseek-ai/DeepSeek-V4-Flash-0731 是字符串,所以用 =。
  • max_tokens:=200 是数字,所以用 :=。如果用 =,你会发送字符串 "200"。
  • messages:=[…] 是对象数组,所以再次用 :=,并且值放在单引号中,这样 shell 就不会动内部的雙引号。

文档还说明,来自 stdin 的请求体不能与命令行字段组合使用,所以请选择一种方式。对于首次测试,使用字段更短,也更容易编辑。

快速检查

用普通的 = 时,max_tokens=200 会发送什么?

显示答案

答案: 字符串 "200"

= 总是生成字符串。要发送数字,你需要 :=,所以写成 max_tokens:=200。

答案在哪里#

回复遵循 OpenAI 聊天补全格式。你要找三样东西,它们位于不同位置:

json
{
  "choices": [
    {
      "message": { "role": "assistant", "content": "…the answer text…" },
      "finish_reason": "stop"
    }
  ],
  "usage": { "prompt_tokens": …, "completion_tokens": …, "total_tokens": … }
}

答案文本是 choices[0].message.content。finish_reason 在同一个 choice 中紧挨着它,而 usage 位于顶层。usage 显示你发送了多少 token(prompt_tokens)以及模型写了多少 token(completion_tokens),这对估算一次请求的成本很方便。

响应中该看哪里:choices、message.content、finish_reason 和 usage
每个响应中要读取的三个字段

如果你只想要文本,把响应体通过管道传给 jq:

bash
http --body -A bearer -a "$CHEAPTOKENS_API_KEY" \
  POST https://api.cheaptokens.dev/v1/chat/completions \
  model=deepseek-ai/DeepSeek-V4-Flash-0731 \
  max_tokens:=200 \
  'messages:=[{"role":"user","content":"In one sentence, what is a token?"}]' \
  | jq -r '.choices[0].message.content'
自己试试试一试:把限制设得太小,然后读取 finish_reason显示答案

把 max_tokens:=200 改成 max_tokens:=5 并再次运行。答案会被截断,finish_reason 会显示 length 而不是 stop:是限制让模型停止,而不是思考结束。为什么答案会被截断 介绍了修复方法。

更换模型:只改一个字段#

模型就是一个字符串,所以尝试另一个模型只需改一个词。下面两个 id 都可以在 CheapTokens 上使用同一个余额;DeepSeek-V4-Flash 提供 380K 上下文,每次回答最多 32,768 个输出 token,GLM-5.3-Flash 提供 390K 上下文,最多 8,192 个。

一个请求,两个模型

DeepSeek-V4-Flash

bash
http --body -A bearer -a "$CHEAPTOKENS_API_KEY" \
  POST https://api.cheaptokens.dev/v1/chat/completions \
  model=deepseek-ai/DeepSeek-V4-Flash-0731 \
  max_tokens:=200 \
  'messages:=[{"role":"user","content":"Name three uses of a token limit."}]'

GLM-5.3-Flash

bash
http --body -A bearer -a "$CHEAPTOKENS_API_KEY" \
  POST https://api.cheaptokens.dev/v1/chat/completions \
  model=zai-org/GLM-5.3-Flash \
  max_tokens:=200 \
  'messages:=[{"role":"user","content":"Name three uses of a token limit."}]'

不确定该用哪个 id?用 GET /v1/models 列出模型,然后复制准确的字符串。

一次测试请求的成本#

像这样的简短问题很便宜。假设问题大约 100 个 token,答案大约 150 个 token:该请求花费 $0.000017。一千次这样的请求如下所示,输入和输出合并计算:

模型 每次请求 1,000 次请求 OpenRouter,1,000 次请求
GLM-5.3-Flash $0.000008 $0.008 $0.0158
DeepSeek-V4-Flash $0.000017 $0.0165 $0.028
MiniMax-M2.7 $0.000028 $0.0275 $0.33

每次请求 100 个输入 token 和 150 个输出 token。每 100 万 token 的价格为当前价格,会随我们的资费一同变动;OpenRouter 列显示相同工作负载的参考价格。

总体而言,将输入和输出合并计算,DeepSeek-V4-Flash 比 OpenRouter 更便宜,而且价格是固定费率,没有高峰时段。每个模型的最新费率见定价页面。

如果它不工作#

  • 你用普通的 = 输入了 messages=[…]。 数组会作为字符串发送,而不是消息列表。请使用 :=,并用单引号包裹整个值。
  • := 中的 JSON 无效。 每个键和字符串都需要双引号,而外层引号必须是单引号。如果你编辑消息文本,请保持引号配对。
  • 密钥为空。 echo ${#CHEAPTOKENS_API_KEY} 会打印长度而不显示密钥;0 表示该变量在此终端中未设置。
  • 模型 id 是短名称。 请使用完整的 deepseek-ai/DeepSeek-V4-Flash-0731。对于 401 和 404 响应,请参阅密钥、基础 URL 或模型 id 错误。
  • 你用了 --session。 HTTPie 的认证文档说明会话文件以明文存储凭据,所以请把密钥放在环境变量中,并在此命令中不要使用 --session。

如果某个标志的行为与上面不同,请用 http --version 检查你的版本。更喜欢 Python?不使用 SDK 的同一请求见用 requests 在 Python 中发出第一个请求。完整 API 参考见 CheapTokens 文档。