加载中...

从零开始搭建 AI 环境


0x00 背景

这是一个 AI 横行的时代,但很多人对 AI 的认知仍停留在「打开 ChatGPT 一问一答聊天」这个层面。

大家都知道 AI 很强,也隐约感觉它应该能参与工作、学习和生活里的具体场景,但真要落到自己的电脑、自己的流程、自己的数据上,却往往不知道第一步该从哪里开始。

与此同时,各大媒体平台每天都在抛出一堆新名词:Claude、OpenCode、Agent、Skill、MCP、FastGPT、LLM、RAG、小龙虾……它们究竟是什么?能解决什么问题?彼此之间是什么关系?如果只靠自媒体或短视频来理解,最后大概率只会得到一锅夹生饭 —— 名词听过不少,原理一窍不通。

其实本质概念不多,大多数新概念只是某一层概念上的迭代。

本文将抛弃那些花里胡哨的东西,从零开始,把搭建 AI 环境这件事讲清楚,让不管是文科还是理科背景的同学,都能在自己的电脑上跑起来一套实用的 AI 工具链。

本文不是 OpenClaw/小龙虾 部署教学。在我看来,它只是一个被媒体包装出来的概念,一个不成熟、不安全、不可信的半成品。AI 发展太快,媒体又擅长放大个体被时代淘汰的焦虑,于是这只恰好被风口吹起来的「毒虾」就有了流量。但等你真正理解并搭建出自己的 AI 环境后,会发现所谓的小龙虾并没有什么神秘之处 —— 它不过是用这些工具临时拼出来的、粗制滥造的产物罢了。

0x10 先旨声明

从客观的技术现状来看,在大部分 AI 应用场景里,海外模型、工具链和生态成熟度仍然领先于国内。

这不是立场站队,而是工程事实:谁的模型能力更强、工具更稳定、生态更完整,谁就更值得学习使用。

因此,本文后续介绍的 AI 工具、模型服务和相关文档,很多都需要能够科学上网才能获取或使用。建议先参考《trojan 睁眼看世界教程》或通过其他方式,确保你的电脑可以访问境外网站。否则很多步骤会卡在下载、登录、鉴权或 API 调用上,后面的内容也就无从谈起。

我一直认为技术无国界,但技术优势从来不会自动流向落后者。别人掌握更好的工具、更强的模型和更完整的生态时,封锁与壁垒就是很自然的结果。与其被某些假爱国口嗨的自媒体道德绑架/遮蔽认知,不如脚踏实地去学、去用、去追赶 —— 「师夷长技以制夷」,才是今时今日的唯一出路。

0x20 基础环境安装

在开始部署 AI 环境之前,需要先安装两个基础环境:

  • Node.js: 用于运行部分 AI Agent 生态
  • Python3: AI 交互操作的万能粘合剂

0x30 AI 环境演进

乍看之下,这几年 AI 生态日益繁杂,但 AI 环境的本质,就一条从「本地入口」到「上游模型」的调用链。

截至目前,这个调用链大体经历了 4 个演进阶段:

阶段 架构变化 原因
本地 Agent 直连大模型 用户使用 AI 的最简单结构,链路短、理解成本低
引入大模型网关 上游模型越来越多,需要统一 Key、计费、模型名和接口协议
引入 cc-switch 不同 Agent 的配置方式不同,频繁切换模型和 Provider 很麻烦
引入 Skill 重复任务需要沉淀成可复用能力,减少随机输出和 Token 浪费

这四个阶段没有严格的时间线,而是 AI 从简单到复杂、从能用到好用的自然演进路径。

下文会按这个演进顺序展开:

  1. 先安装 Agent,让 AI 能在本地跑起来
  2. 再引入大模型网关,解决多模型接入问题
  3. 然后处理模型切换和配置管理
  4. 最后再谈 Skill,把重复任务沉淀成稳定能力

0x40 AI Agent

0x41 为什么是 Agent

在以 ChatGPT 为代表的网页对话式 AI 出现之后不久,大家很快就意识到一个问题:仅能网页对话的交互方式极大地限制了 AI 的真正能力。

网页对话交互适合问答和写作,但不适合深度参与本地工作流。而我们需要的是真正的工程化使用、让 AI 能读取本地项目上下文、调用本地工具,甚至直接修改代码和文件。

最早的本地调用方式是直接使用 OpenAI 这类供应商提供的 API 接口。大模型 API 的出现,意味着 AI 开始从「网页产品」进入「工程组件」阶段,可以被程序调用、集成和自动化。

但 API 本身并不适合普通用户。它要求用户理解接口、鉴权、请求参数、上下文管理和工具调用,大部分人还没开始用 AI 就被拦在门外了。

于是 Agent 出现了。

所谓的 Agent 可以理解为「用户(你)和大模型之间的操作入口」。它不仅是一个聊天窗口,而且是一个能读取上下文、调用工具、修改文件、执行命令,并把结果反馈给模型继续推理的本地执行器。

此时,只要本地安装一个 AI Agent,AI 就可以直接通过 Agent 参与本地工作。它不再只是回答问题,而是开始具备「动手能力」。

于是,为了抢占用户入口,各大模型供应商都先后推出自己的专用 Agent:

大模型 供应商 Agent 擅长处理场景
Claude Anthropic Claude Code 编码
Gemini Google Gemini CLI 视觉效果(图像等)
GPT OpenAI Codex 通用

为了便于初学者理解,本文从广义上认为 Agent = Claude Code / Gemini CLI / Codex / ...。实际上他们都是一个整合了 Agent + Skill + MCP 的 Harness 工程 … —— 详见文末的 FAQ

0x42 安装 Agent

