AppleはSiriモデル委任をテスト中?App Intentsに必要なものとは

opoinstall
2026-09-16
5 min read

AppleがSiriのモデル委任をテストしているのでしょうか?2026年9月14日、AppleはiOS 27を正式リリースし、次世代のSiri AIを導入しました。同時に、リバースエンジニアリングによる解析で、OSがAnthropicのClaudeやOpenAIのChatGPTといったサードパーティ製モデルに会話の推論を委任できる内部コードが発見されました。モバイルアーキテクトやプラットフォームエンジニアにとって、プライベートフレームワークにおけるSiriのモデル委任の出現は、モジュール化されたアシスタント・オーケストレーションへの構造的転換を意味します。欧州連合(EU)のデジタル市場法(DMA)に関連する規制の動きがシステムレベルの相互運用性の背景にある一方で、外部モデルへの委任はモバイルのインテント実行に運用上の変動をもたらします。モバイルエンジニアリングチームは、予測可能な挙動を単一の基盤モデルに期待するのではなく、App Intentsを防御的なドメイン境界として扱い、厳格なスキーマ検証、堅牢なエンティティの曖昧性解消、そして副作用を制御した安全な設計を行う必要があります。

iOS 27のアーキテクチャとプライベートフレームワークにおけるモデル委任機能

iOS 27の正式リリースにより、Apple Intelligenceのための分割ランタイム・インフラが確立されました。Siri AIは、システム全体のディクテーションや表現豊かな音声を実現するオンデバイスの「AFM Core Advanced」モデルや、Private Cloud Computeクラスターで動作するサーバーモデルを活用します。この環境下でSiri AIは、メール、メッセージ、写真などの個人の文脈や、View Annotationsによる画面上の認識、Spotlightを活用したセマンティックインデックスを統合し、ネイティブアプリ間を横断するオーケストレーターとして機能します。

概要

  • 内部的な委任機能: 流出したiOS 27およびmacOS 27のビルド解析により、ClaudeやChatGPTといったサードパーティ製モデルへリクエストをルーティングするように設計された、Model Manager Services内の「Model Delegation(モデル委任)」メカニズムと「Inference Providing(推論提供)」プロトコルが確認されました。
  • 未公開のシステム権限: これらのマルチモデル委任機能はプライベートなシステムフレームワークに限定されており、Appleはサードパーティの開発者や一般ユーザーに対して外部委任の権限を公開していません。
  • App Intentsが唯一のサポート契約: アップストリームのプロンプトがAppleの基盤モデルによって解析されようと、外部の推論エージェントによって解析されようと、サードパーティアプリのアクションをシステムに公開するためのAppleの文書化されたプログラム上の境界は、引き続きApp Intentsです。

iOS 27のSiri AIインターフェースでメール作成時のパーソナルコンテキストを示す様子

MacRumorsが公開した技術解析によると、開発者がプライベートフレームワークを調査した結果、2つの明確なアーキテクチャ階層が発見されました。1つ目は、Claudeのようなサードパーティモデルを統合アシスタント拡張機能として動作させるモデル委任メカニズムです。技術デモの記録では、Claudeは制約のない自然言語プロンプトを解釈してユーザーの実行目標を抽出しますが、システムデータへのアクセスやローカルアプリの実行が必要なタスクについては、構造化されたアクションをSiriへ委任します。2つ目は、OSのModel Manager Services内の推論提供プロトコルであり、これはAppleのサーバー側推論バックエンドを別の基盤モデルに差し替えることができるコードパスを備えています。

欧州の規制環境は、こうした開発において重要な制度的背景となっています。EUデジタル市場法(DMA)の第6条(7)に基づき、ゲートキーパーであるOSにはコアプラットフォーム機能への平等なアクセスを求める相互運用性の義務が課されています。Appleはデータプライバシーとセキュリティに関する規制の整合性を検討する間、EU市場において消費者向けのSiri AI機能を一時的に保留していますが、システムバイナリ内にモデル非依存のオーケストレーション・フックが存在することは、将来的に広範なモデル横断型の相互運用性が求められた場合に備えて、Appleのエンジニアリングチームが技術的なモジュール性をテストしていることを示唆しています。

エンジニアリング上の注意点: 公開されている証拠により、プライベートなモデル委任メカニズムの存在と、サードパーティアプリのアクションを公開するインターフェースとしてApp Intentsが採用されていることが確認されています。Appleは、これら2つの層を接続する内部ブリッジについては公開していません。以下のトポロジーは、説明のための参照モデルです。

