Skip to content

PawzoChat v0.2.0

Latest

Choose a tag to compare

@iwyxdxl iwyxdxl released this 29 Jul 07:39

新增

  • QQ 聊天通道:原生接入 QQ 机器人开放平台 API v2(WebSocket 网关接收、access_token 自动刷新与续期、私聊 C2C 收发)。入站支持文本、图片、视频、文件(富媒体按附件 URL 即时下载,图片 ≤20MB / 视频 ≤30MB / 文件 ≤100MB,超限跳过不影响整条消息),以及语音——兼容 QQ 原生语音实际使用的 content_type: "voice"(及 voice_wav_url / .amr / SILK 形态),优先下载平台 WAV,必要时将 SILK 解码为 Web 可播放音频,并读取 asr_refer_text 作为转写;未提供转写时不进入对话队列并记录诊断日志。原生语音与普通 audio/* 文件分流,MP3/WAV 等附件不会因缺少转写而被丢弃;出站支持文本、图片、文件(base64 富媒体上传,文件受 QQ 平台扩展名限制,被拒时干净落日志而非静默吞掉)。添加账号时填写 AppID / AppSecret 即可,需先在 QQ 开放平台为机器人开通 C2C 私信权限。仅支持私聊,群消息忽略;被动回复绑定收到消息的 msg_id 并使用随机 16 位 msg_seq,同一入站消息最多使用 4 次被动回复,之后降级为不带 msg_id 的即时发送;QQ 主动推送服务仍保持关闭。入站引用上下文支持官方新增的 message_scene / msg_elements 字段;「正在输入」状态当前未启用
  • 第三方插件聊天通道:插件可通过 ctx.channels.register_channel(...) 注册完整通道(自带消息收发循环 + 出站处理器),用 ctx.channels.submit_inbound(...) 把消息推入队列;PawzoChat 负责消息队列与 AI 调用。需声明 channel.register 权限。插件被禁用 / 卸载时自动注销其通道并下线相关账号
  • 添加账号支持选择通道类型:微信(扫码)/ QQ(表单)/ 插件自定义通道;账号列表与链接选择器展示所属通道,链接路由按账号自动识别通道类型
  • 快速配置支持 QQ / 第三方通道:添加账号步骤按通道类型分流表单,QQ 通道参数弹窗内嵌 OpenClaw 机器人配置页超链接
  • 聊天窗口点击角色头像跳转角色详情页,点击自己头像跳转个人资料页;长按/右键头像不再触发引用
  • 快速配置增加第四步「隐私说明」:软件声明 + 隐私说明折叠卡片 + 遥测开关(向导内默认开启,完成后立即上报 quick_setup_complete 事件);桌面端卡片限高 85vh 内部滚动,移动端全屏
  • AI 语音消息(TTS):角色开启「语音选项」后,AI 可在回复里用 [语音]/[voice] 标记(可选情绪 [语音-happy])把内容合成为语音条,与文字按书写顺序穿插发送;合成失败或未开启时该段自动降级为文字。情绪对 MiniMax 原生与 PawAPI 等 OpenAI 兼容中转均生效(后者经 metadata.voice_setting 扩展字段透传,不支持该扩展的端点自动去除后重试)。网页对话以微信风格语音气泡渲染(时长自适应宽度、点击播放、波纹动画)
  • 入站语音回放:微信/QQ 用户语音保存为 Web 面板可播放的结构化语音条,语音转写在 AI 上下文中统一表示为 [语音] 转写内容;音频下载或转码失败时按该格式降级为普通文本。网页聊天窗口中长按或右键语音条,未展开时显示“转文字”,展开后切换为“收起文字”;展开文本不包含 [语音] 标记
  • 语音服务商管理:设置页新增「语音服务商」,支持 MiniMax 原生(/v1/t2a_v2)、OpenAI 兼容(/v1/audio/speech)及 PawAPI 预设与自定义;可增删改服务商/模型、导入预设、按模型指定调用方式与默认音色,并在「语音测试」页试听。音色下拉随模型所属体系(MiniMax / OpenAI)联动
  • 语音出站:QQ 转码为 SILK 后发送真正的语音气泡;微信固定发送音频文件卡片——经实测确认 iLink 投递管线会静默丢弃 bot 方向的 voice_item(sendmessage 返回 200 但客户端不渲染,逐字节镜像真实入站语音报文亦然;官方 openclaw-weixin 插件同样从不发送语音);网页预览直接播放 MP3。转码依赖缺失或发送失败时统一回退文件卡片

变更

  • 通道协议同步腾讯官方近期实现:微信 iLink 元数据升级至 @tencent-weixin/openclaw-weixin@2.4.6channel_version=2.4.6client_version=132102),保存并复用扫码 IDC 线路;QQ 网关优先使用新版 /gateway(旧 /gateway/bot 仅作 404/405 兼容回退),补齐网关关闭码恢复、5000 字安全分段和文件上传原名
  • 记忆机制由「固定轮数自动总结」改为 LLM 工具驱动:新增内置工具 record_memory / update_memory,角色开启记忆后 AI 在对话中自主决定何时记录新记忆、何时覆盖更新过时记忆;[历史记忆] 注入块为每条记忆标注编号 #N 作为更新目标(与网页记忆管理的序号同源)。记忆条数超过「最大记忆条数」时仍自动后台合并,改为在每轮对话结束后检查触发(工具/网页/朋友圈写入的记忆统一兜底,且避免合并在本轮中挪动编号)。记忆工具仅在对话中可用,朋友圈生成/评论不暴露(朋友圈记忆仍由独立的「写入记忆」开关控制)。存储格式(data/chats/<persona_id>/memory.json)不变,网页面板的手动记忆管理不受影响。注意:工具策略为白名单模式的角色需自行把 record_memory / update_memory 加入白名单;不支持工具调用的模型不再自动产生记忆(仍可在网页面板手动管理)
  • 恢复「提醒轮数」(trigger_rounds)配置:代替已移除的固定轮数强制触发,改为每 N 轮未记录记忆后在 LLM 上下文注入一条系统级提醒,提示 AI 回顾本轮是否有值得记录的重要信息(身份/喜好/约定/感受等),无值得记录的内容则跳过。设为 0 禁用提醒,默认 10 轮。同时恢复角色编辑器的对应步进器与 API 校验,「包含在提示词」下方新增「提醒轮数」设置项。旧 config.yaml 中的 trigger_rounds 字段不再被自动清除,向后兼容 0.1.9 之前的版本
  • 记忆链路加固:记忆文本注入上下文前中和行首 [ 段落标记(防止诱导 AI 记下伪造的 [系统指令] 段劫持系统提示,合并提示同样处理);工具/网页写入的记忆内容增加长度上限与类型校验;max_memories 下限钳位为 1(0/负值会导致每轮空烧 LLM 合并);记忆保存失败不再向 AI/网页谎报成功
  • 统一聊天通道抽象:新增 Channel 抽象基类 + 通道注册表,微信 / QQ / 网页 / 插件通道共用同一套生命周期(启停、在线状态、出站投递、主动推送策略);回复分发不再硬编码 channel == "wechat",改为按通道注册表分发,网页预览的打字延迟并入 WebChannel
  • 持久化结构泛化:账号模型新增 channel_typeextra(QQ / 插件凭据存于 extra,不进 config.yaml);会话绑定由 wechat_link 泛化为 channel_link(含 channel / peer_id / reply_target),旧文件在读取时按需迁移,并保留 wechat_link 镜像以兼容版本回退
  • 主动消息与插件出站改为按通道策略判定(Channel.can_push_now):微信沿用 23h openclaw 上下文窗口与群聊跳过,QQ 为纯被动(不主动推送),网页无限制;插件自定义通道默认允许主动推送,实际平台不支持时由插件的出站处理器返回失败
  • 遥测默认关闭(隐私优先),快速配置向导内提供开启选项
  • 网页静态资源缓存按公网/本地分流:本地面板改为每次校验(no-cache),修复更新后被旧 JS/CSS 缓存钉住;聊天图片/语音改为强不可变长缓存、表情包改用 ETag 协商缓存,修复消息列表重渲染时媒体重复下载、气泡塌缩、滚动位置错乱

内部

  • 新增模块:pawzochat/channels/{base,registry,web,qq,plugin}.pypawzochat/transport/qq/{client,gateway,models}.py;新增依赖 websocket-client
  • 微信收发迁移进 WeChatChannel:每账号的 iLink 客户端 / 发送器 / 长轮询器由 App 收归通道内部;清理 App.get_sender 与三个账号字典、ReplyDispatcher._delay_for_local_previewapi_accounts.list_accounts 的 O(n²) 与未用 inv_map
  • 账号接口新增 GET /api/accounts/channels(可添加的通道及表单元数据)与通用 POST /api/accounts(表单通道创建,QQ 通过拉取 access_token 校验凭据);列表接口补 channel_type / channel_name,在线状态走通道 is_online
  • 插件 API 新增 ChannelsFacadechannel.register 权限;PluginContext 注入 channels 门面,见 docs/plugin-development-guide.md
  • 新增模块:pawzochat/mcp/builtin/memory_tools.pyMemoryService 新增轮次计数器与提醒触发逻辑(on_round_complete / on_memory_recorded / check_and_ack_reminder
  • 新增路由:POST /api/telemetry/send
  • 遥测不再区分开发/打包模式,统一由 enabled 开关控制;移除 sys.frozen 检查与 PAWZOCHAT_TELEMETRY_DEV 环境变量
  • 新增语音子系统:pawzochat/voice/{base,manager,synthesis,transcode}.pyproviders/{minimaxi_tts,openai_tts}.py;新增路由 api_voice_providers.py/api/voice-providers CRUD + _test)与 /api/audio/<persona_id>/<file>(支持 Range);text_splitter 新增 parse_voice_reply/strip_voice_markers 并对语音标记正则做防灾难性回溯加固;Persona 全链路贯穿 voice_generation
  • 新增依赖 miniaudio(音频解码/时长探测)、pysilk-mod(PCM↔SILK 编解码),均懒加载,缺失不影响启动;PawzoChat.spec 补充对应 hiddenimports