前面提到的 Claude Code、Gemini CLI、Codex 等 Agent,都深度绑定了自家的模型生态,好处是毋须配置开箱即用。

如果只是体验某一家模型,这当然没问题。但真实工作场景往往更复杂:编码场景用 Claude,图像处理场景用 Gemini,通用场景用 GPT。而为了切换模型而切换 Agent,不仅操作成本高,还要不断重新交代项目背景和上下文,就有点低效了。

有没有一种 Agent,既能保留工作区和会话上下文,又能按场景自由切换不同模型?

有的,OpenCode 就是一个比较合适的选择。它是开源 Agent,不强制绑定某一家模型生态,也更适合作为个人 AI 环境的统一入口。

首先去官网下载并安装桌面版 OpenCode Desktop

装完后运行,你会得到这样的操作界面:

界面布局主要有三栏(如果没有就点一下右上角布局切换按钮):

  1. 左栏:选择工作区目录(Agent 默认可访问的本地目录),以及基于该工作区的会话列表
  2. 右栏:当前工作区的文件目录树
  3. 中栏:与 Agent 对话的操作窗口,底部可以切换 AI 大模型,这也是后续最常用的核心操作区

0x43 购买 AI 大模型

Agent 只是入口,现在希望 OpenCode 可以调用 DeepSeek 大模型,则需要在 DeepSeek 开放平台购买 API 调用额度。

首先注册并登录 DeepSeek 开放平台,充值 10 元即可:

然后进入 API Keys 页面创建一个 API Key 并保存好备用。

至此,你就拥有了调用 DeepSeek 大模型的使用资格。

注意 API Key 就是调用大模型的钥匙,不要泄露给任何人。别人拿到你的 Key,就可以直接消耗你的余额。

也别再纠结本地私有化部署大模型了。现在几乎所有好用的大模型都要付费,差别只是按量付费还是包月付费。私有化部署看似免费,实际性价比往往最低 … —— 详见文末 FAQ

0x44 配置 AI 大模型

购买模型额度之后,下一步就是把 DeepSeek 配置到 OpenCode 里。

回到 OpenCode,依次点击左下角的 设置 -> 供应商/Provider -> 查看更多供应商 -> 搜索 DeepSeek -> 输入前面创建的 API Key:

保存后,OpenCode 会通过这个 API Key 自动拉取 DeepSeek 支持的模型列表。

接着继续配置模型显示列表:依次点击 设置 -> 模型/Model -> 搜索 DeepSeek,筛选出 DeepSeek 模型。

点击模型后面的开关,可以控制该模型是否显示在界面底部的模型切换列表中:

不难注意到,DeepSeek 模型后面还有 Low、Medium、High、Max 这样的选项。它们对应的是推理强度 variant

  • Low:几乎不推理,直接输出,速度最快
  • Medium:适度推理,平衡速度与质量
  • High:深度推理,适合复杂逻辑
  • Max:最大推理预算,最慢但思考最充分

并不是所有模型都支持配置 variant,但对于支持的模型来说,它会直接影响推理质量、响应速度和费用。

一般情况下,推理强度越大,输出质量越高,但消耗的 输出 token 也越多,费用自然也更高。所以到底选择 Low、Medium 还是 Max,本质是在质量、速度、费用之间做取舍。

日常简单问答用 Low 或 Medium 就够了;涉及复杂代码分析、方案设计、长上下文推理时,再考虑 High 或 Max。

0x45 token 如何计费

这里插入一个所有人都关心的问题:AI 到底是怎么收费的?

在 DeepSeek 官方的 产品定价 页面,可以看到当前支持模型的计费信息:

deepseek-v4-flash 模型为例,价格表里通常会出现三类费用:

计费项 含义 单价
输入 token(缓存命中) 重复上下文被缓存复用 0.02 元 / 百万 tokens
输入 token(缓存未命中) 新输入的上下文内容 1 元 / 百万 tokens
输出 token 模型生成的回答内容,包含推理消耗 2 元 / 百万 tokens

最坏情况下,假设输入完全没有命中缓存,那么每百万 tokens 的成本大约就是:

输入 1 元 + 输出 2 元 = 3 元 / 百万 tokens

这里面隐含了两个影响费用的关键变量:

  • 推理强度 variant(烧钱):影响 AI 在生成最终回答之前的内部思考深度,这部分消耗通常会计入输出 tokens
  • 缓存命中 Cached(省钱):同一个会话中,历史上下文、固定提示词、长文档内容如果被复用,就可能命中缓存,从而降低输入成本

每百万 tokens 又是什么意思?

token 是模型处理文本的基本单位,可以理解为一段文字被拆分后的最小片段。

具体拆分方式取决于模型的分词算法(Tokenizer),例如:

  • 英文:1 个 token 大致接近 1 个单词或标点,例如 Hello, world! 可能被拆成 ["Hello", ",", "world", "!"]
  • 中文:1 个 token 大致接近 1-2 个汉字或词语,例如 你好,世界! 可能被拆成 ["你", "好", ",", "世界", "!"]

为了更形象地理解,可以粗略认为:100 万 tokens 大约相当于 50-80 万字中文文本,差不多是一本长篇小说的体量:

  • 《三国演义》约 64 万字
  • 《红楼梦》约 73 万字
  • 《西游记》约 82 万字
  • 《水浒传》约 96 万字

也就是说,在最坏计费情况下,你和 AI 合作处理一本《西游记》体量的文本,成本大概也就几块钱。

0x46 安装 CLI

OpenCode Desktop 已经足够普通用户使用了,但如果你是开发人员,最好再安装 CLI 版本。

原因很简单:桌面版适合可视化操作,CLI 更适合嵌入真实工作流。比如在项目目录里直接启动 Agent、配合终端执行命令、让 AI 读写当前工程文件,这些都是 CLI 更顺手。

最简单的安装方式,是直接让 OpenCode Desktop 帮你安装。在对话框里输入:

帮我安装 opencode 命令行

因为前面已经安装过 Node.js,所以 Desktop 本质上只是帮我们执行下面这条命令:

npm i -g opencode-ai

安装完成后,打开系统终端并输入 opencode,即可进入 OpenCode CLI:

CLI 的基本操作是:

  • 直接输入任意内容:和大模型对话
  • 输入 /models:切换大模型
  • 连续按下 Tab:切换 Agent 角色(默认只有 Plan / Build)
  • 输入 /exit:退出 CLI

Agent 角色默认只有 Plan / Build,可以粗略理解为任务拆解时的自动分工:Plan 负责分析和规划,Build 负责执行和修改。后续也可以通过安装 oh-my-openagent 扩展更多角色 … —— 详见文末 FAQ

0x47 配置 OpenCode

OpenCode CLI 的全局配置文件路径如下(如果不存在就手动创建):

  • 绝对路径:%USERPROFILE%/.config/opencode/opencode.json
  • 相对路径:~/.config/opencode/opencode.json

Desktop 和 CLI 共用同一份全局配置

最简单的 DeepSeek 配置如下:

{
  "$schema": "https://opencode.ai/config.json",
  "provider": {
    "deepseek": {
      "npm": "@ai-sdk/openai-compatible",
      "options": {
        "baseURL": "https://api.deepseek.com/v1",
        "apiKey": "sk-deepseek-api-key-xxx",
        "setCacheKey": true
      },
      "models": {
        "deepseek-v4-pro": {
          "name": "DeepSeek V4 Pro(按量|文本)"
        },
        "deepseek-v4-flash": {
          "name": "DeepSeek V4 Flash(按量|文本)"
        }
      }
    }
  }
}

其中几个关键配置项的含义如下:

配置项 说明
deepseek 自定义 Provider 名称,后续用它标识 DeepSeek
npm 使用 OpenAI 兼容协议适配器
baseURL DeepSeek API 地址:https://api.deepseek.com/v1
apiKey 在 DeepSeek 创建的 Key,例如 sk-deepseek-api-key-xxx
models 暴露给 OpenCode 使用的模型列表
setCacheKey 开启缓存 Key,有助于复用上下文缓存

这些配置信息都可以在模型供应商的官网找到(如 DeepSeek 在 产品定价 页面)。尤其注意不同平台的模型名经常会变,配置时应以官方文档为准。

初学者可能现在看不懂某些配置项,譬如 @ai-sdk/openai-compatible 是什么意思?但是没关系,先按照这个配置格式复制使用即可,后面我们介绍 cc-switch 时会详细说明。

配置好 opencode.json 后,重启 CLI / Desktop,OpenCode 就会自动重载配置。

到目前为止,我们已经完成了 第一阶段:安装本地 Agent,并让它直接调用大模型。

现在可以回到 Desktop,随便打开一个本地目录,然后选择 DeepSeek 大模型,让 AI 试着读取文件、修改文件、执行命令,感受一下 Agent 和网页聊天机器人的区别:它不是只会回答问题,而是已经开始具备本地操作能力。


0x50 大模型网关 new-api

前面介绍的是最简单的一条链路: Agent(OpenCode) 直连某个大模型供应商。

这条链路足以覆盖日常编码、写作、资料整理和简单自动化任务。但随着使用深入,你很快会发现单一模型不够用:有些任务 DeepSeek 性价比高,有些复杂编码更适合 Claude,有些通用问答或资料处理可能更适合 GPT / Gemini。

于是你开始购买多个模型服务,新的问题也随之出现:

  • 不同模型供应商的接口协议不同,Agent 需要分别适配
  • 模型名、版本、价格散落在各个平台,难以统一管理
  • 每个供应商都有自己的 API Key,配置和泄露风险都会变高

有没有办法屏蔽这些差异,把所有模型统一接入 OpenCode,然后按需切换?

有的,大模型网关就是为了解决这个问题而存在的。

大模型网关位于 Agent 和模型供应商之间。对外,它提供统一的 OpenAI 兼容接口;对内,它根据模型名称把请求路由到不同的上游供应商。

使用网关之后,OpenCode 只需要配置一个 Base URL 和一个网关 API Key。至于请求最终转发给 DeepSeek、OpenAI、Claude 还是 Gemini,交给网关处理即可。

0x51 部署

这里推荐使用 Docker 部署开源大模型网关 new-api

先到官网下载并安装 Docker Desktop

由于后面会在 new-api 中配置海外模型供应商,因此需要先处理 Docker 容器的网络代理。否则 new-api 在容器里启动了,但容器内部访问不了上游模型 API,最后还是会调用失败。

代理需在 Docker Desktop 设置。

依次选择 Settings -> Resources -> Proxies:

  • Docker Desktop proxy:主机代理,主要用于访问 DockerHub 镜像
  • Containers proxy:建议选择 Same as host proxy,让容器网络出口复用主机代理,也就是让后面部署的 new-api 容器可以正常访问境外模型服务

版本太旧的 Docker Desktop 可能没有 Containers proxy 配置项,建议直接升级。不要在这里硬刚网络问题,没意义。

然后到 GitHub 拉取 new-api 工程到本地,按项目文档使用 Docker 部署即可:

https://github.com/Calcium-Ion/new-api

不知道 Docker 怎么部署 new-api?你的 OpenCode 呢?问 AI 啦。既然都在搭 AI 环境了,这种细节就别再手搓了。

new-api 启动后,即可访问控制台(首次访问需要设置管理员账号和密码):

http://localhost:3000/console

0x52 配置

new-api 里的核心概念有三个:渠道、模型、令牌。

概念 作用
渠道 上游模型供应商,例如 DeepSeek / OpenAI / Claude
模型 对外暴露给 Agent 调用的模型名称
令牌 new-api 自己签发的 API Key,供 OpenCode 等 Agent 调用

第一步,进入「渠道管理」,添加上游真正的大模型服务供应商。

添加渠道时,只需要先配置带 * 的必填项:

  • 类型:从下拉框选择你购买的模型供应商
  • 名称:自定义名称,能看懂这是哪个渠道即可
  • 密钥:在模型供应商处创建的 API Key,后续由 new-api 代替 Agent 去调用上游模型
  • 模型:填写常用模型名称即可,不要贪多;模型名以供应商官方文档为准
  • 代理地址:如果前面已经配置了 Containers proxy,这里可以留空

如果没有配置 Containers proxy,这里就需要填写容器可达的代理地址。注意不能填 127.0.0.1,因为这是容器自己的回环地址,不是宿主机地址。你需要把本地代理暴露到局域网,再填写类似 http://192.168.x.x:端口 的地址。

第二步,进入「模型管理」,添加同名模型。

注意,「渠道管理」里填写的 模型 只是告诉 new-api 这个渠道支持哪些上游模型;它还不能直接被 Agent 调用。你还需要在「模型管理」里一一添加同名模型。

这里 名称匹配类型 选择 精确名称匹配。配置正确后,已绑定渠道 会自动关联对应渠道。之后 Agent 调用该模型名时,new-api 就会自动走这个渠道转发请求:

第三步,配置模型价格。

进入「系统设置」 -> 分组与模型定价设置 -> 价格设置,依次添加同名模型,并根据模型供应商的报价设置 输入价格,最后点击 应用更改

第四步,在「令牌管理」添加一个令牌,这就是 new-api 签发给 OpenCode 使用的 API Key:

到这里,new-api 的核心配置就完成了。

之后只要 OpenCode 使用 new-api 令牌调用某个模型,new-api 就会根据模型名找到绑定渠道,再由该渠道代理调用真正的大模型供应商。

0x53 对接

现在编辑 OpenCode 的配置文件 opencode.json

前面在 new-api 里配置了多个上游渠道,这里也对应配置多组 provider

{
  "$schema": "https://opencode.ai/config.json",
  "provider": {

    "deepseek": {
      "npm": "@ai-sdk/openai-compatible",
      "options": {
        "baseURL": "http://localhost:3000/v1",
        "apiKey": "sk-new-api-key-xxx",
        "setCacheKey": true
      },
      "models": {
        "deepseek-v4-pro": {
          "name": "DeepSeek V4 Pro(按量|文本)"
        },
        "deepseek-v4-flash": {
          "name": "DeepSeek V4 Flash(按量|文本)"
        }
      }
    },

    "openai": {
      "npm": "@ai-sdk/openai-compatible",
      "options": {
        "baseURL": "http://localhost:3000/v1",
        "apiKey": "sk-new-api-key-xxx",
        "setCacheKey": true
      },
      "models": {
        "gpt-5.4": {
          "name": "GPT 5.4(按量|文本)"
        }
      }
    },

    "codex": {
      "npm": "@ai-sdk/openai",
      "options": {
        "baseURL": "http://localhost:3000/v1",
        "apiKey": "sk-new-api-key-xxx",
        "setCacheKey": true
      },
      "models": {
        "gpt-5.5": {
          "name": "GPT 5.5(包月|文本)"
        }
      }
    },

    "anthropic": {
      "npm": "@ai-sdk/anthropic",
      "options": {
        "baseURL": "http://localhost:3000/v1",
        "apiKey": "sk-new-api-key-xxx",
        "setCacheKey": true
      },
      "models": {
        "claude-sonnet-4-6": {
          "name": "Claude Sonnet 4.6(按量|文本)"
        }
      }
    }
  }
}

细心的同学应该已经发现:这 4 组配置的 baseURLapiKey 完全一样,都是 new-api 的接入地址和令牌。

区别只在 provider 名称、适配器 npm 和暴露出来的 models 不同。

换句话说,现在 OpenCode 已经不需要分别直连 DeepSeek、OpenAI、Claude 这些上游供应商了,而是统一连接 new-api,由 new-api 再转发到真正的大模型服务:


0x60 cc-switch

上一章已经把大模型网关搭起来了,但新的问题也随之出现:opencode.json 变得越来越复杂。

单独配置一个 DeepSeek 还好,一旦接入 DeepSeek、OpenAI、Claude、Gemini 等多个渠道,每个渠道又有不同的 providernpmbaseURLapiKeymodels,非技术出身的同学想必越来越难理解复杂的 json 结构。

cc-switch 的出现就是为了解决这个问题的。

它可以把不同 Agent 的模型配置可视化管理起来,通过界面生成和维护 opencode.json,不需要每次都手写一大段 JSON。

0x61 安装

进入 cc-switch 的 GitHub 发布页,下载对应系统版本并安装即可:

https://github.com/farion1231/cc-switch/releases

初始状态下,cc-switch 顶部会显示一排支持的 Agent:

由于本文目前只安装了 OpenCode 一个 Agent ,因此可以先从左上角设置里隐藏暂时用不到的 Agent,避免界面干扰:

0x62 配置

下面以配置 OpenCode 为例。

先在 cc-switch 顶部选中 OpenCode,然后点击右上角的 + 添加模型供应商:

这里的界面,本质上就是把 opencode.json 里的每个配置项拆成表单字段。你从上到下依次填写,cc-switch 会在底部实时生成对应的 JSON 配置。

