关于 datoon
datoon 是面向 LLM 数据管线的结构化数据到 TOON 转换工具,仅在预计节省 Token 时转换,否则保留原格式。它提供命令行、Python API 和 MCP 工具,并为每次决策说明原因。
主要功能
- 01自动识别多种结构化格式
- 02按结构和节省阈值决定转换
- 03将合适的数据转换为 TOON
- 04返回转换决策、原因和 Token 估算
- 05提供命令行与 Python API
- 06支持结构分析而无需 Node.js
适用场景
- 01为 LLM 提示词压缩规整的表格数据
- 02跳过转换后可能变大的嵌套数据
- 03在数据管线中记录转换判断与估算
MCP 相关
datoon 的 MCP 服务提供 convert_json、convert_text 和 analyze_json 工具,用于转换 JSON、CSV、YAML、XML、JSONL,或仅分析 JSON 结构。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
datoon
智能结构化数据→TOON 网关 — 仅在确实能节省令牌时才进行转换
转换前/后 • 安装 • 功能一览 • 工作原理 • 基准测试 • 完整安装指南
原始结构化数据在大模型提示词中往往冗长。TOON 可以节省令牌,但盲目转换也可能让负载更糟。datoon 增加了一层决策逻辑:当结构和节省效果值得转换时就转换,不值得时就跳过,并始终说明原因。
支持 JSON、CSV、JSONL、YAML、XML、Parquet、Avro、ORC、Excel 和 Apple Numbers,并根据文件扩展名自动检测格式。
转换前 / 后
提示词中的 JSON(43 个令牌)
|
datoon 转换 → TOON(24 个令牌)
|
来自数据管道的 CSV(转为 JSON 后为 111 个令牌)
|
datoon 自动转换 → TOON(24 个令牌)
结果相同。代码中无需进行 JSON 序列化。 |
非均匀负载(26 个令牌)
|
datoon 跳过转换 → 保留 JSON
无需调用 Node.js。不会悄然损坏数据。 |
数据相同。格式恰当。始终说明原因。
┌──────────────────────────────────────────────────┐
│ PAYLOAD SAVINGS (auto avg) ████░░░░░░ 28% │
│ PAYLOAD SAVINGS (agent skill) ████████░░ 62% │
│ DECISION ACCURACY ██████████ 100% │
│ HARMFUL CONVERSIONS BLOCKED ██████████ 100% │
└──────────────────────────────────────────────────┘
重要
datoon 节省的是负载令牌,即提示词中结构化数据部分所占用的令牌。令牌节省效果取决于负载形态:均匀的表格数据适合转换;深度嵌套或非均匀结构则会跳过。每项决策都会附带原因,方便工作流记录日志、调试并信任结果。
安装
# core (JSON, CSV, JSONL, XML — no extra deps)
uv add datoon
pip install datoon
# with YAML support
pip install "datoon[yaml]"
# with Excel support
pip install "datoon[excel]"
# with Parquet / ORC / Avro support
pip install "datoon[columnar]"
# with Apple Numbers support
pip install "datoon[numbers]"
# with tiktoken-based token counting
pip install "datoon[tokens]"
# with MCP server
pip install "datoon[mcp]"
# everything
pip install "datoon[all]"
需要 Python 3.12+。转换 TOON 需要安装 Node.js,且 npx 位于 PATH 中;无需 Node.js 也能进行分析和读取格式。
Claude Code 插件、Codex 和 MCP 配置 → INSTALL.md。
功能一览
| 内容 | |
|---|---|
datoon CLI | 在终端或脚本中自动判断是否将任何受支持的格式转换为 TOON |
| Python API | 提供 convert_json_for_llm() + read_tabular(),适用于任何大模型工作流 |
| MCP 服务 | 提供 convert_json、convert_text、analyze_json 工具,适用于 Claude Desktop、Cursor、Windsurf |
| Claude Code 插件 | 会话内触发器 /datoon,可通过一条命令从 GitHub 安装 |
| Codex 插件 | 市场插件,为 Codex 提供结构化数据模式 |
支持的输入格式
| 格式 | 扩展名 | 所需额外依赖 |
|---|---|---|
| JSON | .json | — |
| JSONL | .jsonl、.ndjson | — |
| CSV | .csv | — |
| XML | .xml | — |
| YAML | .yaml、.yml | datoon[yaml] |
| Excel | .xlsx、.xls | datoon[excel] |
| Parquet | .parquet | datoon[columnar] |
| Avro | .avro | datoon[columnar] |
| ORC | .orc | datoon[columnar] |
| Apple Numbers | .numbers | datoon[numbers] |
工作原理
- 检测格式 — 根据
--format标志、文件扩展名,或在读取 stdin 时默认使用 JSON - 读取并规范化 — 将源数据解析为行字典列表;序列化为紧凑 JSON
- 分析结构 — 是否为统一的对象数组?深度是否可接受?行数是否达到最低要求?
- 提前筛选 — 非候选数据会在任何 CLI 调用前跳过;不会产生 Node.js 开销
- 转换并估算 — 运行 TOON CLI,计算 Token 节省量
- 按节省量筛选 — 低于阈值 → 返回 JSON;高于阈值 → 返回 TOON 和报告
每种情况下都会返回一个包含 decision、reason 和 Token 估算值的 ConversionReport。流水线不会出现意外的静默行为。
快速开始
JSON(stdin):
echo '{"users":[{"id":1,"name":"Ada"},{"id":2,"name":"Lin"},{"id":3,"name":"Grace"}]}' | datoon --report-stdout
CSV(根据扩展名自动检测):
datoon data.csv --report-stdout
JSONL:
datoon data.jsonl -o output.toon
YAML(需要 datoon[yaml]):
datoon data.yaml --report-stdout
Parquet(需要 datoon[columnar]):
datoon data.parquet --report ./report.json
显式指定格式:
datoon --format csv < data.csv --report-stdout
强制转换(绕过筛选 — 用于实验):
datoon data.json --force --report-stdout
Python API
JSON 转换:
from datoon import convert_json_for_llm, ConversionConfig, DatoonError
config = ConversionConfig(min_savings_ratio=0.15, max_depth=6, min_uniform_rows=3)
try:
outcome = convert_json_for_llm(raw_json, config)
except DatoonError as exc:
raise
# outcome.payload_text — TOON or original JSON
# outcome.report.decision — "convert" | "skip"
# outcome.report.reason — human-readable explanation
send_to_model(outcome.payload_text)
通过 read_tabular 读取任意格式:
import json
from pathlib import Path
from datoon import read_tabular, convert_json_for_llm, ConversionConfig
# text formats: csv, jsonl, yaml, xml
rows = read_tabular("csv", text=csv_string)
# binary formats: excel, parquet, orc, avro, numbers
rows = read_tabular("parquet", path=Path("data.parquet"))
json_text = json.dumps(rows, separators=(",", ":"))
outcome = convert_json_for_llm(json_text, ConversionConfig())
send_to_model(outcome.payload_text)
仅分析结构(无需 Node.js):
from datoon.analyzer import analyze_payload
from datoon.models import ConversionConfig
analysis = analyze_payload(parsed_data, ConversionConfig())
print(analysis.is_candidate, analysis.reason)
MCP 服务
datoon 提供了一个 MCP 服务,包含三个工具:
| 工具 | 描述 |
|---|---|
convert_json | 完整的 JSON 转换,包含策略筛选 |
convert_text | 转换 CSV、YAML、XML 或 JSONL 文本,包含策略筛选 |
analyze_json | 仅分析结构 — 无需 Node.js |
Claude Desktop / Cursor / Windsurf 配置:
{
"mcpServers": {
"datoon": {
"command": "uvx",
"args": ["--from", "datoon[mcp]", "datoon", "mcp"]
}
}
}
本地运行:
datoon mcp # or the standalone script: datoon-mcp
已列入 MCP Registry、Smithery 和 Glama。参见 MARKETPLACES.md。
Claude Code 插件
直接从 GitHub 安装:
claude plugin marketplace add andrii-su/datoon
claude plugin install datoon@datoon
在会话中触发:
/datoon
convert this JSON to TOON if it saves tokens
use datoon mode for structured data
CLI 参考
| 标志 | 默认值 | 描述 |
|---|---|---|
--format | auto | 输入格式:json、csv、jsonl、yaml、xml、excel、parquet、avro、orc、numbers |
--force | false | 绕过筛选和最低节省量阈值 |
--min-savings | 0.15 | 所需的最低相对 Token 节省量 |
--max-depth | 6 | 自动转换的最大嵌套深度 |
--min-uniform-rows | 3 | 统一对象数组中的最少行数 |
--timeout | 30 | 中止 TOON CLI 调用前等待的秒数 |
--report <path> | — | 将 JSON 转换报告写入文件 |
--report-stdout | — | 将 JSON 转换报告打印到 stderr |
-o <path> | stdout | 输出文件路径 |
--version | — | 打印版本并退出 |
根据文件扩展名自动检测格式。从 stdin 读取时,或需要覆盖自动检测结果时,请使用 --format。
基准测试
PYTHONPATH=src python benchmarks/run.py --dry-run
PYTHONPATH=src python benchmarks/run.py
PYTHONPATH=src python benchmarks/run.py --update-readme
为什么自动模式优于强制转换
自动模式会跳过收益较低、风险较高的负载(orders-nested、mixed-non-uniform),同时在适合转换的负载上,其平均 token 数与强制 TOON 转换相当。每项决策都会附带有据可循的报告。
| 场景 | JSON 基准 | 强制 TOON | datoon 自动模式 |
|---|---|---|---|
| 平均 token 数 | 77 | 50 | 50 |
| 平均 token 节省比例 | 0.0% | 26.8% | 28.1% |
| 决策质量 | 不适用 | 全部转换 | 转换 3/5,跳过有害情况 |
| 数据集 | JSON | TOON(强制) | 原始节省比例 | 自动模式 | 自动模式 token 数 | 自动模式节省比例 |
|---|---|---|---|---|---|---|
| users-small | 54 | 40 | 25.9% | 转换 | 40 | 25.9% |
| events-medium | 219 | 162 | 26.0% | 转换 | 162 | 26.0% |
| orders-nested | 106 | 116 | -9.4% | 跳过 | 106 | 0.0% |
| mixed-non-uniform | 35 | 47 | -34.3% | 跳过 | 35 | 0.0% |
| metrics-wide | 142 | 103 | 27.5% | 转换 | 103 | 27.5% |
| 平均 | 111 | 94 | 7.1% | 转换 3/5 | 89 | 15.9% |
5/5 个负载均成功强制转换。
格式转换基准测试
从常见结构化格式(CSV、JSONL、XML、YAML)转换时的 token 节省情况。 基准是相同数据的 JSON 表示,也就是不使用 datoon 时大模型会收到的内容。
| 数据集 | 格式 | JSON token 数 | TOON(强制) | 自动模式 | 自动模式 token 数 | 自动模式节省比例 |
|---|---|---|---|---|---|---|
| users-csv | csv | 53 | 29 | 转换 | 29 | 45.3% |
| events-jsonl | jsonl | 194 | 109 | 转换 | 109 | 43.8% |
| catalog-xml | xml | 96 | 50 | 转换 | 50 | 47.9% |
| metrics-yaml | yaml | 129 | 61 | 转换 | 61 | 52.7% |
| 平均 | — | 118 | 62 | 转换 4/4 | 62 | 47.4% |
4/4 个负载均成功强制转换。
Agent 技能评估
基于产物的子 Agent 对比——分析任务相同,模式不同:
with_skill:Agent 获得了datoon技能,并遵循转换工作流。without_skill:Agent 直接使用 JSON,不使用 TOON 或datoon。
3 种负载大小 × 3 次迭代 = 共运行 18 次 Agent。两种模式的回答正确率均为 100%。
| 场景 | JSON 平均 token 数 | TOON 平均 token 数 | 负载平均节省比例 |
|---|---|---|---|
| 小 | 225 | 118 | 47.6% |
| 中 | 2,972 | 1,138 | 61.7% |
| 大 | 17,757 | 6,673 | 62.4% |
完整报告和原始输出:benchmarks/agent_skill_eval/。节省数据是负载 token 的估算值,并非端到端模型 token 使用量。
开发
贡献者工作流:CONTRIBUTING.md。维护者/Agent 说明:CLAUDE.md。
设置:
uv sync --extra dev
uvx pre-commit install
测试:
pytest -m "not integration" # unit only (102 tests)
pytest # with integration (requires Node.js + npx)
技能同步 + 插件元数据:
python scripts/validate_skill_sync.py
python scripts/validate_plugin_metadata.py
链接
- INSTALL.md — 完整安装矩阵、所有目标及各 Agent 的详细说明
- CONTRIBUTING.md — 贡献者工作流
- CLAUDE.md — 面向 Agent 的维护者指南
- CHANGELOG.md — 发布历史
- SECURITY.md — 漏洞报告
- 在线文档 —
docs/ - 问题 — Bug、功能需求、问题
许可证
MIT
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。