diff --git a/CHANGELOG.md b/CHANGELOG.md index 75cf93a..cea303e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,61 @@ recompiling. A breaking change waits for 2.0. (Before RC.1, `1.0.0-beta.N` and e beta.4 → RC.1 changes that can break a build are listed under *Changed — breaking (pre-GA)* in the RC.1 entry, and each entry's own "Beta caveats" apply to the betas.) +## 2.2.0 — GA — 2026-10-22 + +Nemotron 3.5 support in `LocalLMLabSDKInference`; no API change (the public surface is identical to +2.1.0's). + +### Added + +- **Nemotron 3.5 runs locally.** The MLX runtime reads Nemotron 3.5's configuration + (`layers_block_type` / `block_configs` instead of a `hybrid_override_pattern` string), adds its latent + MoE layers, registers `nemotron_h_puzzle` (the Bolt models), and skips the multi-token-prediction + weights it doesn't use. Before, `NVIDIA-Nemotron-3.5-Lightning-30B-A3B` failed to load. Tested with + tools, including the GitHub MCP server: + - `mlx-community/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-4bit` and `-8bit` + - `rapid-mlx/NVIDIA-Nemotron-3.5-Bolt-74B-A9B-MLX-3bit` + - `rapid-mlx/NVIDIA-Nemotron-3.5-Super-VL-120B-A12B-MLX-3bit` (text only, despite the name) + + Bolt builds that take images (`nemotron_h_omni`, `nemotron_h_nano_omni`) still don't load, and + neither does a conversion with per-layer quantization settings (`hermitdave/…-mixed36`). + +### Fixed + +- **`SessionOptions(effort: .off)` turns Nemotron's thinking off.** Before, Nemotron ignored it and + always reasoned. The model now declares its reasoning toggle (`enable_thinking`), so + `ModelCapabilities.reasoningToggle` reports it too. +- **A reply from a model whose prompt opens `` now has a balanced reasoning block.** Nemotron + 3.5's and Qwen3.5's chat templates open `` in the prompt, so the model's reply streamed only + `…answer`, and the reasoning landed in the answer. The SDK now detects this on each model + call from the end of the rendered prompt and restores the opening ``, so `hostTranscript` + splits the reasoning from the reply with no model-specific handling. A tool call made while that + block is still open gets a `` first. Tool-call parsing is unchanged. + +### Changed + +- **`LocalLMLabSDKInference`'s MLX runtime pin moves from `30d755c` to `dea880a`**: 2.1.0's runtime plus + two Nemotron 3.5 commits of ours, on the `nemotron-3.5-support` branch of our mirror fork, + `ancientcomputing/mlx-swift-lm` (tag `locallmlab-sdk-pin-dea880a`). Nothing else in the runtime + changes. + +### Known issues + +- **Qwen3.5-9B's tool calls are often rejected as malformed.** This predates 2.2.0. +- **Nemotron 3.5 can run a tool call it writes inside its reasoning.** Seen only when the prompt asks + for call markup while thinking. + +### Checksums (SHA-256) + +``` +LocalLMLabSDKCore-2.2.0-GA.xcframework.zip 5efc40cae9f8a1bf53bfe03195c5365398bc9501b3e6b0feee3e5c67385537f4 +LocalLMLabSDKClaude-2.2.0-GA.xcframework.zip 07e2ff01accf582f71fecab254bdae2e8fb46acc8296ef6ab1c8d84cd9e97a04 +LocalLMLabSDKInference-2.2.0-GA.xcframework.zip afd427fb741a820f55bc0a384850ae6404608f5ad73d185a583a89e8f0d61a61 +LocalLMLabSDKRemote-2.2.0-GA.xcframework.zip 1c9af025c700bc0c41c80387c1d6a59ba2f2ab6203eb8ffd8548d61c6ac1fe38 +``` + +--- + ## 2.1.0 — GA — 2026-10-15 Fixes and a newer MLX runtime; no API change (the public surface is identical to 2.0.0's). diff --git a/Components/Package.swift b/Components/Package.swift index d1b81e4..21107d2 100644 --- a/Components/Package.swift +++ b/Components/Package.swift @@ -24,17 +24,17 @@ struct SDKRelease { // or edit `defaultSDKVersion`. For a release not listed, add its entry (URL follows the pattern // below; checksum is the `.sha256` next to the zip on that GitHub release). Keep this in step // with `examples/model-switch/Package.swift`, which consumes Core through this package. -let defaultSDKVersion = "2.1.0-GA" +let defaultSDKVersion = "2.2.0-GA" let knownSDKReleases: [String: SDKRelease] = [ - "2.0.0-GA": SDKRelease( - url: "https://github.com/ancientcomputing/locallm/releases/download/v2.0.0-GA/LocalLMLabSDKCore-2.0.0-GA.xcframework.zip", - checksum: "5f9418a6879b22227afdf867cf474d426b93ae36d783d5a958efaae1e347681b" - ), "2.1.0-GA": SDKRelease( url: "https://github.com/ancientcomputing/locallm/releases/download/v2.1.0-GA/LocalLMLabSDKCore-2.1.0-GA.xcframework.zip", checksum: "8d541e06f81d1586c959d6159a259c759853c88b2c68385ab28de493af6c5776" ), + "2.2.0-GA": SDKRelease( + url: "https://github.com/ancientcomputing/locallm/releases/download/v2.2.0-GA/LocalLMLabSDKCore-2.2.0-GA.xcframework.zip", + checksum: "5efc40cae9f8a1bf53bfe03195c5365398bc9501b3e6b0feee3e5c67385537f4" + ), ] func failManifest(_ message: String) -> Never { diff --git a/README.md b/README.md index c5b7d87..4ba3e4c 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ doesn't carry. **Product page:** [thisbrain.ai/locallm](https://thisbrain.ai/locallm) — or get the app directly: -[LocalLM Lab 2.1.0-GA (arm64 DMG)](https://github.com/ancientcomputing/locallm/releases/download/v2.1.0-GA/LocalLM.Lab-2.1.0-GA-arm64.dmg). +[LocalLM Lab 2.2.0-GA (arm64 DMG)](https://github.com/ancientcomputing/locallm/releases/download/v2.2.0-GA/LocalLM.Lab-2.2.0-GA-arm64.dmg). ## LocalLM Lab SDK diff --git a/docs/api-surface.md b/docs/api-surface.md index 80ce1fc..fb4a12b 100644 --- a/docs/api-surface.md +++ b/docs/api-surface.md @@ -2,7 +2,7 @@ > Machine-generated by `scripts/dump-public-api.sh` from the built `.swiftinterface`s. > Do not hand-edit. `sdk-guide.md` §12 is the *narrative* reference; this is the check. -> SDK version: `"2.1.0"` (the published `v2.1.0-GA` xcframeworks, re-published 2026-10-17 from 8e5d287) · generated 2026-10-17T13:38Z +> SDK version: `"2.2.0"` (the published `v2.2.0-GA` xcframeworks, built from dd96469) · generated 2026-10-22T20:25Z ## LocalLMLabSDKCore diff --git a/docs/sdk-guide.md b/docs/sdk-guide.md index c58c0e3..0673c18 100644 --- a/docs/sdk-guide.md +++ b/docs/sdk-guide.md @@ -9,7 +9,7 @@ below for the working reference apps this guide is drawn from. Requires macOS 26+ on Apple Silicon, Swift 6 tools. -**Status note**: this guide describes the API as of `2.1.0`. `2.0.0` was a one-time breaking release; +**Status note**: this guide describes the API as of `2.2.0`. `2.0.0` was a one-time breaking release; every 2.x release after it is source compatible with it (see [§9](#9-scope-and-boundaries-what-core-doesnt-do) for the compatibility policy). Coming from 1.x: [`migrating-to-2.0.md`](migrating-to-2.0.md); from `0.8.x`: [`migrating-to-1.0.md`](migrating-to-1.0.md) first. New in 2.0: per-server trust and tool diff --git a/examples/README.md b/examples/README.md index bb5547a..db0aa08 100644 --- a/examples/README.md +++ b/examples/README.md @@ -59,7 +59,7 @@ advanced model-layer features (Private Cloud Compute, open-weight/MLX, Claude, o need it — but it isn't universal: [`os-matrix/`](os-matrix/) is built and tested to run unchanged on **macOS 26** too (see its README). -The examples on this `2.1.0-GA` branch build against SDK **`2.1.0-GA`**; the ones on `main` +The examples on this `2.2.0-GA` branch build against SDK **`2.2.0-GA`**; the ones on `main` build against the latest stable release. No environment variable is needed for either. ### What each example needs @@ -158,7 +158,7 @@ resolution doesn't inherit shell environment variables. ```bash cd examples/repo-qa -LOCALLM_SDK_VERSION=2.0.0-GA \ +LOCALLM_SDK_VERSION=2.1.0-GA \ DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer \ swift run RepoQA facebook/react ``` @@ -171,13 +171,13 @@ previous one. (`code-buddy/sample-workspace/Package.swift` is not one of these dependency-free fixture for the code-buddy walkthrough, not an SDK consumer.) ```swift -let defaultSDKVersion = "2.1.0-GA" +let defaultSDKVersion = "2.2.0-GA" let knownSDKReleases: [String: SDKRelease] = [ - "2.0.0-GA": SDKRelease(url: "…/v2.0.0-GA/LocalLMLabSDKCore-2.0.0-GA.xcframework.zip", - checksum: "5f9418a6…"), "2.1.0-GA": SDKRelease(url: "…/v2.1.0-GA/LocalLMLabSDKCore-2.1.0-GA.xcframework.zip", checksum: "8d541e06…"), + "2.2.0-GA": SDKRelease(url: "…/v2.2.0-GA/LocalLMLabSDKCore-2.2.0-GA.xcframework.zip", + checksum: "5efc40ca…"), ] ``` @@ -188,10 +188,10 @@ every module ships its own checksum (`Core`, `Inference`, `Remote`, and `Claude` distinct `.xcframework.zip.sha256`; don't reuse Core's for another module): ```bash -curl -sL https://github.com/ancientcomputing/locallm/releases/download/v2.1.0-GA/LocalLMLabSDKCore-2.1.0-GA.xcframework.zip.sha256 -# → 8d541e06f81d1586c959d6159a259c759853c88b2c68385ab28de493af6c5776 -curl -sL https://github.com/ancientcomputing/locallm/releases/download/v2.1.0-GA/LocalLMLabSDKClaude-2.1.0-GA.xcframework.zip.sha256 -# → f54472c25063f7c6d6d5a49a91992beb1300d9b6d986ee83d41e682ac2a2c172 +curl -sL https://github.com/ancientcomputing/locallm/releases/download/v2.2.0-GA/LocalLMLabSDKCore-2.2.0-GA.xcframework.zip.sha256 +# → 5efc40cae9f8a1bf53bfe03195c5365398bc9501b3e6b0feee3e5c67385537f4 +curl -sL https://github.com/ancientcomputing/locallm/releases/download/v2.2.0-GA/LocalLMLabSDKClaude-2.2.0-GA.xcframework.zip.sha256 +# → 07e2ff01accf582f71fecab254bdae2e8fb46acc8296ef6ab1c8d84cd9e97a04 ``` Then point `defaultSDKVersion` at it (works everywhere, Xcode included) or pass diff --git a/examples/aiql/Package.swift b/examples/aiql/Package.swift index 500ea2d..deecb21 100644 --- a/examples/aiql/Package.swift +++ b/examples/aiql/Package.swift @@ -31,21 +31,21 @@ struct SDKRelease { // uses. `knownSDKReleases` carries this plus the previous release. Build against another // published version: set LOCALLM_SDK_VERSION in your shell (works for `swift build` / CI, NOT // inside Xcode), or edit `defaultSDKVersion` here. -let defaultSDKVersion = "2.1.0-GA" +let defaultSDKVersion = "2.2.0-GA" let knownSDKReleases: [String: SDKRelease] = [ - "2.0.0-GA": SDKRelease( - coreURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.0.0-GA/LocalLMLabSDKCore-2.0.0-GA.xcframework.zip", - coreChecksum: "5f9418a6879b22227afdf867cf474d426b93ae36d783d5a958efaae1e347681b", - inferenceURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.0.0-GA/LocalLMLabSDKInference-2.0.0-GA.xcframework.zip", - inferenceChecksum: "d2ed4a02686aceab0edf4231ede55c924ea3ab273c7c5cab0bb02f4bda40a185" - ), "2.1.0-GA": SDKRelease( coreURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.1.0-GA/LocalLMLabSDKCore-2.1.0-GA.xcframework.zip", coreChecksum: "8d541e06f81d1586c959d6159a259c759853c88b2c68385ab28de493af6c5776", inferenceURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.1.0-GA/LocalLMLabSDKInference-2.1.0-GA.xcframework.zip", inferenceChecksum: "77d3d1a1bae9df6de5955dfa945242c177cb129b4896c95befb81db6c923656f" ), + "2.2.0-GA": SDKRelease( + coreURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.2.0-GA/LocalLMLabSDKCore-2.2.0-GA.xcframework.zip", + coreChecksum: "5efc40cae9f8a1bf53bfe03195c5365398bc9501b3e6b0feee3e5c67385537f4", + inferenceURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.2.0-GA/LocalLMLabSDKInference-2.2.0-GA.xcframework.zip", + inferenceChecksum: "afd427fb741a820f55bc0a384850ae6404608f5ad73d185a583a89e8f0d61a61" + ), ] func failManifest(_ message: String) -> Never { diff --git a/examples/aiql/README.md b/examples/aiql/README.md index b3ae6e8..3ead888 100644 --- a/examples/aiql/README.md +++ b/examples/aiql/README.md @@ -103,7 +103,7 @@ export DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer ``` Skip it if `xcode-select -p` already points at Xcode 27 (adjust the path if yours lives elsewhere). Leaves your system default alone; lasts only for the current terminal (re-run it in each new one, -or add it to your `~/.zshrc`). `Package.swift` builds against SDK `2.1.0-GA` with no further +or add it to your `~/.zshrc`). `Package.swift` builds against SDK `2.2.0-GA` with no further setup (AIQL needs it: it uses `lab.mcp.setFileBackedOutput`, new in 2.0) — it links **two** binaries, `LocalLMLabSDKCore.xcframework` and `LocalLMLabSDKInference.xcframework` (the MLX runtime), from that one GitHub Release. `export LOCALLM_SDK_VERSION=` to pin a different published release. **No Metal Toolchain diff --git a/examples/code-buddy/Package.swift b/examples/code-buddy/Package.swift index 8a6fef5..85f25f2 100644 --- a/examples/code-buddy/Package.swift +++ b/examples/code-buddy/Package.swift @@ -25,21 +25,21 @@ struct SDKRelease { // `swift build` / CI, NOT inside Xcode), or edit `defaultSDKVersion` here. For a // release not listed, add its entry (URL + the `.sha256` next to the zip on the // GitHub release) or just replace the strings in place. -let defaultSDKVersion = "2.1.0-GA" +let defaultSDKVersion = "2.2.0-GA" let knownSDKReleases: [String: SDKRelease] = [ - "2.0.0-GA": SDKRelease( - coreURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.0.0-GA/LocalLMLabSDKCore-2.0.0-GA.xcframework.zip", - coreChecksum: "5f9418a6879b22227afdf867cf474d426b93ae36d783d5a958efaae1e347681b", - inferenceURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.0.0-GA/LocalLMLabSDKInference-2.0.0-GA.xcframework.zip", - inferenceChecksum: "d2ed4a02686aceab0edf4231ede55c924ea3ab273c7c5cab0bb02f4bda40a185" - ), "2.1.0-GA": SDKRelease( coreURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.1.0-GA/LocalLMLabSDKCore-2.1.0-GA.xcframework.zip", coreChecksum: "8d541e06f81d1586c959d6159a259c759853c88b2c68385ab28de493af6c5776", inferenceURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.1.0-GA/LocalLMLabSDKInference-2.1.0-GA.xcframework.zip", inferenceChecksum: "77d3d1a1bae9df6de5955dfa945242c177cb129b4896c95befb81db6c923656f" ), + "2.2.0-GA": SDKRelease( + coreURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.2.0-GA/LocalLMLabSDKCore-2.2.0-GA.xcframework.zip", + coreChecksum: "5efc40cae9f8a1bf53bfe03195c5365398bc9501b3e6b0feee3e5c67385537f4", + inferenceURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.2.0-GA/LocalLMLabSDKInference-2.2.0-GA.xcframework.zip", + inferenceChecksum: "afd427fb741a820f55bc0a384850ae6404608f5ad73d185a583a89e8f0d61a61" + ), ] func failManifest(_ message: String) -> Never { diff --git a/examples/components-updates-demo/README.md b/examples/components-updates-demo/README.md index acc6466..ea9a306 100644 --- a/examples/components-updates-demo/README.md +++ b/examples/components-updates-demo/README.md @@ -25,9 +25,9 @@ Requires macOS 27+ on Apple Silicon (Xcode 27 to build). No permissions, no sign ## Getting the SDK -This branch tracks `2.1.0-GA`. Nothing to download by hand — `Package.swift` depends on the sibling +This branch tracks `2.2.0-GA`. Nothing to download by hand — `Package.swift` depends on the sibling [`Components`](../../Components/) package, which resolves `LocalLMLabSDKCore` as a binary dependency and builds -against `2.1.0-GA` by default. Set `LOCALLM_SDK_VERSION` in a shell (not Xcode) to pin another published +against `2.2.0-GA` by default. Set `LOCALLM_SDK_VERSION` in a shell (not Xcode) to pin another published release — see [`../README.md`](../README.md#building--running-an-sdk-example). ## Build and run diff --git a/examples/jevdk/Package.swift b/examples/jevdk/Package.swift index b625aaf..a975b88 100644 --- a/examples/jevdk/Package.swift +++ b/examples/jevdk/Package.swift @@ -33,17 +33,9 @@ struct SDKRelease { // or edit `defaultSDKVersion` here. For a release not listed, add its entry (URL + the `.sha256` // next to each zip on the GitHub release) or just replace the strings in place. Only 2.0 // releases: this app does not build against 1.0. -let defaultSDKVersion = "2.1.0-GA" +let defaultSDKVersion = "2.2.0-GA" let knownSDKReleases: [String: SDKRelease] = [ - "2.0.0-GA": SDKRelease( - coreURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.0.0-GA/LocalLMLabSDKCore-2.0.0-GA.xcframework.zip", - coreChecksum: "5f9418a6879b22227afdf867cf474d426b93ae36d783d5a958efaae1e347681b", - remoteURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.0.0-GA/LocalLMLabSDKRemote-2.0.0-GA.xcframework.zip", - remoteChecksum: "1e809cff19a7d232cd82fd36eb3ba7d79a93b55f71b6694041c9d9e3f6261be9", - inferenceURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.0.0-GA/LocalLMLabSDKInference-2.0.0-GA.xcframework.zip", - inferenceChecksum: "d2ed4a02686aceab0edf4231ede55c924ea3ab273c7c5cab0bb02f4bda40a185" - ), "2.1.0-GA": SDKRelease( coreURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.1.0-GA/LocalLMLabSDKCore-2.1.0-GA.xcframework.zip", coreChecksum: "8d541e06f81d1586c959d6159a259c759853c88b2c68385ab28de493af6c5776", @@ -52,6 +44,14 @@ let knownSDKReleases: [String: SDKRelease] = [ inferenceURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.1.0-GA/LocalLMLabSDKInference-2.1.0-GA.xcframework.zip", inferenceChecksum: "77d3d1a1bae9df6de5955dfa945242c177cb129b4896c95befb81db6c923656f" ), + "2.2.0-GA": SDKRelease( + coreURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.2.0-GA/LocalLMLabSDKCore-2.2.0-GA.xcframework.zip", + coreChecksum: "5efc40cae9f8a1bf53bfe03195c5365398bc9501b3e6b0feee3e5c67385537f4", + remoteURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.2.0-GA/LocalLMLabSDKRemote-2.2.0-GA.xcframework.zip", + remoteChecksum: "1c9af025c700bc0c41c80387c1d6a59ba2f2ab6203eb8ffd8548d61c6ac1fe38", + inferenceURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.2.0-GA/LocalLMLabSDKInference-2.2.0-GA.xcframework.zip", + inferenceChecksum: "afd427fb741a820f55bc0a384850ae6404608f5ad73d185a583a89e8f0d61a61" + ), ] func failManifest(_ message: String) -> Never { diff --git a/examples/jevdk/README.md b/examples/jevdk/README.md index 7aea4c5..5c00a43 100644 --- a/examples/jevdk/README.md +++ b/examples/jevdk/README.md @@ -9,7 +9,7 @@ swift build -c release ``` Needs an Apple-silicon Mac, macOS 27 and Xcode 27 (Swift 6.4). `Package.swift` builds against SDK -`2.1.0-GA` with no further setup (the decision API is new in 2.0): `LocalLMLabSDKCore`, +`2.2.0-GA` with no further setup (the decision API is new in 2.0): `LocalLMLabSDKCore`, `LocalLMLabSDKRemote` and `LocalLMLabSDKInference` (the MLX runtime) come from that GitHub Release. No Metal Toolchain needed; the prebuilt Inference xcframework bundles the compiled shaders. To build against another release, set `LOCALLM_SDK_VERSION` (see [the README one folder up](../README.md)). diff --git a/examples/mcp-chat/Package.swift b/examples/mcp-chat/Package.swift index 746513c..146b748 100644 --- a/examples/mcp-chat/Package.swift +++ b/examples/mcp-chat/Package.swift @@ -31,17 +31,17 @@ struct SDKRelease { // The SDK release this example builds against with no setup. Build against another published // version: set LOCALLM_SDK_VERSION in your shell (works for `swift build` / CI, NOT inside Xcode), // or edit `defaultSDKVersion` here. -let defaultSDKVersion = "2.1.0-GA" +let defaultSDKVersion = "2.2.0-GA" let knownSDKReleases: [String: SDKRelease] = [ - "2.0.0-GA": SDKRelease( - inferenceURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.0.0-GA/LocalLMLabSDKInference-2.0.0-GA.xcframework.zip", - inferenceChecksum: "d2ed4a02686aceab0edf4231ede55c924ea3ab273c7c5cab0bb02f4bda40a185" - ), "2.1.0-GA": SDKRelease( inferenceURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.1.0-GA/LocalLMLabSDKInference-2.1.0-GA.xcframework.zip", inferenceChecksum: "77d3d1a1bae9df6de5955dfa945242c177cb129b4896c95befb81db6c923656f" ), + "2.2.0-GA": SDKRelease( + inferenceURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.2.0-GA/LocalLMLabSDKInference-2.2.0-GA.xcframework.zip", + inferenceChecksum: "afd427fb741a820f55bc0a384850ae6404608f5ad73d185a583a89e8f0d61a61" + ), ] func failManifest(_ message: String) -> Never { diff --git a/examples/mcp-chat/README.md b/examples/mcp-chat/README.md index 0662a59..63c0ff7 100644 --- a/examples/mcp-chat/README.md +++ b/examples/mcp-chat/README.md @@ -7,7 +7,7 @@ shows Todoist's task list under the call. Qwen3 8B through MLX by default; Apple's on-device model as an alternative (Settings). -`Package.swift` builds against SDK `2.1.0-GA` with no further setup (MCP Apps support is new in +`Package.swift` builds against SDK `2.2.0-GA` with no further setup (MCP Apps support is new in 2.0): `LocalLMLabSDKCore` and `LocalLMLabSDKInference` (the MLX runtime) come from that GitHub Release, `Components` (`../../Components`) and `MCPAppsHost` (`../../MCPAppsHost`) from this repo as source. Needs macOS 27 and Xcode 27 (Swift 6.4). No Metal Toolchain needed — the prebuilt Inference diff --git a/examples/mlx-control-room/Package.swift b/examples/mlx-control-room/Package.swift index 6e3248f..b71c906 100644 --- a/examples/mlx-control-room/Package.swift +++ b/examples/mlx-control-room/Package.swift @@ -25,21 +25,21 @@ struct SDKRelease { // its entry (URL + the `.sha256` next to the zip on the GitHub release) or just replace the strings in // place. Needs a release that includes the model pin / update / cleanup APIs (1.0.0-RC.1 as re-published // on 2026-09-18, or later). -let defaultSDKVersion = "2.1.0-GA" +let defaultSDKVersion = "2.2.0-GA" let knownSDKReleases: [String: SDKRelease] = [ - "2.0.0-GA": SDKRelease( - coreURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.0.0-GA/LocalLMLabSDKCore-2.0.0-GA.xcframework.zip", - coreChecksum: "5f9418a6879b22227afdf867cf474d426b93ae36d783d5a958efaae1e347681b", - inferenceURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.0.0-GA/LocalLMLabSDKInference-2.0.0-GA.xcframework.zip", - inferenceChecksum: "d2ed4a02686aceab0edf4231ede55c924ea3ab273c7c5cab0bb02f4bda40a185" - ), "2.1.0-GA": SDKRelease( coreURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.1.0-GA/LocalLMLabSDKCore-2.1.0-GA.xcframework.zip", coreChecksum: "8d541e06f81d1586c959d6159a259c759853c88b2c68385ab28de493af6c5776", inferenceURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.1.0-GA/LocalLMLabSDKInference-2.1.0-GA.xcframework.zip", inferenceChecksum: "77d3d1a1bae9df6de5955dfa945242c177cb129b4896c95befb81db6c923656f" ), + "2.2.0-GA": SDKRelease( + coreURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.2.0-GA/LocalLMLabSDKCore-2.2.0-GA.xcframework.zip", + coreChecksum: "5efc40cae9f8a1bf53bfe03195c5365398bc9501b3e6b0feee3e5c67385537f4", + inferenceURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.2.0-GA/LocalLMLabSDKInference-2.2.0-GA.xcframework.zip", + inferenceChecksum: "afd427fb741a820f55bc0a384850ae6404608f5ad73d185a583a89e8f0d61a61" + ), ] func failManifest(_ message: String) -> Never { diff --git a/examples/model-switch/Package.swift b/examples/model-switch/Package.swift index a26521c..7cc37da 100644 --- a/examples/model-switch/Package.swift +++ b/examples/model-switch/Package.swift @@ -28,17 +28,17 @@ struct SDKRelease { // `swift build` / CI, NOT inside Xcode), or edit `defaultSDKVersion` here. For a // release not listed, add its entry (URL + the `.sha256` next to the zip on the // GitHub release) or just replace the strings in place. -let defaultSDKVersion = "2.1.0-GA" +let defaultSDKVersion = "2.2.0-GA" let knownSDKReleases: [String: SDKRelease] = [ - "2.0.0-GA": SDKRelease( - remoteURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.0.0-GA/LocalLMLabSDKRemote-2.0.0-GA.xcframework.zip", - remoteChecksum: "1e809cff19a7d232cd82fd36eb3ba7d79a93b55f71b6694041c9d9e3f6261be9" - ), "2.1.0-GA": SDKRelease( remoteURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.1.0-GA/LocalLMLabSDKRemote-2.1.0-GA.xcframework.zip", remoteChecksum: "347257172a6da7104b7081602e9dbfc853ed5d038b5e30831aad8dfa2753ae92" ), + "2.2.0-GA": SDKRelease( + remoteURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.2.0-GA/LocalLMLabSDKRemote-2.2.0-GA.xcframework.zip", + remoteChecksum: "1c9af025c700bc0c41c80387c1d6a59ba2f2ab6203eb8ffd8548d61c6ac1fe38" + ), ] func failManifest(_ message: String) -> Never { diff --git a/examples/os-matrix/Package.swift b/examples/os-matrix/Package.swift index 077d6f2..6c318bf 100644 --- a/examples/os-matrix/Package.swift +++ b/examples/os-matrix/Package.swift @@ -22,21 +22,21 @@ struct SDKRelease { // `swift build` / CI, NOT inside Xcode), or edit `defaultSDKVersion` here. For a // release not listed, add its entry (URL + the `.sha256` next to the zip on the // GitHub release) or just replace the strings in place. -let defaultSDKVersion = "2.1.0-GA" +let defaultSDKVersion = "2.2.0-GA" let knownSDKReleases: [String: SDKRelease] = [ - "2.0.0-GA": SDKRelease( - coreURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.0.0-GA/LocalLMLabSDKCore-2.0.0-GA.xcframework.zip", - coreChecksum: "5f9418a6879b22227afdf867cf474d426b93ae36d783d5a958efaae1e347681b", - inferenceURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.0.0-GA/LocalLMLabSDKInference-2.0.0-GA.xcframework.zip", - inferenceChecksum: "d2ed4a02686aceab0edf4231ede55c924ea3ab273c7c5cab0bb02f4bda40a185" - ), "2.1.0-GA": SDKRelease( coreURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.1.0-GA/LocalLMLabSDKCore-2.1.0-GA.xcframework.zip", coreChecksum: "8d541e06f81d1586c959d6159a259c759853c88b2c68385ab28de493af6c5776", inferenceURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.1.0-GA/LocalLMLabSDKInference-2.1.0-GA.xcframework.zip", inferenceChecksum: "77d3d1a1bae9df6de5955dfa945242c177cb129b4896c95befb81db6c923656f" ), + "2.2.0-GA": SDKRelease( + coreURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.2.0-GA/LocalLMLabSDKCore-2.2.0-GA.xcframework.zip", + coreChecksum: "5efc40cae9f8a1bf53bfe03195c5365398bc9501b3e6b0feee3e5c67385537f4", + inferenceURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.2.0-GA/LocalLMLabSDKInference-2.2.0-GA.xcframework.zip", + inferenceChecksum: "afd427fb741a820f55bc0a384850ae6404608f5ad73d185a583a89e8f0d61a61" + ), ] func failManifest(_ message: String) -> Never { diff --git a/examples/plate-today-tools/Package.swift b/examples/plate-today-tools/Package.swift index 834a483..227c166 100644 --- a/examples/plate-today-tools/Package.swift +++ b/examples/plate-today-tools/Package.swift @@ -23,17 +23,17 @@ struct SDKRelease { // `swift build` / CI, NOT inside Xcode), or edit `defaultSDKVersion` here. For a // release not listed, add its entry (URL + the `.sha256` next to the zip on the // GitHub release) or just replace the strings in place. -let defaultSDKVersion = "2.1.0-GA" +let defaultSDKVersion = "2.2.0-GA" let knownSDKReleases: [String: SDKRelease] = [ - "2.0.0-GA": SDKRelease( - url: "https://github.com/ancientcomputing/locallm/releases/download/v2.0.0-GA/LocalLMLabSDKCore-2.0.0-GA.xcframework.zip", - checksum: "5f9418a6879b22227afdf867cf474d426b93ae36d783d5a958efaae1e347681b" - ), "2.1.0-GA": SDKRelease( url: "https://github.com/ancientcomputing/locallm/releases/download/v2.1.0-GA/LocalLMLabSDKCore-2.1.0-GA.xcframework.zip", checksum: "8d541e06f81d1586c959d6159a259c759853c88b2c68385ab28de493af6c5776" ), + "2.2.0-GA": SDKRelease( + url: "https://github.com/ancientcomputing/locallm/releases/download/v2.2.0-GA/LocalLMLabSDKCore-2.2.0-GA.xcframework.zip", + checksum: "5efc40cae9f8a1bf53bfe03195c5365398bc9501b3e6b0feee3e5c67385537f4" + ), ] func failManifest(_ message: String) -> Never { diff --git a/examples/plate-today/Package.swift b/examples/plate-today/Package.swift index a6efba8..90a656b 100644 --- a/examples/plate-today/Package.swift +++ b/examples/plate-today/Package.swift @@ -20,17 +20,17 @@ struct SDKRelease { // edit `defaultSDKVersion` here. For a release not listed, add its entry — the URL follows the // pattern below and the checksum is the `.sha256` file next to the zip on that GitHub release — // or just replace the two strings in place. -let defaultSDKVersion = "2.1.0-GA" +let defaultSDKVersion = "2.2.0-GA" let knownSDKReleases: [String: SDKRelease] = [ - "2.0.0-GA": SDKRelease( - url: "https://github.com/ancientcomputing/locallm/releases/download/v2.0.0-GA/LocalLMLabSDKCore-2.0.0-GA.xcframework.zip", - checksum: "5f9418a6879b22227afdf867cf474d426b93ae36d783d5a958efaae1e347681b" - ), "2.1.0-GA": SDKRelease( url: "https://github.com/ancientcomputing/locallm/releases/download/v2.1.0-GA/LocalLMLabSDKCore-2.1.0-GA.xcframework.zip", checksum: "8d541e06f81d1586c959d6159a259c759853c88b2c68385ab28de493af6c5776" ), + "2.2.0-GA": SDKRelease( + url: "https://github.com/ancientcomputing/locallm/releases/download/v2.2.0-GA/LocalLMLabSDKCore-2.2.0-GA.xcframework.zip", + checksum: "5efc40cae9f8a1bf53bfe03195c5365398bc9501b3e6b0feee3e5c67385537f4" + ), ] func failManifest(_ message: String) -> Never { diff --git a/examples/repo-qa-local/Package.swift b/examples/repo-qa-local/Package.swift index d941ab3..af80fc0 100644 --- a/examples/repo-qa-local/Package.swift +++ b/examples/repo-qa-local/Package.swift @@ -26,21 +26,21 @@ struct SDKRelease { // `swift build` / CI, NOT inside Xcode), or edit `defaultSDKVersion` here. For a // release not listed, add its entry (URL + the `.sha256` next to the zip on the // GitHub release) or just replace the strings in place. -let defaultSDKVersion = "2.1.0-GA" +let defaultSDKVersion = "2.2.0-GA" let knownSDKReleases: [String: SDKRelease] = [ - "2.0.0-GA": SDKRelease( - coreURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.0.0-GA/LocalLMLabSDKCore-2.0.0-GA.xcframework.zip", - coreChecksum: "5f9418a6879b22227afdf867cf474d426b93ae36d783d5a958efaae1e347681b", - inferenceURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.0.0-GA/LocalLMLabSDKInference-2.0.0-GA.xcframework.zip", - inferenceChecksum: "d2ed4a02686aceab0edf4231ede55c924ea3ab273c7c5cab0bb02f4bda40a185" - ), "2.1.0-GA": SDKRelease( coreURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.1.0-GA/LocalLMLabSDKCore-2.1.0-GA.xcframework.zip", coreChecksum: "8d541e06f81d1586c959d6159a259c759853c88b2c68385ab28de493af6c5776", inferenceURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.1.0-GA/LocalLMLabSDKInference-2.1.0-GA.xcframework.zip", inferenceChecksum: "77d3d1a1bae9df6de5955dfa945242c177cb129b4896c95befb81db6c923656f" ), + "2.2.0-GA": SDKRelease( + coreURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.2.0-GA/LocalLMLabSDKCore-2.2.0-GA.xcframework.zip", + coreChecksum: "5efc40cae9f8a1bf53bfe03195c5365398bc9501b3e6b0feee3e5c67385537f4", + inferenceURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.2.0-GA/LocalLMLabSDKInference-2.2.0-GA.xcframework.zip", + inferenceChecksum: "afd427fb741a820f55bc0a384850ae6404608f5ad73d185a583a89e8f0d61a61" + ), ] func failManifest(_ message: String) -> Never { diff --git a/examples/repo-qa/Package.swift b/examples/repo-qa/Package.swift index eb3599b..8773332 100644 --- a/examples/repo-qa/Package.swift +++ b/examples/repo-qa/Package.swift @@ -23,17 +23,17 @@ struct SDKRelease { // `swift build` / CI, NOT inside Xcode), or edit `defaultSDKVersion` here. For a // release not listed, add its entry (URL + the `.sha256` next to the zip on the // GitHub release) or just replace the strings in place. -let defaultSDKVersion = "2.1.0-GA" +let defaultSDKVersion = "2.2.0-GA" let knownSDKReleases: [String: SDKRelease] = [ - "2.0.0-GA": SDKRelease( - url: "https://github.com/ancientcomputing/locallm/releases/download/v2.0.0-GA/LocalLMLabSDKCore-2.0.0-GA.xcframework.zip", - checksum: "5f9418a6879b22227afdf867cf474d426b93ae36d783d5a958efaae1e347681b" - ), "2.1.0-GA": SDKRelease( url: "https://github.com/ancientcomputing/locallm/releases/download/v2.1.0-GA/LocalLMLabSDKCore-2.1.0-GA.xcframework.zip", checksum: "8d541e06f81d1586c959d6159a259c759853c88b2c68385ab28de493af6c5776" ), + "2.2.0-GA": SDKRelease( + url: "https://github.com/ancientcomputing/locallm/releases/download/v2.2.0-GA/LocalLMLabSDKCore-2.2.0-GA.xcframework.zip", + checksum: "5efc40cae9f8a1bf53bfe03195c5365398bc9501b3e6b0feee3e5c67385537f4" + ), ] func failManifest(_ message: String) -> Never { diff --git a/examples/security-demo/Package.swift b/examples/security-demo/Package.swift index 0ca717b..56d949e 100644 --- a/examples/security-demo/Package.swift +++ b/examples/security-demo/Package.swift @@ -29,17 +29,17 @@ struct SDKRelease { // `swift build` / CI, NOT inside Xcode), or edit `defaultSDKVersion` here. For a // release not listed, add its entry (URL + the `.sha256` next to the zip on the // GitHub release) or just replace the strings in place. -let defaultSDKVersion = "2.1.0-GA" +let defaultSDKVersion = "2.2.0-GA" let knownSDKReleases: [String: SDKRelease] = [ - "2.0.0-GA": SDKRelease( - remoteURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.0.0-GA/LocalLMLabSDKRemote-2.0.0-GA.xcframework.zip", - remoteChecksum: "1e809cff19a7d232cd82fd36eb3ba7d79a93b55f71b6694041c9d9e3f6261be9" - ), "2.1.0-GA": SDKRelease( remoteURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.1.0-GA/LocalLMLabSDKRemote-2.1.0-GA.xcframework.zip", remoteChecksum: "347257172a6da7104b7081602e9dbfc853ed5d038b5e30831aad8dfa2753ae92" ), + "2.2.0-GA": SDKRelease( + remoteURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.2.0-GA/LocalLMLabSDKRemote-2.2.0-GA.xcframework.zip", + remoteChecksum: "1c9af025c700bc0c41c80387c1d6a59ba2f2ab6203eb8ffd8548d61c6ac1fe38" + ), ] func failManifest(_ message: String) -> Never { diff --git a/examples/vistanova/Package.swift b/examples/vistanova/Package.swift index a1680f9..2caaba2 100644 --- a/examples/vistanova/Package.swift +++ b/examples/vistanova/Package.swift @@ -24,21 +24,21 @@ struct SDKRelease { // strings in place. Needs a release that includes `MLXModelProvider(pinnedRevisions:)` and // `cancelDownload(_:)`: the checksums below are the 1.0.0-RC.1 binaries as re-published on // 2026-09-19. An RC.1 pulled earlier fails the checksum check — re-resolve packages. -let defaultSDKVersion = "2.1.0-GA" +let defaultSDKVersion = "2.2.0-GA" let knownSDKReleases: [String: SDKRelease] = [ - "2.0.0-GA": SDKRelease( - coreURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.0.0-GA/LocalLMLabSDKCore-2.0.0-GA.xcframework.zip", - coreChecksum: "5f9418a6879b22227afdf867cf474d426b93ae36d783d5a958efaae1e347681b", - inferenceURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.0.0-GA/LocalLMLabSDKInference-2.0.0-GA.xcframework.zip", - inferenceChecksum: "d2ed4a02686aceab0edf4231ede55c924ea3ab273c7c5cab0bb02f4bda40a185" - ), "2.1.0-GA": SDKRelease( coreURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.1.0-GA/LocalLMLabSDKCore-2.1.0-GA.xcframework.zip", coreChecksum: "8d541e06f81d1586c959d6159a259c759853c88b2c68385ab28de493af6c5776", inferenceURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.1.0-GA/LocalLMLabSDKInference-2.1.0-GA.xcframework.zip", inferenceChecksum: "77d3d1a1bae9df6de5955dfa945242c177cb129b4896c95befb81db6c923656f" ), + "2.2.0-GA": SDKRelease( + coreURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.2.0-GA/LocalLMLabSDKCore-2.2.0-GA.xcframework.zip", + coreChecksum: "5efc40cae9f8a1bf53bfe03195c5365398bc9501b3e6b0feee3e5c67385537f4", + inferenceURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.2.0-GA/LocalLMLabSDKInference-2.2.0-GA.xcframework.zip", + inferenceChecksum: "afd427fb741a820f55bc0a384850ae6404608f5ad73d185a583a89e8f0d61a61" + ), ] func failManifest(_ message: String) -> Never { diff --git a/examples/workspace-buddy-local/Package.swift b/examples/workspace-buddy-local/Package.swift index 089dd60..d1a9a7f 100644 --- a/examples/workspace-buddy-local/Package.swift +++ b/examples/workspace-buddy-local/Package.swift @@ -28,21 +28,21 @@ struct SDKRelease { // `swift build` / CI, NOT inside Xcode), or edit `defaultSDKVersion` here. For a // release not listed, add its entry (URL + the `.sha256` next to the zip on the // GitHub release) or just replace the strings in place. -let defaultSDKVersion = "2.1.0-GA" +let defaultSDKVersion = "2.2.0-GA" let knownSDKReleases: [String: SDKRelease] = [ - "2.0.0-GA": SDKRelease( - coreURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.0.0-GA/LocalLMLabSDKCore-2.0.0-GA.xcframework.zip", - coreChecksum: "5f9418a6879b22227afdf867cf474d426b93ae36d783d5a958efaae1e347681b", - inferenceURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.0.0-GA/LocalLMLabSDKInference-2.0.0-GA.xcframework.zip", - inferenceChecksum: "d2ed4a02686aceab0edf4231ede55c924ea3ab273c7c5cab0bb02f4bda40a185" - ), "2.1.0-GA": SDKRelease( coreURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.1.0-GA/LocalLMLabSDKCore-2.1.0-GA.xcframework.zip", coreChecksum: "8d541e06f81d1586c959d6159a259c759853c88b2c68385ab28de493af6c5776", inferenceURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.1.0-GA/LocalLMLabSDKInference-2.1.0-GA.xcframework.zip", inferenceChecksum: "77d3d1a1bae9df6de5955dfa945242c177cb129b4896c95befb81db6c923656f" ), + "2.2.0-GA": SDKRelease( + coreURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.2.0-GA/LocalLMLabSDKCore-2.2.0-GA.xcframework.zip", + coreChecksum: "5efc40cae9f8a1bf53bfe03195c5365398bc9501b3e6b0feee3e5c67385537f4", + inferenceURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.2.0-GA/LocalLMLabSDKInference-2.2.0-GA.xcframework.zip", + inferenceChecksum: "afd427fb741a820f55bc0a384850ae6404608f5ad73d185a583a89e8f0d61a61" + ), ] func failManifest(_ message: String) -> Never { diff --git a/examples/workspace-buddy/Package.swift b/examples/workspace-buddy/Package.swift index b470aea..2c867b2 100644 --- a/examples/workspace-buddy/Package.swift +++ b/examples/workspace-buddy/Package.swift @@ -21,17 +21,17 @@ struct SDKRelease { // `swift build` / CI, NOT inside Xcode), or edit `defaultSDKVersion` here. For a // release not listed, add its entry (URL + the `.sha256` next to the zip on the // GitHub release) or just replace the strings in place. -let defaultSDKVersion = "2.1.0-GA" +let defaultSDKVersion = "2.2.0-GA" let knownSDKReleases: [String: SDKRelease] = [ - "2.0.0-GA": SDKRelease( - url: "https://github.com/ancientcomputing/locallm/releases/download/v2.0.0-GA/LocalLMLabSDKCore-2.0.0-GA.xcframework.zip", - checksum: "5f9418a6879b22227afdf867cf474d426b93ae36d783d5a958efaae1e347681b" - ), "2.1.0-GA": SDKRelease( url: "https://github.com/ancientcomputing/locallm/releases/download/v2.1.0-GA/LocalLMLabSDKCore-2.1.0-GA.xcframework.zip", checksum: "8d541e06f81d1586c959d6159a259c759853c88b2c68385ab28de493af6c5776" ), + "2.2.0-GA": SDKRelease( + url: "https://github.com/ancientcomputing/locallm/releases/download/v2.2.0-GA/LocalLMLabSDKCore-2.2.0-GA.xcframework.zip", + checksum: "5efc40cae9f8a1bf53bfe03195c5365398bc9501b3e6b0feee3e5c67385537f4" + ), ] func failManifest(_ message: String) -> Never { diff --git a/toolkit/README.md b/toolkit/README.md index a66b912..e7e3696 100644 --- a/toolkit/README.md +++ b/toolkit/README.md @@ -14,26 +14,26 @@ and [../examples/localai-cli-swift/](../examples/localai-cli-swift/) (Swift). Starting with `1.0.0-beta.4`, the toolkit is shipped as release assets on -**[github.com/ancientcomputing/locallm-releases](https://github.com/ancientcomputing/locallm-releases/releases)**, +**[github.com/ancientcomputing/locallm](https://github.com/ancientcomputing/locallm/releases)**, alongside the LocalLM Lab app DMG and the SDK xcframeworks. -Latest (`2.0.0-GA`): +Latest (`2.2.0-GA`): ```bash -curl -LO https://github.com/ancientcomputing/locallm/releases/download/v2.0.0-GA/localai-toolkit-2.0.0-GA-arm64.zip -curl -LO https://github.com/ancientcomputing/locallm/releases/download/v2.0.0-GA/localai-toolkit-2.0.0-GA-arm64.zip.sha256 +curl -LO https://github.com/ancientcomputing/locallm/releases/download/v2.2.0-GA/localai-toolkit-2.2.0-GA-arm64.zip +curl -LO https://github.com/ancientcomputing/locallm/releases/download/v2.2.0-GA/localai-toolkit-2.2.0-GA-arm64.zip.sha256 ``` ## Verify ```bash -shasum -a 256 -c localai-toolkit-2.0.0-GA-arm64.zip.sha256 +shasum -a 256 -c localai-toolkit-2.2.0-GA-arm64.zip.sha256 ``` ## Install ```bash -unzip localai-toolkit-2.0.0-GA-arm64.zip +unzip localai-toolkit-2.2.0-GA-arm64.zip ``` This produces `localai-cli`, `localai-playground-run` (macOS 27),