由于本文使用的是自己搭建的 new-api,所以 预设供应商 选择 自定义配置

图标供应商名称备注官网链接 都不会写入 opencode.json,它们只是 cc-switch 自己用来展示的关联信息,按个人喜好填写或留空都可以。

供应商标识 对应 opencode.json 里的 provider 名称,保持唯一即可。这里建议直接填写 new-api 中对应的渠道名,例如 deepseek

API key 对应 apiKey,这里填写 new-api 签发的令牌,例如 sk-new-api-key-xxx

Base URL 对应 baseURL,这里填写 new-api 的固定接入地址:http://localhost:3000/v1

接口格式 对应 npm,它决定 OpenCode 用哪一种协议适配器去请求模型。cc-switch 目前支持的格式如下:

接口格式 npm 包 端点
OpenAI Compatible @ai-sdk/openai-compatible /chat/completions
OpenAI Responses @ai-sdk/openai /responses
Anthropic @ai-sdk/anthropic /messages
Amazon Bedrock @ai-sdk/amazon-bedrock /model/{modelId}/converse
Google Gemini @ai-sdk/google /models/{model}:generateContent

为什么需要这个 npm 配置?根因是不同模型提供商的协议格式、请求路径、鉴权方式、请求体结构都不完全一样。npm 适配器的作用,就是把这些差异封装掉。

OpenAI Compatible 为例,适配器会把 baseURL 和端点拼成真正的请求路径:

http://localhost:3000/v1/chat/completions

然后再把 prompt 包装成标准请求体发送给大模型:

{
  "model": "gpt-5.5",
  "messages": [
    { "role": "user", "content": "用户输入的 prompt" }
  ]
}

这种格式就是经典的 ChatGPT 聊天模型的接口交互格式。

后来 OpenAI 又推出了更适合 Agent 工具调用场景的 OpenAI Responses 格式:

{
  "model": "gpt-5.5",
  "input": "用户输入的 prompt"
}

目前业界大多数模型服务都会兼容 OpenAI 协议,但 OpenAI 的竞争对手出于商业和生态考虑,也会维护自己的接口格式,所以才会看到 Anthropic、Amazon Bedrock、Google Gemini 这些不同选项。

DeepSeek 为了降低接入成本,直接兼容 OpenAI 协议。因此这里选择 OpenAI Compatible 即可。

额外选项 是适配器支持的附加参数,不确定含义时可以留空。一般建议加上 setCacheKey: true,让上下文尽量命中缓存,从而节省 token 成本。

模型配置 选择 new-api「模型管理」中已经绑定到当前渠道的模型即可。注意 模型 ID 必须与 new-api 里的模型名称完全一致;显示名称 只是给自己看的,按喜好填写即可。

完成前面的配置后,cc-switch 会实时生成一段 opencode.json 配置预览:

{
  "npm": "@ai-sdk/openai-compatible",
  "options": {
    "baseURL": "http://localhost:3000/v1",
    "apiKey": "sk-new-api-key-xxx",
    "setCacheKey": true
  },
  "models": {
    "deepseek-v4-pro": {
      "name": "DeepSeek V4 Pro(按量|文本)"
    },
    "deepseek-v4-flash": {
      "name": "DeepSeek V4 Flash(按量|文本)"
    }
  }
}

0x63 使用

确认配置无误后,点击 保存,返回模型渠道的供应商列表;然后再点击 添加,这组 Provider 配置就会追加到 opencode.json

最后重启 OpenCode,新的模型配置就会生效:

到这里,你应该已经理解到, cc-switch 并不实际参与到运行时调用链里。它更像是一个配置生成器和配置管理器,帮用户把复杂的 opencode.json 管起来。


0x70 AI Skill

前三个阶段解决的都是入口问题:让 AI 能在本地跑起来,能接入多个模型,能更方便地维护模型配置。

但随着使用深入,另一个更本质的问题会暴露出来:AI 在重复任务上缺乏积累

  • 同样是写博客文章,你每次都要提醒 Agent 使用 Markdown、Front Matter、十六进制章节编号、图片路径规范
  • 同样是代码审查,你每次都要提醒它检查 SQL 注入、XSS、SSRF、权限控制、硬编码密钥
  • 同样是写技术方案,你每次都要告诉它先写背景、目标、方案对比、安全考量、风险降级

这些规则不是模型不知道,而是它不会自动知道「你这里」应该怎么做。每次重新解释一遍,既浪费时间,也浪费 Token。

Skill 就是来解决这个问题的。

Skill 本质上是一份结构化的任务指令集,用来沉淀某类任务的目标、规则、约束、流程和参考材料。安装 Skill 后,Agent 在遇到对应任务时可以自动加载这份上下文,不需要你每次从零交代。

简而言之,Agent 解决「谁来干活」,Model 解决「脑子聪不聪明」,Skill 解决「这类活应该怎么干」。

0x71 Skill 结构

以 OpenCode 为例,一个 Skill 通常放在 ~/.config/opencode/skills/ 目录下。典型结构如下:

skills/
├── skill-name/
│   ├── SKILL.md      # 必选,Skill 定义文件
│   ├── references/   # 可选,长文档/规范/资料
│   ├── assets/       # 可选,图片/模板/示例文件
│   └── scripts/      # 可选,可执行脚本
│       └── check.sh

其中最关键的是 SKILL.md。它不是普通说明文档,而是给 Agent 读的任务说明书,通常需要包含:

模块 作用
Skill 名称 让 Agent 知道这个 Skill 是干什么的
触发场景 说明什么时候应该使用这个 Skill
工作流程 告诉 Agent 遇到任务后按什么步骤执行
约束规则 明确不能做什么、必须做什么
输出格式 规定最终结果应该长什么样
参考资料 必要时指向 references/ 里的长文档

