目标问题
Web 端会话输入区目前只能发送文本。虽然 Gateway/Runtime 已有 input_parts 和 session asset 能力,但当前链路只支持后端读取工作目录内的本地图片路径,浏览器上传文件没有可信本地路径,导致 Web 端无法把用户上传的图片加入模型上下文。
设计方案
- 在 Web 会话输入区增加图片选择、拖拽上传、附件预览和删除能力。
- 新增 Gateway 上传入口,用于接收浏览器上传的图片,并保存到当前 session 的 asset store。
- 扩展
RunInputPart.media,支持引用已保存的 session asset,例如 asset_id。
- Runtime/InputPreparer 支持“已保存 asset 引用”作为图片输入,并转成 provider 层已有的 session image content part。
- UI 只负责展示和提交附件引用,不保存业务状态;会话资产仍由 runtime/session 管理。
落地清单
- Web:
- 修改
web/src/components/chat/ChatInput.tsx,增加附件选择、拖拽、预览、删除。
- 修改 composer/chat store,保存待发送附件引用。
- 修改消息展示组件,展示用户消息中的图片附件。
- 协议:
- 修改
web/src/api/protocol.ts 和 Gateway 协议类型。
- 给
media 增加 asset_id 字段。
- Gateway:
- 在
internal/gateway/network_server.go 增加受鉴权保护的上传入口。
- 在
internal/gateway/static_files.go 增加新 API 前缀,避免被 SPA 静态路由拦截。
- 限制上传大小、MIME 类型和请求鉴权。
- Runtime/Session:
- 扩展
internal/session/input_preparer.go,支持已有 asset 引用。
- 扩展
internal/cli/gateway_runtime_bridge.go,把 Gateway 的 asset_id 图片输入传给 Runtime。
- 文档:
- 更新 Gateway RPC/API 文档,说明上传接口、
asset_id 引用方式和限制。
验收标准
- Web 会话区可选择或拖拽上传 PNG/JPEG/WebP 图片。
- 上传成功后,输入区展示图片附件预览。
- 用户可删除待发送附件,删除后不会进入本轮会话。
- 文本和图片可以在同一轮消息中发送。
- 支持无文本、仅图片发送。
- 模型能接收到图片上下文并基于图片回复。
- 非图片、空文件、超大小文件、未授权请求都有明确错误。
- 不允许 Web 直接访问 provider、runtime 内部实现或执行 tool。
go test ./... 通过。
- Web 相关测试通过。
测试场景
- 上传单张图片并发送。
- 上传多张图片并发送。
- 上传图片后删除,再发送文本,确认图片未进入会话。
- 无文本仅图片发送。
- 上传非图片 MIME 文件被拒绝。
- 上传超过
MaxSessionAssetBytes 的文件被拒绝。
- 使用不存在的
asset_id 发送时失败。
- 未授权调用上传接口返回 401/403。
风险与回滚
- 风险:新增上传入口扩大攻击面,必须严格限制鉴权、大小和 MIME。
- 风险:前端附件状态和后端 session asset 状态可能不一致,需要清晰错误处理。
- 回滚:关闭 Web 上传入口和附件 UI,保留原有文本会话能力。
目标问题
Web 端会话输入区目前只能发送文本。虽然 Gateway/Runtime 已有
input_parts和 session asset 能力,但当前链路只支持后端读取工作目录内的本地图片路径,浏览器上传文件没有可信本地路径,导致 Web 端无法把用户上传的图片加入模型上下文。设计方案
RunInputPart.media,支持引用已保存的 session asset,例如asset_id。落地清单
web/src/components/chat/ChatInput.tsx,增加附件选择、拖拽、预览、删除。web/src/api/protocol.ts和 Gateway 协议类型。media增加asset_id字段。internal/gateway/network_server.go增加受鉴权保护的上传入口。internal/gateway/static_files.go增加新 API 前缀,避免被 SPA 静态路由拦截。internal/session/input_preparer.go,支持已有 asset 引用。internal/cli/gateway_runtime_bridge.go,把 Gateway 的asset_id图片输入传给 Runtime。asset_id引用方式和限制。验收标准
go test ./...通过。测试场景
MaxSessionAssetBytes的文件被拒绝。asset_id发送时失败。风险与回滚