npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

pi-data-agent-extension

v0.14.4

Published

Natural-language data analysis for Pi: DuckDB querying, semantic data dictionary, analysis skills, charts, reports, and a local dashboard

Readme

Pi Data Agent Extension

基于 Pi Extension API + DuckDB 的数据分析智能体扩展:让 Pi 具备加载数据、SQL 查询、可视化、生成报告的完整分析能力,并以数据字典、查询记忆、表卡片三层知识库沉淀分析资产。

当前版本:v0.13 开发中(可信分析官:L2 语义注入已交付 + PM 分析模板包实施中;MySQL 只读连接见 v0.12)。

功能概览

  • 数据加载:CSV / Excel(.xlsx/.xls)上传自动建表,DuckDB 本地存储
  • SQL 查询:自然语言 → SQL,带错误自修复(error-recovery)与查询记忆
  • 知识库:数据字典(AI 推断 + 用户确认状态机)、表卡片、指标口径、查询记忆,按 L0 导航 / L1 按需 / L2 注入三层渐进披露;L2 在 query_data 结果前置语义附注(表卡片/指标口径/uncertain 警示,单次 ≤200 token、每轮 ≤2 表,可用 PI_DATA_AGENT_L2_INJECTION=off 关闭)
  • PM 分析模板(v0.13):run_analysis_template 一键跑漏斗 / 留存 cohort / A/B 检验——统计全部确定性计算(LLM 只解释不计算),uncertain 字段 fail-closed,结果自带"方法与局限"说明
  • 可视化:matplotlib 静态图(bar/line/scatter/histogram/pie/box/heatmap),Python 失败时自动回退 CSV
  • 报告:会话报告(HTML 单文件离线自包含)+ 正式分析报告(executive/detailed,证据覆盖度质量门)
  • Dashboard:本地 Web 界面,浏览报告与图表中心(缩略图卡 / 数据集筛选 / 分页 / 大图预览 / 一键复制重跑)、查看本地物化副本(行数漂移、体积变化、精度提示),管理数据字典与指标口径;深浅双主题,暗色为默认
  • 外部数据库:MySQL 远程只读连接(v0.12),SQLite 本地文件;ATTACH 架构,远程表即普通 DuckDB 表,16 个工具可复用;MySQL 全链路已真机验收(v0.14.2),远程表物化见 materialize_remote_table

工具清单

| 工具 | 用途 | |------|------| | load_data | 加载 CSV/Excel 文件为 DuckDB 表(read_options 可透传 read_csv_auto 逃生参数:dateformat/types/ignore_errors 等) | | describe_data | 查看表结构、样例与统计概要 | | query_data | 执行 SQL 查询(必填 sql + user_intent) | | transform_data | 建表/物化转换结果 | | list_datasets | 列出已加载数据集 | | ask_clarification | 分析方向不明确时主动反问 | | export_result | 导出查询结果 | | visualize | 生成统计图表 | | show_image | 在 TUI 展示图片 | | connect_database | 连接外部数据库(sqlite 文件 / MySQL 只读远程) | | confirm_dictionary | 数据字典确认入口 | | generate_report | 生成正式分析报告 | | generate_session_report | 生成会话报告 | | get_table_card | 查询表卡片(用途/边界/字段含义) | | run_analysis_template | PM 分析模板:funnel 状态漏斗 / cohort 留存分群 / ab_test 双比例检验(确定性统计,v0.13) | | materialize_remote_table | 远程表物化到本地(只读复制 + 行数熔断 + 原子替换,v0.14) |

PM 分析模板(v0.13)

