Benchmark any model, prompt or AI workflow.
Know exactly what it cost and what it got right.
Runport is an open-source, local-first benchmarking platform. Point it at an LLM API, a RAG pipeline, an agent, an MCP server or a Dify / n8n workflow, run your own dataset under hard spend caps, and get scores, latency, tokens and dollars you can defend. Nothing is invented, and nothing leaves your machine unless you approve it.
Quickstart · Why Runport · Integrations · Use it your way · Docs · Contributing
Results explorer in the local web dashboard. A local HTTP agent run on the bundled synthetic dataset: $0 spend, scores labelled Heuristic, missing tokens shown as None.
Why Runport
Most benchmark tools give you a leaderboard. Runport gives you numbers you can put in front of a skeptical reviewer.
- Nothing is invented. Missing latency, tokens or cost stay
None. They are never defaulted to zero. - Agreement is not correctness. Accuracy comes only from human-approved ground truth. Heuristic and judge scores are stored and labelled as such.
- Spend is governed, not hoped for. Hard caps are checked before every live request. A request whose cost cannot be resolved is booked
UNRESOLVEDand blocks the next live run until you reconcile it. - Nothing runs by surprise. A plan is fingerprinted with SHA-256. Live execution needs an approval bound to that fingerprint, and a changed plan invalidates it.
- Local by default. Results, the spend ledger and approvals live in SQLite on your machine. Exported traces are scrubbed of secrets.
- One engine, every interface. The CLI, terminal UI, web dashboard, Python SDK and MCP server all go through the same guarded runner.
Quickstart
Requirements: Python 3.11+ and uv. Node.js is only needed to rebuild the dashboard; a prebuilt bundle ships with the package.
git clone https://github.com/Sudharsanselvaraj/Runport.git
cd Runport
uv sync --extra dev --extra report
uv run runport init # create a local workspace: config, budget policy, database
Run your first benchmark offline. It replays recorded outputs, needs no API key and books $0.00:
uv run runport benchmark --replay --dataset examples/replay-demo/fixtures.jsonl --split ALL
uv run runport budget status
uv run runport web # dashboard at http://127.0.0.1:8000
Prefer the terminal? uv run runport ui opens the terminal dashboard and uv run runport opens the interactive launcher.
What the offline replay prints
╭───────────────────────────────────────────────────────────────╮
│ Runport Offline Replay Benchmark │
│ Target Model: google/gemini-3.5-flash-lite │
│ Dataset: fixtures.jsonl │
│ Mode: REPLAY RUN (Provenance: REPLAYED, $0.00 spend) │
╰───────────────────────────────────────────────────────────────╯
Recorded Outputs 3 / 3 Fixtures: fixtures.jsonl · Split: ALL
Mean Latency 151.9 ms From recorded latencies
Mean Accuracy — Word overlap with the expected answer (labelled cases only)
Run Spend (USD) $0.0000 Provenance: REPLAYED ($0.00 spend)
Case ID Query Snippet Latency Accuracy Provenance Cost
rep-001 What is the capital of France? 120 ms — REPLAYED $0.0000
rep-002 Convert 100 EUR to USD 145 ms — REPLAYED $0.0000
rep-003 Explain quantum entanglement brief... 190 ms — REPLAYED $0.0000
The fixtures carry no expected answers, so no score is shown. Runport prints — rather than inventing one. More runnable examples live in examples/: Python callable, HTTP workflow, Dify workflow, classification and RAG.
How it works
The runner applies its guards in a fixed order: authorization → privacy gate → budget reservation → transport → validation → persistence → spend booking. Replays never touch the network or the live ledger.
- Plan. A dataset (hashed, immutable) and your targets become a fingerprinted execution plan with a worst-case cost projection.
- Approve. A human approves the exact plan. Any change invalidates the approval.
- Run. Cases execute under hard caps, with bounded retries and resumable checkpoints.
- Score. Scoring is separate from inference. Every score carries its kind and its evaluator.
- Report. Latency, tokens and cost, each with its provenance, in the CLI, the TUI, the web dashboard or a sanitized export.
More detail: Architecture · Universal execution architecture.
Product tour
|
Plan before you spend. A SHA-256 fingerprint over targets, dataset and caps, a preflight verdict and a worst-case cost projection. |
Approve explicitly. Live execution needs a human approval bound to that fingerprint. |
|
Account for every dollar. An append-only SQLite ledger books each request as |
Work from the terminal. The same engine drives the CLI, the Rich terminal UI and the web dashboard, in dark and light themes. |
What you can benchmark
| Evaluate | How |
|---|---|
| Models and prompts | Any OpenAI-compatible API, OpenRouter or a local Ollama model, live or as an offline replay of recorded outputs. |
| RAG pipelines and agents | An HTTP endpoint, a Python callable, a subprocess or an MCP server's tools, scored on the same dataset. |
| Orchestrated workflows | Dify, plus experimental adapters for Flowise, Langflow, n8n and LangGraph. |
| Quality | Exact-match ground truth, rubric and overlap heuristics, classification metrics (accuracy, F1, calibration, Wilson and bootstrap intervals), with DEV-calibrated thresholds evaluated unchanged on TEST. |
| Cost and speed | Per-request latency, input and output tokens, and cost with provenance, from provider-reported or catalog-estimated values. |
Integrations
The connector registry in src/runport/connectors/registry.py is the source of truth for what is supported.
| Status | Connectors |
|---|---|
| Stable | OpenAI and OpenAI-compatible APIs · OpenRouter · Dify · Generic HTTP endpoint · Python callable · Subprocess · Ollama |
| Experimental | MCP server (tools) · Flowise · Langflow · n8n · LangGraph |
| Compatible via OpenAI-compatible | vLLM · LM Studio · LocalAI · LiteLLM proxy · Groq · Together · Fireworks · DeepInfra · DeepSeek · Mistral |
| Compatible via OpenRouter | Anthropic · Gemini |
| Planned | LangChain · CrewAI · LlamaIndex |
Full capability matrix (streaming, tool calls, usage, cost and more per connector)
| Connector | Name | Status | Integration | Tested | Streaming | Tool calls | Structured output | Per-step trace | Usage | Cost | Errors / timeouts |
|---|---|---|---|---|---|---|---|---|---|---|---|
openai_compat |
OpenAI / OpenAI-compatible | Stable | native | yes | — | — | partial | — | yes | partial | yes |
openrouter |
OpenRouter | Stable | native | yes | — | — | — | — | yes | yes | yes |
dify |
Dify | Stable | native | yes | yes | — | — | partial | yes | partial | yes |
http_workflow |
Generic HTTP endpoint | Stable | generic http | yes | — | — | — | — | partial | partial | yes |
python_target |
Python callable | Stable | in process | yes | — | — | partial | — | — | — | yes |
subprocess |
Subprocess (stdin/stdout) | Stable | in process | yes | — | — | — | — | — | — | yes |
ollama |
Ollama | Stable | native | yes | — | — | partial | — | yes | — | yes |
mcp |
MCP server (tools) | Experimental | native | yes | — | yes | yes | — | — | — | yes |
flowise |
Flowise | Experimental | generic http | partial | — | — | — | — | — | — | yes |
langflow |
Langflow | Experimental | generic http | partial | — | — | — | — | — | — | yes |
n8n |
n8n | Experimental | generic http | partial | — | — | — | — | — | — | yes |
langgraph |
LangGraph | Experimental | generic http | partial | — | — | — | — | — | — | yes |
vllm |
vLLM | Via | via openai_compat |
— | — | — | — | — | yes | partial | yes |
lm_studio |
LM Studio | Via | via openai_compat |
— | — | — | — | — | yes | partial | yes |
localai |
LocalAI | Via | via openai_compat |
— | — | — | — | — | yes | partial | yes |
litellm |
LiteLLM proxy | Via | via openai_compat |
— | — | — | — | — | yes | partial | yes |
groq |
Groq | Via | via openai_compat |
— | — | — | — | — | yes | partial | yes |
together |
Together | Via | via openai_compat |
— | — | — | — | — | yes | partial | yes |
fireworks |
Fireworks | Via | via openai_compat |
— | — | — | — | — | yes | partial | yes |
deepinfra |
DeepInfra | Via | via openai_compat |
— | — | — | — | — | yes | partial | yes |
deepseek |
DeepSeek | Via | via openai_compat |
— | — | — | — | — | yes | partial | yes |
mistral |
Mistral | Via | via openai_compat |
— | — | — | — | — | yes | partial | yes |
anthropic |
Anthropic | Via | via openrouter |
— | — | — | — | — | yes | yes | yes |
gemini |
Gemini | Via | via openrouter |
— | — | — | — | — | yes | yes | yes |
langchain |
LangChain | Planned | none | — | — | — | — | — | — | — | — |
crewai |
CrewAI | Planned | none | — | — | — | — | — | — | — | — |
llamaindex |
LlamaIndex | Planned | none | — | — | — | — | — | — | — | — |
Configuration for each connector: Connector catalogue · Connector reference.
Use it your way
| Interface | Start with |
|---|---|
| CLI | uv run runport --help · CLI reference |
| Terminal UI | uv run runport ui |
| Web dashboard | uv run runport web · Web dashboard guide |
| Python SDK (in process) | SDK contract |
| MCP server (local stdio, for agents) | MCP architecture |
Documentation
| Getting started | Quickstart · Concepts · FAQ |
| Usage | CLI reference · Web dashboard · Configuration reference |
| Integrations | Connector catalogue · Dify · MCP architecture · Python SDK contract |
| Evaluation and metrics | Metrics |
| Safety and governance | Safety guide · Invariant tests · Security policy |
| Design and roadmap | Architecture · Canonical trace schema (design) · Multi-user security model (design) · Product readiness audit · Roadmap audit |
Status
Runport is alpha. No version has been tagged or published yet, and interfaces may change.
Available today: the guarded execution path behind every interface, fingerprinted plans and persisted approvals, the atomic budget ledger, score provenance, the stable connectors above, an MCP client connector and a local stdio MCP server, an in-process Python SDK, the CLI, the terminal UI and the web dashboard.
Not yet built (designs and plans live in docs/):
- canonical trace and span storage, and agent trajectory evaluation
- per-step instrumentation for LangGraph and other workflow frameworks
- OpenTelemetry / OpenInference ingestion and Langfuse export
- a TypeScript SDK and a mature remote Python SDK
- authenticated remote MCP and production multi-user hosting
See the roadmap audit for what is verified and what is open.
Contributing and community
Contributions are welcome. Tests run fully offline with sockets blocked: uv run pytest. Start with the contributing guide, then:
License
Runport is licensed under the Apache License 2.0. See NOTICE for attributions.
Runport: benchmark results you can defend, spend you can account for, on your own machine.
If it saves you time or money, a star helps others find it.
Metadata
Release files for runport 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| runport-0.1.0.tar.gz | 14.6 MB | With provenance | Details for runport-0.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| runport-0.1.0-py3-none-any.whl | Python 3 | none | any | Details for runport-0.1.0-py3-none-any.whl |
Total release size: 15.2 MB
Release files / runport-0.1.0.tar.gz
| Download URL | runport-0.1.0.tar.gz |
|---|---|
| Size | 14.6 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b8a7f0e798ef22df481b74507fc80e7e17e78c18f60ab90ea190376a7e8a1793
|
|
BLAKE2b-256 checksum How to use checksums |
63e7409e013c2456e0cd5f72661b82f0d89ce3559e7bcf72ef7233913d509baa
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 7, 2026.
Transparency logRelease files / runport-0.1.0-py3-none-any.whl
| Download URL | runport-0.1.0-py3-none-any.whl |
|---|---|
| Size | 653.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
2768583f3be92809b5051190591824c1c50d79a606acbb5754fc2e6d3a70c833
|
|
BLAKE2b-256 checksum How to use checksums |
62570ca20338c9b3cc072274f63aa82016cca7b9c2bcea9107297ad8ba194333
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 7, 2026.
Transparency logSecurity for runport 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
Both files in this release have been uploaded with provenance metadata.
Attestation for runport-0.1.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 7, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.