Skip to content

Pi Desktop 0.4.0

Choose a tag to compare

@lijian-ui lijian-ui released this 13 Aug 04:11
· 27 commits to master since this release

Pi Desktop v0.4.0 Release Notes

✨ 新功能

IM 网关(钉钉机器人接入)

  • 新增「IM 接入」导航页:配置钉钉机器人(渠道名称 / AppKey / AppSecret)、启用 / 停用、连接状态实时展示,支持单聊与群聊。
  • AI 卡片流式输出:钉钉端回复实时流式呈现(AI 卡片),工具执行期间保持"输入中",回复结束自动定格;长回复节流合并发送,不再被平台截断。
  • 斜杠命令(钉钉内直接发送):/model 查看已配置模型、/model <名称或编号> 切换会话模型;/compact 压缩上下文;/help 命令帮助;/reset /clear /new 开启新会话。
  • 默认工作区:每个渠道可配置默认工作目录,机器人会话的 AI 可直接读写该目录下的项目文件;未配置时使用内置聊天目录。
  • 会话迁移:已建立的 IM 会话可整体迁移到新工作目录,对话历史保留、会话身份不变(同一会话在桌面端与钉钉端连续)。两个入口:IM 接入页按渠道批量迁移、桌面会话窗口"选择工作目录"单会话迁移(正在回复的会话自动跳过)。
  • 侧栏辨识:IM 会话在侧栏显示为「[渠道名] 首条消息」,一眼区分来源;会话按工作目录归入「空间」分组。
  • 图片消息支持:钉钉中直接发图片(或图片 + 文字),AI 可识别图片内容(多模态,需模型支持视觉)。图片经钉钉下载接口转 base64 随消息传给模型,下载失败自动降级为文本提示,不影响回复。
  • 群聊回复自动 @:群聊中 @ 机器人提问后,AI 回复会自动 @ 提问人,多人场景不再看漏回复。
  • /status 命令:钉钉内发送 /status 查看当前会话的工作目录与所用模型(/help 命令列表同步更新)。
  • 引用消息:钉钉中"回复某条消息"再提问,被引用内容(含图片)自动附加给 AI,追问场景上下文不丢。
  • 语音转文字:语音消息由钉钉服务端识别后交给 AI(无识别结果时降级为提示文本)。
  • 文件消息解析:接收 docx / pdf / txt 等文件并自动解析文本内容供 AI 阅读(解析失败降级为文件名提示,不影响回复)。
  • AI 主动发送图片 / 文件:回复中提及本地文件路径(或 markdown 图片语法)时自动上传,并作为独立图片 / 文件消息发送,文本中替换为提示——不依赖 AI 学习任何特殊约定。
  • markdown 表格渲染:AI 卡片与消息中的 markdown 表格正常渲染(此前被内容预处理破坏,已改为原样发送)。
  • 群聊消息队列:同一群的并发提问按到达顺序串行回复(A → B → C),不会回复丢失或内容混合。
  • 工具调用进度展示:AI 调工具时卡片实时显示"🔧 正在调用工具:xxx 参数",正文到达自然覆盖;工具只调不总结时卡片定格"✅ 已完成"。
  • 用户姓名 / 群名感知:AI 收到 [群:xxx][用户:张三] 前缀,知道谁在哪个群提问,可称呼对方;群聊最终回复带 @昵称 前缀(文本 @,明确回复对象——钉钉企业内部机器人不支持真 @ 渲染,为平台限制)。
  • 渠道卡片操作强化:编辑 / 删除 / 启停开关 / 批量迁移会话 / 配置工作区。

个人微信(iLink 扫码接入)

  • 扫码绑定,无 AppID/AppSecret:添加渠道选「微信」→ 显示二维码(主进程用 qrcode 渲染为图片)→ 手机微信扫码(必要时输入配对码)→ 绑定成功自动写入凭证,保存即连接。
  • 文本收发:官方 iLink 协议(HTTP 长轮询 getupdates),单聊直连;回复自动过滤不支持的 markdown 语法(代码块/表格保留、中文斜体/图片标记剥离),发送期间显示"正在输入"。
  • 图片收发:接收图片自动 AES 解密后交给 AI 识别(多模态);AI 回复中提及本地图片 / 文件路径时自动上传发送为独立图片 / 文件消息(发图依赖 iLink CDN 服务,平台侧偶有限制)。
  • 会话过期保护:token 失效(errcode=-14)自动暂停轮询 5 分钟,渠道卡片显示「登录已过期」并提供一键重新扫码绑定,不再静默失联。
  • 断线重连:长轮询超时静默重试、指数退避;get_updates_buf 游标与上下文 token 落盘,重启后续聊不丢消息。
  • 支持多实例:可扫码绑定多个微信(各实例独立机器人、独立会话)。

