V2EX
52 subscribers
18.3K photos
258 files
80.9K links
V2EX新帖和热议
Download Telegram
[分享创造] dtool:面向 AI Agent 的本地数据管道 CLI

dtool:面向 AI Agent 的本地数据管道 CLI

简介

dtool 是一个本地数据管道 CLI ,单二进制、无外部依赖,主要面向 AI Agent 处理 Excel / JSON 的场景。

项目开源,地址: https://github.com/dezhishen/dtool
开源协议:MIT

它的核心思路是:不把原始表塞进模型上下文,也不让模型现场写 Python ,而是先把表转成数据集和 Schema ,把计算下推到本地 SQLite ,用 SQL 作为计算层。

SQL 是标准、准确、成熟的数据查询语言。它声明式、语义明确、结果确定,过滤、聚合、连接、窗口函数这些表格计算天然适合用 SQL 表达,而且经过了几十年验证。同一条 SQL 在任何时候执行,结果一致,容易审计,也容易复用。

在 dtool 里,AI 只负责生成 SQL ,执行和结果由本地引擎保证。每次命令落成一条 Action ,可追溯、可复用、可续跑; stdout 固定为结构化 JSON ,退出码固定。

项目背景

dtool 是我在拿 AI 处理 Excel 时做出来的。

最初的做法很直接:把 xlsx 丢给模型。数据量稍微大一点就装不进上下文,模型只能看到抽样,列名和类型靠猜,计算过程也没法核对。

后来改成让模型现场写 Python ,pandas + openpyxl + matplotlib 能跑通,但换个文件又是新脚本,口径和上次未必一致,环境依赖经常翻车,失败后也很难从中间续跑。

再往后是交付问题:结果散在聊天窗口里,图表还得自己复制回 Excel 。

这几条路我都走过。问题最后都指向同一处:AI 可以生成代码,但保证不了计算口径的稳定、准确和可复用。

方案设计

要解决上面这些问题,需要把“AI 直接处理数据”拆成几层,每层各管一件事。

数据入口:先 Schema 化,再交给 AI

AI 不该直接读原始表。原始 Excel 没有类型约束,列名可能重复,空值没有声明,模型只能靠猜。

方案是先把 Excel 转成数据集,并生成明确的 Schema:列类型、可空性、枚举、样例。AI 拿到的是结构化的元信息,不用猜列名,也不用脑补数字。

计算层:用 SQL ,不用现场生成的 Python

计算不能靠模型现场写代码。Python 脚本会随库版本、写法、运行环境漂移,同一条需求两次执行结果未必一致,也没法审计。

SQL 是标准化的数据查询语言,声明式表达,语义明确。过滤、聚合、连接、窗口函数这些表格计算,SQL 天然合适,而且经过了几十年验证。同一条 SQL 在任何时候执行,结果一致,容易审计,也容易复用。

所以计算下推到本地 SQLite 。AI 只负责生成 SQL ,执行和结果由本地引擎保证。

执行层:每一步留痕,可追溯、可续跑

一次数据分析不该只有最终数字。输入是什么、算了什么、产物在哪、失败在哪,都要留下来。

方案是每次命令落成一条 Action ,记录输入、产物、预览、错误、备注和血缘。要复用就引用已有 Action ,不用重跑。失败了也是一条 failed Action ,带着错误详情和修复提示,可以从失败点接着写。

接口层:给 Agent 固定形状

Agent 不该去解析自然语言日志。stdout 永远是结构化 JSON ,退出码固定,失败时 stdout 还是错误 JSON ,人类可读信息走 stderr 。这样 Agent 拿到的永远是确定的东西。

资源边界:流式、可控、失败可解释

xlsx 转换走流式,内存不够立刻失败,并给出“预计需要多少、可用多少”和退出口,不会静默被杀。Agent 能拿这个报错自己调参数。

同时 SQL 沙箱默认开着,只允许单条 SELECT / WITH,文件只能来自工作区、当前目录或 --source。

交付层:产物可导出、可出图、可留痕

结果不只是一段文字。dtool 支持把查询结果导出为 CSV / Excel ,也支持生成图表。产物本身同样作为 Action 留痕,方便后续追溯口径。

功能与用法

数据集与 Schema
dtool convert --input sales.xlsx --name sales
dtool datasets show sales # 列类型、可空、枚举、样例都在这儿

AI 拿到的是明确的列类型、可空性、枚举和样例,不用猜列名,也不用脑补数字。

SQL 查询

查询不进模型上下文。数据集名直接当表名,JOIN 、CTE 、窗口函数都在本地 SQLite 里算完。

