Files
zk-data-agent/skills/data-factory-sql/SKILL.md
T

246 lines
7.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
name: data-factory-sql
description: 通过小米数据工场 Kyuubi HTTP API 执行 SQL 查询,轮询状态并下载 CSV 结果。适合用户直接给 SQL、要求“跑个 SQL”“数据工场查一下”“查数据”,或基于表结构/字段说明生成 SQL 草稿后执行。
when_to_use: 用户希望在小米数据工场执行 SQL、查询 Hive/Presto/Spark/Doris/Hologres 数据、下载查询结果 CSV、或基于数据工场结果做进一步分析时使用。
aliases: data-factory, kyuubi-sql, sql-query, 数据工场, 跑SQL
allowed_tools: python_exec, python_package, read_file, write_file, ask_user_question
---
# Data Factory SQL Skill
使用这个 skill 作为“小米数据工场 SQL 查询”的统一入口。它通过 Kyuubi HTTP API 提交 SQL、轮询状态、拉取结果并保存 CSV,不依赖浏览器。
本 skill 已安装在项目目录:
```text
skills/data-factory-sql/
```
## 关键文件
| 文件 | 用途 |
|------|------|
| `run_sql.py` | CLI 入口,提交 SQL 并输出 JSON 摘要 |
| `kyuubi_client.py` | Kyuubi HTTP API client |
| `README.md` | 原始说明和安装/token 配置说明 |
## 在本数据 Agent 中使用
不要用 `bash` 执行 `python run_sql.py`,也不要用系统 `pip` 安装依赖。
执行 SQL 必须使用 `python_exec`
```json
{
"script_path": "skills/data-factory-sql/run_sql.py",
"args": ["SELECT 1 AS id, 'hello' AS msg"],
"timeout_seconds": 700,
"max_output_chars": 20000
}
```
如果 `python_exec` 返回缺少 `requests`,先用 `python_package` 安装:
```json
{
"action": "install",
"packages": ["requests"],
"timeout_seconds": 120
}
```
多行 SQL 或复杂 SQL 不要通过命令行字符串硬塞。优先把 SQL 写到当前会话 scratchpad 或用户指定的任务目录,再用 `-f` 执行:
```json
{
"script_path": "skills/data-factory-sql/run_sql.py",
"args": ["-f", "<sql_file>", "--engine", "auto"],
"timeout_seconds": 700,
"max_output_chars": 20000
}
```
## Token 配置
脚本按以下顺序读取 token
1. `--token <value>`
2. 环境变量 `KYUUBI_TOKEN`
3. `C:\workspace\data-factory-token.txt`
4. `~/.config/data-factory/token`
不要把 token 写入项目仓库。推荐让用户在运行环境里配置 `KYUUBI_TOKEN`,或写到用户 home 下的默认 token 文件。
Token 申请入口:
```text
https://data.mioffice.cn/workspace/?wid=<YOUR_WORKSPACE_ID>#/workspace/<YOUR_WORKSPACE_ID>/config?tab=tokenList
```
注意:token 与服务地址必须同集群。本 skill 默认 `cnbj1`,如果用户使用其他集群,需要显式传 `--cluster cnbj2``--cluster alsgp0` 等。
## 默认配置
| 项 | 默认值 |
|----|------|
| 集群 | `cnbj1` |
| Base URL | `http://proxy-service-http-cnbj1-dp.api.xiaomi.net` |
| 引擎 | `auto` |
| 输出 | `~/Downloads/data_factory_<时间戳>.csv` |
| 轮询间隔 | 2.0s |
| 查询超时 | 600s |
## 两种工作模式
### 模式 A:用户直接给 SQL
用户提供完整 SQL 时,可以在做基础风险检查后直接执行。
执行前必须检查:
- 是否明显是查询语句,而不是危险写操作。
- 大表查询是否带 `dt`、日期、分区或合理 limit。
- 用户是否显式指定了 `catalog.schema.table`、引擎、集群或输出路径。
如果 SQL 看起来会全表扫、跨天扫很多数据,或存在写入/删除/建表等副作用,不要直接执行,先向用户确认。
### 模式 B:自然语言需求 + 表结构/知识文档
用户没有给完整 SQL,而是给自然语言需求、表结构、字段说明或业务文档时:
1. 先读取用户提供的文档或表结构。
2. 生成 SQL 草稿。
3. 向用户展示 SQL 草稿并等待确认。
4. 用户确认后再执行。
5. 读取 CSV 结果并分析,必要时迭代 SQL。
不要跳过第 3 步。自然语言生成的 SQL 必须先给用户 review。
## 标准执行流程
1. 判断是“直接 SQL”还是“自然语言生成 SQL”。
2. 如果需要读取表结构或知识文档,先用 `read_file`
3. 检查 SQL 风险:分区、时间范围、limit、副作用、catalog/schema/table 是否被擅自改动。
4. 需要确认时,展示 SQL 并停止等待用户确认。
5. 确认后调用 `python_exec` 执行 `skills/data-factory-sql/run_sql.py`
6. 解析 stdout 最后一行 JSON 摘要。
7. 如果 JSON 有 `error`,把错误直接告诉用户,不要盲目重试。
8. 如果 `rows == 0`,提示空结果,不要编造数据。
9. 如果有 `output`,用 `read_file` 读取 CSV 或根据行数选择采样分析。
10. 用具体数值回答用户问题,并说明结果文件路径。
## 常用参数
### 直接执行 SQL
```json
{
"script_path": "skills/data-factory-sql/run_sql.py",
"args": ["SELECT 1"],
"timeout_seconds": 700,
"max_output_chars": 20000
}
```
### 从文件读取 SQL
```json
{
"script_path": "skills/data-factory-sql/run_sql.py",
"args": ["-f", "/path/to/query.sql"],
"timeout_seconds": 700,
"max_output_chars": 20000
}
```
### 指定引擎
```json
{
"script_path": "skills/data-factory-sql/run_sql.py",
"args": ["-f", "/path/to/query.sql", "--engine", "spark"],
"timeout_seconds": 700,
"max_output_chars": 20000
}
```
### 指定输出路径
输出路径优先写到当前用户当前会话 output 目录,或用户明确指定的任务目录。不要写项目根目录。
```json
{
"script_path": "skills/data-factory-sql/run_sql.py",
"args": ["-f", "/path/to/query.sql", "--output", "/path/to/output/result.csv"],
"timeout_seconds": 700,
"max_output_chars": 20000
}
```
### 调试配置
```json
{
"script_path": "skills/data-factory-sql/run_sql.py",
"args": ["--print-config"],
"timeout_seconds": 60,
"max_output_chars": 12000
}
```
## 输出 JSON
成功时 stdout 最后一行是 JSON
```json
{
"queryId": "...",
"engine": "TRINO",
"rows": 1,
"cols": 2,
"elapsed_ms": 5210,
"columns": [{"name": "id", "type": "BIGINT"}],
"output": "/path/to/data_factory_20260427_150120.csv"
}
```
失败时会输出:
```json
{"error": "..."}
```
退出码:
- `2`:输入问题,例如空 SQL。
- `3`:认证问题,例如 token 失效。
- `4`:SQL 执行错误,例如语法、权限、超时。
- `5`:其他 Kyuubi 错误。
## 红线
禁止:
- 在自然语言生成 SQL 后跳过用户确认直接执行。
- 在 SQL 失败后不读 `error` 信息盲目重试。
- 大表查询没有 `dt`、日期范围、分区过滤或合理 limit 就直接执行。
- 擅自修改用户 SQL 里的 `catalog/schema/table` 名。
- 把 token、CSV 输出或临时 SQL 文件写进项目源码目录。
- 使用 `bash` 执行 Python 或安装依赖。
必须:
- 使用 `python_exec` 执行脚本。
- 缺依赖时使用 `python_package` 安装到当前用户独立 venv。
- 多行 SQL 优先走 `-f` 文件。
- 解析 stdout 最后一行 JSON 决定下一步。
- 大结果集先汇报行数和文件路径,再决定全量分析或采样。
## 已知约束
- 状态机是 `PENDING / RUNNING / FINISHED / ERROR / TIMEOUT / CLOSED`
- `progress 100%` 不代表完成,必须等 `state == FINISHED`
- `nextQueryId` 每次轮询都会更新,client 已自动处理。
- 查询 ID 中的 `/``;``:` 等特殊字符,client 已自动 URL 编码。
- token 与服务地址必须同集群,否则可能报“找不到元信息”。