欢迎光临
我们一直在努力

ModelScope免费算力_opencode接入本地大模型

opencode接入本地大模型实录:Qwen3-32B当编程助手

作者: 杨显钊 版本: 1.0 日期: 2026年8月24日 标签: opencode、Qwen3、ROCm、大模型部署、AI编程助手 适合人群: 想 zero 订阅费、用自部署开源模型驱动 AI 编程助手的开发者 前篇: 篇一《白嫖192G显存GPU!ModelScope三种免费算力一篇讲清》、篇二《在AMD GPU上部署Qwen3-32B:30行代码搭好推理服务》


摘要

篇一领到了 ModelScope 免费 AMD GPU(192G 显存),篇二把 Qwen3-32B 跑成了服务。这篇解决最后一环:让 opencode 接上这台自部署模型,当免费的编程助手。接入关键两步——把 opencode 装到模型同一台机器上解决可达性;把后端从 30 行简易服务换成支持完整 OpenAI API(含 tool calling)的 transformers serve。最终实测:opencode 1.18.21 在 DSW 里用 Qwen3-32B 正常问答,一轮 8.0 秒,花费 $0.00——没有订阅、没有 API key,整条链路都在自己机器上。途中两个小坑(npm 包名 404、实例重启后服务失忆)均附真实日志。


一、前言:接入要过两道关