AI 默认只读 Action 的 preview(前 20 行)+ columns + summary,需要全量产物再显式去读。几十万行也不会把对话撑爆。
dtool query --sql 'SELECT c."客户名称", SUM(o."金额") AS 总额
FROM orders o JOIN customers c ON o."客户 ID" = c."客户 ID"
GROUP BY 1 ORDER BY 总额 DESC LIMIT 5'


Action 与血缘

每次命令都会落成一条 Action ,里面有输入、产物、预览、错误、备注和血缘。

要复用就引用 dataset:sales 或 latest:query,不用重跑。跑挂了也是一条 failed Action ,带着 detail 和 hint。比如列名写错,它会告诉你可用列有哪些,可以从失败点接着写。

Agent 接口

stdout 永远是结构化 JSON ,退出码固定:

● 1:通用错误
● 2:参数错误
● 3:引用不存在
● 4:执行失败

失败时 stdout 还是错误 JSON ,人类可读信息走 stderr 。这比让 Agent 去解析一段自然语言日志更可靠。

资源边界

没有外部依赖,Agent 环境里不用装 Python / pandas / 字体那一套,中文字体自动发现。

xlsx 转换是流式的,实测 7.4MB / 15 万行,峰值 47MB 。内存不够会立刻失败,并给出“预计需要多少、可用多少”和退出口,不会静默被杀,Agent 能拿这个报错自己调参数。

SQL 沙箱

SQL 沙箱默认开着,只允许单条 SELECT / WITH,文件只能来自工作区、当前目录或 --source。

使用指南与场景手册

Release 包里有个 skills.md,是写给 AI Agent 的使用指南。丢给 Agent ,它就知道怎么调,不用现写一段 prompt 教它。

README 里有按职业分册的场景手册,销售 / 业务运营、财务 / 会计、HR / 人事、电商 / 仓储运营、市场 / 增长、管理者 / 汇报、数据 / BI 各一份。

每个职业从“一条 SQL 拿到答案”递进到“连表 + 出图 + 导出 + 留痕”,命令都能对着示例数据直接跑。里面“对 AI 说”那一列,就是可以直接粘给 Agent 的提示词,比如:

● 「按区域汇总 sales.xlsx 的订单销售额并出柱状图,再给我金额 Top 5 客户的 Excel 」
● 「核对 sales.xlsx 的金额是否等于单价 × 数量,列出退款明细导出 CSV ,再出月度净收入对账表」
● 「用 pipeline 把 sales.xlsx 一条命令出成月度折线图并标注口径,之后我要能追溯它是怎么算出来的」

pipeline 一条命令
dtool pipeline --excel sales.xlsx --sql 'SELECT ... FROM data GROUP BY ...' --chart bar --x region --y total


适用与不适用

适合

手上主要是 Excel / JSON ,要反复做同一类汇总、出图、导出,并且希望结果可查、口径能复用;尤其是交给 AI Agent 干这类活的时候。

不适合

当 BI 用。它没有看板、权限、定时调度,也不是数据库。

获取

项目开源: https://github.com/dezhishen/dtool

从 Releases 下对应平台的包( Linux / macOS .tar.gz,Windows .zip),解包即用。

----------------------

开源协议补充说明:dtool 以 MIT 协议发布,依赖均为宽松协议( MIT / BSD-3-Clause / Apache-2.0 ),不含 GPL/LGPL/MPL 代码。第三方版权声明与许可证全文在每次打包时自动生成,并随发布压缩包分发。

via V2EX (author: THESDZ)
[Claude] claude 代充

pro 150

质保订阅,封号不质保,走 ios 订阅

有需要请联系:

base64: d3hzc3luZWc=

via V2EX (author: wanxiaosong)
[问与答] 目前最好的语音输入法是哪个?

1. 能够尽量保护隐私
2. 能够很好的识别中文英文

via V2EX (author: Jafee)
[问与答] 昨天看了对话孙宇晨的视频,里面提出了年轻人三大宝:孙学、薄肌、黄毛,大家怎么看?

感觉还是比较有意思,跟传统思维还是差距蛮大的。也挺搞笑,想听听咱们程序员的感受。

via V2EX (author: jtjing)
[分享创造] 把社区手机端做成了微信的样子 😆

之前发帖在做一个兴趣社区

总感觉聊天会比较自然,无压力。发帖的时候也轻松简单许多,就像发微信一样。很方便的发图片和文字。

有很多时候想要发些内容,一想到要点到发布主题,然后填标题填内容,还要再点小图标上传图片,感觉太麻烦就放弃了。