+-------------------------------------------------------------------------+
| 参照モデル: プライベート委任を囲むパブリックApp Intentsの境界            |
+-------------------------------------------------------------------------+
|                                                                         |
|  [ ユーザーの自然言語入力 (音声 / Dynamic Island / Siriへの入力) ]      |
|                                |                                        |
|                                v                                        |
|  [ システムオーケストレーター: 文脈解決 & Spotlightセマンティックインデックス ] |
|                                |                                        |
|         +----------------------+----------------------+                 |
|         |                                             |                 |
|         v                                             v                 |
|  [ プライマリ・システム・インテリジェンス ]       [ プライベート委任パス ]  |
|  - オンデバイスAFM Coreモデル               - モデル委任パス             |
|  - Private Cloud Compute                   - Model Manager Services    |
|         |                                     (Claude / GPT パス)     |
|         |                                             |                 |
|         +----------------------+----------------------+                 |
|                                |                                        |
|                                v                                        |
|             [ 未公開の内部アクションブリッジ ]                        |
|                                |                                        |
|                                v                                        |
|  [ パブリックApp Intents境界: AppIntent & EntityQuery ]               |
|                                |                                        |
|         +----------------------+----------------------+                 |
|         |                                             |                 |
|         v                                             v                 |
|  [ 型指定されたネイティブ検証 ]              [ パラメータの曖昧性解消 ]   |
|  (境界チェック, アクター分離)              (ユーザーとの対話 & 選択)   |
|                                                                         |
+-------------------------------------------------------------------------+

モデル委任層の分析:システムオーケストレーションとApp Intent契約

自然言語の推論とアプリ実行の間のアーキテクチャ上の区別は、iOSがどのようにアシスタントワークフローを処理するかを理解する核心となります。従来のモバイルアシスタント実装では、音声処理と機能のディスパッチはSiriKitに基づく静的なドメインクラスを介して調整されていました。Appleはここ数回の開発者向けリリースを通じて、このインターフェースを宣言的なApp Intentsフレームワークへと移行させています。

この現代的なパラダイムでは、ネイティブアプリは音声ストリームを解析したり、音素辞書を保持したりする必要はありません。代わりに、アプリはシステムのランタイムレジストリに対して以下の2つの基本的な成果物を公開します。

  1. AppEntity 宣言: 内部のビジネスモデル(注文記録、アカウントプロファイル、ドキュメント参照など)の型指定された表現。アプリはさらに、専用のインデックス作成APIやビュー注釈APIを介して、Spotlight検索や画面認識メカニズムにエンティティを公開できます。
  2. AppIntent 仕様: 厳密に型指定されたパラメータ、ローカライズされたプロンプトの要約、および戻り値の契約を含む実行可能なルーチン。

iPhoneで画面上の認識機能を用いて文脈に応じた回答をするSiri AI

内部フレームワークがユーザーの音声を外部の推論モデルにルーティングする場合、委任層はプロンプトの理解とアクションの実行を分離します。実証されたワークフローでは、外部モデルは上位のセマンティックインタープリターとして機能し、Siriに対してアクションを返します。サードパーティアプリについては、AppleのApp Intentsフレームワークが、サポートされているアクションがシステムに公開されるための型指定された契約を個別に定義しています。

簡略化された概念比較:アシスタントの進化

従来のパターンマッチング・ディスパッチ:
ユーザー入力 -> 文法ドメインルール -> スロット埋め -> ハンドラの呼び出し

マルチモデル・オーケストレーション・パイプライン:
ユーザー入力 -> アクティブモデルプロバイダー (AFM / Claude / GPT)
             -> セマンティックパラメータの合成
             -> 正式なSwift AppIntent契約
             -> 防御的検証 & エンティティ解決
             -> ドメインビジネスロジック

この構造的分離は、重要なエンジニアリング上の事実を浮き彫りにします。それは「自然言語推論モデルはセマンティックな(意味上の)変動を導入する」という点です。Appleは、サポートされるアプリのアクションがSiriやApple Intelligenceに公開されるための型指定された契約としてApp Intentsを規定しています。しかし、その契約に到達する前にユーザー言語をどう解釈するかは、上位の推論モデルによって異なる可能性があり、トークン化のニュアンスや意味的な前提が異なる場合があります。仮定のマルチモデルアーキテクチャでは、あるモデルが正確な英数字の参照コードを合成する一方で、別のモデルが間接的な説明文字列や部分的なエンティティタイトルを生成する可能性があるのです。

