Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion ARCHITECTURE.md
Original file line number Diff line number Diff line change
Expand Up @@ -861,7 +861,7 @@ description: 从 PDF 文件中提取文本和表格,填写表单。当用户
| **Bilibili** | `bilibili.auto_extract_enabled`, `bilibili.cookie`, `bilibili.prefer_quality` | B站视频自动提取与下载 |
| **arXiv** | `arxiv.auto_extract_enabled`, `arxiv.max_file_size`, `arxiv.auto_extract_max_items` | arXiv 论文自动提取、搜索与 PDF 发送 |
| **GitHub** | `github.auto_extract_enabled`, `github.request_timeout_seconds`, `github.request_retries`, `github.auto_extract_max_items` | GitHub public 仓库自动提取与图片卡片发送 |
| **JM(禁漫)** | `jm.auto_extract_enabled`, `jm.max_file_size`, `jm.max_chapters`, `jm.auto_extract_max_items` | JM 车号自动提取、整本加密 PDF 与合并转发 |
| **JM(禁漫)** | `jm.auto_extract_enabled`, `jm.chapter_max_file_size`, `jm.max_chapters`, `jm.auto_extract_max_items` | JM 车号自动提取、一章一份加密 PDF 打包 zip 与合并转发 |
| **思考链** | `*.thinking_enabled` | 思维链支持 |
| **思维链兼容** | `*.thinking_tool_call_compat` | 思维链 + 工具调用兼容 |
| **WebUI** | `webui.url`, `webui.port`, `webui.password` | 配置控制台 |
Expand Down
12 changes: 12 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,15 @@
## v3.18.3 JM 本子改为一章一份 PDF 打包 zip

本版本把禁漫自动提取的交付物从「整本一个加密 PDF」改成「**每章一份加密 PDF**,统一密码打包成一个**无密码 zip**」:多章节本子不再需要一本几十上百 MB 的单文件才能翻开,zip 解压后按文件名就是阅读顺序。

- 交付结构:`JM<车号> <标题>.zip`(zip 本身不加密,不需要密码)内部是 `JM<车号> <三位章节序号>[ <章节标题>].pdf`,序号取自服务端章节 `order`、补零排序,服务端没给标题的章节只留序号;每章都用同一个随机 8 位密码做 AES-256 加密,密码节点改为写「zip 内所有 PDF 的解密密码(8 位):…」,避免用户以为 zip 要密码。
- 体积语义改为**单章**上限:`[jm].max_file_size` 改名为 `[jm].chapter_max_file_size`(默认仍 100MB,`0` 不限、`<0` 回退 100),超限只跳过那一章、其余章节照常打包,信息节点会写明「N 章未打包」;**旧键 `max_file_size` 已失效并回退默认值**,请改用新键。zip 总体积随章节数增长、不再受配置约束。
- 逐章组装取代整本组装:每章页面在该章写完 PDF 后即可释放,峰值内存 ≈ 一章页面 + 已完成章节 PDF;不再有「整本源图字节累计超限就中止整本」的预判。所有章节都没能出 PDF(全部超限或没有下到任何页面)时,仍只发「本子信息 / 状态」两个节点。
- 发送与投递语义不变:zip 依旧不进合并转发,转发之后单独发一条文件消息(转发里的文件在 QQ 客户端下载会失败);转发被明确拒绝才降级为「信息 / 密码」两条普通消息;`delivery_uncertain` / `file_transfer_error` 不降级重发,zip 此前从未发出所以照常单独发送;密码始终不进历史摘要。
- `jm_book` 工具的 `output_mode=uid` 维持现状(所有章节合成**一份未加密 PDF** 注册为附件 UID,供 `file_analysis_agent` 解析),只有它与其它的下载入口共用新的单章体积上限校验。

---

## v3.18.2 禁漫列表查询工具