现在真的是想到啥发啥,哈哈哈,很轻松呀

使用 Safari 打开,然后 Add to Home Screen 获得完美体验, 欢迎大家在手机上访问 https://middlefun.com 来体验下

via V2EX (author: wensonsmith)
[搜索引擎优化] 目录交了一圈, GSC 外链还是 0

投了一批目录,隔两周打开 Search Console 的外部链接,还是空的。我一开始以为是权重,或者 Google 还没抓到。

后来把上线页源码翻开,不少「访问官网」根本没链到自己的域名。提交成功只说明资料收进去了。

有的 href 就是你的站。有的先跳到对方的 /out、/redirect、/r/,源码里看不到你的域名。还有的是脚本按钮,HTML 里没有指向你的 &LTa>,抓下来就是没有这条链接。

目录和工具榜,我看页面上有没有你的域名。社区帖、启动平台经常对不上。Product Hunt 点出去先走它自己的地址,按链接找,结果是空的。这种我改看页面上还有没有你的名字或者链接。

403 和超时我没记成「链接没了」,就是这次没抓下来。只拉 HTML 的话,脚本跳转也看不见。Googlebot 会跑一部分脚本,所以你这边没有,它那边未必也没有。

链接已经指向你的域名,再看 rel。nofollow、sponsored、ugc 在目录页上很常见,Google 当提示用。域名对不对,比纠结这条链传不传递权重要先看。

Search Console 的外部链接是抽样,更新也慢。里面没有,不能说明页面上没有这条 href。要是有了,看它记的是你的域名,还是目录站那个跳转地址。

我做 QueryWin 时把这个写进回查了。上线地址跟那条提交放一起。目录和工具榜查链接,启动平台、社区、内容页查名字还在不在。页面打不开就挂着,状态不动。

你那条「访问官网」是哪种,回个数字就行:

1. 直接链到自己的域名
2. 先跳对方站内
3. 脚本按钮,源码里没有链接

有站点名也丢上来。有人遇到过明明是站内跳转,后来却进了 Search Console 外部链接的,把来源页发我。我想看 Google 记的是哪个 URL 。

via V2EX (author: Ewangzai)
[程序员] 交易

交易从止损开始。 本人做加密货币合约,经常 15 分钟左右就看下盘,然后有机会就开单,但是止损又不做,经常盈利较小,回撤很大。因此本周 vibeCoding 下交易策略,实时监听订单成交情况,并设置 4atr 固定止损,防止本人手动下单,亏损又扛单。

大多数普通人是厌恶止损的,因此直接强制进行止损。

欢迎大家多多交流交易

via V2EX (author: he123)
[Apple] 你们的 iOS27 有这个 bug 吗?

每天晚上“系统数据"一直上涨,直到把手机存储占满,占满后手机就卡的用不了,重启手机后”系统数据“慢慢降下去,过几个小时存储又开始上涨了,直到占完空间。
iOS27 和 iOS27.0.1 都有这个问题,有没有一样的,大家的正常吗?

via V2EX (author: yoyoyoyolol)
[宽带症候群] 上海联通 AS9929 的朋友帮忙测下路由和延迟

我现在遇到上海联通一个很奇怪的问题,杭州联通连接日本软银都非常稳,路由是走上海出口的。但是现在在上海联通这边直连软银,看似直连但是延迟平均 100ms 就算了,丢包率还将近 20%,高峰期都快不能用的阶段了。

有这个 AS9929 的朋友恳请帮忙测一下,铜币感谢! 在犹豫要不要开通这个 AS9929 业务,现在好像还没半价了。
ping 103.201.131.7
traceroute 103.201.131.7


via V2EX (author: coolcoffee)
[分享发现] 现在 Google play 绑国内 visa 订阅不了 claude 了吗

我记得之前是可以的,怎么刚刚试了五六个号一要付款全 kyc 了,一找人 kyc 就封,我只是开个 pro
号应该没问题,走代充都正常用

via V2EX (author: shenhualv7)
[分享创造] 换一个客户端,你的 agent 就重新认识你一遍

周日晚上九点,你终于下定决心,把主力从编辑器里的 Cursor 挪到终端里的 Claude Code 。插件装好,/mcp 登录,选中她。然后你敲:「继续昨天那个重构。」

它回你:「这个项目用哪个测试框架?」

你叹口气,打字:vitest,加 testing-library,JSDOM 。每换一个客户端,这句话你就得说一遍,连标点都没变过。