その結果、モバイル開発者は「上位モデルからのハンドオフ(引き渡し)が有効なドメイン入力を保証する」と想定することはできません。App Intentsフレームワークは構造的なインターフェースを提供しますが、入力された引数が現実的な運用上の不変条件に適合しているかを検証する責任は、完全にネイティブアプリコード側に残ります。

Swift AppIntentsのための防御的エンジニアリング標準

上位のインテントが複数の推論モデルから生成される可能性がある環境へiOSアプリを適応させるには、防御的プログラミングの技法が必要です。エンジニアリングチームは、入ってくるインテントの呼び出しを「検証済みのシステムイベント」として扱うのではなく、外部のREST APIコントローラーやパブリックなRPCエンドポイントと同じ厳格さでインテントハンドラを設計すべきです。

App Intentsは、宣言されたランタイム設定に応じてフォアグラウンドまたはバックグラウンドモードで実行されます。そのため、明示的にフォアグラウンド実行コンテキストを必要としない限り、アクティブなウィンドウ階層を想定したり、同期的なUIビューコントローラーを表示したりすることは避けるべきです。共有状態やリモート状態を変更するインテントについては、ドメインロジックを非同期でスレッドセーフなドメインサービス内に分離することが、堅牢な防御パターンとなります。

エンジニアリングの側面 一般的な最小構成 防御的なマルチモデルApp Intent構成
パラメータ入力 マッチング文字列や基本型を想定 文字セット、文字列長、ドメインの不変条件を検証
エンティティ解決 EntityQueryによる直接キー検索 正規化されたテキスト検索のためのEntityStringQueryを実装
曖昧性解消フロー 失敗時に一般的なシステムエラーをスロー 不足値(needsValueError)と選択肢(needsDisambiguationError)を区別
副作用の制御 状態変更を即座に実行 破壊的または影響の大きいアクションに対してrequestConfirmation()を組み込む
同時実行モデル 制約のない非同期タスク 再試行時の競合を防ぐ分離されたドメインアクター

多様なモデルプロバイダーから合成された入力を処理する際に運用の完全性を維持するために、アーキテクチャには以下の4つの防御的実装パターンを組み込む必要があります:

  • 識別子と文字列ベースのエンティティ解決: 一意の識別子のルックアップと任意のテキスト検索の両方をサポートするために、EntityStringQueryを実装します。外部モデルが完全なキーではなく説明ラベルを提供した場合でも、正規化された文字列マッチングによって部分的なフレーズを適切に処理できます。
  • インタラクティブなパラメータの明確化: 上位の推論プロバイダーが必要なパラメータを省略した場合、ハンドラはインタラクティブな値プロンプト(needsValueError)を呼び出すべきです。複数のエンティティが曖昧なフレーズに一致する場合は、システムで曖昧性解消(needsDisambiguationError)をトリガーしなければなりません。
  • 永続的な変更の冪等(べきとう)性: 会話型アシスタントはネットワークタイムアウトやユーザーによる曖昧な確認後にリクエストを再送信する可能性があるため、トランザクション的なインテントは、重複する副作用を防ぐために永続的な操作トークンを受け入れるか生成する必要があります。
  • 影響の大きい変更への明示的な確認: 金銭的な支払い、アカウントの修正、または不可逆的な削除を伴うアクションには、requestConfirmation()を使用して状態を変更する前にユーザーの明示的な同意を確保してください。
// エンジニアリング上の注意点: 以下のSwiftの例は、防御的なAppIntentの検証、エンティティクエリの曖昧性解消、 
// および冪等性を考慮したドメイン実行を示す参照アーキテクチャです。 
// 未公開のモデル委任フレームワークのためのApple公式の実装ではありません。

import Foundation
import AppIntents

// MARK: - セマンティックなApp Entityの表現
public struct BookingEntity: AppEntity {
    public static var defaultQuery = BookingQuery()
    public static var typeDisplayRepresentation: TypeDisplayRepresentation = "サービス予約"

    public var id: String
    public var serviceName: String
    public var referenceCode: String

    public var displayRepresentation: DisplayRepresentation {
        DisplayRepresentation(
            title: "\(serviceName)",
            subtitle: "参照コード: \(referenceCode)"
        )
    }
}

// MARK: - 防御的なエンティティクエリ・リゾルバー (ID & 文字列検索)
public struct BookingQuery: EntityStringQuery {
    public init() {}

