AuK studio's manifest
AuK studio makes speech and voices with PyTorch on mps, behind a FastAPI server. Its registry entry carries its manifest inline. It passes four of the seven criteria a manifest can answer: it declares neither memory nor disk, no test profile and no SDK major. It declares no hue, so it is given one from helmstudio's fixed set.
The file is studios/auk-studio.yaml, shown in full. A note follows the line it explains.
# A registry entry: a pointer at AuK studio's repository
# (schema/registry-entry.json, docs/design/05-sdk-and-custom-studios.md §5a).
#
# The manifest belongs in the studio's own repository as helmstudio.yaml, beside
# the code it describes, so that a studio can announce a new build step without
# waiting for a helmstudio release. AuK studio does not ship one yet, so the
# manifest is carried inline here — and the pull request that moves `ref` to a
# commit where it does ship one deletes the inline copy, leaving one copy again.
#
# Where the inline manifest sets id, repo or ref, each must equal this entry's;
# the validator enforces it. There is no `certified` field: a level is derived
# from what has actually been checked, never declared by the thing being
# checked (docs/decisions.md M7 Q4, Q15).
id: auk-studio
The id the studio is known by everywhere, and the file is named for it.repo: https://github.com/janishar/AuK
Where helmstudio clones from, with git.ref: 61ae02a65c947a8c499a27f963165b351416a146
A full commit, so what was reviewed is what installs.
manifest:
Inline, because the repository ships no helmstudio.yaml at this commit. Its id, repo and ref must equal the pointer's. id: auk-studio
The same id as the pointer's. name: AuK studio
The name people see. description: PyTorch speech and voice generation on mps, with AuK and AuK-Flash checkpoints.
One sentence saying what the studio does. kinds: [audio]
Sound. license: MIT
The studio's own licence. repo: https://github.com/janishar/AuK
The same repository as the pointer's. ref: 61ae02a65c947a8c499a27f963165b351416a146
The same commit as the pointer's. python: { version: "3.10" }
Python 3.10. helmstudio creates an environment with uv, pinned to this version, before the build steps. peak_ram_gb: 25 # web/README.md: "each is ~15-25GB" per checkpoint variant — upper bound, unverified against a real checkpoint
The upper end of the README's range, as the comment says. requires:
An Apple Silicon Mac, and uv. No memory or disk is declared, which is why criterion 2 fails. os: [darwin]
arch: [arm64]
tools: [uv]
runtime:
PyTorch on mps, falling back to the CPU. The same framework on cuda would be a different manifest, and the comment says why this one was chosen. framework: pytorch
# web/server.py:53 (_default_device) supports cuda too. Two defensible
# manifests follow from that: widen requires to linux/amd64 and keep cuda,
# or keep darwin/arm64 and match docs/design/01-prd.md §13's table (mps,
# cpu). This takes the second; the reason is in docs/decisions.md (M0,
# "AuK's backends").
backends: [mps, cpu]
precision: [bf16]
language: python
capabilities: [kv, assets, gallery]
Settings and sessions, the files it makes, and the gallery. network: [huggingface.co, cdn-lfs.huggingface.co]
The hosts it is expected to contact, for its weights. build:
Two steps, in the studio's environment: the core package, then the web server's requirements. - name: Install the core package
run: uv pip install -e .
- name: Install the web server
run: uv pip install -r web/requirements.txt
weights:
Three checkpoints, all required. The command names none of them, so none is passed to the server as a path. - name: auk
repo: tencent/AuK
dest: AuK
- name: auk_flash
repo: tencent/AuK-Flash
dest: AuK-Flash
- name: qwen
repo: Qwen/Qwen2.5-Omni-3B
dest: Qwen2.5-Omni-3B
processes:
One process: the FastAPI server in web/. - name: studio
role: main
heavy: true
cwd: web
cmd: "python3 server.py --host 127.0.0.1 --port {port}"
port: { prefer: 8420 }
health: { path: /api/health, timeout_s: 30, interval_s: 2 }
An HTTP GET that answers 200 when the server is ready. # /api/health answers 200 without a busy boolean, so the switch dialog
# reads AuK as unknown until it serves the busy contract (M5 Q12); move
# this path, and `ref`, when it does.
busy: { path: /api/health }
Declared, so the switch dialog asks before stopping it. Its health endpoint does not give the busy answer, so the dialog reads it as unknown, never as idle. ui: /