Pull Request · feat/interface-layer-alignment

给 Agent 接口层补齐四类能力

让 Eyrie 的 agent 能接收图片、能挑模型、能反问用户、能上报更细的运行信息——同时把底层的数据安全和并发正确性一起补稳。

✓ 453 测试通过 ✓ CI 绿 ✓ 可合并 无 blocker 对外接口加性兼容

这个 PR 让 Eyrie 能做四件以前做不到的事

每一项都是「agent 和用户之间能传递的信息」更丰富了一点。

给 agent 发图片和文件

一次输入不再只是一段文字,可以带图片等附件。文件会先上传、保存到运行 agent 的后台服务(daemon)所在的机器上,并返回一个引用;把这个引用真正随对话喂给 agent 的那一步留到后续(见下方「范围边界」)。

为什么有用:截图、设计稿、报错图这类「一图胜千言」的上下文,将能直接喂给 agent。

选模型、调参数

每个 provider(接入的 agent 来源,如 Claude Code / Codex)现在能上报「我支持哪些模型、有哪些可调项」,开会话时用户选好的模型和配置会被记住并带给 agent。

为什么有用:同一个 agent 可以按任务切换模型、调整行为,而不用改代码或重启。

Agent 能反问用户

agent 执行中可以发起一次结构化提问,用户回答后再继续。敏感答案(密钥之类)只交给 agent,不会被记进日志或推给界面

为什么有用:缺信息时 agent 不再瞎猜或卡死,而是直接问;同时把敏感输入挡在存储之外。

更细的运行信息

界面能看到这一回合用了多少 token / 上下文,能把可信操作自动放行,审批和下拉单选等控件也能渲染得更完整;每次运行还能和来源对上号,便于排查。

为什么有用:用量看得见、可信操作免打扰、交互控件更丰富。

三条主要流程,一图看懂

不看代码,只看信息怎么从一头走到另一头。

01文件上传:走到 agent 所在的机器
用户选文件
图片 / 文本 / PDF
上传
传到后台服务的机器
落盘到本机缓存目录
返回
一个文件引用
不透明引用 · 非主机路径
后续接通
随对话发给 agent
本 PR 未接
02选模型与配置:从 provider 一路带到运行
provider 上报能力
支持哪些模型、可调项
用户开会话时选
模型 + 配置
记住
存进会话
校验后保存
启动时合并
带进 agent 运行
03Agent 反问用户:答案分两条路走
agent 缺信息
发起结构化提问
界面展示给用户
用户回答
完整明文
只交给 agent,回给 provider
脱敏版 · 密钥→[已隐藏]
写日志 / 推界面 / 事件回放

敏感答案永远不会以明文进入日志、界面或回放——只有发回 provider 的那一份是完整的。

顺手把三块硬骨头啃了

这些用户看不见,但决定了上面的能力是否可靠。

数据库迁移收敛成单一基线

开发阶段把累积的多个迁移快照 squash 成一个 0000_init;改结构时直接重建本地开发库,正式 dogfood 前不做保数据迁移,避免半成品迁移堆积。

并发下不写脏数据

当「用户回答 / 审批」和「运行被取消」同时发生时,过期的那一方会被整体撤销,界面不会出现「又被取消、又有结果」这种自相矛盾的状态。

上传通道有安全约束

只收图片 / 文本 / PDF,挡掉能在浏览器里执行脚本的文件,文件名经过清洗(写不到上传目录之外),大小和长度都有上限。

插入是手写的测试和源码,删除是迁移瘦身

PR 总计 +5487 / −5018 行:插入几乎全是手写的测试和源码;那一大坨删除是把旧迁移快照压成单一基线。

测试
+2984 · 手写
源码
+2188 · 手写
新基线快照
+315 · 自动生成

插入里约 94% 是手写的测试与源码;−5018 行删除里绝大部分(~4500 行)是把累积的旧迁移快照 squash 成单一 0000_init 基线(有测试强制它和真实的数据库结构一致)。

哪些有意留到后面做

PR #50 · feat/interface-layer-alignmentmain · 30 commits · 51 files
四块能力:图片 / 文件输入 · 选模型与会话配置 · agent 反问用户 · 更细的运行信息