Metadata-Version: 2.4
Name: ega
Version: 1.0.0
Summary: Runtime enforcement layer for LLM outputs.
Author-email: Bharath Nunepalli <bn3020@protonmail.com>
Maintainer-email: Bharath Nunepalli <bn3020@protonmail.com>
License: Apache-2.0
Project-URL: Homepage, https://github.com/bh3r1th/llm-evidence-gated-generation
Project-URL: Repository, https://github.com/bh3r1th/llm-evidence-gated-generation
Project-URL: Issues, https://github.com/bh3r1th/llm-evidence-gated-generation/issues
Project-URL: Changelog, https://github.com/bh3r1th/llm-evidence-gated-generation/blob/main/CHANGELOG.md
Keywords: llm,grounding,verification,policy,enforcement
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: Apache Software License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Topic :: Software Development :: Libraries
Requires-Python: >=3.10
Description-Content-Type: text/markdown
License-File: LICENSE
Provides-Extra: unitize
Requires-Dist: spacy<4.0,>=3.7; extra == "unitize"
Provides-Extra: nli
Requires-Dist: torch>=2.0; (platform_system != "Darwin" or platform_machine != "arm64") and extra == "nli"
Requires-Dist: transformers>=4.40; extra == "nli"
Requires-Dist: sentencepiece; extra == "nli"
Requires-Dist: accelerate; extra == "nli"
Requires-Dist: rank_bm25; extra == "nli"
Provides-Extra: rerank
Requires-Dist: sentence-transformers>=2.7; extra == "rerank"
Provides-Extra: wandb
Requires-Dist: wandb>=0.16; extra == "wandb"
Provides-Extra: all
Requires-Dist: spacy<4.0,>=3.7; extra == "all"
Requires-Dist: torch>=2.0; (platform_system != "Darwin" or platform_machine != "arm64") and extra == "all"
Requires-Dist: transformers>=4.40; extra == "all"
Requires-Dist: sentencepiece; extra == "all"
Requires-Dist: accelerate; extra == "all"
Requires-Dist: rank_bm25; extra == "all"
Requires-Dist: sentence-transformers>=2.7; extra == "all"
Requires-Dist: wandb>=0.16; extra == "all"
Provides-Extra: dev
Requires-Dist: pytest; extra == "dev"
Requires-Dist: ruff; extra == "dev"
Requires-Dist: mypy; extra == "dev"
Requires-Dist: pre-commit; extra == "dev"
Dynamic: license-file

# EGA

EGA is not an eval tool. It is a runtime enforcement layer.

## What problem it solves

LLM outputs are candidates, not answers. EGA verifies each claim against source evidence at runtime before allowing output downstream. Eval tools score after the fact. EGA enforces before emit.

## Install

```bash
pip install ega
```

## Usage

```python
from ega import verify_answer
from ega.config import PipelineConfig, VerifierConfig
from ega.contract import PolicyConfig

config = PipelineConfig(
    policy=PolicyConfig(),
    verifier=VerifierConfig(use_oss_nli=True),
)

result = verify_answer(
    llm_output="The company was founded in 2001 and has 500 employees.",
    source_text="The company was founded in 2001. It currently employs 500 people.",
    config=config,
    return_pipeline_output=True,
)

print(result["payload_status"])
# ACCEPT or REJECT
```

## What you get back

Every response includes `payload_status`, per-unit audit records with `authority` and `decision`, and `tracking_id`. Distribution drift signal is available when calibration data is present. Use `summarize_result()` to extract operational signals for logging.

## Output modes

| Mode | Behavior |
|------|----------|
| `strict` | Full payload or rejection metadata — nothing partial |
| `adapter` | Validation envelope with accepted and rejected fields separated |

Set via `output_mode` in `PipelineConfig`.

## Current limitations

- Sentence-level segmentation, not semantic claim decomposition
- Calibration bootstrapped on pilot data, not production-grade
- Clean inputs may show `authority=conformal_oor` until recalibrated on production data
- Structured output BM25 routing untested on real pipelines
- Not benchmarked against RAGAS or TruLens

## CLI

```bash
ega run --answer-file answer.txt --evidence-file evidence.json
```

`answer.txt` — plain text LLM output. `evidence.json` — JSON array of `{id, text, metadata}` objects.

---

[Changelog](CHANGELOG.md) | [License](LICENSE) | [Issues](https://github.com/bh3r1th/llm-evidence-gated-generation/issues)
