SkillClaw的"只需对话"是怎么做到的?本地API代理静默记录会话与注入技能揭秘
【免费下载链接】SkillClawLet Skills Evolve Collectively with Agentic Evolver项目地址: https://gitcode.com/gh_mirrors/sk/SkillClaw
SkillClaw 是一个让 AI Agent 技能集体进化的开源项目,核心是一个本地 API 代理:它静静站在你的 Agent 与大模型 API 之间,一边静默记录会话轨迹,一边把不断进化的技能"注入"回对话,全程无需你写任何一行代码。
一句话概括:Agent 照常聊天,SkillClaw 后台干活。
为什么"只需对话"不是魔法
SkillClaw 的 slogan 是 "Just talk"——你只管正常和 Agent 对话,技能进化在后台静默发生。这背后其实是两条简单的管道:
- 会话记录管道:代理拦截每一次 LLM 请求,把对话轮次(用户消息、模型回复、工具调用、工具结果)逐条存下来;
- 技能注入管道:代理在把请求转发给真实模型前,先在系统提示词里"塞进"一份技能目录,让模型按需取用。
这两条管道都跑在同一个进程里,也就是 SkillClaw 的Client Proxy。
本地API代理:一个"透明人"中间件
SkillClaw 启动后会监听一个本地端口(默认30000),对外提供两个端点:/v1/chat/completions(OpenAI 风格)和/v1/messages(Anthropic 风格)。把 Agent 的 API 地址指向它,它就成了 Agent 与云端模型之间的"必经之路"。
它做的事情很克制,源码里对自身的定位只有一句话:
"Intercepts LLM requests from Claw agents, injects skills into system prompts, forwards to a real LLM API"
(拦截 Agent 的 LLM 请求,向系统提示词注入技能,然后转发给真正的 LLM API。)
核心逻辑全部在 skillclaw/api_server.py 中,一次请求的处理流程是:
| 步骤 | 动作 | 用户是否感知 |
|---|---|---|
| 1 | 识别会话 ID(session_id)与轮次类型 | ❌ |
| 2 | 注入技能目录到系统提示词 | ❌ |
| 3 | 转发请求到真实模型 API | ✅ 正常收到回答 |
| 4 | 静默记录本轮对话到内存 | ❌ |
| 5 | 会话结束或达到间隔时上传 | ❌ |
整个过程对 Agent 来说完全透明——请求格式不变、响应格式不变,甚至流式输出都做了兼容。这也是为什么它能"广兼容" Hermes、Codex、Claude Code、OpenClaw 等几乎所有走 OpenAI 兼容 API 的 Agent。
静默记录:会话轨迹是怎么被"攒"起来的
每次请求进来,代理都会把这一轮的关键信息归档:
- 用户指令与模型回复文本
- 工具调用(
tool_calls)与工具返回结果 - 本回合注入了哪些技能(
injected_skills) - 可选的 PRM 打分(用另一个小模型给回答质量打分)
这些轮次数据存在内存中的会话表里。什么时候上传?两个触发点:
- 会话显式结束:Agent 通过
X-Session-Done请求头或请求体里的session_done字段告知"这轮聊完了"(见 api_server.py#L202-L207); - 达到上传间隔:配置
sharing_session_upload_interval后,每 N 个用户轮次就快照上传一次(api_server.py#L3103-L3113)。
上传的目的地是共享存储,路径约定为{group_id}/sessions/{session_id}.json(api_server.py#L3050-L3092)。会话数据与技能数据走不同的云端路径,互不干扰。
💡 关键设计:即使你没配置任何共享存储,客户端代理也能独立运行——它照样做技能注入和本地记录,只是不上传而已。
技能注入:往系统提示词里"夹带"技能目录
如果说记录是"输入",那注入就是"输出"。代理在转发每个main轮次请求前,会调用_inject_skills(api_server.py#L3229-L3272):
- 从本地技能库(
SKILL.md文件)刷新技能清单; - 生成一份 XML 风格的
<available_skills>目录,每个技能包含名称、描述、存放位置; - 把目录追加到第一条 system 消息末尾(没有 system 消息就新建一条)。
这里有个很巧妙的**懒加载(lazy loading)**设计:注入的只是"技能菜单",而不是技能全文。模型被告知——"相关时,最多read一份 SKILL.md"。这样既不撑爆上下文(超长了还会自动降级为精简版目录,见 skill_manager.py#L678-L697),又保证模型需要时才花 token 去读细节。
技能库本身由 skillclaw/skill_manager.py 管理,支持本地目录(~/.skillclaw/skills)和团队共享两种来源;团队协作时,skillclaw/skill_hub.py 负责从共享存储拉取最新技能。
幕后推手:Evolve Server 让技能自己"长大"
记录的技能会话谁来消化?这是可选组件Evolve Server的活(evolve_server/)。它定时扫描共享存储里的会话文件,跑一条"进化流水线":
- workflow 引擎:固定的三阶段 LLM 流水线 —— Summarize(总结会话)→ Aggregate(聚合相似经验)→ Execute(改写/新建技能),实现在 evolve_server/pipeline/;
- agent 引擎:由 OpenClaw 驱动的 Agent 直接编辑技能文件,更接近"让 Agent 自己复盘"。
进化后的技能写回共享技能库({group_id}/skills/<name>/SKILL.md),客户端在空闲时自动拉取——于是你昨天踩的坑,今天全组人都不会再踩。单用户单机跑一个 Evolve Server,也能构成"会话捕获 → 技能进化 → 本地复用"的最小闭环。
快速上手:三步跑通"只需对话"
# 1. 克隆并安装(macOS / Linux) git clone https://gitcode.com/gh_mirrors/sk/SkillClaw cd SkillClaw && bash scripts/install_skillclaw.sh source .venv/bin/activate # 2. 交互式配置向导(选择模型、技能目录、是否共享) skillclaw setup # 3. 启动本地代理并体检 skillclaw start --daemon skillclaw status curl http://127.0.0.1:30000/healthz # 应返回 {"ok": true}随后把 Agent 的 API 地址指向本地代理(比如 Hermes 场景下,skillclaw setup选hermes会自动改写其配置文件),然后……就没有然后了,正常聊天即可。想回滚集成时执行skillclaw restore hermes一键恢复。
小结:透明代理 + 懒加载注入 + 后台进化
SkillClaw 的"只需对话"本质上是工程上的三个优雅取舍:
| 机制 | 解决的问题 | 关键代码 |
|---|---|---|
| 本地 API 代理 | 零侵入拦截任意 Agent | skillclaw/api_server.py |
| 会话静默记录 + 按需上传 | 经验数据自动沉淀 | api_server.py#L3050-L3092 |
| 技能目录懒加载注入 | 技能"随取随用"不耗上下文 | api_server.py#L3229-L3272 |
| Evolve Server 进化循环 | 技能持续去重、提质、共享 | evolve_server/ |
它不改变你的使用方式,只是悄悄重写了 Agent 的成长曲线——你负责说话,它负责让每次对话都算数。🦀
【免费下载链接】SkillClawLet Skills Evolve Collectively with Agentic Evolver项目地址: https://gitcode.com/gh_mirrors/sk/SkillClaw
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考