Claude を Swift で使う|Foundation Models iOS 統合の始め方

Claude を Swift で使う|Foundation Models iOS 統合の始め方

Anthropic は Apple の Foundation Models フレームワーク向けに ClaudeForFoundationModels Swift パッケージを公式提供しており、iOS/macOS アプリから Claude を LanguageModelSession 標準 API 経由で呼び出せます。本記事では Swift Package Manager でのセットアップからストリーミング・構造化出力・サーバーサイドツールの実装まで、開発者向けに順を追って整理します。

結論powered by Claude
Anthropic は Apple の Foundation Models フレームワーク向けに ClaudeForFoundationModels Swift パッケージを公式提供しており、iOS/macOS アプリから Claude を `LanguageModelSession` 標準 API 経由で呼び出せます。本記事では Swift Package Manager でのセットアップからストリーミング・構造化出力・サーバーサイドツールの実装まで、開発者向けに順
目次 (14)

Claude × Swift の全体像

「Swift から Claude を使う」方法は現在大きく 2 つあります。

  1. ClaudeForFoundationModels(Anthropic 公式):Apple の FoundationModels フレームワーク上で Claude をサーバーサイドモデルとして動かす Swift パッケージ。LanguageModelSession という統一 API でオンデバイスモデルと Claude を透過的に切り替え可能
  2. コミュニティ製 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,
  ]
)

.webSearchallowedDomains / 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 の正式リリースに備えて今から実装を試しておくと本番対応をスムーズに進められます。


出典

参考になったら ♡
Clauder Navi 編集部
@clauder_navi

Anthropic の Claude / Claude Code を中心に、日本のエンジニア向けに最新動向と実務 を毎日発信。 運営方針 は メディアについて をご覧ください。