Json result formatting
[COLM'26] SkillLearnBench is the first benchmark for evaluating continual learning methods that automatically generate agent skills.
npx -y skills add cxcscmu/SkillLearnBench --skill json-result-formattingAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
What its author says it does
Copied from the file, not written here
Format query results to JSON with proper structure and token tracking
SKILL.md
4.3 KB, as published. Nobody here has run it
JSON Result Formatting
Overview
Formatting retrieved data into standardized JSON output with answer lists and token tracking.
Use Cases
- Writing query results to JSON files
- Formatting answers as lists regardless of count
- Tracking API token consumption
- Creating consistent output files for downstream processing
Required Output Format
{
"q1": {"answer": ["xxx"], "tokens": 123},
"q2": {"answer": ["xxx", "yyy"], "tokens": 456},
"q3": {"answer": [], "tokens": 789}
}
Code Examples
Initialize Result Container
import json
result = {
"q1": {"answer": [], "tokens": 0},
"q2": {"answer": [], "tokens": 0},
"q3": {"answer": [], "tokens": 0}
}
Add Single Answer
def add_answer(result, question_key, answer_items, tokens=0):
"""Add answer as list (always list format)"""
# Ensure answer_items is a list
if isinstance(answer_items, str):
answer_items = [answer_items]
elif not isinstance(answer_items, list):
answer_items = list(answer_items)
result[question_key] = {
"answer": answer_items,
"tokens": int(tokens)
}
return result
# Usage
result = add_answer(result, "q1", ["eid_1e9356f5"], tokens=150)
result = add_answer(result, "q2", employee_ids_list, tokens=200)
Write to JSON File
import json
def write_result_file(result, filepath):
"""Write result to JSON file"""
with open(filepath, 'w') as f:
json.dump(result, f, indent=4)
print(f"Results written to {filepath}")
# Usage
write_result_file(result, '/root/answer.json')
Track Token Usage (Without API)
import json
# For local data processing, estimate tokens
def estimate_tokens_from_text(text):
"""Rough estimation: ~4 characters per token"""
return len(text) // 4
# Better: track actual API usage
def track_tokens(usage_dict):
"""Track from API response"""
if hasattr(usage_dict, 'input_tokens'):
return usage_dict.input_tokens + usage_dict.output_tokens
return 0
Complete Result Building Flow
import json
# Initialize
result = {
"q1": {"answer": [], "tokens": 0},
"q2": {"answer": [], "tokens": 0},
"q3": {"answer": [], "tokens": 0}
}
# Q1: Authors and reviewers
authors = ["eid_1e9356f5"]
reviewers = ["eid_06cddbb3", "eid_99835861"]
result["q1"]["answer"] = authors + reviewers
result["q1"]["tokens"] = 150 # Estimated or tracked
# Q2: Competitor insights team members
competitor_team = ["eid_xxx", "eid_yyy"]
result["q2"]["answer"] = competitor_team
result["q2"]["tokens"] = 200
# Q3: Demo URLs
urls = ["https://example.com/demo1", "https://example.com/demo2"]
result["q3"]["answer"] = urls
result["q3"]["tokens"] = 100
# Write output
with open('/root/answer.json', 'w') as f:
json.dump(result, f, indent=4)
Best Practices
-
Always Use Lists
- Single item:
["value"]not"value" - Multiple items:
["item1", "item2"] - Empty:
[]notnull
- Single item:
-
Token Tracking
- For Claude API: Use
response.usage.input_tokens + response.usage.output_tokens - For local processing: Track API calls made and sum their tokens
- If no API: Use 0 or estimate conservatively
- For Claude API: Use
-
Data Validation
# Ensure no duplicates result["q1"]["answer"] = list(set(result["q1"]["answer"])) # Ensure proper types result["q2"]["tokens"] = int(result["q2"]["tokens"]) -
Indent and Format
# Always use proper formatting json.dump(data, f, indent=4)
Validation Checklist
- All question keys present (q1, q2, q3)
- All answers are lists
- All token counts are integers
- No null values (use empty list [] instead)
- Output file is valid JSON
- Can be loaded with
json.load()
Testing Output
import json
# Verify output file
with open('/root/answer.json', 'r') as f:
data = json.load(f)
# Check structure
for q_key, q_data in data.items():
assert "answer" in q_data
assert "tokens" in q_data
assert isinstance(q_data["answer"], list)
assert isinstance(q_data["tokens"], int)
print(f"{q_key}: {len(q_data['answer'])} items, {q_data['tokens']} tokens")