观远BI Skill

v3.0.0

使用观远BI来进行数据获取与数据分析。触发词:查数据、做图表、看报表、营业额、门店、会员、订单,分析

0· 35·0 current·0 all-time

Install

OpenClaw Prompt Flow

Install with OpenClaw

Best for remote or guided setup. Copy the exact prompt, then paste it into OpenClaw for zhengyuhe123/guandata-bi.

Previewing Install & Setup.
Prompt PreviewInstall & Setup
Install the skill "观远BI Skill" (zhengyuhe123/guandata-bi) from ClawHub.
Skill page: https://clawhub.ai/zhengyuhe123/guandata-bi
Keep the work scoped to this skill only.
After install, inspect the skill metadata and help me finish setup.
Use only the metadata you can verify from ClawHub; do not invent missing requirements.
Ask before making any broader environment changes.

Command Line

CLI Commands

Use the direct CLI path if you want to install manually and keep every step visible.

OpenClaw CLI

Bare skill slug

openclaw skills install guandata-bi

ClawHub CLI

Package manager switcher

npx clawhub@latest install guandata-bi
Security Scan
VirusTotalVirusTotal
Benign
View report →
OpenClawOpenClaw
Benign
medium confidence
Purpose & Capability
The name/description (观远BI data fetching & analysis) matches the included Python CLI (scripts/guandata.py) and ZoneData helper modules. Required credentials and base_url are stored in config.json (example provided), which is expected for a self-hosted BI API client. No unrelated cloud/third-party credentials or binaries are requested.
Instruction Scope
SKILL.md instructs the agent to run the included CLI commands, read/write local cache (.cache) and edit config.json for credentials—these are within the skill's domain. It also mandates running 'cat skills/guandata/分析经验.md' before analysis, but that file is not present in the package; this mismatch should be resolved. The instructions avoid sending data to external endpoints except the configured base_url (your BI server).
Install Mechanism
No install spec or remote downloads are present; this is an instruction-and-code-only skill. The only external dependency noted is httpx (pip install httpx), which is reasonable for an HTTP client. No archive downloads or obscure remote URLs are used.
Credentials
No environment variables are requested. The skill expects credentials to be placed in skills/guandata/config.json (plaintext). That is proportionate to a CLI that logs into a BI server, but storing secrets in plaintext within the skill folder increases risk—especially if the skill directory is checked into a repo or shared. Consider using a secrets manager or restricting file permissions.
Persistence & Privilege
The skill writes cache files under skills/guandata/.cache/ and expects/uses a local config.json. It does not request permanent 'always' inclusion and does not modify other skills. Persisted files (caches, config) are normal for this tool, but you should be aware they contain query results and credentials.
Assessment
This skill is a self-contained CLI client for your 观远BI server and looks consistent with that purpose, but take these precautions before installing or using it: - Do not commit skills/guandata/config.json to any public repository; it contains plaintext credentials in the example path. Prefer environment variables or a secrets manager if possible. - Inspect the full scripts/guandata.py file (the CLI) to confirm all network calls are only to your BI base_url and there are no unexpected outbound endpoints or webhook URLs. The SKILL.md and code indicate only communication with the configured base_url, but verify the remainder of the truncated code if you have it. - The SKILL.md requires reading skills/guandata/分析经验.md before each run, but that file is not included—ask the publisher for the missing guidance or remove this mandatory step to avoid surprises. - Restrict filesystem permissions for the skill folder so only intended users/processes can read config.json and .cache/. If you run this on a shared machine or CI, use a limited BI account with least privileges for testing. - Test with a non-production BI account first and observe network traffic (or run in a sandboxed environment) to ensure data is only sent to your BI server. If you want higher assurance, ask the publisher for the missing '分析经验.md', a threat model or code review, and confirm there are no automatic outbound notification mechanisms (cron/webhook/email) enabled by default.

Like a lobster shell, security has layers — review code before you run it.

latestvk97frdcwvg4z9ep2pa06qk9wcx85nga1
35downloads
0stars
3versions
Updated 10h ago
v3.0.0
MIT-0

观远BI

🔴 操作前必读(不可跳过)