本版本给 `info_agent` 新增 `jm_search` 工具:AI 可以直接查询禁漫本子列表(关键词检索 / 分类浏览 / 日周月排行),拿到车号后再由主 AI 的 `jm_book` 取详情或 PDF;工具本身只查列表,不下载也不发送。
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@
- **可选音乐工具集**:配置独立部署的 [lxmusic2api](https://github.com/69gg/lxmusic2api) 后,主 AI 可搜索歌曲/歌单、浏览热搜与排行榜、读取歌词/封面/评论、跨平台匹配并交付普通音频附件;完整 Track 通过任务内短引用流转,只暴露面向用户的高层 `music.*` 能力,不暴露下载作业生命周期接口。详见 [使用指南](docs/usage.md#音乐-music) 与 [配置说明](docs/configuration.md#4201-lxmusic2api-音乐服务)。
- **arXiv 论文提取、搜索与分析**:自动检测消息中的 arXiv 链接/标识并发送论文信息与 PDF;`arxiv_paper` 也可只返回 PDF 附件 UID,供 `file_analysis_agent` 做文本提取或指定页视觉分析;`arxiv_search` 负责论文检索。
- **GitHub 仓库卡片**:自动检测 GitHub 仓库链接或 `owner/repo` 仓库 ID,获取 public 仓库信息并发送简洁图片卡片,展示头像、简介、stars、forks、issues、contributors 等概览;API 与头像下载统一遵循 `[github].use_proxy`,头像以内联资源进入离线渲染器。
- **禁漫(JM)本子提取**:自动检测 `JM`+车号或禁漫链接,下载全部章节并合成为一个 AES-256 加密 PDF,以「本子信息 / 解密密码」两节点合并转发发送,加密 PDF 不进转发、随后单独作为一条文件消息发送(转发里的文件在 QQ 客户端下载会失败,独立文件消息才下得动,群聊下同时进入群文件列表),密码每次随机生成且不写入历史;`jm_book` 工具也可只返回本子信息或未加密 PDF 附件 UID,供 `file_analysis_agent` 解析;`info_agent` 另有 `jm_search` 工具:关键词检索(可限定作者/标签/角色与分类)、分类浏览、日/周/月排行三种模式,返回车号清单。默认关闭,`[jm].auto_extract_enabled` 打开。详见 [配置说明](docs/configuration.md#4203-jm-禁漫自动提取)。
- **禁漫(JM)本子提取**:自动检测 `JM`+车号或禁漫链接,下载全部章节,**每章各出一份 AES-256 加密 PDF**(同一个随机密码)并打包成一个**无密码 zip**,以「本子信息 / 解密密码」两节点合并转发发送,zip 不进转发、随后单独作为一条文件消息发送(转发里的文件在 QQ 客户端下载会失败,独立文件消息才下得动,群聊下同时进入群文件列表),密码每次随机生成且不写入历史;单章超过 `[jm].chapter_max_file_size` 只跳过该章、其余章节照常打包;`jm_book` 工具也可只返回本子信息或未加密 PDF 附件 UID,供 `file_analysis_agent` 解析;`info_agent` 另有 `jm_search` 工具:关键词检索(可限定作者/标签/角色与分类)、分类浏览、日/周/月排行三种模式,返回车号清单。默认关闭,`[jm].auto_extract_enabled` 打开。详见 [配置说明](docs/configuration.md#4203-jm-禁漫自动提取)。
- **自动处理管线**:Bilibili、arXiv、GitHub、JM 等自动提取统一运行在 `skills/pipelines` 中,斜杠命令优先级更高;命令输入/输出会写入历史,非命令消息会并行检测和处理命中管线,结果通过统一发送层写入历史并登记附件 UID 后再进入 AI 回复。远程大附件超过 `[attachments].remote_download_max_size_mb` 时只登记 URL 引用,避免无界下载和缓存膨胀。
- **同 sender 短时消息合并**:默认开启。连续发的多条消息会合并到同一轮 AI 调用,AI 一次看到全部意图自行识别"独立请求/修正/打断";告别"画猫→改成狗"的重复触发与回复打架。主提示词按 batcher 的"当前输入批次"语义适配,关闭该功能可能导致连续补充/修正消息与提示词不匹配,需要单独适配。可选投机预发送让用户停顿时 LLM 提前开跑、新消息可在未发出回复前取消,进一步压低响应延迟。详见 [docs/message-batching.md](docs/message-batching.md)。
- **思维链支持**:支持开启思维链,提升复杂逻辑推理能力。
Expand Down
4 changes: 2 additions & 2 deletions apps/undefined-chat/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion apps/undefined-chat/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "undefined-chat",
"private": true,
"version": "3.18.2",
"version": "3.18.3",
"type": "module",
"scripts": {
"tauri": "tauri",
Expand Down
2 changes: 1 addition & 1 deletion apps/undefined-chat/src-tauri/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion apps/undefined-chat/src-tauri/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "undefined_chat"
version = "3.18.2"
version = "3.18.3"
description = "Undefined native chat client"
authors = ["Undefined contributors"]
license = "MIT"
Expand Down
2 changes: 1 addition & 1 deletion apps/undefined-chat/src-tauri/tauri.conf.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"$schema": "https://schema.tauri.app/config/2",
"productName": "Undefined Chat",
"version": "3.18.2",
"version": "3.18.3",
"identifier": "com.undefined.chat",
"build": {
"beforeDevCommand": "npm run dev",
Expand Down
4 changes: 2 additions & 2 deletions apps/undefined-console/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion apps/undefined-console/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "undefined-console",
"private": true,
"version": "3.18.2",
"version": "3.18.3",
"type": "module",
"scripts": {
"tauri": "tauri",
Expand Down
2 changes: 1 addition & 1 deletion apps/undefined-console/src-tauri/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion apps/undefined-console/src-tauri/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "undefined_console"
version = "3.18.2"
version = "3.18.3"
description = "Undefined cross-platform management console"
authors = ["Undefined contributors"]
license = "MIT"
Expand Down
2 changes: 1 addition & 1 deletion apps/undefined-console/src-tauri/tauri.conf.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"$schema": "https://schema.tauri.app/config/2",
"productName": "Undefined Console",
"version": "3.18.2",
"version": "3.18.3",
"identifier": "com.undefined.console",
"build": {
"beforeDevCommand": "npm run dev",
Expand Down
18 changes: 9 additions & 9 deletions config.toml.example
Original file line number Diff line number Diff line change
Expand Up @@ -1572,8 +1572,8 @@ auto_extract_private_ids = []
# en: Max number of GitHub repositories to auto-process from one message. <=0 falls back to 3, >10 is clamped to 10.
auto_extract_max_items = 3

# zh: 禁漫(JM / 18comic)自动提取配置。命中后下载整本并合成为一个加密 PDF,以合并转发发送(信息 / 解密密码 / PDF 文件)。
# en: JM (18comic) auto-extraction settings. On match, the whole book is downloaded, merged into one encrypted PDF, and sent as a merged forward (info / password / PDF file).
# zh: 禁漫(JM / 18comic)自动提取配置。命中后下载整本,每章合成一份加密 PDF(同一个密码),打包成一个无密码 zip,以合并转发发送(本子信息 / 解密密码)+ 独立文件消息(zip)。
# en: JM (18comic) auto-extraction settings. On match, the whole book is downloaded, each chapter becomes its own encrypted PDF (one shared password), all packed into an unencrypted zip sent as a merged forward (info / password) plus a standalone file message (the zip).
[jm]
# zh: 是否让禁漫接口与图片下载使用 [proxy] 代理地址。默认关闭。
# en: Whether JM API and image downloads use proxy addresses from [proxy]. Disabled by default.
Expand All @@ -1587,14 +1587,14 @@ auto_extract_group_ids = []
# zh: 自动提取功能的私聊白名单(空=跟随全局 access.allowed_private_ids)。
# en: Private chat allowlist for auto-extraction (empty = follow global access.allowed_private_ids).
auto_extract_private_ids = []
# zh: 单条消息最多自动处理几个车号。<=0 回退 1,>5 截断到 5;每项是一整本 PDF,所以默认只处理 1 个。
# en: Max number of book IDs to auto-process from one message. <=0 falls back to 1, >5 is clamped to 5; each item is a whole-book PDF, so only one is processed by default.
# zh: 单条消息最多自动处理几个车号。<=0 回退 1,>5 截断到 5;每项是一整本(多份 PDF 的 zip),所以默认只处理 1 个。
# en: Max number of book IDs to auto-process from one message. <=0 falls back to 1, >5 is clamped to 5; each item is a whole book (one zip of per-chapter PDFs), so only one is processed by default.
auto_extract_max_items = 1
# zh: PDF 体积上限(MB),超过则只发送信息节点(按编码后字节判定,合成中即会中止)。0=不限,<0 回退 100。
# en: PDF size limit in MB; exceeding it sends the info node only (checked on encoded bytes, aborts mid-build). 0=unlimited, <0 falls back to 100.
max_file_size = 100
# zh: 单本最多下载并合并几章(取前 N 章)。0=不限(全部章节),<0 回退 0。
# en: Max chapters downloaded and merged per book (first N). 0=unlimited, <0 falls back to 0.
# zh: 单章 PDF 体积上限(MB):超过则跳过该章,其余章节照常打包(按编码后字节判定,组装中即会中止,zip 总体积不受此限)。0=不限,<0 回退 100。
# en: Per-chapter PDF size limit in MB; an oversized chapter is skipped while the rest are still packed (checked on encoded bytes, aborts mid-build; the zip itself is not capped). 0=unlimited, <0 falls back to 100.
chapter_max_file_size = 100
# zh: 单本最多下载几章(取前 N 章,每章一份 PDF)。0=不限(全部章节),<0 回退 0。
# en: Max chapters downloaded per book (first N, one PDF each). 0=unlimited, <0 falls back to 0.
max_chapters = 0
# zh: PDF 页面分辨率(DPI),所有页统一按它换算物理尺寸(页宽 = 像素宽 ÷ DPI × 72)。<=0 回退 150。页像素不做缩放。
# en: PDF page resolution (DPI); every page uses it for its physical size (page width = pixels / DPI * 72). <=0 falls back to 150. Page pixels are never rescaled.
Expand Down
Loading
Loading