Releases: iwyxdxl/PawzoChat
Releases · iwyxdxl/PawzoChat
Release list
PawzoChat v0.2.0
新增
- 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.6(channel_version=2.4.6、client_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_type与extra(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}.py、pawzochat/transport/qq/{client,gateway,models}.py;新增依赖websocket-client - 微信收发迁移进
WeChatChannel:每账号的 iLink 客户端 / 发送器 / 长轮询器由 App 收归通道内部;清理App.get_sender与三个账号字典、ReplyDispatcher._delay_for_local_preview、api_accounts.list_accounts的 O(n²) 与未用inv_map - 账号接口新增
GET /api/accounts/channels(可添加的通道及表单元数据)与通用POST /api/accounts(表单通道创建,QQ 通过拉取 access_token 校验凭据);列表接口补channel_type/channel_name,在线状态走通道is_online - 插件 API 新增
ChannelsFacade与channel.register权限;PluginContext注入channels门面,见docs/plugin-development-guide.md - 新增模块:
pawzochat/mcp/builtin/memory_tools.py;MemoryService新增轮次计数器与提醒触发逻辑(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}.py与providers/{minimaxi_tts,openai_tts}.py;新增路由api_voice_providers.py(/api/voice-providersCRUD +_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
PawzoChat v0.1.9
新增
- 人设编写助手:一句话需求即可生成草稿人设,复用 ChatService 的工具调用循环,生成过程可调用联网搜索等 MCP 工具;提供独立的「发现」页入口与快速配置里的「一键生成人设」按钮。生成接口做了请求体类型校验、限定使用已配置模型、收紧工具循环上限(max_iterations=4 / timeout=30s)
- 微信引用消息回复:被引用的消息文本存入独立的
quote字段(不再把[引用: …]前缀塞进正文),气泡下方以微信风格引用框渲染;支持长按 / 右键「引用」、输入框引用预览条,以及历史编辑器中引用的查看 / 编辑 / 清除
变更
- iLink 协议升级到 2.4.4:与上游
@tencent-weixin/openclaw-weixin@2.4.4对齐(channel_version2.4.1→2.4.4、client_version132100、新增bot_agent);扫码登录新增配对码流程(need_verifycode / verify_code_blocked)与按需出现的验证码输入框,并补上 notifyStart / notifyStop 在线状态上报(best-effort,不阻塞启停)
修复
- 加固扫码状态查询,避免上游返回畸形 / 非 dict / 非 2xx 响应时
qr_status直接 500;设置页取消扫码时停止轮询,过期分支清理残留的验证码输入 - 快速设置「新建角色」加固名称校验与反馈:补齐前端的空 / 超长 / 非法字符 / 尾随空格句点 / 重名校验,名称类错误改为输入框下方的行内红字(修复一键生成后名称为空或重名时「下一步」看似无响应);其余向导提示原先被全屏覆盖层遮住全局 toast,改用渲染在覆盖层内部的本地浮层提示。另外生成进行中阻止与创建竞争,并在离开第二步后丢弃迟到的生成结果
内部
- 新增模块:
pawzochat/web/routes/api_persona_writer.py、pawzochat/web/static/modules/persona_writer.js、pawzochat/web/static/modules/qr_verify.js quote贯穿消息队列、会话存储、聊天上下文、世界书匹配与记忆摘要;update_message契约新增 quote 处理(None=保留 / ""=清除 / str=设置)- 清理死代码:移除
AuthManager.qr_login/_print_qr_terminal及未用的base_url构造参数、人设编写助手的工具名白名单(无实际防护且会误伤第三方搜索 MCP);placeActionsPop()提取到 utils.js 共享 - 角色名称非法字符正则提取为
utils.js的ILLEGAL_NAME_RE单一来源,quick_setup / contacts / worldbook 共用
PawzoChat v0.1.8
新增
- 朋友圈支持编辑动态正文与评论文本,纯数据修改不会重新触发 LLM 生成与记忆写入,时间戳保留以保证 feed 顺序不变
变更
- 公网链接下网页面板 SPA 切 Tab 提速:新增 GET 响应内存级 SWR 缓存与 Tab DOM 快照保留,静态资源改为带 ETag 的短期缓存
修复
- 修复公网网页面板下朋友圈刷新 / 发布 / 上传封面 / 评论 / 点赞全部 404
- 修复角色
tool_policy.timeout_seconds未生效:MCP 工具调用现在按角色配置超时,到期会向 LLM 明确返回超时提示,避免对话以「……」静默收场 - 修复工具调用循环跑满迭代上限时返回空回复,现在会抛出明确错误
- 修复 MCP 工具返回的图片在触发 PIL 解压炸弹防护时会中断整轮对话;同时放宽 base64 兼容性(URL-safe / 换行 / 无 padding)并扩展可识别格式
- 修复朋友圈评论「...」菜单贴近屏幕右边时被压成窄条,菜单位置现在自适应视口
完整变更日志见 CHANGELOG.md。
PawzoChat v0.1.7
新增
- 朋友圈:新增独立的「朋友圈」模块,UI 入口在主导航;用户与角色可以共用一条 feed 互相发动态、点赞和评论。每个角色可配置「是否可发动态」(publishers)、「是否参与评论」(repliers)、评论概率 0–100、以及是否将本次朋友圈互动写入该角色记忆;动态封面图、
post/reply提示词模板可在设置中自定义;底层数据按moments.json原子写入到data/moments/,图片按动态 ID 隔离在data/moments/images/<mom_id>/ - 朋友圈生成与回复链路:单 worker 串行调度,所有 LLM 调用(动态生成 / 评论 / 用户被回复后的 counter-reply)共用一把跨 workflow 互斥锁,避免并发触发上游限流;用户在评论区追问被回复角色时,由后台 FIFO 队列处理,不会与正在进行的对话轮次交错;动态作者已支持调用
generate_image工具自动配图(最多一张),系统会将动态文本和配图作为多模态输入提供给评论角色 - 朋友圈记忆联动:默认开启「写入记忆」时,角色自己发布的动态、对用户朋友圈的评论会以第一人称摘要写入该角色的记忆;用户之间或角色之间的互动则按产品决策刻意不写入
- 角色创建 / 导入 / 删除时同步维护朋友圈名单:新角色默认自动加入 publishers 与 repliers,删除角色时清理
publishers/repliers/reply_probabilities/memory_enabled - 内置工具
view_reference_image:让对话中的 LLM 自查当前角色的形象参考图(头像或自定义参考图)。通过pending_images+[图片 ID:xxx]占位符的统一通道注册,再让 LLM 用已有的recognize_image能力适配器读取图片内容——避开 OpenAI / Gemini 工具结果会把图片摊平为占位文本、以及 Anthropic 通道会把参考图作为新图二次推送给用户的问题;当生图功能关闭或角色无可用参考图时,自动从工具列表中过滤 generate_image新增use_reference_image参数:纯风景 / 物品 / 食物等不需要出现人物的画面,AI 可在调用时主动传false跳过角色形象参考图;用户在角色配置里设为ref_mode=none时本参数无效(不会被反向打开)- 插件 MCP 访问(
ctx.mcp):新增list_servers()/list_tools()/call_tool(name, arguments),按声明的权限分别需要mcp.read(列表)和mcp.invoke(调用);工具调用错误不抛异常,而是以工具调用出错: ...文本块返回,与 LLM tool_use 路径同语义 - 插件发布 in-process LLM 工具(
ctx.mcp.register_tool):插件可注册命名空间为plugin_<id>__<name>的工具,与 MCP-server 工具和内置能力并列出现在 LLM 工具列表与 MCP 概览页 / 插件详情页;生命周期跟随插件,disable / reload / 加载失败时自动反注册。新增权限mcp.publish - 插件文件消息支持:
ctx.messaging.send_message新增files参数([{"path": "...", "name": "...", "mime": "..."}]),可推送非图片文件(doc / pdf / zip 等)。微信通道会先复制文件到data/chats/<persona>/files/<随机前缀>__<原名>以保证 Web 预览可用,再走新的 CDN 上传链路(transport/cdn.upload_file、transport/sender.send_file、ILinkClient.build_file_message,沿用图片相同的 AES-ECB 加密 + 重试上限 3 次) - 插件 LLM 复用角色绑定:
ctx.llm新增chat_as_persona(persona_id, messages, ...)复用角色绑定的 provider / model / temperature / max_tokens,每次调用重读 persona 配置;新增list_providers()列出已注册 provider 名、get_persona_binding(persona_id)返回角色当前绑定快照 LLMResponse新增reasoning_content字段;OpenAI 兼容渠道在 tool_use 多轮循环中回传reasoning_content给上游,避免 DeepSeek-v4 / o1 风格代理在 thinking-mode 模型上拒绝继续请求/api/mcp/tools现在为每个工具返回owner标签(builtin/plugin:<id>/mcp:<server>/""表示来自capability_adapters配置项),前端据此对来自插件 / 内置的工具隐藏编辑与删除入口
修复
- 修复 MCP stdio 启动失败:原路径启发式把任何含
/的字符串当作本地路径并重写到APP_HOME,导致 npm scoped 包名 (@scope/name)、--key=value标志、https:///file://URL 被破坏,npx启动的官方 MCP 服务器(如@playwright/mcp)以 ENOENT 失败、被 SDK 包装为Connection closed。收紧规则:仅显式相对路径前缀 (.//../)、绝对路径或已知路径后缀(.py/.exe/.sh等)会被解析为路径 - 修复 MCP 连接生命周期:原先用手工
__aenter__/__aexit__栈,anyio 任务组的 enter 与 exit 跨 asyncio task 执行(每次run_coroutine_threadsafe都是新 task),SDK 仅以 DEBUG 日志吞掉失败、实际清理交给 asyncgen GC。改为一个长存的_lifecycle_task在同一 task 内持有 transport +ClientSession上下文,断开时通过_shutdown_event在限时窗口内优雅退出,必要时再 cancel - 修复 MCP 工具结果中的图片丢失:MCP 服务器可能以三种形式返回图片(
ImageContent块 /EmbeddedResource/TextContent内嵌data:image/...;base64,...URI 或 markdown 包装的同 URI),新增services/mcp_image_extractor.py统一识别并落盘到data/chats/<persona_id>/images/mcp_*.<ext>,再以独立 assistant 消息分发;带格式嗅探(PNG / JPEG / GIF / WebP / BMP)、单图 ≤20MB、单次工具调用最多 8 张、目录 resolve 后强校验不能逃出chats/;generate_image等会自行注册出站图片的工具不再被二次抽取 - 修复 OpenAI 兼容渠道偶发 SSE 误返:部分中继(个别 grok 代理等)在
stream=False时仍返回text/event-stream,原先直接报格式错误。新增_looks_like_sse_stream+_parse_sse_completion,按行重组data:切片为单个LLMResponse(含文本、tool_calls、reasoning_content,并尊重finish_reason) - 修复朋友圈刷新按钮在 feed 生成中无可视反馈:刷新图标在
is_generating=true时持续转圈,状态来源于/api/moments/state
内部
- 新增模块:
pawzochat/services/moments.py、pawzochat/store/moments.py、pawzochat/web/routes/api_moments.py、pawzochat/web/static/modules/moments.js、pawzochat/utils/profile.py、pawzochat/services/mcp_image_extractor.py、pawzochat/mcp/builtin/view_reference_image.py - 新增路径常量:
MOMENTS_DIR/MOMENTS_IMAGES_DIR/MOMENTS_STORE_PATH ConfigManager默认结构新增moments节(publishers/repliers/reply_probabilities/memory_enabled/prompts.post/prompts.reply)- 新增路由:
GET/POST /api/moments、GET/DELETE /api/moments/<id>、POST/DELETE /api/moments/<id>/like、POST /api/moments/<id>/replies、DELETE /api/moments/<id>/replies/<rid>、POST /api/moments/refresh、GET /api/moments/state、GET/PUT /api/moments/settings、GET/POST/DELETE /api/moments/cover、GET /api/moments/images/<id>/<filename> CapabilityAdapterRegistry由「内置 vs 配置」二分改为 owner 标签三态(""配置项可重载、builtin程序内置保留、plugin:<id>插件保留),register(adapter, owner=...)与unregister_owner(prefix)配套;reload(adapters_cfg)只清理空 owner 的条目MemoryService._load_profile_name抽离为pawzochat/utils/profile.py.load_profile_name()单一来源- 插件 API 扩展:
PluginContext新增mcp字段;MCPFacade新增register_tool(name, description, parameters, handler, *, namespace=...);ExtensionManager通过set_capability_registry()在start()之前注入注册表,并在插件 disable / reload / 加载失败时调用_unregister_plugin_tools()清理;KNOWN_PERMISSIONS新增mcp.publish MessagingFacade._normalize_files/_persist_files_for_persona负责文件块校验、复制和text/image/file三类内容块的合并构建services/chat.py工具调用循环新增 MCP 图片回收阶段;_build_tools顺序调整为先按 policy 过滤、再按生图开关过滤、最后按参考图可用性过滤view_reference_image;_build_image_tool_guidance接受active_tool_names仅注入实际暴露给本轮的工具的提示词- 移除 MCP
list_resources/list_prompts未使用桩函数与manager内冗余的聚合任务包装
完整变更日志见 CHANGELOG.md。
PawzoChat v0.1.6
更新内容
新增
- 角色生图功能:新增独立的生图服务商体系,支持 PawAPI(推荐)、OpenAI、Google Gemini(NanoBanana / chat 模式)、NovelAI v3/v4 四类后端
- 角色级生图配置:每个角色可独立开关生图,配置画面风格、场景前缀、负面提示词、参考图模式(头像 / 自定义形象 / 不使用)
- 角色自定义形象图:可上传一张独立于头像的形象参考图,导入/导出角色卡时随包往返
- 内建生图工具
generate_image:自动随生图开关挂载到 LLM 工具列表,多模态模型可在下一轮自我描述 - NovelAI v4/v4.5 兼容:自动剔除 v4 不支持的 Vibe Transfer 字段,尺寸吸附到普通安全预设
- 插件主动消息推送:
ctx.messaging.send_message()接口,需声明messaging.send权限;微信侧自动校验群聊/user_id/openclaw 23 小时安全窗口 - 插件自定义配置 UI:
plugin.yaml中声明config_ui后,宿主在沙箱 iframe 中加载插件ui/目录下的静态资源 - 主题导入导出:CSS 主题打包为 PawzoChat 原生 zip,命名冲突自动追加序号,批量导入返回部分失败明细
- 模型预设新增:OpenAI GPT-5.5 / 5.5 Pro / 5.2 / 5 / 5 Mini / 5 Nano;PawAPI 升级 GPT-5.5、新增豆包 Seed 2.0 Pro;图片模型 Nano Banana 2/Pro、GPT Image 2/1.5、NAI Diffusion v4.5 等
- 顶栏多选模式重构:竖屏下不再出现标题与按钮重叠;会话列表新增「[图片]」「[文件]」预览标签
变更
- iLink 协议升级到 2.4.1
- 快速配置打通生图:PawAPI 已配置时默认启用生图功能(默认使用 Nano Banana 2 模型)
- 模型预设清理:OpenAI 移除 o3 / o4-mini,DeepSeek 移除 v3.2 / v4-flash
修复
- 配置文件原子写入与崩溃恢复:避免断电或磁盘满后下次启动配置被默认值覆盖
- Safari 上
<select>与<input type="time">在右对齐布局中实际仍左对齐 - 角色卡导入/导出过程中自定义形象图丢失
完整变更日志见 CHANGELOG.md。
v0.1.5
新增
- 表情包导入导出:单个表情包可导出为 PawzoChat 原生 zip(
<名称>_emoji_pawzochat.zip,含manifest.json+emotions/<情绪>/<图片>目录结构),可从设置页导入;导入名称冲突时自动追加_2、_3后缀,不覆盖现有分组 - 世界书条目开关:每本世界书的小节可单独启用/禁用,禁用的小节即使关键词命中也不会注入;新字段
section_meta: {<小节>: {enabled: bool}}与content同步维护,旧世界书与新增小节默认开启 - 主动遥测开关:默认采集匿名 UUID(本地随机生成,不来自硬件)、应用版本与操作系统类型,30 分钟心跳一次;上传地址、网站 ID、心跳间隔为代码常量,不写入
config.yaml;从源码运行时默认禁用(设置PAWZOCHAT_TELEMETRY_DEV=1可开启用于本地测试),任何时候可在网页面板关闭,立即生效无需重启;匿名 ID 同时写入用户级 AppData 与项目data/目录,重装/迁移可保留同一 ID - 历史消息编辑多选:顶栏「多选」进入选择模式,跨日期累计选择,支持「删除所选 (n)」批量删除,全选/部分选状态在日期切换时正确恢复
- 自更新支持阿里云 OSS:先尝试
pawzochat-release.oss-cn-shanghai.aliyuncs.com/channels/stable/latest.json,失败时回退到 GitHub Releases;GitHub 镜像仅对api.github.com/github.com启用,OSS 直连不再被错误拼接镜像前缀;可通过PAWZOCHAT_OSS_LATEST_URL环境变量覆盖 - 快速配置「导入角色卡」入口:第二步新增「手动创建 / 导入角色卡」Tab,导入路径复用
/api/personas/_import,可选是否一并导入卡片内嵌的世界书 - 快速配置与网络设置增加「粘贴」/「复制」按钮,便于在没有右键菜单的环境填入 API Key、令牌等长字段
- 模型预设新增 Claude Opus 4.7、DeepSeek V4 Flash、DeepSeek V4 Pro(DeepSeek 与 PawAPI 渠道同步);DeepSeek
base_url调整为https://api.deepseek.com,endpoint_path改为/chat/completions单一来源
变更
- 历史消息编辑页的「编辑」按钮改用统一的右上角文字按钮样式,与其他页面保持一致
- DeepSeek 渠道预设模型列表移除
deepseek-chat/deepseek-reasoner,由 V4 系列接替
修复
- 表情包分组删除新增并发保护:客户端可携带
expected_refs与force=true一起请求,服务端检测到引用列表已变化时返回 409,避免「确认对话框列出的角色」与「实际清理的角色」不一致;新增GET /api/emoji/groups/<name>/references端点供 UI 一次性合并提示 - 表情包导入做了完整安全加固:拒绝加密 zip、单文件 ≤20MB、总解压 ≤200MB、文件数 ≤2000、路径必须是
emotions/<情绪>/<图片>三段式、显式拦截 zip slip(../ 绝对路径);先写入同目录临时文件夹再原子重命名,失败时清理临时目录,不会留下半成品分组
内部
- 新增模块:
pawzochat/services/telemetry.py、pawzochat/web/routes/api_telemetry.py - 新增路径常量:
TELEMETRY_ID_FILE(OS 用户级)、TELEMETRY_ID_FALLBACK(项目内便携副本) - 新增路由:
GET/POST /api/telemetry、POST /api/emoji/_import、GET /api/emoji/groups/<name>/_export、GET /api/emoji/groups/<name>/references、PUT /api/worldbooks/<name>接受section_meta
v0.1.4
新增
- 世界书系统:独立管理"全局 / 选中角色"两种作用域的世界书,支持关键词匹配触发;每本书可包含多个命名小节,角色对话时按作用域和关键词注入上下文
- 世界书与角色的双向绑定:在世界书编辑页按角色勾选绑定,或在角色编辑页挑选要携带的世界书;任一侧保存都会同步另一侧,删除世界书或角色时自动清理遗留绑定
- 角色卡统一导入导出:通讯录页支持导入 SillyTavern v2/v3 PNG 或 JSON 角色卡,角色详情页可导出为 PawzoChat 原生包(
.zip,推荐,保留记忆/主动消息/tool_policy 等 PawzoChat 独有字段)、SillyTavern v3 PNG、SillyTavern v3 JSON - 世界书导出:单本世界书编辑页顶栏新增「导出」按钮(位于「保存」左侧),可选 PawzoChat 原生 JSON 或 SillyTavern 世界书 JSON(entries 结构)
- SillyTavern 角色卡内嵌
character_book自动创建为独立世界书并绑定到新导入的角色 - PawzoChat 角色导出为 SillyTavern 格式时,所有绑定世界书合并为一个
character_book随卡片一同分发 - PNG 角色卡同时写入
ccv3与chara两个 tEXt chunk,v3 与 v2 客户端都能识别
修复
- 对话设置 / 回复设置保存成功后前端立即以服务端返回值刷新表单,不再显示旧值
兼容性说明
- SillyTavern 卡片的
first_mes(开场白)与alternate_greetings(备选问候语)在导入时丢弃,UI 会弹窗提示(PawzoChat 当前没有开场白概念) - SillyTavern 世界书的 per-entry
selective/order/position/depth/probability/keysecondary/match_*等"PawzoChat UI 无法编辑"的字段通过extras.sillytavern完整往返;而key/constant由 PawzoChat 的 scope/keywords 作唯一权威,导出时始终反映当前本地设置(不会被历史 ST 值覆盖) - 角色导入、世界书导入、角色卡内嵌世界书导入三条路径共用同一套解析实现(
card_parser.decode_card_json+persona_card.character_book_to_worldbook),对 UTF-8 BOM / GBK / 排序键 / 键名回退等细节行为一致 - 新增模块:
pawzochat/services/worldbook.py、pawzochat/services/card_parser.py、pawzochat/services/persona_card.py、pawzochat/services/bundle.py - 新增路由:
/api/worldbooksCRUD、POST /api/personas/_import、GET /api/personas/<id>/_export、GET /api/worldbooks/<name>/_export
v0.1.3
新增
- 自定义主题系统:支持浅色/深色/跟随系统三种外观模式,可创建多个自定义 CSS 主题并按顺序叠加;主题以文件夹形式存储在
data/theme/<名称>/style.css,方便手动管理和分享;内置"樱花粉""深海蓝"两个演示主题 - 主动消息功能:按角色配置空闲触发器,支持随机区间、连续上限、静默时段、失败冷却与自动禁用;已绑定微信走微信通道,未绑定走网页 SSE
- 角色编辑页引入"详情/人设"子 Tab,详情页新增"主动消息"配置卡片
utils/llm_json.py统一 LLM JSON 解析,支持围栏剥离、大括号匹配、转义修复、尾部逗号容错、Windows 换行归一化- 记忆总结/合并失败时自动重试(最多 3 次),
max_tokens提升至 2000 - SSE 按角色跟踪处理状态,切换到正在处理的会话时立即显示输入指示器
变更
- 设置页图标颜色从内联样式改为语义 CSS class(
.green、.orange等),通过 CSS 变量统一管理,深色模式自动适配 extra_hint注入格式改为"内部系统指令"措辞,降低被模型回显的风险PROACTIVE_DEFAULTS集中到transport/models.py作为单一源
修复
- 消息队列处理完成后不再重置
last_message_time,修复待处理消息被延迟一个完整等待窗口的问题 ConfigManager新增RLock,api_personasCRUD 改为with config.lock:包裹,消除并发写 YAML 导致的字段丢失reply_dispatcher仅在通道真正接受时 append stored,主动消息失败重试机制得以生效- 主动消息冷启动 anchor 从"用户最后消息时间"起算,不再被推迟整个
wait_seconds updater.py解压 chmod 改用提取后的权限位,避免 Windows 上写权限丢失- WeChat 通道惰性回填
user_id/chat_type到conversation.json
v0.1.2
新增
- CDN 图片上传:支持服务端返回的
upload_full_url(新格式),旧的upload_param作为回退 - 发送消息的
client_id追加随机后缀,避免同一毫秒内连发多条消息出现 ID 冲突 - 聊天记录中的图片/表情包点击后弹出应用内全屏预览窗口,带下载按钮可触发浏览器下载,不再直接跳转打开图片 URL(聊天窗口与历史消息编辑页均生效)
变更
- 记忆摘要/合并提示词重写为第一人称视角,生成的记忆读起来像"我"的私人回忆而非第三人称会议纪要
ILinkClient.get_qrcode移除客户端超时,与上游 iLink 2.1.4 去除 AbortController 的行为对齐
内部
- 移除
cdn.download_media、_aes_ecb_padded_size等无调用方的死代码
v0.1.1
新增
- 模型管理:支持从 OpenAI 兼容 API 拉取远程模型列表并批量导入
- 模型管理:支持编辑已有模型的 ID、名称、能力标记等属性
- 模型管理:拉取模型时根据名称自动标记能力(GPT/Claude/Gemini 标记视觉+工具调用,DeepSeek 标记工具调用)
- QR 登录:支持 IDC 重定向(
scaned_but_redirect),自动切换轮询地址 - QR 登录:二维码过期后自动刷新(最多 3 次)
变更
- 升级 iLink 协议版本至 2.1.6,请求携带
iLink-App-Id/iLink-App-ClientVersion头 - 角色详情页"编辑"按钮移至顶栏
修复
- 公网面板 QR 轮询未跟随 IDC 重定向的问题