从CRM数据生成交互式分析仪表板。当被要求「展示管道统计」、「创建报告」、「分析潜在客户」、「展示转化率」时使用。
管道分析 – NL – SQL – 交互式图表是一项面向实际任务的技能,主要用于将自然语言问题转换成 DuckDB 查询, 并将结果作为交互式 Recharts 仪表板在聊天中内置;Workflow.;
该技能适合需要稳定复用相关能力的场景,可作为自动化工作流的一部分,也便于后续检查、调整和扩展。从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;
若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。
将自然语言问题转换为 DuckDB 查询,并在聊天界面中以内联方式渲染为交互式的 Recharts 仪表板。
用户以普通英文提出问题 → 针对工作区透视视图(v_*)翻译为 DuckDB SQL → 执行查询 → 将结果格式化为 report-json → 渲染为交互式 Recharts 组件
-- 列出所有对象及其条目数量 SELECT o.name, o.display_name, COUNT(e.id) as entries FROM objects o LEFT JOIN entries e ON e.object_id = o.id GROUP BY o.name, o.display_name ORDER BY entries DESC; -- 列出某对象的字段 SELECT f.name, f.field_type, f.display_name FROM fields f JOIN objects o ON f.object_id = o.id WHERE o.name = 'leads' ORDER BY f.position; -- 可用的透视视图 SELECT table_name FROM information_schema.tables WHERE table_name LIKE 'v_%';
SELECT "Status", COUNT(*) as count FROM v_leads GROUP BY "Status" ORDER BY CASE "Status" WHEN 'New' THEN 1 WHEN 'Contacted' THEN 2 WHEN 'Qualified' THEN 3 WHEN 'Demo Scheduled' THEN 4 WHEN 'Proposal' THEN 5 WHEN 'Closed Won' THEN 6 WHEN 'Closed Lost' THEN 7 ELSE 99 END;
SELECT DATE_TRUNC('week', "Last Outreach"::DATE) as week,
"Outreach Channel",
COUNT(*) as messages_sent
FROM v_leads
WHERE "Last Outreach" IS NOT NULL
GROUP BY week, "Outreach Channel"
ORDER BY week;
SELECT "Source",
COUNT(*) as total,
COUNT(*) FILTER (WHERE "Status" = 'Qualified') as qualified,
COUNT(*) FILTER (WHERE "Status" IN ('Closed Won', 'Converted')) as converted,
ROUND(100.0 * COUNT(*) FILTER (WHERE "Status" = 'Qualified') / COUNT(*), 1) as qual_rate,
ROUND(100.0 * COUNT(*) FILTER (WHERE "Status" IN ('Closed Won', 'Converted')) / COUNT(*), 1) as conv_rate
FROM v_leads
GROUP BY "Source"
ORDER BY total DESC;
SELECT "Outreach Channel",
COUNT(*) as sent,
COUNT(*) FILTER (WHERE "Reply Received" = true) as replied,
ROUND(100.0 * COUNT(*) FILTER (WHERE "Reply Received" = true) / COUNT(*), 1) as reply_rate
FROM v_leads
WHERE "Outreach Status" IS NOT NULL
GROUP BY "Outreach Channel";
SELECT "Source",
AVG(DATEDIFF('day', created_at, "Converted At"::DATE)) as avg_days_to_convert,
MEDIAN(DATEDIFF('day', created_at, "Converted At"::DATE)) as median_days
FROM v_leads
WHERE "Status" = 'Converted' AND "Converted At" IS NOT NULL
GROUP BY "Source";
生成兼容 Recharts 的报表卡片:
{
"type": "report",
"title": "Pipeline Analytics — February 2026",
"generated_at": "2026-02-17T14:30:00Z",
"panels": [
{
"title": "Pipeline Funnel",
"type": "funnel",
"data": [
{"name": "New Leads", "value": 200},
{"name": "Contacted", "value": 145},
{"name": "Qualified", "value": 67},
{"name": "Demo Scheduled", "value": 31},
{"name": "Closed Won", "value": 13}
]
},
{
"title": "Outreach Activity",
"type": "area",
"xKey": "week",
"series": [
{"key": "linkedin", "name": "LinkedIn", "color": "#0A66C2"},
{"key": "email", "name": "Email", "color": "#EA4335"}
],
"data": [
{"week": "Feb 3", "linkedin": 25, "email": 40},
{"week": "Feb 10", "linkedin": 30, "email": 35}
]
},
{
"title": "Lead Source Breakdown",
"type": "donut",
"data": [
{"name": "LinkedIn Scrape", "value": 95, "color": "#0A66C2"},
{"name": "YC Directory", "value": 45, "color": "#FF6600"},
{"name": "Referral", "value": 30, "color": "#10B981"},
{"name": "Inbound", "value": 20, "color": "#8B5CF6"}
]
},
{
"title": "Reply Rates by Channel",
"type": "bar",
"xKey": "channel",
"series": [{"key": "rate", "name": "Reply Rate %", "color": "#3B82F6"}],
"data": [
{"channel": "LinkedIn", "rate": 32},
{"channel": "Email", "rate": 18},
{"channel": "Multi-Channel", "rate": 41}
]
}
]
}
| 类型 | 适用场景 | Recharts 组件 |
|---|---|---|
bar |
对比、分类 | BarChart |
line |
随时间变化的趋势 | LineChart |
area |
随时间变化的总量 | AreaChart |
pie |
分布(单层) | PieChart |
donut |
分布(含中心指标) | PieChart(innerRadius) |
funnel |
阶段推进过程 | FunnelChart |
scatter |
相关性(双变量) | ScatterChart |
radar |
多维度对比 | RadarChart |
| 用户表述 | SQL 模式 | 图表类型 |
|---|---|---|
| "show me pipeline" | GROUP BY Status | funnel |
| "outreach stats" | COUNT by channel + status | bar + area |
| "how are we converting" | conversion rates | funnel + line |
| "compare sources" | GROUP BY Source | bar |
| "weekly trend" | DATE_TRUNC + GROUP BY | line / area |
| "who replied" | FILTER Reply Received | table |
| "best performing" | ORDER BY conversion DESC | bar |
| "lead breakdown" | GROUP BY any dimension | pie / donut |
报表可作为 .report.json 文件保存至工作区:
~/.openclaw/workspace/reports/ pipeline-overview.report.json weekly-outreach.report.json monthly-review.report.json
这些文件在 Ironclaw Web UI 中打开时,将渲染为实时仪表板。
自动按周/月生成报表:
{
"name": "Weekly Pipeline Report",
"schedule": { "kind": "cron", "expr": "0 9 * * MON", "tz": "America/Denver" },
"payload": {
"kind": "agentTurn",
"message": "Generate weekly pipeline analytics report. Query DuckDB for this week's data. Create report-json with: funnel, outreach activity (area), reply rates (bar), source breakdown (donut). Save to workspace/reports/ and announce summary."
}
}