TOON格式技能 TOON是为LLM提示设计的紧凑、人类可读的JSON编码。
变量
| 变量 | 默认 | 描述 |
|---|---|---|
| VALIDATION_MODE | strict | strict(需要CLI验证)或lenient(解析器宽容) |
| AUTO_FIX | true | 在验证失败时自动运行修复脚本 |
指令
强制性 - 遵循此技能中的格式规则和reference/format-rules.md。
- 总是包括明确的
[count]用于数组 - 使用2个空格缩进用于表格行
- 在表格数组后添加空白行以终止它们
- 在单元格中使用分号用于嵌套数组(而不是逗号)
红旗 - 停止并重新考虑
如果你即将:
- 在表格单元格中在引号内放置逗号
- 从数组声明中省略
[count] - 忘记在表格数组后添加空白行
- 使用YAML风格的
- item列表语法 - 添加带有
#的注释
停止 -> 检查reference/format-rules.md -> 然后继续
工作流程
- [ ] 确定是否适用TOON(见下面的"何时使用TOON")
- [ ] 为表格表示设计数据结构
- [ ] 检查点:验证格式是否符合规则
- [ ] 用适当的缩进编写TOON
- [ ] 使用
npx @toon-format/cli --decode进行验证 - [ ] 如果有错误,运行
reference/validation-tools.md中的自动修复脚本
食谱
格式规则
- IF:编写或编辑TOON文件
- THEN:阅读
reference/format-rules.md - COVERS:语法规则、约束、正确模式
验证与修复
- IF:TOON文件验证失败
- THEN:阅读
reference/validation-tools.md - COVERS:CLI验证,自动修复脚本
何时使用TOON
好候选:
- 统一的表格数据(类似对象的列表)
- 文档索引和清单
- 重复的键值结构
- 任何被馈送到LLMs的结构化数据
使用JSON代替:
- 深层嵌套结构
- 非统一数据(混合模式)
- 需要频繁程序操作的数据
- 由工具读取的配置文件
TOON语法
键值(YAML风格)
name: 约翰
age: 30
active: true
带有显式长度的数组
tags[3]: 红色,绿色,蓝色
表格数据(主要用例)
# 语法:name[count]{col1,col2,col3}:
# 后跟2个空格缩进的CSV风格行
users[3]{id,name,email}:
1,约翰,john@example.com
2,简,jane@example.com
3,鲍勃,bob@example.com
重要:行必须用2个空格缩进。总是在最后一行后添加一个空白行。
单元格中的嵌套数组
使用分号或引号包含多个项目的值:
pages[2]{path,keywords,priority}:
/intro,"概览;基础;开始",核心
/api,"参考;方法;类型",核心
多行字符串
使用引号字符串和 进行换行:
description: "这是一个多行
字符串值,保留
换行。"
嵌套对象
config:
database:
host: 本地主机
port: 5432
cache:
enabled: true
编码模式用于文档
索引文件
meta:
category: 库
generated: 2025-01-15T10:30:00Z
count: 5
items[5]{id,name,description,path,keywords}:
baml,BAML,结构化LLM输出,ai-docs/libraries/baml/_index.toon,"llm;类型;结构化"
mcp,MCP,工具集成协议,ai-docs/libraries/mcp/_index.toon,"工具;上下文;服务器"
prisma,Prisma,类型安全数据库ORM,ai-docs/libraries/prisma/_index.toon,"数据库;ORM;SQL"
页面摘要
meta:
library: baml
page: 错误处理
source_url: https://docs.boundaryml.com/guide/error-handling
content_hash: a3f2c1d4e5
summary:
purpose: "配置重试策略和回退策略,以实现弹性LLM调用。"
key_concepts[4]: 重试策略,回退客户端,超时,指数退避
gotchas[2]: 默认超时60秒可能太短,重试次数计入速率限制
code_patterns[1]:
- lang: baml
desc: 重试策略配置
code: "retry_policy 弹性 {
max_retries 3
strategy 指数
}"
令牌比较
JSON(约280个令牌):
{"pages":[{"path":"/intro","section":"guide","title":"介绍","priority":"核心"},{"path":"/setup","section":"guide","title":"设置","priority":"核心"}]}
TOON(约100个令牌):
pages[2]{path,section,title,priority}:
/intro,guide,介绍,核心
/setup,guide,设置,核心
节省:~64%
工具和库
- TypeScript/JS:
@toon-format/toon(npm) - Python:
python-toon(pip) - 在线:https://toontools.vercel.app/playground
- 规范:https://toonformat.dev/
最佳实践
- 尽可能为表格表示设计数据结构
- 使用显式的
[count]用于数组 - 有助于LLM解析 - 保持JSON作为规范源,TOON用于LLM传输
- 使用分号用于嵌套数组(例如,“val1;val2;val3”)
- 截断长字符串(代码片段<200字符)
- 总是在表格数组后添加一个空白行以终止它们
格式约束
由官方@toon-format/cli强制执行(使用--decode进行验证):
| 规则 | ❌ 不正确 | ✅ 正确 |
|---|---|---|
| 无注释 | # comment |
(完全删除注释) |
| 无YAML风格列表 | - item |
key[N]{col}: + 缩进行 |
| 行必须缩进 | row,data |
row,data(2个空格) |
| 数组需要计数+列 | items{a,b}: |
items[3]{a,b}: |
| 无多行字符串 | key: | |
`key: "line1 |
| line2"` | ||
| 无管道分隔符 | val|val |
val,val 或 "val;val" |
| 表格单元格中无逗号 | "a,b" |
"a;b" |
| 数组后空白行 | 缺少终止符 | 在最后一行后添加空白行 |
验证工具:
# 使用官方CLI进行验证(使用--decode,而不是validate!)
npx @toon-format/cli --decode file.toon > /dev/null
# 自动修复常见问题(按此顺序运行)
python3 .claude/ai-dev-kit/dev-tools/scripts/fix_toon_comments.py path/
python3 .claude/ai-dev-kit/dev-tools/scripts/fix_toon_yaml_lists.py path/
python3 .claude/ai-dev-kit/dev-tools/scripts/fix_toon_nested_lists.py path/
python3 .claude/ai-dev-kit/dev-tools/scripts/fix_toon_commas.py path/
python3 .claude/ai-dev-kit/dev-tools/scripts/fix_toon_pipes.py path/
python3 .claude/ai-dev-kit/dev-tools/scripts/fix_toon_multiline.py path/
python3 .claude/ai-dev-kit/dev-tools/scripts/fix_toon_blank_lines.py path/