Submitting a model
Coming soon: Public model submissions are temporarily closed while we finish the production rollout. The leaderboard shows a disabled Submit Model control, and the public submit endpoint remains in maintenance mode. You can prepare and validate your Hugging Face repository now, but neither the web form nor the CLI can create a public submission yet.
Once your model repo satisfies the contract and
is packaged correctly, it will be ready for the
two launch paths described below. Both will POST the same {hf_model_id, task_ids, submitter_email} body to the same submit Supabase Edge Function
and poll the same submission_status view for progress — the difference is
which client you use and when checks run.
There is no mo.submit
This is deliberate. The medotter SDK’s job ends at local
mo.evaluate(...) — scoring a model against a dataset, on your own machine.
Submitting that model to the public leaderboard is a separate step, handled
by tooling in the MedOtter-Web repo, not the SDK. If you were looking for a
Python call to submit a model, it doesn’t exist. Prepare your repository with
the pages in this section; the two submission paths below will become usable
when public submissions open.
Path A: the web Submit modal (coming soon)
The leaderboard currently shows a gray, disabled Submit Model — Coming soon control. After launch, it will open a form asking for:
- HuggingFace Model ID (required) — text input, e.g.
org/model-name. - Email (optional) — for notifications; leave blank if you don’t want one.
- Tasks to evaluate (required, at least one) — a checklist of tasks grouped by modality; check individual tasks or a whole modality group.
The form validates the model id’s shape client-side (must look like
org/model-name: exactly two non-empty segments, ASCII letters/digits/_.-,
neither segment literally . or .., 200 characters max) and the email’s
shape if one is given. It does not check that the repo exists, is public,
or has a valid predictor.py — those checks happen server-side, after
submission. Submitting shows a live progress view that polls the submission’s
status until it reaches approved or failed.
Path B: the CLI (coming soon)
scripts/submit_model.py, in the MedOtter-Web repo, is a small
stdlib-only reference client (no pip install needed). The public endpoint
currently rejects its submission request with the maintenance response. After
launch, the command-line flow will be:
python scripts/submit_model.py \
--hf-model-id owner/model \
--task-ids glioma_wt_tc_et \
--email you@example.com
Flags, exactly as the script defines them:
| Flag | Required | Default | Meaning |
|---|---|---|---|
--hf-model-id | yes | — | Hugging Face repo, e.g. owner/model. |
--task-ids | yes | — | Comma-separated task ids, e.g. glioma_wt_tc_et. One submission can cover several tasks. |
--email | no | None | Submitter email (optional). |
--poll / --no-poll | no | --poll (polls by default) | --no-poll submits and exits immediately without waiting for a result. |
--timeout | no | 2700 (45 minutes, in seconds) | How long to poll before giving up. |
What it does, in order:
- Local pre-flight. Downloads your repo’s
predictor.pyunauthenticated from Hugging Face and statically checks (viaast.parse, never executing the file) that it defines a top-levelload. Fails fast with a clear message if the repo has nopredictor.py(404), looks private/gated (401/403), or the file doesn’t defineload. - Submit. POSTs
{"hf_model_id": ..., "task_ids": [...], "submitter_email": ...}to{SUPABASE_URL}/functions/v1/submit. On success (HTTP 201,{"ok": true, "id": ...}) prints the submission id; any other response is a hard failure. - Poll (default on). Every 15 seconds, GETs
{SUPABASE_URL}/rest/v1/submission_status?id=eq.<id>until the status is one of the two terminal states,approvedorfailed, printingstatus=... progress=done/totaleach time. Exits 0 onapproved, 1 onfailedor on a--timeoutexpiry (the message notes the worker “may be down” — a timeout does not mean your submission failed, just that no worker picked it up in time).
Credentials: the script reads PUBLIC_SUPABASE_URL and
PUBLIC_SUPABASE_ANON_KEY from the environment, falling back to a
gitignored .env file at the repo root if unset. Both are the anon
(browser-safe) key pair — no service key or other secret is needed to submit.
Which to use after launch
The CLI’s local pre-flight check catches the most common mistake (a missing
or malformed load()) before you burn a submission slot on it, and
--task-ids lets you cover several tasks with one script invocation. The web
form is the friendlier entry point if you’re already looking at the
leaderboard and just want to try a model interactively, with visual progress.
Next: Bundle schema documents the on-disk task format your model is actually evaluated against.