Skip to content

Web 会话区支持图片上传并加入会话 #700

@Yumiue

Description

@Yumiue

目标问题

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,保留原有文本会话能力。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions