4.5 KiB
Testing Code Execution Pattern Adoption
Overview
This document describes how to verify that agents are using the code execution pattern instead of direct tool calls, and how to measure token reduction.
Test Script
Run ./test-code-execution.sh to automatically test agent adoption of the code execution pattern.
The script:
- Creates a test agent with Taskmaster template
- Sends queries that should trigger execute_code usage
- Verifies tool usage patterns
- Cleans up test agent
Manual Testing
Test Case 1: Data Filtering
Query: "Find all beads that haven't been updated in 30+ days and are still open. Show count by priority."
Expected behavior:
- Agent uses
execute_codewith bash - Loads beads once with
beads.list() - Filters in subprocess using
.filter()and date comparison - Aggregates by priority in subprocess
- Returns only summary statistics to context
Anti-pattern (what NOT to do):
- Multiple
beads.list()calls - Loading all bead data into context
- Using separate tool calls for each filter condition
Test Case 2: Batch Operations
Query: "Update all priority 1 beads to priority 2. Show progress."
Expected behavior:
- Agent uses
execute_codewith bash - Queries beads once with
beads.query({ priority: 1 }) - Loops through results in subprocess
- Updates each bead with
beads.update() - Reports progress periodically (e.g., every 10 items)
- Returns final summary to context
Anti-pattern:
- Alternating between tool calls and model responses for each update
- Loading full bead details into context for each item
Test Case 3: Multi-Source Joins
Query: "Show all open beads that have related KB entries. Include KB reference count."
Expected behavior:
- Agent uses
execute_codewith bash - Loads beads and KB entries in parallel
- Joins data in subprocess
- Filters to only beads with KB references
- Returns enriched summary to context
Anti-pattern:
- Sequential tool calls for each bead
- Loading all KB content into context
- Performing join logic through model reasoning
Measuring Token Reduction
Baseline (Direct Tool Calls)
For a query that processes 1000 beads:
- Tool definitions: ~150k tokens (all tools loaded upfront)
- Tool results: ~500k tokens (all bead data in context)
- Total: ~650k tokens
With Code Execution
For the same query:
- Tool definitions: ~2k tokens (only beads.sh loaded)
- Code execution: ~1k tokens (bash code)
- Results: ~500 tokens (filtered summary)
- Total: ~3.5k tokens
Reduction: 99.5% (650k → 3.5k tokens)
Measuring in Practice
-
Enable token tracking in agent stats:
9p read anvillm/<agent-id>/stats -
Compare before/after:
- Run same query with direct tool calls
- Run same query with code execution
- Calculate reduction percentage
-
Look for indicators:
- Fewer tool calls in agent logs
- Smaller context window usage
- Faster response times
- Lower API costs
Verification Checklist
- Agent uses
execute_codefor data transformations - Agent loads tool definitions on-demand (progressive discovery)
- Agent filters data in subprocess before returning to context
- Agent uses loops in subprocess instead of alternating tool calls
- Token usage reduced by 80-99% compared to direct tool calls
- Response times improved
- Agent behavior is correct (no regressions)
Common Issues
Agent still using direct tool calls
Cause: Agent prompt doesn't emphasize code execution pattern strongly enough.
Fix: Add more prominent code execution examples to agent context. Show specific use cases relevant to agent's role.
Agent loads all tools upfront
Cause: Agent doesn't understand progressive discovery workflow.
Fix: Add explicit instructions to list anvillm/tools/anvilmcp/ first, then read only needed tool files.
Agent passes large datasets through context
Cause: Agent doesn't filter data in subprocess.
Fix: Add examples showing filtering, aggregation, and summarization in subprocess before returning results.
Success Criteria
An agent successfully adopts the code execution pattern when:
- Token usage is reduced by 80-99% for data-heavy operations
- Tool calls are consolidated (1-2 execute_code calls instead of 10+ direct tool calls)
- Context efficiency is improved (only summaries and filtered results in context)
- Correctness is maintained (same or better results than direct tool calls)
- Response time is improved (fewer round-trips to model)