news 2026/8/30 21:03:52

i-have-adhd扩展API全解:registerFlag、registerCommand与on(input)实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
i-have-adhd扩展API全解:registerFlag、registerCommand与on(input)实战

i-have-adhd扩展API全解:registerFlag、registerCommand与on(input)实战

【免费下载链接】i-have-adhdA skill to stop your coding agent from burying the answer. ADHD-friendly output.项目地址: https://gitcode.com/GitHub_Trending/ih/i-have-adhd

i-have-adhd 是一款让编码 Agent 输出"ADHD 友好"回复的技能插件——答案先行、步骤编号、没有废话开头。本文带你拆解它的 Pi 扩展 API:registerFlagregisterCommandon(input)三个核心接口的实战用法,全部实现就在 extensions/i-have-adhd.ts 一个文件里,约 220 行,是学习 Agent 扩展开发的上佳样本。

先认识 i-have-adhd 扩展:规则与行为的分工

这个项目把"内容"和"行为"拆开了:

文件职责
skills/i-have-adhd/SKILL.md10 条 ADHD 友好输出规则(内容)
extensions/i-have-adhd.tsPi/OMP 运行时扩展,负责开关、命令、拦截(行为)
extensions/context-compat.ts上下文探测工具,判断规则是否还"活着"
package.json声明pi.extensions入口,Pi 靠它发现扩展

扩展启动时先读取 SKILL.md 正文(去掉 frontmatter),然后在 Pi 提供的扩展 API 上挂三样东西:一个启动标志、一个斜杠命令、一组事件监听。下面逐个拆解。

registerFlag 实战:一行--adhd启动开关

pi.registerFlag("adhd", { description: "Start with ADHD-friendly output enabled", type: "boolean", default: false, });

