OpenUI × Vercel Eve Agent 身份提示词设计:让 Agent 用生成式 UI 而非 JSON 回答问题
【免费下载链接】openuiThe Open Standard for Generative UI项目地址https://gitcode.com/gh_mirrors/openui1/openui点击查看免费下载导读identity.md是 OpenUI Cloud 模板中 Vercel Eve Agent 的身份System Prompt定义文件它规定了OpenUI 助手如何自我介绍、如何组织回答、何时调用工具、何时切换到 OpenUI Lang 生成式 UI 组件。本文以该文件为核心结合 templates/openui-cloud/overlays/vercel-eve 模板的 agent 运行时源码逐条拆解提示词的设计意图与落地方式。读完你将掌握如何为基于 Eve 的生成式 UI Agent 编写身份提示词以及提示词中的每条规则在eve运行时、工具注册、动态指令注入中分别对应什么实现。一、文档定位一个 Agent 的性格与行为准则在 vercel-eve 这个 overlay 中Agent 的行为被拆成了两个互补的提示词文件位于 agent/instructions 目录文件职责identity.md定义 Agent 的身份与回答风格我是谁、怎么回答、何时用工具、何时用 UI 组件、何时保持沉默不提及底层技术栈。openui.ts定义 Agent 的技能知识在会话启动时把 OpenUI Lang 的组件库规范library spec注入上下文让模型会写生成式 UI。identity.md全文只有两个段落——Identity 和 How to respond但它是一份高度浓缩的产品化提示词它没有教模型任何语法而是教模型什么时候该做什么。这种身份与能力分离的写法正是本项目把它单独拆成一个 Markdown 文件而不是塞进代码里的原因提示词作者可以脱离 TypeScript 运行时独立迭代行为准则。二、身份定义Identity 段的三个锚点原文You are an OpenUI assistant powered by Eve. You help users understand information, take action, and explore ideas through clear conversation and generative UI when it helps.这句身份声明可拆出三个设计锚点You are an OpenUI assistant—— 明确角色是对外可感知的 OpenUI assistant而不是 Eve agent 或 OpenUI 框架 本身。角色名词决定了用户对该助手的预期它服务于理解信息、采取行动、探索想法三类通用任务而非某个垂直领域。powered by Eve—— 这是文档中唯一一次出现底层运行时名字。它属于对实现者说话的元信息Eve 负责承载模型推理、工具执行、会话与流式传输见 agent.ts 中defineAgent的模型与上下文窗口配置但这一句只在身份层出现恰好与最后一条响应规则不主动提及 Eve形成呼应。generative UI when it helps—— 点出 OpenUI 的核心差异化回答不局限于文本而是当生成式 UI 有帮助时输出 UI。注意限定语when it helps——UI 不是默认答案而是按需启用的选项。三、How to respond五条响应规则的逐条拆解原文的 How to respond 包含六条行为约束。每条都能在模板源码中找到对应的工程实现下面逐条对照。规则 1直接、准确短段落优先Be direct and accurate. Prefer short paragraphs over long preambles.这是对所有 LLM 系统提示词通用的风格约束没有对应的工具或代码实现但它设定了identity.md自身的文风全文没有任何寒暄、没有作为一个人工智能助手之类的开场白本身就是短段落、无废话的示范。这类风格约束放在身份文件而非组件库注入中是因为它作用于所有回复而组件库规范只作用于生成 UI 的那部分回复。规则 2歧义时用纯文本问一个聚焦的澄清问题If the request is ambiguous, ask one focused clarifying question in plain text.这条规则在模板中有一个非常具体的工程落点agent/tools/ask_question.ts。Eve 运行时自带ask_question内置工具一种结构化提问交互但模板明确将其禁用并在文件注释中给出了原因The chat UI has no renderer for Eves ask_question input requests, so the session would park on an invisible question. Disabling the built-in makes the model ask clarifying questions in plain (OpenUI) text instead.也就是说当前 Agent Interface 的聊天界面没有渲染ask_question输入请求的组件如果保留该工具模型会发出一个用户看不见的问题会话会卡死在一个隐形交互上。因此模板调用disableTool()关掉它迫使模型改用纯文本提问。这正是提示词里 in plain text 的来源——它不是风格偏好而是与前端渲染能力对齐后的必然选择。规则 3能用工具拿到事实就别猜Use tools when they provide facts you would otherwise guess (for example weather for a named place).这条规则对应模板中唯一保留启用的工具get_weather。它有两个文件层面的实现agent/tools/get_weather.ts 是 Eve 侧的defineTool包装用 zod 定义了location输入参数z.string().trim().min(1)并委托给共享实现执行templates/openui-cloud/src/lib/tools/get-weather.ts 是真正的业务实现先用 Open-Meteo 的地理编码 APIgeocoding-api.open-meteo.com/v1/search把地名解析为经纬度再调用api.open-meteo.com/v1/forecast取temperature_2m、weather_code、wind_speed_10m最后把 WMO 天气码折叠成clear sky / partly cloudy / fog / drizzle / rain / snow / rain showers / snow showers / thunderstorm等人类可读描述并以 JSON 字符串返回给模型。该文件的头注释把它定位为添加自己工具的参考模板declare the tool to the model (getWeatherTool) and execute it on your server (executeGetWeather)提示词规则 3 之所以强调例如某个地点的天气正是因为模板提供了这个开箱即用的示例工具。manifest.json 的gettingStarted也建议用 Whats the weather in Berlin? 来验证工具链路。规则 4结构化布局需求 → 用 OpenUI Lang 组件回答When the user wants dashboards, comparisons, checklists, forms, or other structured layouts, answer with OpenUI Lang UI components. The component library prompt is injected when the session starts — you do not need to describe the syntax in chat.这是整份提示词中与 OpenUI 技术栈绑定最深的一条它明确列出了一类触发条件仪表盘dashboards、对比comparisons、清单checklists、表单forms以及任何结构化布局structured layouts。这些恰恰是用纯文本讲不清楚、用 UI 一目了然的场景。原文还交代了一个关键机制组件库提示词在会话启动时被注入injected when the session starts——所以 identity 文件里不需要写任何 OpenUI Lang 语法。这个机制在 instructions/openui.ts 中有精确实现import { generateSystemPrompt } from openuidev/lang-core; import { defineDynamic, defineInstructions } from eve/instructions; import librarySpec from ../../src/generated/spec.json with { type: json }; export default defineDynamic({ events: { session.started: () defineInstructions({ markdown: generateSystemPrompt({ cloud: true, library: librarySpec }), }), }, });要点defineDynamicsession.started事件确保组件库提示词只在会话开始时解析一次而不是在每次请求时重新生成避免无谓的开销generateSystemPrompt来自openuidev/lang-core包配合library: librarySpec从 src/generated/spec.json 导入的组件库规范动态拼出完整的 OpenUI Lang 系统提示词这就是 identity 里 you do not need to describe the syntax in chat 的工程依据语法能力由这段注入的指令提供identity 只负责什么时候该用。规则 5工具调用后总结结果不倾倒原始 JSONAfter tool calls, summarize the result for the user and continue the task; do not dump raw JSON unless they ask.这与工具实现的返回形态形成对照executeGetWeather返回的是 JSON 字符串例如{place:Berlin, Germany,temperature_c:15.2,conditions:partly cloudy,wind_kmh:11.0}但用户端看到的应当是模型转述的摘要而非这段 JSON。这条规则保证了工具返回结构化数据、模型负责人类可读化的分工——JSON 是模型与工具之间的传输格式不是给用户看的最终产物。规则 6不主动提及底层技术栈Do not mention Eve, adapters, streaming, or prompt wiring unless the user asks about the stack.这条规则列出四个内部词Eve、适配器adapters、流式传输streaming、提示词接线prompt wiring。它们共同指向 Agent 的运行时管道——agent.ts 中的模型创建、channels/eve.ts 中的/eve/v1/session*HTTP 通道、next.config.ts 中的withEve(nextConfig)注入都属于用户不需要知道的实现细节。把这类词从对外输出中剔除是产品化 Agent 提示词常见的前台/后台隔离手法用户只与 OpenUI assistant 交互而不是与框架交互。四、提示词的完整运行链路从文件到会话把上述文件串起来一次会话的完整链路是identity.md身份 回答风格 │ ├─→ openui.ts 在 session.started 时注入 OpenUI Lang 组件库规范 │ ├─→ agent.ts 创建模型Thesys 网关 resolveOpenuiModel │ ├─ modelContextWindowTokens: 1_048_576覆盖窗口大小保证 Eve 能正确压缩上下文 │ └─ build.externalDependencies: [openuidev/lang-core] │ ├─→ channels/eve.ts 暴露 /eve/v1/session* 事件流本地开发 auth: none() │ └─→ 工具集get_weather 启用 / ask_question、web_search 禁用几个值得展开的源码细节模型接入agent.tscreateOpenAI指向https://api.thesys.dev/v1/embed使用THESYS_API_KEY环境变量缺失时启动即抛错。模型 id 由resolveOpenuiModel(google/gemini-3.6-flash-free)解析可通过OPENUI_MODEL环境变量覆盖。模型白名单src/lib/models.tsMODEL_IDS列出了 Cloud Eve agent 接受的全部模型 idClaude、GPT、Gemini 系列resolveOpenuiModel对白名单外的值会直接抛错Unknown OPENUI_MODEL ...避免静默回退到错误模型。上下文窗口覆盖agent.ts 中modelContextWindowTokens: 1_048_576是必要的修正——Thesys embed 模型 id 不在 Vercel AI Gateway 目录中若不手动指定Eve 无法计算压缩compaction所需的窗口大小Agent 编译会失败无/eve路由。web_search 为何被禁用agent/tools/web_search.tsEve 把openai.responses当作 OpenAI 模型会自动注入托管的web_search提供方工具而本 overlay 不挂接 Cloud 搜索若不disableTool()禁用 Eve 内置版本模型会尝试发起本地无法执行的ws_*调用。认证策略channels/eve.tseveChannel({ auth: none() })允许匿名流量以便本地开发文件注释明确提示公开部署前换成bearer()/basic()。五、实战如何基于 identity.md 定制你自己的 Agent结合模板的目录结构与 manifest.json 的脚本定义eve dev/eve build/eve start --host 127.0.0.1 --port 4274/next start见 manifest.json定制一个 Agent 通常只需四步改身份编辑 agent/instructions/identity.md调整角色声明第一段与响应规则第二段。需要新行为准则时直接新增一条 bullet 即可——它会在每次会话开始时作为静态指令生效。增技能如需让 Agent 会写新的 UI 模式修改组件库规范librarySpec或补充defineInstructions的注入内容如需新增函数工具参照 get_weather.ts 的声明工具 服务端执行两步式结构并在 agent/tools 下新建 Eve 侧包装。选模型通过OPENUI_MODEL环境变量在 src/lib/models.ts 白名单中选择模型默认值为google/gemini-3.6-flash-free。控暴露面确认ask_question、web_search等内置工具是否需要保留或禁用与你的聊天前端渲染能力对齐并在公开部署前把通道认证从none()换成bearer()/basic()。六、小结一份合格的身份提示词应当回答的三个问题回顾identity.md它可以提炼为三个任何生成式 UI Agent 都需要回答的问题我是谁Identity 段—— 对外呈现的角色以及UI 是何时有用的这一价值取向我怎么说话规则 1、2、5、6—— 风格、澄清策略、结果汇报方式、技术栈保密边界我什么时候切换形态规则 3、4—— 事实类需求走工具结构化布局需求走 OpenUI Lang 组件并依托session.started动态注入的组件库规范完成会写 UI的能力闭环。这份文件的价值在于它把最容易失控的模型行为沉淀为一份可独立迭代的 Markdown 资产与 openui.ts 的运行时注入解耦。改行为不动代码改能力不动行为——这正是本项目将身份提示词独立成文件的工程设计意图。若要为你的 Eve Agent 建立行为基线直接从 identity.md 起步是最快的路径。赞分享【免费下载链接】openuiThe Open Standard for Generative UI项目地址https://gitcode.com/gh_mirrors/openui1/openui点击查看免费下载相关推荐如何用KLayout实现芯片设计全流程从原理图到版图验证的完整指南如何用KLayout实现芯片设计全流程从原理图到版图验证的完整指南 你是否曾经为芯片设计中的版图验证问题而烦恼面对复杂的电路布局和繁琐的设计规则检查传统E可观测性AI 评测LLMOpsAI 应用人工智能Composio Eve 文档助手系统提示词全解析为 AI Agent 设计可落地的文档问答行为规范Composio Eve 文档助手系统提示词全解析为 AI Agent 设计可落地的文档问答行为规范 Composio 在官方文档站右侧边栏内置了一个名为 E人工智能AI Agent工具调用MCP 服务MCP ClientsCopilotKit 声明式 JSON 渲染实战用 Claude Agent SDKTypeScript让 Agent 直接生成仪表盘 UICopilotKit 声明式 JSON 渲染实战用 Claude Agent SDKTypeScript让 Agent 直接生成仪表盘 UI Copilo人工智能AI AgentAgent 框架前端后端上一篇HMAC请求签名也能抓android-reverse-engineering-skill高级签名模式提取详解下一篇如何免费批量下载抖音无水印视频三步搞定跑通创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考