Metadata-Version: 2.4
Name: shadow-diff
Version: 1.7.6
Classifier: Development Status :: 4 - Beta
Classifier: License :: OSI Approved :: MIT License
Classifier: License :: OSI Approved :: Apache Software License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Rust
Classifier: Topic :: Software Development :: Libraries
Classifier: Topic :: Software Development :: Testing
Classifier: Topic :: Software Development :: Quality Assurance
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
Classifier: Operating System :: POSIX :: Linux
Classifier: Operating System :: MacOS
Classifier: Operating System :: Microsoft :: Windows
Classifier: Typing :: Typed
Requires-Dist: typer>=0.15,<1.0
Requires-Dist: pydantic>=2.10,<3
Requires-Dist: httpx>=0.27,<1
Requires-Dist: rich>=13.9,<15
Requires-Dist: scikit-learn>=1.6,<2
Requires-Dist: numpy>=2.2,<3
Requires-Dist: pyyaml>=6.0,<7
Requires-Dist: jsonschema>=4.0,<5
Requires-Dist: ag2>=0.9,<2 ; extra == 'ag2'
Requires-Dist: anthropic>=0.40,<1 ; extra == 'anthropic'
Requires-Dist: crewai>=1.14,<2 ; extra == 'crewai'
Requires-Dist: hypothesis==6.122.1 ; extra == 'dev'
Requires-Dist: mypy==1.14.0 ; extra == 'dev'
Requires-Dist: ruff==0.8.4 ; extra == 'dev'
Requires-Dist: pytest==8.3.4 ; extra == 'dev'
Requires-Dist: pytest-asyncio==0.25.0 ; extra == 'dev'
Requires-Dist: pytest-cov==6.0.0 ; extra == 'dev'
Requires-Dist: maturin==1.13.1 ; extra == 'dev'
Requires-Dist: types-pyyaml==6.0.12.20240917 ; extra == 'dev'
Requires-Dist: sentence-transformers>=3.3,<6 ; extra == 'embeddings'
Requires-Dist: langchain-core>=0.3,<1 ; extra == 'langgraph'
Requires-Dist: langgraph>=1,<2 ; extra == 'langgraph'
Requires-Dist: langchain-openai>=0.2,<2 ; extra == 'langgraph'
Requires-Dist: mcp>=0.9,<2 ; extra == 'mcp'
Requires-Dist: openai>=1.58,<3 ; extra == 'openai'
Requires-Dist: opentelemetry-sdk>=1.27,<2 ; extra == 'otel'
Requires-Dist: fastapi>=0.115,<1 ; extra == 'serve'
Requires-Dist: uvicorn>=0.32,<1 ; extra == 'serve'
Requires-Dist: websockets>=13.1,<16 ; extra == 'serve'
Provides-Extra: ag2
Provides-Extra: anthropic
Provides-Extra: crewai
Provides-Extra: dev
Provides-Extra: embeddings
Provides-Extra: langgraph
Provides-Extra: mcp
Provides-Extra: openai
Provides-Extra: otel
Provides-Extra: serve
License-File: LICENSE-APACHE
License-File: LICENSE-MIT
Summary: Git-native behavioral diff and shadow deployment for LLM agents.
Keywords: llm,agents,testing,observability,diff,regression-testing,causal-attribution
Home-Page: https://github.com/manav8498/Shadow
Author: manav8498
License-Expression: MIT OR Apache-2.0
Requires-Python: >=3.11
Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
Project-URL: Changelog, https://github.com/manav8498/Shadow/blob/main/CHANGELOG.md
Project-URL: Discussions, https://github.com/manav8498/Shadow/discussions
Project-URL: Documentation, https://github.com/manav8498/Shadow#readme
Project-URL: Homepage, https://github.com/manav8498/Shadow
Project-URL: Issues, https://github.com/manav8498/Shadow/issues
Project-URL: Repository, https://github.com/manav8498/Shadow
Project-URL: Source Code, https://github.com/manav8498/Shadow
Project-URL: Specification, https://github.com/manav8498/Shadow/blob/main/SPEC.md

# shadow

**Catch AI-agent regressions before they hit production.**

Shadow is a PR-native diff tool for LLM agents, it records your
agent's calls, replays them under a new config, and tells you what
changed across nine behavioural dimensions.

## Install

```bash
pip install shadow

# With Anthropic support:
pip install 'shadow[anthropic]'

# With OpenAI support:
pip install 'shadow[openai]'

# With both + embeddings:
pip install 'shadow[anthropic,openai,embeddings]'
```

Requires Python 3.11 or newer.

## Quickstart

```python
from shadow.sdk import Session

with Session(output_path="trace.agentlog"):
    # Your existing Anthropic / OpenAI code, unchanged.
    client.messages.create(model="claude-sonnet-4-6", messages=[...])
```

Shadow automatically patches the Anthropic and OpenAI SDKs to capture
every request/response. Secrets are redacted by default.

Then in CI:

```bash
shadow replay new-config.yaml --baseline trace.agentlog
shadow diff trace.agentlog candidate.agentlog
shadow bisect old-config.yaml new-config.yaml --traces trace.agentlog
```

## Full docs

The canonical README, examples, the `.agentlog` spec, and the project
roadmap live at **https://github.com/manav8498/Shadow**.

## License

Dual-licensed under **MIT OR Apache-2.0**. See `LICENSE-MIT` and
`LICENSE-APACHE` in this distribution, or the project repository.

