- 移除 TodoItem 中的 priority、created_at 和 updated_at 字段 - 强制每个任务都必须有唯一 id,且由用户负责生成 - 修改合并模式逻辑,merge=true 下保留未提及的旧任务 - 支持已完成和已取消任务重新激活(状态改回 pending 或 in_progress) - 禁止 in_progress 状态退回到 pending,必须标记为 completed 或 cancelled - 优化状态转换校验,允许特定状态间合法切换 - 简化任务变更消息,移除详细的新增/更新/移除统计 - 更新文档和示例,明确 id 必须由用户生成和使用 - 修复和补充测试,增强状态转换和合并模式验证 - 调整任务时间戳生成逻辑,统一使用当前时间及索引 - 该变更提供更合理的任务状态机械及管理模式,提升稳定性和易用性
23 KiB
base +dashboard-block-get-data
前置条件: 先阅读 lark-base-dashboard.md 了解 dashboard 整体工作流。
获取仪表盘图表组件(block)的最终计算结果,返回一份适合 AI 直接消费的图表协议 JSON。
这个命令适合以下场景:
- 读取柱状图 / 条形图 / 折线图 / 饼图 / 环形图 / 面积图 / 组合图 / 散点图 / 漏斗图 / 雷达图 / 词云 / 指标卡的实际计算结果;
- 把图表结果交给 AI 做后续总结、趋势解释、同比/环比说明、异常点提取;
- 在不读取原始记录的前提下,直接消费图表层已经聚合好的结果;
- 验证某个图表当前展示的数据是否符合预期。
Important
- 本命令返回的是图表结果协议,不是 block 元数据;
- 如果你需要
name、type、layout、data_config等配置,请先用+dashboard-block-get;- 文本组件(
text)不涉及计算,不适用本命令;
一句话理解
+dashboard-block-get-data = 拿图表“算出来的结果”,而不是拿图表“怎么配置的”。
支持的图表类型
当前支持以下图表类型的数据计算与返回:
二维图表(10 种)
- 柱状图
- 条形图
- 折线图
- 饼图
- 环形图
- 面积图
- 组合图
- 散点图
- 漏斗图
- 雷达图
特殊类型(2 种)
- 词云
- 指标卡(statistics)
Caution
文本组件虽然也属于 dashboard block,但它不产生可计算数据,因此不会返回本协议。
推荐命令
lark-cli base +dashboard-block-get-data \
--base-token bascn***************CtadY \
--block-id chtxxxxxxxx
如果你还不知道目标 block 的 ID,典型顺序是:
# 先看仪表盘里有哪些组件
lark-cli base +dashboard-block-list \
--base-token bascn***************CtadY \
--dashboard-id blkxxxxxxxx
# 再读取某个组件的最终计算结果
lark-cli base +dashboard-block-get-data \
--base-token bascn***************CtadY \
--block-id chtxxxxxxxx
如果你需要先确认组件类型、名称或 data_config,请先执行:
lark-cli base +dashboard-block-get \
--base-token bascn***************CtadY \
--dashboard-id blkxxxxxxxx \
--block-id chtxxxxxxxx
参数
| 参数 | 必填 | 说明 |
|---|---|---|
--base-token <token> |
是 | Base Token,标识目标多维表格 |
--block-id <id> |
是 | 图表 Block ID,即目标组件的唯一标识 |
--format <fmt> |
否 | 输出格式,遵循 CLI 全局输出格式规则 |
--dry-run |
否 | 只预览 API 调用,不真正执行 |
Tip
这个命令不需要
--dashboard-id。只要base_token + block_id即可定位并读取图表结果。
返回结构总览
服务端响应外层仍然是标准 OpenAPI 包装:
{
"code": 0,
"msg": "success",
"data": {
"dimensions": [...],
"measures": [...],
"main_data": [...]
}
}
其中 data 就是 CLI 图表协议本体。不同图表类型的 data 结构略有不同:
| 图表类型 | 一定有 | 可能有 |
|---|---|---|
| 二维图表 | dimensions / measures / main_data |
无 |
| 词云 | dimensions / measures / main_data |
无 |
| 指标卡 | dimensions / measures / main_data |
comparison_data / trend_data |
协议字段说明
1) dimensions
维度定义数组,告诉你主结果里每个 dim_* key 代表什么字段。
[
{
"field_name": "文本",
"alias": "dim_5bKp"
}
]
字段含义:
| 字段 | 说明 |
|---|---|
field_name |
维度字段显示名称 |
alias |
维度别名,在 main_data / trend_data 中作为 key 使用 |
2) measures
指标定义数组,告诉你每个 me_* key 代表什么聚合指标。
[
{
"field_name": "Count",
"aggregation": "count_all",
"alias": "me_Y291bnRfYWxsX0NvdW50"
}
]
字段含义:
| 字段 | 说明 |
|---|---|
field_name |
统计该指标时所使用的字段名称;当 aggregation = count_all 时固定为 Count,表示统计记录总数 |
aggregation |
聚合方式,常见值:count_all / count / sum / avg / min / max |
alias |
指标别名,在 main_data / comparison_data / trend_data 中作为 key 使用 |
例如:
- 如果统计“销售额”的求和,则
field_name = 销售额、aggregation = sum - 如果统计记录总数,则
field_name = Count、aggregation = count_all
3) main_data
主结果集。每一行都是一个对象,key 不是字段名本身,而是 dimensions / measures 中声明过的 alias。
[
{
"dim_5bKp": {"value": "A"},
"me_Y291bnRfYWxsX0NvdW50": {"value": 3}
}
]
4) comparison_data
仅指标卡可能返回。表示同/环比的两个值,顺序固定为:
- 当前周期值
- 对比周期值
Note
原始协议里通常不直接展示周期名称,只提供对应的值。因此解释“同比”还是“环比”、以及比较窗口具体是什么,通常要结合组件配置或 UI 上下文理解。
5) trend_data
仅指标卡可能返回。表示时间序列趋势,每一行通常包含一个时间维度和一个指标值。
alias 规则与读取方式
你不应该把 alias 当成人类可读字段名,而应把它视为结果表里的列 ID。
常见生成规则:
- 维度 alias:
dim_+base64(field_name) - 指标 alias:
me_+base64(aggregation + "_" + field_name)
Note
为了便于阅读,本文档中的部分示例会使用简化后的 alias(例如
dim_xxx、me_xxx或较短的示例值),不保证和真实返回值逐字符一致。 在实际读取结果时,应始终以dimensions/measures中声明的 alias 为准,而不要假设所有示例都严格展开成完整编码值。
例如:
{
"dimensions": [
{"field_name": "文本", "alias": "dim_5bKp"}
],
"measures": [
{"field_name": "Count", "aggregation": "count_all", "alias": "me_xxx"}
],
"main_data": [
{
"dim_5bKp": {"value": "A"},
"me_xxx": {"value": 3}
}
]
}
应解读为:
dim_5bKp对应字段“文本”,取值是Ame_xxx对应指标count_all(Count),取值是3
Tip
读取结果时,先看
dimensions/measures,再解main_data。不要仅凭 alias 名字猜含义。
各图表类型的协议细节
一、二维图表
适用于:柱状图、条形图、折线图、饼图、环形图、面积图、组合图、散点图、漏斗图、雷达图。
结构特征
dimensions:通常有1~2个维度- 不分组聚合时:通常 1 个维度
- 开启分组聚合时:通常 2 个维度
measures:指标定义数组main_data:按“维度组合”展开后的行数据
这类数据代表什么
二维图表返回的本质上是一张聚合结果表:
- 每一行代表一个维度值,或一组维度组合;
- 每一个 measure 值代表该维度下算出来的指标结果;
- 如果图表开启了分组聚合,那么每一行表示“主维度 + 分组维度”的一个组合结果;
- 如果图表是折线图、面积图这类带时间轴的图,通常可以把第一维理解为横轴、把 measure 理解为纵轴数值;
- 如果图表是饼图、环形图这类占比图,通常可以把每一行理解为一个扇区对应的分类及其数值。
换句话说,AI 在读取这类结果时,可以把它当作“按某些维度聚合后的统计明细表”,适合进一步做排序、Top N、占比解释、分组对比和趋势总结。
示例 1:普通二维图表(无分组聚合)
{
"dimensions": [
{
"field_name": "文本",
"alias": "dim_5bKp"
}
],
"measures": [
{
"aggregation": "count_all",
"field_name": "Count",
"alias": "me_Y291bnRfYWxsX0NvdW50"
}
],
"main_data": [
{
"dim_5bKp": {"value": "A"},
"me_Y291bnRfYWxsX0NvdW50": {"value": 3}
},
{
"dim_5bKp": {"value": "B"},
"me_Y291bnRfYWxsX0NvdW50": {"value": 2}
},
{
"dim_5bKp": {"value": "C"},
"me_Y291bnRfYWxsX0NvdW50": {"value": 2}
}
]
}
可解读为:
- 维度字段是“文本”
- 指标是“按记录总数统计”
- 当“文本”字段为
A时,对应的Count指标值是3 - 当“文本”字段为
B时,对应的Count指标值是2 - 当“文本”字段为
C时,对应的Count指标值是2
示例 2:二维图表(开启分组聚合)
{
"dimensions": [
{
"field_name": "文本",
"alias": "dim_5bKp"
},
{
"field_name": "单选",
"alias": "dim_5aSl"
}
],
"measures": [
{
"aggregation": "count_all",
"field_name": "Count",
"alias": "me_YW91bnR"
}
],
"main_data": [
{
"dim_5bKp": {"value": "A"},
"dim_5aSl": {"value": "a-1"},
"me_YW91bnR": {"value": 2}
},
{
"dim_5bKp": {"value": "A"},
"dim_5aSl": {"value": "a-2"},
"me_YW91bnR": {"value": 1}
},
{
"dim_5bKp": {"value": "B"},
"dim_5aSl": {"value": "b-1"},
"me_YW91bnR": {"value": 1}
},
{
"dim_5bKp": {"value": "C"},
"dim_5aSl": {"value": "c-1"},
"me_YW91bnR": {"value": 2}
}
]
}
可解读为:
- 第一维是“文本”,第二维是“单选”,指标是“按记录总数统计”
- 当“文本”字段为
A、且“单选”字段为a-1时,对应的指标值是2 - 当“文本”字段为
A、且“单选”字段为a-2时,对应的指标值是1 - 当“文本”字段为
B、且“单选”字段为b-1时,对应的指标值是1 - 当“文本”字段为
C、且“单选”字段为c-1时,对应的指标值是2 - 如果按“文本”字段汇总,那么“文本”字段为
A时总指标值是3;为B时总指标值是1;为C时总指标值是2
二、词云
结构特征
词云协议仍然沿用 dimensions + measures + main_data 的结构,但语义稍有不同:
dimensions对应被分词的字段;main_data每一行代表一个词;measure的 value 表示按该词分组后计算出来的统计值。
这类数据代表什么
词云返回的不是“原文列表”,而是按词分组后的聚合统计结果:
dimensions定义的是被分词的来源字段;measure对应的是该词在当前图表统计范围内对应的统计值,具体含义取决于聚合方式和指标字段;main_data的每一行都可以理解成“某个词 + 该词对应的统计结果”,其中该维度的具体 value 就是拆分出来的词;- 返回结果通常已经结合图表当前过滤条件、时间范围、数据权限等上下文计算完成。
因此,AI 读取词云数据时,更适合做“关键词排序”“热点词解释”“按词聚合结果分析”“主题归纳”,而不是把它当成逐条文本记录去理解。
示例
{
"dimensions": [
{
"field_name": "文本",
"alias": "dim_5bKp"
}
],
"measures": [
{
"aggregation": "count_all",
"field_name": "Count",
"alias": "me_YW91bnR"
}
],
"main_data": [
{
"dim_5bKp": {"value": "A"},
"me_YW91bnR": {"value": 3}
},
{
"dim_5bKp": {"value": "B"},
"me_YW91bnR": {"value": 2}
},
{
"dim_5bKp": {"value": "C"},
"me_YW91bnR": {"value": 2}
}
]
}
可解读为:
- 被统计的分词字段是“文本”
- 当前示例里的 measure 是
count_all(Count),所以这里的统计值可以理解为“按词分组后的记录总数” - 当分词结果为
A时,对应的统计值是3 - 当分词结果为
B时,对应的统计值是2 - 当分词结果为
C时,对应的统计值是2 - 按统计值排序,分词结果
A对应的值最高 - 分词结果
B和C的统计值相同,说明它们处于同一梯队
三、指标卡(statistics)
指标卡除了主值外,还可能包含同/环比与趋势结果,是本命令里结构最特殊的一类。
结构特征
measures:有且仅有一个指标main_data:通常只有一行,表示总指标值comparison_data:可选,表示当前周期值与对比周期值trend_data:可选,表示趋势序列dimensions:可能包含同/环比日期字段、趋势日期字段
这类数据代表什么
指标卡返回的核心是一个主指标摘要,外加可选的比较信息和趋势信息:
main_data表示当前卡片最核心、最醒目的那个主值;它通常是某个表的记录总数,或某个字段的聚合值,本身不带时间周期概念;comparison_data表示用于同/环比展示的两个数值,通常是“当前周期值”和“对比周期值”;它们表示某个时间周期下的记录总数,或某个字段的聚合值;trend_data表示这个指标在一段时间内的变化轨迹,用来支持走势判断;dimensions在指标卡里通常不是拿来做主分组展示,而是给trend_data或同/环比相关日期字段提供语义说明。
例如:
main_data = 7可以理解为当前卡片展示的主数据,比如某张表当前总记录数是7;comparison_data[0] = 6则表示某个比较周期下的当前值,比如“本月记录总数 = 6”;- 因此,
main_data与comparison_data[0]不一定相等,因为两者表达的口径并不完全相同。
因此,AI 在解读指标卡时,应该优先回答这几个问题:
- 当前主值是多少;
- 和对比周期相比是上升、下降还是持平;
- 趋势整体是增长、波动还是下滑;
- 是否存在明显的异常峰值或低谷。
Note
当指标卡同时指定同/环比和趋势时,
dimensions中日期维度的顺序是固定的:
- 第一个元素是趋势对应的日期维度;
- 第二个元素是同/环比对应的日期维度。
另外要注意:
comparison_data自身通常不直接携带日期字段,它只给出“当前周期值 / 对比周期值”。dimensions中的第一个日期维度会直接出现在trend_data中,作为趋势序列的时间列; 第二个日期维度则主要用于补充“该卡片配置了哪类比较相关日期字段”的语义。
示例
{
"dimensions": [
{
"field_name": "日期",
"alias": "dim_ZGF0ZQ"
},
{
"field_name": "日期2",
"alias": "dim_ZGF0ZTI"
}
],
"measures": [
{
"aggregation": "count_all",
"field_name": "Count",
"alias": "me_YW91b"
}
],
"main_data": [
{
"me_YW91b": {"value": 7}
}
],
"comparison_data": [
{
"me_YW91b": {"value": 6}
},
{
"me_YW91b": {"value": 0}
}
],
"trend_data": [
{
"dim_ZGF0ZQ": {"value": "2026-01-15"},
"me_YW91b": {"value": 1}
},
{
"dim_ZGF0ZQ": {"value": "2026-01-17"},
"me_YW91b": {"value": 1}
},
{
"dim_ZGF0ZQ": {"value": "2026-03-22"},
"me_YW91b": {"value": 1}
},
{
"dim_ZGF0ZQ": {"value": "2026-04-24"},
"me_YW91b": {"value": 2}
},
{
"dim_ZGF0ZQ": {"value": "2026-05-01"},
"me_YW91b": {"value": 1}
}
]
}
可解读为:
- 当前主指标值 =
7 - 当前主指标值不带时间周期概念,可理解为当前卡片主数据
- comparison_data[0] = 当前周期值
6,例如某个时间周期(如本月)下的统计值 - comparison_data[1] = 对比周期值
0 dimensions[0]对应趋势日期维度,因此实际出现在trend_data里dimensions[1]对应同/环比相关的日期维度,用来补充比较语义- trend_data 展示该指标随时间的变化序列
- 从 comparison_data 看,当前周期相较对比周期是上升的,并且对比周期值为 0
- 从 trend_data 看,这个指标并不是每天都有值,而是在若干离散日期出现
- 趋势序列里的最高点出现在
2026-04-24,值为2 - 其余出现的日期大多为
1,说明整体上有波动,但暂时没有持续快速增长的趋势
Note
comparison_data只告诉你“当前值 / 对比值”,不额外标出日期区间文本。如果用户需要完整说明“和上周比”还是“和上月比”,通常要结合组件配置或界面上下文进一步判断。
如何正确解读返回值
建议按下面顺序阅读:
- 先看
dimensions:确认每个dim_*alias 对应哪个字段; - 再看
measures:确认每个me_*alias 是什么聚合方式; - 最后读
main_data/comparison_data/trend_data:把 alias 还原成“字段名 + 指标名”再做解释。
推荐解释模板
如果要把结果转成自然语言,建议不要只“复述数值”,而应尽量覆盖下面几个层次:
- 先解释指标含义:说明 measure 代表“记录总数”“某字段求和”“平均值”等;
- 再给出核心结果:明确当前主值、主要分类、主要组合或主要词项;
- 做排序或 Top N 提炼:指出最高、最低、前几名、同一梯队;
- 补充分组/对比关系:如果有第二维或 comparison_data,就说明比较对象和差异;
- 分析趋势或异常点:如果有时间序列,指出上升、下降、波动、峰值、低谷;
- 最后给一句结论:总结最值得关注的信息。
可参考下面模板:
-
二维图表:
- 基础模板:
按 <维度字段> 统计,当前指标 <指标含义>;其中 <维度值1>=<指标值1>,<维度值2>=<指标值2> ... - 增强模板:
按 <维度字段> 统计,当前指标表示 <指标含义>。从结果看,<Top1维度值> 的值最高,为 <Top1值>;<Top2维度值> 和 <Top3维度值> 紧随其后。若按 Top N 看,前 <N> 项合计贡献了 ...;若看低值项,<低值维度值> 最低,为 <低值>。整体上,<一句总结>
- 基础模板:
-
分组聚合图表:
- 基础模板:
按 <维度1> 统计,并以 <维度2> 分组,得到 <组合1>=<值1>,<组合2>=<值2> ... - 增强模板:
当前指标表示 <指标含义>。按 <维度1> 拆分后,不同 <维度2> 组之间存在明显差异:例如 <组合1> = <值1>,<组合2> = <值2>。如果按 <维度1> 汇总,<Top1维度1值> 总值最高,为 <汇总值>;如果看组内对比,<某组> 在 <某维度1值> 下表现最强 / 最弱。整体说明 <一句总结>
- 基础模板:
-
词云:
- 基础模板:
按分词结果统计,当前指标表示 <指标含义>;其中 <词1>=<统计值1>,<词2>=<统计值2> ... - 增强模板:
当前词云反映的是“按词分组后的 <指标含义>”。从结果看,<Top1词> 的值最高,为 <值1>,说明它是当前最突出的关键词;<Top2词>、<Top3词> 处于第二梯队。如果按 Top N 看,主要关注词集中在 <主题A>、<主题B>;如果有多个词数值接近,可归为同一热点层级。整体上,这组词更适合用来总结 <主题/热点/关注点>
- 基础模板:
-
指标卡:
- 基础模板:
当前主指标值为 <main_data>;当前周期值为 <comparison_data[0]>;对比周期值为 <comparison_data[1]>;趋势上 ... - 增强模板:
当前主指标表示 <指标含义>,主值为 <main_data>。若看周期比较,当前周期值为 <comparison_data[0]>,对比周期值为 <comparison_data[1]>,因此整体表现为 <上升/下降/持平>。若看趋势序列,最高点出现在 <日期>,值为 <峰值>;最低点出现在 <日期>,值为 <低值>;整体走势表现为 <持续增长/阶段波动/明显回落>。如果需要给出结论,可总结为:<一句总结>
- 基础模板:
Tip
当用户明确要求“帮我分析”“帮我总结”“帮我找异常 / Top N / 趋势”时,优先采用增强模板,而不是只逐条复述原始数值。
常见工作流
场景 1:用户要“拿这个图表当前展示的数据”
# 如果已知 block_id,直接读结果
lark-cli base +dashboard-block-get-data \
--base-token xxx \
--block-id chtxxxxxxxx
场景 2:用户说“帮我分析这个图表”,但你还不知道它是什么组件
# 先看组件配置,确认它是不是支持计算的图表类型
lark-cli base +dashboard-block-get \
--base-token xxx \
--dashboard-id blk_xxx \
--block-id chtxxxxxxxx
# 再读最终计算结果
lark-cli base +dashboard-block-get-data \
--base-token xxx \
--block-id chtxxxxxxxx
场景 3:用户要找“仪表盘里哪个图的结果异常”
# 先列组件
lark-cli base +dashboard-block-list \
--base-token xxx \
--dashboard-id blk_xxx
# 再针对可疑 block 逐个取结果
lark-cli base +dashboard-block-get-data \
--base-token xxx \
--block-id chtxxxxxxxx
何时优先用这个命令
- 用户说“帮我拿这个图表算出来的数据 / 结果 / 指标”
- 用户已经知道
block_id,目标是读取结果而不是看配置 - 用户后续还要让 AI 对图表结果做解释、归纳、比较、总结
- 你只关心图表层的聚合产出,不需要回到底表逐条读记录
何时不要误用
- 想看 block 的
data_config、名称、类型、布局 → 用+dashboard-block-get - 想列出仪表盘里有哪些组件 → 用
+dashboard-block-list - 想修改或新建组件 → 用
+dashboard-block-update/+dashboard-block-create - 想看原始记录明细,而不是图表聚合结果 → 回到
record-* - 目标是文本组件 → 本命令不适用
常见误区
误区 1:把这个命令当成“获取 block 详情”
不是。这个命令不返回:
- block 名称
- block 类型
- layout
data_config- 所属 dashboard 信息
这些都应该通过 +dashboard-block-get 获取。
误区 2:以为它返回的是原始记录
不是。它返回的是图表聚合后的最终结果。如果图表本身做了过滤、分组、聚合、时间窗口限制,返回值反映的是图表视角,不是原始表全量明细。
误区 3:直接把 alias 当真实字段名读
不应该。alias 只是协议里的键,必须结合 dimensions / measures 还原语义。
误区 4:看到指标卡的 comparison_data 就以为已经知道“同比/环比周期文本”
不一定。它只给出比较值,不一定给出周期标签。若要精确解释比较窗口,通常还需要组件配置或 UI 上下文。
dry-run 用途
可用来确认最终会调用的接口路径:
lark-cli base +dashboard-block-get-data \
--base-token bascn_example_token \
--block-id chtxxxxxxxx \
--dry-run \
--format pretty
你应能看到类似:
GET /open-apis/base/v3/bases/bascn_example_token/dashboards/blocks/chtxxxxxxxx/data
适合在以下场景使用:
- 校验
base_token/block_id是否传对; - 调试 agent 生成的命令;
- 编写自动化测试时确认请求结构。
参考
- lark-base-dashboard.md — dashboard 模块总指引
+dashboard-block-get— 获取 block 元数据- dashboard-block-data-config.md — data_config 结构和组件类型说明