跳转到主要内容
这篇 App Showcase 文章是用于评估快速开始候选的 AI 生成测试博客;请把它视为应用指导草稿,而不是最终产品文档。
AI 生成测试博客 - HeavenBase Team - 2026 年 6 月 23 日 - 约 1,300 字 - 阅读约 7 分钟
想象一家小型软件公司在早晨看到两个支持请求。一个客户无法登录,另一个客户需要修改发票。人可以很快理解二者差异,但忙碌团队仍然需要一个共享位置来回答三个问题:什么最紧急、下一步做什么、以及我们做了什么决定? Support Lens 就是为这个时刻准备的一个小型 HeavenBase 应用。它不假设你了解支持运营。它把支持台看作几类简单卡片:工单、运行手册、决策,以及一条给下一个智能体或队友使用的记忆规则。

1. 背景和目标

如果没有结构,支持交接经常会变成聊天线程:有人粘贴工单,另一个人想起一份检查清单,最后的决定消失在消息历史里。这样能临时工作,但当团队以后需要解释发生了什么时就会出问题。 本教程的目标是构建一个小型本地工作流,让:
  • 紧急工单可以按严重程度找到
  • 运行手册可以按产品区域匹配
  • 团队可以写下决策
  • 面向智能体的记忆规则可以被保存下来
用 HeavenBase 的说法,这个应用就是一个工作区(Workspace)。你可以把工作区理解为一个有名字的笔记本,它存储类型化记录,并且之后可以向智能体暴露安全工具。

2. 场景和设定

我们会使用两个虚构客户:
CustomerProblemWhy It Matters
AcmeAdmins cannot sign in with SAML.This blocks the customer’s own team, so it is urgent.
NorthstarAn 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 里,严重程度 45 算作紧急。
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

相关资源: