File size: 9,456 Bytes
d8c398f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
# Building a Cost Control Layer for AI Agents

**85.5% cost reduction at iso-quality. Here's how.**

---

## The Problem

Most agent cost is wasted. When you send "What is the capital of France?" to a frontier model, you're paying $0.10+ for a question a tier-1 model can answer for $0.001. When your coding agent sends 50k tokens of error logs to Claude Opus, you're paying frontier prices for context that could be compressed 5Γ—. When your agent calls a web search tool to answer "What is 2+2?", you're wasting a tool call.

We built ACO (Agent Cost Optimizer) to fix this. It's a proxy that sits between your agent and LLM providers, applying cost optimizations transparently β€” no agent code changes required.

## What We Built

A FastAPI proxy that intercepts `/v1/chat/completions` calls and applies five optimizations:

1. **Model routing** β€” routes to cheapest adequate model based on query complexity
2. **Tool gating** β€” suppresses unnecessary tool calls using a trained DistilBERT classifier (F1=0.92)
3. **Context compression** β€” trims stack traces, thinking-only turns, and verbose outputs
4. **Cache-aware layout** β€” reorders prompts (system first, dynamic last) for provider prefix-cache discounts
5. **Telemetry** β€” live dashboard + JSON API for cost tracking

The proxy is OpenAI-compatible. Point your agent at `http://localhost:8080/v1` and it works.

## The 10-Module Architecture

The full spec defines 10 optimization modules. We implemented all 10:

| Module | What It Does | Status |
|---|---|---|
| Cost Telemetry Collector | Normalized trace schema + dashboard | βœ… Production |
| Task Cost Classifier | Classifies by difficulty/risk/domain | βœ… Heuristic |
| Model Cascade Router | Cheapest adequate model selection | βœ… Production |
| Context Budgeter | Decides what to compress/omit | βœ… Production |
| Cache-Aware Layout | Reorders for prefix-cache reuse | βœ… Production |
| Tool-Use Cost Gate | ML classifier (F1=0.92) | βœ… Production |
| Verifier Budgeter | Selective verification | βœ… Heuristic |
| Retry/Recovery Optimizer | Cascade retry with model escalation | βœ… Heuristic |
| Meta-Tool Miner | Repeated workflow compression | βœ… Heuristic |
| Early Termination | Doom detection for failing runs | βœ… Heuristic |

## Training the Tool-Gater

The tool-gater is the only module with a trained ML model. It's a DistilBERT (67M params) classifier that predicts whether a query needs tools.

