Hypothesis
We hypothesize that cloud LLMs (Claude Opus) will outperform local models (qwen3-coder 7B, deepseek-coder 6.7B) by at least 30% on complex reasoning and multi-file code generation, but that local models will achieve within 15% of cloud quality on single-function code generation while providing 3x lower latency for simple tasks, making a hybrid routing strategy optimal for the platform's 434 AIAD agents.
Background
The Prismatic Platform uses LLMs as the cognitive backbone for its 434 autonomous agents. These agents perform tasks ranging from simple code formatting to complex multi-step reasoning about security vulnerabilities and architectural decisions. The platform supports both cloud-based models (Claude Opus via Anthropic API) and local models (Ollama-hosted qwen3-coder 7B, deepseek-coder 6.7B, gpt-oss 20B) for local inference.
The cost and latency characteristics of cloud vs local models create a fundamental trade-off. Cloud models offer superior quality but incur API costs ($15-75 per million tokens) and network latency (200-800ms round trip). Local models running through Ollama are free after hardware investment, run with sub-100ms inference latency, and maintain data privacy, but their smaller parameter counts limit reasoning capability.
The current platform configuration uses a static routing rule: all agent tasks are sent to Claude Opus. This ensures maximum quality but is expensive at scale (434 agents generating approximately 2 million tokens per hour during active sessions) and introduces a cloud dependency that violates the platform's resilience goals.
This experiment systematically evaluates model quality across task categories to determine whether a hybrid routing strategy can maintain the platform's No Mercy quality gates standards while reducing cost and improving resilience.
Methodology
We evaluated three models across five task categories using a benchmark suite of 500 tasks (100 per category):
Task Categories:
- Single-Function Generation: Write one Elixir function from a specification
- Multi-File Refactoring: Modify multiple files to implement a feature
- Bug Diagnosis: Identify root cause from error traces and code
- Architecture Reasoning: Evaluate design trade-offs and recommend approaches
- Security Analysis: Identify vulnerabilities in code samples
Models:
- Claude Opus 4.6 (cloud, ~175B parameters estimated)
- qwen3-coder (local, 7B parameters, Ollama)
- deepseek-coder (local, 6.7B parameters, Ollama)
Evaluation:
- Each task was evaluated by 3 human reviewers on a 1-10 scale
- Automated metrics: compilation success rate, test pass rate, code quality score (Credo + Dialyzer)
- Latency measured end-to-end including network for cloud models via telemetry instrumentation
- Cost calculated at published API rates
Setup
The model evaluation harness:
defmodule PrismaticLLM.Benchmark.Evaluator do
@models [
%{name: :claude_opus, provider: :anthropic, model: "claude-opus-4-6"},
%{name: :qwen3_coder, provider: :ollama, model: "qwen3-coder"},
%{name: :deepseek_coder, provider: :ollama, model: "deepseek-coder"}
]
@task_categories [
:single_function,
:multi_file_refactor,
:bug_diagnosis,
:architecture_reasoning,
:security_analysis
]
def run_full_benchmark do
tasks = load_benchmark_suite()
results =
for model <- @models,
category <- @task_categories do
category_tasks = Enum.filter(tasks, &(&1.category == category))
metrics =
category_tasks
|> Enum.map(fn task ->
{response, latency} = timed_inference(model, task)
quality = evaluate_quality(task, response)
%{
model: model.name,
category: category,
task_id: task.id,
latency_ms: latency,
quality_score: quality.human_score,
compiles: quality.compiles,
tests_pass: quality.tests_pass,
credo_score: quality.credo_score,
token_count: count_tokens(response)
}
end)
aggregate_metrics(model.name, category, metrics)
end
%{results: results, timestamp: DateTime.utc_now()}
end
defp timed_inference(model, task) do
start = System.monotonic_time(:millisecond)
response =
case model.provider do
:anthropic ->
PrismaticLLM.Anthropic.complete(model.model, task.prompt)
:ollama ->
PrismaticLLM.Ollama.complete(model.model, task.prompt)
end
latency = System.monotonic_time(:millisecond) - start
{response, latency}
end
end
The hybrid router that selects models based on task complexity:
defmodule PrismaticLLM.HybridRouter do
@complexity_threshold 0.6
@spec route(map()) :: atom()
def route(task) do
complexity = estimate_complexity(task)
cond do
complexity >= @complexity_threshold ->
:claude_opus
task.category in [:architecture_reasoning, :security_analysis] ->
:claude_opus
task.category == :single_function and complexity < 0.3 ->
:qwen3_coder
true ->
:deepseek_coder
end
end
defp estimate_complexity(task) do
file_count = length(task.files || [])
prompt_length = String.length(task.prompt)
requires_reasoning = task.category in [:bug_diagnosis, :architecture_reasoning]
base = prompt_length / 10_000
file_factor = file_count * 0.15
reasoning_factor = if requires_reasoning, do: 0.3, else: 0.0
min(base + file_factor + reasoning_factor, 1.0)
end
endResults
Quality scores by model and task category (human evaluation, 1-10 scale):
| Category | Claude Opus | qwen3-coder | deepseek-coder | Opus Advantage |
|---|---|---|---|---|
| Single Function | 9.2 | 8.1 | 7.8 | +12.0% / +17.9% |
| Multi-File Refactor | 8.7 | 5.4 | 5.1 | +61.1% / +70.6% |
| Bug Diagnosis | 8.9 | 6.2 | 6.7 | +43.5% / +32.8% |
| Architecture Reasoning | 9.4 | 4.8 | 4.3 | +95.8% / +118.6% |
| Security Analysis | 9.1 | 5.1 | 5.6 | +78.4% / +62.5% |
Automated metrics (% of tasks passing):
| Metric | Claude Opus | qwen3-coder | deepseek-coder |
|---|---|---|---|
| Compiles | 97.4% | 84.2% | 81.7% |
| Tests Pass | 91.8% | 62.1% | 58.4% |
| Credo Clean | 94.1% | 71.3% | 68.9% |
| Dialyzer Clean | 88.7% | 47.2% | 44.1% |
Latency and cost:
| Model | p50 Latency | p95 Latency | Cost per 1K Tokens |
|---|---|---|---|
| Claude Opus | 1,240 ms | 3,870 ms | $0.015 |
| qwen3-coder | 380 ms | 920 ms | $0.00 (local) |
| deepseek-coder | 410 ms | 1,040 ms | $0.00 (local) |
Hybrid router performance:
| Metric | All-Cloud | All-Local (best) | Hybrid |
|---|---|---|---|
| Avg Quality Score | 9.06 | 6.78 | 8.71 |
| Avg Latency (ms) | 1,240 | 395 | 684 |
| Monthly Cost (est.) | $4,200 | $0 | $1,890 |
| Quality/Cost Ratio | 2.16 | infinity | 4.61 |
Analysis
The results confirm our hypothesis with nuance. For single-function generation, local models achieve within 12-18% of Claude Opus quality, validating the 15% threshold. For complex tasks (architecture reasoning, security analysis), Claude Opus's advantage is 62-119%, far exceeding the 30% hypothesis -- the gap is even larger than predicted.
The most striking finding is the compilation rate gap: Claude Opus produces compilable Elixir 97.4% of the time, while local models achieve only 81-84%. For the Prismatic Platform's No Mercy standards (zero compilation warnings required per the Zero Warning Policy), this means local model output requires an additional validation and correction step through Credo and Dialyzer.
The hybrid router achieves 96.1% of cloud-only quality (8.71 vs 9.06) at 45% of the cost ($1,890 vs $4,200). It routes 38% of tasks to local models (primarily simple single-function generation) and 62% to Claude Opus (complex reasoning, multi-file, security). The latency improvement (684ms vs 1,240ms) comes from the fast local model responses for simple tasks.
The local models show a characteristic strength in pattern-matching tasks (formatting, boilerplate generation, simple transformations) and a characteristic weakness in tasks requiring world knowledge, multi-step reasoning, or understanding of the broader codebase context. This aligns with their smaller context windows and parameter counts.
Conclusions
- Claude Opus is irreplaceable for complex reasoning -- 60-120% quality advantage for architecture and security tasks.
- Local Ollama models are viable for simple generation -- within 12-18% quality for single-function tasks.
- Hybrid routing saves 55% of cost while maintaining 96% of all-cloud quality against quality gates.
- Compilation rate is the critical metric -- local models need post-generation validation via Dialyzer and typespec checking.
- Latency improvement is significant -- 45% reduction for the hybrid approach on simple inference tasks.
Next Steps
- Fine-tune local models on the platform's Elixir codebase for domain-specific accuracy improvement
- Implement a cascading strategy: try local Ollama model first, fall back to cloud if quality gates validation fails
- Evaluate gpt-oss 20B as a middle-tier option between 7B local and cloud
- Build cost tracking dashboards in LiveView to monitor hybrid router economics with telemetry integration
- Test model quality degradation under high concurrency (100+ simultaneous agent requests)
Related Experiments
- Agent Prototyping -- Agents that consume LLM outputs
- Multi-Agent Coordination -- Coordinating agents with different model backends
- Session Lifecycle -- Session context management across model switches
- Quality Evolution -- Quality gates that validate LLM outputs
Connect & Contribute
Created by Tomáš Korcak (korczis) | Open Source under GHL