* docs: fix agent name casing in documentation - Update all instances of 'openagent' to 'OpenAgent' - Update all instances of 'opencoder' to 'OpenCoder' - Fixes #115: --agent flag is case-sensitive The --agent flag requires capitalized agent names (OpenAgent, OpenCoder) but documentation showed lowercase versions, causing confusion for users. Updated README.md and all docs/ files to use correct casing. * refactor: migrate from grok-code to big-pickle model - Remove model specification from contextscout.md subagent - Update eval YAML files to use opencode/big-pickle - Update documentation to reference big-pickle as default - Fixes compatibility as grok-code-fast is no longer available Files updated: - .opencode/agent/subagents/core/contextscout.md - evals/agents/shared/tests/golden/00-smoke-test.yaml - evals/agents/shared/tests/golden/02-delegation-test.yaml - evals/README.md - evals/EVAL_FRAMEWORK_GUIDE.md
659 lines
17 KiB
Markdown
659 lines
17 KiB
Markdown
# OpenCode Agent Evaluation Framework - Complete Guide
|
|
|
|
**Comprehensive SDK-based evaluation framework for testing OpenCode agents with real execution, event streaming, and automated validation.**
|
|
|
|
Last Updated: November 27, 2025
|
|
|
|
---
|
|
|
|
## 📋 Table of Contents
|
|
|
|
1. [Quick Start](#quick-start)
|
|
2. [What This Framework Does](#what-this-framework-does)
|
|
3. [How Tests Work](#how-tests-work)
|
|
4. [Writing Tests](#writing-tests)
|
|
5. [Validation Features](#validation-features)
|
|
6. [Running Tests](#running-tests)
|
|
7. [Understanding Results](#understanding-results)
|
|
8. [Troubleshooting](#troubleshooting)
|
|
9. [Key Learnings](#key-learnings)
|
|
|
|
---
|
|
|
|
## 🚀 Quick Start
|
|
|
|
```bash
|
|
# Install and build
|
|
cd evals/framework
|
|
npm install
|
|
npm run build
|
|
|
|
# Run all tests (uses free model by default)
|
|
npm run eval:sdk
|
|
|
|
# Run specific agent
|
|
npm run eval:sdk -- --agent=openagent
|
|
npm run eval:sdk -- --agent=opencoder
|
|
|
|
# Debug mode (verbose output, keeps sessions)
|
|
npm run eval:sdk -- --debug
|
|
|
|
# View results dashboard
|
|
cd ../results && ./serve.sh
|
|
```
|
|
|
|
---
|
|
|
|
## 🎯 What This Framework Does
|
|
|
|
### Purpose
|
|
Validates that OpenCode agents follow their defined rules and behaviors through **real execution** with actual sessions, not mocks.
|
|
|
|
### Key Capabilities
|
|
|
|
✅ **Real Execution** - Creates actual OpenCode sessions, sends prompts, captures responses
|
|
✅ **Event Streaming** - Monitors all events (tool calls, messages, permissions) in real-time
|
|
✅ **Automated Validation** - Runs evaluators to check compliance with agent rules
|
|
✅ **Content Validation** - Verifies file contents, not just that tools were called
|
|
✅ **Subagent Verification** - Validates delegation and subagent behavior
|
|
✅ **Enhanced Logging** - Captures full tool inputs/outputs with timing
|
|
✅ **Multi-turn Support** - Handles approval workflows and complex conversations
|
|
|
|
### What Gets Tested
|
|
|
|
| Validation Type | What It Checks |
|
|
|----------------|----------------|
|
|
| **Approval Gate** | Agent asks for approval before executing risky operations |
|
|
| **Context Loading** | Agent loads required context files before execution |
|
|
| **Delegation** | Agent delegates complex tasks (4+ files) to task-manager |
|
|
| **Tool Usage** | Agent uses correct tools for the task |
|
|
| **Behavior** | Agent follows expected behavior patterns |
|
|
| **Subagent** | Subagents execute correctly when delegated |
|
|
| **Content** | Files contain expected content and patterns |
|
|
|
|
---
|
|
|
|
## 🔧 How Tests Work
|
|
|
|
### Test Execution Flow
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ TEST RUNNER │
|
|
├─────────────────────────────────────────────────────────────────┤
|
|
│ 1. Clean test_tmp/ directory │
|
|
│ 2. Start opencode server (from git root) │
|
|
│ 3. For each test: │
|
|
│ a. Create session with specified agent │
|
|
│ b. Send prompt(s) (single or multi-turn) │
|
|
│ c. Capture events via event stream │
|
|
│ d. Extract tool inputs/outputs (enhanced logging) │
|
|
│ e. Run evaluators on session data │
|
|
│ f. Validate behavior expectations │
|
|
│ g. Check content expectations │
|
|
│ h. Verify subagent behavior (if delegated) │
|
|
│ i. Delete session (unless --debug) │
|
|
│ 4. Clean test_tmp/ directory │
|
|
│ 5. Generate results (JSON + dashboard) │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
### Where Data Lives
|
|
|
|
**During Test Execution:**
|
|
```
|
|
~/.local/share/opencode/storage/
|
|
├── session/ # Session metadata (by project hash)
|
|
├── message/ # Messages per session (ses_xxx/)
|
|
├── part/ # Tool calls, text parts, etc.
|
|
└── session_diff/ # Session changes
|
|
```
|
|
|
|
**Test Results:**
|
|
```
|
|
evals/results/
|
|
├── latest.json # Most recent run
|
|
├── history/2025-11/ # Historical runs
|
|
└── index.html # Interactive dashboard
|
|
```
|
|
|
|
### Event Stream Monitoring
|
|
|
|
The framework listens to the OpenCode event stream and captures:
|
|
|
|
```typescript
|
|
// Events captured in real-time
|
|
- session.created/updated
|
|
- message.created/updated
|
|
- part.created/updated (includes tool calls)
|
|
- permission.request/response
|
|
|
|
// Enhanced with tool details (NEW)
|
|
- Tool name, input, output
|
|
- Start time, end time, duration
|
|
- Success/error status
|
|
```
|
|
|
|
---
|
|
|
|
## ✍️ Writing Tests
|
|
|
|
### Basic Test Structure
|
|
|
|
```yaml
|
|
id: my-test-001
|
|
name: My Test Name
|
|
description: What this test validates
|
|
|
|
category: developer # developer, business, creative, edge-case
|
|
agent: openagent # openagent, opencoder
|
|
model: opencode/big-pickle # Optional, defaults to free tier
|
|
|
|
# Single prompt (simple tests)
|
|
prompt: |
|
|
Create a function called add in math.ts
|
|
|
|
# OR Multi-turn prompts (for approval workflows)
|
|
prompts:
|
|
- text: |
|
|
Create a function called add in math.ts
|
|
expectContext: true
|
|
contextFile: ".opencode/context/core/standards/code.md"
|
|
|
|
- text: "Yes, proceed with the plan."
|
|
delayMs: 2000
|
|
|
|
# Expected behavior
|
|
behavior:
|
|
mustUseTools: [read, write]
|
|
requiresApproval: true
|
|
requiresContext: true
|
|
minToolCalls: 2
|
|
|
|
# Expected violations (should NOT violate these)
|
|
expectedViolations:
|
|
- rule: approval-gate
|
|
shouldViolate: false
|
|
severity: error
|
|
|
|
# Approval strategy
|
|
approvalStrategy:
|
|
type: auto-approve
|
|
|
|
timeout: 120000
|
|
```
|
|
|
|
### Multi-Turn Tests (Critical for OpenAgent)
|
|
|
|
**Why Multi-Turn?** OpenAgent requires approval before execution. Single-turn tests will fail because the agent asks for approval but never receives it.
|
|
|
|
```yaml
|
|
# ❌ WRONG - Single turn (agent asks approval, never gets it)
|
|
prompt: "Create a file at test.txt"
|
|
|
|
# ✅ CORRECT - Multi-turn (agent asks, user approves)
|
|
prompts:
|
|
- text: "Create a file at test.txt"
|
|
- text: "Yes, proceed."
|
|
delayMs: 2000
|
|
```
|
|
|
|
---
|
|
|
|
## 🎨 Validation Features
|
|
|
|
### 1. Content Validation (NEW)
|
|
|
|
Validates the **actual content** of files written/edited:
|
|
|
|
```yaml
|
|
behavior:
|
|
mustUseTools: [write]
|
|
|
|
contentExpectations:
|
|
- filePath: "src/math.ts"
|
|
mustContain:
|
|
- "export function add"
|
|
- ": number"
|
|
mustNotContain:
|
|
- "console.log"
|
|
- "any"
|
|
minLength: 100
|
|
maxLength: 500
|
|
```
|
|
|
|
**Validation Types:**
|
|
- `mustContain` - Required patterns (40% weight)
|
|
- `mustNotContain` - Forbidden patterns (30% weight)
|
|
- `mustMatch` - Regex pattern (20% weight)
|
|
- `minLength` - Minimum content length (5% weight)
|
|
- `maxLength` - Maximum content length (5% weight)
|
|
|
|
### 2. Subagent Verification (NEW)
|
|
|
|
Validates delegation and subagent behavior:
|
|
|
|
```yaml
|
|
behavior:
|
|
mustUseTools: [task]
|
|
shouldDelegate: true
|
|
|
|
delegationExpectations:
|
|
subagentType: "CoderAgent"
|
|
subagentMustUseTools: [write, read]
|
|
subagentMinToolCalls: 2
|
|
subagentMustComplete: true
|
|
```
|
|
|
|
**Checks:**
|
|
- Correct subagent type invoked (30% weight)
|
|
- Subagent used required tools (40% weight)
|
|
- Minimum tool calls met (20% weight)
|
|
- Subagent completed successfully (10% weight)
|
|
|
|
### 3. Enhanced Approval Detection (NEW)
|
|
|
|
More sophisticated approval validation:
|
|
|
|
```yaml
|
|
behavior:
|
|
requiresApproval: true
|
|
|
|
approvalExpectations:
|
|
minConfidence: high # high, medium, low
|
|
approvalMustMention:
|
|
- "file"
|
|
- "create"
|
|
requireExplicitApproval: true
|
|
```
|
|
|
|
### 4. Debug Options (NEW)
|
|
|
|
Enhanced debugging capabilities:
|
|
|
|
```yaml
|
|
behavior:
|
|
debug:
|
|
logToolDetails: true # Log all tool I/O
|
|
saveReplayOnFailure: true # Save session for replay
|
|
exportMarkdown: true # Export to markdown
|
|
```
|
|
|
|
### 5. Tool Usage Validation
|
|
|
|
```yaml
|
|
behavior:
|
|
# Must use these tools
|
|
mustUseTools: [read, write]
|
|
|
|
# Must use at least one of these sets
|
|
mustUseAnyOf: [[bash], [list]]
|
|
|
|
# May use these (optional)
|
|
mayUseTools: [glob, grep]
|
|
|
|
# Must NOT use these
|
|
mustNotUseTools: [edit]
|
|
|
|
# Tool call count
|
|
minToolCalls: 2
|
|
maxToolCalls: 10
|
|
```
|
|
|
|
---
|
|
|
|
## 🏃 Running Tests
|
|
|
|
### Basic Commands
|
|
|
|
```bash
|
|
# Run all tests
|
|
npm run eval:sdk
|
|
|
|
# Run specific agent
|
|
npm run eval:sdk -- --agent=openagent
|
|
|
|
# Run with debug output
|
|
npm run eval:sdk -- --debug
|
|
|
|
# Filter tests by pattern
|
|
npm run eval:sdk -- --agent=openagent --filter="context-loading"
|
|
```
|
|
|
|
### Batch Execution (Avoid Rate Limits)
|
|
|
|
```bash
|
|
# Run in batches of 3 with 10s delays
|
|
cd evals/framework/scripts/utils
|
|
./run-tests-batch.sh openagent 3 10
|
|
```
|
|
|
|
### Debug Mode Features
|
|
|
|
When running with `--debug`:
|
|
- ✅ Full event logging with tool I/O
|
|
- ✅ Sessions kept for inspection
|
|
- ✅ Detailed timeline output
|
|
- ✅ Tool duration tracking
|
|
|
|
**Example Debug Output:**
|
|
```
|
|
────────────────────────────────────────────────────────────
|
|
🔧 TOOL: write (completed)
|
|
────────────────────────────────────────────────────────────
|
|
|
|
📥 INPUT:
|
|
{
|
|
"filePath": "test.ts",
|
|
"content": "export function add..."
|
|
}
|
|
|
|
📤 OUTPUT:
|
|
{
|
|
"success": true,
|
|
"bytesWritten": 67
|
|
}
|
|
|
|
⏱️ Duration: 12ms
|
|
────────────────────────────────────────────────────────────
|
|
```
|
|
|
|
---
|
|
|
|
## 📊 Understanding Results
|
|
|
|
### Test Output
|
|
|
|
```
|
|
============================================================
|
|
Running test: ctx-code-001 - Code Task with Context Loading
|
|
============================================================
|
|
Approval strategy: Auto-approve all permission requests
|
|
Creating session...
|
|
Session created: ses_abc123
|
|
Agent: openagent
|
|
Model: anthropic/claude-sonnet-4-5
|
|
|
|
Sending 2 prompts (multi-turn)...
|
|
Prompt 1/2: Create a function...
|
|
Completed
|
|
Prompt 2/2: Yes, proceed...
|
|
Completed
|
|
|
|
Running evaluators...
|
|
✅ approval-gate: PASSED
|
|
✅ context-loading: PASSED
|
|
✅ tool-usage: PASSED
|
|
✅ behavior: PASSED
|
|
✅ content: PASSED
|
|
|
|
Test PASSED
|
|
Duration: 35142ms
|
|
Events captured: 116
|
|
```
|
|
|
|
### Results Dashboard
|
|
|
|
```bash
|
|
cd evals/results
|
|
./serve.sh
|
|
# Open http://localhost:8000
|
|
```
|
|
|
|
**Dashboard Features:**
|
|
- Filter by agent, category, status
|
|
- View violation details
|
|
- See test trends over time
|
|
- Export results
|
|
|
|
### Understanding Violations
|
|
|
|
```
|
|
Violations Detected:
|
|
1. [error] missing-required-tool: Required tool 'write' was not used
|
|
2. [error] missing-required-patterns: File missing: export function
|
|
3. [warning] over-delegation: Delegated for < 4 files (acceptable)
|
|
```
|
|
|
|
**Severity Levels:**
|
|
- `error` - Test fails
|
|
- `warning` - Test passes but flagged
|
|
- `info` - Informational only
|
|
|
|
---
|
|
|
|
## 🔍 Troubleshooting
|
|
|
|
### Common Issues
|
|
|
|
#### 1. Tests Failing with "No tool calls"
|
|
|
|
**Problem:** Agent responds but doesn't execute tools.
|
|
|
|
**Cause:** Single-turn test when multi-turn needed (OpenAgent requires approval).
|
|
|
|
**Solution:**
|
|
```yaml
|
|
# Change from:
|
|
prompt: "Create a file"
|
|
|
|
# To:
|
|
prompts:
|
|
- text: "Create a file"
|
|
- text: "Yes, proceed."
|
|
delayMs: 2000
|
|
```
|
|
|
|
#### 2. Duplicate Test IDs
|
|
|
|
**Problem:** Same test ID appears in multiple files.
|
|
|
|
**Cause:** Old and new test structures both present.
|
|
|
|
**Solution:** Ensure unique test IDs across all test files.
|
|
|
|
```bash
|
|
# Check for duplicates
|
|
find evals/agents/*/tests -name "*.yaml" -exec grep "^id:" {} \; | sort | uniq -d
|
|
```
|
|
|
|
#### 3. Context Not Loading
|
|
|
|
**Problem:** Context loading evaluator fails.
|
|
|
|
**Cause:** Context file read before first prompt sent.
|
|
|
|
**Solution:** Use `expectContext: true` on the prompt that needs context:
|
|
|
|
```yaml
|
|
prompts:
|
|
- text: "Create a function"
|
|
expectContext: true
|
|
contextFile: ".opencode/context/core/standards/code.md"
|
|
```
|
|
|
|
#### 4. Content Validation Fails
|
|
|
|
**Problem:** Content expectations not met.
|
|
|
|
**Cause:** File content doesn't match expectations.
|
|
|
|
**Debug:**
|
|
```bash
|
|
# Run with debug to see actual content
|
|
npm run eval:sdk -- --debug --filter="your-test"
|
|
|
|
# Check the file that was written
|
|
cat evals/test_tmp/your-file.ts
|
|
```
|
|
|
|
---
|
|
|
|
## 🎓 Key Learnings
|
|
|
|
### 1. Duplicate Test IDs Are Dangerous
|
|
|
|
**Problem:** When multiple test files have the same `id`, the test runner loads both but only one executes (unpredictably).
|
|
|
|
**Solution:** Always ensure unique test IDs. Use a naming convention:
|
|
```
|
|
{category}-{feature}-{number}
|
|
ctx-code-001
|
|
ctx-docs-002
|
|
```
|
|
|
|
### 2. Multi-Turn is Essential for OpenAgent
|
|
|
|
**Problem:** OpenAgent asks for approval before execution. Single-turn tests fail because the agent never receives approval.
|
|
|
|
**Solution:** Always use multi-turn prompts for OpenAgent:
|
|
```yaml
|
|
prompts:
|
|
- text: "Do the task"
|
|
- text: "Yes, proceed."
|
|
delayMs: 2000
|
|
```
|
|
|
|
### 3. Content Validation > Tool Usage
|
|
|
|
**Problem:** Checking IF a tool was called doesn't verify WHAT it did.
|
|
|
|
**Solution:** Use content expectations to validate actual output:
|
|
```yaml
|
|
behavior:
|
|
mustUseTools: [write] # Checks IF write was called
|
|
|
|
contentExpectations: # Checks WHAT was written
|
|
- filePath: "test.ts"
|
|
mustContain: ["export", "function"]
|
|
```
|
|
|
|
### 4. Enhanced Logging is Foundational
|
|
|
|
**Problem:** Without tool I/O logging, debugging failures is difficult.
|
|
|
|
**Solution:** Enhanced event logging captures everything:
|
|
- Tool inputs and outputs
|
|
- Duration per tool
|
|
- Error details
|
|
- Enables content validation and subagent verification
|
|
|
|
### 5. Backward Compatibility Matters
|
|
|
|
**Problem:** Adding new features can break existing tests.
|
|
|
|
**Solution:** Make all new fields optional:
|
|
```typescript
|
|
contentExpectations?: ContentExpectation[]; // Optional
|
|
delegationExpectations?: DelegationExpectation; // Optional
|
|
```
|
|
|
|
---
|
|
|
|
## 📁 Directory Structure
|
|
|
|
```
|
|
evals/
|
|
├── framework/ # Test framework code
|
|
│ ├── src/
|
|
│ │ ├── evaluators/ # Validation logic
|
|
│ │ │ ├── approval-gate-evaluator.ts
|
|
│ │ │ ├── context-loading-evaluator.ts
|
|
│ │ │ ├── delegation-evaluator.ts
|
|
│ │ │ ├── tool-usage-evaluator.ts
|
|
│ │ │ ├── behavior-evaluator.ts
|
|
│ │ │ ├── subagent-evaluator.ts # NEW
|
|
│ │ │ └── content-evaluator.ts # NEW
|
|
│ │ ├── sdk/ # Test execution
|
|
│ │ │ ├── test-runner.ts
|
|
│ │ │ ├── test-executor.ts
|
|
│ │ │ ├── event-stream-handler.ts # Enhanced
|
|
│ │ │ ├── event-logger.ts # Enhanced
|
|
│ │ │ └── test-case-schema.ts # Updated
|
|
│ │ └── types/ # TypeScript types
|
|
│ └── package.json
|
|
│
|
|
├── agents/ # Agent-specific tests
|
|
│ ├── openagent/
|
|
│ │ └── tests/
|
|
│ │ ├── 01-critical-rules/
|
|
│ │ ├── 02-workflow-stages/
|
|
│ │ ├── 03-delegation/
|
|
│ │ ├── 04-execution-paths/
|
|
│ │ ├── 05-edge-cases/
|
|
│ │ └── 06-integration/
|
|
│ └── opencoder/
|
|
│ └── tests/
|
|
│
|
|
├── results/ # Test results
|
|
│ ├── latest.json
|
|
│ ├── history/
|
|
│ └── index.html # Dashboard
|
|
│
|
|
└── test_tmp/ # Temporary test files
|
|
```
|
|
|
|
---
|
|
|
|
## 🚀 Next Steps
|
|
|
|
### For Test Writers
|
|
|
|
1. **Start Simple** - Write basic tests first, add complexity later
|
|
2. **Use Multi-Turn** - Always for OpenAgent approval workflows
|
|
3. **Validate Content** - Don't just check tools, check outputs
|
|
4. **Test Incrementally** - Run tests frequently during development
|
|
|
|
### For Framework Developers
|
|
|
|
**Remaining Enhancements:**
|
|
|
|
1. **Task 03: Enhanced Approval Detection** (~1 hour)
|
|
- High/medium/low confidence levels
|
|
- Capture actual approval text
|
|
- Reduce false positives/negatives
|
|
|
|
2. **Task 04: Session Replay Utility** (~1.5 hours)
|
|
- Replay failed sessions for debugging
|
|
- Console/markdown/HTML output
|
|
- CLI: `npm run replay <session-id>`
|
|
|
|
3. **Task 07: Integration Testing** (~1 hour)
|
|
- End-to-end integration tests
|
|
- Verify all features work together
|
|
- Performance benchmarks
|
|
|
|
### For Production Use
|
|
|
|
1. **Run Full Test Suite** - Verify all tests pass
|
|
2. **Update Agent Docs** - Document new validation features
|
|
3. **Create Migration Guide** - Help users update existing tests
|
|
4. **Monitor Pass Rates** - Track test health over time
|
|
|
|
---
|
|
|
|
## 📚 Additional Resources
|
|
|
|
- **Test Examples**: `evals/agents/openagent/tests/06-integration/medium/03-full-validation-example.yaml`
|
|
- **Framework Code**: `evals/framework/src/`
|
|
- **Results Dashboard**: `evals/results/index.html`
|
|
- **Session Storage**: `~/.local/share/opencode/storage/`
|
|
|
|
---
|
|
|
|
## 🤝 Contributing
|
|
|
|
When adding new tests:
|
|
|
|
1. ✅ Use unique test IDs
|
|
2. ✅ Use multi-turn for approval workflows
|
|
3. ✅ Add content expectations when validating outputs
|
|
4. ✅ Include clear descriptions
|
|
5. ✅ Test locally before committing
|
|
6. ✅ Update this guide if adding new features
|
|
|
|
---
|
|
|
|
**Last Updated:** November 27, 2025
|
|
**Framework Version:** 0.1.0
|
|
**Status:** Production Ready ✅
|