Claude Platform Docs
CLI、SDK、ライブラリライブラリと統合

Apple Foundation Models

Claude for Foundation Models Swiftパッケージを使用して、Foundation Modelsフレームワークを通じてAppleプラットフォーム上でClaudeを利用します。

Claude for Foundation Modelsは、AppleのFoundation Modelsフレームワークにおいて、Claudeをサーバーサイドの言語モデルとして利用可能にするSwiftパッケージです。このパッケージはClaudeをフレームワークのLanguageModelプロトコルに準拠させるため、Appleのオンデバイスモデルで使用するのと同じLanguageModelSession APIで操作できます。respond(to:)、「streaming」(ストリーミング)、ガイド付き生成、ツール呼び出しはすべて同じように動作します。

リクエストはアプリからClaude APIへ直接送信されます。Appleはリクエスト経路に含まれず、プロンプトやレスポンスを見ることはありません。使用量は標準のAPI料金でお客様のAnthropicアカウントに請求されるため、組織には利用可能なクレジット残高または有効な請求方法が必要です。Claudeをいつ使用し、Appleのオンデバイスモデルをいつ使用するかはアプリが決定します。各セッションに使用したいモデルを渡してください。

要件

  • iOS 27、macOS 27、visionOS 27、またはwatchOS 27(すべてベータ版):Foundation Modelsフレームワークがサーバーサイド言語モデルをサポートするOSリリース
  • Xcode 27(ベータ版)
  • 開発用にClaude Consoleから取得したClaude APIキー。本番環境向けのオプションについては認証を参照してください。

パッケージのインストール

Package.swiftにパッケージを追加します:

dependencies: [
  .package(url: "https://github.com/anthropics/ClaudeForFoundationModels.git", from: "0.1.0")
]

またはXcodeで:File > Add Package Dependencies… を選択し、リポジトリのURLを入力します。

次に、ターゲットの依存関係にClaudeForFoundationModelsを追加し、FoundationModelsと一緒にインポートします:

import FoundationModels
import ClaudeForFoundationModels

クイックスタート

ClaudeLanguageModelがエントリーポイントです。これをLanguageModelSessionに渡し、他のFoundation Modelsプロバイダーとまったく同じようにセッションを使用します:

import FoundationModels
import ClaudeForFoundationModels

let model = ClaudeLanguageModel(
  name: .sonnet5,
  auth: .apiKey(ProcessInfo.processInfo.environment["ANTHROPIC_API_KEY"] ?? "")
)

let session = LanguageModelSession(model: model)
let response = try await session.respond(to: "Plan a 4-day trip to Buenos Aires.")
print(response.content)

