Async LLM benchmarking library with protocol-based extensibility
Project description
promptum
What's This?
You're choosing between GPT-4, Claude, and Gemini for your product. You need to know which one actually handles your prompts better — not some generic benchmark, but your real tasks, your edge cases, your expected formats.
promptum turns that into a few lines of Python. One client for 100+ models, automatic retries, latency/cost/token tracking, structured validation — all async, all typed, zero config files.
session = Session(provider=client, name="my_test")
session.add_test(Prompt(
name="basic_math",
prompt="What is 2+2?",
model="openai/gpt-3.5-turbo",
validator=Contains("4"),
))
report = await session.run()
summary = report.get_summary()
No YAML. No config files. Just Python you can read in 30 seconds.
Quick Start
pip install promptum # (or: uv pip install promptum)
export OPENROUTER_API_KEY="your-key"
import asyncio
from promptum import Session, Prompt, OpenRouterClient, Contains
async def main():
async with OpenRouterClient(api_key="your-key") as client:
session = Session(provider=client, name="quick_test")
session.add_test(Prompt(
name="basic_math",
prompt="What is 15 * 7? Reply with just the number.",
model="openai/gpt-3.5-turbo",
validator=Contains("105"),
))
report = await session.run()
summary = report.get_summary()
print(f"Passed: {summary.passed}/{summary.total}")
print(f"Avg latency: {summary.avg_latency_ms:.0f}ms")
print(f"Total cost: ${summary.total_cost_usd:.6f}")
asyncio.run(main())
Why promptum?
Most LLM testing is ad-hoc scripts that grow into unmaintainable messes. You end up with separate API clients per provider, hand-rolled retry logic, manual latency tracking, and validation scattered across files.
promptum replaces all of that with a single coherent API:
- 100+ Models via OpenRouter — one client for OpenAI, Anthropic, Google, and more
- Smart Validation — ExactMatch, Contains, Regex, JsonSchema, or write your own
- Automatic Retries — exponential/fixed-delay backoff with configurable attempts
- Metrics Tracking — latency, tokens, cost — automatically captured
- Async by Default — run tests in parallel with concurrency control
- Extensible — implement
LLMProviderorValidatorto plug in any model or validation logic - Type Safe — full type hints, catches errors before runtime
Documentation
- Session & Testing — Session, Prompt, Report, Summary, TestResult
- Providers — LLMProvider, OpenRouterClient, Metrics, Retry, Exceptions
- Validation — Validator, ExactMatch, Contains, Regex, JsonSchema
Requirements
- Python 3.10+
- An OpenRouter API key (or implement your own provider)
Contributing
Found a bug? Want a feature? PRs welcome!
git clone https://github.com/deyna256/promptum.git
cd promptum
just sync # Install dependencies
just test # Run tests
just style # Check code style
just format # Format code
just type # Type checking
License
MIT - do whatever you want with it.
Star on GitHub | Report Bug | Request Feature
Made for developers who value their time.
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 promptum-0.1.3.tar.gz.
File metadata
- Download URL: promptum-0.1.3.tar.gz
- Upload date:
- Size: 47.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7561a3fd46bdb8bc2c11952c9f8ac1575f8a4faa619de6111a4e5aa107a58d06
|
|
| MD5 |
5e957f1f9d866622582eed6a714c0a18
|
|
| BLAKE2b-256 |
2c15c998d7ea13c50f0ba1e88b4fb020936078856a727d1ac5a3c6458c7939bb
|
Provenance
The following attestation bundles were made for promptum-0.1.3.tar.gz:
Publisher:
publish.yml on deyna256/promptum
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
promptum-0.1.3.tar.gz -
Subject digest:
7561a3fd46bdb8bc2c11952c9f8ac1575f8a4faa619de6111a4e5aa107a58d06 - Sigstore transparency entry: 1009311848
- Sigstore integration time:
-
Permalink:
deyna256/promptum@bad0af124fa4d0a2b60d80e4147738395ff7c9f1 -
Branch / Tag:
refs/tags/v0.1.3-alpha - Owner: https://github.com/deyna256
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@bad0af124fa4d0a2b60d80e4147738395ff7c9f1 -
Trigger Event:
release
-
Statement type:
File details
Details for the file promptum-0.1.3-py3-none-any.whl.
File metadata
- Download URL: promptum-0.1.3-py3-none-any.whl
- Upload date:
- Size: 15.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c04fde615415e4b90ef8f84e4142b1300f2efcb3ab75f9f0398bb47264185501
|
|
| MD5 |
a1c464cbf602a4da8d8b4b04ffcab413
|
|
| BLAKE2b-256 |
c2a2f334ea732e08617765e998233eac353271585e72e4d450f649b1f7da38a8
|
Provenance
The following attestation bundles were made for promptum-0.1.3-py3-none-any.whl:
Publisher:
publish.yml on deyna256/promptum
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
promptum-0.1.3-py3-none-any.whl -
Subject digest:
c04fde615415e4b90ef8f84e4142b1300f2efcb3ab75f9f0398bb47264185501 - Sigstore transparency entry: 1009311873
- Sigstore integration time:
-
Permalink:
deyna256/promptum@bad0af124fa4d0a2b60d80e4147738395ff7c9f1 -
Branch / Tag:
refs/tags/v0.1.3-alpha - Owner: https://github.com/deyna256
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@bad0af124fa4d0a2b60d80e4147738395ff7c9f1 -
Trigger Event:
release
-
Statement type: