目录

ChatKit Widgets:AI 都能干活了,为什么还要我一直打字

现在很多 AI 助手都能查数据、调接口了,但用起来还是有个烦人的地方:什么都要打字。

让它查一下自动化执行结果,它告诉你失败了 7 条,问要不要看详情。输入“看一下”,它把详情列出来,又问要不要重跑。再输入“重跑一下”。

明明一个按钮就能解决,非要聊上几个来回。

当然可以一次把指令写完整。但人用软件的时候,不会每次都提前想好后面三步要干什么。经常是看到结果,才决定接下来点哪里。

ChatKit Widgets 就可以用在这里:在 AI 的回复里放卡片、列表、按钮,让用户直接操作。

先看一个测试报告

拿一个假设的场景来说。让 AI 查最近一次回归结果,它可以返回这样一张卡片:

回归测试 #20261025-01
共 128 条,通过 121 条,失败 7 条

支付模块    5 条失败    [查看日志]
账户模块    2 条失败    [查看日志]

[重跑失败用例]

看哪里,点哪里。不用再输入“帮我看一下支付模块这 5 条失败用例的日志”,也不用担心它理解成另一次执行。

这里的 Widgets 指的是 ChatKit 对话里的组件。官方提供了卡片、列表和各种子组件,也有 Widget Builder,可以先调布局,再把生成的 JSON 接到后端。官方文档

这个东西吸引我的地方,是它承认了一个很普通的事实:有些操作,点一下就是比说一句方便。

开放的问题适合聊。比如“最近支付模块为什么老出问题”,用户自己也不知道要查什么,让 AI 帮忙找。等它查出几个具体的失败任务,再给几个操作入口就行了,没必要继续猜用户说的是哪一个。

卡片怎么来的

它用结构化数据描述界面。一个容器,里面放文字、布局组件和按钮,组成一棵组件树。组件说明

比如把前面的报告缩到只剩一句摘要和一个按钮,大致是这样:

{
  "type": "Card",
  "children": [
    {
      "type": "Text",
      "value": "回归测试:128 条用例,7 条失败"
    },
    {
      "type": "Button",
      "label": "查看失败详情",
      "onClickAction": {
        "type": "test_run.show_failures",
        "payload": {
          "run_id": "run_20261025_01"
        }
      }
    }
  ]
}

test_run.show_failures 是自己定义的动作名,run_id 是自己系统里的任务 ID。ChatKit 不认识测试平台,这部分得自己接。

上面只是说明结构的 JSON,没包含完整服务端,也没跑过完整项目。

后端把查到的数据填进卡片,前端按组件定义渲染。可以先做几套固定模板:报告摘要用一套,失败列表用一套,任务确认用一套。模型负责分析结果,展示格式先固定下来,至少排查问题的时候少一个变量。

如果想把现有平台里某个复杂页面搬进来,还得先看看组件能不能表达。日志里搜索、跳转行号、多个任务对比,这些功能都加上以后,一条聊天消息未必装得下。

点下去以后,还得自己干活

按钮上绑定的是 Action。用户点击后,应用收到动作类型和参数,再做后续处理。服务端可以在 ChatKitServer.action 里接,也支持把动作交给客户端。Actions 文档

比如点“查看失败详情”,后端拿到 run_id,查权限,查失败用例,再把结果返回。官方的自定义集成支持输出 widget,也可以更新已有组件。自定义集成文档

查详情这一步,我觉得直接调业务接口就够了。用户已经点得很明确,不需要再让模型猜一次他要做什么。到了“分析这几条失败有没有关系”,再让模型读日志。

重跑也是一样。真正容易出问题的地方,还是我们熟悉的那些接口和任务状态。

比如用户点了重跑,接口返回成功。卡片上写什么?

写“重跑成功”就有点含糊。是任务创建成功了,还是已经跑完而且全过了?比较准确的应该是“已创建重跑任务 #xxx”,后面再跟执行进度。

还有一种情况:用户昨天查过报告,今天翻回聊天记录,点了一下旧卡片。测试环境可能早就释放了。后端得重新查当前状态,不能因为昨天给过这个按钮,今天就照样执行。

聊天记录留着,里面的操作却不一定一直有效。这个比普通页面麻烦一点:普通页面刷新后往往会重新取数据,历史消息里的按钮却可能一直在那里。

做测试的,看到按钮就开始想多点两下

真接进测试平台,我第一反应就是:连续点两下重跑,会怎么样?

如果创建出两个任务,哪一个算用户想要的?如果第一次请求超时了,用户又点了一次,服务端其实已经建好任务了怎么办?

这些问题本来就有。换成 AI 助手以后,也一样得测。

还有 run_id。虽然它最初是后端填进卡片的,点击请求到了服务端,还是要查用户有没有权限访问这个任务。官方也明确提醒,Action 和 payload 来自客户端,要当作不可信输入处理。Actions 文档

卡片里没显示别人的任务,不代表用户传不进来别人的 ID。

此外,查不到结果的时候显示什么,模型分析失败后还能不能看原始日志,用户换个设备打开旧消息还能不能继续操作,也都值得试试。

所以测这种功能,光看 AI 回答对不对还不够。得顺着按钮往下走,看看任务是不是真的创建了,创建了几次,界面说的和后台实际发生的是不是一回事。

先放几个有用的按钮

如果要在测试平台试这个东西,我会先做报告摘要、查看日志、重跑确认这几个地方。

特别是重跑之前,把环境、用例数量、执行范围摆出来,比让 AI 回复一句“好的,马上帮你重跑”踏实。用户看一眼,也容易发现“等等,我不是要跑这个环境”。

至于大段日志、复杂筛选、多份报告对比,跳到完整页面也没什么不好。对话里留个摘要和入口就行。

我想看的效果很简单:原来要打三次字,现在点一下就能办完;原来得复制一个长任务 ID,现在直接选对应的报告。

如果做完以后,用户还是要反复解释“不是这条,是上面那条”,那卡片做得再漂亮也没帮上什么忙。