QQ 机器人(扫码接入)

  • 扫码绑定,无 AppID/AppSecret 手动配置:添加渠道选「QQ」→ 展示二维码 → 手机 QQ 扫码 → 自动写入机器人凭证(AppID + AppSecret),保存即连接;已绑定渠道可一键重新扫码。
  • 文本收发:QQ 官方 SDK(@tencent-connect/qqbot-nodejs,WebSocket 长连接),私聊全收、群聊仅响应 @ 机器人的消息(自动防骚扰);QQ 原生渲染 markdown(代码块 / 表格 / 列表直接显示)。
  • 斜杠命令(QQ 内直接发送):/model /compact /status /reset /clear /new /help,与钉钉 / 微信一致。
  • /stop 命令(桌面端 + IM 端):随时停止当前运行——agent 停止生成,正在执行的 bash 命令同步终止(子进程树被清理),桌面端停止按钮与 IM 端 /stop 行为一致(QQ / 钉钉 / 微信通用)。
  • 图片收发:接收图片自动下载交给 AI 识别(多模态,无需解密——QQ 附件直接给明文 URL);AI 回复中提及本地图片 / 文件路径时自动上传为独立图片 / 文件消息,文本中替换为提示。
  • 语音转文字:语音消息由 QQ 服务端识别(ASR)后交给 AI,无需额外处理。
  • 流式输出(打字机):私聊回复实时逐字呈现(QQ stream_messages,500ms 节流),群聊自动回退整段发送(平台不支持群聊流式);流式被平台拒绝(内容前缀变更)时自动降级整段发送,不中断回复。
  • 引用消息:QQ 中"回复某条消息"再提问,被引用内容自动附加给 AI,追问场景上下文不丢。
  • 渠道命令审批:渠道开启「命令审批」后,AI 执行 bash 命令需在 QQ 上确认——QQ 发送带按钮的审批卡片(✅ 允许 / ⛔ 拒绝 / 🔁 允许并记住 / 本次会话允许),点按钮即放行;钉钉 / 微信回退文本指令(/allow /deny /allow_always,或 allow:1 等),三端统一不重复确认(渠道审批优先于桌面端全局模式,危险命令黑名单始终强制)。
  • 允许并加入白名单:审批时点「允许并记住」→ 命令动词自动写入全局白名单(~/.pi/agent/bash-guard.json),以后全渠道免审批;黑名单命令拒绝写入。桌面端审批弹窗同步新增该选项。
  • 定时任务完成推送:定时任务可配置「完成后推送」到指定 IM 渠道(QQ / 微信 / 钉钉),任务执行结果(最终回复)主动推送到该渠道最近活跃会话。

定时任务(自动化)

  • 新增「自动化」一级导航与定时任务管理页:创建 / 编辑 / 启用暂停 / 删除 / 立即运行。
  • 三种调度类型:每天(指定时间)、间隔(按分钟)、单次;30 秒心跳调度,防重入,错过运行窗口按配置策略自动处理。
  • 任务编辑支持:提示词、附加规则(随任务注入 <scheduled_task> 系统提示词块)、执行模型独立选择、权限配置(YOLO 全自动 / 询问仅白名单,危险命令黑名单始终强制)。
  • 运行历史自动归档:一个任务 = 一个累计会话,存于标准会话目录;侧栏「定时任务」分组点击即开,支持继续追问、导出、重命名、删除;运行中显示转圈,执行事件实时推送。
  • 任务配置独立存放 ~/.pi/agent/scheduled/(scheduled-tasks.json / scheduled-runs.json / scheduled-state.json),启动自动迁移旧位置文件。

多模态图片输入

  • 对话输入框支持粘贴(Ctrl/Cmd+V 剪贴板截图)/ 文件上传 / 拖拽三种方式添加图片。
  • 待发送图片以胶囊缩略图展示,可逐个移除;发送时以 base64 随消息传给模型(Pi SDK 原生支持 prompt(text, { images }),主进程 / preload 零改动)。
  • 消息内渲染图片缩略图,点击可看大图;图片从 SDK message_start 事件与会话历史的 image content block 解析,切换/重开会话后缩略图依然保留
  • 流式队列场景透传图片;支持多模态模型(Qwen-VL / GPT-4o / Claude 等)"看到"图片,纯文本模型自动忽略不崩溃。

