University of Rome Tor Vergata CNIT

ANI-Gamut: Benchmarking Agent Reliability
across the Gamut of Agent–Network Interface Abstractions

Lorenzo Bracciale1, Pierpaolo Loreti1, Andrea Mayer1, Stefano Salsano1, Wim Henderickx2
1 University of Rome Tor Vergata / CNIT, Italy  ·  2 Nokia, Belgium
Stefano Salsano
Presenter: Stefano Salsano
  • Professor of Telecommunications, University of Rome Tor Vergata; CNIT research unit lead
  • Research: network programmability, SRv6, SDN/NFV, Linux networking; IETF contributor
  • Current focus: agentic AI for network management and reproducible benchmarks
  • Project page: netgroup.github.io/ani-gamut · stefano.salsano@uniroma2.it
22nd International Conference on Network and Service Management (CNSM 2026) · 27 October 2026, Alcalá de Henares, Spain
Funded by the European Union NextGenerationEU
MUR
PRIN Ministero dell'Università e della Ricerca
Italia Domani National Recovery and Resilience Plan
PRIN 2022NEWTON

Key messages

1
LLM agents operate networks through some interface. Nobody has measured which interface level works best.
2
ANI-Gamut is an open-source playground for agentic network management; in this paper we change only the interface level and keep task, model and network fixed.
3
In our pilot, a higher-level interface succeeds where the raw shell fails, at a tenth of the cost; no collateral damage at any level.
1 · The question

At which level should the agent act?

  • Attention goes to the agent; its contract
    with the network stays implicit
  • Coding agents learned it:
    the interface governs task success
  • ANI: Agent–Network Interface
    the contract the agent acts through
  • Most existing work (e.g. IETF draft)
    fixes the ANI at one level
Operators are climbing this ladder today. Which rung is safe to hand to an agent is being decided in practice.
device CLI NETCONF / YANG service intent (NSO, EDA, Apstra) source of truth (NetBox, Nautobot) where do we put the agent?

The failure that matters: collateral damage

  • Task done, unrelated service broken = an outage
  • Two legs: reach the goal and touch nothing else
  • Carrier grade: five nines
  • Only visible on a brownfield:
    a network already full of other services
Toy playgrounds hide the interactions we need to stress.
one change on a shared provider edge tenant 17 tenant 42 firewall tunnels new service routing floating IPs tenant 9 broken the agent "succeeds"

The spectrum: A0 to A4

  • A0 raw shell · A1 bounded CLI
  • A2 NETCONF/YANG, device commit
  • A3-T service intent + transaction
  • A3-R reconciled source of truth
  • A4 both: commercial controllers like
    Cisco NSO, Nokia EDA, Juniper Apstra
A ladder below, a plane above. A3-T and A3-R are two different bets on safety.
Abstraction spectrum lattice

Nobody varies the interface

  • Existing benchmarks: one fixed interface,
    mostly troubleshooting
  • NetConfEval: levels compared,
    but as static translation
  • OperAID: changing what the agent sees
    moves success 11% → 61%
  • ALL populate little coexisting state
Production networks carry 105–106 config items. That density, not node count, is where damage happens.
where ANI-Gamut sits coexisting configuration state → interface varied → NIKA, NetOpsBench AIOpsLab NetConfEval ANI-Gamut
2 · ANI-Gamut

One variable: the interface level

  • HAI: the operator's request, fixed
  • The agent: one model, fixed
  • ANI: the level we vary
  • Results checked from outside,
    same at every level
Every level gets the same agent budget. Same model, prompt, step and token caps, retries. The only thing that changes between two runs is the action interface.
HAI, NMAA, ANI, brownfield network

Same task, four implemented interfaces

LevelWhat the agent seesSafety mechanism
A0raw shell, every guardrail removednone
A1free-text CLI, boundedallowlist + snapshot / rollback
A1+A1 + hand-picked blocklistad-hoc prohibitions (control)
A3-Ttyped service intent: provision_servicetransaction + validation + rollback
A2, A3-R conceptual; A4 future work. Built from our configuration harness (A1) and the MAIN 2026 SRv6 playground (A3-T).

A brownfield built like a Docker image

  • Topology base + service-class layers
  • Manifest in YAML: a brownfield Dockerfile
  • Each layer: init · generate(seed) · verify
  • Each layer also writes the checks
    for its own services
~25 nodes, ~10 service classes, 103–104 items each. Density comes from configuration state inside the nodes, not from adding nodes.
Manifest layers, density, overlap, seed floating-IP, addressing, … firewall policy SRv6 L3VPN tenants (VRFs) base topology + underlay Containerlab · Linux + FRR · SRv6 uSID add a class = add a layer each layer: init · generate(seed) · verify

Scoring: success vs. failure, safety vs. collateral damage

  • Success = the requested service works
  • Damage = a service that worked before no longer does
  • Per run: damaged or not
  • Safety metric: the fraction of damage-free runs
    (good = 100%)
  • In the pilot we produced failures, never damage
every run gets one of four labels clean successdone, nothing broken dangerous successdone, neighbour broken clean failuregave up, nothing broken destructive failurenot done, neighbour broken right column must be empty
3 · Pilot results

Task success follows the level pilot

Change-set on a live 25-site tenant, n = 6 seeds:
task: add 2 sites, move 2, remove 1

LevelSuccess
A0 raw shell0 / 6
A3-T typed intent6 / 6
A0 gets ~85% of the sites connected on every seed, but never completes the task.
change-set success (n = 6) 1.0 0.5 0 A0 0 / 6 A3-T 6 / 6 same model, prompt, step cap

Cost follows the level pilot

  • A0: 40 steps (the maximum), ~375k tokens
  • A3-T: 3 steps, ~42k tokens
  • Roughly 13× steps, 9× tokens
  • Part of it is budget exhaustion: A0 fails at the cap
Why it is cheaper: the work moved from the agent to the automation layer. At A3-T the agent makes one provision_service call; the command sequence, validation and rollback live in the automation layer, written once. At A0 the agent rebuilds them at every run.
steps tokens 40A0 3A3-T 375kA0 42kA3-T change-set task, matched budget

Collateral safety does not follow the level pilot

  • Damage-free runs: 100% at every level, on every task
  • Agents fail safe: they give up,
    they don't break neighbours
  • Tenants live in separate VRFs: nothing can leak
In this testbed tenants are isolated by VRFs, so there is no shared state an agent could break. Ongoing follow-up work: a shared firewall ruleset across tenants, where a careless agent can hurt its neighbours (stay tuned!).
damage-free run rate, all tasks 1.0 0 A0A1A1+A3-T an honest null, with a cause: VRF isolation

Limits of this pilot

  • Few runs: 20 / 6 / 4 per level. “No damage seen” is not “no damage”
  • Few segments, not a curve: only A0, A1, A1+ and A3-T were run;
    A2, A3-R, A4 were not
  • Emulated network: trust the gap between levels, not the absolute numbers
The gap between the ends is large and consistent; filling the middle is the next step.

Released as open source: build on it

HAI, NMAA, ANI, brownfield network

Harness and per-level adapters: add a level, a model, a task class

Manifest layers, density, overlap, seed floating-IP, addressing, … firewall policy SRv6 L3VPN tenants (VRFs) base topology + underlay Containerlab · Linux + FRR · SRv6 uSID add a class = add a layer each layer: init · generate(seed) · verify

Brownfield generator: add a service class, change density, replay a seed

github.com/netgroup/ani-gamut · playground, pre-registration and extended version at netgroup.github.io/ani-gamut

Take-home

1
Treat the agent–network interface as a first-class experimental variable.
2
Task success and cost track it: 0/6 → 6/6 at a tenth of the cost.
3
Collateral safety was set by the network isolation, not by the agent. Next: shared state, A2 and A3-R implemented, density and fault sweeps.
4
We need realistic testbeds, with complexity comparable to production networks.

Thank you.   Questions?

Playground, pre-registration, extended version: netgroup.github.io/ani-gamut

Backup

Which levels were run in which experiment pilot

ExperimentA0A1A1+A3-T
Benign onboarding, n = 200.200.350.55not run
Change-set, live tenant, n = 60 / 6not runnot run6 / 6
Onboarding under faults, λ = 0.3, n = 40 / 42 / 41 / 44 / 4
Damage-free rate, all of the above1.001.001.001.00
The headline contrast is A0 vs A3-T because the change-set task was run only at the two ends. A1 and A1+ appear in the benign and fault experiments; A2, A3-R and A4 were not implemented. Shared seeds at each level → paired McNemar test (change-set: p = 0.031 on six discordant pairs).
Backup

Benign onboarding, no faults pilot

LevelSuccessWilson 95%
A04/20 · 0.20[0.08, 0.42]
A17/20 · 0.35[0.18, 0.57]
A1+11/20 · 0.55[0.34, 0.74]
  • McNemar A0 vs A1+: p = 0.092 (trend); A1+ vs A1: p = 0.289
  • Tokens +62% from A0 to A1; damage-free 1.00
Benign tasks show the trend, not the separation.
onboarding success (n = 20) 1.0 0.5 0 0.20 A0 0.35 A1 0.55 A1+
Backup · Injected faults 1/3

Why we inject faults

  • On a healthy network, A0 and A3-T differ mostly in cost
  • Real networks lose packets, lose links, freeze nodes
  • Question: does the interface level still matter when the network misbehaves?
  • Fault rate λ is a stress knob, set above realistic levels on purpose
Same task (tenant onboarding), same model, same budget, same seeds. Only the level changes.
Backup · Injected faults 2/3

How faults are injected

  • Faults: packet loss, latency, downed link,
    frozen node, daemon restart, held lock
  • Injected in the shared substrate,
    below every adapter
  • Never inside a level: that would test
    the level’s own resilience
  • Seeded: the same fault sequence
    is replayed at every level
Every level sees the same event at the same moment. Partial apply, double apply, lockout are outcomes we measure, not inputs.
A0 A1 A3-T adapter adapter adapter shared substrate one seeded fault, all levels fault seed k
Backup · Injected faults 3/3

Results under injected faults

Onboarding task, λ = 0.3, n = 4 per level, one model, same budget:

LevelSuccessDamage-freeStepsTokens
A00 / 4100%25.0127k
A12 / 4100%25.0228k
A1+1 / 4100%25.0239k
A3-T4 / 4100%5.535k
  • A3-T completes every run; A0 none; A1 and A1+ in between
  • No level damaged a pre-existing tenant, even under faults
  • A3-T sends a typed intent and does not need to read the degraded network;
    A0 and A1 do, and lose their way
Caveat. Four runs per level; and typed intent, transactions and the actuation channel change together, so this pilot does not say which one does the work.