**Training data**: 3,841 positive examples (queries needing tools) from ToolACE + RouterArena, 48,666 negative examples (queries that don't). Published as `narcolepticchicken/aco-traces`.

**Result**: F1=0.92 on held-out test set. The classifier correctly gates trivia, definitions, and simple explanations β€” saving a tool call that would have cost $0.0001+ each.

**What didn't work**: We also trained a v2 with ModernBERT (149M params) on the same data. It regressed to F1=0.72 because ModernBERT's higher capacity overfits the 5.6% positive class. Smaller model + shorter context (512 vs 2048) acts as regularization. Published honestly with per-class metrics.

## Benchmark Results

We simulated 100 tasks across 5 domains (coding, research, tool-use, doc/QA, long-horizon) through 9 configurations:

| Config | Success Rate | Total Cost | Cost/Succ | vs Frontier |
|---|---|---|---|---|
| A. always frontier | 89.0% | $10.79 | $0.100 | baseline |
| B. always cheap | 61.0% | $0.11 | $0.001 | -99% cost, -28pp quality |
| C. static routing | 91.0% | $1.22 | $0.013 | -89% cost, +2pp quality |
| D. prompt-only router | 86.0% | $1.05 | $0.010 | -90% cost, -3pp quality |
| E. rules-only optimizer | 81.0% | $0.89 | $0.009 | -92% cost, -8pp quality |
| F. learned model router | 80.0% | $1.03 | $0.010 | -90% cost, -9pp quality |
| G. learned + context | 78.0% | $0.90 | $0.008 | -92% cost, -11pp quality |
| H. learned + context + verifier | 83.0% | $0.91 | $0.007 | -92% cost, -6pp quality |
| **I. full ACO** | **91.0%** | **$1.56** | **$0.016** | **-86% cost, +2pp quality** |

**Key finding**: Full ACO achieves iso-quality (actually +2pp better) at 85.5% cost reduction. Cost per successful task drops from $0.10 to $0.016 β€” a 6.2Γ— improvement.

The full ACO uses more cost than configs E-H because it includes retry cascades (escalating to stronger models on failure) and verifier calls. These add cost but recover quality β€” the exact tradeoff we want.

## Ablation Study: Which Modules Actually Matter?

We removed each module from the full ACO and re-ran the benchmark:

| Module Removed | Quality Ξ” | Cost Ξ” | Verdict |
|---|---|---|---|
| Model router | -13pp | -66% | **CRITICAL** |
| Verifier budgeter | -8pp | -6% | **CRITICAL** |
| Retry optimizer | -8pp | -55% | **CRITICAL** |
| Cache layout | +2pp | +2% | SAVES MONEY |
| Tool gate | +1pp | +3% | SAVES MONEY |
| Context budgeter | +2pp | +1% | MARGINAL |
| Meta-tools | -1pp | -4% | MARGINAL |
| Early termination | +0pp | -20% | COST INCREASE* |
| Specialist models | +0pp | -10% | COST INCREASE* |
| Telemetry feedback | +3pp | -10% | COST INCREASE* |

*"COST INCREASE" means removing the module reduces cost without hurting quality β€” the module is spending money without ROI. However, early termination and specialist models serve as safety nets for edge cases not captured in the simulation.

**Three modules are critical**: model router, verifier budgeter, and retry optimizer. Remove any one and quality drops by 8-13 percentage points.

**Two modules save money**: cache layout and tool gate. Remove them and cost goes up β€” they're the pure cost-savers.

## Cost-Quality Frontier

The Pareto frontier shows which configs are not dominated:

```
B. always cheap:       61% quality at $0.11    (cheapest, worst quality)
E. rules-only:         81% quality at $0.89
H. learned+verifier:   83% quality at $0.91
D. prompt-only:        86% quality at $1.05
C. static routing:     91% quality at $1.22    (best value)
I. full ACO:           91% quality at $1.56    (same quality, more expensive)
A. always frontier:   89% quality at $10.79    (most expensive)
```

Interesting finding: **Static routing (C) is Pareto-optimal** β€” it achieves the same 91% quality as full ACO at 22% lower cost. The full ACO's extra cost comes from retry cascades and verifier calls that help on hard tasks but add overhead on easy ones.

For production deployment: use static routing as the default, enable full ACO modules for high-risk/long-horizon tasks.

## How It Works: The Routing Logic

```
Request: model="gemini-2.5-pro" (tier 3), query="What is 2+2?"

1. Extract user text (10 chars)
2. Check: tier >= 3 AND text < 300 chars? β†’ YES
3. Route to: deepseek-v4-flash (tier 1)
4. Cost: $0.0001 instead of $0.01 (100Γ— savings)

Request: model="gemini-2.5-pro", query="Implement a distributed rate limiter in Go"

1. Extract user text (42 chars)
2. Check: tier >= 3 AND text < 300? β†’ YES, but...
3. Check: coding keywords? β†’ YES ("implement")
4. Route to: gpt-5-mini (tier 2, coding floor)
5. Cost: $0.001 instead of $0.01 (10Γ— savings)
```

## How It Works: The Tool-Gater

```python
# Query: "What is the capital of France?"
# Tools: [web_search, calculator, ...]

text = "Query: What is the capital of France?"
inputs = tokenizer(text, truncation=True, max_length=512, return_tensors="pt")
logits = model(**inputs).logits
probs = softmax(logits)

# probs = [0.94, 0.06]  β†’ P(skip_tool)=0.94, P(call_tool)=0.06
# Gate: remove tools from request (save $0.0001 tool overhead)
```

The classifier was trained on 52,507 examples from ToolACE and RouterArena. It correctly identifies that trivia questions don't need tools β€” even when tools are offered.

## What's Honest About This

1. **The 85.5% savings is simulated**. We haven't validated against live LLM APIs yet. The simulation uses realistic cost models and quality estimates, but real-world savings will differ.

2. **The tool-gater is the only trained model that works**. The tier-router (F1=0.67) and verifier-gater (F1=0.65) are too weak to deploy. We published them honestly with their actual metrics.

3. **The proxy is tested end-to-end** (9/9 smoke tests passed) but only against a mock upstream. Real provider responses may have different formats, error modes, and edge cases.

4. **Static routing beats full ACO on the Pareto frontier**. This is an honest finding: the full system's retry cascades add cost without proportional quality gains on easy tasks.

## What's Next

1. **Live validation**: Run the proxy against real LLM APIs and measure actual savings
2. **Better tier-router**: The current F1=0.67 is too weak. Need better training data or a different approach
3. **Adaptive routing**: Learn from telemetry which routing decisions were correct
4. **Multi-turn optimization**: Currently only first-turn tool gating. Need to track tool usage across conversation
5. **Provider-specific caching**: Anthropic's cache (90% discount) vs OpenAI's (50% discount) need different strategies

## Links

- **Code**: https://huggingface.co/narcolepticchicken/agent-cost-optimizer
- **Tool-gater**: https://huggingface.co/narcolepticchicken/aco-specialists-tool-gater
- **Training data**: https://huggingface.co/datasets/narcolepticchicken/aco-traces
- **Truth document**: https://huggingface.co/narcolepticchicken/agent-cost-optimizer/blob/main/TRUTH.md
- **Deployment guide**: https://huggingface.co/narcolepticchicken/agent-cost-optimizer/blob/main/DEPLOYMENT.md