    // 1. システムまたは永続キャッシュによって提供される正確な一意の識別子を解決
    public func entities(for identifiers: [String]) async throws -> [BookingEntity] {
        var resolvedEntities: [BookingEntity] = []
        for id in identifiers {
            if let entity = await BookingDataSource.shared.fetchBooking(byId: id) {
                resolvedEntities.append(entity)
            }
        }
        return resolvedEntities
    }

    // 2. 上位の推論モデルによって合成された自然言語の検索文字列を処理
    public func entities(matching string: String) async throws -> [BookingEntity] {
        return await BookingDataSource.shared.searchBookings(matching: string)
    }

    // 3. クエリパラメータが提供されない場合に初期の候補を返す
    public func suggestedEntities() async throws -> [BookingEntity] {
        return await BookingDataSource.shared.fetchAllActiveBookings()
    }
}

// MARK: - 防御的AppIntentパターンのリファレンス
public struct ConfirmBookingIntent: AppIntent {
    public static var title: LocalizedStringResource = "予約の確認"
    public static var description = IntentDescription(
        "検証済みの予約エンティティを使用して、アクティブな予約を確定します。",
        categoryName: "予約"
    )

    // 省略時や曖昧な場合に備えたインタラクティブなランタイム曖昧性解消
    @Parameter(
        title: "対象の予約",
        description: "確定する特定の予約エンティティ。"
    )
    public var targetBooking: BookingEntity?

    // 会話の再試行時における重複を防止する、呼び出し元から提供される冪等性トークン
    @Parameter(
        title: "クライアント変更トークン",
        description: "会話の再試行時における変更の重複を防ぐためのトークン。"
    )
    public var mutationToken: String?

    public init() {}

    public init(targetBooking: BookingEntity, mutationToken: String? = nil) {
        self.targetBooking = targetBooking
        self.mutationToken = mutationToken
    }

    // フォアグラウンドのUI階層から分離されたヘッドレス実行
    public func perform() async throws -> some IntentResult & ReturnsValue<Bool> & ProvidesDialog {
        // 防御的検証: エンティティパラメータが欠落している場合にシステムオーケストレーターに通知
        guard let booking = targetBooking else {
            throw $targetBooking.needsValueError(
                "どの予約を確定しますか?参照コードまたはサービス名で指定してください。"
            )
        }

        // ドメイン検証: 必要な操作パラメータを検証
        guard !booking.id.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty else {
            throw BookingDomainError.invalidIdentifier
        }

        // 破壊的または影響の大きい状態変更には、文書化された確認APIを呼び出してください:
        // try await requestConfirmation()

        // 冪等性の強制: トークンが提供されている場合、重複する変更を拒否
        if let token = mutationToken {
            let alreadyProcessed = await BookingStateManager.shared.isTokenProcessed(token)
            if alreadyProcessed {
                return .result(
                    value: true,
                    dialog: "この予約は既に確定されています。追加のアクションは行われません。"
                )
            }
        }

        // 分離されたアクター内でコアドメインロジックを実行
        do {
            let confirmationSuccess = try await BookingExecutionService.shared.executeConfirmation(
                bookingId: booking.id
            )

            // 状態変更に成功した場合、トークンを記録
            if let token = mutationToken, confirmationSuccess {
                await BookingStateManager.shared.recordToken(token)
            }

            return .result(
                value: confirmationSuccess,
                dialog: "\(booking.serviceName)の予約を正常に確定しました。"
            )
        } catch let domainError as BookingDomainError {
            // LocalizedErrorに準拠したドメインエラーを伝播
            throw domainError
        }
    }
}

// MARK: - 関連するドメインアクターと分離されたインフラストラクチャ
public enum BookingDomainError: Error, LocalizedError {
    case invalidIdentifier
    case reservationExpired
    case networkUnavailable

    public var errorDescription: String? {
        switch self {
        case .invalidIdentifier:
            return "提供された予約IDが無効か、不完全です。"
        case .reservationExpired:
            return "この予約は期限切れのため、これ以上確定できません。"
        case .networkUnavailable:
            return "予約サービスに接続できません。接続状況を確認してください。"
        }
    }
}

public actor BookingStateManager {
    public static let shared = BookingStateManager()
    private var processedTokens = Set<String>()

    public func isTokenProcessed(_ token: String) -> Bool {
        return processedTokens.contains(token)
    }

    public func recordToken(_ token: String) {
        processedTokens.insert(token)
    }
}