Skill 最核心的设计是 渐进式披露: 它不是一开始就把所有资料都塞进上下文窗口,而是先让 Agent 读取 SKILL.md 里的概要规则;只有当任务确实需要更细的材料时,再继续读取 references/assets/scripts/

推荐观看这个教程更深入地学习 Skill 的原理和技巧:

0x72 使用 Skill

一开始不知道怎么写 Skill,建议先用别人已经写好的。

鹅厂已经在国内做了一个 SkillHub 镜像库:

https://skillhub.cn/

可以在里面搜索现成 Skill,下载后放到 OpenCode 的 skills 目录里使用。

但这里要注意:不要随便安装来路不明的 Skill

因为 Skill 不只是提示词,它还可能包含脚本、命令、工具调用说明,甚至诱导 Agent 执行危险操作。一个恶意 Skill 完全可以让 Agent 读取你的环境变量、扫描本地文件、上传敏感信息。

不要把 Skill 当成 Agent 的主题皮肤,它更像 Agent 的插件,而插件就有供应链投毒风险。

所以安装第三方 Skill 前,建议先安装一个专门用来检查 Skill 安全性的 Skill:

下载 skill-vetter 并解压到 ~/.config/opencode/skills/ 目录(需重启 OpenCode 以重载)。

它的作用是在安装第三方 Skill 前,主动检查其中是否存在危险指令、异常权限要求、可疑脚本和过度宽泛的触发条件。

以后准备安装新的 Skill 时,就可以像这样直接触发安全检查:

/skill-vetter 帮我审查这个 Skill 是否安全:

skill-vetter 预设了触发场景和触发词。一般情况下,只要你让 Agent 帮忙安装 Skill,它就会自动触发安全检查。

0x73 创建 Skill

当你在 SkillHub 上找不到合适的 Skill,或者找到了却不好用,就可以考虑自己创建或优化 Skill。

尤其是当你开始反复做同一类任务时,就更应该把它沉淀成自己的 Skill。

更进一步,如果某个动作已经足够标准化,就不要只停留在 Skill 指令层,而应该继续沉淀成 Skill 的 script

Skill 适合描述「该怎么做」,script 适合执行「固定动作」。前者负责流程和判断,后者负责稳定执行。把可重复、可验证、输入输出明确的步骤下沉成脚本,不仅能节省 Token,还能减少模型随机性。

所以一个成熟 Skill 更像工作流:SKILL.md 负责调度和规则,references/ 提供知识材料,scripts/ 执行标准动作。

如果不知道怎么写 Skill,可以安装一个专门创建 Skill 的 Skill:

下载 qiuzhi-skill-creator 并解压到 ~/.config/opencode/skills/ 目录(需重启 OpenCode 以重载)

99% 的 Skill 都不应该靠人工写,而应该让 AI 先生成,再由人审查和修正。

安装后可以直接在 OpenCode 像这样调用:

/qiuzhi-skill-creator 帮我创建一个用于写博客的 Skill

它会通过提问的方式帮你梳理:这个 Skill 解决什么问题、什么时候触发、应该遵守什么规则、输出格式是什么、需要哪些参考资料。

建议最开始不要急着设计 Skill。先让 AI 帮你解决一个具体问题,陪着它完整走一遍流程,等流程跑通后,再让 AI 把这套过程提炼成 Skill。先有实践经验,再抽象规则,这才是最合理的步骤。

0x80 总结

到这里为止,基础 AI 环境就从头到尾解释清楚了:

阶段 架构 解决的问题
Agent 让 AI 从网页聊天进入本地工作流
大模型网关 统一接入多个上游模型
cc-switch 降低多模型配置的理解和维护成本
Skill 把重复任务沉淀成可复用能力

很多人折腾 AI 环境时,只停留在「装了什么工具」「接了什么模型」这个层面。

但真正决定长期效率的,不是今天用了哪个模型,而是你有没有理解这条调用链的原理,有没有把自己的工作方式沉淀下来。

工具会过时,模型会换代,只有沉淀下来的知识和工作流,才是自己的核心价值和竞争力。

好比我开始写这篇文章的时候,整个圈子还在追捧 OpenClaw,仿佛每个人都必须装一只小龙虾。当时我就劝身边的人别装。待我写完这篇文章后,OpenClaw 的热度已经趋近于 0 了。恰恰应了那句话:海水退潮后,才知道谁在裸泳。


0xF0 FAQ

0xF1 什么是 Harness 工程

OpenCode 官方文档里提到它是一个 Harness 工程。这个词看起来很抽象,其实可以先粗暴理解成「整合器」。

它不是一个单纯的聊天窗口,也不是一个单纯的命令行工具,而是把 Agent、Skill、MCP 这些能力打包到一起,给用户提供一个能直接使用的 AI 工作环境。

打个比方:如果把 AI 环境比作一台电脑,那么:

组件 作用 类比
Agent 操作入口,负责理解任务、调用模型、执行动作 使用电脑的人
Skill 任务说明书,告诉 Agent 某类任务应该怎么做 操作手册 / SOP
MCP 工具连接协议,让 Agent 能访问外部系统 USB 接口 / 驱动程序
Harness 把这些东西整合起来的运行环境 整台电脑

所以 Harness 工程的重点不是「某一个功能特别强」,而是 把一堆分散能力组合成一个可用系统

如果没有 Harness,你可能需要自己分别处理:怎么和模型对话、怎么管理 Skill、怎么接 MCP、怎么读写文件、怎么执行命令。OpenCode 直接把这些能力整合好,你打开就能用。

