Skip to content

giq 0.6.0

Choose a tag to compare

@github-actions github-actions released this 03 Oct 14:29
· 9 commits to main since this release

giq 0.6.0 splits giq into a small core and plugins.

  • Core: the queue, scheduler, API and dashboard, plus LLMs through llama.cpp. Installed alone it needs no torch and takes about 40 MB.
  • Curated plugins, each its own package, released with core: image generation, speech, OCR, depth and vllm.
  • Installing everything: make sync or the installer, exactly as before.
  • Your own plugins: anything else, including multiview, now comes as a plugin. The contract is documented and versioned.
  • Installing a few: every package is a wheel on this release; giq plugins prints the command for each one not installed.

0.6.0 also changes how models get onto a machine. The Recipes page shows what runs here. A new Add page fetches the rest from the Hugging Face Hub, after showing what that takes. giq add <recipe> does the same from the command line.

Breaking: POST /multiview and five old recipes are gone, and a few defaults moved. Read Upgrading first.

Plugins

A plugin is a Python package that registers engines, modalities, routes, recipes and dashboard panels through the giq.plugins entry point (ADR-004, docs/plugins.md). Installing it is the whole of enabling it.

  • The curated plugins live in this repository as packages of one uv workspace, all version 0.6.0:

    Package Adds
    giq-vllm the vllm engine for LLMs, giq prepare vllm
    giq-sdcpp image generation and editing, with their sandbox panels
    giq-speech speech to text with diarization, text to speech, voiceprints, /v1/audio/*, their sandbox panels
    giq-ocr document OCR, POST /ocr
    giq-depth depth maps, POST /depth
    giq-defaults all of the above

    Each brings its own recipes and dependencies, so torch leaves core's dependency list.

  • Plugins only add. A plugin is refused whole, with the reason in giq plugins and /status, when:

    • it was written for another plugin API version;
    • it does not import;
    • it takes a name or a route that is already registered.

    Core and the other plugins keep serving.

  • Plugins bring dashboard panels. The sandbox draws its tabs from what is installed. The image and speech panels now ship with their plugins, under the same addresses, so links and bookmarks still work. A plugin's module gets React, the API client and the shared components from the dashboard through @giq/plugin-ui, so it never bundles its own copy of React.

  • Child processes speak giq_child, a standard-library-only protocol. A plugin's child can therefore run on an interpreter of its own, without giq, when its dependencies cannot share giq's.

  • Every engine-specific detail is now a registration:

    • the routes, smoke tests (POST /test/{modality}, which replaces /test/{kind}) and giq prepare <engine>;
    • the startup clean-up of leftover servers;
    • the modality labels, icons and colours the dashboard shows.

Multiview leaves giq: the way back is a plugin

Multi-view geometry with Depth Anything 3 served one project. It pinned numpy below 2 and needed its own interpreter, which made it a poor fit for every install. 0.6.0 removes it:

  • the multiview modality, POST /multiview and the da3-base recipe;
  • the da3 engine and envs/da3.

Old multiview jobs in the history still show, in the neutral colour.

If you need multiview, it belongs in an engine plugin, which is the case the contract was designed for:

  • An engine with an interpreter of its own. Its prepare hook (giq prepare da3) builds that interpreter from a lock the plugin ships.
  • A child that speaks giq_child. It runs on that interpreter without giq installed.
  • The multiview modality, its route and its recipe. The plugin registers all three.

docs/plugins.md walks through each part.

Getting recipes

ADR-005.

  • The Recipes page shows what is on this machine. A recipe that cannot run here is marked, with the reason: its engine binary is missing, or no card fits it.

  • The Add page lists everything else by modality, with a search:

    • recipes giq can fetch;
    • recipes whose files you place yourself;
    • curated plugins not installed, with their install command. The dashboard never installs a plugin.
  • giq plans before it fetches. "Check what it takes" shows:

    • whether a card fits it;
    • the download size, from the Hub;
    • free disk where the files go;
    • which parts another recipe already brought;
    • whether a gated repository opens with your token;
    • the licence.

    Then it offers the fetch, with live progress and a stop button. A stopped fetch resumes next time. Files appear in place only when all of them have arrived.

  • giq add <recipe> prints the same plan, asks once, and fetches. --dry-run stops after the plan. Under the hardened systemd unit the service may not write the models directory, so the dashboard hands you this command instead.

  • Every built-in recipe says where its weights come from.

    • A source names a whole Hub repository, or one file of it (hf:org/repo/path/in/repo).
    • Weights under the models directory are pinned to the commit whose files their VRAM figure was measured with. The gemma GGUFs are pinned to the revisions before unsloth's re-uploads.
    • flux_klein now loads z-image's text encoder, which is byte-identical to its own.
  • The vision projector is weights: weights.parts.mmproj. It is inventoried, fetched and deleted like the rest. params.mmproj in an existing file still loads, with a warning.

  • The API follows:

    • /recipes gives each recipe's availability and the checks behind it;
    • GET /recipes/{name}/plan and POST /recipes/{name}/fetch;
    • GET/DELETE /downloads;
    • DELETE /recipes/{name}/weights removes what only that recipe loads;
    • GET /plugins.

Clients see what runs

  • /capabilities advertises, per modality, only the recipes that run here. They come in preferred order, kept warm first, with a default. The rest are offered under available, with a one-line verdict. Every installed modality is listed, even with nothing ready. GET /capabilities/{modality} returns one entry.
  • /v1/models lists the same LLMs in the same order.
  • The audio routes run the recipe model names. OpenAI's names (whisper-1, tts-1) get the modality's default.
  • /llm/endpoint without ?model= points at the first LLM kept warm. It used to point at gemma-4-12b.

Fixes

  • Transcription with diarization and voiceprints no longer fail with a 500 unless kept warm. The on-demand path rejected the plain dicts the audio and voiceprint adapters return. Since 0.5.3 stopped keeping them warm by default, every diarized transcription and every voiceprint failed on a default install.

One torch, and Unlimited-OCR on it

  • giq runs vllm's torch line: torch 2.13, torchvision 0.28, torchaudio 2.11. A card sees one torch, and VRAM figures compare across engines. giq-defaults holds the line for every curated plugin.
  • Unlimited-OCR runs on giq's own transformers 5. Its separate interpreter is gone. giq's OCR child adapts three changes from transformers 4.57: the cache's maximum length, the tokenizer, and the rotary embeddings. Its output is byte-for-byte identical to 4.57's on the pages checked. The OCR child is chosen from the checkpoint's architecture, and engine: transformers-4.57 loads as transformers, with a warning.

Upgrading

  • Multiview users: stay on 0.5.x until a multiview plugin is installed next to giq 0.6.0 (see above). POST /multiview and the multiview modality are gone from giq itself.
  • Five old recipes left the built-in catalog: gemma-3-27b-it-qat, llama-3.2-3b, qwen-coder-30b, qwen3.5-35b-a3b and qwen3.6-27b. If you still run one, copy its file from 0.5.3 into your recipes directory.
  • make sync after checking out 0.6.0. It installs core and every curated plugin, as a single environment did before, and moves it to torch 2.13. That is a large download.
  • Remove the old side environments. envs/unlimited-ocr/.venv and envs/da3/.venv are no longer used, and GIQ_UNLIMITED_OCR_PYTHON is ignored.
  • Behaviour that changed:
    • /test/{kind} is now /test/{modality}; /test/image is /test/text2image.
    • /capabilities and /v1/models no longer list recipes whose weights are missing.
    • /llm/endpoint needs ?model= when nothing is kept warm.
  • Operator recipe files with params.mmproj keep working. Move the line to weights.parts.mmproj to silence the warning.
  • Re-measure VRAM figures where they matter. The measured: true figures date from torch 2.11.

Full changelog: v0.5.3...v0.6.0