1. 为什么Claude Code的配置值得单独成体系研究
1.1 从"跑起来"到"跑得好"的分水岭
很多人上手Claude Code的第一天,在终端敲下claude命令,发现它能聊天、能读写文件、能执行命令,就觉得"行了,我已经会用了"。这种状态持续不了太久——新鲜感褪去后你会意识到,同一个工具在不同人手里的表现差异巨大:有人用它两天就能把遗留项目重构完,有人用它两周还在跟同一个bug纠缠。差异的根源几乎都不在模型本身,而在于你给Claude Code配了什么样的运行环境。
我刚接触Claude Code时,所有配置全靠命令行参数硬扛:每开一个会话都要手动声明"不要动测试文件""不要跑数据库迁移命令""遇到xxx情况先问再动手"。麻烦不说,还经常漏。后来我把这些规则逐步沉淀到配置文件里,才发现这个工具真正的威力在于:配置写得好,Claude就像带了三年的老员工;配置不写,它就是个聪明但记性差的实习生。
这篇内容我重点拆解Claude Code的三套配置载体:settings.json、CLAUDE.md和memory。它们听起来都是"配置文件",但管的事完全不同,混着用或者只用一个,都会让使用体验大打折扣。我会把我实际踩过的坑、试出来的合理写法和三者之间的配合逻辑,一次性说清楚。
1.2 三种配置的定位差异:谁管"行为"、谁管"项目"、谁管"状态"
用一句话概括三者的区别,可以这样记:
settings.json管的是Claude Code这个程序本身怎么运行——权限、模型、自动更新、界面行为、钩子规则,全部是它说了算;CLAUDE.md管的是Claude面对你的项目时需要知道的背景知识——技术栈、目录结构、约定规范、常用命令、常见坑;memory管的是跨会话的持久状态——你的偏好、项目的阶段性结论、上一次没聊完的事、你明确要求它记住的东西。
三者叠在一起,才构成一个完整的"配置体系"。只看settings.json,Claude是"能跑但不懂你的项目";只写CLAUDE.md,Claude是"懂项目但行为不受控";只用memory,Claude是"记得很多东西但缺乏系统性"。
我在实际项目中见过不少只依赖CLAUDE.md的人,他们觉得只要把项目说明写详细就够了,结果经常出现"Claude明明很懂业务,却突然执行了一个不该执行的命令"的情况——这就是没配好settings.json的权限规则。也见过只调settings.json不管另外两个的,结果是Claude表现得像个格式化工具,对项目上下文一无所知。
正确的姿势是:三层配合,各管各的。下面我按这个逻辑逐一展开,每一步都会给出可以直接抄的配置写法。
2. settings.json:Claude Code的运行时行为总控
2.1 配置文件的存放位置与生效优先级
settings.json在Claude Code里有三个层级,很多人只知道一个,甚至有人会把三个地方搞混,导致改了配置不生效或者生效了不知道是谁生效。
第一层是用户级配置,路径固定在User配置目录下的claude子目录里(macOS和Linux在~/.claude/settings.json,Windows在%USERPROFILE%\.claude\settings.json)。这一层管的是你作为"这个人"在所有项目里的通用偏好,比如默认模型、全局权限、显示语言这类与具体项目无关的设置。
第二层是项目级配置,路径是项目根目录下的.claude/settings.json。这一层只对这个仓库生效。凡是跟这个项目的特定操作规则相关的内容(比如"运行这个项目的测试只能通过pnpm test,不要用npm")就应该放这里。
第三层是本地配置,路径是.claude/settings.local.json,同样在项目根目录。区别在于settings.json是建议提交到Git的(方便团队共享规则),而settings.local.json默认不提交,放的纯粹是你个人的本地覆盖项——比如你的个人API Key相关设置、只有你机器上才有的路径。
三层的生效优先级是:本地配置 > 项目配置 > 用户配置。也就是说,本地配置里写了什么,就会覆盖项目配置里同名的项;项目配置又会覆盖用户级配置。
我实际工作中最常用的维护办法是:用户级只放跟API、SSH、编辑器偏好相关的稳定配置;项目级放团队约定的操作规则;settings.local.json放只有我自己需要的调试项。这样换个电脑、拉个新仓库,都不会出现"我的配置丢了"或者"把个人偏好提交到团队仓库"的尴尬。
2.2 高频实用配置项拆解
settings.json的字段不少,我从实际使用频率出发,挑几个最常用的拆开讲,附带我验证过的写法和场景。
权限规则(permissions)
这是我认为最重要的一组配置。Claude Code默认在执行bash命令或读写文件时,会先征求你的同意。但如果你一个项目里每天要运行几十次pnpm test,每次都点确认会非常崩溃。正确做法是配置allow规则:
{ "permissions": { "allow": [ "Bash(pnpm test)", "Bash(pnpm lint:fix)", "Read(README.md)", "Read(.env.example)" ], "deny": [ "Bash(rm -rf *)", "Bash(git push --force)", "Write(prod.env)" ] } }这里有个非常关键的心得:allow规则一定要写得足够具体。我刚开始图省事,写的是"Bash(pnpm *)",结果Claude执行任何pnpm命令都不问我要许可了——包括pnpm dlx这种下载执行临时包的操作。后来我改成精确匹配命令字符串,才平衡了效率和安全性。
还有一个容易忽略的项是"Edit(file路径)"和"Write(file路径)"的区别。Edit是针对已存在文件的修改,Write是新建或覆盖。如果你只想让Claude改现有代码、不让它乱建新文件,就把Write的allow范围收紧,甚至全部改成deny,看情况再临时放开。
模型与提供商配置
settings.json里可以指定默认模型,写法是"model": "claude-sonnet-4-5"之类的具体模型ID。如果你接入了第三方的OpenAI兼容端点或自己部署的网关,模型配置通常长这样:
{ "model": "deepseek-sonnet", "ANTHROPIC_BASE_URL": "https://your-gateway.example.com", "ANTHROPIC_AUTH_TOKEN": "sk-xxx" }注意,settings.json里能不能直接写ANTHROPIC_BASE_URL这类环境变量式字段,不同版本的处理方式不完全一样。稳妥的做法是放在环境变量里,或者在项目的settings.local.json里配——反正不要提交到共享的settings.json中,否则每个人连的网关都一样,出了故障排查起来很头疼。
关于"Claude Code能不能接入DeepSeek等第三方模型",不少人也问过我。理论上,只要第三方模型兼容Anthropic的API协议,就可以通过ANTHROPIC_BASE_URL指向对应网关来使用。但我要提醒一句:第三方模型的system prompt理解和工具调用能力通常比不上原生模型,你期望它完整扮演Claude Code的编码助手角色会有些落差。在settings.json里如果遇到"模型不支持工具调用"的报错,通常是因为Sdk版本期望模型暴露工具调用接口,而DeepSeek系的模型未必原生支持Anthropic格式的tools协议——这不是配置本身的问题,是模型能力边界问题。
自动更新与日志行为
网上流传很广的一个报错叫auto-update failed: no write permission to npm prefix,很多人以为这是权限问题,其实根子在npm全局包的安装目录不属于当前用户。我处理过两次,最快的解决方式不是去改npm prefix(改这个影响面太大),而是直接在settings.json里关闭自动更新:
{ "autoUpdatesEnabled": false }然后在确认自己有空的时候,手动执行一次更新命令。这么做的好处是:你可以在CI流程里统一落一个"固定版本"的Claude Code,避免某天开工时发现工具自动升级到了新版,行为变化导致项目里跑的配置全部失效。工具链升级导致配置行为漂移,这在大版本迭代期非常常见。
verbose和debug这类日志开关,我也建议日常保持"verbose": false,只在排查问题时临时打开。默认的日志文件路径是明确的,事后去日志里翻历史提问或工具调用记录,比在终端里开着debug刷屏要舒服得多。
Hook与事件钩子
settings.json里的hooks配置值得单独拎出来讲。它可以让Claude在执行某些操作的前后自动触发脚本。比如我希望每次Claude准备执行git commit之前,自动跑一遍代码风格检查,就可以这样写:
{ "hooks": { "PreToolUse": [ { "matcher": "Bash(git commit*)", "hooks": [ { "type": "command", "command": "lint-staged" } ] } ] } }合理使用hook能构建出非常接近真实团队的自动化质感。但hook的调试成本不低,一旦脚本出问题,可能阻断正常流程。我的建议是:先只在最常用的命令上挂hook,跑顺了再扩展。不要一上来就配十几条,否则你会在"修复hook脚本"上花的时间比Claude写代码的时间还多。
2.3 实操中的权限与更新问题
围绕settings.json,最典型的问题就是权限。除了上面提到的npm更新权限,还有一类是团队仓库里.claude/settings.json被轻易提交导致的生态混乱。
我们团队踩过一次:某次有人把个人电脑上调试用的ANTHROPIC_AUTH_TOKEN误当作通用配置,写进了项目级settings.json并提交,结果团队其他人拉下代码后,Claude Code全部指向了错误认证源,API请求全部401。排查了很久才找到原因。所以我现在管理的仓库里,项目级settings.json一定只有纯操作规则,凡是涉及密钥、URL、本机路径的内容一律只放settings.local.json,并且在仓库的.gitignore里把settings.local.json显式忽略掉。
还有一个非常隐蔽的坑:settings.json中权限规则的匹配是"前缀式"的,写Bash(pnpm install)不会匹配Bash(pnpm install --save-dev xxx),但写Bash(pnpm install*)又会匹配到更多命令。我的建议是,精确命令就写完整字符串,需要模糊匹配时确保结尾规则是合理可预期的,不要偷懒写宽泛前缀。
3. CLAUDE.md:给Claude的"项目入职手册"
3.1 为什么写入CLAUDE.md之后输出质量明显提升
如果说settings.json控制的是Claude Code这个程序的"行为边界",那CLAUDE.md控制的就是Claude对项目的"认知质量"。这两件事经常被混淆,但它们的运行机制完全不同。
我先说一个现象:很多人在项目里放了一份几十页的架构文档,然后问"为什么Claude不看?"。原因很简单——Claude Code并不会自动读取你项目里所有文档。它在每个会话开始时,按固定顺序读取名为CLAUDE.md的文件,把它视为关于当前工作环境的高优先级指导。你的架构文档如果叫architecture.md或者docs/设计文档.md,除非Claude主动用Read工具去读,否则它根本不会知道这些内容存在。
所以CLAUDE.md的作用,在某种程度上是给Claude一个"项目入职培训"。你作为带过很多项目的人,可以把新人入职时你需要口述的东西全部写进去:项目是干什么的、技术栈是什么、代码在哪个目录、构建命令是什么、哪些文件绝对不能动、有哪些习以为常的约定。
为什么这能显著提升输出质量?因为LLM对上下文非常敏感。同样一个需求,如果Claude知道"这个项目的错误码统一在errors/目录定义,新增错误码要走XXX流程",它生成的代码从一开始就符合项目规范;如果没有这段信息,它就会按一个普通后端项目的套路来,给出的代码风格很通用,但跟你的项目治理方式格格不入。
3.2 一份高质量CLAUDE.md的结构建议
我不建议一上来就写长篇大论。CLAUDE.md的价值在于"高信息密度",而不是"多"。我整理过一份结构模板,在当前大多数项目里效果不错,你可以根据自己的情况裁剪:
# 项目概述与定位 一句话说明项目做什么,目标用户是谁,当前核心阶段是什么。 # 技术栈与工程约定 - 框架版本、包管理器(必须用pnpm,不能用npm) - 代码风格、测试框架、lint规则 - 目录结构说明,尤其是非直觉的目录 # 常用命令 - 启动/开发/构建/测试/部署分别用什么命令 - 哪些命令是耗时长的、需要先确认再执行 # 关键业务规则 - 核心业务逻辑的不变量(invariants) - 哪些边界条件不能忽略 - 团队已经踩过并沉淀下来的"反模式" # 禁止事项 - 明确列出Claude绝不能做的事情 - 例如:不能修改生成文件、不能动数据库迁移、不能格式化第三方代码每个项目具体内容差异很大,但**"禁止事项"这一节请务必单独成段,放在靠前位置**。我发现Claude Code对"禁止"指令的遵循度,取决于它在上下文中的凸显程度。散落在各段的规则容易被忽略,集中放在一段,并且每条都用强指令式表述("绝不能""禁止""除非明确要求"),效果稳定很多。
举个例子,我们有个项目外包了部分前端代码,生成文件放在generated/目录下。我在CLAUDE.md里写"不要修改generated目录下的文件",结果有一次Claude还是动了。后来我把这条改成:
# 禁止事项 - 绝不手动修改 generated/ 目录下的任何文件 - 避免使用 npm install;本项目依赖统一使用 pnpm - 不确定某个操作是否允许时,先向用户确认再行动后续几乎没有再越过红线。原因在于更强制的措辞提高了这条规则在采样时的触发权重。
3.3 多层级CLAUDE.md的覆盖逻辑
除了项目根目录的CLAUDE.md,Claude Code还支持用户级CLAUDE.md和子目录级CLAUDE.md。三条线索叠加在一起,构成一个非常灵活的记忆体系。
~/.claude/CLAUDE.md是用户级文件,适用于你所有的项目。我在这份文件里写的是个人工作惯例,比如"默认使用中文回复""代码注释偏好中文""commit信息使用约定式提交格式"。这样不管进入哪个仓库,Claude都会带上关于你的偏好背景。
根目录CLAUDE.md已经说过,管项目全局。
子目录级CLAUDE.md则用于特定子模块。比如后端仓库里有一个docs/目录专门放API文档,你可以在docs/CLAUDE.md里告诉Claude"这个目录下的markdown文件由脚本自动生成,修改需要同步更新脚本",这样当Claude被要求修改某个文档时,它在进入该目录上下文时就会看到这个提示,避免误改。
优先级原则是:越具体的越优先,也就是子目录级优先于项目根级,项目根级优先于用户级。冲突时,具体规则覆盖通用规则。
有一点要提醒:CLAUDE.md的作用范围并非"严格按目录边界割裂",它在实际会话中更像"多个上下文叠加"——用户级是地基,项目级是楼体,子目录级是某一层的装修。不要在三份文件里写互相矛盾的内容,比如用户级说"不要用npm",项目级又写"先运行npm install",那模型会陷入迷茫。每个层级只写自己那一层该管的约定,交集越多越容易被错误解读。
4. memory:让会话之间"记住"关键信息的三种途径
4.1 内置记忆机制与memory文件的持久化逻辑
聊完前两类,再来看最容易让人困惑的memory。很多用户以为memory是Claude Code自动维护的一个知识库,开会话就自动把之前的经验存进去——这个理解不准确。
Claude Code的memory体系,从我实际使用的角度总结,分三条线:
- 会话内上下文:你在一次会话里聊的内容,Claude都能记住,但它只在这个会话内有效,结束就没了;
- CLAUDE.md的隐性记忆:你写进CLAUDE.md的内容,本质上就是一种"长期记忆",每次会话自动加载;
- memory相关命令和文件:通过可以持久化存取的自由格式记忆文件,跨会话保存一些非结构化信息。
第三条线容易被忽略,但恰恰是应对"多天连续维护同一个事情"的关键。比如你在做一次持续两周的迁移重构,每天的工作结论、当前做到哪一步了、有哪些遗留问题——如果只写在代码注释里,Claude第二天看到的不是一个连续的"进行中状态",而是一堆孤立片段。把进度信息写入memory文件,第二天新开会话时,Claude的起点就是你昨天的终点。
我维护的写法是:在项目根目录放一个.claude/memory.md,每天结束时花30秒让Claude把"今日进展、当前阻塞点、下一步计划"append进去。第二天一开工,第一句话就是"读一下memory.md,我们先接着昨天的进度继续"。这样带来的连续性体验,跟每次从零开始解释项目状态,是两种完全不同的效率水平。
4.2 什么时候该用memory,而不是CLAUDE.md
这两者很容易混淆,因为形式上都像"给Claude多一点信息"。我的判断标准非常直接:如果这条信息对"所有进入这个项目的人/模型"都重要,且是长期稳定的认知,放CLAUDE.md;如果这条信息只对"当前这个持续任务"重要,且会不断变化,放memory文件。前者是"岗位说明书",后者是"日报和交接文档"。
举个例子:项目规定"测试必须跑pnpm test:unit",这是长期规则,放CLAUDE.md。但"目前正在用node scripts/migrate-v2.js做数据迁移,已经执行到step 3,发现step 3对空值处理有问题,明天先修这个"——这类内容是临时进展,放CLAUDE.md会污染项目全局规则,放memory文件刚好。
至于那些通过直接对话让Claude"记住"的偏好(比如你告诉它"我以后提问都用中文"),这类用户级偏好最好固化到~/.claude/CLAUDE.md里,不要指望会话中的口头约定能跨会话生效。模型不会因为你上次随口说了一句"以后都这样"就永久改变行为,除非你把规则写进配置文件。
4.3 一个实际维护案例:多项目共用时的记忆隔离
用memory时最容易踩的坑是跨项目污染。我有一段时间把所有项目的进度都写在同一个memory文件里,结果在A项目里问"我们昨天解决的那个报错是怎么处理的?",Claude把B项目的处理方案答上来了,因为两个项目的内容在上下文里搅在了一起。
后来我的做法是按项目隔离:每个项目的.claude/memory.md只存本项目的内容;跨项目通用的经验沉淀则放到用户级CLAUDE.md里。这套隔离策略执行之后,混乱的情况几乎消失。
另一个技巧是:我会在memory文件的开头放一个"当前状态"段落,只保留最近一次会话的进度;历史记录往下沉,保留最近三五天的即可,太旧的直接清理。这能避免memory文件无限膨胀,否则几周之后,Claude每次加载这个文件,会被大量过时信息干扰,反而降低了判断质量。
5. 三大配置协同:从零搭建一套可复用的工作流
5.1 配置落地的推荐顺序
很多人拿到配置体系后,第一反应是"全会了,直接开配"。我的建议是分三步走,每步验证过再进入下一步,否则出了问题你很难定位究竟是哪份配置在作怪。
第一步:只配settings.json。把权限规则、模型、自动更新这些运行时行为先弄对。验证标准是你日常的增删改查、跑测试、提交代码这些动作,都不再频繁打断你。
第二步:写根目录CLAUDE.md。先写最核心的部分:项目概述、常用命令、禁止事项。验证标准是让Claude执行一个你预设的任务组合,比如"帮我把xx模块的重构方案列出来,注意遵循项目规范",看它是否自动引用了CLAUDE.md里的规则。
第三步:引入memory机制。建立.claude/memory.md,开始做跨会话维护。验证标准是你模拟一个"今天下班、明天继续"的状态,第二天开会话能否顺利接续。
为什么要这个顺序?因为如果先写了CLAUDE.md却不配好权限,Claude会频繁询问或者做出你不想让它做的事,你很难判断是"它不知道规则"还是"它的行为不受控"。先解决行为边界,再优化认知质量,最后做状态持久化,逻辑上最顺。
5.2 完整配置示例:一个全栈项目的配置组合
我拿一个典型的前端Vue3加后端Node项目的配置组合为例,给你一套可以直接改用的参考。
~/.claude/settings.json(用户级):
{ "model": "claude-sonnet-4-5", "permissions": { "allow": [ "Bash(git status)", "Bash(git diff)" ] }, "autoUpdatesEnabled": false }项目根目录.claude/settings.json(项目级):
{ "permissions": { "allow": [ "Read(CLAUDE.md)", "Bash(pnpm test)", "Bash(pnpm build)", "Bash(node scripts/dev.sh)" ], "deny": [ "Bash(rm -rf *)", "Write(composer.lock)" ] } }项目根目录CLAUDE.md(节选):
# 项目概述 电商后台管理端,技术栈为 Vue3 + TypeScript + Vite,后端为 Node.js + Express。 # 工程约定 - 包管理统一使用 pnpm,禁止使用 npm/yarn - 组件样式一律使用 CSS Modules,不引入全局样式类 - 后端 API 路由统一挂在 /api/v1 前缀 # 常用命令 - 启动前端:pnpm dev - 启动后端:node scripts/dev.sh - 全量测试:pnpm test - 构建:pnpm build # 禁止事项 - 不要修改 generated/ 目录下生成的前端代码 - 不要直接改数据库迁移历史文件 - 不确定操作时,先向用户确认.claude/memory.md(示例):
## 当前状态(2025-06-XX) - 购物车模块后端接口已完成,联调中 - 今日阻塞点:优惠券计算在并发场景下出现重复扣减 - 明天计划:先修优惠券并发问题,再推进结算页前端 ## 历史记录 - 2025-06-XX:完成商品列表接口分页优化这套组合跑起来之后,我几乎不需要在会话里反复口头交代规则,Claude的表现稳定且可预期。如果你接入的是DeepSeek这类第三方模型,记得把模型ID和网关配置放在settings.local.json,同时调低你对"它完全遵循CLAUDE.md"的预期——第三方模型对指令的遵循度通常比Anthropic原生模型弱一档,这是模型本身的差异。
5.3 配置变更后的验证与回滚
配置体系搭好之后,变更管理是很多人忽略的一环。我见过最惨烈的例子:有人为了调一个权限问题,随手在项目级settings.json里加了一行"allow": ["Bash(rm -rf *)"],测试完忘了删,第二天Claude执行清理命令时,把整个临时目录删了。虽然没删到源码,但那次事故之后我对配置变更的审计程序变得异常严肃。
我现在维护项目配置的统一原则是:
- 项目级
settings.json和CLAUDE.md走代码评审流程,任何改动都走MR,不直接推到主分支; settings.local.json不提交,但它属于"我知道我改了什么"的范围,重大变更当天记录到memory文件;- 配置变更后,用一个固定的冒烟测试清单验证:让Claude必须依次执行"读项目结构、改一个文件、跑一次测试"这几个动作,确认无异常再确认完成。
如果你担心自己的配置某次改出问题,还有一个很实用的办法:把当前能正常工作的settings.json做一次快照,放到一个不参与日常加载的settings.json.bak文件里。万一改坏了,直接覆盖回来,5秒内恢复。
6. 围绕配置体系常见的坑与对策(含安装与模型接入)
6.1 安装与升级阶段的两类经典报错
配置体系讲完了,但很多人的问题其实是在到达配置阶段之前就被安装和启动问题挡住了。基于我看到的社区反馈,有两类报错出现频率最高。
第一类是auto-update failed: no write permission to npm prefix。这个问题我在2.3节提过:根因是npm全局包安装目录权限不够。除了关掉自动更新,还有一个备选方案是给npm prefix目录修复权限。如果你用的是nvm管理Node版本,通常症状是这个目录的owner跟你当前用户不一致。判断方法很简单,在终端执行npm prefix得到目录路径,然后查看这个目录的属主。修复方式是基于你的实际系统环境,把该目录的属主改回当前用户,或者用npm config set prefix重新指向一个你有权限的目录。但我不推荐改prefix,因为它会影响所有全局包,波及面太广。最简单可控的操作还是:在settings.json里关掉自动更新,需要升级时手动触发一次。
第二类是"claude命令找不到"或者"安装完成后启动报错"。这类问题的排查思路是:先确认npm全局bin目录是否在你的PATH环境变量里。很多Windows用户会特意提到WSL环境——在WSL里安装时,命令的存取逻辑跟在Windows原生终端下是不同的,请确保你是在同一个发行版内安装和使用,而不是在Windows侧的PowerShell里去找WSL侧的全局命令。这个问题90%以上都是PATH问题,先跑which claude看能不能找到,找不到就去查PATH。跟settings.json的关系在于:一旦PATH配置混乱,你可能有多个版本的Claude Code共存,不同版本读取配置的目录可能不同,这会导致"明明改了配置却不生效"的假象。建议清理到只剩一个稳定版本,再谈配置。
还有一类是IDE集成问题。很多人在VSCode里配置Claude Code,期望的是像普通插件一样用面板操作。但Claude Code本身以命令行工具为核心,你在VSCode里看到的集成,本质上是在终端面板里跑同一个CLI。所以你在配置文件里设的权限和模型,在VSCode集成里同样生效。如果VSCode集成打开时读取不到配置,优先检查你的工作区根目录是不是项目真正根目录——如果在子目录里打开,Claude Code找到的项目级配置路径就错了。
6.2 第三方模型接入时的配置要点
关于"Claude Code接入DeepSeek、或者其他兼容Anthropic协议的模型网关",前面提过通过ANTHROPIC_BASE_URL指向网关的方式。这里补充几个配置层面的注意点。
第一个是认证字段的类型。有些网关要求ANTHROPIC_AUTH_TOKEN,有些要求ANTHROPIC_API_KEY,有些两者都认。配置前先确认目标网关的文档,不要把两个字段都设置成不同值,否则可能出现奇怪的401。这个信息建议放在settings.local.json,因为它是环境相关的。
第二个是第三方模型的工具调用能力差异。Claude Code的很多核心能力依赖模型的tool-use能力——比如读写文件、执行命令,本质都是模型返回一个工具调用指令,再由CLI执行。如果模型本身对工具调用的响应格式支持不完整,就会出现"模型一直讲道理,但就是不实际动手"或者"频繁报工具调用失败"的现象。这是模型层面的限制,除非你的网关做了一层格式转换和降级处理,否则单纯调配置解决不了。
第三个是功能降级预期。把Claude Code接入第三方模型后,你会失去一些依赖Anthropic特有能力的特性,比如深度思考模式在某些跨模型场景下不可用。实际体验下来,做常规问答和简单代码生成影响不大,但做复杂多文件重构时,稳定性不如官方模型。一句话:拿它当备选方案可以,拿它当完整替代品,配置上的工作量和体验落差是客观存在的。
6.3 从配置体系视角回看VSCode集成
最后再说一句VSCode集成。很多人第一次接触Claude Code就是在VSCode里,这确实降低了上手门槛,但也会掩盖配置体系的真实逻辑。你自己不打开终端、不看配置文件,就永远停留在"这个工具能自动改代码"的层面,而不理解它为什么有时候改得好、有时候改得差。
我的建议是:至少有一次,请完全脱离IDE,打开纯终端,从一个空目录开始,按我刚才说的三步流程把所有配置亲手建一遍。这个过程能帮你建立对配置体系的体感——哪些规则起作用了、哪些写法被忽略了、三份文件之间是怎么相互作用。建立完这套体感之后,你再回到VSCode集成里干活,很多异常现象你一眼就能推断出根因。
说到底,settings.json、CLAUDE.md、memory这三件事,分别对应的是"程序行为"、"项目认知"和"任务状态"。把这三层梳理清楚,Claude Code就从"一个聪明的聊天窗口"变成了"一个真正懂你项目、懂你习惯、可持续协作的工程助手"。