再换个更日常的类比:Chrome 也可以看成一个 Harness。它不是只有一个网页渲染功能,而是整合了标签页、书签、V8 引擎、扩展系统、Web API。你不需要分别安装这些东西,打开 Chrome 就全有了。

OpenCode 也是这个思路:把 AI Agent 所需的关键能力整合在一起,让你不用从零拼装。

0xF2 Agent 与 Skill 与 MCP 的关系

这三个概念最容易混在一起。直接给结论:

概念 解决的问题 一句话理解
Agent 谁来执行任务 干活的人
Skill 任务应该怎么做 操作手册
MCP 怎么连接外部工具和数据 工具接口
  1. MCP 解决连接性问题: MCP 的职责是让 Agent 能够连接外部世界,比如文件系统、数据库、浏览器、GitHub、API 服务。它回答的是「能不能访问」「怎么调用」的问题。
  2. Skill 解决能力问题: Skill 的职责是提供领域知识、操作流程和最佳实践。它回答的是「拿到工具后应该怎么做」的问题。比如同样是访问数据库,MCP 只负责让 Agent 能查库;Skill 才会告诉它怎么写安全 SQL、怎么理解业务指标、怎么输出分析结论。
  3. Skill 和 MCP 不是竞争关系,而是分层关系: MCP 像工具接口,Skill 像操作手册。一个负责「够得着」,一个负责「用得对」。真正好用的 Agent 往往是两者结合:Skill 负责拆解任务和提供方法论,MCP 负责执行具体工具调用。

用代码审查举例:

用户:审查这个项目的安全问题

Agent:理解任务,决定要做安全审查
Skill:加载安全审查规则,知道要检查 SQL 注入、XSS、SSRF、硬编码密钥、权限绕过
MCP:提供文件读取、搜索、命令执行等工具接口
Agent:按 Skill 的流程调用 MCP 工具,最后输出审查报告

没有 Agent,没人调度;没有 Skill,Agent 不知道审什么;没有 MCP,Agent 只能纸上谈兵,碰不到真实文件和系统。

这就是三者的关系。

参考文章《Agent Skills 与 MCP:智能体能力扩展的两种范式

0xF3 为什么不推荐个人私有化部署大模型

很多人觉得「大模型能本地跑就免费了,何必买 API」,这个想法坑过不少人。根因是只看到了 API 账单,没看到本地部署的隐性成本。

成本 说明
输出质量 小模型能跑不等于好用,很多复杂推理、长上下文、代码任务最后还是要回到云端强模型
硬件成本 能流畅运行 7B 模型的 GPU 至少需要 8GB 显存,70B 模型需要 80GB+ 显存;一张显卡动辄大几千,够个人 API 用很久
性能差距 本地开源模型和云端顶级商用模型不是一个量级,Claude、GPT、DeepSeek 顶级版本本地基本跑不动
维护成本 本地部署需要自己处理模型文件、推理框架、CUDA、显卡驱动、依赖版本和升级兼容
电力成本 GPU 满载功耗两三百瓦,长时间运行的电费和噪音都不是 0

可能适合个人本地部署的场景:数据敏感且必须离线,或者你纯粹想学习模型部署和推理原理。

否则,买 API 才是最务实的选择。

0xF4 new-api 怎么配置 CodeX 渠道

new-api 大多数渠道都是填写 API Key 即可,但 CodeX 比较特殊:它走的是个人 OAuth 授权,不是传统 API Key。

原因是 CodeX 和 ChatGPT 订阅体系打通,new-api 需要拿到你的 ChatGPT 授权令牌,才能代替你去调用对应能力。

配置流程如下。

首先在渠道配置页面,找到密钥配置区域下方的 CodeX 授权 按钮:

在弹出的窗口中点击 打开授权页面

此时会打开 ChatGPT 登录页面。登录的账号就是你已经订阅 ChatGPT / CodeX 的账号:

登录成功后,浏览器会跳转到一个无法访问的本地回调地址,格式大概如下:

http://localhost:1455/auth/callback?code=xxxxxx&scope=openid+profile+email+offline_access&state=xxxxxx

这不是报错,而是 OAuth 授权流程的一部分。把这个完整地址复制回 new-api,点击 生成并填入 按钮:

创建 CodeX 渠道后,可以点击 测试 旁边的下拉箭头打开测试面板。

CodeX 支持两种测试模式:

  • OpenAI Responses 流式:边生成边返回,适合正常对话和 Agent 调用
  • OpenAI Responses Compaction 非流式:一次性返回结果,适合某些压缩或整理类请求

注意:CodeX 通常只能使用当前 ChatGPT 订阅可用的最新模型,例如当前账号可用的是 GPT 5.5,那么 new-api 侧也只能走对应模型能力。

测试通过,就说明 CodeX 渠道配置成功。

另外,CodeX 虽然共享了 ChatGPT 的包月订阅,但并不是无限使用,它采用的是短周期时间窗口的额度池模式。

可以到下面这个页面查看当前窗口的剩余额度:

https://chatgpt.com/codex/cloud/settings/analytics#usage

0xF5 new-api 非自用怎么计费

new-api 不只是个人中转工具,它本身也支持多人使用和运营计费。因此它签发的令牌,可以面向不同用户、不同场景设置额度。

若要开启令牌计费模式,需进入「系统设置」 -> 运营设置 -> 自动模式,关闭开关并点击 保存通用设置

然后在「兑换码管理」中添加不同额度的兑换码:

再到「钱包管理」中使用兑换码为令牌充值:

这样就形成了一套最基本的用户计费闭环。

如果要做成真正面向用户的系统,还可以基于 new-api 接口文档 串联注册、充值、发放令牌、消费统计等流程。

0xF6 prompt 怎么输入图片

使用过程中,你可能会发现 OpenCode 无法识别图片:

这个问题的根因通常不在 OpenCode,而在模型能力。

不是所有模型都能看图。文本模型只能处理文字;多模态模型才能同时处理文字和图片。比如 DeepSeek 大多数模型主要是文本模型,而 GPT / Gemini / Claude 的部分模型支持视觉输入。

所以排查顺序应该是:

  1. 先确认当前模型是否支持多模态输入
  2. 再确认 OpenCode 配置里是否声明了图片输入能力
  3. 最后再测试图片是否能被正确传给模型

除了模型本身要支持视觉输入之外,还需要在 opencode.json 中打开模型的多模态声明。

用 cc-switch 配置时,可以这样操作:

  1. 编辑模型配置,点击右侧 + 添加 模型属性
  2. 新增属性 modalities
  3. 设置属性值为:
{"input":["text","image"],"output":["text"]}

其含义是:该模型输入支持文本和图像,输出支持文本。

配置完成后再测试图片识别:

如果这时能正确识别图片内容,就说明识图链路打通了。

0xF7 一人成团:Oh-My-OpenAgent

OpenCode 默认只有 Plan / Build 两个基础角色,可以粗略理解为:

  • Plan:负责分析问题、拆解任务、制定方案
  • Build:负责执行方案、修改文件、运行命令

对于简单任务,这两个角色已经够用。但如果你希望 AI 像一个小团队一样分工协作,就可以考虑安装 Oh-My-OpenAgent

Oh-My-OpenAgent 的定位不是普通 Skill,而是一个多 Agent 编排 Harness。它会给 OpenCode 扩展一组专业角色,让不同任务交给不同 Agent 处理。

根据官方说明,它提供了多类专业 Agent,例如:

Agent 作用
Sisyphus 主协调者,负责理解意图、拆解任务、调度其他 Agent
Prometheus 规划者,适合需求不清晰、需要先制定方案的任务
Oracle 架构 / Debug 顾问,适合复杂设计和疑难问题
Librarian 文档和开源代码检索,适合查库、查 API、查最佳实践
Explore 代码库搜索,适合快速理解项目结构和已有实现
Multimodal Looker 图片 / PDF 等多模态内容分析
Sisyphus-Junior 分类执行器,根据任务类型执行具体修改

它的本质是把「一个 AI 干所有事」变成「多个专业 AI 分工协作」。

比如你让它改一个复杂功能,它可能会先让 Planner 分析需求,再让 Explore 查项目结构,让 Librarian 查外部文档,让 Build 类 Agent 执行修改,最后再做验证。这个体验就很像一个人带着一支虚拟小队干活。

安装方法也很简单,让 OpenCode 帮你装就好啦 ~

甚至还可以让 AI 直接为不同的角色分配不同的模型:

任务层级 模型 Agent 角色
编码任务 codex/gpt-5.5 hephaestus, atlas, visual-engineering
复杂任务 deepseek/deepseek-v4-pro sisyphus, oracle, prometheus, momus, metis, deep, ultrabrain, unspecified-high
简单任务 deepseek/deepseek-v4-flash librarian, explore, sisyphus-junior, multimodal-looker, quick, writing, artistry, unspecified-low

最终得到配置 ~/.config/opencode/oh-my-openagent.json

{
  "$schema": "https://raw.githubusercontent.com/code-yeongyu/oh-my-opencode/dev/assets/oh-my-opencode.schema.json",
  "agents": {
    "sisyphus": {
      "model": "deepseek/deepseek-v4-pro"
    },
    "hephaestus": {
      "model": "codex/gpt-5.5"
    },
    "oracle": {
      "model": "deepseek/deepseek-v4-pro"
    },
    "prometheus": {
      "model": "deepseek/deepseek-v4-pro"
    },
    "atlas": {
      "model": "codex/gpt-5.5"
    },
    "momus": {
      "model": "deepseek/deepseek-v4-pro"
    },
    "metis": {
      "model": "deepseek/deepseek-v4-pro"
    },
    "librarian": {
      "model": "deepseek/deepseek-v4-flash"
    },
    "explore": {
      "model": "deepseek/deepseek-v4-flash"
    },
    "sisyphus-junior": {
      "model": "deepseek/deepseek-v4-flash"
    },
    "multimodal-looker": {
      "model": "deepseek/deepseek-v4-flash"
    }
  },
  "categories": {
    "quick": {
      "model": "deepseek/deepseek-v4-flash"
    },
    "unspecified-low": {
      "model": "deepseek/deepseek-v4-flash"
    },
    "unspecified-high": {
      "model": "deepseek/deepseek-v4-pro"
    },
    "deep": {
      "model": "deepseek/deepseek-v4-pro"
    },
    "ultrabrain": {
      "model": "deepseek/deepseek-v4-pro"
    },
    "visual-engineering": {
      "model": "codex/gpt-5.5"
    },
    "writing": {
      "model": "deepseek/deepseek-v4-flash"
    },
    "artistry": {
      "model": "deepseek/deepseek-v4-flash"
    }
  }
}

文章作者: EXP
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 EXP !
 本篇
从零开始搭建 AI 环境 从零开始搭建 AI 环境
从 AI 工具链的基本认知出发,梳理 Agent、模型网关、模型切换与 Skill 的演进关系,并从基础依赖开始搭建一套可用、可理解、可继续扩展的本地 AI 环境。
2026-05-05
下一篇 
如何使用 AI 一键规划旅行行程 如何使用 AI 一键规划旅行行程
春节带家人自由行,最怕的不是人多,是“没攻略还订不到房”。用 AI 一条提示词出攻略,一键导入手机随时打开,地图路线行程预算清清楚楚,从此旅行再也不用担心迷路了呢 ~
2026-01-02
  目录