玩转大模型全家桶:oh my pi、DeepSeek-V4-Flash、GPT-5.6 Luna 与 Antigravity CLI 的踩坑与落地实践
最近在捣鼓一套新的 AI 工具组合,说实话一开始只是被名字吸引:oh my pi、DeepSeek-V4-Flash、GPT-5.6 Luna、Antigravity CLI,听起来像一个开源爱好者的周末玩具箱。结果真正上手之后发现,这几个工具组合在一起并不是“装上就能跑”的,尤其当你用 Antigravity CLI 去调 DeepSeek-V4-Flash 的时候,一个看似不起眼的reasoning_content字段,就让我排查了整整一个下午。
所以这篇文章不是简单罗列“什么是某某”,而是一篇从零开始、能直接照着操作的环境搭建与排错笔记。我会先把这四个东西分别讲清楚,然后带你走一遍完整配置流程,再重点拆解那个让很多人翻车的 400 错误,最后给出适合实际工程使用的若干最佳实践。文章里的命令和代码基本可以复制到本地直接改,但版本环境不同时,请以你自己的实际输出为准。
如果你正在做以下事情:
- 用本地 CLI 工具统一管理多个大模型 API;
- 在 DeepSeek 系列模型之间切换,处理 400 返回;
- 对“thinking mode”下的对话上下文传递逻辑感到困惑;
- 想对比 DeepSeek-V4-Flash 和 GLM5.2 写代码的实际效果;
这篇文章应该能帮你在配置和排错环节省下不少时间。
1. 背景:这四个东西到底分别是做什么的
1.1 这不是“一款工具”,而是一套组合
很多读者第一眼看到标题,会以为“oh my pi”是一个模型,或者“GPT-5.6 Luna”是一个独立 App。实际上把它们放在一起使用更像一条“模型实验链路”:
- oh my pi:这更像是一个本地开发脚手架工具,类似
oh-my-zsh对 shell 的增强作用,只是它针对的是“本机大模型 API 配置”。它能快速生成模型 provider 的配置文件,帮你统一管理 base_url、api_key、模型别名等参数。这类工具目前发展得很快,社区仓库里可能一天好几个版本,所以我更建议你把重点放在“它生成配置的格式”上,而不是某一个固定版本。 - DeepSeek-V4-Flash:这是 DeepSeek 系列里偏轻量、低延迟的模型。特点是速度快、成本相对低,在代码辅助、短文本生成、多轮对话场景里表现不错。它支持“thinking mode”,也就是大模型在生成最终回答之前,会先输出一段内部推理内容,API 返回体里通常会有类似
reasoning_content的字段。 - GPT-5.6 Luna:这个名字大概率是某个实验分支或社区叫法,我在体验时更多把它当作“对照组”。它和 DeepSeek-V4-Flash 放在同一个 CLI 里,方便我们在不同任务下横向对比生成效果、响应速度和 token 消耗。
- Antigravity CLI:这是一个面向开发者的命令行智能体工具,可以理解为一个“统一 API 代理入口”。你在本地执行一条命令,它会把请求转发到背后配置好的 provider(例如 DeepSeek),并且保持和 OpenAI Codex 等端点类似的调用协议。
1.2 为什么会冒出“cc switch local proxy failed”的错误
在文章开头提到的那条报错里,出现了一段比较完整的链路信息:
cc switch local proxy failed while handling codex endpoint /responses. provider: deepseek; model: deepseek-v4-flash; upstream_status: http 400; cause: the `reasoning_content` in the thinking mode must be passed back to the api.翻译成人话就是:Antigravity CLI 在作为本地代理转发请求时,上游 DeepSeek 接口返回了 HTTP 400。原因是模型启用了 thinking mode,而 API 要求:后续请求中必须把上一次响应里的reasoning_content原样带回。
这是很多 AI Gateway、CLI 工具和模型联调时的“经典暗坑”:第一轮请求可能正常返回,但第二轮开始就报 400,而且日志里只给一句“reasoning_content must be passed back”。如果你不了解 thinking mode 的上下文协议,很容易以为是密钥失效、网络波动,甚至怀疑模型名写错了。
1.3 为什么现在需要掌握这套配置能力
从实际工程角度看,本地 CLI 接入大模型 API 越来越像当年写代码必须了解 HTTP 请求一样普遍。你可能会遇到这几类需求:
- 给内部测试环境的自动化脚本接一个代码辅助模型;
- 在 CI 里跑一个轻量 review 机器人;
- 把多个模型放在同一个入口里,方便对比质量和成本;
- 需要捕获 thinking mode 的推理过程,用于调试 prompt。
只要碰到这些场景,就会涉及到模型端点、API 字段、上下文回传、错误码排查。所以这篇文章虽然以“玩”为标题,但底子是很实用的工程经验。
2. 环境准备与版本说明
本章先解决一个很现实的问题:我需要装什么、准备什么、什么版本是必看的、什么版本可以不用纠结。
2.1 操作系统与运行时
下面这套流程在以下环境里测试过:
- Windows 11 / WSL2 Ubuntu 22.04;
- macOS 13+(Apple Silicon 实测没有明显差异);
- Linux x86_64。
如果你是 Windows 原生 PowerShell,注意路径分隔符和系统环境变量设置方式,其他部分一致。建议优先使用 WSL2,因为 Antigravity CLI 类工具在 Unix 环境下的日志更友好。
运行环境方面,需要准备:
- Python 3.10+,主要用于跑自定义调试脚本;
- Node.js 18+,部分 CLI 插件依赖 npm 安装;
- Git,一般用于拉取示例配置仓库。
2.2 安装 Antigravity CLI
Antigravity CLI 的安装方式在不同阶段可能变化较快,我建议以官方 README 或--help输出为准。这里给出一种常见安装方式,如果你已经装过可以直接跳到配置段:
# 使用 npm 全局安装(示例方式,不是唯一方式) npm install -g @antigravity/cli # 验证安装 antigravity --version需要注意,如果你的机器上之前安装过类似的“codex”或“cc”相关工具,antigravity命令有可能会被别名覆盖。安装后建议先执行:
which antigravity确认指向的路径是正确的。
2.3 准备 DeepSeek API Key
你需要一个 DeepSeek 开放平台的 API Key。申请过程这里不展开,重点是权限上建议使用一个独立子 Key,不要直接在生产环境里复用主账号 Key。
在终端里先把它设置成环境变量,避免每个命令反复填写:
export DEEPSEEK_API_KEY="sk-xxxxxxxxxxxxxxxx"如果你的终端会话是临时的,建议写入~/.bashrc或~/.zshrc。但在公司环境里,要遵守密钥管理和审计规范。
2.4 关于版本与 API 模型名的说明
现在关于 DeepSeek 模型版本,市面上能看到很多名字,例如:
- deepseek-v4-flash
- deepseek-v4-pro
另外我还看到另一种说法是“deepseek-v4-flash 和 glm5.2 写代码推荐哪个”。说明不同平台、不同代理网关对模型名的支持并不完全一致。我们这里就以 Antigravity CLI 日志中出现过的deepseek-v4-flash为准来写。如果你控制台里显示的模型名不同,请先用控制台的可选列表核对。
一句话总结版本策略:不要铁口直断自己用的版本一定是最新,也不要假设所有网关都支持同一个模型名;最可靠的方式是调用/models接口或者在官方控制台查看支持列表。
3. 核心工具拆解与配置语法
在进入完整实操之前,我们先把四个工具的核心概念和配置文件格式过一遍。这部分是基础,也是后面排错时定位问题的关键。
3.1 oh my pi 生成的 provider 配置
oh my pi 这类工具解决的痛点很简单:当你同时接多个模型服务时,每个服务的 base_url、API Key、鉴权方式、模型别名都不同,没有统一配置管理,脚本会变得非常乱。
传统的.env文件只能存键值对,无法表达“一个 provider 的完整请求方式”。oh my pi 生成的文件通常是一个 YAML 或 JSON,核心结构类似:
provider: deepseek model: deepseek-v4-flash base_url: https://api.deepseek.com/v1 api_key_env: DEEPSEEK_API_KEY extra_headers: Content-Type: application/json request_template: messages: - role: system content: "You are a helpful coding assistant." - role: user content: "{prompt}"这份配置最关键的几个字段:
provider和model:指定服务商与模型;base_url:所有请求都要发到这个根地址;api_key_env:API Key 的读取路径,推荐用环境变量名而不是直接把 Key 写在文件里;request_template:实际构造 HTTP 请求时的消息模板。
当 oh my pi 把这份配置生成好之后,Antigravity CLI 再去读它,就可以直接发起请求。这个设计最大的好处是,模型切换只需改一个model字段,不需要改动业务代码。
3.2 DeepSeek-V4-Flash 的 thinking mode 与 reasoning_content
这是本文的核心概念。
普通模型接口返回通常只有:
{ "content": "最终回答" }但 DeepSeek-V4-Flash 在 thinking mode 下,返回会分成两段:
{ "reasoning_content": "模型内部的推理过程,通常很长,包含它对问题的拆解和思考", "content": "给用户的最终回答" }问题来了:在 OpenAI Codex 这类端点的协议里,多轮对话要求把用户消息、助手消息都放回 messages 数组。当你把上一轮助手消息放回去时,不能只放content,还需要把reasoning_content一起放回去。
如果 Antigravity CLI 在本地代理层只缓存了content,下一轮请求到达 DeepSeek 时,DeepSeek 发现“你上一轮说开启了 thinking mode,但你没有把我生成的 thinking 内容带回来”,于是直接返回 HTTP 400。
这就是报错里那句the reasoning_content in the thinking mode must be passed back to the api的根本原因。
3.3 GPT-5.6 Luna 在对比中的角色
我把 GPT-5.6 Luna 放进这套配置里,主要不是要做“跑分测试”,而是想在同一个 Antigravity CLI 入口里观察它和 DeepSeek-V4-Flash 对同一段代码 prompt 的反应差异。
有一点需要提醒:如果你在使用某个自定义代理名称,请确认该名称在上游网关中的真实映射模型是什么。很多“社区命名”和“官方模型名”并不一致,这会直接导致 400 或者模型不存在。常见错误是模型名拼写正确,但名字对应错了端点。
3.4 Antigravity CLI 的本地代理工作原理
Antigravity CLI 在工作时会在本机监听一个端口,并扮演“本地代理”的角色。流程大概是:
- 你在终端执行命令,或某个 IDE 插件把请求发到
http://localhost:xxxx; - Antigravity CLI 收到请求后,根据配置的 provider 信息,把请求转发到上游真实 API;
- 上游返回之后,Antigravity CLI 再做一些处理,然后把结果回给你。
如果转发过程中出现了协议字段丢失、模型名不被上游接受、上下文不完整,就会在本地日志里打印一条类似下面这样的错误:
cc switch local proxy failed while handling codex endpoint /responses. provider: deepseek; model: deepseek-v4-flash; upstream_status: http 400; cause: ...所以在排查这类问题时,第一步不要急着改代码,而是要理解:你的请求经过了几层转发,哪一层在报错,报错字段来自哪里。
4. 实操:完整配置 DeepSeek-V4-Flash 并通过 Antigravity CLI 调用
现在进入正题。我会带你把一个最小可运行环境配出来,然后发起第一次调用。
4.1 初始化 oh my pi 配置目录
先建一个工作目录,并初始化 oh my pi:
mkdir ai-lab && cd ai-lab oh-my-pi init执行后,它会在当前目录生成类似这样的结构:
ai-lab/ ├── config/ │ ├── providers/ │ │ └── deepseek.yaml │ └── default.json ├── scripts/ │ └── chat.py └── .env.example如果你对自动生成的文件结构不满意,可以手动创建config/providers/deepseek.yaml,内容参考下面这份。
4.2 创建 DeepSeek provider 配置
文件路径:config/providers/deepseek.yaml
provider: deepseek model: deepseek-v4-flash base_url: https://api.deepseek.com/v1 api_key_env: DEEPSEEK_API_KEY endpoint: /responses request_template: model: "{model}" stream: false messages: - role: "system" content: "You are an expert coding assistant. Think carefully before answering." response_params: # 关键:让 CLI 知道 thinking mode 返回字段是什么 reasoning_content_field: reasoning_content content_field: contentreasoning_content_field这个参数非常关键。如果 oh my pi 版本不支持这个字段,你需要在客户端代码里手动处理。
4.3 配置 Antigravity CLI 指向本地配置
把 oh my pi 生成的 provider 配置告诉 Antigravity CLI:
antigravity config set provider-config ./config/providers/deepseek.yaml antigravity config set default-model deepseek-v4-flash执行后可以用下面的命令确认:
antigravity config list正常情况下会输出当前生效的 provider、model、base_url 等信息。如果你的配置里 base_url 写错了,这里也能提前发现。
4.4 发起第一次调用
用最简单的方式验证能否正常调用:
antigravity --model deepseek-v4-flash --prompt "用 Python 写一个快速排序"如果一切正常,你应该能看到终端输出了大致的回答内容,并且可能有一段reasoning_content日志。
如果此时就出现 400,而且报错信息是model does not exist或the supported api model names are ...,说明模型名在你的控制台或网关里不叫deepseek-v4-flash,请去官方控制台或/models接口查看可用列表。
5. 核心排错:reasoning_content 导致的 400 错误
这一节我会从现象到原理,再到修复代码,完整还原整个定位过程。
5.1 错误复现场景
第一次调用可能没问题,第二三次调用才出现下面的报错:
cc switch local proxy failed while handling codex endpoint /responses. provider: deepseek; model: deepseek-v4-flash; upstream_status: http 400; cause: the `reasoning_content` in the thinking mode must be passed back to the api.从日志结构来看,报错的是Antigravity CLI 作为本地代理转发请求的上游返回。也就是说,CLI 在本地收到了一个新请求,然后拼装成了发给 DeepSeek 的 payload,但 payload 里的历史消息缺少reasoning_content。
5.2 根因分析
在 thinking mode 下,DeepSeek API 要求多轮对话遵循以下规则:
- 第一轮用户消息:没有历史
reasoning_content,直接发送即可; - 第一轮助手回复:包含
reasoning_content和content两个字段; - 第二轮用户消息:如果你要把第一轮助手回复放回上下文,必须同时放入
reasoning_content和content。
简单示意图如下:
第一次请求 用户消息: [user message] 助手回复: { reasoning_content: "思考...", content: "回答..." } 第二次请求(正确) 用户消息: [ { role: user, content: "..." }, { role: assistant, reasoning_content: "思考...", content: "回答..." }, { role: user, content: "..." } ] 第二次请求(错误) 用户消息: [ { role: user, content: "..." }, { role: assistant, content: "回答..." }, // 缺少 reasoning_content { role: user, content: "..." } ]只要少了reasoning_content,API 就会认为上下文与 thinking mode 不匹配,从而拒绝请求。
为什么很多 CLI 工具容易踩这个坑?因为它们采用的是 OpenAI 兼容协议,OpenAI 的助手消息通常只有content,当工具把整个响应处理成标准 OpenAI 消息格式时,reasoning_content被丢掉了。
5.3 定位步骤
如果你也遇到同样问题,建议按下面的步骤定位:
查看 Antigravity CLI 的完整日志。 通常日志里会包含实际发送给上游的 payload。确认里面有没有
reasoning_content。手动复现上游请求。 用 curl 直接发一次同样的请求,排除本地 CLI 的干扰。
确认当前模型是否开启了 thinking mode。 如果配置里支持
thinking_mode_enabled类似字段,先关闭它试试,看能否绕过reasoning_content的强制要求。确认上游 API 版本。 不同版本对 thinking mode 要求可能不一样,以你使用的 API 文档为准。
如果确认就是reasoning_content丢失,解决方案有两个方向:修复上下文回传,或者关闭 thinking mode。
5.4 修复方式一:上下文回传时保留 reasoning_content
如果你需要保留 thinking mode,在客户端代码里必须把历史响应完整保存。下面是一个 Python 调试脚本示例,演示如何手动维护 messages 数组:
# 文件路径:scripts/chat.py import os import json import requests API_URL = "https://api.deepseek.com/v1/responses" API_KEY = os.getenv("DEEPSEEK_API_KEY") headers = { "Content-Type": "application/json", "Authorization": f"Bearer {API_KEY}", } def build_messages(history): messages = [{"role": "system", "content": "You are a coding assistant."}] for item in history: if item["role"] == "assistant": # 关键:同时保留 reasoning_content 和 content msg = { "role": "assistant", "content": item.get("content", ""), } if item.get("reasoning_content"): msg["reasoning_content"] = item["reasoning_content"] messages.append(msg) else: messages.append({ "role": item["role"], "content": item.get("content", ""), }) return messages def chat_once(history, new_prompt): messages = build_messages(history) messages.append({"role": "user", "content": new_prompt}) payload = { "model": "deepseek-v4-flash", "messages": messages, } resp = requests.post(API_URL, headers=headers, json=payload, timeout=60) print("HTTP 状态码:", resp.status_code) if resp.status_code != 200: print("返回内容:", resp.text) return None data = resp.json() # 解析时分别取出 reasoning_content 和 content choice = data.get("choices", [{}])[0] message = choice.get("message", {}) history_item = { "role": "assistant", "content": message.get("content", ""), "reasoning_content": message.get("reasoning_content", ""), } return history_item if __name__ == "__main__": history = [] while True: user_input = input("请输入问题(输入 exit 退出): ") if user_input.strip() == "exit": break result = chat_once(history, user_input) if result: history.append(result) print("\n助手回答: ", result["content"]) print("\n推理过程: ", result["reasoning_content"][:200], "...")这段代码的核心不是复杂,而是build_messages里做了两件事:
- 所有历史 assistant 消息都保留
reasoning_content; - 新问题追加在最后。
如果你在调试过程中发现上游 API 的返回结构不是choices[0].message,而是直接的message字段,请根据实际返回结构调整。
5.5 修复方式二:关闭 thinking mode
如果你的任务不需要推理过程,最简单的方式是关闭 thinking mode。具体参数名因 API 版本会略有不同,通常叫:
{ "thinking_mode": false }或者:
{ "thinking": {"type": "disabled"} }配置时可以先查询对应模型的参数说明。关闭后,API 不再要求回传reasoning_content,多轮对话的兼容性会明显提升,代价是模型在复杂推理场景下的表现可能会下降。
5.6 修复方式三:检查并切换可用模型名
报错里如果出现了以下提示,就说明模型名本身有问题:
the supported api model names are deepseek-v4-pro or deepseek-v4-flash或者:
there's an issue with the selected model (deepseek-v4-flash). it may not exist这种时候不用去改代码,先调用模型的列表接口:
curl -s https://api.deepseek.com/v1/models \ -H "Authorization: Bearer $DEEPSEEK_API_KEY"看一下返回里有哪些真正的模型名,然后修改配置里的model字段。有时候你写的是deepseek-v4-flash,但网关支持的可能是deepseek-4-flash或deepseek-chat变体,一字之差就会 400。
6. DeepSeek-V4-Flash、DeepSeek-V4-Pro 与 GLM5.2 的选型参考
前面解决完报错之后,很多读者可能还会纠结一个问题:我到底该选 flash 还是 pro?要不要切到 GLM5.2?
作为一个实际使用过的人,我分享一些相对主观但可复用的经验。
6.1 Flash 与 Pro 的主要差异
| 对比维度 | DeepSeek-V4-Flash | DeepSeek-V4-Pro |
|---|---|---|
| 定位 | 轻量、快速、低成本 | 复杂任务、更高准确性 |
| 适用场景 | 代码补全、格式化、简单问答 | 工程架构、复杂算法、长上下文分析 |
| 思考模式 | 支持,但推理长度一般较短 | 支持,推理长度更长,也更消耗 token |
| 多轮稳定性 | 需要正确回传 reasoning_content | 同样需要正确回传 reasoning_content |
如果你只是写一个小工具脚本、做代码快速生成,用 Flash 足够;如果是要分析一个大型项目的模块拆分和性能瓶颈,Pro 的结果会更可靠。
6.2 DeepSeek-V4-Flash 与 GLM5.2 写代码怎么选
这是一个很多开发者都会纠结的问题。我的经验是:
- 如果你更在意生成速度、API 成本和工具链兼容性,DeepSeek-V4-Flash 在 Antigravity CLI 这类本地代理环境下接入更顺滑,因为 deepseek 的推理接口风格和错误信息比较结构化,调试成本低。
- 如果你更在意中长代码片段的语义理解和一次性生成完整度,GLM5.2 在某些中文注释、业务代码风格上表现也不错。但要注意,切换模型不仅仅是改一个名字,还要确认你的 CLI 工具是否支持对应 provider 的特殊参数。
所以我的建议是:不要凭跑分选型,要拿着自己的真实代码样本去测。你可以把同一个 prompt 发给两个模型,对比:
- 第一次生成能否通过编译;
- 面对边界条件时是否考虑得足够细;
- 多轮修改后上下文是否还稳定;
- 平均响应延迟和 token 消耗。
6.3 多模型切换时的配置建议
在 Antigravity CLI 里配置多个模型,可以采用类似下面的配置结构:
provider: deepseek models: - name: deepseek-v4-flash thinking_mode: true - name: deepseek-v4-pro thinking_mode: true然后使用命令参数指定模型:
antigravity --provider deepseek --model deepseek-v4-flash --prompt "..." antigravity --provider deepseek --model deepseek-v4-pro --prompt "..."这样你就能在同一个 CLI 框架下做横向对比,而不需要维护两套独立的 API 调用代码。
7. 与 reasoning_content 相关的常见问题排查清单
为了方便你以后快速定位问题,我把这类场景下的常见问题整理成了表格:
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
| 第一次请求成功,后续请求全部 400 | messages 中 assistant 消息丢失 reasoning_content | 修改上下文组装逻辑,保留 reasoning_content |
| 关闭 thinking mode 后请求成功 | API 要求回传的字段与当前模式不匹配 | 在支持关闭 thinking mode 的模型参数里显式关闭 |
| 报错提示模型不存在 | 模型名与网关支持列表不一致 | 调用 /models 接口确认可用模型名 |
| 报错提示 provider 不支持 | Antigravity CLI 未识别 provider 配置 | 检查 provider 名称是否为 deepseek 的标准写法 |
| 请求返回成功但没有 content | reasoning_content 和 content 字段解析错误 | 打印完整 JSON,确认字段名 |
| 日志显示 local proxy failed | 本地代理在转发前就抛异常,不一定是上游问题 | 开启 debug 日志,查看请求构造阶段 |
排查时,优先打开 Debug 模式,大多数 CLI 工具都支持类似下面的参数:
antigravity --debug --model deepseek-v4-flash --prompt "你好"Debug 日志会打印出实际发出的请求体,这是治愈“不知道为什么 400”的最直接方法。
8. 最佳实践与工程建议
到这里,你的本地环境应该已经能稳定调起 DeepSeek-V4-Flash 了。不过从“能跑”到“能上生产”,中间还有不少工程细节要补。我挑选几个最容易踩坑的方向展开一下。
8.1 配置管理:不要把密钥写进配置文件
无论是 oh my pi 生成的 YAML,还是 Antigravity CLI 的全局配置,都不应该把 API Key 明文写入。推荐的路径是:
- 使用环境变量存储密钥;
- 配置文件中只保存
api_key_env这样的变量名; - 在团队协作时提供
.env.example,而不是.env; - 定期轮换密钥,不要在多个业务模块里共享同一个 Key。
8.2 异常处理:区分“上游错误”和“本地解析错误”
你看到类似cc switch local proxy failed的报错时,不要急着去改 API Key。先判断这个报错来自哪一层:
- 如果
upstream_status是 400,说明本地代理已经把请求发出去了,问题在上游参数; - 如果
upstream_status为空且日志显示 “failed to parse response”,问题更可能在本地解析逻辑; - 如果本地代理没有启动,通常会提示端口被占用或连接失败。
在生产环境里,建议把请求日志和响应日志分开存,并且记录每次请求的request_id,方便追溯。
8.3 上下文管理:防止上下文无限膨胀
reasoning_content通常比最终回答长很多。如果多轮对话把每一次 thinking 内容都塞回上下文,很快会超出 token 上限。
实际项目里可以这样处理:
- 只保留最近 N 轮的
reasoning_content; - 对
reasoning_content做截断或摘要; - 在不需要历史推理时,显式关闭 thinking mode;
- 设置对话长度上限,比如超过 2 万 token 时自动清理。
8.4 日志与监控
调用大模型 API 时,建议至少记录以下信息:
- 模型名;
- 请求耗时;
- 返回状态码;
- 输入 token 和输出 token;
- 是否有 thinking mode;
- 错误摘要。
这样当线上出现类似 400 错误时,你可以快速聚类,发现是某个模型、某个 prompt 模板、还是某个上下文处理逻辑出了问题。
8.5 安全边界:权限与审计
如果你在公司内网搭了一个 Antigravity CLI 代理,注意以下两点:
- 不要把本地代理端口绑定到
0.0.0.0,否则同一网络的其他机器也能直接调用你的接口,造成密钥盗用或额度消耗; - 对于敏感代码库,别把未脱敏的源码直接作为 prompt 发送到第三方模型 API。如果模型服务部署在私有环境,优先走私有化网关。
这类问题在 AI 辅助开发场景里越来越重要,不要等到审计复盘的时候才意识到。
9. 后续可以继续深入的方向
当你解决了reasoning_content问题,并且能用 Antigravity CLI 稳定调用 DeepSeek-V4-Flash 之后,后续的探索方向我建议按这几个顺序进行:
换一个 provider 试试。 把同样的流程换成 DeepSeek-V4-Pro 或 GLM5.2,体会不同模型对同一 prompt 的输出差异。
研究流式输出。 目前示例用的是非流式,实际交互式工具通常需要流式输出,你可以研究 SSE 协议字段如何拼接。
接入函数调用。 很多代码辅助场景需要模型调工具,DeepSeek 系列也支持 function calling,这块可以和 Antigravity CLI 的插件机制结合。
做一个本地多模型对比面板。 用 Python 脚本把多个模型的结果、耗时、token 消耗统一记录到 CSV,形成自己的模型选型数据。
深入理解 thinking mode 的计费与延迟。 如果你的业务对成本和响应时间敏感,可以对比开启和关闭 thinking mode 两次请求的 token 数变化。
给开源 CLI 工具提交修复。 如果你发现某个本地 CLI 工具在转发 DeepSeek 请求时丢掉了
reasoning_content,可以顺手提交一个 PR 修掉,这也是很好的开源参与方式。
我希望这篇文章不只帮你解决了当前报错,更让你理解了这类工具组合背后的工作模式:一个本地代理会如何转发请求,上游模型如何通过特殊字段管理上下文,以及我们在工程上应该如何设计配置和日志,才能让问题在出现时快速定位。
如果你正在配置过程中遇到类似的上游 400,不妨先把报文打印出来,确认一下reasoning_content有没有出现在历史 assistant 消息里。很多时候,问题并不复杂,只是细节藏得比较深。