# Module 6: Economics & Evaluation ## Lesson 6.0: The Compute Advantage Equation **Core insight**: Your value as an agentic engineer scales with the amount of compute you can harness effectively. ### The Equation ``` Compute Advantage = (Compute Scaling × Autonomy) ÷ (Time + Effort + Monetary Cost) ``` | Variable | What It Means | How to Improve It | |----------|---------------|-------------------| | **Compute Scaling** | How much AI compute you can throw at problems | More agents, better models, larger context windows | | **Autonomy** | How much the agent does without your intervention | Better prompts, better tools, verification layers | | **Time** | How long it takes to get results | Faster models, parallel execution, fewer iterations | | **Effort** | How much you have to craft prompts/instructions | Reusable skills, templates, mental models | | **Monetary Cost** | What you pay for API calls | Cascade routing, cheaper models for simple steps | ### What It Tells You - **High Compute Advantage** = You get more output for less input. You're leveraging agents effectively. - **Low Compute Advantage** = You're spending too much time/cost for too little gain. Fix the bottleneck variable. ### Real-World Application (Your Stack) | Tool | Compute Scaling | Autonomy | Time | Effort | Cost | Advantage | |------|:---:|:---:|:---:|:---:|:---:|:---:| | Claude Code (lead) | 8 | 7 | 6 | 5 | 4 | (8×7)÷(6+5+4)=3.7 | | Pi Agent (custom) | 7 | 8 | 7 | 6 | 6 | (7×8)÷(7+6+6)=2.9 | | OpenCode (OSS) | 5 | 5 | 7 | 7 | 9 | (5×5)÷(7+7+9)=1.1 | | Gemini Flash (fast) | 4 | 3 | 9 | 8 | 9 | (4×3)÷(9+8+9)=0.5 | Higher score = more output per unit of investment. Use this to decide which tool for which task. ### How to Optimize 1. **Improve numerator**: Run more agents in parallel (P-threads), increase autonomy with verification 2. **Reduce denominator**: Use cascade routing (cheap model for simple steps), reuse skills/mental models 3. **Track over time**: Your Compute Advantage should increase as you build better harnesses and mental models --- ## Lesson 6.1: LLM Pricing Landscape 2026 ### Per-Million-Token Pricing | Model | Input ($/M) | Output ($/M) | Best For | |-------|-------------|--------------|----------| | Gemini 2.5 Flash | $0.15 | $0.60 | High-volume, simple tool calls | | DeepSeek V3 | $0.27 | $1.10 | Structured tasks, batch processing | | DeepSeek R1 | $0.55 | $2.19 | Reasoning-heavy single steps | | Gemini 2.5 Pro | $1.25 | $5.00 | Long-context sessions (1M+ tokens) | | GPT-4o | $2.50 | $10.00 | Balanced cost/quality | | Claude Sonnet 4 | $3.00 | $15.00 | General agentic reasoning | | GPT-5 | $10.00 | $40.00 | Frontier research, complex plans | | Claude Opus 4 | $15.00 | $75.00 | Complex multi-step agent orchestration | ### Price Range: 100x Difference Cheapest (Gemini Flash) to most expensive (Claude Opus) is a **100x multiplier**. Choosing the right model for each step is your highest-leverage cost optimization. --- ## Lesson 6.2: Cascade Routing ### The Pattern Don't use one model for everything. Route different steps to different models: ``` Step 1: Retrieve context → Gemini Flash ($0.15/M input) Step 2: Analyze → Claude Sonnet ($3/$15) Step 3: Make decision → Claude Opus ($15/$75) Step 4: Format output → Gemini Flash ($0.15/$0.60) ``` ### Savings Profile | Pattern | Cost/Task | Savings | |---------|-----------|---------| | All Opus | $2.50 | Baseline | | Cascade (Flash → Sonnet → Opus → Flash) | $0.85 | 66% savings | | All Sonnet | $0.50 | 80% savings (but quality loss on complex steps) | ### Implementation ```python def route_task(task_complexity: str) -> str: if task_complexity == "retrieval": return "gemini-2.5-flash" elif task_complexity == "analysis": return "claude-sonnet-4" elif task_complexity == "decision": return "claude-opus-4" elif task_complexity == "formatting": return "gemini-2.5-flash" ``` --- ## Lesson 6.3: Cost Per Session Math ### Where Costs Come From | Component | Share | Notes | |-----------|-------|-------| | Output tokens | ~70% | Model generation is most expensive | | Input tokens | ~20% | Context + tool results | | Cached tokens | ~10% | Can be zero if not configured | ### The Multipliers | Factor | Multiplier | Why | |--------|-----------|-----| | Retry rate | 1.2-2.0x | Failed tool calls retry | | Tool overhead | 3-5x per tool call | Planning + execution + error recovery + result parsing | | Context growth | 1.5x per 10 turns | Every turn adds tokens to context | ### The 3x Rule **Production agent costs 3x your prototype estimate.** 1x = ideal path (everything works first time) 2x = retries + edge cases 3x = monitoring + error handling + observability overhead ### Quick Estimation ```python def estimate_cost(turns: int, avg_tokens_per_turn: int, model_price_per_m: float): """Very rough estimate.""" base = turns * avg_tokens_per_turn * model_price_per_m / 1_000_000 retry = base * 1.5 overhead = base * 3.0 return {"base": base, "with_retries": retry, "production": overhead} ``` --- ## Lesson 6.4: Agent Evaluation Metrics ### The Key Metrics | Metric | What It Measures | Target | |--------|-----------------|--------| | **pass@k** | % of k attempts where at least one succeeds | >80% | | **pass^k** | % where ALL k attempts succeed (consistency) | >60% | | **Tool Call Accuracy** | Correct tool + correct params | >90% | | **Task Completion Rate** | End-to-end success | >70% | | **Cost Per Task** | Total API cost per unit | Varies | | **Loop Efficiency** | Steps taken vs optimal | <2x overhead | | **Grind Rate** | % of attempts that re-run identical code | <5% | ### pass@k Explained ``` pass@k = probability that at least one of k attempts succeeds k=1: 60% pass rate (single attempt) k=3: 1 - (0.4)^3 = 93.6% (best of 3) k=5: 1 - (0.4)^5 = 98.9% (best of 5) ``` Higher k = higher reliability but higher cost. The trade-off is the core optimization problem. --- ## Lesson 6.5: Automated Evaluation ### Golden Dataset Approach ```python eval_cases = [ { "input": "Find the user with email john@example.com", "expected_tool": "query_database", "expected_params": {"query": "SELECT * FROM users WHERE email = 'john@example.com'"}, "expected_output_contains": ["john@example.com"], "weight": 1.0 } ] ``` ### VCR-Style Recording For non-deterministic tool results (search, API calls), record the response once, then replay it deterministically: ```python # Record mode: capture real responses # Replay mode: use recorded responses # Test: verify agent makes correct decisions with known data ``` --- ## Lesson 6.6: A/B Testing Agents ### Canary Deployment 1. Route 5% of traffic to new agent config 2. Compare against 95% on current config 3. Metrics: success rate, cost, latency, loop depth 4. If new config wins on all metrics → roll out to 100% 5. If new config loses → rollback, investigate ### What to A/B Test - System prompt wording - Model selection - Temperature settings - Tool descriptions - Iteration limits --- ## Lesson 6.7: Human Evaluation ### What Automated Evals Miss 1. **Quality of reasoning** — agent made right decision for wrong reasons? 2. **Tone and style** — output technically correct but poorly written? 3. **Edge cases** — agent handled happy path but not real-world variation? 4. **Hallucination cascades** — plausible-looking but wrong intermediate steps? ### Spot-Check Sampling Review 5-10% of all agent sessions manually. Focus on: - Sessions with high cost (>2x average) - Sessions with tool loops - Sessions where automated eval scored low - Random sample for baseline --- ## Lesson 6.7b: Real-World Cost Scenarios ### Scenario A: Research Agent (High Token Burn) ``` Pattern: Agent reads 20 web pages, synthesizes report Cost breakdown: ├── 20 web page reads @ 2K tokens each = 40K input tokens ├── 5 LLM reasoning turns @ 4K tokens = 20K tokens ├── 1 report generation @ 8K output tokens = 8K output tokens ├── Claude Sonnet: ~$0.08/run ├── Claude Haiku: ~$0.02/run (80% cheaper, 90% as good for extraction) └── Cascade: Haiku for reads, Sonnet for synthesis → $0.03/run ``` **The cascade saves 62%** on this exact pattern. Use cheap models for bulk work, expensive models for synthesis. ### Scenario B: Code Generation (Iterative) ``` Pattern: Agent writes code, tests, fixes, repeats Cost without optimization: ├── Average: 8 iterations × 6K tokens = 48K tokens ├── Cost: ~$0.35 per feature ├── With guardrails (limit to 3 iterations): $0.13 per feature └── Savings: 63% ``` ### Scenario C: Always-On Brand Monitor ``` Pattern: Scans 50 sources every 5 minutes, 24/7 Cost without optimization: ├── 288 runs/day × $0.08 = $23.04/day = $691/month ├── With cascade + dedup + scheduling: $4.15/day = $125/month └── Savings: 82% ``` ### The 80/20 Rule 90% of cost savings come from three changes: 1. **Model cascade** — use cheap models for routine work (saves 50-80%) 2. **Iteration limits** — cap loops at 3-5 turns (saves 40-60%) 3. **Deduplication** — don't re-read the same context (saves 20-30%) Do these three first before any other optimization. --- ## Lesson 6.7c: Monitoring Agent Economics in Production Once your agent is deployed, you need to track costs in real-time. Here's what to monitor and how. ### Dashboard Metrics ``` Cost Dashboard (example) ├── Cost per session (avg, p95, max) ├── Cost per tool call (avg by tool type) ├── Cost per model tier (Haiku vs Sonnet vs Opus) ├── Loop depth distribution (how many turns do sessions take?) ├── Cost by hour of day (when are agents most expensive?) └── Monthly burn rate (projected vs actual) ``` ### Setting Up Cost Tracking The simplest approach: log every LLM call with its cost to a JSONL file. ```python # cost-logger.py — append-only cost tracking import json, time, os LOG_FILE = "cost-log.jsonl" def log_llm_call(model, prompt_tokens, output_tokens, cost_cents): entry = { "timestamp": time.time(), "model": model, "prompt_tokens": prompt_tokens, "output_tokens": output_tokens, "cost_cents": cost_cents, "session_id": os.environ.get("SESSION_ID", "unknown"), } with open(LOG_FILE, "a") as f: f.write(json.dumps(entry) + "\n") ``` ### Cost Alerts Set up automated alerts for cost anomalies: | Alert | Threshold | Action | |-------|-----------|--------| | Session cost exceeded | >$2.00 | Kill session, notify operator | | Daily budget warning | >80% of daily budget | Notify operator | | Cost spike detection | >3x average for this agent | Investigate loop behavior | | Model tier drift | >10% of calls using Opus | Check cascade routing config | ### The Cost-to-Value Ratio Not all costs are bad. An expensive agent that ships features is more valuable than a cheap agent that does nothing. Track: - **Cost per task completed** (not just cost per call) - **Revenue generated per agent session** (if applicable) - **Time saved vs human doing the same task** - **Error rate** (cheap agents that make mistakes cost more in debugging time) --- ## Lab 6.8: Build an Eval Harness **Objective**: Create golden Q&A pairs + automated pass/fail scoring. **Starter**: `course/labs/L6-eval-harness/starter.py` ## Lab 6.9: Cost Optimization **Objective**: Profile a session, identify savings, implement cascade routing. **Starter**: `course/labs/L6-cost-optimization/starter.py`