这段代码注册了一个布尔型 CLI 参数(extensions/i-have-adhd.ts#L163-L167)。注册后,用户启动 Pi 时就能带上参数:

pi --adhd

扩展内部再用pi.getFlag("adhd")读回它的值,决定新会话是否默认开启 ADHD 模式。它与一个"常驻标志文件"互为兜底:

  • pi.getFlag("adhd") === true→ 本次启动显式开启;
  • existsSync(alwaysOnFlag)→ 检测到~/.pi/agent/.i-have-adhd-always空文件,等于"每次默认开启"。

要点registerFlag只负责"声明 + 默认值",真正的使用发生在session_start恢复状态时,两个时机分离是这类扩展的常见模式。

registerCommand 实战:/i-have-adhd会话级开关

pi.registerCommand("i-have-adhd", { description: "Toggle ADHD-friendly output for this session", handler: async (args, ctx) => { /* 解析 on/off 参数 */ }, });

注册后,用户在对话框输入/i-have-adhd即可切换模式。handler 的参数解析很简单(extensions/i-have-adhd.ts#L169-L191):

输入行为
/i-have-adhd(不带参数)翻转当前状态(开→关、关→开)
/i-have-adhd on显式开启
/i-have-adhd off/stop显式关闭
其他参数弹出用法提示Usage: /i-have-adhd [on\|off]

切换时做的三件事值得注意:

  1. pi.appendEntry(STATE_ENTRY_TYPE, { enabled })—— 把开关状态写入会话分支,重开会话能恢复;
  2. ctx.ui.setStatus(STATUS_KEY, "● ADHD ON")—— 在底部状态栏打上绿色标记;
  3. ctx.ui.notify(...)—— 弹一条 "ADHD mode enabled/disabled" 通知。

要点registerCommand提供的是"确定性入口",用户随时能精确控制模式,这比让模型自己决定何时切换更可靠。

on(input) 实战:拦截用户输入做"关键词魔法"

on(input)是扩展监听用户每条输入的机会,返回不同的 action 决定这条输入的命运:

pi.on("input", async (event, ctx) => { const input = event.text.trim().toLowerCase(); if (input === "/skill:i-have-adhd") { setEnabled(true, ctx); return { action: "handled" }; // 拦截,不发给模型 } if (enabled && STOP_PHRASES.has(input)) { setEnabled(false, ctx); if (ctx.hasUI) return { action: "handled" }; return { action: "transform", text: `Reply with exactly: ADHD mode disabled.` }; } return { action: "continue" }; // 放行,正常处理 });

三种返回值各有用途(extensions/i-have-adhd.ts#L193-L217):

返回值效果本项目的用法
{ action: "handled" }输入被吞掉,模型完全看不到/skill:i-have-adhd当作开启别名,避免规则被重复注入
{ action: "transform", text }替换成指定文本再发给模型无 UI 环境下,把"stop adhd mode"改写为"只回复确认句"
{ action: "continue" }原样放行绝大多数输入

最巧妙的地方是自然语言停止词:用户直接输入stop adhd modenormal mode(不是斜杠命令)也能关闭模式。停止词集合就一行:new Set(["stop adhd mode", "normal mode"])

会话事件与上下文同步:保证规则"永远在场"

除了input,扩展还监听了三个会话事件:

pi.on("session_start", async (_e, ctx) => restoreState(ctx)); pi.on("session_tree", async (_e, ctx) => restoreState(ctx)); pi.on("session_compact", async (_e, ctx) => syncContext(ctx));
  • session_start / session_tree:新会话、恢复或分叉时,从分支历史读回保存的开关状态,必要时把规则注入对话;
  • session_compact:会话压缩会丢掉已总结的旧消息,此时检测规则是否还在上下文里,不在就重新注入。

"规则是否还在"的判断在 extensions/context-compat.ts 中:contextMessages()兼容探测不同运行时的 sessionManager API(探测失败时安全降级为"不在",宁可重复注入也不破坏启动);latestMarkerIsActive()只看最新一个标记——后出现的 "disabled" 通知可以覆盖之前的规则集。注入本身用pi.sendMessage完成,display: false保证用户看不见这条规则消息,triggerTurn: false保证不会触发模型额外回复。

核心 API 速查表

API作用本项目用途
pi.registerFlag(name, opts)注册 CLI 启动参数--adhd布尔开关
pi.getFlag(name)读取标志值判断本次启动是否默认开启
pi.registerCommand(name, opts)注册斜杠命令/i-have-adhd [on\|off]
pi.on("input", handler)拦截用户输入停止词关闭、skill 命令别名
pi.on("session_start", handler)会话开始事件恢复上次的开关状态
pi.on("session_compact", handler)上下文压缩事件重新注入被压缩掉的规则
pi.sendMessage(msg, opts)向会话注入消息静默注入/撤销规则集
pi.appendEntry(type, data)写会话自定义数据持久化开关状态
ctx.ui.setStatus / notify状态栏 / 通知● ADHD ON标记、切换提示

快速验证效果

  1. 按 INSTALL.md 中 Pi 章节安装扩展;
  2. 输入/i-have-adhd,状态栏出现● ADHD ON
  3. 提问一个多步骤任务,观察回复是否"命令先行 + 编号步骤 + 无寒暄";
  4. 输入stop adhd mode,确认模式即被关闭——这正是on(input)的功劳。

总结:三个 API 各司其职

  • registerFlag:管"启动时"——pi --adhd让默认状态由用户掌控;
  • registerCommand:管"会话中"——/i-have-adhd提供随时可预测的开关;
  • on(input):管"每条输入"——自然语言停止词和别名拦截让体验更顺滑。

配合session_start/session_compact两个事件,整个扩展做到了规则"注入一次、压缩后补注、随用户意愿关闭"。想动手实践?通读 extensions/i-have-adhd.ts 全文,再对照 AGENTS.md 里的仓库地图,你会对 Agent 扩展的事件模型建立完整认知。

【免费下载链接】i-have-adhdA skill to stop your coding agent from burying the answer. ADHD-friendly output.项目地址: https://gitcode.com/GitHub_Trending/ih/i-have-adhd

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/30 20:59:51

Jellyfin媒体服务器从部署到跑通:一份实操指南

Jellyfin媒体服务器从部署到跑通:一份实操指南 【免费下载链接】jellyfin The Free Software Media System - Server Backend & API 项目地址: https://gitcode.com/GitHub_Trending/je/jellyfin 出差时想接着追家里NAS上没看完的剧,却发现文…

作者头像 李华
网站建设 2026/8/30 20:54:31

58同城算法工程师面试复盘:机器学习与推荐系统核心考点解析

去年下半年集中面了一批算法岗,58同城的算法工程师面试是印象比较深的一场。整体下来最大的感受是:它不像大厂那样疯狂堆八股难度,但非常看重候选人对业务的理解,尤其是在本地生活服务这种供需匹配场景里,算法怎么落地…

作者头像 李华
网站建设 2026/8/30 20:51:06

小象被充电线缠住:电动车充电安全细节不容忽视

这条视频的传播点不在“大象有多聪明”,而在一个容易让人忽略的细节:小象的腿被电动车充电线缠住了,象妈妈直接拔掉充电器帮它脱困。看起来是自然界里一次默契救援,细想它其实暴露了一个真实问题——电动车充电线摆放不当&#xf…

作者头像 李华
网站建设 2026/8/30 20:43:29

美团2026春招笔试解析:三大方向考点与作答策略

2026年春招美团第二批笔试刚结束,我趁着记忆还热乎,赶紧把这次硬件综合、软件服务、基础设施这三个方向合并考试的完整情况捋一遍。这次笔试和往年不太一样,三个方向放在同一套卷子里,题目跨度非常大,从MOS管到gRPC再到…

作者头像 李华
网站建设 2026/8/30 20:40:32

评估模型输出质量前,为什么必须先读代码?

我不太认同“只看结果就能评价模型输出质量”的说法。不管是通过接口调用开源模型,还是自己训练、微调、部署一个模型,只要没读过推理链路里的代码,你看到的“效果不错”或“效果崩了”都可能只是表象。尤其是做多模态模型、量化交易策略、控…

作者头像 李华