Compare commits
7
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5825cd35f2 | ||
|
|
a1be057b19 | ||
|
|
3b45dcdd93 | ||
|
|
19e89ae10b | ||
|
|
3b1c2769e1 | ||
|
|
d62c443363 | ||
|
|
2484e90be5 |
+19
@@ -0,0 +1,19 @@
|
||||
# Agent-System-Documents 项目事实
|
||||
|
||||
## 职责与边界
|
||||
|
||||
本仓保存系统架构方案、使用指南、验证报告与实施记录。目录入口见 [README](README.md)。
|
||||
通用开发规范由 Dev 仓固定的 Development-Guidelines 提供;本仓不复制通用规则,
|
||||
不承载业务实现、凭证、运行数据或部署制品。
|
||||
|
||||
方案、已实现、已验证、已合入与已部署分别记录;历史报告只证明其指定版本和环境。
|
||||
系统级记录关联组件 PR 与 Dev 组合 PR,不以文档状态代替运行事实。
|
||||
|
||||
## 验证
|
||||
|
||||
纯文档修改执行 `git diff --check`,核对受影响相对链接、引用来源、版本及规则一致性。
|
||||
报告中的通过断言关联真实命令、被测对象和证据来源;未验证事项写 NOT_RUN。
|
||||
修改运行提示词或有效策略时,按行为影响追加对应系统验证,不能按普通文字编辑验收。
|
||||
|
||||
本仓没有可编译程序或独立业务测试套件。跨仓固定组合在 Dev 仓运行 `make test`;
|
||||
过程记录中的命令和环境须按当次任务核实,不能机械重放旧运维命令。
|
||||
@@ -85,7 +85,7 @@ AGENT_SYSTEM_CONFIG=/etc/agent-system.json agent-system serve # 环境变量
|
||||
- **长回复折叠**:终态后超过 800 字的回复自动收成「📄 长回复 · N 字(点击展开)」摘要行——流式期间全文可见,历史消息同样适用。
|
||||
- **长结果进右侧卡片(默认关)**:设置 → 界面 →「长结果进右侧卡片」开启后,报告/纪要/方案/对比/文档草稿等**产物型**长内容进右栏收件箱(result 卡,可置顶/收纳);长正文优先流式三段式——`card_begin` 建卡(收件箱即时出现 active 卡)→ `card_append` 逐段追加(卡片实时刷新,事件按 250ms 窗口节流)→ `card_commit` 收尾(转 done 并锚定到对话);一次性短产物走 `submit_card`。中栏保留结论摘要 + 锚点部件(`📄 标题 · N 字 ▸ 展开全文 · ↗ 收件箱`)——锚点可无跳转展开全文,右栏收起时阅读不残废;解释型长回答不进卡。下一轮对话上下文自动回填卡片全文(「🧩 上下文构成」可见 card(n) 条目);run 异常终止时未收尾的流式卡自动置 done/failed 并标注「未正常收尾」,内容不丢。
|
||||
- **上下文构成观测**:每条助手消息尾部「🧩 上下文构成」折叠芯片——该轮模型实际看到什么(系统提示/历史条数/附件/知识命中)与裁剪记录(历史超窗/工具结果超限),输入规模可解释。
|
||||
- **附件**:📎 上传 md/txt/docx/pdf/图片——文档经内置解析器(确定性代码解析:md/txt 直读、docx 解 OOXML、pdf 提取文本层)转为中间表示注入对话;解析结果与警告显式可见(不静默)。
|
||||
- **附件**:📎 上传 md/txt/docx/pdf/xlsx/pptx/图片——文档经内置解析器(确定性代码解析:md/txt 直读、docx/xlsx/pptx 解 OOXML、pdf 提取文本层)转为中间表示注入对话;解析结果与警告显式可见(不静默)。
|
||||
- **输入增强**:`/` 唤起命令菜单(/new /mock /model /profile /help);`@knowledge` 在消息中触发知识检索注入。
|
||||
|
||||
### 3.3 mock 演示指令(无需模型)
|
||||
|
||||
@@ -24,6 +24,8 @@
|
||||
|
||||
`modules/backend/pkg/extension/surface_test.go` 用 AST 列出 `pkg/extension` 的导出类型与函数,与 `surface.txt` 比较。CI 通过 `make test`(含 `go test ./...`)执行。未更新快照的导出变更会失败。
|
||||
|
||||
导出**接口**同时记录其方法(`Host.ParseDocument` 形态)——只加方法、不改顶层名的变更同样触发快照失败(2026-10-06 EXT-5 起执行)。
|
||||
|
||||
依赖边界:`make test-boundaries` 拒绝
|
||||
|
||||
- `pkg/extension` 导入 `agent-system-backend/internal`
|
||||
@@ -43,9 +45,11 @@ replace agent-system-core => ../Agent-System-Dev/modules/core
|
||||
|
||||
## 5. 发版命令(owner 执行,本次未执行)
|
||||
|
||||
tag 名以 V1.2 实施推进方案批复的 `v0.2.0` 为准(2026-10-05 对齐;五仓 backend/core/frontend/ui/Dev 同打):
|
||||
|
||||
```
|
||||
git tag -a v0.2.0-experimental -m "extension surface 2.0.0-experimental"
|
||||
git push origin v0.2.0-experimental
|
||||
git tag -a v0.2.0 -m "extension surface 2.0.0-experimental"
|
||||
git push origin v0.2.0
|
||||
```
|
||||
|
||||
npm 发布 `agent-system-ui` 仍按 D29 推迟到第二宿主出现。不要在实验窗口把 `private` 改成 false 后直接发布。
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
# EXT-1:进程内命令处理器与 owner 作用域宿主句柄(最小集)
|
||||
|
||||
状态:**实施中(2026-10-05)**;owner:weichen;主任务:Dev 仓 `feature/ext-1-inproc-handler`(任务卡即本提案的申请卡)。
|
||||
撰写日期:2026-10-05。配套:[扩展面兼容与演进](2026-10-01-extension-compat-policy.md)、[基座路线图修正](2026-10-01-base-extension-roadmap.md)、V1.2 实施推进方案(批注 1 最小/完整集划分)。
|
||||
|
||||
## 1. 申请卡(compat-policy §6 四要素)
|
||||
|
||||
- **场景**:Agent-System-RDM 的 `rdm.ingest` 等命令经四入口(button/card/slash/chat)分发到 `cmdbus.Dispatch` 时被以 `no host handler bound` 拒绝——`Registry.AddCommand` 与 manifest `provides.commands` 只注册规格不绑处理器;进程内插件同时没有任何 owner 凭证与基座服务端回调身份(H4)。
|
||||
- **希望符号**:`pkg/extension` 新增 `Request` / `Handler` / `Host`(owner 作用域宿主句柄最小集)与 `Registry.AddCommandHandler(spec, h)`;基座侧配套 `cmdbus.Bus.RegisterPluginCommand`。
|
||||
- **为何现有注册点组合不出来**:`RegisterPluginCommands` 仅登记 spec;`HostClient` 走 sidecar HTTP 且需要进程内不可得的 host token;owner 作用域必须由基座在分发时构造,插件无法自造。
|
||||
- **兼容**:只加符号与方法,不改既有路径语义;`SurfaceVersion` 保持 `2.0.0-experimental`,实验窗口内的接口调整以本提案为记录。
|
||||
|
||||
## 2. 公开面变更(surface.txt 12 → 15 项)
|
||||
|
||||
`pkg/extension` 新增导出符号 `Handler`、`Host`、`Request`(见 `host.go`);`Registry` 接口追加 `AddCommandHandler` 方法(方法不计入快照)。
|
||||
|
||||
**依赖变化**:根包自此 import `agent-system-core` 类型(`KnowledgeDoc`/`RetrievalHit`/`Artifact`/`ID`),此前为零外部依赖。声明式 Go 插件的 `go.mod` 需按 compat-policy §4 模板同时 require+replace `agent-system-core`。
|
||||
|
||||
## 3. Host 接口(最小集)
|
||||
|
||||
```
|
||||
PluginID() / Owner()
|
||||
KVPut / KVGet // 按 pluginID+owner 隔离
|
||||
Audit(action, target, evidence) // owner 名下审计事件,Actor=plugin:<id>
|
||||
Complete(ctx, prompt) // 经基座 LLM 路由(owner 模型配置生效)
|
||||
KnowledgeSearch(ctx, projectID, text, topK)
|
||||
KnowledgeWrite(ctx, docs, embed) // Owner 强制改写为本次分发 owner;Source 空则补 plugin:<id>;
|
||||
// embed=false 只写全文,embed=true 建向量(失败降级纯全文)
|
||||
TaskCreate / TaskUpdate // 后台任务台账(执行体由下游自跑)
|
||||
ArtifactGet / ArtifactContent // 工件只读(R1-3 ingest 读原件)
|
||||
```
|
||||
|
||||
artifacts **写入**属完整集,R1-7 前再评估(V1.2 批注 1)。
|
||||
|
||||
## 4. 基座实现要点
|
||||
|
||||
- `cmdbus.Bus.RegisterPluginCommand(spec, h)`:登记规格(SourcePlugin)+ 绑定处理器;高危命令的内联确认卡拦截位于 handler 查找之前,插件命令天然覆盖。
|
||||
- `internal/app.hostcaps`:聚合 store/检索管线/LLM 路由,同一实现同时服务 hostapi.Server 闭包与进程内 `inprocHost`(批注 1:复用 owner 作用域函数,不新造句柄)。
|
||||
- `inprocHost` 每次分发按 `req.Owner` 新建,所有 store 调用以该 owner 为第一参数。
|
||||
- `rag.Pipeline.IndexChunks` 自 `IndexDocument` 抽出:写全文(回填 ID)后建向量,embed 失败降级语义不变。
|
||||
|
||||
## 5. 验证
|
||||
|
||||
- cmdbus:处理器被 Dispatch 调用返回 committed;仅登记规格仍 rejected(no host handler bound);高危插件命令先确认卡后执行。
|
||||
- internal/app(组合根级):两 owner 各分发一次,审计/知识/KV/任务台账各落自己 owner 名下(D8 烟测的单元级前置);`provider=hash` 档 `KnowledgeWrite(embed=true)` 写出向量行且 Owner/Source 被强制改写。
|
||||
- `examples/downstream-rdm` 增加 `rdm.ping` 处理器示范(读工件元数据 + 写审计)。
|
||||
- 权威验证源:CI 在 PR HEAD 上 `make test` + `make build`(.gitea/workflows/ci.yaml)。
|
||||
@@ -0,0 +1,51 @@
|
||||
# EXT-5:宿主句柄开放内置文档解析(含 xlsx/pptx 内置解析器)
|
||||
|
||||
状态:**实施中(2026-10-06)**;owner:weichen;主任务:Dev 仓 `feature/ext-5-host-parse`。
|
||||
规范依据:[扩展面兼容与演进](2026-10-01-extension-compat-policy.md)(§6 扩展点申请模板);前序 [EXT-1](2026-10-05-ext-1-inproc-command-handler.md)(Host 最小集)。相关:EXT-4(下游注册 inproc 解析器,备选、未提交)——方向相反,本申请不依赖它。
|
||||
撰写日期:2026-10-06。
|
||||
|
||||
## 1. 申请四要素(compat-policy §6)
|
||||
|
||||
- **场景**:Agent-System-RDM 的 F1 上传主链(`rdm.upload`,PR #103)需要解析用户上传的文档;基座 `internal/ingest` 有内置解析器但没有经 `extension.Host` 开放——下游拿到的只有 `ArtifactGet/ArtifactContent`(原件字节),要解析就得自带一份解析代码(RDM 现状:自带 md/txt/docx 解析器,pdf/pptx/xlsx 一律回「不支持」)。MS1(W4,11-01)验收第 4 条要求「报价单 Excel + 图文混排 PPT 解析完整性核对」,当前两条路都走不通:句柄没有解析方法,基座自身也没有 xlsx/pptx 解析器。
|
||||
- **希望符号**:`pkg/extension` 的 `Host` 新增一个方法:
|
||||
|
||||
```go
|
||||
// ParseDocument 用基座内置解析器把文档字节解析为 ParsedDocument(EXT-5)。
|
||||
ParseDocument(ctx context.Context, filename, mime string, content []byte) (core.ParsedDocument, error)
|
||||
```
|
||||
|
||||
同时 `internal/ingest` 新增 `builtin:xlsx`(xlsx/xlsm)与 `builtin:pptx`(pptx/pptm/ppsx)两个内置解析器——这两个是基座能力补齐,不依赖 EXT-5,上传/附件路径同步受益。
|
||||
- **为何现有注册点组合不出来**:`ParsersDescription` 只是注册表描述(设置页/文档用),没有执行入口;`PluginParserDecl.Tool` 仅接受内置名或 sidecar 工具名(core/plugin_v2.go 注释明示);Host 最小集里与文档相关的只有工件只读两个方法。下游唯一替代是复制基座解析代码进自己仓库——违背「引擎在基座」的接缝表裁定。
|
||||
- **兼容**:只加符号。实验窗口内给 `Host` 接口加方法会破坏第三方 fake 的编译(compat-policy §1 允许,须改快照并在提案里写一句);`SurfaceVersion` 保持 `2.0.0-experimental`。本次同时把契约快照升级为**记录导出接口的方法**(此前只记顶层名,加方法这类变更检测不到)。
|
||||
|
||||
## 2. 接口语义
|
||||
|
||||
- 分派按文件扩展名,与 `ingest.Parse` 完全一致(同一实现,`hostcaps.parse` 委托)。
|
||||
- 返回 error 的只有两种情况:`ctx` 已取消;输入超过 100 MiB(与上传端点 `io.LimitReader(file, 100<<20)` 同口径)。除此之外的「不可解析」都返回带 `Warnings` 的文档(显式失败,不静默),`Meta.Confidence` 相应降低。
|
||||
- 纯计算:不读写 owner 数据、不走存储。要解析工件原件,先调 `ArtifactContent`(owner 作用域由它保证),把字节传进来——不另造句柄、不新增凭证面。
|
||||
- 参数为位置参数(filename/mime/content),与 Host 既有方法风格一致;不引入 options 结构。
|
||||
|
||||
## 3. 新解析器格式与限制
|
||||
|
||||
**xlsx/xlsm(builtin:xlsx)**:工作表顺序取 `workbook.xml` 的 sheets 列表(不按文件名),target 经 rels 解析(相对/绝对路径);共享字符串含富文本 run(排除注音 `rPh`);单元格覆盖 `t=inlineStr/str/b/e/n`(布尔输出 TRUE/FALSE、错误值原样)、公式取缓存值(无缓存输出 `=公式`)、日期按内置格式 ID 与含 y/m/d/h/s 记号的自定义格式转 ISO(1900/1904 双日期系统);稀疏列按单元格引用就位,去行尾空与全空行;隐藏工作表标题标「(隐藏)」;每个工作表产出一个 heading 块 + 一个 table 块,空表跳过。
|
||||
|
||||
**pptx/pptm/ppsx(builtin:pptx)**:幻灯片顺序取 `presentation.xml` 的 `sldIdLst`;标题占位符(title/ctrTitle)产「幻灯片 N:标题」heading 块;正文形状每形状一个 para 块(`a:br` 换行);组合形状递归;`mc:AlternateContent` 只取 Choice 分支;graphicFrame 表格产 table 块(合并单元格位置留空以保持列对齐);备注页正文产「备注:…」;跳过页码/日期/页脚占位符。图片、SmartArt 不解析(无 OCR/图形理解,属远期档)。
|
||||
|
||||
**旧二进制格式 doc/xls/ppt**:不做解析,Warnings 给可操作提示(请转存 docx/xlsx/pptx 后重传)。
|
||||
|
||||
**上限**(包级变量,测试可覆盖):单元格总数 200000、列数 1024、zip 内单部件解压 64 MiB(zip 炸弹防护,docx 一并受益);超限保留已解析部分 + Warnings + `Confidence` 降 0.6,原件不受影响。
|
||||
|
||||
## 4. 验证
|
||||
|
||||
- 手工构造 OOXML zip 的单元测试:xlsx(表序/富文本/公式/日期/稀疏列/隐藏表)、pptx(sldIdLst 序/标题/组合/AlternateContent/表格/备注)、失败路径(损坏 zip/缺 workbook.xml/部件超限/超上限)。
|
||||
- openpyxl 与 python-pptx 现场生成真实文件的轮测(依赖缺失时 t.Skip;CI 已装这两个包)。
|
||||
- `internal/app` 走真实 `applyCompiled → cmdbus.Dispatch → inprocHost` 链路:alice 解析自己的 xlsx 工件成功、bob 同 ID 被拒(owner 作用域不因新方法放宽);ctx 取消与超限两条 error 路径。
|
||||
- 上传端点 e2e:xlsx 上传返回 `parser=builtin:xlsx` 且无 Warnings,知识检索命中单元格文本。
|
||||
- surface 快照按「顶层名 + 接口方法」新口径重建并通过。
|
||||
|
||||
## 5. 不在本文范围
|
||||
|
||||
- sidecar `/host/v1` 的 HTTP 解析路由(sidecar 形态可继续读字节走自己的解析;出现真实需求再申请)。
|
||||
- MinerU 交叉验证、OCR、SmartArt、旧 OLE 格式解析。
|
||||
- 上传超过 100 MiB 被静默截断的问题、`kindOf` 与 `artifactKindOf` 口径不一致——已登记为 EXT-5 盘点发现的缺陷,另行修复。
|
||||
- 下游把上传链路切到 Host 解析、RDM pin 升级到 v0.2.0:RDM 仓自己的任务卡。
|
||||
Reference in New Issue
Block a user