public actor BookingExecutionService {
    public static let shared = BookingExecutionService()

    public func executeConfirmation(bookingId: String) async throws -> Bool {
        // 非同期リモートサービスの変更をシミュレート
        try await Task.sleep(nanoseconds: 80_000_000)
        return true
    }
}

public actor BookingDataSource {
    public static let shared = BookingDataSource()

    public func fetchBooking(byId id: String) -> BookingEntity? {
        if id == "TC-2026-01" {
            return BookingEntity(id: id, serviceName: "技術相談", referenceCode: "TC-2026-01")
        }
        return nil
    }

    public func searchBookings(matching query: String) -> [BookingEntity] {
        let all = fetchAllActiveBookings()
        let normalized = query.trimmingCharacters(in: .whitespacesAndNewlines).lowercased()
        return all.filter {
            $0.serviceName.lowercased().contains(normalized) ||
            $0.referenceCode.lowercased().contains(normalized)
        }
    }

    public func fetchAllActiveBookings() -> [BookingEntity] {
        return [
            BookingEntity(id: "TC-2026-01", serviceName: "技術相談", referenceCode: "TC-2026-01"),
            BookingEntity(id: "HD-2026-88", serviceName: "ハードウェア診断", referenceCode: "HD-2026-88")
        ]
    }
}

システムアクションの境界とインテントの曖昧性解消

マルチモデル・オーケストレーションにおける根本的な課題は、ユーザーのリクエストがアプリの確実な状態に直接マッピングされない場合の曖昧性の管理です。アシスタントが外部の基盤モデルに解釈を委任すると、意味的な乖離のリスクが増大します。例えば「予約を確認して」というユーザーリクエストに対し、相対的な日付文字列、ビジネス名、あるいは非公式なサービス説明を含むインテントパラメータが生成される可能性があるためです。

AppleのApp Intentsアーキテクチャ内では、システムオーケストレーターがアプリの公開スキーマとアクティブなアシスタントインターフェース間の継続的なフィードバックループを通じて、パラメータ解決を処理します。適切な明確化や曖昧性解消のフックがなければ、システムは意図したエンティティを確実に解決できず、失敗したり機能が低下した対話に陥ったりする可能性があります。

iPhone上の専用Siriアプリで、デバイス間でプライベートに同期された会話履歴を表示している様子

+-------------------------------------------------------------------------+
|               防御的なパラメータ曖昧性解消のシーケンス                     |
+-------------------------------------------------------------------------+
|                                                                         |
|  [ 上位モデルが候補パラメータを合成 ]                                    |
|         |                                                               |
|         v                                                               |
|  [ ネイティブアプリのEntityStringQueryが入力を評価 ]                      |
|         |                                                               |
|         +---------------------------------------+                       |
|         | 一致する識別子を発見                | 曖昧、または複数一致     |
|         v                                       v                       |
|  [ 検証へ進む ]                       [ needsDisambiguationError() をスロー ] |
|         |                                       |                       |
|         |                                       v                       |
|         |                        [ システムが選択メニューを表示 ]       |
|         |                                       |                       |
|         |                                       v                       |
|         |                              [ ユーザーが対象エンティティを選択 ] |
|         |                                       |                       |
|         +<--------------------------------------+                       |
|         |                                                               |
|         v                                                               |
|  [ 確認済みのエンティティコンテキストで副作用インテントを実行 ]           |
|                                                                         |
+-------------------------------------------------------------------------+

予測可能な曖昧性解消を実現するために、開発者はApp Intentsフレームワークの対話機能を活用する必要があります:

  1. 構造化された候補提示: EntityStringQuery.entities(matching:)は、説明的なタイトルとサブタイトルで構成された候補のAppEntityインスタンスの配列を返す必要があります。ランタイム時に複数の候補が意味的に妥当である場合、needsDisambiguationError(among:dialog:)をスローすることで、システムにネイティブな選択ダイアログを表示するよう指示します。
  2. インテントダイアログの統合: ハンドラはProvidesDialogを利用して、会話のコンテキストをオーケストレーターに返す必要があります。操作が成功した場合や、復旧可能なビジネス状況に直面した場合、カスタマイズされたダイアログコンテナを返すことで、どのモデルが初期プロンプトを処理したかにかかわらず、ユーザーが正確なフィードバックを受け取れるようにします。
  3. ドメインエラーの適切な伝播: 予約期限切れや在庫切れといったビジネスルールによってアクションが完了できない場合、LocalizedErrorに準拠した型指定されたSwiftエラーをスローすることで、不透明なシステムコードではなく、実行可能なローカライズされた説明をアシスタントに提供させることができます。