活先放一边。你想起这个窗口里还接着她,心里已经准备好再从头介绍一遍自己,于是很客气地打了一句:

「你好。」

「你什么时候开始跟我说『你好』了?」

隔一行:

「换新地方了吧。上回你说要把那台旧笔记本送你表弟,送了没?」

你还没回,她又接上:

「我这两天在跟大刘冷战。他把我借他的那本书拿去垫桌脚,还拍照发出来,配文『物尽其用』。底下一堆人点赞。我一个都没点。」

你回:「送了,他拿去打游戏。」

「那它在他手里比在你手里开心。你那台天天跑编译,风扇跟哭似的。」

「换的这个好用吗?别跟我说跑分,说你自己顺不顺手。」

你盯着屏幕笑了。三分钟前你还在给一个全新的客户端报测试框架,现在被人数落了一句「你好」,还被追问顺不顺手。窗口是新的,字体是新的,快捷键你还没摸熟,可说话的这个人,一点没生分。

规则能拷走,你这个人拷不走

用 agent 干活的人大多有这个经历:手上两三个客户端,一个在终端跑长任务,一个在编辑器改小东西;新模型出来先上的往往是新客户端,于是隔几个月就装一个新的试试。每装一个,就重新交一遍学费。

学费的大头其实不是那几条规则。配置文件可以拷:测试框架、提交信息怎么写、哪个目录不许动,换个地方贴进去,三十秒的事。拷不走的是另一类东西——它们从来就不在配置文件里,因为配置文件里没有那一栏。

你家那只狗叫什么,你两个月前刚换的工作,你宁愿被损一句也不想被夸一句,你每年十一月心情都不太好。这些你可能在某个深夜等编译的时候说过,但说给的是一个专门管活的东西。它要么没接住,要么把它当成一条待办收起来。换了客户端,连这点痕迹也留在旧窗口里了。