⚠️ 关键规则

所有数值计算必须跑代码 — 禁止在思考中直接口算百分比、环比、除法等。

  1. 必须提供 pg_id — 不保存的卡片无法取数据
  2. 先查页面权限 — 用 list-pages --manageable 找有权限的页面,不用翻 JSON
  3. 筛选值按需查 — 只有用了分类筛选(IN/EQ/CONTAINS)才需要 search-values;纯日期范围(BT)不需要
  4. 图表类型限制 — 超出 metric/row/column 上限会返回空数据
  5. 必须确认数据范围 — 用户没有明确指定日期范围时,必须追问,不要自己假设。例如:"你想看哪段时间的数据?" 或提供选项:"要看今天、本周还是上月?"

每次做分析前,第一步永远是:

cat skills/guandata/分析经验.md

这不是建议,是硬性步骤。跳过 = 重复踩坑。规则都在里面,包括:

  • 数据表选择(哪张表对应什么场景)
  • 字段陷阱
  • 报告规范
  • 计算红线(加权平均、禁止口算)
  • 待处理的bug

遇到意外的错误以及得到新的教训立即更新: 遇到意外的错误以及得到新的教训,当场写入 分析经验.md 的「待确认」区域(第四章),格式:

### 7.N [YYYY-MM-DD] 简要标题
- **场景**: 什么情况下遇到的
- **问题**: 发生了什么
- **我的判断**: 我认为应该怎么做

如果配置了 cron,待确认项可以自动发送给用户确认。

基本信息

  • 配置文件: skills/guandata/config.json含明文凭据,请勿提交到公开仓库
  • 脚本: skills/guandata/scripts/guandata.py

运行环境

  • Python 3.8+
  • 依赖库: httpxpip install httpx
  • 凭据存储在 config.json 中(明文),仅供本地使用,切勿提交到公开仓库

配置说明

编辑 config.json

{
  "version": "6",
  "base_url": "https://your-guandata-instance.com:port",
  "domain": "your_domain",
  "login_id": "your_username",
  "password": "your_password",
  "default_pg_id": "your_default_page_id",
  "default_folder_id": "your_default_folder_id"
}
字段必填说明
version观远BI版本:"6""7"<br>"6":观远BI 6.x,直接保存卡片<br>"7":观远BI 7.0+,使用 draft/release 机制(创建卡片后自动发布页面)
base_url观远BI服务器地址,如 https://bi.company.com:8080
domain登录域,通常为 guanbi,具体咨询你们的BI管理员
login_id观远BI登录账号
password观远BI登录密码
default_pg_id默认页面ID。不传时,create-and-get 需手动指定 pg_id;传入后可省略
default_folder_id默认文件夹ID。创建新页面时的存放位置

如何获取 pg_id / folder_id

  1. 在观远BI网页打开目标页面,URL 中的 pgId=xxx 即为页面ID
  2. 文件夹ID在观远BI「数据管理」→「目录」中查看

核心命令

SCRIPT="python3 skills/guandata/scripts/guandata.py"

# 查数据集(默认读本地缓存)
$SCRIPT list-datasets
$SCRIPT list-datasets --columns   # 同时显示每个数据集的字段
$SCRIPT list-datasets --refresh   # 强制刷新缓存(数据源有变更时用)

# 查字段(默认读本地缓存,自动包含计算字段)
$SCRIPT get-columns <ds_id>             # 输出原始字段 + 计算字段
$SCRIPT get-columns <ds_id> --refresh   # 强制刷新缓存
$SCRIPT get-columns <ds_id> --with-calc # 同时显示计算字段(公式字段)

# 查枚举值(筛选前必查,避免值不存在)
# fd_id 从 get-columns 输出第二列拿
$SCRIPT search-values <ds_id> <fd_id> --search "关键词"
$SCRIPT search-values <ds_id> --name "门店名称" --search "某门店"  # 用字段名代替 fd_id

