Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 22 additions & 9 deletions .github/workflows/validate.yml
Original file line number Diff line number Diff line change
Expand Up @@ -222,6 +222,7 @@ jobs:
errors.push('backends must be a non-empty array')
} else {
const ids = new Set()
const tags = new Set()
for (const b of data.backends) {
if (typeof b.id !== 'string' || !b.id) {
errors.push('every backend must have a non-empty string id')
Expand All @@ -232,21 +233,32 @@ jobs:
}
ids.add(b.id)

// Each variant lives in its own release: the tag must start
// turboquant-<id> so the URL the client builds is exact.
if (typeof b.tag !== 'string' || !b.tag.startsWith(`turboquant-${b.id}`)) {
errors.push(`Backend "${b.id}" tag "${b.tag}" must start with turboquant-${b.id}`)
// The fork publishes every variant of a build under ONE release
// tag, b<upstream-build>-<fork-semver>, e.g. b10018-1.3.0.
if (typeof b.tag !== 'string' || !/^b\d+-\d+\.\d+\.\d+$/.test(b.tag)) {
errors.push(
`Backend "${b.id}" tag "${b.tag}" must look like b<build>-<major>.<minor>.<patch> (e.g. b10018-1.3.0)`
)
} else {
tags.add(b.tag)
}

// Asset must match llama-turboquant-<id>.(zip|tar.gz).
const expectZip = `llama-turboquant-${b.id}.zip`
const expectTar = `llama-turboquant-${b.id}.tar.gz`
if (b.asset !== expectZip && b.asset !== expectTar) {
// Windows ships .zip, Linux/macOS ship .tar.gz. Pinning the
// extension per platform keeps the client's URL builder exact.
const ext = b.id.startsWith('windows-') ? 'zip' : 'tar.gz'
const expected = `llama-turboquant-${b.id}.${ext}`
if (b.asset !== expected) {
errors.push(
`Backend "${b.id}" asset "${b.asset}" must be ${expectZip} or ${expectTar}`
`Backend "${b.id}" asset "${b.asset}" must be ${expected}`
)
}
}

if (tags.size > 1) {
errors.push(
`All backends must come from ONE unified release; found tags: ${[...tags].join(', ')}`
)
}
}

if (errors.length > 0) {
Expand All @@ -257,5 +269,6 @@ jobs:

console.log('TurboQuant manifest passed all integrity checks.')
console.log(` backends: ${data.backends.length}`)
console.log(` tag: ${data.backends[0] && data.backends[0].tag}`)
if (data.commit) console.log(` commit: ${data.commit}`)
EOF
67 changes: 44 additions & 23 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ models/
backends/
manifest.json # llama.cpp backend catalog (mirrors a ggml-org release)
schema.json # JSON Schema (Draft-07) for the backends manifest
turboquant-manifest.json # TurboQuant backend catalog (one tag per variant)
turboquant-manifest.json # TurboQuant backend catalog (one unified release tag)
turboquant-schema.json # JSON Schema (Draft-07) for the TurboQuant manifest
.github/workflows/
validate.yml # Validates every manifest on every PR
Expand Down Expand Up @@ -290,41 +290,61 @@ the catalog of downloadable **TurboQuant** `llama.cpp` builds
(`AtomicBot-ai/atomic-llama-cpp-turboquant`) the Atomic Chat client offers as
a *second* provider on **Windows and Linux x64** (alongside the upstream
provider above). It exists for the same rate-limit reason as the upstream
manifest, with one twist: TurboQuant ships **each variant in its own
release** (every variant on the same SHA but a different tag), so a
`/releases/latest` lookup is useless and a `/releases` scan would hammer
`api.github.com`. Therefore **every backend entry carries its own `tag`**.
manifest: the index lives here so the client never has to scan
`api.github.com`.

The fork publishes **every variant of a build under one release tag**, named
`b<upstream-build>-<fork-semver>` — e.g. `b10018-1.3.0` is upstream llama.cpp
build `b10018` carrying fork version `1.3.0`. All entries therefore share the
same `tag`; the per-entry `tag` field is retained so an older scattered release
set stays expressible without a schema change.

```json
{
"$schema": "./turboquant-schema.json",
"updated_at": "2026-06-23T00:00:00Z",
"commit": "d86eb0b",
"updated_at": "2026-07-31T09:00:00Z",
"commit": "5bc5c248d",
"backends": [
{ "id": "windows-x64-cpu", "tag": "turboquant-windows-x64-cpu-d86eb0b", "asset": "llama-turboquant-windows-x64-cpu.zip" },
{ "id": "windows-x64-cuda-12.4", "tag": "turboquant-windows-x64-cuda-12.4-d86eb0b", "asset": "llama-turboquant-windows-x64-cuda-12.4.zip" },
{ "id": "windows-x64-cuda-13.3", "tag": "turboquant-windows-x64-cuda-13.3-d86eb0b", "asset": "llama-turboquant-windows-x64-cuda-13.3.zip" },
{ "id": "windows-x64-vulkan", "tag": "turboquant-windows-x64-vulkan-d86eb0b", "asset": "llama-turboquant-windows-x64-vulkan.zip" },
{ "id": "linux-x64-vulkan", "tag": "turboquant-linux-x64-vulkan-d86eb0b", "asset": "llama-turboquant-linux-x64-vulkan.tar.gz" }
{ "id": "windows-x64-cpu", "tag": "b10018-1.3.0", "asset": "llama-turboquant-windows-x64-cpu.zip" },
{ "id": "windows-x64-cuda-12.4", "tag": "b10018-1.3.0", "asset": "llama-turboquant-windows-x64-cuda-12.4.zip" },
{ "id": "windows-x64-cuda-13.3", "tag": "b10018-1.3.0", "asset": "llama-turboquant-windows-x64-cuda-13.3.zip" },
{ "id": "windows-x64-vulkan", "tag": "b10018-1.3.0", "asset": "llama-turboquant-windows-x64-vulkan.zip" },
{ "id": "linux-x64-cpu", "tag": "b10018-1.3.0", "asset": "llama-turboquant-linux-x64-cpu.tar.gz" },
{ "id": "linux-x64-cuda-12.4", "tag": "b10018-1.3.0", "asset": "llama-turboquant-linux-x64-cuda-12.4.tar.gz" },
{ "id": "linux-x64-cuda-13.3", "tag": "b10018-1.3.0", "asset": "llama-turboquant-linux-x64-cuda-13.3.tar.gz" },
{ "id": "linux-x64-rocm", "tag": "b10018-1.3.0", "asset": "llama-turboquant-linux-x64-rocm.tar.gz" },
{ "id": "linux-x64-vulkan", "tag": "b10018-1.3.0", "asset": "llama-turboquant-linux-x64-vulkan.tar.gz" },
{ "id": "macos-arm64", "tag": "b10018-1.3.0", "asset": "llama-turboquant-macos-arm64.tar.gz" }
]
}
```

- `id` is the clean, release-aligned backend id the client uses verbatim.
- `tag` must start `turboquant-<id>`; the archive download URL is built as
- `tag` must match `b<build>-<major>.<minor>.<patch>` and must be **identical
across all entries**; the archive download URL is built as
`…/releases/download/<tag>/<asset>` against the releases CDN (not rate-limited).
- `asset` must be `llama-turboquant-<id>.zip` (Windows) or
`llama-turboquant-<id>.tar.gz` (Linux). Windows CUDA archives **bundle**
`cudart64`/`cublas64`/`cublasLt64` — no separate cudart download.
- **macOS is bundled-only** and intentionally omitted (`macos-arm64` is never
resolved from this manifest).
`llama-turboquant-<id>.tar.gz` (Linux/macOS). The release also publishes
`.zip` copies of the Linux and macOS archives — do **not** list those.
- Windows CUDA archives ship `ggml-cuda.dll` but **no** CUDA runtime DLLs, so
the client still fetches the `cudart-*` companion from the pinned ggml-org
release (or reuses one already installed under the upstream provider).
Verified on `b10018-1.3.0`.
- Linux GPU tiers (`cuda-12.4`, `cuda-13.3`, `rocm`) are downloaded at runtime
by the client; `linux-x64-vulkan` is what the installer bundles as the offline
fallback. `linux-x64-rocm` targets RDNA2–RDNA4 and needs a host ROCm runtime,
so the client only offers it after a conservative hardware probe.
- `macos-arm64` is **bundled into the installer**, not downloaded at runtime,
but it is listed here so the build system resolves it from the same pin.

### How to update the TurboQuant manifest

> Also static and hand-maintained. Pick the new SHA's release set, then for
> each `backends[]` entry set `tag` to `turboquant-<id>-<sha>`, keep `asset`
> as `llama-turboquant-<id>.{zip,tar.gz}`, bump `commit` + `updated_at`,
> open a PR, and merge once CI is green.
> Also static and hand-maintained. Pick the new release tag, set the same
> `tag` on every `backends[]` entry, keep `asset` as
> `llama-turboquant-<id>.{zip,tar.gz}`, bump `commit` + `updated_at`, open a
> PR, and merge once CI is green. Consumers pin an immutable commit of this
> repository, so a merge alone does not upgrade anyone — the Atomic Chat
> client must bump its pinned revision in a deliberate compatibility change.

## CI validation

Expand All @@ -342,8 +362,9 @@ every push and pull request. It performs the following checks:
names must be unique.
- `ajv` validates `backends/turboquant-manifest.json` against
`backends/turboquant-schema.json`.
- Every TurboQuant `tag` must start `turboquant-<id>`, every `asset` must be
`llama-turboquant-<id>.{zip,tar.gz}`, and backend ids must be unique.
- Every TurboQuant `tag` must look like `b<build>-<semver>` and all entries must
share one tag, every `asset` must be `llama-turboquant-<id>.zip` on Windows /
`.tar.gz` elsewhere, and backend ids must be unique.

You cannot merge a PR until CI is green.

Expand Down
39 changes: 32 additions & 7 deletions backends/turboquant-manifest.json
Original file line number Diff line number Diff line change
@@ -1,32 +1,57 @@
{
"$schema": "./turboquant-schema.json",
"updated_at": "2026-07-02T12:08:43Z",
"commit": "61ee3eb",
"updated_at": "2026-07-31T09:00:00Z",
"commit": "5bc5c248d",
"backends": [
{
"id": "windows-x64-cpu",
"tag": "turboquant-windows-x64-cpu-61ee3eb",
"tag": "b10018-1.3.0",
"asset": "llama-turboquant-windows-x64-cpu.zip"
},
{
"id": "windows-x64-cuda-12.4",
"tag": "turboquant-windows-x64-cuda-12.4-61ee3eb",
"tag": "b10018-1.3.0",
"asset": "llama-turboquant-windows-x64-cuda-12.4.zip"
},
{
"id": "windows-x64-cuda-13.3",
"tag": "turboquant-windows-x64-cuda-13.3-61ee3eb",
"tag": "b10018-1.3.0",
"asset": "llama-turboquant-windows-x64-cuda-13.3.zip"
},
{
"id": "windows-x64-vulkan",
"tag": "turboquant-windows-x64-vulkan-61ee3eb",
"tag": "b10018-1.3.0",
"asset": "llama-turboquant-windows-x64-vulkan.zip"
},
{
"id": "linux-x64-cpu",
"tag": "b10018-1.3.0",
"asset": "llama-turboquant-linux-x64-cpu.tar.gz"
},
{
"id": "linux-x64-cuda-12.4",
"tag": "b10018-1.3.0",
"asset": "llama-turboquant-linux-x64-cuda-12.4.tar.gz"
},
{
"id": "linux-x64-cuda-13.3",
"tag": "b10018-1.3.0",
"asset": "llama-turboquant-linux-x64-cuda-13.3.tar.gz"
},
{
"id": "linux-x64-rocm",
"tag": "b10018-1.3.0",
"asset": "llama-turboquant-linux-x64-rocm.tar.gz"
},
{
"id": "linux-x64-vulkan",
"tag": "turboquant-linux-x64-vulkan-61ee3eb",
"tag": "b10018-1.3.0",
"asset": "llama-turboquant-linux-x64-vulkan.tar.gz"
},
{
"id": "macos-arm64",
"tag": "b10018-1.3.0",
"asset": "llama-turboquant-macos-arm64.tar.gz"
}
]
}
16 changes: 8 additions & 8 deletions backends/turboquant-schema.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Atomic Chat TurboQuant llama.cpp Backends Manifest",
"description": "Schema for the static TurboQuant (AtomicBot-ai/atomic-llama-cpp-turboquant) backends manifest consumed by the Atomic Chat client (@janhq/llamacpp-extension) on Windows and Linux. Unlike the upstream backends manifest (a single tag_name + assets, mirroring one GitHub release), TurboQuant ships each backend variant in its OWN release, so every entry carries its own tag. The archive downloads still come from the GitHub releases CDN; only the index lives here to dodge the api.github.com rate limit.",
"description": "Schema for the static TurboQuant (AtomicBot-ai/atomic-llama-cpp-turboquant) backends manifest consumed by the Atomic Chat client (@janhq/llamacpp-extension) on Windows and Linux, and by the build system for the bundled macOS artifact. The fork publishes every backend variant of a build under ONE release tag named b<upstream-build>-<fork-semver> (e.g. b10018-1.3.0), so all entries share the same tag; the per-entry tag field is kept so legacy scattered releases stay expressible. The archive downloads still come from the GitHub releases CDN; only the index lives here to dodge the api.github.com rate limit.",
"type": "object",
"required": ["backends"],
"additionalProperties": false,
Expand All @@ -14,13 +14,13 @@
},
"commit": {
"type": "string",
"description": "Short SHA the release set was built from (e.g. d86eb0b). Informational only."
"description": "Short SHA the release set was built from (e.g. 5bc5c248d). Informational only."
},
"backends": {
"type": "array",
"minItems": 1,
"items": { "$ref": "#/definitions/backend" },
"description": "TurboQuant backend variants. Each carries its own release tag because the variants live in separate releases. macOS is bundled-only and never parsed from this manifest."
"description": "TurboQuant backend variants. Every entry of a unified release carries the same tag. macOS is bundled into the installer rather than downloaded at runtime, but its entry is listed so the build system can resolve it from here too."
}
},
"definitions": {
Expand All @@ -31,18 +31,18 @@
"properties": {
"id": {
"type": "string",
"pattern": "^(windows-x64-(cpu|vulkan|cuda-[0-9]+\\.[0-9]+)|linux-x64-vulkan|macos-arm64)$",
"description": "Clean backend id, e.g. windows-x64-cuda-12.4, linux-x64-vulkan."
"pattern": "^(windows-x64-(cpu|vulkan|cuda-[0-9]+\\.[0-9]+)|linux-x64-(cpu|vulkan|rocm|cuda-[0-9]+\\.[0-9]+)|macos-arm64)$",
"description": "Clean backend id, e.g. windows-x64-cuda-12.4, linux-x64-rocm."
},
"tag": {
"type": "string",
"pattern": "^turboquant-",
"description": "GitHub release tag carrying this variant's asset, e.g. turboquant-windows-x64-cuda-12.4-d86eb0b."
"pattern": "^b[0-9]+-[0-9]+\\.[0-9]+\\.[0-9]+$",
"description": "GitHub release tag carrying this variant's asset, e.g. b10018-1.3.0 (upstream llama.cpp build b10018, fork version 1.3.0)."
},
"asset": {
"type": "string",
"pattern": "^llama-turboquant-.+\\.(zip|tar\\.gz)$",
"description": "Release asset filename, e.g. llama-turboquant-windows-x64-cuda-12.4.zip."
"description": "Release asset filename, e.g. llama-turboquant-linux-x64-rocm.tar.gz."
}
}
}
Expand Down
Loading