
Claude を Swift で使う|Foundation Models iOS 統合の始め方
Anthropic は Apple の Foundation Models フレームワーク向けに ClaudeForFoundationModels Swift パッケージを公式提供しており、iOS/macOS アプリから Claude を LanguageModelSession 標準 API 経由で呼び出せます。本記事では Swift Package Manager でのセットアップからストリーミング・構造化出力・サーバーサイドツールの実装まで、開発者向けに順を追って整理します。
目次 (14)
Claude × Swift の全体像
「Swift から Claude を使う」方法は現在大きく 2 つあります。
- ClaudeForFoundationModels(Anthropic 公式):Apple の
FoundationModelsフレームワーク上で Claude をサーバーサイドモデルとして動かす Swift パッケージ。LanguageModelSessionという統一 API でオンデバイスモデルと Claude を透過的に切り替え可能 - コミュニティ製 Swift SDK:Messages API を直接呼び出す実装。Anthropic 公式の Swift クライアントは存在せず、
SwiftClaude(GitHub、GeorgeLyon 作、73 stars)などのサードパーティライブラリを利用する形になります
現在 Anthropic が力を入れているのは前者で、iOS 27 / macOS 27 以降を対象とした公式統合が進んでいます。
ClaudeForFoundationModels パッケージの概要
Anthropic と Apple は WWDC 2026 シーズンに協力し、Foundation Models フレームワークへのサーバーサイド言語モデルサポートを追加。Claude がその第一弾パートナーとなりました。
- 統一 API:
LanguageModelSessionに渡すモデルを差し替えるだけで、Apple オンデバイスモデルと Claude を同じコードで制御できます - 通信経路: リクエストはデバイスから Anthropic サーバーへ直行し、Apple はプロンプトや応答を参照しません
- ベータ段階: iOS 27 / macOS 27 / visionOS 27 / watchOS 27 および Xcode 27(いずれも開発者ベータ)が必要
出典:Anthropic 公式ドキュメント「Apple Foundation Models」(https://platform.claude.com/docs/en/cli-sdks-libraries/libraries/apple-foundation-models)
Swift Package Manager でのインストール
Package.swift に依存関係を 1 行追加します。
dependencies: [
.package(
url: "https://github.com/anthropics/ClaudeForFoundationModels.git",
from: "0.1.0"
)
]
Xcode では File > Add Package Dependencies… から同じリポジトリ URL を入力するだけで追加完了。使用ファイルには次の 2 行をインポートします。
import FoundationModels
import ClaudeForFoundationModels
基本的な使い方 — クイックスタート
ClaudeLanguageModel インスタンスを作り、それを LanguageModelSession に渡します。以降の操作は通常の Foundation Models と同じです。
import FoundationModels
import ClaudeForFoundationModels
let model = ClaudeLanguageModel(
name: .sonnet4_6,
auth: .apiKey(ProcessInfo.processInfo.environment["ANTHROPIC_API_KEY"] ?? "")
)
let session = LanguageModelSession(model: model)
let response = try await session.respond(to: "東京の 4 日間旅行プランを提案して")
print(response.content)
利用できるモデル定数は .sonnet4_6 や .opus4_8 など。内部的には Claude API のモデル ID に対応しており、ClaudeModel 型で確認できます。Effort レベルも fixedEffort: .xhigh のように指定できます。
ストリーミング応答と構造化出力
ストリーミング応答
streamResponse(to:) は差分でなく累積スナップショットを返します。UI への逐次描画に適しています。
let stream = session.streamResponse(to: "本日のトップニュースをまとめて")
for try await partial in stream {
print(partial.content)
}
構造化出力(@Generable)
@Generable アノテーション付きの型を渡すと、モデルが型安全な出力を返します。
@Generable
struct Trip {
@Guide(description: "目的地都市") var destination: String
@Guide(description: "泊数") var nights: Int
}
let result = try await session.respond(to: "パリ旅行を計画して", generating: Trip.self)
print(result.content.destination) // "Paris"
print(result.content.nights) // 5
モデルの capabilities に structured output が含まれない場合は LanguageModelError.unsupportedGenerationGuide がスローされます。コンパイル済み定数はすべて対応済みです。
サーバーサイドツールを有効にする
Web 検索やコード実行など、Anthropic インフラ上で処理されるツールは serverTools: で設定します。
let model = ClaudeLanguageModel(
name: .sonnet4_6,
auth: auth,
serverTools: [
.webSearch(maxUses: 5),
.codeExecution,
]
)
.webSearch は allowedDomains / blockedDomains / maxUses でアクセス制御が可能。ツールの実行結果は ClaudeServerToolSegment として transcript に記録されます。サーバーサイドツールは ClaudeLanguageModel 単位で設定するため、会話ごとに違うツールセットを使う場合は複数のモデルインスタンスを作成します。
認証設定 — 開発用 API キーと本番プロキシ
開発環境(API キー直接指定)
ClaudeLanguageModel(name: .sonnet4_6, auth: .apiKey("sk-ant-..."))
アプリバイナリに API キーを組み込むと抽出されるリスクがあります。開発用途に限定し、TestFlight 以降は必ずプロキシを使用してください。
本番環境(プロキシ経由)
自社バックエンドが x-api-key を付与して Anthropic サーバーに転送する構成を推奨します。
ClaudeLanguageModel(
name: .sonnet4_6,
auth: .proxied(headers: ["X-App-Token": "your-app-token"]),
baseURL: URL(string: "https://api.yourapp.com/claude")!
)
プロキシは標準の Messages API フォーマットのリクエストを受け取り、x-api-key ヘッダを追加して https://api.anthropic.com へ転送します。
エラーハンドリングとオンデバイスモデルとの使い分け
Claude API エラーは Foundation Models の LanguageModelError にマッピングされます。レート制限時にオンデバイスへフォールバックするパターンが Apple 推奨です。
do {
let response = try await session.respond(to: prompt)
print(response.content)
} catch ClaudeError.missingCredential {
// API キー未設定 — 設定画面へ誘導
} catch LanguageModelError.rateLimited {
// レート超過 — オンデバイスモデルへフォールバック
let fallback = LanguageModelSession(model: SystemLanguageModel.default)
let res = try await fallback.respond(to: prompt)
print(res.content)
} catch LanguageModelError.contextSizeExceeded {
// コンテキスト長超過
} catch {
// 通信エラー等
}
使い分けの基準は明確で、コンテキスト長・フロンティア推論・サーバーサイドツールが必要なときは Claude、速度・プライバシー・オフライン動作が優先のときはオンデバイスモデルを選びます。
現時点でできないこと
ClaudeForFoundationModels は Foundation Models のプロトコル準拠を優先しているため、一部機能は利用不可です。
- プロンプトキャッシュの手動制御(自動適用のみ)
- Stop sequence の指定
- Batch 処理
- Files API
- Token カウント
- Beta ヘッダ
これらが必要な場合は Messages API を直接呼ぶか、ant CLI を経由する方法を検討してください。
まとめ
ClaudeForFoundationModels パッケージは iOS 27 / macOS 27 ベータ向けのフレームワークですが、Apple の LanguageModelSession API と完全に統合されているため、既存の Foundation Models コードに Claude を加える学習コストは非常に低く抑えられています。ストリーミング・構造化出力・Web 検索といった主要機能が揃っており、iOS 27 の正式リリースに備えて今から実装を試しておくと本番対応をスムーズに進められます。
出典
- Anthropic 公式ドキュメント「Apple Foundation Models」: https://platform.claude.com/docs/en/cli-sdks-libraries/libraries/apple-foundation-models
- ClaudeForFoundationModels GitHub リポジトリ: https://github.com/anthropics/ClaudeForFoundationModels
- Anthropic 公式「Client SDKs and Libraries」: https://platform.claude.com/docs/en/api/client-sdks