返回博客

快速开始指南

在 VS Code 中发送第一个 API 请求:一个 .http 文件,密钥来自 .env

使用 REST Client 扩展从 VS Code 向 CheapTokens 发送你的第一个聊天补全请求,将密钥排除在 git 之外,并找到回答和 token 用量。

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

VS Code 请求文件,包含向 CheapTokens API 的 POST 请求以及从 .env 读取的密钥
本页内容
  1. 安装扩展并将密钥放入 .env
  2. 编写 .http 文件
  3. 发送请求并找到答案
  4. 一行替换模型
  5. 如果它不工作

你无需离开 VS Code 就能向 CheapTokens 发送第一个请求:安装 REST Client 扩展,编写一个 .http 文件,将密钥保存在与其相邻的 .env 中,然后按 Ctrl+Alt+R。响应会在文件旁边的面板中打开,文本和 token 数量是两个字段,你可以一眼找到。

如果你已经打开了一个编辑器,这比为了向模型说声“Hello”而再安装一个应用要好。而且请求保存在纯文本文件中,因此你可以明天重新运行它,或者(去掉密钥后)提交给队友。发送相同请求的其他方式见 使用 HTTPie 发送第一个请求 和 使用 CheapTokens 发送你的第一个 API 请求。

安装扩展并将密钥放入 .env#

REST Client 就是扩展 humao.rest-client。在 VS Code 中按 F1,输入 ext install,搜索 rest-client 并安装它。(已对照该扩展的 README 于 2026 年 11 月 9 日核实。)

现在处理密钥。README 描述了 {{$dotenv NAME}}:它从与你的 .http 文件位于同一目录的 .env 文件中读取值。这正是我们想要的,因为密钥永远不会出现在请求文件中。为实验创建一个文件夹,并在其中放入两个文件。

.env:

text
CHEAPTOKENS_API_KEY=paste-your-key-here

.gitignore:

text
.env

在你的 CheapTokens 账户中创建密钥,并用它替换占位符。为什么忽略行很重要,以及如果密钥意外进入提交该怎么办,见 安全存储 API 密钥。

排序

按正确顺序进行设置

  1. 安装 REST Client 扩展
  2. 将 .env 添加到 .gitignore
  3. 将密钥放入与 .http 文件相邻的 .env 中
  4. 在请求上按 Ctrl+Alt+R

编写 .http 文件#

在同一文件夹中创建 first.http。语法很短:请求行(POST URL HTTP/1.1,方法可选,默认为 GET),头部行 Name: value 直到第一个空行,然后在空行之后是正文。请求之间用一行三个或更多 # 分隔。

http
### First request
POST https://api.cheaptokens.dev/v1/chat/completions
Authorization: Bearer {{$dotenv CHEAPTOKENS_API_KEY}}
Content-Type: application/json

{
  "model": "zai-org/GLM-5.3-Flash",
  "messages": [{ "role": "user", "content": "Hello" }]
}

注意三件事。地址是 CheapTokens API 基础地址 https://api.cheaptokens.dev/v1 加上 /chat/completions。模型使用其完整 id 编写,即 zai-org/GLM-5.3-Flash:一个 390K 上下文的模型,每次回答最多可写 8,192 个 token。而密钥只是一个 {{$dotenv …}} 占位符,因此此文件可以安全提交。

密钥位于 .env 中;first.http 仅保存对它的引用
密钥位于 .env 中,first.http 仅保存对它的引用

如果你的设置没有读取 .env 文件,README 还描述了 {{$processEnv NAME}},它从你机器的环境变量中读取变量。

发送请求并找到答案#

点击请求行上方的“Send Request”,或按 Ctrl+Alt+R(macOS 上为 Cmd+Alt+R)。你也可以右键单击或使用 F1。响应会在单独的面板中打开。如果你更喜欢可以搜索和折叠的普通编辑器标签页,请在设置中将 rest-client.previewResponseInUntitledDocument 设为 true。

响应是标准的 chat-completions JSON。第一天有两个地方很重要:

  • choices[0].message.content 是回答文本。紧挨着它,finish_reason 告诉你模型为什么停止。length 表示回答被 token 限制截断。
  • usage 保存此请求的 token 计数:你发送的 token 和模型写入的 token。这是你付费的部分,所以每次都要查看它。
从 Ctrl+Alt+R 到回答文本和 usage 字段
在响应面板中查看哪里
自己试试试一试:如何看出回答被截断了?显示答案

查看响应中的 finish_reason。如果它显示 length,说明模型在完成之前达到了 token 限制。在正文中添加一行 "max_tokens",或提高它,然后再次发送。

为了对费用有个感觉:假设你发送此请求 100 次,输入约 1,000 个 token,输出 300 个 token(这是示例假设,不是实测)。

模型 每次请求 100 次请求 OpenRouter,100 次请求
GLM-5.3-Flash $0.000032 $0.0032 $0.0058
DeepSeek-V4-Flash $0.000045 $0.0045 $0.0112
MiniMax-M2.7 $0.000095 $0.0095 $0.114

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

表格显示了该工作负载在每个模型上的实时价格,并有一列 OpenRouter 用于比较。一个很小的“Hello”花费要少得多。

一行替换模型#

纯文本文件的便利之处:改一行再发送。将模型 id 替换为 deepseek-ai/DeepSeek-V4-Flash-0731(380K 上下文,每次回答最多 32,768 个 token,全天统一价格,输入和输出合计比 OpenRouter 便宜),然后再次按 Ctrl+Alt+R。相同的正文,相同的密钥,不同的回答,以及不同的 usage。

想保留两者?在 ### 行下方粘贴第二个请求,使用另一个模型 id。每个请求都有自己的 Send Request 链接,因此你可以依次运行它们并比较。不确定 id?使用 GET /v1/models 列出模型 会显示确切的字符串。

如果它不工作#

配对

将症状与原因对应起来

  • 401 Unauthorized密钥为空或错误,通常是因为 .env 与 .http 文件不在同一文件夹中
  • 404 Not FoundURL 路径或模型 id 中有拼写错误
  • 回答在句子中间停止,finish_reason 为 length达到了 token 限制,请提高 max_tokens

对于前两个问题,API 401 或 404:错误的密钥、基础 URL 或模型 id 会逐步介绍检查方法。完整的请求详情见 CheapTokens 文档,当前价格在 定价页面 上。

这就是整个工作流程:一个文件,一个位于 .env 中的密钥,一个快捷键。从这里开始,你可以添加系统消息、更改 max_tokens,或将相同的正文转换为任何语言的代码。