Continuing from the model-layer topic from a couple weeks back, LocalLM Lab 1.0.0-beta.3 extends the model layer to online providers.
A new RemoteModelProvider ships in a fourth binary, LocalLMLabSDKRemote (pure URLSession, no third-party dependencies). It's configured through RemoteProviderConfig: scheme, dialect (.openAIChat / .openAIResponses / .anthropicMessages / .openAICompatible), baseURL, auth, models — with presets for .openAI, .openAIResponses, .anthropic, .openRouter, and .openAICompatible for anything else speaking the OpenAI wire format (LM Studio, vLLM, a self-hosted endpoint).
Routing and session creation are identical to local/on-device routes:
lab.models.route("chat", to: ModelID(scheme: "openai", rest: "gpt-...")!)
let answer = try await lab.makeSession(route: "chat").respond(to: prompt)
Providers can be swapped at runtime without rebuilding LocalLMLab — ModelRegistry.replace(_:) / .removeProvider(scheme:) — useful if you're letting a user reconfigure their own API keys/endpoints.
Online providers also get first-class web search: capabilities.insert(.webSearch) plus defaultOptions.webSearch = true turns it on per-provider, or SessionOptions(webSearch: true) per turn. Results come back through the existing event/citation surface — session.events yields .serverToolCall with the queries, session.citations carries the sources.
One platform-gating detail: LocalLMLabSDKRemote's manifest floor is macOS 26, so linking it doesn't force a macOS 27 deployment target — but RemoteModelProvider itself is @available(macOS 27) and reports .requiresOS("macOS 27") when run on 26. That lets you ship one build that offers online models where the OS supports it and falls back to on-device everywhere else.
If you're building provider-configuration UI, Components doesn't link Remote at all — it calls back through onSave/onRemove/onTest closures with plain RemoteProviderDraft values, so you're not forced to pull in the Remote binary just to let a user type in an API key.
New reference app: model-switch — one chat interface that switches between OpenAI, Anthropic, OpenRouter, a custom OpenAI-compatible server, and Apple's on-device model mid-conversation, with a web search toggle and citations in the transcript. The provider-config glue is small, just 30 lines in ProviderGlue.swift converting a RemoteProviderDraft into a RemoteProviderConfig. It ships with a ModelSwitch.xcodeproj, which is also new for this release: all 11 SwiftUI reference apps now come with their .xcodeproj instead of needing to be built from the command line first (CLI-only examples still ship as Package.swift).
Why bother with online providers at all if you're mainly interested in local/on-device: two reasons beyond raw capability. First, it's a real cost/performance dial where you can route routine turns to a fast local or on-device model and escalate to a frontier model only for the hard cases, without three separate integrations to maintain. Second, it's a useful debugging framework: point a route at a frontier model to confirm your tool definitions and app framework are correct, independent of whether a smaller local or on-device model is just failing to follow your prompt or call tools correctly.
Requires macOS 27 beta on Apple Silicon for online providers, ClaudeForFoundationModels, PCC, and local open-weight models.
SDK guide: locallm/docs/sdk-guide.md at 1.0.0-beta · ancientcomputing/locallm · GitHub
Feature page: thisbrain.ai/locallm/1.0.0-beta