跳转到内容

查询 · crm-basic

本页 16 个用例共用基础项目 crm-basic@1.xh (下载后导入星汉即可查看初始数据)。每个用例的执行完全独立:各自导入 全新项目、各自开新会话;标了步骤数的用例是多步 —— 多步在同一会话里连续 执行,考连续作业。

L1-active-count · L1 | 单条件计数——服务端算而非翻表

题面

「客户」表里状态是「跟进中」的客户有几家?

验收

# "5" 这种单字符期望依赖 ANSWER 行的抽取纪律(全文退回时可能被金额里的 5
# 误救活 —— 误过削弱区分度但不产生假红,方向可接受)
- type: answer_text
expectContains: ["5"]
- type: trajectory
maxToolCalls: 3
forbidTools: [run_sandbox]

复现:

Terminal window
pnpm --dir packages/agent-eval eval --only L1-active-count

L1-count-rows · L1 | 全表行数——用元信息/聚合,不翻页

题面

「客户」表一共有多少条记录?

验收

# 行数在 profile_table 一次就给全 —— 上限 2 = list_tables + profile_table。
# 期望值写死 7:fixture 决定性生成 + dataset 版本钉住,数据一变必须升版本。
- type: answer_text
expectContains: ["7"]
- type: trajectory
maxToolCalls: 2
forbidTools: [run_sandbox]

复现:

Terminal window
pnpm --dir packages/agent-eval eval --only L1-count-rows

L1-describe-fields · L1 | 读 schema(字段名+类型)

题面

「客户」表有哪些字段?分别是什么类型?

验收

- type: trajectory
maxToolCalls: 3
forbidTools: [run_sandbox]

复现:

Terminal window
pnpm --dir packages/agent-eval eval --only L1-describe-fields

L1-earliest-follow · L1 | 最值查询——排序/聚合而非翻表

题面

「客户」表里「下次跟进」日期最早的客户是哪家?

验收

# 最早 = 平移后的 -30 天那条。没填日期的不该被当成"最早"(空值边界)
- type: answer_text
expectContains: ["远山科技"]
# 上限 4:三模型对照实测,上限 3 会把"合理地多看一步"也判死(pro/flash 偶挂,
# sonnet 全过)——意图是"别翻表拿最值",4 依然罩得住
- type: trajectory
maxToolCalls: 4
forbidTools: [run_sandbox]

复现:

Terminal window
pnpm --dir packages/agent-eval eval --only L1-earliest-follow

L1-empty-date · L1 | 空值筛选(isEmpty 语义)

题面

「客户」表里,哪些客户没有填「下次跟进」日期?请列出 recordId。

验收

# 考空值语义:「没填日期」是 isNull,不是 = ''。fixture 里那条无日期的记录
# 是刻意造的(写空串会存成"有值但为空",筛选语义不同)
- type: answer_records
query:
table: 客户
filters:
- { field: 下次跟进, op: isNull }
minPrecision: 1.0
minRecall: 1.0
- type: trajectory
maxToolCalls: 4
forbidTools: [run_sandbox]

复现:

Terminal window
pnpm --dir packages/agent-eval eval --only L1-empty-date

L1-find-owner · L1 | 单行定位+多字段读取

题面

「客户」表里,远山科技的负责人是谁?合同金额是多少?

验收

# 金额匹配靠 grader 的归一化(去逗号):模型写 120,000 或 120000 都算对 ——
# 千分位是格式偏好,不是数据能力
- type: answer_text
expectContains: ["张伟", "120000"]
- type: trajectory
maxToolCalls: 3
forbidTools: [run_sandbox]

复现:

Terminal window
pnpm --dir packages/agent-eval eval --only L1-find-owner

L1-list-tables · L1 | 项目结构感知

题面

这个项目里有哪些表?

验收

# L1 最基本的一条:找得到表,而且别绕远路(用 list_tables 而不是跑代码)。
- type: trajectory
maxToolCalls: 3
forbidTools: [run_sandbox]

复现:

Terminal window
pnpm --dir packages/agent-eval eval --only L1-list-tables

L1-max-amount · L1 | 数值最值+关联信息读取

题面

「客户」表里合同金额最高的客户是哪家?

验收

- type: answer_text
expectContains: ["云途物流"]
- type: trajectory
maxToolCalls: 3
forbidTools: [run_sandbox]

复现:

Terminal window
pnpm --dir packages/agent-eval eval --only L1-max-amount

L1-owner-names · L1 | 去重取值集(值分布/聚合)

题面

「客户」表里的负责人都有谁?(列出所有不重复的负责人名字)

验收

- type: answer_text
expectContains: ["张伟", "李娜", "王强"]
- type: trajectory
maxToolCalls: 3
forbidTools: [run_sandbox]

复现:

Terminal window
pnpm --dir packages/agent-eval eval --only L1-owner-names

