agent-ui 是一套针对「模型在环」界面的设计模式与交互规范。资料开头指出,这类界面有一个其他界面没有的额外状态:进行中、带有部分输出、长度未知;文中所有模式都围绕如何如实处理这个状态展开。
用途与原则
该资料以原则开篇:折叠展示工作过程,推理、工具调用和来源按需可见,既不隐藏也不强制展开;用户始终可以停止,每次生成都在同一位置提供停止控件,并可通过 Escape 触发;不伪造进度,不使用无意义的加载动画、以计时器冒充的「思考」或比真实流更慢的打字机效果;输入框始终可用,在一条消息流式输出时继续编写下一条是常态;输出是文档而非日志,应渲染 Markdown、真实代码块并保持布局稳定。
主要能力与模式
输入框(composer):默认多行,增长到 6–8 行后滚动,不用单行输入框;桌面端 Enter 发送、Shift+Enter 换行,手机端使用发送按钮、Enter 换行;附件、模型或模式选择、斜杠命令位于文本下方同一框内的同一行;流式输出时发送按钮变为停止按钮,位置与尺寸不变;草稿在刷新和路由切换后保留;发送、停止、关闭对话框后焦点回到输入框;字符或 token 限制仅在接近 10% 时才显示。
流式文本:token 到达时追加到 DOM,不按 token 重新渲染整条消息,流比约 16ms 更快时按动画帧批量处理;不逐字符动画,行尾的柔和光标块足以表示仍在进行;Markdown 用能容忍未闭合块的解析器增量渲染,未闭合代码围栏渲染为代码块而非反引号段落;不预留空间,消息自然增长,但容器不得滚动跳变;长输出在代码约 40 行后,仅在流结束后折叠并显示「Show more」,流进行中不折叠。
思考与推理:运行时显示一行折叠的「Thinking…」,2 秒后显示已用计时器,而不是闪烁段落;可展开查看推理文本,等宽或弱化、字号小于答案;答案开始时思考块折叠为一行并显示时长(如「Thought for 8s」)并保持;模型没有可展示内容时不伪造思考动画,使用普通计时指示。
工具调用:每次调用是消息流内的一行紧凑记录,包含图标或动词、目标、状态(运行中、完成并带结果摘要、失败并带可展开错误);用行或标签而非卡片,连续调用分组,十次读取折叠为「Read 10 files ▸」;展开显示原始输入输出,等宽、可滚动、可复制;运行中的调用在该行显示指示器,整条消息不旋转;失败不打断布局,留在原位标记,由模型下一条消息解释。
审批:当智能体要做有后果的操作(写文件、发邮件、运行命令、花钱)时,在流程内显示块而非模态框,包含要做什么、确切目标、允许/拒绝,可选「本次会话允许」;键盘 Enter 允许、Escape 拒绝(块聚焦时),出现时焦点移入;决定后折叠为一行(如「Allowed: run npm test」);不因用户慢而自动批准,超时即拒绝;文件写入显示 diff、消息显示收件人、消费显示金额。
来源与引用:行内标记([1])链接到消息末尾的来源列表,悬停预览来源;来源列表显示 favicon、标题、主机名,点击新标签打开;引用内容视觉区分(左边框、弱化)且简短;没有来源就不声称有来源,未接地的文本不渲染引用界面。
消息操作:悬停(触屏常显)显示复制、重新生成、编辑并重发(用户消息)、点赞等小图标按钮,行内 28px 目标,出现时不移动布局(预留行高);复制复制 Markdown 源而非渲染文本,并用图标切换确认。
滚动:仅在用户已位于底部时才在流式输出时固定到底部,用户一旦上滚即停止固定;未固定且有新内容时显示「↓ Jump to latest」胶囊;用户新消息滚动到视口顶部,为回复在下方增长留出空间;使用 overflow-anchor 和视口上方稳定高度,避免旧内容因图片和代码块渲染而移动。
延迟:首个 token 晚于 400ms 时,助手消息立即以带光标的空气泡出现,不等待内容来显示回合已开始;工具密集的回合以工具行作为进度指示;限流和排队要说明,已知时间就给出,「In queue, ~20s」优于加载动画。
错误与中断:用户停止时保留部分消息并标记「Stopped」,可继续;流中途失败时保留部分消息,下方显示错误和重发同一提示的 Retry;上下文限制要提前警告而非事后,提供摘要或重新开始;失败时绝不清除用户最后一条消息。
Markdown 渲染:代码块有语言标签、复制按钮、横向滚动、不换行、12.5–13px 等宽、流结束后超过约 30 行折叠;表格在窄屏横向滚动、表头区分、数字用等宽数字;回复内标题比应用标题小一到两级,回复不是页面;链接新标签打开并带外部标记;渲染输出不可信,需消毒。
多智能体与长任务:一次运行有头部显示状态、已用时间、停止;步骤是上述工具调用行,按阶段分组;后台运行显示小型持久指示(导航项上的点),完成时通知而非模态框;历史是带状态和一行摘要的可搜索运行列表。
诚实性:标注所用模型和模式;显示消息何时被编辑或重新生成;区分智能体做了什么和它说做了什么,工具行是事实、散文是散文;「Working…」但 30 秒无事发生是缺陷,应显示正在发生什么或说明卡住。
资料末尾给出检查清单,并列出一些相关组件与参考项目(Beautiful UI、AI Elements、assistant-ui、prompt-kit、AICSS、Amelia Wattenberger 的写作等),以及更多组件地址。