Internal Django SSE eval runner
Project description
dj-evals
Internal Django helper for running one eval function with multiple argument sets in parallel, so you can visually compare output, tool calls, usage, cost, and completion behavior as the runs happen.
Django setup
Add dj_evals to INSTALLED_APPS and mount your eval view:
INSTALLED_APPS = [
"dj_evals",
]
from django.urls import path
urlpatterns = [
path("evals/run/", eval_run),
]
Protect the eval view with your app's normal authorization checks before using it in production.
Usage
from dj_evals import handle_eval_request
async def eval_run(request):
return await handle_eval_request(
request,
allowed_paths={"myapp.evals.echo_eval"},
)
Generate a URL for the view with one or more eval argument dictionaries:
from dj_evals import generate_eval_url
url = "/evals/run/" + generate_eval_url(
"myapp.evals.echo_eval",
{"model": "gpt-4.1", "text": "hello"},
{"model": "gemini-3-flash-preview", "text": "hello"},
)
The GET request renders the comparison page. The page starts one POST request per argument set. Each POST response is a direct SSE stream from the eval run, and the browser renders those events into the comparison panels.
Eval function contract
The eval function must be importable by dotted path and whitelisted in allowed_paths. It can be a sync or async function that returns one event, or an async generator that yields events.
def echo_eval(text="hello", model=""):
return {"type": "response.output_text.delta", "delta": text}
async def async_eval(text="hello", model=""):
return {"type": "response.output_text.delta", "delta": text}
async def streaming_eval(text="hello"):
yield {"type": "response.output_text.delta", "delta": text}
yield {"type": "response.completed", "response": {"cost": 0}}
Eval argument dictionaries are passed to the eval function as keyword arguments.
Developers
Run a local demo server to try the library in a browser:
uv run --with daphne daphne -p 8003 examples.local_server:application
# or, if you have just installed:
just run
Then open http://127.0.0.1:8003/. The demo redirects to an eval URL that starts three argument sets side by side and streams their events over SSE.
Run checks from this repo:
uv run --with ruff ruff check .
uv run --with pytest --with pytest-asyncio pytest -q
# or, if you have just installed:
just test
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 dj_evals-0.4.0.tar.gz.
File metadata
- Download URL: dj_evals-0.4.0.tar.gz
- Upload date:
- Size: 90.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.10 {"installer":{"name":"uv","version":"0.11.10","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bba23d44d502d690fe58c80780b6f708a5a170aa17fc5147c5d78019d2d7d003
|
|
| MD5 |
3b1dd46d0ea0f8edd8c72cdc4393af6f
|
|
| BLAKE2b-256 |
67f2f25fd0880da8d30921096a9cd065466c9de7fe9eb36ef122fea6592535dd
|
File details
Details for the file dj_evals-0.4.0-py3-none-any.whl.
File metadata
- Download URL: dj_evals-0.4.0-py3-none-any.whl
- Upload date:
- Size: 88.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.10 {"installer":{"name":"uv","version":"0.11.10","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8d7d2ab70d9f487f56b1c48453cbbb3bcf43824bf6774164fedab4e4cad3fc34
|
|
| MD5 |
b9cfbf33133739e62637da9b37d7cfda
|
|
| BLAKE2b-256 |
8ca55bfe117526875aff821b410e4427ac574df44d3b7ea27963ef40806e3579
|