这篇 App Showcase 文章是用于评估快速开始候选的 AI 生成测试博客;请把它视为应用指导草稿,而不是最终产品文档。
AI 生成测试博客 - HeavenBase Team - 2026 年 6 月 23 日 - 约 1,300 字 - 阅读约 7 分钟
想象一家小型软件公司在早晨看到两个支持请求。一个客户无法登录,另一个客户需要修改发票。人可以很快理解二者差异,但忙碌团队仍然需要一个共享位置来回答三个问题:什么最紧急、下一步做什么、以及我们做了什么决定?
Support Lens 就是为这个时刻准备的一个小型 HeavenBase 应用。它不假设你了解支持运营。它把支持台看作几类简单卡片:工单、运行手册、决策,以及一条给下一个智能体或队友使用的记忆规则。
1. 背景和目标
如果没有结构,支持交接经常会变成聊天线程:有人粘贴工单,另一个人想起一份检查清单,最后的决定消失在消息历史里。这样能临时工作,但当团队以后需要解释发生了什么时就会出问题。
本教程的目标是构建一个小型本地工作流,让:
- 紧急工单可以按严重程度找到
- 运行手册可以按产品区域匹配
- 团队可以写下决策
- 面向智能体的记忆规则可以被保存下来
用 HeavenBase 的说法,这个应用就是一个工作区(Workspace)。你可以把工作区理解为一个有名字的笔记本,它存储类型化记录,并且之后可以向智能体暴露安全工具。
2. 场景和设定
我们会使用两个虚构客户:
| Customer | Problem | Why It Matters |
|---|
| Acme | Admins cannot sign in with SAML. | This blocks the customer’s own team, so it is urgent. |
| Northstar | An invoice has a purchase-order typo. | This matters, but it does not block product usage. |
支持团队还有两份内部运行手册。运行手册就是某类已知问题的一份短检查清单。
如果你不是支持领域专家,可以把“运行手册”读作“我们希望下一个人能找到的已保存检查清单”。
3. Step 1:打开一个工作区
社区示例使用名为 demo_workspace 的 helper,因此每次运行都会写入本地 .temp/ 数据,并且可以干净地重置。
import heavenbase as hb
from community_runtime import demo_workspace, parse_reset, print_frame, seed
WS_ID = "community-app-support-lens"
ws, _ = demo_workspace(WS_ID, "apps-support-lens", parse_reset())
ws.enable_extension("agent")
启用 agent 扩展是因为最后一步会存储一条小记忆规则。即使没有 LLM 或聊天智能体,前四步仍然有意义。
4. Step 2:定义卡片
这个应用需要三种卡片。SupportTicket 是进入系统的客户问题。Runbook 是检查清单。TriageDecision 是评审后写下的交接笔记。
class SupportTicket(hb.Entity):
"""Ticket the support team needs to triage."""
account = hb.field(hb.ShortText).desc("Customer account")
issue = hb.field(hb.LongText).desc("Issue text")
severity = hb.field(hb.Integer).desc("1 is low, 5 is urgent")
product_area = hb.field(hb.ShortText).desc("Product area")
status = hb.field(hb.ShortText).desc("open, watching, or closed")
class Runbook(hb.Entity):
"""Internal runbook card."""
product_area = hb.field(hb.ShortText).desc("Area this runbook covers")
title = hb.field(hb.ShortText).desc("Runbook title")
steps = hb.field(hb.LongText).desc("Short action plan")
class TriageDecision(hb.Entity):
"""Decision recorded after a support review."""
ticket_id = hb.field(hb.Identifier).desc("Ticket object_id")
owner = hb.field(hb.ShortText).desc("Human owner")
decision = hb.field(hb.LongText).desc("Next action")
这是第一个 HeavenBase 思路:先定义信息的形状,再考虑存储。你不是手写数据库表,而是在命名应用真正关心的记录。
5. Step 3:注册并加入起始数据
注册会告诉工作区有哪些卡片。之后,seed(...) 会插入一组很小但真实感足够的起始数据。
ws.register(SupportTicket)
ws.register(Runbook)
ws.register(TriageDecision)
seed(
ws,
SupportTicket,
[
{"object_id": "ticket-login", "account": "Acme", "issue": "SAML login fails for all admins.", "severity": 5, "product_area": "auth", "status": "open"},
{"object_id": "ticket-billing", "account": "Northstar", "issue": "Invoice PO number typo.", "severity": 1, "product_area": "billing", "status": "open"},
],
)
seed(
ws,
Runbook,
[
{"object_id": "runbook-auth", "product_area": "auth", "title": "SAML outage checklist", "steps": "Confirm IdP metadata, check cert rollover, collect trace id."},
{"object_id": "runbook-billing", "product_area": "billing", "title": "Invoice correction", "steps": "Void draft, regenerate PDF, notify AP contact."},
],
)
样例数据刻意保持很小。重点不是数量;重点是故事里的每一行都有清楚用途。
6. Step 4:提出第一个有用问题
现在提出队友会先问的问题:“哪个工单现在需要关注?”在这个 demo 里,严重程度 4 或 5 算作紧急。
urgent = (
ws.query(SupportTicket)
.where(SupportTicket.severity >= 4)
.select("account", "product_area", "issue")
.execute()
)
runbooks = (
ws.query(Runbook)
.where({"product_area": "auth"})
.select("title", "steps")
.execute()
)
查询结果小到人可以阅读,也足够结构化,智能体也可以使用:
Urgent tickets
object_id | account | product_area | issue
------------------------------------------
'ticket-login' | 'Acme' | 'auth' | 'SAML login fails for all admins.'
Matching runbooks
object_id | title | steps
-------------------------
'runbook-auth' | 'SAML outage checklist' | 'Confirm IdP metadata, check cert rollover, collect trace id.'
这是第二个 HeavenBase 思路:应用读起来像用户提出的问题。查询工单卡片,按严重程度过滤,然后选择读者需要的列。
7. Step 5:记录决策和记忆
团队看到紧急工单和匹配运行手册后,会记录一个决策。这会把一次性对话变成之后可检查的一行数据。
ws.upsert(
TriageDecision,
{
"object_id": "decision-login",
"ticket_id": "ticket-login",
"owner": "platform-oncall",
"decision": "Use SAML outage checklist before escalating.",
},
)
memory = ws.to_mcp(profile="memory")
memory.run(
"remember",
key="support-lens-rule",
text="Severity 4 or 5 tickets need a runbook lookup before handoff.",
)
决策属于支持工作流。记忆规则属于未来的智能体或队友。HeavenBase 把二者都放在同一个工作区边界之后。
脚本结束时,工作区里包含紧急工单、匹配运行手册、一条已记录决策,以及一条已记住的规则。
8. 这篇教程教了什么
Support Lens 是一个好的快速开始候选,因为读者不需要了解数据库、支持领域术语或智能体架构。他们只需要跟随一个熟悉的流程:收到问题,找到正确清单,写下决策,并记住规则。
如果以后要做生产应用,可以加入服务等级截止时间、真实工单导入、运行手册负责人,或者更窄的自定义 profile,只向智能体暴露选定工具。
Try It
在社区示例 checkout 中运行:
rtk bash scripts/run.bash apps.support_lens
脚本会把本地数据写到 .temp/ 下,并默认重置,所以可以安全地反复探索。
Further Exploration