Metadata-Version: 2.4
Name: parseforge
Version: 0.3.2
Summary: LLM-driven pipeline that forges, validates, and promotes TextFSM templates from network CLI output
Author-email: Tuyen Mathew Duong <tuyen@geekstrident.com>
Maintainer-email: Tuyen Mathew Duong <tuyen@geekstrident.com>
License: MIT
Keywords: textfsm,network automation,cli parsing,template generator,ai,llm,netmiko,device output parsing
Classifier: Development Status :: 2 - Pre-Alpha
Classifier: Intended Audience :: Developers
Classifier: Intended Audience :: Information Technology
Classifier: Intended Audience :: System Administrators
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Topic :: Software Development :: Libraries
Classifier: Topic :: Software Development :: Code Generators
Classifier: Topic :: Text Processing
Classifier: Topic :: Utilities
Classifier: Operating System :: OS Independent
Requires-Python: >=3.9
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: click>=8.1
Requires-Dist: PyYAML>=6.0
Requires-Dist: textfsm>=1.1.0
Requires-Dist: textfsm-ai>=0.7.1
Requires-Dist: anyask>=0.1.1
Provides-Extra: anthropic
Requires-Dist: anyask[anthropic]>=0.1.1; extra == "anthropic"
Requires-Dist: textfsm-ai[anthropic]>=0.7.1; extra == "anthropic"
Provides-Extra: deepseek
Requires-Dist: anyask[deepseek]>=0.1.1; extra == "deepseek"
Requires-Dist: textfsm-ai[deepseek]>=0.7.1; extra == "deepseek"
Provides-Extra: openai
Requires-Dist: anyask[openai]>=0.1.1; extra == "openai"
Requires-Dist: textfsm-ai[openai]>=0.7.1; extra == "openai"
Provides-Extra: groq
Requires-Dist: anyask[groq]>=0.1.1; extra == "groq"
Requires-Dist: textfsm-ai[groq]>=0.7.1; extra == "groq"
Provides-Extra: xai
Requires-Dist: anyask[xai]>=0.1.1; extra == "xai"
Requires-Dist: textfsm-ai[xai]>=0.7.1; extra == "xai"
Provides-Extra: together
Requires-Dist: anyask[together]>=0.1.1; extra == "together"
Requires-Dist: textfsm-ai[together]>=0.7.1; extra == "together"
Provides-Extra: fireworks
Requires-Dist: anyask[fireworks]>=0.1.1; extra == "fireworks"
Requires-Dist: textfsm-ai[fireworks]>=0.7.1; extra == "fireworks"
Provides-Extra: perplexity
Requires-Dist: anyask[perplexity]>=0.1.1; extra == "perplexity"
Requires-Dist: textfsm-ai[perplexity]>=0.7.1; extra == "perplexity"
Provides-Extra: openrouter
Requires-Dist: anyask[openrouter]>=0.1.1; extra == "openrouter"
Requires-Dist: textfsm-ai[openrouter]>=0.7.1; extra == "openrouter"
Provides-Extra: moonshot
Requires-Dist: anyask[moonshot]>=0.1.1; extra == "moonshot"
Requires-Dist: textfsm-ai[moonshot]>=0.7.1; extra == "moonshot"
Provides-Extra: cerebras
Requires-Dist: anyask[cerebras]>=0.1.1; extra == "cerebras"
Requires-Dist: textfsm-ai[cerebras]>=0.7.1; extra == "cerebras"
Provides-Extra: mistral
Requires-Dist: anyask[mistral]>=0.1.1; extra == "mistral"
Requires-Dist: textfsm-ai[mistral]>=0.7.1; extra == "mistral"
Provides-Extra: cohere
Requires-Dist: anyask[cohere]>=0.1.1; extra == "cohere"
Requires-Dist: textfsm-ai[cohere]>=0.7.1; extra == "cohere"
Provides-Extra: azure
Requires-Dist: anyask[azure]>=0.1.1; extra == "azure"
Requires-Dist: textfsm-ai[azure]>=0.7.1; extra == "azure"
Provides-Extra: gemini
Requires-Dist: anyask[gemini]>=0.1.1; extra == "gemini"
Requires-Dist: textfsm-ai[gemini]>=0.7.1; extra == "gemini"
Provides-Extra: vertexai
Requires-Dist: anyask[vertexai]>=0.1.1; extra == "vertexai"
Requires-Dist: textfsm-ai[vertexai]>=0.7.1; extra == "vertexai"
Provides-Extra: bedrock
Requires-Dist: anyask[bedrock]>=0.1.1; extra == "bedrock"
Requires-Dist: textfsm-ai[bedrock]>=0.7.1; extra == "bedrock"
Provides-Extra: oci
Requires-Dist: anyask[oci]>=0.1.1; extra == "oci"
Requires-Dist: textfsm-ai[oci]>=0.7.1; extra == "oci"
Provides-Extra: sampling
Requires-Dist: netmiko>=4.0; extra == "sampling"
Provides-Extra: dev
Requires-Dist: pytest>=8.0.0; extra == "dev"
Requires-Dist: pytest-cov>=5.0.0; extra == "dev"
Requires-Dist: ruff>=0.4.0; extra == "dev"
Requires-Dist: black>=24.0.0; extra == "dev"
Requires-Dist: mypy>=1.10.0; extra == "dev"
Requires-Dist: anyask[all]>=0.1.1; extra == "dev"
Provides-Extra: release
Requires-Dist: bump2version; extra == "release"
Requires-Dist: build; extra == "release"
Dynamic: license-file

