Key benefits:
- Clear task structure: schema.org Action types define what the agent should do
- Expected output format: Specify result type so agents return consistent data
- Token efficiency: 30-60% fewer tokens than JSON = more context for agent reasoning
- Semantic interoperability: Standard vocabulary eliminates ambiguity
Nested: Indentation (2 spaces)
Simple array: items[3]: a,b,c
Tabular array (uniform objects):
users[2,]{id,name}:
1,Alice
2,Bob
@type: SearchAction
@id: task-001
description: Find all error handling patterns in the codebase
object:
@type: SoftwareSourceCode
codeRepository: ./src
expectedResult:
@type: ItemList
description: Files with error handling patterns
The agent knows:
- What to do: SearchAction = find/search
- What to search: object defines the target
- What to return: expectedResult specifies format
[Task description in natural language]
Input:
[TOON block with @type, @id, and structured data]
Return your result in TOON format using:
- @type: [expected type, e.g., ItemList, Report, SearchAction]
- @id: [task-id]-result
- Use tabular notation for lists
name: Alice
age: 30
active: true
score: null
Types auto-detected: strings, numbers, booleans, null.
tags[3]: red,green,blue
ids[4]: 1,2,3,4
Format: key[count]: item1,item2,...
users[3,]{id,name,role}:
1,Alice,admin
2,Bob,user
3,Carol,user
Format: key[rowCount,]{col1,col2,...}:
Each row provides values in column order, comma-separated.
@type: Person
@id: user-123
name: Alice
email: alice@example.com
| Status | Meaning |
|---|---|
PotentialActionStatus |
Not yet started |
ActiveActionStatus |
In progress |
CompletedActionStatus |
Successfully finished |
FailedActionStatus |
Failed with error |
@type: SearchAction
@id: search-001
actionStatus: CompletedActionStatus
query: auth handlers
resultCount: 3
@type: CreateAction
@id: create-file-001
actionStatus: CompletedActionStatus
result:
@type: SoftwareSourceCode
name: auth.ts
programmingLanguage: TypeScript
agent:
@type: SoftwareApplication
name: CodeAgent
| Instead of | Use | schema.org property |
|---|---|---|
file |
name |
Thing.name |
path |
url |
Thing.url |
content |
text |
CreativeWork.text |
created |
dateCreated |
CreativeWork.dateCreated |
author |
author |
CreativeWork.author |
count |
numberOfItems |
ItemList.numberOfItems |
items |
itemListElement |
ItemList.itemListElement |
error |
error |
Action.error |
Process this item list:
@type: ItemList
@id: pending-review
numberOfItems: 3
itemListElement[3,]{@type,identifier,name,status}:
Product,A1,Widget,pending
Product,A2,Gadget,shipped
Product,A3,Gizmo,pending
Return pending items as an ItemList in TOON format.
Return your answer in TOON format:
- Use appropriate schema.org @type (Action, ItemList, etc.)
- Include @id for the result object
- Use schema.org property names (name, description, result)
- Use tabular notation for uniform lists
- Wrap in ```toon code block
@type: SearchAction
@id: task-001
description: Find all authentication handlers
object:
@type: SoftwareSourceCode
codeRepository: ./src
expectedResult:
@type: ItemList
description: Files with auth handlers
@type: SearchAction
@id: task-001
actionStatus: CompletedActionStatus
result:
@type: ItemList
@id: task-001-result
numberOfItems: 3
itemListElement[3,]{@type,name,url,description}:
SoftwareSourceCode,handleLogin,src/auth.ts:42,Login handler
SoftwareSourceCode,handleLogout,src/auth.ts:78,Logout handler
SoftwareSourceCode,authGuard,src/middleware.ts:15,Auth middleware
def extract_toon(response: str) -> str:
if "```toon" in response:
return response.split("```toon")[1].split("```")[0].strip()
elif "```" in response:
return response.split("```")[1].split("```")[0].strip()
return response.strip()
from toon_format import encode, decode, estimate_savings
# Python dict to TOON
toon_str = encode(data, options={})
# TOON to Python dict
data = decode(toon_str, options={})
# Check efficiency
stats = estimate_savings(data)
# Returns: {"json_tokens": N, "toon_tokens": M, "savings_percent": X}
| Value | Requires Quotes | Reason |
|---|---|---|
"" |
Yes | Empty string |
"true" |
Yes | Boolean keyword as string |
"123" |
Yes | Numeric string (not number) |
"a,b" |
Yes | Contains delimiter |
Unquoted values are parsed as their natural type.
- Every object has
@type(schema.org type) and@id - Property names follow schema.org conventions
- Actions use appropriate
actionStatusvalues - Tabular notation used for uniform
itemListElementarrays - Code blocks tagged with
toonlanguage - Data round-trips correctly:
decode(encode(data)) == data
result: @type: ItemList @id: search-auth-001-result numberOfItems: 3
itemListElement[3,]{@type,name,url,description}: SoftwareSourceCode,handleLogin,src/auth.ts:42,Login handler SoftwareSourceCode,handleLogout,src/auth.ts:78,Logout handler SoftwareSourceCode,authGuard,src/middleware.ts:15,Auth middleware
</example>
<example name="create_action">
```toon
@type: CreateAction
@id: create-component-001
actionStatus: CompletedActionStatus
description: Create React component
result:
@type: SoftwareSourceCode
@id: button-component
name: Button.tsx
url: src/components/Button.tsx
programmingLanguage: TypeScript
dateCreated: 2025-01-15
result: @type: Report @id: validate-005-report name: Validation Report reportStatus: NeedsAttention
itemListElement[2,]{@type,name,description}: Warning,missing-desc,Description field is empty Info,add-examples,Consider adding examples
</example>
<example name="item_list">
```toon
@type: ItemList
@id: pending-tasks
description: Tasks awaiting review
numberOfItems: 3
itemListElement[3,]{@type,identifier,name,status}:
Action,task-001,Implement auth,PotentialActionStatus
Action,task-002,Add tests,ActiveActionStatus
Action,task-003,Update docs,PotentialActionStatus
Converted and distributed by TomeVault — claim your Tome and manage your conversions.