Add your description here
Project description
Sequa 📼
Sequa is snapshot testing for LLM applications. Record once, replay forever.
The Magic
Before
from langchain_groq import ChatGroq
model = ChatGroq(model_name="llama-3.1-8b-instant")
response = model.invoke("Write a 3-word slogan for gravity.")
# ⏱️ Time taken: 2.3 seconds
After
from langchain_groq import ChatGroq
from sequa import cassette
model = ChatGroq(model_name="llama-3.1-8b-instant")
with cassette("tests/cassettes"):
response = model.invoke("Write a 3-word slogan for gravity.")
# ⏱️ First run: 2.3 seconds (recorded to tests/cassettes/)
# ⏱️ Second run: 12 ms (replayed locally!)
Features
- Record once, replay forever: Speed up integration test suites from minutes to milliseconds.
- Multiple Execution Modes: Support
replay,record,auto, andlivemodes. - Robust Key Sorting & Hashing: Recursively sorts request inputs to generate deterministic hashes.
- Custom Ignored Fields: Easily ignore dynamic/unstable fields (e.g.
temperature,max_tokens). - Custom Normalizers: Redact, replace, or clean requests prior to hashing.
- CLI Utilities: Inspect, format, and calculate statistics of stored cassettes.
Installation
uv pip install -e .
Configuration & Advanced API
1. Execution Modes
Control Sequa behavior via the mode parameter:
with cassette("tests/cassettes", mode="replay"):
# Will raise CassetteNotFoundError if no matching cassette is found.
# Guaranteed to make zero external network requests.
auto(Default): Replays if a matching cassette exists, otherwise calls the live API and records it.record: Always calls the live API and records/overwrites the cassette.replay: Never calls the live API. RaisesCassetteNotFoundErroron cache misses.live: Direct pass-through to the live API, bypassing cassettes entirely.
2. Ignore Fields
Strip request parameters before generating hashes:
with cassette("tests/cassettes", ignore_fields=["temperature", "max_tokens"]):
# These two calls generate the exact same hash and match the same cassette:
model.invoke("hello", temperature=0.2)
model.invoke("hello", temperature=0.9)
3. Custom Normalizers
For complex normalization or content redaction:
def redact_dates(request_dict):
# Redact dynamic inputs or strip timestamps
return request_dict
with cassette("tests/cassettes", normalizer=redact_dates):
model.invoke(...)
Command Line Interface (CLI)
Sequa comes with a CLI tool to manage your cassettes.
Stats
Show the number of cassettes, total size on disk, and estimated API latency saved:
sequa stats --path ./tests/cassettes
Inspect
List all stored cassettes, their model, provider, and when they were recorded:
sequa inspect --path ./tests/cassettes
Clean
Clean dynamic fields (latency, created_at) from cassettes to prevent noisy git diffs:
sequa clean --path ./tests/cassettes --remove-latency --remove-timestamps
License
MIT License.
Project details
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 sequa-0.0.3.tar.gz.
File metadata
- Download URL: sequa-0.0.3.tar.gz
- Upload date:
- Size: 16.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fcda670ecff7a7f35ebc4784a58164fa5944c25470c3d2edfe54af6c96b15098
|
|
| MD5 |
ee3f21be410e80baa8328cf06803a2f7
|
|
| BLAKE2b-256 |
5a614d3a8acbd8614851cb0f1ece67869c3ecc53cb4cf52bf35623c2a3f8c54c
|
File details
Details for the file sequa-0.0.3-py3-none-any.whl.
File metadata
- Download URL: sequa-0.0.3-py3-none-any.whl
- Upload date:
- Size: 23.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
440ebc32590b7edd33a2957ebe95fae141eae576223a3566c3a2af517a2cffe0
|
|
| MD5 |
860c777a640f840a3e20ae5647943088
|
|
| BLAKE2b-256 |
00271aee776f78b19e4b1e393e65470dfbbc5a0a2e0e52e81ed6c5dc30b5dcda
|