# ParseForge

LLM-driven pipeline that forges, cross-validates, and promotes [TextFSM](https://github.com/google/textfsm)
templates from network device CLI output.

Full design plan: [SPEC.md](https://github.com/Geeks-Trident-LLC/parseforge/blob/main/SPEC.md).

## What is ParseForge?

Network devices — routers, switches, firewalls — only speak in plain text:
the output of a `show` command. To use that output in a script, dashboard,
or automation tool, something has to turn it into structured data first.
That "something" is a [TextFSM](https://github.com/google/textfsm)
template: a set of parsing rules for one specific command's output.

ParseForge writes those templates for you. Point it at a device (or a
saved copy of its output) and an AI provider of your choice, and it
produces a template, checks that the template actually parses the sample
it was built from, and tracks the result so you can see exactly how much
it's been tested before you trust it in production.

## Why do you need ParseForge?

Every network automation project eventually hits the same wall: someone
has to write and maintain a parser for every command's output, by hand,
in regex. It's slow, it's easy to get subtly wrong, and it only gets
worse as you add more device types, vendors, and firmware versions —
each with its own quirks in how the same command's output is formatted.

ParseForge replaces that manual work with a repeatable pipeline: an AI
drafts the parser, ParseForge verifies it against real output before
trusting it, and only well-tested results get promoted to production use
automatically — anything uncertain is queued for a quick human look
instead of shipped blind. If your team does network automation and needs
structured data out of CLI output, ParseForge is the part that used to be
tedious, made fast and safe instead.

## Features

- **Nothing ships unreviewed.** Every AI-generated template starts as
  unproven evidence. Once it's been tested enough times with consistent
  results, it's promoted automatically; anything less certain waits for a
  person to check it.
- **Learns a command once, reuses it forever.** The first time a command
  runs, ParseForge asks the AI to name it; every time after that, it's
  a free, instant lookup — no repeat AI calls, no repeat cost.
- **Checks its own work.** Every generated template is tested against the
  real output it was built from before it's ever counted as a pass.
- **Notices when things change.** If a device's output format changes
  later, ParseForge catches it and automatically kicks off a retest,
  instead of quietly parsing it wrong.
- **Use it your way.** A command-line tool for quick, ad hoc use, or a
  Python library for wiring straight into your own automation — same
  functionality either way.

## Supported providers

Eighteen AI providers behind one common interface — mix and match, or use
two different ones in the same run:

Anthropic, OpenAI, DeepSeek, Groq, xAI, Together, Fireworks, Perplexity,
OpenRouter, Moonshot, Cerebras, Mistral, Cohere, Azure OpenAI, Google
Gemini, Google Vertex AI, Amazon Bedrock, and Oracle Cloud Infrastructure
(OCI) — including the four with non-standard authentication (Azure
deployment names, GCP Application Default Credentials, AWS's own
credential chain, OCI request-signing), handled transparently. See
[Providers](https://geeks-trident-llc.github.io/parseforge/guides/providers/)
for each one's install extra, auth requirements, and default model.

## Installation

```bash
# minimal install, no AI-provider SDK
pip install parseforge

# with a provider extra, e.g. anthropic
pip install parseforge[anthropic]

# local development
pip install -e ".[dev,sampling]"
```

For the full extras list (all eighteen providers, `sampling`, combining
extras, per-provider `requirements/` files, and the dev/test/release
setup), see
[Installation](https://geeks-trident-llc.github.io/parseforge/getting-started/installation/).

## Reference

- [Documentation site](https://geeks-trident-llc.github.io/parseforge/) ([source](./docs/index.md))
- [Quickstart](https://geeks-trident-llc.github.io/parseforge/getting-started/quickstart/) — a full walkthrough, from a single lookup to the end-to-end workflow
- [Providers](https://geeks-trident-llc.github.io/parseforge/guides/providers/) — every provider's extra, auth requirements, and default model
- [CLI Guide](https://geeks-trident-llc.github.io/parseforge/guides/cli/) — every command, in full
- [Python API guide](https://geeks-trident-llc.github.io/parseforge/guides/python-api/) — calling parseforge from Python instead of the CLI
- [API Reference](https://geeks-trident-llc.github.io/parseforge/reference/api/) — every public function/class, by pipeline stage
- [Changelog](https://geeks-trident-llc.github.io/parseforge/changelog/) — what shipped in each release
- [SPEC.md](https://github.com/Geeks-Trident-LLC/parseforge/blob/main/SPEC.md) — full design plan and open questions