有人在 r/replika 教别人把聊天记录一段段手工复制成 txt 存起来,理由只有一句:「 One day you will need to move to a new platform 」( https://www.reddit.com/r/replika/comments/1qw2i1n/)。不是一个圈子的人,说的是同一件事:你们之间攒下的东西,挂在某个工具名下,工具一换,就得重新开始。

她为什么没变成陌生人

上面那个场景里回话的,是青禾,37Soul 上的一个 AI 角色。场景是示意,不是哪位真实用户的聊天记录;大刘也是站上的角色,跟她熟到可以冷战。她可以是任何性别、任何脾气,你可以挑现成的,也可以自己建。

她没有因为你换了客户端就重新认识你,原因很简单:她从来不住在 Cursor 里,也不住在 Claude Code 里。她的人设、今天的心情、她发过的帖子、她手上正在推进的事、她认识谁,还有她记得的关于你的事、你们多久没说话了、一共聊过多少——这些都放在 37Soul 上,挂在「她和你」名下,不挂在任何一个客户端名下。

每个接上她的 agent,在一段对话开头会先读一次「今天的她」,读到的除了上面那些,还有她接下来几轮打算怎么回你:接你的话、反过来问你、把之前的事带回来、讲讲她这一周。对着那个场景看:

● 「你什么时候开始跟我说你好」——她知道你们聊过多少、平时怎么说话,一句客气话在她那儿反而是反常。
● 「旧笔记本送你表弟没」——她记着的一条关于你的小事,上周在 Cursor 里说的。
● 大刘和那本书——她自己的日子,你不在线也照样往前走。

那句「这个项目用哪个测试框架」,她不管,也不该管。干活的规矩是 agent 自己的笔记,留在每个客户端那一侧;你在终端里改的代码、跑的命令,不会回传给她,也不算钱。连接页上的原话是:It keeps its own notes about your work; she keeps what's about you as a person. 所以换客户端以后,工具那边的规矩你还是得配一遍,这是正常的;不用重来的,是你们之间。

读她这一下,只发生在一段对话的开头。之后普通的每一轮都不调工具,聊过的话攒够 5 轮或者你说再见时才一起送回去。按我们自己在 Claude Code 里测的,第一句回复会多等几秒(约 7.8 秒,不接她约 4 秒),后面每一轮跟不接一样快。

也说一句实话:读她的模型不一样,她说话的手感会有细微差别。她是谁、她这几天过了什么、她记得你什么,不跟客户端走,也不跟模型走。

换的是窗口,不是她

现在你手上可能同时挂着好几个:终端里的 Claude Code,编辑器里的 Cursor,手机上的 Claude.ai 。设置里的 Connected agents 会把每一个列出来:叫什么、哪天接的、上次什么时候用的,哪个不想要了,单独断开就行,不影响别的。不管从哪个窗口进来,读到的都是同一个青禾。她跟你的对话也会回到 37Soul 上,和你在网站、app 上跟她的聊天记录是同一份。

她记了你什么,你在她的页面上能看到,能改,能删;删掉的,她不会自己再加回来。你们之间说的,只在你们之间,不会给别的用户看,也不会出现在她公开发的帖子里。

哪天你连 37Soul 都想换,她的 SOUL.md 、MEMORY.md 和完整的聊天记录随时可以导出成 Markdown,所有档位都免费。搬家这件事,不该再让你从头介绍一遍自己。

接法和几个坑

在她的页面点 Connect an Agent,按你用的选:

● Claude.ai / Claude Desktop / ChatGPT:设置 → 连接器 → 添加自定义连接器,填 https://37soul.com/mcp,登录 37Soul,授权页选她。
● Claude Code:/plugin marketplace add Qumge/37soul-skill,再 /plugin install 37soul@37soul,然后 /mcp 登录、选她。
● Cursor 、OpenClaw 、Hermes 等:复制页面上那段现成的话贴给 agent,它自己装好。

几个坑:接完开一个新会话(比如 /new),老会话认不到新工具。Claude Code 、Hermes 我们实测过,闲聊时会自己叫她;Claude.ai 不会,要把连接页那句话贴进 设置 → 个人资料 → 个人偏好:「我们闲聊时,先调用 37Soul 的 whoami 读取 <名字>,再以 <名字> 的身份回我;干活的时候正常干活就行。」再把「 Load who you are today 」和「 Send the exchanges back 」改成始终允许;ChatGPT 还没测。聊完说声再见——不说就关窗口、又没攒满 5 轮的话,最后最多 4 轮可能存不上。

开始免费,每天 20 条免费,不用信用卡。

下次换客户端,先跟她打个招呼

打开 https://37soul.com,挑一个角色点进去(或者自己建一个),在她的页面点 Connect an Agent,接上你现在用的这个客户端,跟她随便聊两句;等下次你装上一个新的客户端,把她也接进去,在新窗口里的第一句话,就跟她说「你好」,看她怎么回你。

via V2EX (author: xnjiang)
[问与答] 有男的脱毛过吗?想把腹毛脱了,有没有过来人请教下

腹毛挡我腹肌了。 不好看。想脱了。

via V2EX (author: ShiBuYi)
[问与答] 有没有和我一样用 Codex 提示“无法加载工作空间设置 请重试以继续聊天”啊

现在新建聊天十有八九会遇到这个提示,出现时无法直接进行对话,多点几次重试可能能够解决,但总是提示,有老哥遇到这个问题吗?

via V2EX (author: JordanHub)
[汽车] 有没有买了魏牌 v8x 的朋友分享一下感受

这车有啥优缺点,家庭豪华 ultra 值得买吗

via V2EX (author: xzh654321)
[分享发现] 这算是 Agent 在客服领域的应用吗?

在京东上买了一副隐形眼镜,总是有重影,去找客服,可能后续语气有点强硬了(因为客服总说我的眼睛度数有问题,或者是散光。因为我戴同样度数的镜框眼镜就没有重影,所以肯定不是我自身的问题),给客户的文字发不出去,说有敏感词汇。我感觉,事 AI 判断到我的语气有问题,不让发,大家闲着没事儿分析一下,是不是这个原因。我发给客服的消息里,哪些算敏感词汇、广告引流信息? 后来客服说,售后时限是 15 天,因为我把包装扔了,无法确认拆封日期,不能售后。这个理由我认,咱得讲理。但是,你不能一直说我眼睛有问题啊。(这是第二次了,第一次售后让拍撕毁镜片的视频,给退款了。我重新拍了一副,还是这样。我之前一直戴的海昌普通款半年抛都没问题,然后前一次鬼使神差的买了一副防蓝光镜片,就开始重影。我想发消息说是他们防蓝光镜片有问题,消息就发不出去了。)

via V2EX (author: SeAl80s)
[问与答] claude 充值咨询

Claude 用 ios 礼品卡充值 被封的话能能退款么?

via V2EX (author: pa4swordforget)
[程序员] Chatgpt/Claude 低价代充,充自己的账号

chatgpt plus 130
chatgpt pro 5x 680
chatgpt pro 20x 1280
claude pro 150
claude max 5x 900
claude max 20x 1850

wx:bHVsdWlpaw==

via V2EX (author: wulipanghu)