huggingface/AnyLanguageModel
An API-compatible, drop-in replacement for Apple's Foundation Models framework with support for custom language model providers.
AnyLanguageModel – 複数のLLMバックエンドに対するSwift最適の抽象化
何であるか
- AppleのFoundationModelsインポートを置き換えるSwiftパッケージで、Apple、Core ML、MLX、llama.cpp、Ollama、OpenAI、Anthropic、Geminiなど、多数のLLMプロバイダーに対して統一されたAPIを提供します。
- ただ
import FoundationModelsをimport AnyLanguageModelに変更するだけで、コードの他の部分はそのまま利用できます。
主要なコンセプト
LanguageModelSession– モデルインスタンスとオプションのツール(モデルが呼び出せる関数)のリストを保持するオブジェクト。すべてのインタラクションはsession.respond { … }を通じて行われます。- ガイド付き生成 –
@Generableと@Guideプロパティラッパーを使用して、モデルに強力な型付きSwift構造体を生成させ、生テキストのパースを避けることができます。 - ツール呼び出し –
Toolを準拠する型(例:天気照会)を定義し、モデルがいつ呼び出すかを判断させます。ToolExecutionDelegateを介して各呼び出しを観察または承認できます。 - トレイト – Swift Package Managerのトレイトにより、必要な重いバックエンド(CoreML、MLX、Llama)のみを選択的に有効化できます。これによりバイナリサイズを小さく保てます。
対応プロバイダー(READMEのチェックボックスで実装済みを示しています)
- Apple Foundation Models(iOS 26/macOS 26+でのシステムモデル)
- Core ML(デバイス上での
.mlmodelcファイル) - MLX(Apple Silicon加速モデル、
mlx-swift経由) - llama.cpp(GGUF量子化モデル)
- Ollama HTTP API(ローカルまたはリモートのOllamaサーバー)
- Anthropic Messages API
- Google Gemini API
- OpenAI Chat Completions & Responses API
- Open Responses(OpenAIレスポンス形式と互換性のある任意のエンドポイント)
インストール
// Package.swift
dependencies: [
.package(url: "https://github.com/huggingface/AnyLanguageModel", from: "0.11.0")
]
特定のバックエンドが必要な場合、そのトレイトを有効化します:
.package(
url: "https://github.com/huggingface/AnyLanguageModel",
from: "0.11.0",
traits: ["CoreML", "MLX"]
)
トレイトを使用する場合、下位パッケージも追加する必要があります(CoreML → huggingface/swift-transformers、MLX → ml-explore/mlx-swift-lm、Llama → mattt/llama.swift)。READMEには、トレイトを直接宣言できないプロジェクト向けの完全なXcodeシムワークフローが記載されています。
一般的な使用例
import AnyLanguageModel
let model = SystemLanguageModel.default // または CoreMLLanguageModel(...), MLXLanguageModel(...), など
let session = LanguageModelSession(model: model)
// シンプルなプロンプト
let resp = try await session.respond { Prompt("量子コンピューティングを一文で説明してください") }
print(resp.content)
ガイド付き生成の例
@Generable(description: "猫の基本的なプロフィール情報")
struct CatProfile {
var name: String
@Guide(description: "猫の年齢", .range(0...20))
var age: Int
@Guide(description: "一文での性格説明")
var profile: String
}
let profile = try await session.respond(
to: "かわいい保護猫のプロフィールを生成してください",
generating: CatProfile.self
).content
モデルはCatProfileインスタンスを直接返します。
ツール呼び出し
struct WeatherTool: Tool {
let name = "getWeather"
let description = "都市の最新天気情報を取得する"
@Generable
struct Arguments { @Guide var city: String }
func call(arguments: Arguments) async throws -> String {
"The weather in \(arguments.city) is sunny and 72°F"
}
}
let session = LanguageModelSession(model: model, tools: [WeatherTool()])
let answer = try await session.respond { Prompt("Cupertinoの天気はどうですか?") }
print(answer.content)
デリゲートを接続してツール呼び出しを監視または承認できます。
画像入力 多くのクラウドプロバイダー(OpenAI、Anthropic、Gemini、Open Responses)および一部のローカルバックエンド(MLX、Ollama)は画像をサポートしています:
let resp = try await session.respond(
to: "何が見えますか?",
images: [.init(url: URL(string: "https://example.com/photo.jpg")!)]
)
READMEの表には、どのプロバイダーが画像をサポートしているかが記載されています。
セキュリティガイドライン READMEはAPIキーをハードコードしないことを強く推奨しています。2つのプロダクションパターンが推奨されています:
- Bring-Your-Own-Key – ユーザーが提供したキーをシステムのKeychainに保存し、プロバイダーに直接送信します。
- プロキシサーバー – プロバイダーのキーを、あなたが制御するバックエンドに保持し、アプリに一時的なトークンを公開してリクエストを転送します。 両方のアプローチについて、その利点と課題が説明されています。
なぜこのライブラリを使うべきか
- 一度書けば、どこでも実行可能:同じSwiftコードがデバイス上(Core ML、MLX、llama.cpp)とクラウド(OpenAI、Anthropic、Gemini、Ollama)で動作します。
- ガイド付き生成による強力な型付き出力により、脆弱な文字列パースが不要になります。
- ビルトインのツール呼び出しサポートにより、エージェント風のアプリ(天気取得、データ照会、カスタムコード実行など)を構築できます。
- トレイトベースの依存管理により、最終的なアプリが軽量に保たれます。
現在の制限
- Apple Foundation ModelsはiOS/macOS 26が必要であり、執筆時点では将来のOSバージョンです。
- llama.cppはツール呼び出しをサポートしていません。
- v0.11で
LiteRTバックエンドがビルド時の問題のため削除されました。
さらに学ぶには
- READMEはAppleのGuided Generationドキュメント、各種プロバイダーAPI、およびサンプルXcodeアプリ(
chat-ui-swift)へのリンクを提供しています。 - Issues #15 と #135 では、既知のXcode/SwiftPMのバグと回避策について議論されています。
結論:AnyLanguageModelは、幅広い言語モデルプロバイダーを抽象化し、一級のツール呼び出しと型付き生成を追加し、Swift Package Managerのトレイトを使ってバイナリサイズを小さく保つ、本格的でプロダクション対応のSwiftライブラリです。オンデバイスとクラウドのLLMに統一APIを求めるiOS/macOS/visionOS開発者向けです。
関連
- Dispatch
- プロジェクト
- プロジェクト
- プロジェクト
- プロジェクト