diff --git a/CHANGELOG.md b/CHANGELOG.md index 7bb8e27..75cf93a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,82 @@ 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.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). + +### Fixed + +- **An app embedding `LocalLMLabSDKInference` was rejected by App Store Connect** (error 90277: not a + valid bundle identifier). The framework's bundle ID was `mlx-swift_Cmlx`, and bundle IDs can't contain + underscores. It is now `lab.locallm.sdk.inference`, like Core's `lab.locallm.sdk.core`. MLX still finds + its Metal library: it loads `Resources/default.metallib` next to the framework's own binary, in a + `swift build` executable and in an app Xcode embeds it in alike. An app that copied + `mlx-swift_Cmlx.bundle` into its own Resources to work around this can stop doing so. +- **Downloading a model whose Hugging Face repo has a subfolder failed** within seconds with + "Could not fetch metadata for 'optiq'": the downloader treated the folder itself as a file. This hit + every mlx-community OptiQ conversion (e.g. `gemma-4-12B-it-OptiQ-4bit`). Folders are now skipped and + the files inside them are downloaded, so the snapshot matches the repo. +- **More MLX models can use tools.** Before each render, the SDK now fits the conversation to what + the model's chat template can actually show. It decides from the template and the vocabulary, not + from the model's name. + - **GLM-4-0414** (`GLM-4-9B-0414`, `GLM-4-32B-0414`) never saw a tool's result. Its template shows + results only under the `observation` role. The model kept repeating the same call (`echo` 3–4 + times, `hub_repo_details` 4–5 times) and then answered without the result. Results now reach it, + and it answers from them. + - **Llama 3.1** failed a turn that made more than one tool call, with `Jinja.TemplateException`. + Its template allows only one call per assistant message. Such a turn is now replayed one call at a + time, each followed by its result. Llama 3.2 had the same problem. + - **Mistral-Small-3.2-24B-Instruct-2506** (mlx-community 4-bit and 8-bit) never called a tool. Its + conversions ship no chat template that renders tools, so when tools are requested the SDK now + uses a built-in one in Mistral's own format. The 4-bit passes all four of our tool tests; the + 8-bit passes three and partly answers the fourth. + - When a model ships two chat templates and tools are requested, the one that renders tools is + used. Before, `chat_template.jinja` always won, even when only `tokenizer_config.json`'s template + supported tools. +- **Adding a model could hang in its capability check.** `MLXModelProvider.capabilityProbe` now caps + each check's output length and stops any check that runs over 3 minutes. A check that times out is + listed in the report's `notes` and doesn't set `blocked`, so the model still gets added. Before, + adding `Mistral-Small-3.2-24B-Instruct-2506-8bit` was still generating after 30 minutes. + +### Changed + +- **`LocalLMLabSDKInference`'s MLX runtime moves to current `mlx-swift-lm`.** The pin goes from + `45693f6` (2026-07-27) to `30d755c`: upstream `8ec6a2c` (2026-10-15) plus one fix of ours, below. + `mlx-swift` goes from 0.31.6 to 0.32.3. It's still served from our mirror fork, + `ancientcomputing/mlx-swift-lm`. The update fixes several tool-call problems: + - **Gemma 4** keeps array and object arguments intact. Before, a call such as `hub_repo_details` + with a `repo_ids` list reached the tool garbled with `<|"|>` tokens. + - **gpt-oss** tool calls work. The runtime now parses OpenAI's Harmony format; before, the call + came back as raw text. + - **Muse Glimmer** (`muse_glimmer`, with its ATEM tool-call format) loads and calls tools. Checked + with `mlx-community/Muse-Glimmer-30B-4bit`. + - **Older Mistral checkpoints** (`model_type` `mistral`) now get Mistral's tool-call parser, chosen + from their chat template. Mistral 7B v0.3 still can't call tools: it writes the older + `[TOOL_CALLS] [{…}]` list form, and the parser rejects it. + - **Qwen3 calls that open a `` block run.** Qwen3 sometimes opens `` and goes straight + to the call without closing the block. Upstream treats everything in a reasoning block as inert, + so the call came back as text and never ran. A `` block whose first content is a tool call + and that never closes now dispatches the call. A call after any reasoning text, or inside a closed + block, stays inert. +- **A malformed tool call now fails the turn instead of showing up as text.** This covers an + unparseable payload, a call to a tool the session doesn't declare, and arguments that break the + tool's schema. The error is `LocalLMLabError.generation(underlying:)`, and its message names the reason (for + example `malformed_syntax`). The raw model output is never included. Before, the raw call markup came back as the model's answer, and nothing ran. + Generation finishes before the error is thrown, so nothing keeps running on the GPU after the turn + fails (a command-line tool that exited on the error could otherwise crash). + +### Checksums (SHA-256) + +``` +LocalLMLabSDKCore-2.1.0-GA.xcframework.zip 8d541e06f81d1586c959d6159a259c759853c88b2c68385ab28de493af6c5776 +LocalLMLabSDKClaude-2.1.0-GA.xcframework.zip f54472c25063f7c6d6d5a49a91992beb1300d9b6d986ee83d41e682ac2a2c172 +LocalLMLabSDKInference-2.1.0-GA.xcframework.zip 77d3d1a1bae9df6de5955dfa945242c177cb129b4896c95befb81db6c923656f +LocalLMLabSDKRemote-2.1.0-GA.xcframework.zip 347257172a6da7104b7081602e9dbfc853ed5d038b5e30831aad8dfa2753ae92 +``` + +--- + ## 2.0.0 — GA — 2026-10-07 (binaries re-published 2026-10-08 and 2026-10-09) **A one-time breaking release.** From `2.0.0`, every 2.x release is source compatible with it diff --git a/Components/Package.swift b/Components/Package.swift index 3c55ec4..d1b81e4 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.0.0-GA" +let defaultSDKVersion = "2.1.0-GA" let knownSDKReleases: [String: SDKRelease] = [ - "1.0.0-GA": SDKRelease( - url: "https://github.com/ancientcomputing/locallm/releases/download/v1.0.0-GA/LocalLMLabSDKCore-1.0.0-GA.xcframework.zip", - checksum: "7d77a9c2e37dfb2f7925f01ed011262ee5a2aebc561a3ae7a93524acc0285b3e" - ), "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" + ), ] func failManifest(_ message: String) -> Never { diff --git a/README.md b/README.md index a66fa6c..c5b7d87 100644 --- a/README.md +++ b/README.md @@ -30,12 +30,13 @@ It's a single Dock app with five panels: It began local-only — hence the name — and 1.0 added the hosted providers behind the same interface, so "local" is now the default rather than the only option. On macOS 26 only Apple's on-device model runs; open-weight (MLX) models and the -hosted providers need macOS 27. **Private Cloud Compute** works too: an app that -uses it needs Apple's Private Cloud Compute entitlement. +hosted providers need macOS 27. **Private Cloud Compute** will be in the Mac App +Store version: it needs Apple's Private Cloud Compute entitlement, which the DMG +doesn't carry. **Product page:** [thisbrain.ai/locallm](https://thisbrain.ai/locallm) — or get the app directly: -[LocalLM Lab 2.0.0-GA (arm64 DMG)](https://github.com/ancientcomputing/locallm/releases/download/v2.0.0-GA/LocalLM.Lab-2.0.0-GA-arm64.dmg). +[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 SDK diff --git a/docs/api-surface.md b/docs/api-surface.md index cf9bbb4..80ce1fc 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.0.0"` (the published `v2.0.0-GA` xcframeworks, re-published 2026-10-09) · generated 2026-10-09T14:46Z +> SDK version: `"2.1.0"` (the published `v2.1.0-GA` xcframeworks, re-published 2026-10-17 from 8e5d287) · generated 2026-10-17T13:38Z ## LocalLMLabSDKCore diff --git a/docs/sdk-guide.md b/docs/sdk-guide.md index c87c466..c58c0e3 100644 --- a/docs/sdk-guide.md +++ b/docs/sdk-guide.md @@ -9,8 +9,8 @@ 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.0.0`, 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) +**Status note**: this guide describes the API as of `2.1.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 approval ([§7c](#7c-tool-authorization-two-levers--which-tools-and-whether-they-ask-first)), MCP @@ -1096,7 +1096,7 @@ relaunch. | Provider | Ships in | `scheme` | macOS | For | |---|---|---|---|---| | `SystemModelProvider` | Core | `system` | 26+ | Apple's on-device model — always there on an Apple-Intelligence Mac | -| `PCCModelProvider` | Core | `pcc` | 27 | Apple's Private Cloud Compute model (Apple's own models, not your weights). Needs the PCC entitlement + App Store Small Business Program — there is no paid tier. Since `1.0.0-beta.3` the provider maps availability, quota, and typed errors cleanly, and adds `probe(timeout:)` — an async liveness check (`availability(for:)` alone can say `.available` while turns still throw on a build without the entitlement). | +| `PCCModelProvider` | Core | `pcc` | 27 | Apple's Private Cloud Compute model (Apple's own models, not your weights). Needs Apple's managed PCC entitlement, which works only in your app's main executable, signed with a provisioning profile that grants it ([§10e](#10e-shipping-the-model-layer-through-app-store-connect)) — there is no paid tier. Since `1.0.0-beta.3` the provider maps availability, quota, and typed errors cleanly, and adds `probe(timeout:)` — an async liveness check (`availability(for:)` can say `.available` while turns still fail). Neither is a way to find out whether you have the entitlement: without it FoundationModels traps on the first PCC call, these included, so check your own entitlement first (§10e). | | `ClaudeModelProvider(auth:)` | **`LocalLMLabSDKClaude`** | `claude` | 27 | Claude, via a host-supplied API key or App Attest client id — the SDK stores neither | | `MLXModelProvider` | **Inference** | `mlx` | 27 | Locally-run open-weight models (Qwen, Llama, …) via MLX | | `try RemoteModelProvider(_:)` | **Remote** | *host-chosen* — set in `RemoteProviderConfig.scheme`, one instance per provider you configure | 27 | Hosted APIs — OpenAI, Anthropic's Messages API, OpenRouter, any OpenAI-compatible server. The one provider here that's data-driven rather than a fixed named type; details in [§6b](#6b-online-providers--gpt-claude-online-openrouter-locallmlabsdkremote) | @@ -1190,6 +1190,19 @@ mlx.storageUsed // total bytes of weights try mlx.remove(id) // delete weights ``` +**Tool calls on a local model.** The MLX runtime parses the model's tool-call markup into calls to +your tools. Since 2.1, a call it can't accept fails the turn instead of reaching the user: an +unparseable payload, a tool the session doesn't declare, or arguments that break the tool's schema +throw `LocalLMLabError.generation(underlying:)`, whose message names the reason (for example +`malformed_syntax`) and never includes the raw model output. Before 2.1 the call markup came back as +the model's answer and nothing ran, so if you showed that text, or retried on it, catch the error +instead; running the turn again is often enough for a small model. A call written inside the model's +reasoning (`…`) stays inert, since a model rehearsing a call hasn't decided to make +it. The exception is a `` block that opens directly on the call and never closes, which +Qwen3 sometimes writes: that call runs. 2.1's runtime also fixes Gemma 4's array and object +arguments and adds gpt-oss (Harmony) and Muse Glimmer tool calls; the +[CHANGELOG](../CHANGELOG.md) has the details. + **Where the weights land** — a standard Hugging Face cache (`models----/snapshots//`, deduped `blobs/` underneath): @@ -2744,8 +2757,10 @@ The following are deliberate boundaries, not gaps waiting on a future release: > [§10d](#10d-one-time-apple-developer-portal-setup-for-mas-signing) below for which is which. Core has been tested under App Sandbox — confirmed via a real sandboxed, Developer-ID-signed, -notarized build (not just code review), not through the actual MAS submission pipeline itself yet. -Here's exactly what's needed and what was actually verified. +notarized build (not just code review). Since 2.1 two apps built on the SDK, LocalLM Lab (with +Private Cloud Compute and local MLX models) and JevDK, have also gone through App Store Connect's +upload validation into TestFlight; [§10e](#10e-shipping-the-model-layer-through-app-store-connect) +has what that turned up. Here's exactly what's needed and what was actually verified. > **Related, for model downloads:** the sandbox is one half of the security story for an app that > fetches models at runtime. The other half is what it fetches: the trust policy, preflight, hash @@ -2843,7 +2858,8 @@ submission of your own app needs your own bundle ID from the start. - Leave every Capability unchecked unless something you're using genuinely needs an App ID-level capability (iCloud, Push Notifications, etc.) — App Sandbox, network client, and the Calendar/Reminders/Contacts/Location entitlements are all declared directly in the entitlements - file (10a), not toggled here. + file (10a), not toggled here. The exception is Private Cloud Compute: once Apple grants it to + your account, turn it on here ([§10e](#10e-shipping-the-model-layer-through-app-store-connect)). **3. A Mac App Store distribution provisioning profile**, tying the App ID to the certificate. @@ -2870,6 +2886,57 @@ Apple-Distribution-signed, sandboxed `.pkg` build this setup enables — Develop notarization is the other supported path (`build-and-sign.sh`), for distributing outside the Mac App Store. +### 10e. Shipping the model layer through App Store Connect + +What uploading LocalLM Lab and JevDK to App Store Connect turned up. None of it needed an SDK API +change. + +**Embedding `LocalLMLabSDKInference` (local MLX models).** Use SDK 2.1 or later. In 2.0 the +framework's bundle ID was `mlx-swift_Cmlx`, and App Store Connect rejects an app containing a bundle +ID with an underscore (error 90277: not a valid bundle identifier). Since 2.1 it is +`lab.locallm.sdk.inference`, and the xcframework embeds as is: no renaming, and no copying +`mlx-swift_Cmlx.bundle` into your app's Resources. If you did that for 2.0, remove it when you +upgrade: the copy and the framework's own copy share the bundle ID `mlx-swift.Cmlx.resources`, and a +duplicate bundle ID can fail validation too (90685). MLX loads its Metal library from the framework's +own `Versions/A/Resources/default.metallib`, so don't strip the framework's Resources. Before an +upload, check that every bundle ID in the app is only letters, digits, hyphens and dots: + +```bash +find "MyApp.app" -name Info.plist -exec /usr/libexec/PlistBuddy -c 'Print :CFBundleIdentifier' {} \; 2>/dev/null \ + | grep -vE '^[A-Za-z0-9.-]+$' || echo "all bundle IDs valid" +``` + +**Private Cloud Compute.** `com.apple.developer.private-cloud-compute` is a managed capability: + +- Apple grants it to your developer account ("Access to models on Private Cloud Compute"). Then turn + it on for your App ID ([§10d](#10d-one-time-apple-developer-portal-setup-for-mas-signing)) and + regenerate your provisioning profiles. +- Sign the entitlement only when the embedded profile grants it. An entitlement the profile doesn't + cover stops the app from launching. +- Run PCC in the profile-covered executable: your app's main executable. A helper tool your app + launches has no App ID or profile of its own, so the entitlement can't work there, and a sandboxed + helper signed with `com.apple.security.inherit` may carry no other entitlement. Register + `PCCModelProvider` in the app's own `LocalLMLab`, not in a spawned process. +- Check the entitlement before touching PCC. Without it FoundationModels traps on the first PCC call, + `availability(for:)` and `probe(timeout:)` included, so read the running process's own entitlement + first and register the provider only when it's there: + +```swift +import Security + +let pccEntitled: Bool = { + guard let task = SecTaskCreateFromSelf(nil), + let value = SecTaskCopyValueForEntitlement( + task, "com.apple.developer.private-cloud-compute" as CFString, nil) else { return false } + return (value as? Bool) ?? true +}() +if pccEntitled { providers.append(PCCModelProvider()) } +``` + +LocalLM Lab's own Developer ID build (the DMG) doesn't carry the PCC entitlement, so it has no PCC; +its Mac App Store build does. Whether a Developer ID provisioning profile can grant it hasn't been +tested. + ## 11. Components: prebuilt SwiftUI (MCP servers + the model layer) > **Reach for this when** you want a working settings surface — for **MCP servers** (add / diff --git a/docs/tested-models.md b/docs/tested-models.md index 067e335..1c57521 100644 --- a/docs/tested-models.md +++ b/docs/tested-models.md @@ -1,5 +1,10 @@ # Tested open-weight (MLX) models +> **Current list:** the maintained list of MLX models — newer Qwen, Gemma, Mistral, Granite and +> other families, sized for a 24 GB MacBook Air and a 64 GB Mac Studio, with a test queue — is +> [thisbrain.ai/locallm/mlx-models.html](https://thisbrain.ai/locallm/mlx-models.html). This page +> stays as the SDK-side record (tool-calling run, deciders, capacity notes). + > **Point-in-time, not maintained.** This is a snapshot of what we saw on our hardware, > our SDK build, and one specific tool-calling prompt, as of **2026-08-27** (SDK > `1.0.0-beta`, requires macOS 27). Model conversions, chat templates, and the MLX stack all diff --git a/examples/README.md b/examples/README.md index fa7c80f..bb5547a 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.0.0-GA` branch build against SDK **`2.0.0-GA`**; the ones on `main` +The examples on this `2.1.0-GA` branch build against SDK **`2.1.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=1.0.0-GA \ +LOCALLM_SDK_VERSION=2.0.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.0.0-GA" +let defaultSDKVersion = "2.1.0-GA" let knownSDKReleases: [String: SDKRelease] = [ - "1.0.0-GA": SDKRelease(url: "…/v1.0.0-GA/LocalLMLabSDKCore-1.0.0-GA.xcframework.zip", - checksum: "7d77a9c2…"), "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…"), ] ``` @@ -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.0.0-GA/LocalLMLabSDKCore-2.0.0-GA.xcframework.zip.sha256 -# → 5f9418a6879b22227afdf867cf474d426b93ae36d783d5a958efaae1e347681b -curl -sL https://github.com/ancientcomputing/locallm/releases/download/v2.0.0-GA/LocalLMLabSDKClaude-2.0.0-GA.xcframework.zip.sha256 -# → f235480fd4842e91c0c17b416eb4048b7abe6b3c2d41f332984c5e7af368092e +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 ``` Then point `defaultSDKVersion` at it (works everywhere, Xcode included) or pass diff --git a/examples/aiql/Package.swift b/examples/aiql/Package.swift index 2940a5b..500ea2d 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.0.0-GA" +let defaultSDKVersion = "2.1.0-GA" let knownSDKReleases: [String: SDKRelease] = [ - "1.0.0-GA": SDKRelease( - coreURL: "https://github.com/ancientcomputing/locallm/releases/download/v1.0.0-GA/LocalLMLabSDKCore-1.0.0-GA.xcframework.zip", - coreChecksum: "7d77a9c2e37dfb2f7925f01ed011262ee5a2aebc561a3ae7a93524acc0285b3e", - inferenceURL: "https://github.com/ancientcomputing/locallm/releases/download/v1.0.0-GA/LocalLMLabSDKInference-1.0.0-GA.xcframework.zip", - inferenceChecksum: "6fcbdd5b04fff709e720b92e8b7eda638014a4d19c0dd925e018b72cb7109430" - ), "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" + ), ] func failManifest(_ message: String) -> Never { diff --git a/examples/aiql/README.md b/examples/aiql/README.md index 764bf30..b3ae6e8 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.0.0-GA` with no further +or add it to your `~/.zshrc`). `Package.swift` builds against SDK `2.1.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 b0eb6e3..8a6fef5 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.0.0-GA" +let defaultSDKVersion = "2.1.0-GA" let knownSDKReleases: [String: SDKRelease] = [ - "1.0.0-GA": SDKRelease( - coreURL: "https://github.com/ancientcomputing/locallm/releases/download/v1.0.0-GA/LocalLMLabSDKCore-1.0.0-GA.xcframework.zip", - coreChecksum: "7d77a9c2e37dfb2f7925f01ed011262ee5a2aebc561a3ae7a93524acc0285b3e", - inferenceURL: "https://github.com/ancientcomputing/locallm/releases/download/v1.0.0-GA/LocalLMLabSDKInference-1.0.0-GA.xcframework.zip", - inferenceChecksum: "6fcbdd5b04fff709e720b92e8b7eda638014a4d19c0dd925e018b72cb7109430" - ), "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" + ), ] func failManifest(_ message: String) -> Never { diff --git a/examples/components-updates-demo/README.md b/examples/components-updates-demo/README.md index b44035a..acc6466 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.0.0-GA`. Nothing to download by hand — `Package.swift` depends on the sibling +This branch tracks `2.1.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.0.0-GA` by default. Set `LOCALLM_SDK_VERSION` in a shell (not Xcode) to pin another published +against `2.1.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 a0db85a..b625aaf 100644 --- a/examples/jevdk/Package.swift +++ b/examples/jevdk/Package.swift @@ -33,7 +33,7 @@ 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.0.0-GA" +let defaultSDKVersion = "2.1.0-GA" let knownSDKReleases: [String: SDKRelease] = [ "2.0.0-GA": SDKRelease( @@ -44,6 +44,14 @@ let knownSDKReleases: [String: 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( + coreURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.1.0-GA/LocalLMLabSDKCore-2.1.0-GA.xcframework.zip", + coreChecksum: "8d541e06f81d1586c959d6159a259c759853c88b2c68385ab28de493af6c5776", + remoteURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.1.0-GA/LocalLMLabSDKRemote-2.1.0-GA.xcframework.zip", + remoteChecksum: "347257172a6da7104b7081602e9dbfc853ed5d038b5e30831aad8dfa2753ae92", + inferenceURL: "https://github.com/ancientcomputing/locallm/releases/download/v2.1.0-GA/LocalLMLabSDKInference-2.1.0-GA.xcframework.zip", + inferenceChecksum: "77d3d1a1bae9df6de5955dfa945242c177cb129b4896c95befb81db6c923656f" + ), ] func failManifest(_ message: String) -> Never { diff --git a/examples/jevdk/README.md b/examples/jevdk/README.md index e27a5b1..7aea4c5 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.0.0-GA` with no further setup (the decision API is new in 2.0): `LocalLMLabSDKCore`, +`2.1.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 51c02fc..746513c 100644 --- a/examples/mcp-chat/Package.swift +++ b/examples/mcp-chat/Package.swift @@ -31,13 +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.0.0-GA" +let defaultSDKVersion = "2.1.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" + ), ] func failManifest(_ message: String) -> Never { diff --git a/examples/mcp-chat/README.md b/examples/mcp-chat/README.md index 7afd185..0662a59 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.0.0-GA` with no further setup (MCP Apps support is new in +`Package.swift` builds against SDK `2.1.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 8149257..6e3248f 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.0.0-GA" +let defaultSDKVersion = "2.1.0-GA" let knownSDKReleases: [String: SDKRelease] = [ - "1.0.0-GA": SDKRelease( - coreURL: "https://github.com/ancientcomputing/locallm/releases/download/v1.0.0-GA/LocalLMLabSDKCore-1.0.0-GA.xcframework.zip", - coreChecksum: "7d77a9c2e37dfb2f7925f01ed011262ee5a2aebc561a3ae7a93524acc0285b3e", - inferenceURL: "https://github.com/ancientcomputing/locallm/releases/download/v1.0.0-GA/LocalLMLabSDKInference-1.0.0-GA.xcframework.zip", - inferenceChecksum: "6fcbdd5b04fff709e720b92e8b7eda638014a4d19c0dd925e018b72cb7109430" - ), "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" + ), ] func failManifest(_ message: String) -> Never { diff --git a/examples/model-switch/Package.swift b/examples/model-switch/Package.swift index 6badf07..a26521c 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.0.0-GA" +let defaultSDKVersion = "2.1.0-GA" let knownSDKReleases: [String: SDKRelease] = [ - "1.0.0-GA": SDKRelease( - remoteURL: "https://github.com/ancientcomputing/locallm/releases/download/v1.0.0-GA/LocalLMLabSDKRemote-1.0.0-GA.xcframework.zip", - remoteChecksum: "294a00eb41a22265849de171930c209d48c27c64c157bc565f76a5e0c13bdb88" - ), "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" + ), ] func failManifest(_ message: String) -> Never { diff --git a/examples/os-matrix/Package.swift b/examples/os-matrix/Package.swift index 2d2ff5e..077d6f2 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.0.0-GA" +let defaultSDKVersion = "2.1.0-GA" let knownSDKReleases: [String: SDKRelease] = [ - "1.0.0-GA": SDKRelease( - coreURL: "https://github.com/ancientcomputing/locallm/releases/download/v1.0.0-GA/LocalLMLabSDKCore-1.0.0-GA.xcframework.zip", - coreChecksum: "7d77a9c2e37dfb2f7925f01ed011262ee5a2aebc561a3ae7a93524acc0285b3e", - inferenceURL: "https://github.com/ancientcomputing/locallm/releases/download/v1.0.0-GA/LocalLMLabSDKInference-1.0.0-GA.xcframework.zip", - inferenceChecksum: "6fcbdd5b04fff709e720b92e8b7eda638014a4d19c0dd925e018b72cb7109430" - ), "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" + ), ] func failManifest(_ message: String) -> Never { diff --git a/examples/plate-today-tools/Package.swift b/examples/plate-today-tools/Package.swift index 2e034e0..834a483 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.0.0-GA" +let defaultSDKVersion = "2.1.0-GA" let knownSDKReleases: [String: SDKRelease] = [ - "1.0.0-GA": SDKRelease( - url: "https://github.com/ancientcomputing/locallm/releases/download/v1.0.0-GA/LocalLMLabSDKCore-1.0.0-GA.xcframework.zip", - checksum: "7d77a9c2e37dfb2f7925f01ed011262ee5a2aebc561a3ae7a93524acc0285b3e" - ), "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" + ), ] func failManifest(_ message: String) -> Never { diff --git a/examples/plate-today/Package.swift b/examples/plate-today/Package.swift index aac2cdd..a6efba8 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.0.0-GA" +let defaultSDKVersion = "2.1.0-GA" let knownSDKReleases: [String: SDKRelease] = [ - "1.0.0-GA": SDKRelease( - url: "https://github.com/ancientcomputing/locallm/releases/download/v1.0.0-GA/LocalLMLabSDKCore-1.0.0-GA.xcframework.zip", - checksum: "7d77a9c2e37dfb2f7925f01ed011262ee5a2aebc561a3ae7a93524acc0285b3e" - ), "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" + ), ] func failManifest(_ message: String) -> Never { diff --git a/examples/repo-qa-local/Package.swift b/examples/repo-qa-local/Package.swift index 0e159ff..d941ab3 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.0.0-GA" +let defaultSDKVersion = "2.1.0-GA" let knownSDKReleases: [String: SDKRelease] = [ - "1.0.0-GA": SDKRelease( - coreURL: "https://github.com/ancientcomputing/locallm/releases/download/v1.0.0-GA/LocalLMLabSDKCore-1.0.0-GA.xcframework.zip", - coreChecksum: "7d77a9c2e37dfb2f7925f01ed011262ee5a2aebc561a3ae7a93524acc0285b3e", - inferenceURL: "https://github.com/ancientcomputing/locallm/releases/download/v1.0.0-GA/LocalLMLabSDKInference-1.0.0-GA.xcframework.zip", - inferenceChecksum: "6fcbdd5b04fff709e720b92e8b7eda638014a4d19c0dd925e018b72cb7109430" - ), "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" + ), ] func failManifest(_ message: String) -> Never { diff --git a/examples/repo-qa/Package.swift b/examples/repo-qa/Package.swift index 770add5..eb3599b 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.0.0-GA" +let defaultSDKVersion = "2.1.0-GA" let knownSDKReleases: [String: SDKRelease] = [ - "1.0.0-GA": SDKRelease( - url: "https://github.com/ancientcomputing/locallm/releases/download/v1.0.0-GA/LocalLMLabSDKCore-1.0.0-GA.xcframework.zip", - checksum: "7d77a9c2e37dfb2f7925f01ed011262ee5a2aebc561a3ae7a93524acc0285b3e" - ), "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" + ), ] func failManifest(_ message: String) -> Never { diff --git a/examples/security-demo/Package.swift b/examples/security-demo/Package.swift index 4fabfdc..0ca717b 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.0.0-GA" +let defaultSDKVersion = "2.1.0-GA" let knownSDKReleases: [String: SDKRelease] = [ - "1.0.0-GA": SDKRelease( - remoteURL: "https://github.com/ancientcomputing/locallm/releases/download/v1.0.0-GA/LocalLMLabSDKRemote-1.0.0-GA.xcframework.zip", - remoteChecksum: "294a00eb41a22265849de171930c209d48c27c64c157bc565f76a5e0c13bdb88" - ), "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" + ), ] func failManifest(_ message: String) -> Never { diff --git a/examples/vistanova/Package.swift b/examples/vistanova/Package.swift index ce338d3..a1680f9 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.0.0-GA" +let defaultSDKVersion = "2.1.0-GA" let knownSDKReleases: [String: SDKRelease] = [ - "1.0.0-GA": SDKRelease( - coreURL: "https://github.com/ancientcomputing/locallm/releases/download/v1.0.0-GA/LocalLMLabSDKCore-1.0.0-GA.xcframework.zip", - coreChecksum: "7d77a9c2e37dfb2f7925f01ed011262ee5a2aebc561a3ae7a93524acc0285b3e", - inferenceURL: "https://github.com/ancientcomputing/locallm/releases/download/v1.0.0-GA/LocalLMLabSDKInference-1.0.0-GA.xcframework.zip", - inferenceChecksum: "6fcbdd5b04fff709e720b92e8b7eda638014a4d19c0dd925e018b72cb7109430" - ), "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" + ), ] func failManifest(_ message: String) -> Never { diff --git a/examples/workspace-buddy-local/Package.swift b/examples/workspace-buddy-local/Package.swift index a8b092e..089dd60 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.0.0-GA" +let defaultSDKVersion = "2.1.0-GA" let knownSDKReleases: [String: SDKRelease] = [ - "1.0.0-GA": SDKRelease( - coreURL: "https://github.com/ancientcomputing/locallm/releases/download/v1.0.0-GA/LocalLMLabSDKCore-1.0.0-GA.xcframework.zip", - coreChecksum: "7d77a9c2e37dfb2f7925f01ed011262ee5a2aebc561a3ae7a93524acc0285b3e", - inferenceURL: "https://github.com/ancientcomputing/locallm/releases/download/v1.0.0-GA/LocalLMLabSDKInference-1.0.0-GA.xcframework.zip", - inferenceChecksum: "6fcbdd5b04fff709e720b92e8b7eda638014a4d19c0dd925e018b72cb7109430" - ), "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" + ), ] func failManifest(_ message: String) -> Never { diff --git a/examples/workspace-buddy/Package.swift b/examples/workspace-buddy/Package.swift index 235c799..b470aea 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.0.0-GA" +let defaultSDKVersion = "2.1.0-GA" let knownSDKReleases: [String: SDKRelease] = [ - "1.0.0-GA": SDKRelease( - url: "https://github.com/ancientcomputing/locallm/releases/download/v1.0.0-GA/LocalLMLabSDKCore-1.0.0-GA.xcframework.zip", - checksum: "7d77a9c2e37dfb2f7925f01ed011262ee5a2aebc561a3ae7a93524acc0285b3e" - ), "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" + ), ] func failManifest(_ message: String) -> Never { diff --git a/toolkit/README.md b/toolkit/README.md index 009c88c..a66b912 100644 --- a/toolkit/README.md +++ b/toolkit/README.md @@ -12,11 +12,10 @@ and [../examples/localai-cli-swift/](../examples/localai-cli-swift/) (Swift). ## Download -`1.0.0-beta.4` through `1.0.0-RC.1` shipped the toolkit zip and its checksum as +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)**, -alongside the LocalLM Lab app DMG. From **`1.0.0-GA`** on, both ship as release -assets on this repo instead, alongside the app DMG and the SDK xcframeworks. +alongside the LocalLM Lab app DMG and the SDK xcframeworks. Latest (`2.0.0-GA`): ```bash @@ -24,17 +23,6 @@ curl -LO https://github.com/ancientcomputing/locallm/releases/download/v2.0.0-GA curl -LO https://github.com/ancientcomputing/locallm/releases/download/v2.0.0-GA/localai-toolkit-2.0.0-GA-arm64.zip.sha256 ``` -(For `1.0.0-beta.4` through `1.0.0-RC.1`, replace the repo/tag above with -`locallm-releases`/`` with no leading `v`, e.g. -`.../locallm-releases/releases/download/1.0.0-RC.1/localai-toolkit-1.0.0-RC.1-arm64.zip`.) - -Earlier releases (`0.6`–`1.0.0-beta.3`) stay checked into this folder — grab -them by cloning the repo or downloading a single file raw, e.g.: - -```bash -curl -LO https://raw.githubusercontent.com/ancientcomputing/locallm/1.0.0-beta/toolkit/localai-toolkit-1.0.0-beta.3-arm64.zip -curl -LO https://raw.githubusercontent.com/ancientcomputing/locallm/1.0.0-beta/toolkit/localai-toolkit-1.0.0-beta.3-arm64.zip.sha256 -``` ## Verify diff --git a/toolkit/localai-toolkit-0.6.0-arm64.zip b/toolkit/localai-toolkit-0.6.0-arm64.zip deleted file mode 100644 index 022cac1..0000000 Binary files a/toolkit/localai-toolkit-0.6.0-arm64.zip and /dev/null differ diff --git a/toolkit/localai-toolkit-0.6.0-arm64.zip.sha256 b/toolkit/localai-toolkit-0.6.0-arm64.zip.sha256 deleted file mode 100644 index 6ff67d9..0000000 --- a/toolkit/localai-toolkit-0.6.0-arm64.zip.sha256 +++ /dev/null @@ -1 +0,0 @@ -2ab616f887fd1f175c33c7aba9740c1767a621952b4c1bdd6295d8d7fa3466a8 localai-toolkit-0.6.0-arm64.zip diff --git a/toolkit/localai-toolkit-0.7.0-arm64.zip b/toolkit/localai-toolkit-0.7.0-arm64.zip deleted file mode 100644 index 5652e00..0000000 Binary files a/toolkit/localai-toolkit-0.7.0-arm64.zip and /dev/null differ diff --git a/toolkit/localai-toolkit-0.7.0-arm64.zip.sha256 b/toolkit/localai-toolkit-0.7.0-arm64.zip.sha256 deleted file mode 100644 index 8dc4e07..0000000 --- a/toolkit/localai-toolkit-0.7.0-arm64.zip.sha256 +++ /dev/null @@ -1 +0,0 @@ -ee909307bb6fc5d1630362c861f41a6b62a9c8b0377106e4e61c0e1a2caa882d localai-toolkit-0.7.0-arm64.zip diff --git a/toolkit/localai-toolkit-1.0.0-beta.1-arm64.zip b/toolkit/localai-toolkit-1.0.0-beta.1-arm64.zip deleted file mode 100644 index 2a41fd1..0000000 Binary files a/toolkit/localai-toolkit-1.0.0-beta.1-arm64.zip and /dev/null differ diff --git a/toolkit/localai-toolkit-1.0.0-beta.1-arm64.zip.sha256 b/toolkit/localai-toolkit-1.0.0-beta.1-arm64.zip.sha256 deleted file mode 100644 index 66fe2b3..0000000 --- a/toolkit/localai-toolkit-1.0.0-beta.1-arm64.zip.sha256 +++ /dev/null @@ -1 +0,0 @@ -0cc5fe73ffe7e756d38f5c5af1f8a2409693005499556ecb9a74eb649224171e localai-toolkit-1.0.0-beta.1-arm64.zip diff --git a/toolkit/localai-toolkit-1.0.0-beta.2-arm64.zip b/toolkit/localai-toolkit-1.0.0-beta.2-arm64.zip deleted file mode 100644 index 6f0a740..0000000 Binary files a/toolkit/localai-toolkit-1.0.0-beta.2-arm64.zip and /dev/null differ diff --git a/toolkit/localai-toolkit-1.0.0-beta.2-arm64.zip.sha256 b/toolkit/localai-toolkit-1.0.0-beta.2-arm64.zip.sha256 deleted file mode 100644 index 4d8c7b6..0000000 --- a/toolkit/localai-toolkit-1.0.0-beta.2-arm64.zip.sha256 +++ /dev/null @@ -1 +0,0 @@ -2a83a937c5bea4f61385dff25f590b4693b594e1f89eb4132256fd07f701d5c1 localai-toolkit-1.0.0-beta.2-arm64.zip diff --git a/toolkit/localai-toolkit-1.0.0-beta.3-arm64.zip b/toolkit/localai-toolkit-1.0.0-beta.3-arm64.zip deleted file mode 100644 index 27078d9..0000000 Binary files a/toolkit/localai-toolkit-1.0.0-beta.3-arm64.zip and /dev/null differ diff --git a/toolkit/localai-toolkit-1.0.0-beta.3-arm64.zip.sha256 b/toolkit/localai-toolkit-1.0.0-beta.3-arm64.zip.sha256 deleted file mode 100644 index afe4895..0000000 --- a/toolkit/localai-toolkit-1.0.0-beta.3-arm64.zip.sha256 +++ /dev/null @@ -1 +0,0 @@ -7bb8dbcfd79a9b7002117558ecae0a7b2f25ac7450e379a8230a3d3f2d0c13db localai-toolkit-1.0.0-beta.3-arm64.zip