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 FoundationModelsimport 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つのプロダクションパターンが推奨されています:

  1. Bring-Your-Own-Key – ユーザーが提供したキーをシステムのKeychainに保存し、プロバイダーに直接送信します。
  2. プロキシサーバー – プロバイダーのキーを、あなたが制御するバックエンドに保持し、アプリに一時的なトークンを公開してリクエストを転送します。 両方のアプローチについて、その利点と課題が説明されています。

なぜこのライブラリを使うべきか

  • 一度書けば、どこでも実行可能:同じ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
  • プロジェクト
  • プロジェクト
  • プロジェクト
  • プロジェクト