# 建卡+取数(一步到位)
$SCRIPT create-and-get '{"name":"卡片名","ds_id":"数据集ID","chart_type":"SINGLE_VALUE","pg_id":"页面ID","metric":[{"name":"会员id","aggr":"CNT_DISTINCT"}],"filters":[{"name":"营业日期","op":"BT","value":["2026-02-01","2026-02-28"]}]}'
$SCRIPT create-and-get '{...}' --limit 200   # 限制返回200行数据(默认500行上限)

# 建卡+取数(组合图,metric_additional 传折线叠加数据)
$SCRIPT create-and-get '{"name":"达成率趋势","ds_id":"数据集ID","chart_type":"STACKED_COLUMN_WITH_LINE","pg_id":"页面ID","metric":[{"name":"营业额","aggr":"SUM"}],"metric_additional":[{"name":"人数","aggr":"SUM"}],"row":["营业日期(月)"],"column":["销售类型"],"filters":[...]}'

# 仅建卡(不取数)
$SCRIPT create-card '{...}'

# 取卡片数据(含筛选条件)
$SCRIPT get-card-data <card_id>

# 列页面
$SCRIPT list-pages
$SCRIPT list-pages --manageable  # 只显示有编辑权限的页面(日常用这个)

# 注意:list-datasets 默认显示父文件夹ID
# 输出格式示例:
#   数据集名称
#     ID: 数据集ID  |  行数  列数  |  状态
#     父文件夹ID: 父文件夹ID
#     描述: 描述信息
#     路径: 目录路径

# 创建页面
$SCRIPT create-page "页面名称"
$SCRIPT create-page "页面名称" --parent-dir "目录ID" --desc "描述"

# 获取页面卡片列表
$SCRIPT get-page-cards <pg_id>

# 批量删除卡片(需要 pg_id)
$SCRIPT delete-cards <pg_id> <card_id1> <card_id2> ...

💾 数据缓存机制

create-and-getget-card-data 命令都会自动将数据保存到本地 CSV 缓存文件。

输出末尾会显示缓存路径:📁 缓存: skills/guandata/.cache/data/xxx.csv

缓存目录结构

skills/guandata/.cache/
├── data/                   # 数据查询缓存(CSV),默认共享目录
├── datasets/               # 数据集列表缓存(JSON)
├── columns/                # 字段列表缓存(JSON)
└── tasks/                  # 按任务隔离的缓存(使用 --task 参数时)
    └── {task_name}/
        ├── data/
        ├── datasets/
        └── columns/

按任务隔离缓存(--task)

不同任务的缓存混在一起时,用 --task 参数按任务名分组。--task 放在子命令前面:

# 堂食分析任务 → skills/guandata/.cache/tasks/堂食分析/data/
$SCRIPT --task "品类分析" create-and-get '{"name":"品类","ds_id":"<dataset_id>",...}'

# 查字段也隔离
$SCRIPT --task "会员分析" get-columns <dataset_id>

不加 --task 时,缓存仍在默认的 .cache/data/ 共享目录。

缓存清理

当缓存占用过多空间或数据过期时,需要清理缓存:

# 清理所有数据查询缓存(保留最近7天)
find skills/guandata/.cache/data -name "*.csv" -mtime +7 -delete

