乐于分享
好东西不私藏

本地 4B 小模型也能跑 AI 编程助手?SmallCode 两天 488星,我跑了一遍

本地 4B 小模型也能跑 AI 编程助手?SmallCode 两天 488星,我跑了一遍

一个想法

以前聊 AI 编程,绕不开 Claude、GPT-4 这些大模型。API 贵,数据还要往外送。

我有个朋友,公司代码敏感,什么 AI 工具都不让用。他想搞个本地编程助手,试了一圈都不行——Codex 要 128k 上下文,OpenCode 调一次 Claude 几十美分,Cursor 便宜但也不让走本地。

这事我以前也觉得无解,直到刷到了 SmallCode。

这项目今年 5 月刚发,两天 488⭐,设计思路很有意思——不是给 Claude/GPT-4 用的,是给 7B-20B 小模型用的。你甚至可以用一个 4B 的小模型跑出 87% 的基准成绩。我跑了一遍,写了这篇东西。

第一步:安装和配置

安装很简单,一行命令:

npm install -g smallcode

然后在项目根目录建一个 .env 文件:

SMALLCODE_MODEL=qwen2.5-coder-7b-instructSMALLCODE_BASE_URL=http://localhost:1234/v1

这是给 LM Studio / Ollama 用的。你跑哪个模型就填哪个名字。如果本地模型搞不定,还能配一个云模型做后备:

可选:本地不行时自动切到云

ANTHROPIC_API_KEY=sk-ant-…OPENAI_API_KEY=sk-…

后备机制是 opt-in 的,不配 key 就不会联网。代码完全本地跑。

试跑:

cd my-projectsmallcode

一个 TUI 界面就启动了,命令行交互,对,就是那种终端里干活的风格。

第二步:理解它的核心设计

翻完文档我觉得,SmallCode 最聪明的地方不是功能多,而是知道自家模型不行

大模型编程助手假设你用的是 Claude Sonnet 4 级别——128k 上下文,JSON 输出稳定,全量文件读写无压力。

SmallCode 做了完全相反的假设:我的模型可能只有 8k 上下文,输出会乱,文件写不全。

所以它做了几件事:

上下文预算引擎

模型上下文只有 8k-16k,SmallCode 就自动压缩。大文件只保留函数签名,旧消息被驱逐,实时追踪 token 用量。

宽容的工具调用解析器

小模型输出乱七八糟。SmallCode 能从 JSON、YAML、XML、纯文本里解析出工具调用。参数名写错了?自动修复。类型不对?自动转换。不像前沿模型那么精准,但经得起折腾。

TODO 驱动规划

复杂任务不会一次丢给模型让它自己发挥。SmallCode 先把任务拆成原子步骤写到一个 TODO 文件里,模型每轮读 TODO 文件确认自己在哪步。每步做完都会 lint/编译验证,没过就不往下走。

Patch 优先的编辑策略

这是我最认同的一点。大模型项目喜欢全量文件写入——模型生成整个文件内容,直接覆盖。小模型做不到,生成 500 行的文件,写到后面就记不住前面的,不是截断就是跑偏。

SmallCode 用搜索替换(patch)作为主要编辑方式。只改需要改动的地方,Context 更省,结果更可靠。

第三步:动手跑一个 Express API 生成

SmallCode 内置了一个叫 BoneScript 的东西。写一个 .bone 文件,编译成完整项目——路由、认证、数据库、事件、迁移、SDK、管理后台、Docker、CI,一套全出。

我试了一下,新建一个 api.bone:

api Userfields: name email passwordroutes: crudauth: jwtdatabase: sqlite

就这五行,然后:

smallcode

SmallCode 识别到 .bone 文件,调起编译流程。如果是用本地小模型跑,它会走 TODO 分解流程:先读文件 → 理解结构 → 生成路由 → 写数据库层 → 加认证 → 验证编译。

对比手动写,这个调用链能从 8-15 次工具调用压缩到 1-2 次,在小模型上可靠性提升很大。

另一个场景:我有一个老项目的代码生成太慢,SmallCode 的 graph_search 和 explain_symbol 工具可以快速定位跨文件调用链,不用自己翻几十个文件。

第四步:三个实战场景

场景 1:给 Vue 项目加一个组件

假设你要在现有的 Vue3 项目里加一个数据表格组件,带筛选和导出:

路径:/my-admin-app模型:qwen2.5-coder-7b-instruct

在 SmallCode 终端输入:

给 /src/components/ 创建一个用户管理表格组件,包含搜索、分页、导出 CSV。用 Element Plus 的 el-table。

SmallCode 会先 graph_search 扫描项目结构,理解现有代码风格,然后生成组件代码,调用 patch 写入,最后检查编译。

场景 2:修复一个 bug

传统的做法:报错日志贴到 ChatGPT → 它给你一段代码 → 你手动改 → 可能引入新问题。

SmallCode 的做法:

read_file src/utils/parser.js → 看代码 → bash ‘node src/test/parser.test.js’ → 看报错 → 定位问题在第 45 行的正则 → patch 修复 → 重新跑测试 → 通过

整个过程模型控制,你只需要在 TUI 里看日志就行。

场景 3:本地小模型 + 云模型混合

小模型大部分场景都够用,但有时候就是搞不定。SmallCode 有一个 escalation 机制:

SMALLCODE_ESCALATE_ON_HARD_FAIL=true

当本地模型重试 + 分解后仍然失败,自动升级到配置的云模型。只解决这一个难点,不会整个流程切到云。会话级别限制,防止费用失控。

支持的云模型名单:Claude Sonnet 4.5/4.6、Haiku 4.5、GPT-5.4 Mini/Nano、DeepSeek V4。

第五步:进阶扩展

自定义技能

写一个 .smallcode/skills/vue-component.md:

Vue 组件创建规范

  • 使用 Composition API + script setup
  • 样式用 scoped,不用全局
  • Props 必须写类型和默认值
  • 事件用 emit,不直接修改父组件数据

以后创建 Vue 组件时,模型会自动加载这个技能文件。

Model Profile

不同模型有不同的强项。SmallCode 支持 per-model 配置:

{“qwen2.5-coder-7b”: {“context”: 32768,“tool_format”: “json”,“strengths”: [“code generation”, “debugging”],“weaknesses”: [“web research”, “large refactors”]}}

Web 搜索支持

给中型模型(20B+)开启网页能力:

SMALLCODE_WEB_BROWSE=true

Playwright 驱动,隐身模式防反爬。跑的时候会搜文档、查 API,辅助代码生成。

踩坑记录

1. Node 版本要 18+

第一次 run 直接报错。查了半天,SmallCode 依赖 Playwright,而 Playwright 需要 Node 18+。如果你还在 Node 16,升级或者用 nvm 切版本。nvm install 18 && nvm use 18 就解决了。

2. 模型名称要写 exact match

配置 SMALLCODE_MODEL 时,名字必须和 Ollama/LM Studio 里显示的一模一样。少一个冒号或大小写不对,返回 404 但不会报明显错误,就是空转。建议先在 Ollama 里跑 ollama list 确认名字。

3. .env 文件位置

.env 必须放在项目根目录,不是 home 目录也不是 smallcode 安装目录。我第一次放在了 ~/,读不到,模型一直连不上。SmallCode 默认从当前工作目录加载 .env。

4. BoneScript 不适合复杂迁移

.bone 文件编译出来的项目结构是模板化的。如果你要从一个已有的、结构混乱的项目迁移到 BoneScript 生成的结构,模型会困惑。建议只在新项目上用 BoneScript。

5. 小模型对中文的理解差异

我试了 Qwen2.5-Coder-7B,中文 prompt 输出没问题。但换到 DeepSeek-Coder-6.7B 时,同样的中文需求,它会在代码注释里写出英文注释。不是 bug,是训练数据偏向问题。建议用 Qwen 系列。

6. 第一次启动慢

首次运行会下载 Playwright 浏览器(chromium 约 150MB)。如果服务器在国内,下载可能会超时。可以手动设置 PUPPETEER_SKIP_DOWNLOAD=true 跳过,或者在有小文件需求的场景直接不开启 WEB_BROWSE。

7. TUI 模式下退出

/smallcode 习惯了 Cursor 的 GUI,SmallCode 的 TUI 是终端全屏模式。退出用 /quit 或 Ctrl+C。如果被卡在某个输出里,按 q 回到提示符。

8. 大型项目 graph_search 慢

如果你的项目有 10 万+ 文件(monorepo),graph_search 首次索引需要几分钟。可以提前跑 smallcode --index-only 预建索引,这样实际使用时就不等了。

9. 上下文丢消息

8k 上下文的模型配合默认配置,大概能处理 5-8 轮对话。如果对话长了,前面的决定会被驱逐。这时可以用 /memory 查看工作记忆,或者手动总结当前进度写到 /plan 文件里。

10. 云模型后备的超时

如果你配了 ANTHROPIC_API_KEY 但网络不好(比如服务器在境内访问 Claude),escalation 会超时。SmallCode 默认超时 60 秒,可以通过 SMALLCODE_ESCALATION_TIMEOUT=120 改长一点。

总结

SmallCode 不是那种"用最强模型解决一切"的项目,它是另一种思路——让弱模型也能干活。上下文预算、宽容解析、TODO 分解、patch 优先——这些设计对那些只能在本地跑模型的人来说,每一条都是实打实的痛点。

如果你公司代码敏感、不想用云 API,或者手上有台带显卡的机器想发挥点价值,可以试试。npm install -g smallcode 三秒装完,在本地项目跑一下,感受一下区别。