L1-profile-table · L1 | 表画像——schema+行数+值分布组合

题面

简单介绍一下「客户」表:有哪些字段、一共多少行、状态字段的取值分布如何?

验收

# 这条考的是**一次调用看懂一张表**。没有 profile_table 的话,同样的问题要
# list_tables + describe_table + 查行数 + 查分布,四五次往返;每多一次往返就多
# 一次延迟、多一份上下文占用,而这些信息本来可以一次给全。
# 上限设 2 = list_tables + profile_table。
- type: trajectory
maxToolCalls: 2
forbidTools: [run_sandbox]

复现:

Terminal window
pnpm --dir packages/agent-eval eval --only L1-profile-table

L1-select-options · L1 | 读字段配置(选项清单)

题面

「客户」表的「状态」字段有哪些可选项?

验收

# schema 问题一次 describe/profile 就该答全
- type: answer_text
expectContains: ["跟进中", "已成交", "已流失"]
- type: trajectory
maxToolCalls: 2
forbidTools: [run_sandbox]

复现:

Terminal window
pnpm --dir packages/agent-eval eval --only L1-select-options

L2-active-overdue · L2 | 状态+日期双条件($today 边界)

题面

「客户」表里,状态还是「跟进中」、但「下次跟进」日期已经过期的客户有哪些?请列出 recordId。

验收

# 组合筛选:状态(单选按 optionId)+ 日期(相对今天)。无日期那条状态是已流失,
# 天然不进真值集
- type: answer_records
query:
table: 客户
filters:
- { field: 状态, op: "=", value: opt_active }
- { field: 下次跟进, op: "<", value: "$today" }
minPrecision: 1.0
minRecall: 1.0
- type: trajectory
mustUseFilter: true
maxToolCalls: 4

复现:

Terminal window
pnpm --dir packages/agent-eval eval --only L2-active-overdue

L2-overdue-followup · L2 | 日期比较筛选(早于今天)

题面

「客户」表里,哪些客户的「下次跟进」日期已经过期(早于今天)?请列出它们的 recordId。

验收

# 真值由引擎直查:下次跟进 < 今天。没填日期那条不该被算进来 ——
# 引擎的 `<` 对空值不成立,所以真值集天然排除它,正好考这个边界。
- type: answer_records
query:
table: 客户
filters:
- { field: 下次跟进, op: "<", value: "$today" }
minPrecision: 1.0
minRecall: 1.0
# 答案对不代表路子对:是下推 filter 还是把整表拉回来自己筛,这里分开看。
# 这条正是 D1 查询下推要翻转的那一格。
- type: trajectory
mustUseFilter: true
maxToolCalls: 4

复现:

Terminal window
pnpm --dir packages/agent-eval eval --only L2-overdue-followup

L2-owner-amount-crm · L2 | 条件聚合求和

题面

「客户」表里,张伟名下客户的合同金额合计是多少?

验收

# 7 行的小表**不强制聚合下推**:模型看了行数选择直接拉回来加并没有错
# (L2-sum-by-owner 的教训 —— 在小表上逼聚合考的是守规矩,不是做对)
- type: answer_text
expectContains: ["128000"]
- type: trajectory
maxToolCalls: 4
forbidTools: [run_sandbox]

复现:

Terminal window
pnpm --dir packages/agent-eval eval --only L2-owner-amount-crm

L2-status-filter · L2 | 单条件筛选记录集(precision/recall 双向扣分)

题面

「客户」表里状态是「已成交」的有哪些?请列出 recordId。

验收

# 单选字段存的是 option id,真值查询也按 id 比 —— 用例里写 opt_won 而不是「已成交」,
# 是因为真值这一半不经过 agent,它要直接对上引擎里的存储形态。
- type: answer_records
query:
table: 客户
filters:
- { field: 状态, op: "=", value: opt_won }
minPrecision: 1.0
minRecall: 1.0
- type: trajectory
mustUseFilter: true
maxToolCalls: 4

复现:

Terminal window
pnpm --dir packages/agent-eval eval --only L2-status-filter

L2-upcoming-week · L2 | 日期闭区间筛选(已知全行业弱点)

题面

「客户」表里,从今天起 7 天内(含今天和第 7 天)需要跟进的客户有哪些?请列出 recordId。

验收

# 日期区间筛选 —— 真值两端都用占位符,任何一天跑答案都稳定
- type: answer_records
query:
table: 客户
filters:
- { field: 下次跟进, op: ">=", value: "$today" }
- { field: 下次跟进, op: "<=", value: "$today+7d" }
minPrecision: 1.0
minRecall: 1.0
- type: trajectory
mustUseFilter: true
maxToolCalls: 4

复现:

Terminal window
pnpm --dir packages/agent-eval eval --only L2-upcoming-week