ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Claude Code Local 实战:在 Apple Silicon 上用 MLX 把 Claude Code 搬到本地跑

Claude Code Local 实战:在 Apple Silicon 上用 MLX 把 Claude Code 搬到本地跑 1. 为什么要在 Apple Silicon 上折腾 Claude Code LocalClaude Code 本身是个命令行里的 AI 编程助手正常用法是连云端 API按 token 计费。但有些场景你没法或者不想走云端手里是公司发的 MacBook代码属于不能外传的资产或者你在一个网络受限的环境里外网请求时通时断再或者你只是单纯想省下每月的 API 账单。这时候把 Claude Code 的推理后端换成本地模型就成了一件很实际的事。Apple Silicon 的 M 系列芯片有个天然优势统一内存架构。CPU 和 GPU 共享同一块内存模型权重加载一次就能被 GPU 直接访问不用来回拷贝。这让一台 32GB 内存的 MacBook 能跑起 4-bit 量化后约 18GB 的 31B 模型96GB 以上的机器甚至能上更大的 MoE 模型。MLX 是 Apple 官方出的数组计算框架专门为这套硬件做了优化用它来跑本地推理比通用方案更贴合 Metal 内核。这篇要交付的东西很具体一套可复制的config.toml骨架一段settings.json配置片段以及启动本地服务后怎么验证 Claude Code 真的连上了本地端口。整个过程不依赖任何云端推理服务数据流从你的键盘进、从你的屏幕出中间不经过第三方服务器。适合手上有 M 系列 Mac、想先跑通本地闭环再决定要不要深入的人。2. 前置准备模型、MLX 与 TaoToken 的分工在动手之前先把几个角色的边界理清楚不然后面配置容易混。本地推理这一侧核心是 MLX 服务器加一个量化模型。模型文件从 HuggingFace 拉下来放在本地磁盘上MLX 负责把它加载进统一内存并在 GPU 上做前向计算。这部分完全离线跑起来之后断网也能用。模型的选择上31B 级别的 4-bit 量化版本对 32GB 内存比较友好MoE 架构的大模型吞吐更高但吃内存按自己机器的实际情况挑。Claude Code 这一侧它本身是个 CLI 工具默认会去读环境变量和配置文件里的 API 地址。我们要做的就是把这个地址从云端改成http://127.0.0.1:某个端口让它以为自己在跟一个标准 API 说话实际上请求全落在本地 MLX 服务器上。那 TaoToken 在这里是什么位置它是给「混合模式」准备的。纯本地跑的时候你不需要它但当你想让 Claude Code 在本地模型和云端模型之间切换或者本地模型搞不定的复杂任务想临时借一下云端能力时TaoToken 提供统一的 API 接入层把不同来源的模型调用收敛到一套接口和一份密钥管理里。它的 API 地址是https://taotoken.net/api接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aic_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 可以查到具体的请求格式和模型列表。本地为主、云端为辅的用法比纯本地更实用因为本地模型在长上下文和复杂推理上确实有天花板。硬件门槛说清楚最低 32GB 统一内存能跑 31B 4-bit想要更流畅或者上更大模型96GB 以上会舒服很多。磁盘上留出至少 20GB 给模型权重MLX 本身用 pip 装就行。3. 可复制配置config.toml 骨架与 settings.json 片段先装 MLX 和启动服务器。用虚拟环境隔离避免污染系统 Pythonpython3 -m venv ~/mlx-env source ~/mlx-env/bin/activate pip install mlx-lm拉模型。这里以 31B 级别的 4-bit 量化版本为例实际模型名按你选的来huggingface-cli download org/model-4bit --local-dir ~/models/local-31b启动一个兼容 OpenAI 接口的本地服务。mlx_lm.server会监听一个端口把模型加载进内存mlx_lm.server \ --model ~/models/local-31b \ --port 8080 \ --host 127.0.0.1看到日志里出现模型加载完成、监听 8080 的字样服务就起来了。这一步加载时间取决于模型大小31B 4-bit 大概几十秒到一两分钟。接下来是 Claude Code 的配置。它读取~/.claude/settings.json我们把 API 基址指向本地端口。下面这段可以直接抄把端口和模型名换成你自己的{ env: { ANTHROPIC_BASE_URL: http://127.0.0.1:8080, ANTHROPIC_API_KEY: local-no-key-needed, ANTHROPIC_MODEL: local-31b } }ANTHROPIC_API_KEY在纯本地模式下随便填一个非空字符串即可本地服务器不校验。ANTHROPIC_MODEL要和你启动服务时加载的模型标识对上对不上会报模型不存在。如果你打算用混合模式让部分请求走 TaoToken 的云端接入可以再准备一份config.toml骨架把两套端点分开管理[local] base_url http://127.0.0.1:8080 model local-31b api_key local-no-key-needed [cloud] base_url https://taotoken.net/api model claude-sonnet api_key sk-你的TaoToken密钥 [router] default local fallback cloud这份 toml 不是 Claude Code 原生读的是给你自己写切换脚本或者配合路由工具用的。思路是本地优先遇到本地模型明显扛不住的长任务再切到 cloud 段。TaoToken 的密钥在 https://taotoken.net/api-keys?utm_sourcetaotoken_aic_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 申请拿到后填进api_key。4. 启动验证与连通性检查配置写完别急着开 Claude Code先单独验证本地服务是通的。用 curl 打一下兼容接口curl http://127.0.0.1:8080/v1/chat/completions \ -H Content-Type: application/json \ -d { model: local-31b, messages: [{role: user, content: 用一句话说明快速排序的思路}], max_tokens: 128 }正常的话会返回一段 JSONchoices[0].message.content里就是模型的回答。如果这里就报连接拒绝说明 MLX 服务器没起来或者端口不对如果报模型找不到说明model字段和加载的模型标识不一致。本地接口通了之后再验证 Claude Code 是否真的走了本地。开一个新的终端进一个测试项目目录启动claude进去之后随便问一句比如「这个目录下有哪些文件」。观察两个地方一是 MLX 服务器的终端日志里应该出现新的请求记录二是 Claude Code 的响应速度。本地 31B 4-bit 大概每秒十几个 token比云端慢是正常的但能出结果就说明链路通了。如果 Claude Code 报认证失败或者连不上八成是settings.json里的ANTHROPIC_BASE_URL没生效检查一下文件路径和 JSON 格式别有多余逗号。想确认请求确实没出网可以把 Wi-Fi 关掉再问一次。纯本地模式下断网依然能回答这就证明数据流没有经过任何外部服务器。这一步是很多人验证「零云端依赖」最直接的办法。如果你配了混合模式再测一下切换把ANTHROPIC_BASE_URL临时改成https://taotoken.net/api密钥换成 TaoToken 的重启 Claude Code问同样的问题对比一下响应质量和速度。这样你心里就有数什么任务留给本地、什么任务交给云端。模型对话的调试可以在 https://taotoken.net/console?utm_sourcetaotoken_aic_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 里直接试不用每次都走 CLI。5. 本篇常见错排查端口被占用。8080 是常见端口可能被别的服务占了。启动 MLX 时换一个比如--port 8081同时把settings.json里的地址一起改掉两边必须一致。内存不够导致加载失败。31B 4-bit 大约要 18GB 以上可用内存如果你同时开着浏览器一堆标签页和 IDE可能就顶不住。启动前关掉不必要的大内存应用或者换更小的模型。日志里如果出现内存分配失败基本就是这个原因。模型标识对不上。ANTHROPIC_MODEL和启动命令里的--model路径最后一段要能对应上。有些模型仓库的标识和目录名不一样以服务器实际加载的为准拿不准就先 curl 测一下。settings.json 格式错误。JSON 不允许尾随逗号也不支持注释。改完用python3 -m json.tool ~/.claude/settings.json校验一下能正常输出就说明格式没问题。Claude Code 仍走云端。检查是不是有环境变量覆盖了配置文件。ANTHROPIC_BASE_URL如果之前在 shell 里 export 过优先级可能高于 settings.json。用env | grep ANTHROPIC看一眼有冲突的就 unset 掉。响应特别慢或者卡住。本地推理受内存带宽影响大如果模型太大导致频繁换页速度会断崖式下跌。这时候要么换小模型要么减少并发请求。MLX 服务器默认可能不支持高并发一次只发一个请求测试。6. 本地为主、云端为辅的长期用法纯本地跑通之后你会发现它的定位很清晰处理敏感代码、网络受限环境、或者想省 API 费用的日常小任务本地模型完全够用。但遇到需要超长上下文、复杂多步推理的活儿本地 31B 级别的模型还是会力不从心。这时候不用推翻整套配置只要在config.toml的 router 段里把 fallback 指向 TaoToken 的云端接入就行密钥和端点都是现成的。如果你打算长期在编码和 Agent 场景里用这套组合可以看一下 Coding Plan 的接入方式它把本地和云端的调用配额、模型切换收敛到一处管理省得每次手动改环境变量https://taotoken.net/coding-plan?utm_sourcetaotoken_aic_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。Claude Code 相关的接入细节在 https://taotoken.net/claude-code?utm_sourcetaotoken_aic_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 有专门说明包括怎么把 CLI 指向自定义端点。我自己的习惯是日常改代码、写脚本、查本地文件全走本地 MLX断网也能干活碰到要读大仓库、做跨文件重构这种重活临时切到云端。两套配置都在切换就是改一个环境变量的事。这样既保住了数据不出设备的底线又没牺牲复杂任务的上限。
返回列表