# 清理所有缓存(彻底清空)
rm -rf skills/guandata/.cache/*



### 缓存文件格式

CSV,首行为表头,后续行为数据。用 Excel / pandas / csv 模块直接读即可。

### 大模型使用规范

**当拿到取数结果后,必须用缓存文件处理数据,不要把大量数据塞进上下文。**

正确做法:
```python
import csv
# 1. 从输出中提取缓存路径
# 2. 用代码读取缓存
with open('skills/guandata/.cache/data/xxx.csv', encoding='utf-8-sig') as f:
    reader = csv.reader(f)
    headers = next(reader)
    rows = list(reader)
# headers[j] 是第 j 列的字段名
# rows[i][j] 是第 i 行第 j 列的值(字符串)

create-and-get / create-card 参数说明

create-and-getcreate-card 共用以下参数格式:

参数必填类型说明类比 SQL
namestring卡片名称-
ds_idstring数据集 ID(用 list-datasets 查)FROM 表
chart_typestring图表类型(见下方速查表)-
pg_idstring保存到的页面 ID(用 list-pages --manageable 找)-
rowlist行维度(分组依据)GROUP BY
columnlist列维度(横向拆列)交叉表列头
metriclist数值(要算的指标)SUM/AVG/COUNT
metric_additionallist叠加数值(组合图专用:柱+线的线)-
color_bylist颜色分组(气泡图/散点图)-
size_bylist气泡大小(气泡图专用)-
filterslist筛选条件WHERE
sortinglist排序ORDER BY
custom_fieldslist自定义公式字段(动态创建计算列)SELECT ... , SUM(x)/SUM(y) AS 别名

举例说明:

{
  "row": ["城市"],                        // 按城市分行
  "column": ["销售类型名称"],              // 堂食/外卖拆成两列
  "metric": [{"name": "毛营业额", "aggr": "SUM"}],  // 每格填营业额总和
  "filters": [{"name": "营业日期", "op": "BT", "value": ["2026-01-01", "2026-02-28"]}],  // 只看1-2月
  "sorting": [{"name": "毛营业额", "order": "DESC"}]  // 按营业额降序排
}
// 等价于: SELECT 城市, 销售类型名称, SUM(毛营业额) FROM 表 WHERE 营业日期 BETWEEN ... GROUP BY 城市, 销售类型名称 ORDER BY SUM(毛营业额) DESC

自定义公式字段(custom_fields)

在创建卡片时动态添加计算字段,无需提前在观远界面建好:

$SCRIPT create-and-get '{
  "name": "成本率分析",
  "ds_id": "数据集ID",
  "chart_type": "GROUPED_COLUMN",
  "pg_id": "页面ID",
  "row": ["门店名称"],
  "metric": [
    {"name": "毛营业额", "aggr": "SUM"},
    {"name": "成本率"}
  ],
  "custom_fields": [
    {"name": "成本率", "fdType": "DOUBLE", "formula": "SUM([实际使用金额])/SUM([毛营业额])*100"}
  ],
  "filters": [{"name": "营业日期", "op": "BT", "value": ["2026-01-01", "2026-02-28"]}]
}'

参数格式

字段必填说明
name新字段名称
fdType数据类型:DOUBLE(数值)、STRING(文本)等
formula公式表达式,用 [字段名] 引用字段,支持 SUM()/AVG() 等聚合

注意

  • 公式里的字段名必须是数据集中已存在的字段
  • 创建后该字段可直接在 metric/row 中引用(和其他字段一样),如果公式已经聚合无需再写 aggr
  • create-and-getcreate-card 支持此参数

图表类型速查(26种)

类型metricrowcolumnmetric_additionalcolor_bysize_by备注
SINGLE_VALUE100000指标卡(单值)
KPI_CARDn00000指标卡(带阈值样式)
BASIC_COLUMN1n0000柱状图
GROUPED_COLUMNnn1000簇状柱状图
STACKED_COLUMNnn1000堆积柱状图
PERCENT_STACKED_COLUMNnn1000百分比堆积柱状图
WATERFALL_COLUMN1n0000瀑布图
BULLET_COLUMN2n0000子弹图
BASIC_BAR1n0000条形图
BASIC_LINE1n0000折线图
MULTI_LINEnn1000多条折线图
STACKED_AREAn11000堆积面积图
PERCENT_STACKED_AREAn11000百分比堆积面积图
STACKED_COLUMN_WITH_LINEn11100metric=柱子, metric_additional=折线
GROUPED_COLUMN_WITH_LINEn11100metric=柱子, metric_additional=折线
STACKED_COLUMN_WITH_SYMBOLn11100metric=柱子, metric_additional=标记
GROUPED_COLUMN_WITH_SYMBOLn11100metric=柱子, metric_additional=标记
PIE110000饼图
TREE_MAP1n0000矩形树图
FUNNELn00000漏斗图
HEAT_MAP111000热力图
MULTIDIMENSIONAL_SANKEY1n0000多维桑基图
PIVOT_TABLEnnn000交叉表
WORD_CLOUD110000词云
BASIC_BUBBLE2n0011气泡图 x=metric[0], y=metric[1]
BASIC_SCATTER_PLOT210010散点图 x=metric[0], y=metric[1]

n = 不限数量, 0 = 不支持, 2 = 最大2个

metric 格式

{"name": "毛营业额", "aggr": "SUM"}                         // SUM

{"name": "订单编码", "aggr": "CNT_DISTINCT", "alias": "订单数"}  // 指定聚合

{"name": "桌单价"}                           // 自定义字段如果在formula的计算公式中已聚合的情况下,就不再需要 aggr了

聚合方式: SUM / AVG / MAX / MIN / CNT / CNT_DISTINCT

filters 格式

// 维度筛选(WHERE)
{"name": "城市", "op": "IN", "value": ["上海市", "南京市"]}

// 日期范围
{"name": "营业日期", "op": "BT", "value": ["2026-01-01", "2026-02-28"]}

// 度量筛选(HAVING,聚合后过滤)
{"name": "毛营业额", "op": "GT", "value": ["1000000"]}

sorting 格式

// 单字段排序
[{"name": "毛营业额", "order": "DESC"}]
[{"name": "门店编号", "order": "ASC"}]

// 多字段排序
[{"name": "城市", "order": "ASC"}, {"name": "毛营业额", "order": "DESC"}]

字段名格式

rowcolumnmetric.namefilters.namesorting.namecolor_by.namesize_by.name 都用字段名。

普通字段 — 直接写平台上的字段名:

"row": ["城市"]
"metric": [{"name": "毛营业额", "aggr": "SUM"}]
"filters": [{"name": "门店名称", "op": "EQ", "value": ["某门店"]}]

日期子字段字段名(粒度),自动按时间维度拆分:

写法效果示例输出
"营业日期(年)"按年汇总2025
"营业日期(季度)"按季度汇总2025年第4季度
"营业日期(月)"按月汇总2025-11
"营业日期(周)"按周汇总2025年第44周
"营业日期(星期)"按星期几汇总星期六
"row": ["营业日期(月)"]   // 按月看趋势
"filters": [{"name": "营业日期(年)", "op": "IN", "value": ["2026"]}]  // 筛选2026年

filterType 速查

类型含义示例
EQ等于["A品牌"]
NE不等于["闭店"]
IN在列表中["上海市","北京市"]
NI不在列表中 (Not In)["闭店","未开业"]
BT范围["2025-01-01","2025-12-31"]
GT大于["100"]
GE大于等于["100"]
LT小于["100"]
LE小于等于["100"]
CONTAINS包含["万达"]
IS_NULL为空[]
NOT_NULL不为空[]

建卡示例

示例0:汇总值(row 为空) — 拿总计不拆维度

# row=[] 不分组,直接返回汇总值,不会截断
$SCRIPT create-and-get '{"name":"汇总","ds_id":"<dataset_id>","chart_type":"BASIC_COLUMN","pg_id":"<page_id>","row":[],"metric":[{"name":"毛营业额","aggr":"SUM"}],"filters":[{"name":"日结日期","op":"BT","value":["2026-03-16","2026-03-22"]}]}'
# 输出: 毛营业额: 313230258.42
# 卡片保留供复核,用户要求清理时再 delete-cards

示例1:指标卡 — 2月消费会员数

$SCRIPT create-and-get '{"name":"2月消费会员数","ds_id":"<dataset_id>","chart_type":"SINGLE_VALUE","pg_id":"页面ID","metric":[{"name":"会员id","aggr":"CNT_DISTINCT"}],"filters":[{"name":"营业日期","op":"BT","value":["2026-02-01","2026-02-28"]}]}'
# 输出: 会员id: 252335

示例2:柱状图 — 各城市毛营业额(按营业额降序)

$SCRIPT create-and-get '{"name":"各城市毛营业额","ds_id":"<dataset_id>","chart_type":"BASIC_COLUMN","pg_id":"页面ID","row":["城市"],"metric":[{"name":"毛营业额","aggr":"SUM"}],"filters":[{"name":"营业日期","op":"BT","value":["2026-01-01","2026-02-28"]}],"sorting":[{"name":"毛营业额","order":"DESC"}]}'
# 输出: 毛营业额: ['2323360', '8483271', ...]  维度: ['南京市', '南通市', ...]

示例3:交叉表 — 各城市×月份营业额(按城市+月份排序)

$SCRIPT create-and-get '{"name":"城市×月份营业额","ds_id":"<dataset_id>","chart_type":"PIVOT_TABLE","pg_id":"页面ID","row":["城市"],"column":["营业日期(月)"],"metric":[{"name":"毛营业额","aggr":"SUM"}],"filters":[{"name":"营业日期","op":"BT","value":["2025-01-01","2026-02-28"]}],"sorting":[{"name":"城市","order":"ASC"},{"name":"营业日期(月)","order":"ASC"}]}'
# 输出: [城市 ,月份 ,毛营业额].....['上海','2025-01','123232323'],['上海','2025-02','1230232333'].....
# 排序: 先按城市名正序,再按月份正序

示例4:多条折线图 — 各渠道月趋势

$SCRIPT create-and-get '{"name":"渠道月趋势","ds_id":"<dataset_id>","chart_type":"MULTI_LINE","pg_id":"页面ID","row":["营业日期(月)"],"column":["销售类型名称"],"metric":[{"name":"毛营业额","aggr":"SUM"}],"filters":[{"name":"营业日期","op":"BT","value":["2025-01-01","2026-02-28"]}]}'

示例5:组合图(柱+线) — 营业额柱状+消费人数折线

$SCRIPT create-and-get '{"name":"营业额与用餐人数","ds_id":"<dataset_id>","chart_type":"STACKED_COLUMN_WITH_LINE","pg_id":"页面ID","row":["营业日期(月)"],"column":["销售类型名称"],"metric":[{"name":"毛营业额","aggr":"SUM"}],"metric_additional":[{"name":"用餐人数","aggr":"SUM"}],"filters":[{"name":"营业日期","op":"BT","value":["2026-01-01","2026-02-28"]}]}'

示例6:气泡图 — 各门店营业额vs实收金额(按城市着色,气泡大小=用餐人数)

$SCRIPT create-and-get '{"name":"门店气泡图","ds_id":"<dataset_id>","chart_type":"BASIC_BUBBLE","pg_id":"页面ID","row":["城市","门店"],"metric":[{"name":"毛营业额","aggr":"SUM"},{"name":"菜品实收金额","aggr":"SUM"}],"size_by":[{"name":"用餐人数","aggr":"SUM"}],"color_by":[{"name":"城市"}],"filters":[{"name":"营业日期","op":"BT","value":["2026-01-01","2026-02-28"]}]}'
# row=维度标签, metric[0]=x, metric[1]=y, color_by=颜色分组, size_by=气泡大小

完整工作流示例

需求:做一张「2026年2月各城市外卖销售类型毛营业额 TOP10」交叉表

# Step 1: 通过表id查字段,确认可用字段
$SCRIPT get-columns <dataset_id>
# → 确认: 城市(DIM), 毛营业额(METRIC), 销售类型名称(DIM), 营业日期(DATE)

# Step 2: 查枚举值(因为用了 IN/EQ 筛选,必须查)
$SCRIPT search-values <dataset_id> --name "销售类型名称" --search "外卖"
# → 确认值是 "外卖"

# Step 3: 建交叉表,自动取数
$SCRIPT create-and-get '{"name":"2月外卖各城市毛营业额","ds_id":"<dataset_id>","chart_type":"PIVOT_TABLE","pg_id":"<page_id>","row":["城市"],"column":["销售类型名称"],"metric":[{"name":"毛营业额","aggr":"SUM"}],"filters":[{"name":"营业日期","op":"BT","value":["2026-02-01","2026-02-28"]},{"name":"销售类型名称","op":"EQ","value":["外卖"]}],"sorting":[{"name":"毛营业额","order":"DESC"}]}'

💡 如果只做日期或数值筛选(无分类筛选),跳过 Step 2,两步搞定。

错误处理

状态码处理
500终止,服务器问题
401终止,登录失效
403终止,无权限
404终止,资源不存在

Comments

Loading comments...