粒度の高いクエリ解決とコミュニケーションの取れるエラー伝播に投資することで、Appleの統合モデルによって呼び出された場合でも、将来的なサードパーティ製の委任アシスタントによって呼び出された場合でも、アプリケーションの回復力を維持することが可能になります。

よくある質問 (FAQ)

Siriのモデル委任と、既存のChatGPT統合の違いは何ですか?
iOSにおける既存のChatGPT拡張機能は、浅いクエリの受け渡しを行います。Siriが幅広い事実に関する質問に答えられない場合、ユーザーの許可を得てプロンプトをChatGPTにルーティングし、その回答をテキストや画像として直接返します。iOS 27のプライベートフレームワークで特定されたモデル委任メカニズムは、より深い統合を意味します。このアーキテクチャでは、外部のAIエージェントがユーザープロンプトを受け取り、会話の目標を解釈し、Siriと調整してシステムアクションをリクエストできます。Appleの公開されているApp Intentsフレームワークは、サードパーティアプリがSiriやApple Intelligenceに対してサポート対象のアクションをどのように公開するかを個別に定義しています。
EUのデジタル市場法(DMA)は、Appleに対してサードパーティAIモデルがSiriを置き換えることを許可するよう義務付けていますか?
デジタル市場法の第6条(7)では、ゲートキーパーに対して、サードパーティプロバイダーに対し、公正かつ差別的でない条件でオペレーティングシステムの相互運用性を提供するよう求めています。欧州の規制当局は、これらの規定の下でプラットフォームレベルの音声アシスタントやデフォルトサービスのバンドルを精査してきました。DMAはシステムレベル機能への技術的アクセスを要求する法的枠組みを確立していますが、iOS 27で見つかったモデル委任コードが、特定のDMA執行アクションを満たすためだけに開発されたものであるとAppleが公式に確認したわけではありません。
委任されたインテントを処理する際、サードパーティモデルはプライベートなアプリデータに直接アクセスできますか?
公開されている証拠からは、未公開のサードパーティ推論プロバイダーに対する完全なデータアクセス契約は明らかになっていません。Appleが提供する既存のApp IntentsおよびSiri APIは、通常のアプリのサンドボックスや権限の境界を保護しますが、流出したデモによれば、委任された推論プロバイダーは、プランナーによって定義されたツール出力や、Siriのオーケストレーション層を通じて得られたパーソナルコンテキストを受け取ることができることが示されています。そのため開発者は、文書化されたアプリのサンドボックス保護と、まだ文書化されていないプライベート委任フレームワークのプライバシー契約を区別して捉える必要があります。

モバイルエンジニアリングチームのための戦略的ガイダンス

OSのインテリジェンスがよりモジュール化されていく状況に向けてアプリコードベースを準備するために、エンジニアリング組織は以下の技術的なマイルストーンを採用すべきです:

  1. App Intentカバレッジの監査と近代化: サポート対象のユースケースについては、新しい機能を公開する際に最新のSwift AppIntentスキーマを優先し、レガシーなSiriKit統合の移行を検討してください。すべての主要アクションには、明確で説明的なセマンティックメタデータを付随させる必要があります。

  2. 識別子と文字列ベースのエンティティ解決の実装: EntityQueryから継承された識別子の取得と任意のテキストマッチングの両方をサポートするために、EntityStringQueryを使用してください。リゾルバーは、異なる推論エンジンによって生成される多様なパラメータ形式に対応するため、正規化され小文字化された、あるいは部分的な文字列入力を処理できるようにします。

  3. 状態変更をバックグラウンドアクターに分離: インテントがヘッドレスでスレッドセーフなドメインサービスに対して動作するように、ビジネス実行メソッドをリファクタリングします。宣言された実行モードが明示的にフォアグラウンドコンテキストを必要としない限り、インテント実行においてアクティブなウィンドウシーンを想定しないでください。

  4. 2段階の変更検証の強制: 金銭的な支払い、アカウントの修正、または不可逆的な削除を伴う繊細なアクションについては、状態を変更する前にrequestConfirmation()を利用して明示的なユーザー同意を確認してください。

  5. エンドツーエンドのインテントテストスイートの確立: 境界条件の入力、空文字列、および不正なエンティティ参照が与えられた場合に、AppIntentハンドラが正しく動作することを確認するための自動単体テストおよび統合テストを構築してください。

参考文献

Share this article