Appwrite Arena: The Benchmark That Tests Whether AI Can Learn Your API Before It Hallucinates

A domain-specific LLM arena that compares base-model memory, skill-file retrieval, and cost per answer across a fast-moving backend platform.

9 min read View on GitHub More from appwrite

A split-stage editorial scene shows the same model on two sides of a benchmark gate. On the left, it works from stale API fragments and writes slightly wrong code. On the right, it follows a clean path guided by a skill file, with a service map and a cost meter nearby. The image explains how the benchmark measures whether documentation changes model behavior.
Arena is built around a simple but practical question: does access to the right docs change the answer enough to matter?
Key Takeaways

Appwrite Arena starts from a familiar frustration. A generic model can write code that looks plausible, then drift into invented endpoints, stale patterns, or subtle Appwrite-specific mistakes the moment the task gets real. That is not a benchmark problem in the abstract. It is a shipping problem.

AI coding agents are everywhere. They write your functions, scaffold your database schemas, and wire up authentication flows. But here's the question nobody was answering: which AI model actually knows Appwrite best? We built Appwrite Arena to find out.

Matej Bačo, Engineering Lead at Appwrite · Introducing Appwrite Arena: Which AI model knows Appwrite best?

That framing matters because Arena is not trying to crown a universal winner. It is trying to answer a narrower, more useful question: can a model work inside a living API ecosystem if the docs are available, and how much does that help? The benchmark turns documentation into a variable you can test.

Why Arena is different from a normal benchmark

Most coding benchmarks freeze the world. Arena does the opposite. It tests a moving product surface, then splits evaluation into Without Skills and With Skills so the team can separate raw model memory from documentation-assisted performance.

DimensionWithout SkillsWith Skills
What the model getsBase training data onlyBase data plus Appwrite skill files
What it measuresGeneral memory and prior exposureAbility to use documentation as working context
Failure modeHallucinated or stale API detailsIgnoring or misusing the docs
Best useBaseline comparisonPractical developer readiness

That split is the project’s core move. It turns the benchmark from a leaderboard into a product tool. If skills materially improve outcomes, then the docs are not just helpful. They are part of the interface.

Inside the runner: how the benchmark keeps models honest

The engine lives in the benchmark runner, which loops through model calls with a hard cap on tool use. In practice, that means the system gives a model room to think, call tools, and stream partial answers, but it does not let it wander forever.

for (let round = 0; round < MAX_TOOL_ROUNDS; round++) {
  const result = await callModelRaw(messages, tools)

  if (result.type === 'final') break
  if (result.type === 'tool_call') {
    const skill = await read_skill(result.name)
    messages.push(skill)
    continue
  }

  if (result.type === 'partial' && result.tokenLimitHit) {
    preservePartialOutput(result.text)
    break
  }
}

The runner is designed to let models use tools without letting the evaluation become mushy or unbounded.

The resilience detail is easy to miss, but it is the kind of thing that separates a demo from infrastructure. If a model hits a token limit after producing a useful partial answer, the runner still tries to salvage the run instead of discarding it. That keeps the benchmark closer to real usage, where partial progress still matters.

How Appwrite turns docs into a tool

The clever part is not that the benchmark includes documentation. It is how it includes it. Appwrite loads skill files, parses Markdown with frontmatter, and exposes them through a callable read_skill tool. That simulates agentic doc access instead of stuffing a giant blob into the prompt.

A close-up of a judge's desk with a rubric card, a streamed model answer, and a grading lens that splits the answer into checked and rejected fragments. The image explains that Arena scores free-form responses using structured criteria, not vague intuition.
Judging is where the benchmark becomes a system. The answer is not just read. It is scored against a rubric.

That distinction matters. A model reading the right document is not the same thing as a model memorizing the right answer. Arena is testing whether the assistant can turn retrieval into better action, which is much closer to how developers actually use AI.

Why the judge matters as much as the models

Free-form answers need a judge because string matching breaks down fast once the question asks for reasoning or explanation. Arena uses an LLM-as-judge pattern with a rubric, so the evaluator can check for required technical points instead of just surface similarity.

Evaluation modeBest forWeak spot
Multiple choiceFacts with a single correct answerCan miss partial understanding
Rubric-scored free formExplanations and technical reasoningDepends on the quality of the rubric
LLM judgeFlexible answers at scaleNeeds a strong, consistent evaluator

The point is not that the judge is perfect. The point is that it is explicit. Once the rubric is part of the system, the benchmark can score open-ended answers without pretending that technical nuance will collapse into one correct string.

Questions are code, not content

Arena stores questions as typed objects, which keeps the benchmark maintainable as the Appwrite surface changes. Multiple-choice questions can be scored deterministically. Free-form questions carry rubric text so the judge knows which technical details must appear in a good answer.

type Question =
  | {
      type: 'mcq'
      prompt: string
      choices: Record<string, string>
      answer: string
    }
  | {
      type: 'freeform'
      prompt: string
      rubric: string
      referenceAnswer: string
    }

That design sounds small, but it is a big maintainability win. New services, renamed features, and updated SDK behavior can be added as structured entries instead of improvised text files. In a benchmark this specific, the schema is part of the product.

The real scoreboard is score plus cost

Arena does not stop at accuracy. It also tracks pricing, then folds that into a value view so the team can compare score against cost per token. That changes the question from "which model won" to "which model is worth using for this workload".

LensWhat it rewardsWhy it matters
Raw scoreBest technical answer rateUseful for capability comparison
Cost-adjusted valueGood-enough answers at lower spendUseful for production decisions
Combined viewPerformance plus efficiencyUseful for platform strategy

This is the part that feels most operational. A model that is marginally better but dramatically more expensive may be the wrong answer for support tools, internal copilots, or documentation workflows. Arena bakes that reality into the scoreboard instead of hiding it in a footnote.

What Appwrite Arena says about the future of niche benchmarks

General benchmarks are saturated. Domain benchmarks are where teams can still learn something real. If your API changes often, if your docs matter, and if your users are now bringing AI assistants into the workflow, then a project like Arena becomes less like marketing and more like defensive infrastructure.

That is the bigger lesson here. Open-source ecosystems do not need to wait for a universal benchmark to tell them whether AI tools are usable. They can build their own arenas, measure their own surfaces, and make documentation part of the product contract.