opencode 是终端里的 AI 编程助手,默认要订阅各家云端模型。而它本质上只要求后端** OpenAI 兼容**——这就给了自部署模型机会。但接入前有两条硬门槛:

  • 可达性:opencode 装在本机的话,够不着 DSW 内网里的 18000 端口。解法最简单也最彻底——把 opencode 装到 DSW 上,走 127.0.0.1
  • tool calling:opencode 的 agent 靠 tools 参数驱动(读文件、跑命令全靠它)。篇二那 30 行服务不解析 tools,接上也"只会说不会做"
  • 所以这篇做两件事:换一个完整后端,然后把 opencode 落到这台机器上。先看最终效果:

    一句"你好",8.0 秒回应;右侧面板 $0.00 spent、上下文 7,620 tokens 只用了 6%。下面按真实顺序复现。


    二、换后端:transformers serve 接管 18000

    2.1 为什么是它

    停掉篇二的 30 行服务前,先看 transformers 5.x 自带 serve 的家底(transformers serve –help 摘录):

    Run a FastAPI server to serve models on-demand with an OpenAI compatible API.

    Endpoints:
    POST /v1/chat/completions — Chat completions (streaming + non-streaming).
    POST /v1/completions — Legacy text completions from a prompt.
    GET /v1/models — Lists available models.

    Options:
    –continuous-batching / –no-continuous-batching
    –attn-implementation TEXT (e.g. flash_attention_2)
    –reasoning [on|off|auto] (Qwen3 等推理模型适用)
    –dtype TEXT / –device TEXT

    OpenAI 兼容、流式、continuous batching、flash attention、推理开关全有——正是 opencode 需要的完整后端,而且零新增大依赖:

    pip install "transformers[serving]" -i https://mirrors.aliyun.com/pypi/simple/

    2.2 启动

    nohup transformers serve /mnt/data/models/Qwen3-32B \\
    –device cuda:0 –dtype bfloat16 \\
    –attn-implementation flash_attention_2 \\
    –reasoning off \\
    –host 0.0.0.0 –port 18000 \\
    > /mnt/data/serve2.log 2>&1 &

    –reasoning off 对编程助手场景很重要:不让模型把 token 烧在思考链上。

    2.3 坑一:模型 ID 被钉死成路径

    验证时随手写了 "model": "Qwen3-32B",被服务端当场纠正:

    {"detail":"Server is pinned to '/mnt/data/models/Qwen3-32B'; requested 'Qwen3-32B'."}

    传了位置参数(FORCE_MODEL)后,服务端只认模型路径这个 ID。后面 opencode 配置里的 model id 也因此必须写全路径,这是下文配置的伏笔。

    2.4 tool calling 验证(opencode 的命门)

    curl -s http://127.0.0.1:18000/v1/chat/completions -H "Content-Type: application/json" -d '{
    "model": "/mnt/data/models/Qwen3-32B",
    "messages": [{"role":"user","content":"查一下现在几点"}],
    "tools": [{"type":"function","function":{"name":"get_time","description":"获取当前时间","parameters":{"type":"object","properties":{}}}}]
    }'

    真实返回(节选):

    {"choices":[{"finish_reason":"tool_calls",
    "message":{"role":"assistant",
    "tool_calls":[{"function":{"arguments":"{}","name":"get_time"},"type":"function"}]}}]}

    finish_reason: tool_calls、结构化 tool_calls 数组齐全——模型会把工具调用以 OpenAI 格式吐回来,工具链路成立,opencode 可以接管执行。

    2.5 坑二:/v1/models 返回 500,别慌

    Internal Server Error

    这个端点在该版本下会崩,但 opencode(及所有 ai-sdk 系客户端)只调 chat completions,从不调 /v1/models。确认 chat 接口正常后即可无视。


    三、安装 opencode:落到持久盘

    3.1 环境

    DSW 镜像自带 Node,不用折腾:

    node v22.22.3
    npm 10.9.8

    3.2 坑三:npm 包名 404

    第一发按"惯例"猜了个 scoped 包名,直接 404:

    npm error 404 Not Found – GET https://registry.npmjs.org/@opencode-ai%2fopencode
    npm error 404 '@opencode-ai/opencode@*' is not in this registry.

    opencode 的 npm 包名就是朴素的 opencode-ai(没有 scope)。改正后装到数据盘:

    npm install -g opencode-ai –prefix /mnt/data/opencode –registry https://registry.npmmirror.com
    echo 'export PATH=/mnt/data/opencode/bin:$PATH' > /mnt/data/env.sh
    source /mnt/data/env.sh
    opencode –version # 1.18.21

    3.3 为什么全往 /mnt/data 塞

    DSW 的根盘是容器 rootfs,实例释放即清零;/mnt/data 和 /mnt/workspace 是 1P 的 NAS 数据盘,持久保留。模型、opencode 本体、配置、日志全放持久盘,重建实例后 source /mnt/data/env.sh 就能继续干活。


    四、配置:项目级 opencode.json

    配置不放 ~/.config(在临时根盘上),用项目级 opencode.json 放 NAS 里——opencode 会从 cwd 向上自动找:

    cat > /mnt/workspace/opencode.json <<'EOF'
    {
    "$schema": "https://opencode.ai/config.json",
    "model": "dsw-qwen3//mnt/data/models/Qwen3-32B",
    "provider": {
    "dsw-qwen3": {
    "npm": "@ai-sdk/openai-compatible",
    "name": "DSW Qwen3-32B",
    "options": { "baseURL": "http://127.0.0.1:18000/v1", "apiKey": "sk-local" },
    "models": {
    "/mnt/data/models/Qwen3-32B": {
    "name": "Qwen3-32B",
    "limit": { "context": 131072, "output": 8192 }
    }
    }
    }
    }
    }
    EOF

    三个关键点:

    • npm: "@ai-sdk/openai-compatible":opencode 接任意 OpenAI 兼容端点的官方姿势,baseURL 指向本机 18000
    • model id 写全路径:呼应 2.3 的 pinned 规则;models 的键和顶层 model 里 provider 斜杠后的部分都必须是 /mnt/data/models/Qwen3-32B(于是出现 dsw-qwen3//mnt/… 的双斜杠形态,属正常)
    • apiKey: "sk-local":服务端不校验,随便填一个非空值即可

    cd /mnt/workspace && opencode


    五、实测:$0.00 的编程助手

    进 TUI 先发了句"你好",8.0 秒得到回应(见文首截图):

    • 回答区下方标注 Build · Qwen3-32B · 8.0s——模型标识和耗时一目了然
    • 右侧 Context 面板:7,620 tokens / 6% used / $0.00 spent
    • 左侧文件浏览器里 opencode.json、serve.py、serve2.log 同框,全是这套链路的零件

    再发"列出当前目录下的文件",opencode 会真实调用工具执行并回显结果——工具链路从 curl 验证走到了真实 agent 使用。192G 显存跑 32B 单流,对话体感流畅;要让它写代码改文件,也就是接着聊的事。


    六、坑四:实例重启后的"失忆"

    DSW 实例重启后进 opencode 提问,出现过不回答、也不报错的灵异现场。真相不灵异:

  • nohup 起的 serve 不跨实例重启——端口上根本没服务,请求 hang 在连接层
  • 即便服务起了,NAS 冷读权重要约 14 分钟,加载完成前所有请求同样 hang 住
  • 恢复就是重走老流程:

    source /mnt/data/env.sh
    nohup transformers serve /mnt/data/models/Qwen3-32B \\
    –device cuda:0 –dtype bfloat16 \\
    –attn-implementation flash_attention_2 \\
    –reasoning off \\
    –host 0.0.0.0 –port 18000 \\
    > /mnt/data/serve2.log 2>&1 &
    tail -f /mnt/data/serve2.log # 等加载进度条走完再问 opencode

    怕麻烦可以把这几行存成 /mnt/data/start.sh,重启后一条命令恢复。


    七、总结

    整条链路长这样:

    渲染错误: Mermaid 渲染失败: Parse error on line 2: …I] –>|OpenAI 兼容协议| B[@ai-sdk/openai-com ———————–^ Expecting 'AMP', 'COLON', 'DOWN', 'DEFAULT', 'NUM', 'COMMA', 'NODE_STRING', 'BRKT', 'MINUS', 'MULT', 'UNICODE_TEXT', got 'LINK_ID'

    • 两道门槛:可达性靠"opencode 装到模型同机",tool calling 靠换 transformers serve 完整后端
    • 四个坑:模型 ID 钉死路径、/v1/models 500 可无视、npm 包名是 opencode-ai 而非 scoped 名、实例重启后服务失忆
    • 持久化:opencode 本体(–prefix)、项目配置、模型全落 NAS,重启一条 source 复活
    • 账单:$0.00。免费算力 + 开源模型 + 开源助手,三件套闭环

    下一篇可以聊聊在这套环境里真刀真枪用 opencode 写代码的体验与调优(continuous batching、并发、更长上下文),感兴趣就催更。

    赞(0)
    未经允许不得转载:171主机测评 » ModelScope免费算力_opencode接入本地大模型
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址