Leaderboard

Submitting a model

Public package status: the Python distributions and desktop installers are not released yet. These pages document an evolving interface, not currently usable install artifacts. View release status.

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:

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:

FlagRequiredDefaultMeaning
--hf-model-idyesHugging Face repo, e.g. owner/model.
--task-idsyesComma-separated task ids, e.g. glioma_wt_tc_et. One submission can cover several tasks.
--emailnoNoneSubmitter email (optional).
--poll / --no-pollno--poll (polls by default)--no-poll submits and exits immediately without waiting for a result.
--timeoutno2700 (45 minutes, in seconds)How long to poll before giving up.

What it does, in order:

  1. Local pre-flight. Downloads your repo’s predictor.py unauthenticated from Hugging Face and statically checks (via ast.parse, never executing the file) that it defines a top-level load. Fails fast with a clear message if the repo has no predictor.py (404), looks private/gated (401/403), or the file doesn’t define load.
  2. 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.
  3. 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, approved or failed, printing status=... progress=done/total each time. Exits 0 on approved, 1 on failed or on a --timeout expiry (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.