fix: preserve image context across follow-up requests
Image requests previously sent only the current prompt and attachments, so follow-up edits could lose the previous image and conversation requirements. Reuse the latest successful image from the existing artifact store together with text history, including after reopening the app. Explicit attachments take priority, and configured model IDs remain unchanged. When image editing is explicitly unsupported, continue with text-based image generation and retain a quiet message footer explaining the missing image context. Keep genuine provider errors and cancellation visible. Add focused regressions, persisted footer metadata, and aligned feature documentation. Validated with four real sub-gpt-image-2 image requests and a simulated unsupported-edit response. Image regressions, typecheck and lint passed; the full working-tree run had two unrelated concurrent Runtime-menu failures. Release note: 连续改图会自动带上上一张图片和文字上下文,重开对话后仍可继续修改。上游明确不支持编辑时仍可按文字生图,仅在回复底部轻提示未使用参考图片。
This commit is contained in:
@@ -0,0 +1,33 @@
|
||||
# 图片生成与连续修改
|
||||
|
||||
本目录维护直连图片模型的生成、参考图编辑和会话续接行为。这是已有生图流程的修复,
|
||||
不增加独立模型、工具审批或服务端会话管理。
|
||||
|
||||
## 产品行为
|
||||
|
||||
- 首次无附图时生成新图片。同一桌面对话继续请求时,自动引用最近一次成功回复的图片,
|
||||
同时发送此前的文字要求;本轮修改要求优先。
|
||||
- 本轮显式附图优先,不自动混入上一轮生成图。要独立生成不相关图片,使用新对话。
|
||||
- 已保存会话重新打开后仍可继续改图,引用已有成果,不依赖 Runtime 内存缓存。
|
||||
- 上游明确不支持编辑时,继续按文字生成,并在该回复底部说明未使用参考图片。
|
||||
缺失历史成果时使用剩余可用上下文并提示,不禁用发送。
|
||||
- 网络、鉴权、限流、参数错误和真正的生成失败仍正常报错,不伪装成能力缺失。
|
||||
- 模型 ID、地址和质量服从用户的模型连接配置,不对特定服务商或模型别名做硬编码。
|
||||
验证以用户指定的 `sub-gpt-image-2` 实际服务能力为准,不由其他模型的失败推断其能力。
|
||||
|
||||
## 文档导航
|
||||
|
||||
| 文档 | 权威职责 |
|
||||
| --- | --- |
|
||||
| [技术设计](./technical-design.md) | 请求、图片引用、协议与失败处理 |
|
||||
| [UI 设计](./ui-design.md) | 消息底部提示及交互边界 |
|
||||
| [功能进度](./progress.md) | 已验证事实和剩余验收 |
|
||||
|
||||
本次只补齐已有工作流,产品规则集中于本页,不另建重复的 PRD、User Stories 或状态机文档。
|
||||
|
||||
## 相关功能
|
||||
|
||||
- [模型连接](../model-connections/README.md):地址、模型 ID、凭据与请求定制。
|
||||
- [直连文本 Agent](../direct-model-agent/README.md):文本模型的工具和上下文压缩,
|
||||
不等于图片模型支持 Responses 图片工具。
|
||||
- [远程主机](../remote-host/README.md):托管 SSH 当前使用 OpenCode,不运行本直连图片路径。
|
||||
@@ -0,0 +1,27 @@
|
||||
# 图片上下文验证记录
|
||||
|
||||
## 2026-09-10
|
||||
|
||||
- 已接线桌面会话成果引用 → Main 已存图片 → Images 编辑,并复用文字历史。
|
||||
- 已增加消息底部的能力缺失提示及 SQLite metadata 持久化,无新增表或服务端会话状态。
|
||||
- 图片上下文专项测试 20 项通过;IPC 成果引用和提示透传专项测试通过。
|
||||
- Renderer 现有生图测试扩展为验证纯图片消息后的追问及提示;消息组件验证提示不产生
|
||||
alert 或 live region;数据库回归验证提示 metadata 保存。
|
||||
- Windows 隔离桌面实例通过真实发送按钮调用用户指定的 `sub-gpt-image-2`:
|
||||
首次生成红圆和绿方块;不重新附图即可把圆改蓝;终止并重开整个测试 Electron 进程后,
|
||||
再次不附图即可保留蓝圆并把方块改黄。实际路由依次为 generations、edits、edits,
|
||||
三次均 HTTP 200,图片颜色和成果恢复已检查,正常续接不出现能力缺失提示。
|
||||
- 在同一个测试实例的请求边界注入一次明确的编辑 HTTP 405,验证生产 Runtime 自动发出
|
||||
一次真实 generations 请求并成功生成第四张图片。消息底部提示未使用参考图片,没有
|
||||
错误状态、alert 或 live region;重新加载会话后提示仍然保留。这是缺失能力的模拟场景,
|
||||
不表示实测的 `sub-gpt-image-2` 上游缺少编辑能力。
|
||||
- 本次实现验收共 4 次真实图片请求、0 次真实文本请求;另有 1 次本地模拟的编辑拒绝。
|
||||
此前接口研究阶段的 8 次请求不计入这 4 次。
|
||||
- 当前源码通过 electron-vite 开发版 Main/Preload 构建及真实 Renderer 链路;本次没有
|
||||
修改生产构建配置,未运行发布打包或独立生产构建。
|
||||
- `npm run typecheck`、`npm run lint` 通过;新文档 7 个本地链接检查通过。
|
||||
- `npm test`:3896 passed、66 skipped、2 failed。失败项为 `App.test.tsx` 中
|
||||
`switches immediately to a managed SSH project and shows only supported OpenCode choices`
|
||||
和 `shows one configured choice per Agent Runtime in a flat keyboard menu`,对应工作区
|
||||
中并行 Runtime 菜单变更的选项数量断言,单独复测仍失败;不在本次图片修复中改写。
|
||||
图片专项、IPC、消息组件和数据库相关测试通过,图片 App 专项也已独立复测通过。
|
||||
@@ -0,0 +1,49 @@
|
||||
# 图片上下文技术设计
|
||||
|
||||
## 请求与存储
|
||||
|
||||
Renderer 从当前完整会话快照选择最近一条 `complete` 助手消息的 `artifactIds`,通过
|
||||
`AgentRequest.imageContextArtifactIds` 传递最多 8 个成果 ID。图片消息可以没有正文,
|
||||
因此引用选择不使用过滤后的文字历史。队列在实际发送时使用当时的会话快照。
|
||||
普通文本历史契约保持 `role/content`;图片字节不进入历史 IPC,也不新增图片副本。
|
||||
|
||||
Main 仅在 `capability === 'image-generation'` 时调用 `withImageConversationContext`。
|
||||
当前 `ContextManager` 已解析的显式附图优先;否则通过现有 `getArtifact` 加载引用的
|
||||
内联 PNG/JPEG,WebP 使用 Electron 解码为 PNG。缺失或不可用引用形成上下文提示,
|
||||
数据库等基础设施错误仍向上传递。读取不依赖会话的异步保存进度,因为成果已在发送
|
||||
`artifact` 事件前由 Main 保存。
|
||||
|
||||
生成图片继续由 `createImageArtifact` 保存。可选 `imageContextNotice` 随生成事件、
|
||||
公开成果事件和消息 metadata 保存,不新增表、迁移、服务端 ID 或 Runtime 会话缓存。
|
||||
它是该回复的展示事实,不进入下一轮提示词。
|
||||
|
||||
## 上游请求
|
||||
|
||||
`ModelAgentRuntime` 将已有文字历史作为会话数据加入提示词,并把本轮要求放在末尾。
|
||||
不从头截断组合提示词而丢掉最后的修改要求;服务商自己的长度和资源限制仍然有效。
|
||||
有图片使用 `/images/edits`,单图字段为 `image`,多图为 `image[]`;无图使用
|
||||
`/images/generations`。质量、认证及自定义请求字段继续走原有配置合并。
|
||||
|
||||
本路径不接入 Responses 图片工具、不依赖 `previous_response_id`,不额外调用文本模型。
|
||||
显式回传上下文不表示上游提供或保存了服务端会话;无法据此保证像素级不变。
|
||||
结果仅接受原有校验通过的内联图片,不下载 Provider 返回的图片 URL。
|
||||
|
||||
## 能力缺失与错误
|
||||
|
||||
编辑返回 HTTP 405/501,或 HTTP 400/404/422 的错误正文明确说明图片编辑不支持或未实现时,
|
||||
同一请求最多再调用一次无图生成。成功成果携带 `editing-unavailable`,继续以 `done`
|
||||
结束;再次失败正常报错,不循环回退。
|
||||
|
||||
其他错误保留 HTTP 状态和 Provider 信息。尤其不把 401/403、429、模型不存在、
|
||||
无效图片、超时或服务暂不可用判作不支持编辑。取消发生后不启动后续生成。
|
||||
本次不持久化能力探测结果、不切换模型、不新增重试框架。
|
||||
|
||||
## Remote 边界与验证
|
||||
|
||||
Renderer 只为直连模型附带成果引用,Main 只在图片能力分支使用它。
|
||||
`managed-remote-acp-runtime.ts` 与远程项目 validator 均要求 OpenCode;
|
||||
本修改不改变 Agent gateway、ACP 或远程模型请求,不需要部署新 Agent。
|
||||
|
||||
专项验证覆盖完整文字、纯图片消息引用、显式附图优先、成果恢复、会话隔离、
|
||||
能力缺失提示、取消、真实错误及 UI/SQLite metadata。真实验收必须从桌面发送按钮进入
|
||||
生产 IPC 和 Runtime,验证生成、连续修改及重新打开后的续接。
|
||||
@@ -0,0 +1,13 @@
|
||||
# 图片上下文提示
|
||||
|
||||
遵循根目录 [UI-DESIGN.md](../../../UI-DESIGN.md)。
|
||||
|
||||
- 仅在某次成功生成确实缺少部分上下文时,在对应助手回复底部显示低强调文字。
|
||||
正常使用上下文不显示警告,也不声称上游“不支持上下文”。
|
||||
- `reference-unavailable`:部分历史图片无法读取,本次仅使用可用的图片与文字上下文。
|
||||
- `editing-unavailable`:上游不支持图片编辑,本次按文字要求生成,未使用参考图片。
|
||||
- 使用共享 `--text-muted`、`--font-caption` 和间距令牌。不加警告卡片、闪烁、
|
||||
`alert`、`aria-live`、弹窗或应用通知。文本保留在消息中并随会话恢复。
|
||||
- 发送和生成继续可用;真实请求失败仍采用原来的错误及重试交互,不生成成功提示。
|
||||
- 文案具备简体中文、英文两套翻译。本轮显式附图和新对话继续使用现有入口,
|
||||
不增加模式开关或第二次确认。
|
||||
@@ -46,5 +46,6 @@ User Stories 和逻辑设计;本页定义产品边界,技术设计定义唯
|
||||
## 相关功能
|
||||
|
||||
- [直连模型 Agent](../direct-model-agent/README.md)
|
||||
- [图片生成与连续修改](../image-generation/README.md)
|
||||
- [DeepSeek Harness Runtime](../deepseek-harness/README.md)
|
||||
- [远程主机与远程执行](../remote-host/README.md)
|
||||
|
||||
Reference in New Issue
Block a user