规则与记忆(设置)

  • 原「记忆」占位页升级为「规则与记忆」页面。
  • 导入设置:AGENTS.md、CLAUDE.md(含 CLAUDE.local.md)上下文文件导入开关,拨动即保存;默认均不注入,由用户自行开启。开启后按目录链自动发现并注入系统提示词(AGENTS 与 CLAUDE 可同时注入)。
  • 规则:单一 rules.md 文件管理全部规则,支持创建 / 编辑 / 删除;规则以 <rules> 块注入系统提示词最末尾,所有会话(含定时任务)遵循;每轮重读,保存后下一条消息即生效。

Pi 扩展商店

  • 新增一级导航「扩展」,对标 pi.dev 的扩展市场:市场 / 已安装双 Tab。
  • 市场:数据直接来自 npm registry(keywords: pi-package),支持关键字搜索、按下载量排序、无限滚动分页(触底自动加载 + 「加载更多」兜底,可浏览成百上千个包)。
  • 包详情弹窗:点击任意卡片弹出,展示完整元信息(版本 / 发布时间 / 作者 / 许可证 / 体积 / 依赖数 / 月下载 / 周下载量)+ README 全文(Markdown 渲染),并可直接安装、跳转 npm / 主页 / GitHub。
  • 已安装:列出已安装扩展(支持 git 源),一键卸载;npm 源的已安装卡同样可点开详情;详情中对已装包显示「已安装」状态。
  • 安装机制直接复用 Pi SDK 的包管理器(无需 pi CLI):包下载到 ~/.pi/agent/npm/node_modules/,配置写入 settings.jsonpackages;装/卸后清缓存,下一会话生效(暂只支持全局安装)。

帮助与反馈

  • 新增「帮助」页面:新手引导(快速上手)、常见问题(FAQ)、资源链接(官方文档 / 扩展市场 / 版本发布页)、反馈渠道(问题上报),并接入原生菜单入口。
  • 帮助页内所有外部链接统一走系统默认浏览器,不弹应用内窗口。

技能页(扩展技能管理)

  • 新增启用 / 停用开关:停用后 agent 系统提示词不再注入该技能(disable-model-invocation frontmatter,即时生效),输入框 / 命令补全同样排除;技能列表默认全部显示(停用项置灰 + 「已停用」标记),可一键「隐藏已停用」。
  • 新增删除按钮(垃圾桶图标):移除技能目录,二次确认弹窗,仅允许删除用户 / 项目技能目录内的技能(路径安全校验)。

🐛 问题修复

  • 定时任务会话点击无反应:会话文件改存标准 sessions/ 目录,可被正常发现与打开。
  • 运行后侧栏分组不出现(需手动刷新):运行事件同步刷新会话列表。
  • 第二次运行结果不显示(需整页重载):定时任务运行事件接入统一事件管道,内容实时累积。
  • 运行完成后仍转圈:运行记录引入唯一 ID,状态准确落盘。
  • 定时任务默认工作目录误用 chat 目录导致会话重复渲染:默认改为空,未绑定工作空间时运行于 ~/.pi/agent/cron 兜底目录。
  • 外部链接打开应用内新窗口:所有 http/https 外链(详情页链接、README、LLM 回复中的链接等)统一改用系统默认浏览器打开,不再弹出应用内窗口。
  • 扩展市场搜索 400:搜索关键字与基础查询参数冲突(重复 text 参数),改为替换式拼接。
  • 钉钉机器人连接报错(bufferutil)ws 可选原生依赖残留打包导致连接启动失败,改为运行时解析整条依赖链。
  • 钉钉消息无响应:机器人订阅声明晚于连接握手,服务端不下发消息;调整注册时序后正常收发。
  • 钉钉"回声"与回复丢失:SDK 对用户消息也会发 message_end,回复路由按角色过滤后修复。
  • IM 会话点开不渲染 / 切模型不生效:会话事件改为始终广播(渲染端按会话累积);模型切换显式携带会话工作目录。
  • 钉钉卡片卡"处理中" / 长回复截断 ***:结束信号改用回复周期终点(agent_end);流式发送节流合并,规避平台单帧限制。
  • IM 会话迁移后 AI 仍在旧目录工作:会话工作目录以会话文件自身 header 为准(迁移、渠道配置均不覆盖),钉钉端与桌面端一致。
  • /model 无参报错:模型列表超长触发平台消息长度限制,改为只列已配置模型并自动拆条发送。
  • /model 供应商名显示为模型名:展示层增加品牌名映射与脏数据兜底(provider 名称等于模型 ID 时回退显示供应商 ID)。
  • 钉钉发图 AI 无响应 / 只收到文本:图片消息负载解析错误(钉钉将消息体放在 content 字段而非顶层字段),已修正;同时支持图文混合(richText)消息,图片 + 文字可一并交给 AI。
  • IM 接入页进入时内容跳动:异步加载期间显示稳定"加载中"占位,不再先闪现空状态再跳成真实内容。
  • IM 空状态重复的"添加渠道"按钮:移除空状态内的按钮,统一使用右上角入口。
  • IM 接入页观感回归朴素:移除渐变头、悬停抬升、入场动画等装饰,仅保留功能性状态动画(加载旋转、状态指示),暗 / 亮主题一致。
  • 钉钉 markdown 表格不渲染:卡片内容预处理给表格每行前插空行,导致解析器不识别为连续表格;移除预处理、内容原样发送后正常。
  • AI 发送图片在钉钉显示损坏sampleImageMsgphotoURL 需传@ 前缀的原始 media_id(去 @ 或 URL 形式客户端均不识别,显示损坏图标)。
  • AI 发送文件在钉钉显示异常sampleFilemediaId 字段同样需传@ 前缀的原始 media_id(与图片一致),否则文件消息不可用。
  • 钉钉内联 markdown 图片不显示:客户端 markdown(卡片 / 消息)不渲染图片引用,回复中的图片引用统一替换为纯文本提示,图片走独立图片消息。
  • 群聊回复不自动 @:新版机器人接口的 sampleText 消息参数不支持 at,改用消息自带的会话 webhook 发送群聊回复(官方同款通道),命令 / 文本回复自动 @ 提问人。
  • 命令回复挤成一行:钉钉 markdown 渲染遵循规范(单个换行不换行),/status /help /model 回复改为 markdown 列表项,逐行展示。
  • 桌面端钉钉会话只显示最近几轮:点击会话时若本地缓冲存在即跳过历史加载;改为始终从主进程拉取完整历史(缓冲仅用于实时增量)。
  • 钉钉群聊 @ 无法渲染:企业内部机器人(stream + 新版接口)不支持 @(官方文档"接口暂不支持 @ 功能",webhook 的 userIds / atUserIds / atDingtalkIds 均不渲染)——平台限制,以回复文本 @昵称 前缀替代。
  • QQ 保存配置卡"保存中":SDK 启动在扫码后未上线的机器人上永久重连不返回,绑定已成功但保存流程被阻塞;改为异步预取 token + 启动超时兜底,保存即时完成(绑定成功 ≠ 机器人已上线,需在开放平台完善信息)。
  • QQ 审批按钮点击变文本:按钮交互类型配置错误(action.type=2 被 QQ 当作快捷回复,点击把代码当消息发送);改为 type=1(交互回调)后点按钮直接审批放行。
  • 钉钉审批无多按钮卡片:钉钉 v1.0 机器人接口无多按钮 ActionCard 模板(sampleActionCard_2 / sampleCard 均被拒),钉钉审批以文本指令(/allow allow:1)呈现,多行排版展示。
  • 停止按钮不终止正在运行的 bash 命令:SDK 的 session.abort() 只停止 agent 生成、等待 bash 子进程自然结束(abortBash 仅在会话销毁时调用);改为停止前先触发 abortBash() 终止命令进程树——桌面端停止按钮与 IM 端 /stop 均立即生效。

📦 构建

  • 版本号:0.4.0
  • Electron:^35.0.0
  • Pi SDK:^0.83.0
  • node-pty:^1.1.0
  • React:^19.1.0
  • 新增依赖:dingtalk-stream(钉钉机器人长连接)、axios(钉钉开放平台 API)、mammoth + pdf-parse(docx / pdf 文档解析)、form-data(媒体上传)、@tencent-connect/qqbot-connector + @tencent-connect/qqbot-nodejs(QQ 扫码绑定与机器人 SDK)