Environment
Environment
- Python: use
uv run python(notpython3— modules not available outside venv)
### 2. 文件路径纠正 → CLAUDE.md
模型反复猜错的错误路径,以及正确位置:
```markdown
### File Path Corrections
- `axion-common/src/.../AxionSparkConstants.scala`
→ actually at `axion-spark-common/src/.../AxionSparkConstants.scala`
3. 搜索范围 → CLAUDE.md
哪些目录该搜(过窄的路径会失败,更宽的才能命中):
### Search Scope
- Don't search `axion-model/` → use `axion/` (the repo root)
4. 命令模式 → CLAUDE.md
命令应该如何(以及不应该如何)执行:
### Command Patterns
- **user_prefers_manual**: User rejected gradle 18 times — show the command, don't execute
- **python_runtime**: Use `uv run python` not `python3` (ModuleNotFoundError)
5. 已知大文件 → CLAUDE.md
读这些文件时必须用 offset/limit:
### Known Large Files
- `proxy/server.py` (~8000 lines) — always use offset/limit
6. 重试预防 → MEMORY.md
从实际纠正推导出的具体建议,防止同样的无效重试。
7. 权限备注 → MEMORY.md
被反复拒绝的命令——模型应改为向用户"建议"而不是直接执行。
6. 经验写到哪里:Agent 原生的上下文文件
| 经验类型 | Claude Code | Codex | Gemini CLI |
|---|---|---|---|
| 环境、路径、命令 | CLAUDE.local.md(默认)或 CLAUDE.md(--target CLAUDE.md) |
AGENTS.md | GEMINI.md |
| 重试模式、权限 | MEMORY.md | instructions.md | GEMINI.md |
产出文件是 agent-native 的:Claude Code 默认写 CLAUDE.local.md(被 git 忽略、属于个人);想落到团队共享文件时传 --target CLAUDE.md。同一份经验,用各 Agent 各自会读取的文件格式落地。
7. 基于 Marker 的更新:重复运行不产生重复内容
Headroom 在每个文件中管理一个清晰定界的区块(实现见 writer.py):
<!-- headroom:learn:start -->
## Headroom Learned Patterns
*Auto-generated by `headroom learn` — do not edit manually*
...
<!-- headroom:learn:end -->
再次运行时,只有 marker 之间的内容被替换,文件其余部分原样保留。源码中有两处细节值得注意:
- 合并语义:_merge_recommendations 会把上一次运行中、本次没有再出现的 section 保留下来("carried forward"),即重跑不会悄悄丢掉已积累的经验;同名的 section 以最新一次分析为准。想完全重建区块,手动删除该区块后重跑即可。
- 容错读取:_read_text_tolerant 用 UTF-8 宽松解码读取既有上下文文件,避免文件中混入一个 cp1252 杂字节(如 em-dash 的
0x97)就导致整个--apply中断;写回时以 UTF-8 重新编码完成自我修复。
对应测试覆盖在 tests/test_learn/test_writer.py 与 tests/test_learn/test_integration.py。
8. 插件架构:每个 Agent 一个自包含插件
Plugin Registry (auto-discovered)
├── ClaudeCodePlugin → Analyzer (LLM) → ClaudeCodeWriter → CLAUDE.md / MEMORY.md
├── CodexPlugin → Analyzer (LLM) → CodexWriter → AGENTS.md / instructions.md
├── GeminiPlugin → Analyzer (LLM) → GeminiWriter → GEMINI.md
└── (your plugin) → Analyzer (LLM) → (your writer) → (your file)
注册表与自动发现(registry.py)分两层:
- 内置插件:遍历
headroom.learn.plugins.*子模块,凡模块顶层暴露plugin = 插件实例的即被注册(当前内置 claude、codex、gemini、grok、opencode 五个); - 外部插件:通过
headroom.learn_pluginentry point 组注册,同名时外部插件覆盖内置插件;加载失败的插件只记 warning,不影响整体。
Analyzer 是共享的:所有 Agent 复用同一个 LLM 分析器,分析逻辑与 Agent 无关。
为新的 Agent 添加支持
按 base.py 中的示例:
- 创建
headroom/learn/plugins/myagent.py; - 实现
LearnPlugin+ConversationScanner(扫描器 + 写入器工厂 + 检测); - 在模块作用域加
plugin = MyAgentPlugin(); - 完成——
headroom learn --agent myagent自动可用(--agent的取值由注册表动态校验,见 cli/learn.py 的 _AgentChoice)。
或者安装外部插件包(通过 entry point 注册,例如文档中的 pip install headroom-learn-cursor)。
支持的 Agent 一览
| Agent | 扫描源 | 写入器 | 输出文件 |
|---|---|---|---|
| Claude Code | ~/.claude/projects/*.jsonl |
ClaudeCodeWriter | CLAUDE.md, MEMORY.md |
| OpenAI Codex | ~/.codex/sessions/*.json |
CodexWriter | AGENTS.md, instructions.md |
| Gemini CLI | ~/.gemini/tmp/*/chats/session-*.json |
GeminiWriter | GEMINI.md |
| Grok CLI | ~/.grok/sessions/<workspace>/<session-id>/updates.jsonl |
GrokWriter | GROK.md |
| OpenCode | SQLite 数据库 ~/.local/share/opencode/opencode.db(或 opencode-local.db;可用 HEADROOM_OPENCODE_DB 覆盖) |
CodexWriter(共享) | AGENTS.md, instructions.md |
9. CLI 完整参考
headroom learn [OPTIONS]
Options:
--project PATH 项目目录(默认:当前目录)
--all 分析所有已发现的项目(与 --project 互斥)
--apply 写入推荐(默认:dry-run)
--target TEXT 写入的目标上下文文件(Claude Code 默认 CLAUDE.local.md)
--main-only 只扫描顶层主会话,跳过嵌套的 subagent/workflow 转录
--agent [auto|claude|codex|gemini|grok|opencode]
要分析的 Agent(默认:auto 自动检测)
--model TEXT 分析用 LLM(默认:从 API key 或已装 CLI 自动检测)
--workers / -j INTEGER 并行分析 worker(最小 1,默认:min(CPU 核数, 8))
--verbosity 分析输出冗长度级别而非失败模式
--llm-judge 用 LLM 对冗长度质量评分(需配合 --verbosity)
几个源码层面可以补充的确定性行为:
- 参数组合的前置校验:
--all与--project互斥、--llm-judge必须配合--verbosity,违反时直接抛出click.UsageError(learn.py);--verbosity --all --apply也会被拒绝,因为 verbosity 只持久化一个全局级别; --main-only的当前语义(以 CLI 帮助文本 为准):只扫描顶层主会话、跳过 Claude Code 嵌套的 subagent/workflow 转录;默认扫描全部;--workers默认值为min(os.cpu_count(), 8)(learn.py),传1可强制串行;- 跨 Agent 容错:
auto模式下某个 Agent/项目扫描失败只打印警告并跳过,不会中断整轮分析(learn.py); - 项目定位:不带
--project时先匹配当前目录,未命中则逐级向上匹配父目录(learn.py),未找到时会列出可用项目提示你改用--all或--project。
10. 冗长度学习(--verbosity)
headroom learn --verbosity 走的是另一条独立流程:不分析失败,而是从行为信号推断你偏好的输出冗长度(1–4 级:1=轻省略、2=无客套+不复读、3=只给结论、4=电报式碎片),并写入 verbosity.json 配置档。
它的行为信号提取逻辑见 verbosity.py,几个关键设计:
- 中断率(interrupt rate):用户在回答中途打断的比例(解析
[Request interrupted by user标记),是"太啰嗦"的推力信号; - 快速跳过率(fast-skip rate):回复在"读完整段答案所需时间的一半"之前到达,说明用户根本没读完。阈值是长度自适应的(按 250 词/分钟的阅读速度换算,而非固定秒数),且只对 ≥150 词的回答计分;
- 复读率(echo ratio):输出中复述已有上下文的比例(回看最近 4 条消息)。
--apply 时的副作用与限制(原文档强调,源码 learn.py 印证):
- 写出
verbosity.json(级别档)与output_savings.json(分层基线,作为输出节省度量的合成对照组); - 输出整形器(output shaper)默认是关闭的,且需要
beta运行时灰度通道。--verbosity --apply会尝试对本地运行中的代理热开启(POST /admin/runtime-env);如果代理不存在或被通道拦截,则打印提示:需先export HEADROOM_ROLLOUT_CHANNEL=beta和HEADROOM_OUTPUT_SHAPER=1,再执行headroom wrap ...; - 想让整形器跨代理重启保持开启,需在启动代理前导出上述两个环境变量。
标志位交互(与第 9 节校验逻辑一致):--llm-judge 需要 --verbosity;--verbosity --all --apply 被拒绝;--target、--main-only、--workers 等在 verbosity 模式下会被显式提示忽略。当前 verbosity 流程仅支持 Claude Code 转录(learn.py)。--llm-judge 通过 LiteLLM 调用 LLM 覆盖启发式级别,失败时静默回退到启发式(best-effort,learn.py)。
11. LLM 后端选择
headroom learn 需要一个 LLM 来分析会话。analyzer.py 中的自动选择优先级为:
| 优先级 | 来源 | 示例 |
|---|---|---|
| 1 | --model 标志 |
headroom learn --model gpt-4o |
| 2 | API key 环境变量 | ANTHROPIC_API_KEY(→ claude-sonnet-4-6)、OPENAI_API_KEY(→ gpt-4o)、GEMINI_API_KEY(→ gemini/gemini-flash-latest) |
| 3 | HEADROOM_LEARN_CLI 环境变量 |
export HEADROOM_LEARN_CLI=gemini |
| 4 | 自动检测已安装的 CLI | 依次检查 PATH 中的 claude、gemini、codex |
全部落空时抛出带配置指引的 RuntimeError,CLI 层会打印错误并以退出码 1 结束(fail-fast,learn.py)。
没有 API key 也能用
如果你通过订阅使用 Claude Code / Gemini CLI / Codex(没有裸 API key),headroom learn 可以直接把它们当作 LLM 后端调用:
# 自动检测 PATH 中的 claude —— 无需 API key
headroom learn
# 显式选择 CLI 后端
headroom learn --model gemini-cli
# 通过环境变量固定 CLI
export HEADROOM_LEARN_CLI=codex
headroom learn
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0624
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00