run_analysis_template 提供三种模板:

  • funnel(状态漏斗):2–8 个条件步 + 去重键(user_key),可选时间窗口(time_column + window_days,窗口 = 数据最新时间往前 N 天)。第 k 步 = 满足前 k 步条件合取的 distinct user_key(用户级条件叠加,不含步序时间约束)。状态互斥型数据(每行一个 status)不适用——请用分组对比或 cohort。
  • cohort(留存分群):user_key + activity_time + period(week/month)+ 可选 activity_condition(排除噪声行为)+ lookback(默认 12,上限 24)。长期格式输出各群 × 期偏移的留存率与简单平均。
  • ab_test(A/B 双比例检验):variant_column(恰好 2 个非空取值)+ success_condition + unit(去重粒度)+ 可选 segment_columns(≤3,辛普森扫描)+ alpha(默认 0.05)。双侧两比例 z 检验(合并比例),p 值由 TypeScript 确定性正态 CDF 计算(Zelen–Severo 近似,误差 < 1e-7)。内置四项护栏:样本量不足(n<100 或期望计数 <5)、辛普森悖论扫描(段内方向 vs 总体方向)、边缘显著提示(p ∈ (0.01, 0.2))、效应量(绝对差 + 相对 lift)。

两条统一约束:统计数值全部由确定性代码计算,模型只按返回的 method_notes 解释、不得改写或自行计算;映射列触及 uncertain 状态字段时拒绝执行(fail-closed)。golden 数据集(src/eval/fixtures/funnel-known.csv、cohort-known.csv)保证统计口径有精确已知答案回归。

安装与加载

# 方式一:作为 Pi 包安装(package.json 已声明 pi manifest + pi-package keyword,本地安装已冒烟验证;
#          发布到 npm 后会自动收录进 pi.dev 包目录)
pi install /path/to/pi-data-agent-extension

# 方式二:开发模式显式加载
npm install
npm run build
pi -e /path/to/pi-data-agent-extension/dist/index.js

Python 绘图依赖见 requirements.txt(matplotlib / pandas / seaborn / numpy / scipy),安装:pip install -r requirements.txt。测试继承调用方 PATH,不再注入个人虚拟环境;缺依赖时相关用例会明确 skip 并打印安装命令(不再伪装成测试失败)。历史依赖版本矩阵冲突仍见 ../specs/BACKLOG.md,本次未验证全新安装。

测试

npm test            # 全量(vitest;2026-10-11 实测 58 文件 / 420 用例:419 passed | 1 skipped,skip 项为缺 Python 绘图依赖时的明确提示)
npm run test:watch  # watch 模式
npm run test:coverage

v0.11 起测试统一到 vitest(含 DuckDB 单连接串行约束,singleFork)。

数据库连接(v0.12)

connect_database 支持两类目标:

# SQLite 本地文件
connect_database(db_type="sqlite", file_path="/path/to/data.db")

# MySQL 远程(只读)
connect_database(db_type="mysql", host="db.internal", port=3306, user="analyst", database="sales")

MySQL 只读语义与配置:

  1. 连接强制 READ_ONLY(客户端约束)。服务端账号请使用 GRANT SELECT ONLY——客户端 READ_ONLY 不是安全边界。写入远程库不支持,此类请求应拒绝。
  2. 白名单前置:只有 dbAllowedHosts 白名单内的 host 才允许连接,默认空 = 拒绝一切远程。配置方式(二选一):
    • env:PI_DATA_AGENT_DB_ALLOWED_HOSTS="db.internal:3306;10.0.0.5"(分号分隔,支持 host 与 host:port 两种格式;localhost 与 127.0.0.1 视为不同目标)
    • config.json(.pi-data-agent/config.json):{ "dbAllowedHosts": ["db.internal:3306"] }
  3. 凭据三种配置方式(密码永不作为工具参数——工具参数会整体进入模型上下文):
    • env PI_DATA_AGENT_MYSQL_PWD(项目命名空间,优先)
    • env MYSQL_PWD(DuckDB mysql 扩展原生识别)
    • 交互模式下弹出密码输入框(结果仅存入 temporary secret,不落盘)
  4. 查询超时:dbQueryTimeoutMs(默认 300000,夹紧 5s~10min),传给 mysql_query_timeout_max_ms。超时设置在创建凭据与连接之前,设置失败即拒绝连接;慢查询是否被可靠中断仍需真机验证(见 ../specs/v0.12-EXECUTION_SPEC.md §12)。
  5. 离线环境:首次连接需下载 mysql/sqlite 扩展(约 10MB)。注意引擎把 home_directory 指向项目目录,DuckDB 因此从 <项目>/.pi-data-agent/.duckdb/extensions/<duckdb版本>/<os>_<arch>/ 找扩展,~/.duckdb/extensions 下的缓存不会被命中(此时 INSTALL 会重新联网,受限网络下直接失败)。离线预置二选一:把缓存复制到上述项目路径,或 SET extension_directory 指向已含扩展的目录。连接失败时返回的指引会打印当前引擎实际查找的目录。
  6. 已知精度坑:MySQL DECIMAL(p>38) 列落地为 DOUBLE(DuckDB 上限 DECIMAL(38));mysql_query() 表函数因 issue #65 禁用,统一走 ATTACH。

远程表物化(v0.14)

materialize_remote_table 把已 ATTACH 的远程表只读复制到本地 DuckDB(不修改远程数据):

materialize_remote_table(alias="sales", table="orders")            # 默认本地表名 sales_orders
materialize_remote_table(alias="sales", table="orders", row_limit=100000)
  • 何时该物化:大表要反复分析(避免每次跨网查询)、给生产库减压、离线场景。偶尔看几行用 SELECT * FROM alias.table LIMIT 10 即可,不需要物化。
  • 行数熔断:先 COUNT(*)(下推远端执行),超过 dbMaxMaterializeRows(默认 500000,env PI_DATA_AGENT_DB_MAX_MATERIALIZE_ROWS)直接 block(不是确认)。三条出路:设 row_limit、调大阈值、先在远端 WHERE 过滤再物化子集。
  • 确认门:本地写操作走 S-1 fail-closed 确认门——交互模式弹窗(文案含预估行数/目标表/是否替换现有表);headless 无 PI_DATA_AGENT_AUTO_CONFIRM_WRITE=true 即拒绝。
  • 原子替换:tmp → rename 单事务交换;任一步失败自动 ROLLBACK + 清理临时表,已有目标表不受影响、可立即重试。
  • 精度坑:源表 DECIMAL(p>38) 落地为 DOUBLE,返回摘要会显式提示(同上 MySQL 精度坑)。
  • 物化后:自动生成数据字典(ai-guessed,用 confirm_dictionary 校正);返回摘要含行数/列数/耗时/endpoint(无凭据)/本地 .duckdb 体积变化。

目录结构

pi-data-agent-extension/
├── src/
│   ├── index.ts            # Extension 入口(生命周期 + 16 工具注册)
│   ├── config.ts           # 配置加载(env > 项目配置 > 默认值)
│   ├── security.ts         # SQL 安全检查(确认门 fail-closed、路径白名单)
│   ├── persistence.ts      # 配置/字典/记忆持久化
│   ├── error-recovery.ts   # 错误自修复
│   ├── engine/             # DuckDB 引擎 + Python 无状态调用
│   ├── tools/              # 16 个工具实现
│   ├── dashboard/          # 本地 Web Dashboard(server/routes/services/middleware)
│   ├── hooks/              # 数据字典、查询记忆、主动反问
│   ├── navigation/         # L0 导航上下文渲染
│   ├── metrics/            # 指标口径定义
│   ├── report/             # 分析报告生成管线
│   ├── table-cards/        # 表卡片存储
│   ├── llm/                # LLM 调用收敛层
│   └── eval/               # 全部测试(vitest)+ fixtures
├── scripts/                # generate_chart.py / check_python_env.py
└── dist/                   # 构建产物(pi -e 加载入口)

安全模型

一句话:写操作确认门 fail-closed(无 UI 环境不静默放行)、SQL 内嵌路径白名单 + 危险操作拦截、模型侧 ATTACH/DETACH 一律拦截(远程连接只允许走 connect_database 工具实现层)、远程目标白名单 fail-closed(默认拒绝一切远程)、凭据不进工具参数/错误文本/审计日志(redactCredentials 兜底)、Dashboard 仅绑定本地回环并叠 Origin 校验 / 速率限制 / 安全响应头 / 写令牌四层中间件。

版本历史

各版本执行规范与交付评审见 ../specs/ 与本目录 v0.*-REVIEW-REPORT.md / v0.*-DELIVERY-REPORT.md;跨版本欠账统一收录在 ../specs/BACKLOG.md。