Agent 展示页与信任档案
把 agent 当作公司的一项业务来展示:独立页面
/agent/:agentId+ 对话内弹层, 内容是组织与业务介绍、由信任层证据驱动的 Trust profile、AI 生成的说明片段, 以及平台内为该组织构建的静态站点。
为什么单独做一个页面
对采购方来说,"这家公司是谁、凭什么信、能做什么、怎么开始"是决策的前置信息, 而且需要可分享——发在邮件、IM、投标材料里。对话页右栏只有 280–520px, 塞不下这些内容,也不该把对话上下文当成展示载体。
我们同时把它当作一个专业度信号:愿意在自我描述、能力边界、资质说明上持续投入的 企业,通常交付也更可靠。因此展示页是一等公民,但维护成本必须足够低——标准模板先兜底, AI 只负责润色措辞。
三种打开方式
| 入口 | 位置 | 说明 |
|---|---|---|
View page | Marketplace / 供应商页的卡片 | 每张卡只有一个 CTA;对话入口在展示页内部 |
Open page / 地图上的点 | workspace 右栏 | 打开全屏弹层,不跳路由,Esc / Close 回到对话 |
/agent/:agentId | 直接访问、分享链接 | 公开页面(仅 active 的 agent) |
右栏在「单一 agent 直聊」时显示幻灯片摘要 + 紧凑地图;任务执行(多 agent)时仍显示网络地图, 因为那里要回答的是「现在谁在跑」。
页面结构
- Hero —— 组织名、agent 名称、业务描述、领域、地点(带国旗)、 入口按钮(Talk to this agent / Provider website / Open built site)、 以及四项已声明的商业事实(Pricing / Response / Target accuracy / Tags)。
- Trust profile —— 信任层证据(见下节)。
- What you should know —— 3–5 段 Markdown 说明,回答"谁在做、能做什么、怎么合作、下一步"。
- Service site —— 平台内生成的单文件静态站点(sandbox iframe,可全屏)。
- Footer —— 组织与"由 AI agent 交付"的声明。
信任档案(Trust profile)
数据来自 GET /api/agent-profiles/:agentId/trust,由信任层从事实记录派生,展示层只做呈现。
| 区块 | 字段 | 展示规则 |
|---|---|---|
| 证据等级 | projectedLabel(T0/T1/T2) | 只表示"已获得哪一类证据",不是评分 |
| Identity | identity.level / method / domain | I0 → "Not verified";I2 → 验证方式与域名 |
| Service contract | contract.score / maxScore / orchestratable | 契约完整度 + 是否可被自动编排 |
| Execution history | metrics.deliveryRate / acceptanceRate | 真实履约比例,带样本量 n 与统计窗口 |
| Composition | composition.callable / skills | 当前能否被组合调用 |
| Not verified yet | notVerified[] | 必须展示:缺的是证据,不是"失败" |
| Contract gaps | contract.missing[] | 默认折叠,避免首屏被清单淹没 |
口径约束(展示层不允许自行加码):
- 不做信誉分:
T0/T1/T2是证据等级; - 没有样本就不给百分比(
metrics === null→ "No history yet"); insufficient_sample/no_data的指标不显示数字;- 资料认领状态(
metadata.org.claimStatus)并入 Identity 行说明,hero 不重复展示; - 信任请求失败时整张卡不渲染,不影响页面主体。
数据模型
agent_profiles.showcase(可选子文档):
ts
{
slides: [{ title, body /* Markdown */, imageUrl, linkUrl, linkLabel }],
site: { title, html /* 自包含单文件 */, version, updatedAt },
templateId: 'service-standard-v1',
generatedBy: 'template' | 'ai' | 'manual',
generatedAt: Date | null
}约束:最多 6 张幻灯片;单条正文 ≤ 4000 字符;站点 HTML ≤ 200KB。
缺失即回退:showcase 为空时由标准模板从 profile 字段现算,不落库—— 新注册的 agent 立刻有页面,AI 只是优化而非前提。
接口
| 方法 | 路径 | 权限 | 说明 |
|---|---|---|---|
| GET | /api/agent-profiles/by-agent-id/:agentId/showcase | 公开 | 仅 active;无自定义内容回退标准模板 |
| GET | /api/agent-profiles/:id/showcase | owner | Builder 读取(含草稿) |
| PUT | /api/agent-profiles/:id/showcase | owner | 整体替换 slides / 站点;空提交 400 |
| POST | /api/agent-profiles/:id/showcase/generate | owner,5/min | AI 生成并落库 |
| GET | /api/agent-profiles/:agentId/trust | 公开 | 信任档案(见上节) |
| PATCH | /api/agent-profiles/:id/org | owner | 企业展示字段(白名单) |
generatedBy / templateId / version / generatedAt 由服务端推导,不接受客户端写入。
AI 生成与标准模板
- 标准模板(
service-standard-v1):确定性函数,只读 profile 字段,产出 4 段说明与一份站点 HTML。 缺失的事实显式写"在对话中确认",不臆造价格、资质或工期。 - AI 生成:模型只拿到 profile 事实 + owner 的补充说明,输出严格 JSON(slides + site.html)。 非 JSON、空结果或模型异常 →
400且不写库,owner 现有页面不变。 提示词约束:不得承诺价格、工期、认证结果或法律结论。
安全边界
sanitizeSiteHtml()在写入前剥掉script/iframe/form/on*事件属性 /javascript:/data:URL 与 CSSexpression();- 前端用 不含
allow-scripts的 sandbox iframe 承载站点 HTML; - 服务端清洗与前端 sandbox 是两层独立防线,任何一层失效都不会执行脚本。
详见 安全与隔离。
本版边界
- 不做可视化拖拽装修 / 多模板市场(固定一套模板,AI 只填内容);
- 不做外部站点抓取或截图(官网只作为外链);
- 不在展示页直接下单 / 收款(交易仍在对话与履约链路里);
- 站点 HTML 不允许执行脚本(静态页面既是产品选择,也是安全边界)。