Skip to main content
🐱煤球接入Deepseek

🐱煤球接入Deepseek

Jun 1, 2026
430words · 2minutes

Mood: Emo

AI summaryAI generated, for a quick overview

博客中的赛博小猫“煤球”由 Gemini 迁移至 DeepSeek。因后者使用 OpenAI 兼容接口,请求体、端点和鉴权均不同,需调整后端路由;同时修复 CMS 更新 AI 小猫配置时丢失 apiKey 和 baseUrl 的问题,在 config.py 中合并已有字段,并用 Vercel 环境变量管理密钥,避免明文暴露。

在此之前,煤球的模型是Gemini:

1. API 路由(核心请求入口)

my-blog-manager/app/api/chat/route.ts

这是小猫 AI 的后端路由,直接对接 Google Gemini API:

  • 第 13 行:从环境变量 GEMINI_API_KEY 或 OPENAI_API_KEY 读取密钥

  • 第 21-22 行:从 siteConfig.geminiConfig 读取模型 ID,构建请求 URL:

    https://generativelanguage.googleapis.com/v1beta/models/{modelId}:generateContent?key={apiKey}
  • 第 29-42 行:发送请求体,包含 system_instruction(猫设 prompt)、用户消息、generationConfig(token 上限、temperature)


2. API 配置(模型参数 + 猫设 Prompt)

geminiConfig: {
modelId: "",
systemPrompt: "",
maxOutputTokens: ,
temperature: ,
},

3. 前端调用方

  • my-blog-manager/components/CyberCat.tsx — 页面右下角的赛博小猫组件,handleFeed()和 handleChatSubmit()都向 /api/chat 发 POST 请求
  • my-blog-manager/components/settings/AICatSection.tsx — 后台设置页面,可修改 modelId、systemPrompt、temperature、maxOutputTokens,点”暂存至队列”写入 geminiConfig

‍

而接入Deepseek有两个需要注意的点:

‍

  • DeepSeek 用的是 OpenAI 兼容接口,跟 Gemini 的请求体结构完全不同:

  • 端点,鉴别权限都不相同

‍

此外:CMS 管理后台(Settings 页面 → AI 小猫配置)点「暂存至队列」并应用,会丢失 apiKey 和 baseUrl。

原因是 cms_core/api/config.py:178-185 的写入逻辑——前端只传 4 个字段:

{ modelId, systemPrompt, maxOutputTokens, temperature }

后端用正则直接把整个 geminiConfig 块替换掉,新增的 apiKey 和 baseUrl 不在前端传的字段里

‍

解决问题:在 config.py 的 update_site_config 里加一个合并逻辑 —— 更新 dict 之前先保留已有字段,缺少的 key 不被丢弃。不影响现有任何功能。

existing = {}
m = re.search(rf"{key}\s*:\s*\{{([\s\S]*?)\}}", content)
if m:
existing = parse_ts_dict(m.group(1))
merged = {**existing, **value}

不过!!!把 key 明文写在代码里相当于把房门钥匙贴在门上。🐖

所以我在在 Vercel Dashboard → Settings → Environment Variables 加入环境变量,这样就不用把API放在仓库里面

搞定!


Thanks for reading!

🐱煤球接入Deepseek

Jun 1, 2026
430 words · 2 minutes

Comments