イニシャライザはbaseURL(デフォルトはhttps://api.anthropic.com)、timeout、およびserverToolsサーバーサイドツールを参照)も受け付けます。

完全に動作するプログラムとして、リポジトリにはExamples/ClaudeExampleが含まれています。これはチャットのターンをターミナルにストリーミングする実行可能なコマンドラインターゲットで、そのターンでサーバーサイドのウェブ検索を有効にする--searchフラグを備えています。実行にはmacOS 27のホストが必要です。

モデルの選択

モデル識別子はClaudeModelの値です。コンパイル済みの定数を使用するか、まだコンパイルされていないIDについては明示的なケイパビリティを指定して構築します(ケイパビリティを参照):

ClaudeLanguageModel(name: .opus5, auth: auth)

定数はAPIのモデルIDを反映しており(.opus5claude-opus-5)、各モデルのケイパビリティを保持しています。新しいモデルはパッケージのリリースで新しい定数として提供されます。現在のリストについてはXcodeでClaudeModelを確認し、モデルの比較についてはモデル概要を参照してください。

ケイパビリティ

ClaudeModelは、受け付けるものを宣言します:サンプリングパラメータ、エフォートレベル、適応型思考、構造化出力、画像入力です。モデルが拒否するフィールドを送信するとハードエラーになるため、パッケージはこれを使用してどのリクエストフィールドを送信するかを決定します。定数は正しいケイパビリティを保持しています。コンパイルされていないIDについては、モデルが受け付けるものを宣言してください(推測する省略記法は意図的に用意されていません):

let model = ClaudeModel(
  id: "claude-experimental-x",
  capabilities: .init(samplingParams: false, effortLevels: [.low, .high])
)
ClaudeLanguageModel(name: model, auth: auth)

エフォート

fixedEffort:を使用して、すべてのリクエストに対してClaudeのエフォートレベルを固定します。これはフレームワークのリクエストごとの推論ヒントよりも優先されます。フレームワークの名前付き推論レベルはhighまでです。代わりに単一のリクエストでより高いエフォートを要求するには、Claudeのエフォートを指定するカスタム推論レベル(.custom("xhigh")または.custom("max"))を渡してください。これは直接マッピングされます。エフォートが送信されない場合、APIのデフォルトはhighです:

ClaudeLanguageModel(name: .opus5, auth: auth, fixedEffort: .xhigh)

レベルはモデルが受け付けるものでなければなりません。各ClaudeModelは、5つのレベル(lowmediumhighxhighmax)のうちそのモデルがどれを受け付けるか(受け付ける場合)を宣言します。エフォートをまったく受け付けないモデルもあります。

Claudeとオンデバイスモデルの使い分け

Appleのオンデバイスモデルは高速でプライベート、かつオフラインで利用可能ですが、軽量なタスク向けのサイズです。より大きなコンテキスト、最先端の推論、またはウェブ検索やコード実行などのサーバーサイドツールが必要な場合はClaudeにエスカレーションしてください。どちらも同じLanguageModelSession APIを使用するため、model:引数を入れ替えるだけで切り替えられます。

認証

auth:パラメータで認証情報を設定します。バックエンドなしで出荷するには.appAttest、独自のバックエンドを経由してリクエストをルーティングするには.proxied、開発中に反復作業するには.apiKeyを使用します。

App Attest

アプリの各インストールは、AppleのApp Attestサービスを使用して、登録したアプリの正規かつ改変されていないビルドであることを証明します。その後、Anthropicはそのデバイスに対して、使用量をワークスペースに課金する短期間有効なアクセストークンを発行します。アプリにはAPIキーが含まれず、運用すべきプロキシもありません。

App Attest認証は、アプリがClaude APIを直接呼び出す場合にのみ利用できます。Amazon Bedrock、Google Cloud、またはMicrosoft Foundry経由では利用できません。

バックエンドを運用せずに出荷するには、.appAttestを使用します:

ClaudeLanguageModel(
  name: .sonnet5,
  auth: .appAttest(clientID: "clid_...")
)

App Attestをセットアップするには、Apple Developer Team IDと、組織内でのadmin、owner、またはprimary ownerのロールが必要です。Xcodeプロジェクトを設定し、Claude Consoleでアプリを登録します。

  1. Xcodeで、Signing & Capabilitiesの下にあるアプリターゲットにApp Attestケイパビリティを追加します。
  2. Claude Consoleのワークスペース設定で、App integrationsを開きます。
  3. Create app integrationをクリックし、名前、Apple Developer Team ID、および1つ以上のバンドルID(最大32個)を入力します。
  4. インテグレーションのOverviewタブからクライアントID(clid_...)をコピーし、アプリのClaude設定に渡します。

アプリがデバイス上で初めてClaudeを使用する際、アプリはAnthropicにチャレンジをリクエストし、AppleのDCAppAttestServiceでデバイスをアテステーション(証明)し、検証済みのアテステーションをアクセストークンと交換します。Claude for Foundation Modelsパッケージはこのフローを自動的に実行し、トークンの有効期限が切れると新しいトークンをリクエストします。アテステーション用のコードを自分で書く必要はありません。

トークンはワークスペースにスコープされ、1時間後に有効期限が切れ、Messages APIの呼び出しのみを認可します。トークンにはエンドユーザーのIDは含まれません。App Attestが識別するのはアプリであり、それを使用している人ではないため、ユーザーごとのロジックはアプリ側で処理してください。

侵害されたアプリや廃止済みのアプリを停止するには、そのインテグレーションを取り消します。Claude Console のワークスペース設定で App integrations を開き、対象のインテグレーションを選択して Revoke をクリックし、確認します。インテグレーションを取り消すと、そのインテグレーションの未使用のトークンが無効化され、登録済みのデバイスは新しいトークンをリクエストできなくなります。取り消しは永続的であるため、アクセスを復元するには新しいアプリインテグレーションを作成してください。

プロキシ(本番環境)

本番環境では、.proxiedを使用して独自のバックエンドを経由してリクエストをルーティングします。baseURLにあるリレーがサーバーサイドでClaude APIの認証情報を追加するため、アプリにキーは含まれません。指定したheadersはすべてのリクエストで送信されるため、プロキシは呼び出し元を認可できます。不要な場合は[:]を渡してください:

ClaudeLanguageModel(
  name: .sonnet5,
  auth: .proxied(headers: ["X-App-Token": "..."]),
  baseURL: URL(string: "https://api.yourapp.com/claude")!
)

プロキシは標準のMessages APIリクエストを受け取り、x-api-keyヘッダーを付加して、https://api.anthropic.comに転送します。

APIキー(開発用)

開発中はAPIキーを直接渡します:

ClaudeLanguageModel(name: .sonnet5, auth: .apiKey("YOUR_API_KEY"))

ストリーミング

streamResponse(to:)はレスポンスを段階的に返します。各要素は差分ではなく、その時点までのレスポンスの累積スナップショットです:

let stream = session.streamResponse(to: "Summarize today's top science stories.")
for try await partial in stream {
  print(partial.content)
}

構造化出力

型に@Generableを付与し、generating:でリクエストします。モデルは構造化出力を通じてその型の値を返します:

@Generable
struct Trip {
  @Guide(description: "Destination city") var destination: String
  @Guide(description: "Length in days") var days: Int
}

let response = try await session.respond(to: "Plan a trip to Tokyo.", generating: Trip.self)
print(response.content.destination)

構造化出力には、ケイパビリティにそれを含むモデルが必要です(コンパイル済みの定数はすべて含んでいます)。選択したモデルが含まない場合、パッケージは暗黙的に機能を低下させるのではなく、LanguageModelError.unsupportedGenerationGuideをスローします。

ツール使用

クライアントサイドツール

フレームワークのtools:配列はそのまま動作します。型をToolに準拠させ、LanguageModelSessionに渡すと、Claudeがそれらを呼び出した際にフレームワークがデバイス上で実行します。Claudeでの「tool use」(ツール使用)を参照してください。

let session = LanguageModelSession(model: model, tools: [FindRestaurantsTool()])

サーバーサイドツール

サーバーツール(ウェブ検索、ウェブフェッチ、コード実行)は、単一のラウンドトリップ内でAnthropicのインフラストラクチャ上で実行され、フレームワークがデバイス上で呼び出すものはありません。serverTools:を使用してモデルごとに設定します:

let model = ClaudeLanguageModel(
  name: .sonnet5,
  auth: auth,
  serverTools: [
    .webSearch(maxUses: 5),
    .codeExecution,
  ]
)

.webSearch.webFetchはオプションのallowedDomainsblockedDomainsmaxUsesを受け付けます。サーバーツールのアクティビティは、トランスクリプト内にClaudeServerToolSegmentカスタムセグメントとして表示されます。

画像

ケイパビリティに画像入力を含むモデルは、フレームワークのビジョンケイパビリティを宣言します。フレームワークの標準セッションAPIを通じて画像コンテンツを渡すと、パッケージがそれをClaude APIの画像形式に変換します。画像の要件についてはビジョンを参照してください。

エラー処理

パッケージは、適合するものがある場合、Claude APIのエラーをAppleのLanguageModelErrorのケースにマッピングします。「context window」(コンテキストウィンドウ)のオーバーフローは.contextSizeExceededとして、HTTP 429は.rateLimitedとして、設定されたタイムアウトを超えたリクエストは.timeoutとして表示されます。フレームワークに相当するものがないプロバイダーエラーはClaudeErrorとして表示されます。パターンマッチングを使用してプロダクトのフローを制御します:

do {
  let response = try await session.respond(to: prompt)
  print(response.content)
} catch ClaudeError.missingCredential {
  // APIキーの入力を求めます。
} catch let error as LanguageModelError {
  // フレームワーク由来のエラー(レート制限、ガードレール、コンテキスト長、デコード)。
} catch {
  // トランスポートエラー。
}

一般的なパターンは、.rateLimitedをキャッチしてそのターンではSystemLanguageModelにフォールバックする、リクエストをキューに入れる、または再試行の手段を提示することです。

機能サポート

パッケージは、Foundation Modelsプロバイダープロトコルが表現できるMessages APIの機能を提供します。Appleのプロトコルに表現がない機能は、これを通じては利用できません。以下が含まれます:

  • 「prompt caching」(プロンプトキャッシング)の制御(パッケージはプロンプトキャッシングを自動的に適用します。キャッシュのTTLとブレークポイントの配置は設定できません)
  • ストップシーケンス
  • バッチ処理
  • Files API
  • トークンカウント
  • ベータヘッダー

追加リソース

リファレンス内容
Apple Foundation ModelsドキュメントLanguageModelSession@GenerableTranscriptTool、およびフレームワークのその他のインターフェース
GitHub上のClaudeForFoundationModelsソース、実行可能なサンプル、およびイシュートラッカー
Claude APIリファレンス基盤となるMessages API

パッケージはApache 2.0でライセンスされています。バグ報告はGitHubのイシューを通じて歓迎します。ベータ期間中は外部からのプルリクエストは受け付けていません。

Was this page helpful?