Skip to content

Commit eecf716

Browse files
authored
Merge pull request #8
Refine documentation and publish client image for releases
2 parents 7fe1e80 + d55a236 commit eecf716

28 files changed

Lines changed: 13891 additions & 75 deletions

.github/workflows/client-agent-image.yml

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,8 @@ name: client-agent-image
22

33
on:
44
push:
5-
branches:
6-
- main
75
tags:
86
- "v*"
9-
paths:
10-
- ".github/workflows/client-agent-image.yml"
11-
- ".dockerignore"
12-
- "containers/client/**"
13-
- "native/client-agent/**"
147
workflow_dispatch:
158

169
concurrency:
@@ -38,11 +31,8 @@ jobs:
3831
shell: bash
3932
run: |
4033
tags="yyyyyt123/netopsbench-client:sha-${GITHUB_SHA}"
41-
if [[ "${GITHUB_REF}" == "refs/heads/main" ]]; then
42-
tags="${tags}"$'\n'"yyyyyt123/netopsbench-client:latest"
43-
fi
4434
if [[ "${GITHUB_REF_TYPE}" == "tag" ]]; then
45-
tags="${tags}"$'\n'"yyyyyt123/netopsbench-client:${GITHUB_REF_NAME}"
35+
tags="${tags}"$'\n'"yyyyyt123/netopsbench-client:${GITHUB_REF_NAME}"$'\n'"yyyyyt123/netopsbench-client:latest"
4636
fi
4737
{
4838
echo "value<<EOF"

README.md

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -24,18 +24,11 @@ NetOpsBench is an open benchmark arena for agentic network troubleshooting — r
2424

2525
## Why NetOpsBench
2626

27-
Developing and evaluating agentic root cause analysis methods for network troubleshooting remains challenging, with three core bottlenecks hindering further advancement:
28-
29-
![NetOpsBench motivation](docs/public/assets/Motivation.png)
30-
31-
| Gap | The problem | How NetOpsBench closes it |
32-
|---|---|---|
33-
| **No fair comparison** | Varied network topologies, fault sets, observability tools, and evaluation metrics hinder the comparison of agentic troubleshooting strategies across the research community. | NetOpsBench unifies fault scenarios, observability access and scoring rules to support agent comparison on a shared benchmark. |
34-
| **Non-reproducible faults** | Real network incidents cannot be reliably reproduced or labeled with consistent ground truth, slowing iterative improvement and evaluation of troubleshooting agents. | Containerlab + SONiC-VS inject controlled, reproducible faults with stable labels, so every run is an identical, repeatable episode. |
35-
| **Non-Interactive Environment** | Static topology snapshots and logs cannot provide live probing and telemetry signals required by agents for diagnostic work. | NetOpsBench offers an interactive environment for agents to operate within live networks, capturing real-time Pingmesh data, gNMI telemetry and switch CLI evidence during every episode. |
36-
37-
27+
Troubleshooting agents are difficult to compare when the network, incident, and evidence change from run to run. NetOpsBench turns those variables into a controlled live benchmark:
3828

29+
- **Reproducible incidents** — labeled faults run against repeatable SONiC-VS and Containerlab topologies.
30+
- **Interactive evidence** — agents inspect live Pingmesh, BGP, gNMI, syslog, and switch state instead of static logs.
31+
- **Comparable outcomes** — one evaluator measures detection, localization, efficiency, and tool use across agent strategies.
3932

4033
## Overview
4134

@@ -47,6 +40,11 @@ It is built for researchers and engineers who want to compare LLM-backed, symbol
4740

4841
## News
4942

43+
- **2026-08**: 🚀 **NetOpsBench v0.2.0** - Large-topology benchmark release.
44+
- Add Xlarge CLOS and Fat-tree K=8/K=12 profiles, with 70 generated cases per large topology.
45+
- Replace per-client Python Pingmesh and iperf processes with the native Rust client agent for Pingmesh and background traffic.
46+
- Harden large-topology fault injection, recovery, observability, and exact runtime teardown.
47+
- Publish a versioned DeepSeek validation snapshot across all seven supported scales. See the [v0.2.0 release notes](docs/content/docs/releases/v0.2.0.mdx).
5048
- **2026-05**: 🎉 **Initial Release** - NetOpsBench is now available as an open arena for agentic network troubleshooting.
5149
- Provide public SDK with `run_scenario()` and `run_suite()` APIs to launch live network environments from Python.
5250
- Equip native MCP tools of complete observability utilities and pre-configured SONiC-VS network covering XS, Small, Medium and Large scales.
@@ -96,11 +94,27 @@ Scenario YAML files define the benchmark case: topology scale, traffic profile,
9694

9795
NetOpsBench reports detection, fault type, device/interface localization, runtime, tool calls, and token usage so troubleshooting quality and operational cost can be compared together.
9896

99-
![Composite benchmark score](docs/public/assets/benchmark/fig_avg_score.png)
97+
| Scale | Topology | Switches | Clients | Cases |
98+
|---|---|---:|---:|---:|
99+
| XS | CLOS | 4 | 2 | 14 |
100+
| Small | CLOS | 6 | 8 | 15 |
101+
| Medium | CLOS | 12 | 16 | 28 |
102+
| Large | CLOS | 20 | 64 | 52 |
103+
| Xlarge | CLOS | 144 | 128 | 70 |
104+
| Fat-tree K=8 | Fat-tree | 80 | 128 | 70 |
105+
| Fat-tree K=12 | Fat-tree | 180 | 144 | 70 |
106+
107+
**Diagnosis score** is the mean end-to-end case score: healthy cases require the correct verdict, while fault cases receive localization credit only after the fault is detected. **Fault detection F1** measures the fault-versus-healthy decision independently.
100108

101-
Read [Benchmark Methodology](docs/content/docs/run-benchmarks/methodology.mdx) for scoring definitions and [Benchmark Results](docs/content/docs/run-benchmarks/results.mdx) for an example completed suite.
109+
![Diagnosis score and Fault detection F1 across all seven NetOpsBench v0.2.0 topology scales](docs/public/assets/benchmark/fig_deepseek_v02_overview.svg)
102110

103-
Public agent trajectory artifacts are available in the [NetOpsBench Trace Dataset](https://huggingface.co/datasets/yyyyyt/netopsbench-trace), including Harbor/ATIF traces, run reports, and summary CSVs for reproducible analysis.
111+
The largest validated Fat-tree profile provides a compact case-level view. Each square below is one K=12 case; detailed cross-topology observability analysis remains in the full results.
112+
113+
![All 70 Fat-tree K=12 cases grouped by fault family and diagnosis outcome](docs/public/assets/benchmark/fig_deepseek_v02_k12_cases.svg)
114+
115+
Read the [v0.2.0 release notes](docs/content/docs/releases/v0.2.0.mdx), [Benchmark Methodology](docs/content/docs/run-benchmarks/methodology.mdx), and [Benchmark Results](docs/content/docs/run-benchmarks/results.mdx) for the full validation snapshot and scoring definitions.
116+
117+
The public [NetOpsBench Trace Dataset](https://huggingface.co/datasets/yyyyyt/netopsbench-trace) contains both the earlier cross-model snapshot and the [v0.2 seven-scale release](https://huggingface.co/datasets/yyyyyt/netopsbench-trace/tree/main/releases/netopsbench-0.2): 319 validated DeepSeek Harbor/ATIF trajectories across XS through Fat-tree K=12. Aggregate metrics and immutable publication provenance are recorded in the [v0.2 result snapshot](docs/public/assets/benchmark/deepseek_v02_release.json).
104118

105119
## Learn More
106120

@@ -119,10 +133,6 @@ Public agent trajectory artifacts are available in the [NetOpsBench Trace Datase
119133
- Global community: [NetOpsBench Slack](https://join.slack.com/t/netopsbench/shared_invite/zt-3zhhfangj-2U4dU_NSfCy1rcOM1dmuvQ)
120134
- Chinese-language community: [NetOpsBench Feishu group](https://applink.feishu.cn/client/chat/chatter/add_by_link?link_token=595v4390-2a51-4db0-baa4-811821b47448)
121135

122-
## Contributing
123-
124-
Contributions are welcome for benchmark scenarios, fault types, SDK ergonomics, documentation, and evaluation workflows.
125-
126136
## License
127137

128138
NetOpsBench is released under the MIT License. See [LICENSE](LICENSE).

docs/content/docs/debug-operate/observability.mdx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,8 @@ or deleted.
120120

121121
## Cleanup
122122

123+
Xlarge and Fat-tree labs can consume substantial CPU, memory, container, and telemetry capacity. Start with one worker, inspect `docker stats`, host memory and pressure, and confirm one complete baseline before increasing concurrency. Keeping a topology warm is useful for repeated experiments, but do not leave unused large workers running alongside a new campaign.
124+
123125
SDK-visible runtimes:
124126

125127
```bash
@@ -129,6 +131,8 @@ netopsbench runtime teardown <runtime-name>
129131
netopsbench runtime teardown --all
130132
```
131133

134+
Prefer the exact runtime name. `teardown --all` is intended only when every runtime registered in the current workspace is owned by the caller; it is not a substitute for host-wide Docker cleanup. Do not use global `docker system prune`, broad container-name filters, or shared-network deletion on multi-user hosts.
135+
132136
Manual deployment teardown:
133137

134138
```bash

docs/content/docs/index.mdx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ description: Documentation map for implementing, running, and evaluating NetOpsB
55

66
NetOpsBench evaluates troubleshooting agents on generated data-center network fault scenarios. A run provisions a SONiC-VS / Containerlab topology, injects a controlled fault or healthy episode, exposes runtime evidence, calls an agent, and scores the returned `DiagnosisResult` against scenario ground truth.
77

8+
<Callout title="NetOpsBench v0.2.0 · 2026-08" type="info">
9+
The current release adds Xlarge CLOS, Fat-tree K=8/K=12, and the native Rust Pingmesh/traffic client agent. Read the [v0.2.0 release notes](/docs/releases/v0.2.0).
10+
</Callout>
11+
812
These docs are organized around the agent-development workflow.
913

1014
## Main path
@@ -71,4 +75,5 @@ These docs are organized around the agent-development workflow.
7175

7276
- [System Overview](/docs/architecture/system-overview) explains the runtime loop, evidence path, worker isolation, and report aggregation.
7377
- [Benchmark Methodology](/docs/run-benchmarks/methodology) defines scenario coverage, scoring, negative samples, and optional semantic fault-type matching.
74-
- [Benchmark Results](/docs/run-benchmarks/results) records one completed cross-model run for comparison context.
78+
- [Benchmark Results](/docs/run-benchmarks/results) reports the current seven-scale v0.2 validation; [Legacy Results](/docs/run-benchmarks/legacy-results) preserves the earlier cross-model snapshot separately.
79+
- [NetOpsBench v0.2.0](/docs/releases/v0.2.0) summarizes the Xlarge, Fat-tree, native client-agent, and lifecycle release.

docs/content/docs/meta.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
"quickstart",
66
"build-your-agent",
77
"run-benchmarks",
8+
"releases",
89
"debug-operate",
910
"extend-netopsbench",
1011
"architecture"

docs/content/docs/quickstart.mdx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ description: The shortest path from a fresh clone to one completed NetOpsBench r
55

66
This page verifies that the host can run one benchmark case. It stops after the first `BenchmarkReport`; agent implementation and larger benchmark runs are covered separately.
77

8+
Use XS for installation verification even when the eventual target is Xlarge or Fat-tree. It exercises the same SDK, native client-agent, observability, fault, scoring, and cleanup path with a much smaller resource footprint.
9+
810
## Requirements
911

1012
<Callout title="Linux host required" type="warn">
@@ -83,6 +85,8 @@ PYTHONPATH=. python examples/01_run_scenario.py --vendor openai
8385

8486
The run provisions an XS topology, starts observability, injects one generated fault, calls the reference agent, scores the returned diagnosis, and writes a `BenchmarkReport`.
8587

88+
`netopsbench benchmark prepare` only generates topology and scenario assets. It does not deploy a lab, start telemetry, or reserve resources; deployment begins when a session or runtime command is executed.
89+
8690
## After success
8791

8892
- Open saved agent trajectories with `netopsbench trace view`; it syncs trace-enabled runs into the local Harbor viewer cache automatically.
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"title": "Releases",
3+
"pages": ["v0.2.0"]
4+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
---
2+
title: NetOpsBench v0.2.0
3+
description: Xlarge CLOS, Fat-tree, and native client-agent release notes.
4+
---
5+
6+
**Released: 2026-08**
7+
8+
NetOpsBench v0.2.0 extends the live benchmark from the original CLOS profiles to Xlarge CLOS and two multi-tier Fat-tree profiles. It also replaces the client-side Python Pingmesh and iperf process fleet with a native Rust client agent while preserving the public observation, tool, evaluator, and SDK contracts.
9+
10+
## Large topology profiles
11+
12+
| Profile | Family | Switches | Clients | Cases | Operational | Agent-scored |
13+
|---|---|---:|---:|---:|---:|---:|
14+
| Xlarge | CLOS | 144 | 128 | 70 | 70 / 70 | 70 / 70 |
15+
| Fat-tree K=8 | Fat-tree | 80 | 128 | 70 | 70 / 70 | 70 / 70 |
16+
| Fat-tree K=12 | Fat-tree | 180 | 144 | 70 | 70 / 70 | 70 / 70 |
17+
18+
Each profile contains four healthy cases and fault cases spanning physical links, devices, impairments, routing, BGP, policy, and ACL behavior. Fault placement covers access and upper-fabric tiers; endpoint Pingmesh can remain healthy when ECMP successfully preserves forwarding, while interface and control-plane telemetry still expose the degraded redundancy.
19+
20+
## Runtime changes
21+
22+
- A single Rust binary runs independent Pingmesh and background-traffic processes in every client.
23+
- Pingmesh uses compact topology configuration, kernel receive timestamps, topology-local Telegraf ingestion, and full-window anomaly semantics.
24+
- Background traffic is runtime-owned and health-checked as a complete flow matrix instead of being recreated for every case.
25+
- Fault injection and recovery use transactional state tracking, readback, convergence checks, quarantine, and exact resource cleanup.
26+
- Large BGP collections preserve fast transition/index data while writing stable full snapshots at a lower cadence.
27+
28+
## Compatibility and results
29+
30+
The stable `netopsbench.sdk` agent, scenario, report, and tool entrypoints remain available. The v0.2 result snapshot is a release-validation reference, not a permanent model ranking; provider behavior and agent strategies can change independently of the benchmark contract.
31+
32+
See [Benchmark Results](/docs/run-benchmarks/results) for accuracy, localization, observability, cost, and trace inventory, the [public v0.2 trace release](https://huggingface.co/datasets/yyyyyt/netopsbench-trace/tree/main/releases/netopsbench-0.2) for all 319 ATIF trajectories, and [Benchmark Methodology](/docs/run-benchmarks/methodology) for the exact scoring and detector semantics.
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
---
2+
title: Legacy Cross-model Results
3+
description: Earlier four-model NetOpsBench comparison retained for within-snapshot analysis.
4+
---
5+
6+
This snapshot predates the NetOpsBench v0.2.0 release rerun. Its four models were evaluated under the same earlier contract, so it remains useful for within-snapshot comparison. Do not combine these values with the current [v0.2.0 Results](/docs/run-benchmarks/results) as if both snapshots used the same runtime and detector contract.
7+
8+
## Experiment scope
9+
10+
| Dimension | Values |
11+
|---|---|
12+
| Models | Kimi K2.6, DeepSeek V4 Pro, OpenAI GPT-5.5, MiniMax M3 |
13+
| Topology scales | XS, Small, Medium, Large |
14+
| Fault types | 12 canonical types across link, routing, impairment, system, and ACL categories |
15+
| Quality metrics | Verdict F1-score, device localization, interface localization, composite score |
16+
| Efficiency metrics | Diagnosis time, tool calls, input/output tokens |
17+
18+
## Cross-scale snapshot
19+
20+
Each cell is `XS → Large`.
21+
22+
| Model | Verdict F1 (%) | Device Loc (%) | Interface Loc (%) | Composite (%) | Avg Time (s) | Avg Tools | Input Tokens (K) |
23+
|---|---:|---:|---:|---:|---:|---:|---:|
24+
| Kimi K2.6 | 76.2 → 84.7 | 66.7 → 75.0 | 71.4 → 71.4 | 64.3 → 74.0 | 272.0 → 399.5 | 36.5 → 38.8 | 367.6 → 741.1 |
25+
| DeepSeek V4 Pro | 100.0 → 97.9 | 83.3 → 91.7 | 57.1 → 57.1 | 78.6 → 83.7 | 83.1 → 83.1 | 24.9 → 20.7 | 247.6 → 477.3 |
26+
| OpenAI GPT-5.5 | 95.7 → 95.8 | 83.3 → 79.2 | 57.1 → 21.4 | 75.0 → 60.6 | 71.9 → 85.0 | 17.9 → 15.9 | 85.4 → 153.7 |
27+
| MiniMax M3 | 80.0 → 82.9 | 50.0 → 62.5 | 71.4 → 42.9 | 60.7 → 58.7 | 214.3 → 230.3 | 26.4 → 24.0 | 133.3 → 316.1 |
28+
29+
Verdict classification was generally easier than precise localization. Interface localization was the weakest quality metric on larger topologies.
30+
31+
## Quality metrics
32+
33+
![Legacy Verdict F1-score across XS through Large](/assets/benchmark/fig_verdict_f1.png)
34+
35+
![Legacy device localization across XS through Large](/assets/benchmark/fig_device_loc.png)
36+
37+
![Legacy interface localization across XS through Large](/assets/benchmark/fig_intf_loc.png)
38+
39+
![Legacy composite score across XS through Large](/assets/benchmark/fig_avg_score.png)
40+
41+
## Runtime cost
42+
43+
![Legacy average diagnosis time across XS through Large](/assets/benchmark/fig_avg_time.png)
44+
45+
![Legacy tool calls across XS through Large](/assets/benchmark/fig_tool_calls.png)
46+
47+
![Legacy input tokens across XS through Large](/assets/benchmark/fig_input_tokens.png)
48+
49+
![Legacy output tokens across XS through Large](/assets/benchmark/fig_output_tokens.png)
50+
51+
Compare cost with localization quality, not verdict quality alone. Higher tool or token use does not automatically improve device or interface precision.
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
{
22
"title": "Benchmark Runs",
3-
"pages": ["run-scenario-vs-suite", "interactive-simulator", "methodology", "results"]
3+
"pages": ["run-scenario-vs-suite", "interactive-simulator", "methodology", "results", "legacy-results"]
44
}

0 commit comments

Comments
 (0)