FastAPI server for streaming promptuna run / evaluate / optimize jobs
Project description
promptuna-server
Server surface for the
promptunaevaluation harness. See the main project README for the full overview, library API, and usage surfaces.
HTTP + SSE transport for promptuna jobs (run, evaluate, optimize).
This package is transport only. It does not define evaluation logic — that lives in the core promptuna library. On-disk projects are resolved via promptuna.projects; user projects do not belong in this directory.
Install (PyPI)
pip install promptuna-server
uvicorn promptuna_server.main:app --port 6969
Set PROMPTUNA_PROJECTS_ROOT to a directory of on-disk projects (see samples/README.md for layout). In a dev checkout, just server from the repo root is equivalent.
Development
From the repository root:
just server
Uses bundled samples/ by default. Override the projects root:
PROMPTUNA_PROJECTS_ROOT=/path/to/projects just server
The API listens on port 6969. All routes are under the /api prefix (e.g. GET /api/health). Interactive OpenAPI docs: http://127.0.0.1:6969/docs.
For the browser UI in a separate dev server, see frontend/README.md.
HTTP API
Authoritative definitions: main.py, schemas.py.
| Method | Path | Purpose |
|---|---|---|
GET |
/api/health |
Liveness ({"status":"ok"}) |
GET |
/api/catalog |
Projects and artifact names for selectors |
POST |
/api/run |
Start a run job → { "job_id": "…" } |
POST |
/api/evaluate |
Start an evaluate job |
POST |
/api/optimize |
Start an optimize job |
GET |
/api/jobs |
List persisted jobs (newest first) |
GET |
/api/jobs/{job_id} |
Replay: { manifest, events, summary } |
GET |
/api/jobs/{job_id}/events |
SSE stream until the job completes |
Constraints
- One job at a time in memory. A second
POSTwhile one is running returns 409 with{"detail":"another job is already running"}. modelandproposer_modelare free-text strings (provider:model-id); they are not in/api/catalog.summaryinGET /api/jobs/{job_id}isnullwhilemanifest.status === "running".
Job persistence
Completed jobs are written under <projects_root>/jobs/<job_id>/ as manifest.json, append-only events.jsonl, and a terminal summary.json.
SSE events
Each streamed line is a JSON envelope (src/promptuna/serialize.py):
{
"seq": 0,
"job_id": "uuid",
"step_index": 0,
"type": "trial | scoring | step | proposal | error",
"payload": {}
}
For run and evaluate, step_index is always 0. For optimize, trials, scorings, and proposals within one optimization step share the same step_index; it increments only after a step event.
Clients and PUBLIC_API_URL
HTTP clients (including the SvelteKit frontend) set PUBLIC_API_URL to the API origin only — e.g. http://127.0.0.1:6969 — and append /api to each path. In the Docker image the UI is same-origin and PUBLIC_API_URL is left empty so requests go to /api/... on port 8080.
Docker (UI + API in one container)
From the repository root:
just docker-build
just docker-run
Open http://localhost:8080. The image bundles samples/; mount your own projects and pass API keys:
just docker-run -v /path/to/projects:/projects -e PROMPTUNA_PROJECTS_ROOT=/projects
Uses podman when available, otherwise docker. Rebuild after code changes — the image is a snapshot at build time.
Released images are published to GitHub Container Registry on each version tag:
podman pull ghcr.io/nachollorca/promptuna:latest
podman run --rm -p 8080:8080 --env-file .env ghcr.io/nachollorca/promptuna:latest
Set the package visibility to public in GitHub (Packages → promptuna → Package settings) so users can pull without logging in.
A future promptuna serve command will wrap uvicorn and accept --projects-root explicitly.
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 promptuna_server-1.31.0.tar.gz.
File metadata
- Download URL: promptuna_server-1.31.0.tar.gz
- Upload date:
- Size: 7.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.25 {"installer":{"name":"uv","version":"0.11.25","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e94a24caa7c78808aa969adaf6be9c65c00574d05806cac15f1468aad5edfe3c
|
|
| MD5 |
8d4aeb1798a853b11f754d37d709256b
|
|
| BLAKE2b-256 |
26c62efa9830133618d40919dc210814b97ea7f8eec73ef951fbdaf0a804c872
|
File details
Details for the file promptuna_server-1.31.0-py3-none-any.whl.
File metadata
- Download URL: promptuna_server-1.31.0-py3-none-any.whl
- Upload date:
- Size: 8.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.25 {"installer":{"name":"uv","version":"0.11.25","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7bcf514a0994d7bb8101b639ef602e89e9b90b38b761c59834cf225b3280ccb3
|
|
| MD5 |
90e5d1f76185e1442362c380af7866b5
|
|
| BLAKE2b-256 |
639adfb25f14b83f9e24faed1a283f8856f8a3992f2b1cd2de3a61335b04b64e
|