neterse — minimum-token renderings of network CLI output for LLM agents. The `| brief` the vendor never shipped.
Project description
neterse
Minimum-token renderings of network CLI output for LLM agents — the
| brief the vendor never shipped.
LLM-driven network agents burn most of their context window on the noise in
show-command output: separator dashes, static legends, wrapped headers,
all-zero counter tables, and keys repeated on every row. neterse rewrites
that output into the smallest representation that preserves the semantics,
before it enters model context — so agents spend tokens on reasoning, not
formatting. Savings of 40–60% are typical on tabular output; on huge
mostly-zero tables, compression is the difference between a truncated tool
result and a complete one.
from neterse import render, optimize
# Full API — every candidate that shrinks the output; policy is yours:
candidates = render(raw, command="show interface status", platform="cisco_nxos")
best = min(candidates, key=lambda c: len(c.text), default=None)
# Convenience wrapper — smallest candidate's text, or raw unchanged:
compact = optimize("show interface status", raw)
# Parsed tier — rows Genie/ntc-templates already produced, re-encoded
# header-once (beats json.dumps(rows) by ~45-50% on multi-row output):
candidates = render(raw, command="show ip int brief", parsed=rows)
# Opt-in declared-lossy projection; the rendering itself says what was
# withheld: "[omitted: name, vlan, ... — re-query profile=full]"
candidates = render(raw, command="show interface status", profile="updown")
Port Name Status Vlan Duplex Speed Type
--------------------------------------------------------------------------------
Eth1/11 RSRFF206 Twe1/0/3 connected routed full 10G 10Gbase-SR
Eth1/45 RFRA3213-Eth1/48 connected routed full 10G 10Gbase-LR
│
▼ neterse
port,name,status,vlan,duplex,speed,type
Eth1/11,RSRFF206 Twe1/0/3,connected,routed,full,10G,10Gbase-SR
Eth1/45,RFRA3213-Eth1/48,connected,routed,full,10G,10Gbase-LR
Install
pip install neterse # import name: neterse
Named neterse ("network terse") because the natural name
terseis occupied on PyPI by an unrelated package abandoned in 2019. Distribution, import, and CLI all share the one name.
Design in one paragraph
Two tiers, one contract. The raw-text tier compresses CLI output
directly — declarative specs drive generic strategies (fixed-width
table → CSV, line-regex table → CSV, key-value scan), with plain-Python
compressors as the escape hatch for genuinely stateful formats. The
parsed tier re-encodes rows that Genie / ntc-templates / TTP / NAPALM
already parsed into compact header-once form (render(..., parsed=rows)
→ CSV and TOON-style candidates that undercut json.dumps(rows) by
~45–50%). Opt-in profiles (profile="updown") narrow output to a
declared projection and say so inline
([omitted: … — re-query profile=full]). Both tiers emit Candidates;
the library never picks a winner — smallest-wins, ledgers, metrics,
and caching belong to the consumer. Full architecture:
docs/DESIGN.md.
Invariants
- Fail-open, always. A compressor that raises, returns a non-string, returns empty, or fails to shrink produces no candidate. Raw data is never lost and never enlarged.
- Zero runtime dependencies. Standard library only — enforced in CI.
Tokenizers are a CI concern;
Candidate.est_tokens()is a chars/4 estimate by design. - Candidates, not policy. Consumers decide what to send to the model.
- Preserve semantically relevant data; declare every drop. Noise
(separators, legends, all-zero rows — kept visible via explicit
(all zero)markers) is dropped freely; anything else a rendering omits must be declared machine-readably on the candidate (Candidate.dropped_fields). - Byte-parity discipline. The original implementation is
frozen in-tree (
tests/legacy_snapshot.py); the parity suite replays a cross-matrix corpus and pins today's outputs byte-for-byte. Engine refactors may change how, never what. Intentional output changes are recorded baseline decisions.
Provenance & prior art
neterse grew out of a TOON optimizer ("Token-Optimized Output for Networks", inspired by NetClaw's TOON serialization work) built for a network agent, and is now a standalone, community-extensible library. It complements — not competes with — the parsing ecosystems: ntc-templates, Genie/pyATS and TTP turn CLI text into structure; neterse makes structure (and unparseable raw text) cheap to show to a model. The tabular encoding aligns with TOON — Token-Oriented Object Notation; emitting spec-compliant TOON for uniform tables is on the roadmap.
Roadmap
| Phase | Contents | Status |
|---|---|---|
| 0 | API frozen (render/Candidate/optimize/register); 15 compressor families extracted verbatim; byte-parity baseline |
✅ |
| 1 | Spec engine (generic strategies over declarative specs), platform-keyed dispatch, declared-lossiness manifests | ✅ |
| 2 | Parsed tier: field projection + compact encoders (CSV/TOON) over pre-parsed rows; opt-in profiles with inline omission markers; kv_extract strategy |
✅ |
| 3 | neterse audit coverage tool, fixture-per-file contribution flow, CI token-savings regression (pinned tokenizer), multi-vendor expansion (Arista EOS, Junos, Aruba AOS-CX, MikroTik), PyPI release machinery |
✅ |
| 4 | Consumers swap vendored copies for the pip dependency; propose a TOON profile for network data upstream | ▢ |
Coverage
Command families ship for Cisco IOS/IOS-XE/NX-OS (15 legacy families:
routes, interfaces, BGP/OSPF/EIGRP neighbors, CDP/LLDP, VLANs, ACLs,
counters, port-channels, version, running-config), Arista EOS
(interfaces status, ip arp, vlan), Juniper Junos (interfaces terse,
ospf neighbor), Aruba AOS-CX (interface brief, vlan) and MikroTik
RouterOS (/ip address print, /interface print) — and the parsed
tier covers anything your parser already handles, on any platform.
Measure coverage over your own agent's traffic with the bundled CLI:
neterse audit run.jsonl --show 3 # {"command":..., "platform":..., "raw":...} per line
neterse audit tests/fixtures # or point it at a fixture tree
It reports per-family reduction, what reached the model uncompressed
(NO COMPRESSOR / false-match / platform-skip), and each winning
entry's declared drops — the gaps it prints are, in order, the next
specs worth contributing.
Contributing
See CONTRIBUTING.md. Short version: most new command
families are a spec dict plus two fixture files
(tests/fixtures/<platform>/<family>/{commands.txt,raw.txt}) — no parser
code, and the suite auto-covers anything dropped there. The escape hatch
for stateful formats is a plain function under the same fail-open
contract.
License
Apache-2.0 — see LICENSE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file neterse-0.1.0.tar.gz.
File metadata
- Download URL: neterse-0.1.0.tar.gz
- Upload date:
- Size: 54.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dce432842f96e81be197bb0504ee8535f4dc252c71d1525c6781b3cad87fa3cb
|
|
| MD5 |
b3278ade0f2509c9782cf62972a4a991
|
|
| BLAKE2b-256 |
ccb52718bf49f1ecf704d23b8b2115c55dedbc9f9efb096e5482c6bccf6cc239
|
Provenance
The following attestation bundles were made for neterse-0.1.0.tar.gz:
Publisher:
release.yml on pcDamasceno/neterse
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
neterse-0.1.0.tar.gz -
Subject digest:
dce432842f96e81be197bb0504ee8535f4dc252c71d1525c6781b3cad87fa3cb - Sigstore transparency entry: 2340415822
- Sigstore integration time:
-
Permalink:
pcDamasceno/neterse@0993c25686a9e988bf8919680bcc0dba0551451a -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/pcDamasceno
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@0993c25686a9e988bf8919680bcc0dba0551451a -
Trigger Event:
push
-
Statement type:
File details
Details for the file neterse-0.1.0-py3-none-any.whl.
File metadata
- Download URL: neterse-0.1.0-py3-none-any.whl
- Upload date:
- Size: 38.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c0019d13c03f89b4444013a51a63b69d013c9c7f408241776147951a246b32c4
|
|
| MD5 |
174c6cf1658db28c0c12187bc50cc7fa
|
|
| BLAKE2b-256 |
8e71fd095b12b892030160f6fdff354dfe8acd64db6f529a26a673f898cf0718
|
Provenance
The following attestation bundles were made for neterse-0.1.0-py3-none-any.whl:
Publisher:
release.yml on pcDamasceno/neterse
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
neterse-0.1.0-py3-none-any.whl -
Subject digest:
c0019d13c03f89b4444013a51a63b69d013c9c7f408241776147951a246b32c4 - Sigstore transparency entry: 2340415836
- Sigstore integration time:
-
Permalink:
pcDamasceno/neterse@0993c25686a9e988bf8919680bcc0dba0551451a -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/pcDamasceno
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@0993c25686a9e988bf8919680bcc0dba0551451a -
Trigger Event:
push
-
Statement type: