Skip to content
helmstudio
Contents

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: /