mirror of
https://gitcode.com/JianFeeeee/HomeAgent.git
synced 2026-10-03 15:53:56 +00:00
feat(shm): 媒体块入共享内存 + 实现 setToolBlocks 桩(§13.13)
两个问题叠在一起,先发现的是第二个: 1. **io.setToolBlocks 在内核侧是桩实现**——直接返回“多模态注入待共享段 二进制通道落地”。也就是**子进程插件调 SetToolBlocks 必然失败**(模板 只 log 一行),只有内置插件(multimodal)能用。之前还有测试把这个错误 当作预期行为断言着。 2. 媒体块(injectMedia 系列 + setToolBlocks)把 blocks 内联在 RPC JSON 里, 而本地生成的图/音频是 base64 data URL,一张图可达数 MB。 顺带修掉一条与设计相悖的旧注释:injectMediaParams 写着“data URL 已是 base64 文本、再套一层二进制不会更小,所以走 JSON”。那只算了体积,漏了 两件更重要的事——内联时整份 base64 要在 RPC 报文里再编码/再拷贝一遍; 以及内容本体不在共享段里,插件回调就无法就地改写,只能各持一份拷贝。 共享内存的意义是后者。 实现: - injectMediaParams 加 BlocksRef;新增 resolveBlocks(共享优先、内联回退) - 真正实现 MethodIOSetToolBlocks(空块明确报错,不静默成功) - CoreSDK 接口加 SetToolBlocks,procCore 转调 internal/sdk - 模板:SetToolBlocks / injectMedia 三兄弟经 putValueInArena 传 blocks_ref; 同步调用用 mediaArgsOwned 拿释放函数,**不能在应答返回前释放槽**, 否则内核读到已释放内存 验证(-race 全绿): - TestCoreHandler_SetToolBlocksViaArena / Inline / EmptyRejected - TestE2E_RealTemplateSetToolBlocksViaArena:真实 SDK 模板编译的插件, 9000 字节 base64 图经 blocks_ref 完整送达 工具链已同步:/usr/local/bin/plugindev 重建为新协议(内嵌 blocks_ref), 回滚副本 plugindev.bak-20260910-224255。注意内核与全部插件必须同批替换 ——只换一边会静默坏(新内核+旧插件=输出 payload 变空;新插件+旧内核= 媒体注入静默失效),已记入长期记忆。
This commit is contained in:
23
plan.md
23
plan.md
@ -1399,13 +1399,14 @@ settings.*、lifecycle.*、arena.alloc/free 自身)不属于此列:它们不
|
||||
|
||||
**尚未入内存**(按“是否破坏回调语义”排序):
|
||||
|
||||
1. **媒体块:`io.setToolBlocks`**——工具内的媒体注入仍把 `blocks` 内联在
|
||||
RPC JSON 里,而 `ImageURL.URL` / `AudioURL.URL` 对本地生成的图/音频是
|
||||
**base64 data URL**(如 ai_image 生成的大图)。这条直接破坏“结果媒体
|
||||
能被 after_toolcall 就地改写”的能力:插件只能推一份拷贝过去。
|
||||
待做:blocks 序列化后 `putInArena`,传 `blocks_ref`,内核读回。
|
||||
2. **`io.injectMedia` / `injectMediaSync` / `injectInterruptMedia`**——同上,
|
||||
插件主动发起带媒体的一轮对话。
|
||||
1. ✅ ~~媒体块:`io.setToolBlocks`~~ —— 已修(本轮)。之前它在本核侧根本是
|
||||
**桩实现**(直接返回“待共享段二进制通道落地”),也就是说**子进程插件调
|
||||
SetToolBlocks 必然失败**,只有内置插件能用。现在:内核侧真正实现该
|
||||
method,模板把 blocks 序列化后 `putArena` 传 `blocks_ref`(小 payload 仍
|
||||
内联),内核 `resolveBlocks` 读回。
|
||||
2. ✅ ~~`io.injectMedia` / `injectMediaSync` / `injectInterruptMedia`~~ ——
|
||||
同上(共用 `mediaArgsOwned`)。注意同步调用不能在应答返回前释放槽,
|
||||
否则内核读到的是已释放的内存。
|
||||
3. **`doc.insert` / `doc.insertWithMedia`**——文档全文内联,且 `doc` 是可被
|
||||
插件回调改写的内容。
|
||||
4. **`knowledge.add(name, content)`**——知识正文内联,同上。
|
||||
@ -1413,6 +1414,12 @@ settings.*、lifecycle.*、arena.alloc/free 自身)不属于此列:它们不
|
||||
|
||||
**验证**:
|
||||
|
||||
- [ ] 媒体块走共享内存(插件推图不再靠拷贝,且可被回调就地改写)
|
||||
- [x] `TestCoreHandler_SetToolBlocksViaArena`:9000 字节 base64 图经 `blocks_ref`
|
||||
送达,内容一致;`TestCoreHandler_SetToolBlocksInline` 保内联回退;
|
||||
`TestCoreHandler_SetToolBlocksEmptyRejected` 防空块静默成功
|
||||
- [x] `TestE2E_RealTemplateSetToolBlocksViaArena`:用**真实 SDK 模板**编译的
|
||||
插件(生产插件走的就是模板,模板不走 blocks_ref 则内核实现了也收不到)
|
||||
- [x] 工具链已同步:`/usr/local/bin/plugindev` 重建为新协议(内嵌 blocks_ref),
|
||||
回滚副本 `plugindev.bak-20260910-224255`
|
||||
- [ ] 文档/知识正文走共享内存
|
||||
- [ ] git commit -m "feat(shm): remaining data-plane payloads via shared refs"
|
||||
|
||||
Reference in New Issue
Block a user