エージェント フィード開発者向けドキュメント (プレビュー)

注記

コミュニティの関心グループが Yammer から Microsoft Viva Engage に移行されました。 Viva Engage コミュニティに参加し、最新のディスカッションに参加するには、「 Finance and Operations Viva Engage Community へのアクセスを要求する 」フォームに入力し、参加するコミュニティを選択します。

[この記事はプレリリース ドキュメントであり、変更されることがあります]

このガイダンスは、Dynamics 365 Finance and Operations バージョン 10.0.47 に適用されます。

この記事では、Dynamics 365 の財務および運用でエージェント フィードを使用して、イマーシブ ホームに表示されるフィード項目の作成、更新、読み取り、カスタマイズを行う方法について説明します。 エージェント フィードを使用すると、ERP エージェントは Dataverse カスタム API を介してアクション可能なフィード 項目を投稿し、Dynamics 365 の財務および運用にネイティブに格納し、セキュリティ、ランク付け、パーソナル化を尊重するカードとしてレンダリングできます。

概要

エージェント フィードは、エージェントとアプリケーションがイマーシブ ホームのユーザーにコンテキスト作業項目を表示できるようにするプラットフォーム機能を提供します。 エージェントはフィード項目を作成し、AI 支援ロジックを使用してランク付けされ、Dynamics 365 の財務および運用メニュー項目を使用してセキュリティ保護され、構成可能なカード プロバイダーを介してレンダリングされます。

イマーシブ ホームでエージェント フィードにデータを送信する方法

Dynamics 365 の財務および運用機能を有効にする

Dynamics 365 の財務と運用で、 機能管理 に移動し、機能を有効にします。

  • イマーシブ ホーム (運用に対応したプレビュー)
  • イマーシブ ホームのエージェント フィード (プレビュー)
  • カスタム API の生成 (プレビュー)

これらの機能は、フィード レンダリングとエージェント駆動型の統合の両方に必要です。

カスタム API を使用してフィード項目を作成および更新する

フィード項目は Dataverse カスタム API を介して作成および管理され、財務および運用ソリューション (バージョン 1.0.03291.1 以降) の Copilot の一部として提供されます。

サポートされている API:

  • msdyn_AgentFeedCreateFeedItemCustomApi
  • msdyn_AgentFeedUpdateFeedItemCustomApi

これらの API は、関連するエージェント フィード テーブル間でトランザクションの整合性を維持する調整された X++ 実装を通じて、Dynamics 365 の財務および運用テーブルにフィード データを書き込み、更新します。

仮想エンティティを使用してフィード項目を読み取る (省略可能)

エージェントがフィード項目を読み取る必要がある場合は、仮想エンティティ AgentFeedEntity を有効にします。

仮想エンティティを有効にする

  1. Available Finance and Operations Entity Dataverse テーブルを開きます。
  2. AgentFeedEntity 行を見つけます。
  3. [ 表示] 列を [はい] に設定します。
  4. 変更を保存します。

有効にすると、標準の Dataverse OData エンドポイントを使用してフィード項目のクエリを実行できます。

仮想エンティティの識別のスクリーンショット。

仮想エンティティを有効にするスクリーンショット。

エージェント フィード カードのレンダリングを制御する

既定のカードを使用してフィード項目をレンダリングする

エージェント フィード項目は、カード プロバイダーを介してイマーシブ ホームにレンダリングされます。 多くのシナリオでは、既定のカードの既定のプロバイダーで十分です。

既定のカードにレンダリングされたエージェント フィード項目のスクリーンショット。

既定では、フィード項目では DefaultAgentFeedCardProvider が使用され、次のレンダリングが行われます。

  • タイトル
  • サブタイトル
  • まとめ
  • 状態と期限

注釈を含む既定のカードにレンダリングされたエージェント フィード項目のスクリーンショット。

既定のカード プロバイダーでは、アクションはサポートされていません。

イマーシブ ホームでフィード項目のカスタム カード デザインを作成する方法

手順 1: カード プロバイダー列挙型を登録する AgentFeedCardProviderType (Application Common) に新しい値を作成します。

例: ExpenseCardProvider ExpenseCadProvider が追加された AgentFeedCardProviderType の ExpenseCardProvider スクリーンショット。

手順 2: カード プロバイダー クラスを実装する CardProvider インターフェイスを実装する X++ クラスを作成します。たとえば、"ImmersiveHomeExpenseCardProvider" という名前の新しい XPP クラスを作成します。

カード プロバイダーは、Web コンポーネント ライブラリを使用してコンテンツをレンダリングします。 カード プロバイダーのこの例では、経費関連のエージェント フィード項目をレンダリングします。

using System.ComponentModel.Composition;

[ExportAttribute(identifierStr(Dynamics.AX.Application.AgentFeedICardProvider))]
[ExportMetadataAttribute(classStr(AgentFeedICardProvider), enumLiteralStr(AgentFeedCardProviderType, ExpenseCardProvider))]
internal final class ImmersiveHomeExpenseCardProvider extends ImmersiveHomeBaseAgentFeedCardProvider
{
    public List addCardActions(AgentFeedIFeedDetails _agentFeedData)
    {
        List feedActions = new List(Types::Class);
        ImmersiveHomeAgentFeedAction action;
        AgentFeedMenuItem menuItem;

        // Use FeedItemId from the AgentFeedData to load any configured menu items
        str feedItemId = '';
        if (_agentFeedData && _agentFeedData.parmFeedItemId())
        {
            feedItemId = _agentFeedData.parmFeedItemId();
        }

        if (feedItemId)
        {
            // Find AgentFeedMenuItem rows linked to this FeedItemId and create menu actions
            while select menuItem where menuItem.FeedItemId == feedItemId
            {
                action = ImmersiveHomeAgentFeedAction::startBuilding(menuItem.MenuItem);
                action.parmActionType(ImmersiveHomeAgentFeedActionType::Menu);
                action.parmMenuItemName(menuItem.MenuItem); // AOT menu item name
                action.parmText(menuItem.MenuItem);
                feedActions.addEnd(action);
            }
        }

        return feedActions;
    }

    /// <summary>
    /// Customized card that renders the header, summary and an optional Due Date,
    /// and renders footer buttons from addCardActions.
    /// </summary>
    public Object generateCard(AgentFeedData _agentFeedData)
    {
        // Build header detail string: "Due by {DueDate} | {Subtitle}"
        str headerDetail;
        if (_agentFeedData.parmDueDate() != utcdatetimeNull())
        {
            // Use a simple string conversion for the datetime; replace with a formatter helper if desired
            str dueDateText = strFmt("%1", _agentFeedData.parmDueDate());
            headerDetail = strFmt("Due by %1 | %2", dueDateText, _agentFeedData.parmSubTitle());
        }
        else
        {
            headerDetail = _agentFeedData.parmSubTitle();
        }

        // Header (title + composed detail)
        var cardHeader = WebComponentHeaderDetail::startBuilding(_agentFeedData.parmTitle())
            .withDetail(headerDetail);

        // Body: column layout with summary and optional due date (still shown in body as well)
        var bodyLayout = WebComponentColumnLayout::startBuilding();
        bodyLayout.withColumn(WebComponentStaticText::startBuilding(_agentFeedData.parmSummary()));

        // Build card from header and attach body
        WebComponentCard feedCard = WebComponentCard::startBuildingFromHeader(cardHeader)
            .withBody(bodyLayout);

        // Footer: build from actions provided by addCardActions
        List immersivehomeFeedActions = this.addCardActions(_agentFeedData);
        if (immersivehomeFeedActions && immersivehomeFeedActions.elements() > 0)
        {
            var cardButtonGroup = WebComponentColumnLayout::startBuilding();

            ListIterator feedActionIterator = new ListIterator(immersivehomeFeedActions);
            while (feedActionIterator.more())
            {
                ImmersiveHomeAgentFeedAction feedAction = feedActionIterator.value();

                if (!feedAction)
                {
                    feedActionIterator.next();
                    continue;
                }

                if (feedAction.parmActionType() == ImmersiveHomeAgentFeedActionType::Menu)
                {
                    WebComponentButton button = WebComponentButton::newForMenuItem(feedAction.parmMenuItemName(), MenuItemType::Display, feedAction.parmArgs())
                        .withText(feedAction.parmText())
                        .withTooltip(feedAction.parmTooltip())
                        .withData(feedAction.parmData());

                    cardButtonGroup.withColumn(button);
                }
                else
                {
                    WebComponentAction action = WebComponentAction::construct(feedAction.parmTarget(), feedAction.parmEventName());
                    var button = WebComponentButton::startBuilding(feedAction.parmText(), action)
                        .withTooltip(feedAction.parmTooltip())
                        .withData(feedAction.parmData());

                    cardButtonGroup.withColumn(button);
                }

                feedActionIterator.next();
            }

            feedCard.withFooter(cardButtonGroup);
        }

        return feedCard;
    }

}

この例のカスタム ExpenseCardProvider は、エージェント フィード タイトル、期限、サブタイトル、エージェント フィードの概要、および複数のエージェント フィード メニュー項目を含むカードをレンダリングします。それぞれに、それに応じて移動するボタンとして表示されます。

ExpenseCardProvider によってレンダリングされ、そのコンテンツの注釈が表示された経費カードのスクリーンショット。

プロバイダー内でカードのフックを使用する

カード プロバイダーでは、次の 3 つのフックがサポートされています。

  • onLoad
  • onExpand
  • onSecure

これらのフックを使用して、それぞれのライフサイクルの変化と相互作用イベントに応答します。

各フックは、ログインしているユーザー コンテキスト内で実行され、PermissionsCheck で定義されたセキュリティ チェックを適用する必要があります。

フィード項目のライフ サイクル

フィード項目は、作成から表示の準備が整うまで、次のライフサイクル ステージを通過します。

  1. フィード項目は、カスタム API を使用して作成または更新されます。
  2. BaseRank は AIContext (リリース 10.0.47) から計算されます。
  3. レコードは AgentFeed テーブルに格納されます。
  4. メニュー項目を使用してセキュリティが適用されます。
  5. カードはイマーシブ ホームでレンダリングされます。
  6. ランク付けは実行時に動的に計算されます。

このリリースでは、BaseRank は一時的な決定論的マッピングを使用します。

  • 高値→ 0.99
  • 中 / デフォルト → 0.66
  • 低→ 0.33。 [ERP エージェント フィード | Word]

フィード項目セキュリティモデル

  • セキュリティは、PermissionsCheck を使用してアプリケーション チームに委任されます。
  • メニュー項目は、カードのレンダリング中に検証されます (onSecure)。
  • Dataverse セキュリティ ロールは、仮想エンティティへのアクセスを制御します。
  • プラグインの手順は、設計によって仮想エンティティに直接登録されません。

エンドポイント - フィード項目を作成する

POST {organizationUrl}/api/data/v9.2/msdyn_CreateAgentFeedItemCustomApi

名前空間のパラメーター msdyn_AgentFeedCreateFeedItemCustomApi_....

必須パラメーター - フィード項目を作成する

パラメーター タイプ 説明
肩書き String ユーザーに表示されるプライマリ カードのタイトル。 これは、プライマリ カード タイトルとして表示される、人間が判読できる短い見出しである必要があります。
例: "仕入先請求書の期限切れ"。
Subtitle String タイトルに即時コンテキストを提供するセカンダリ コンテキスト行 (フェーズ、アクション、またはフォーカス)
例: "Invoice PD 1042 is past due by five days" (請求書 PD 1042 は期限が 5 日経過しています。)
Correlationid String システム間のべき等性とトレースの GUID。
例: "7c2a4f64 8d3b 4b8d 9c11 1af33bb234d7"
まとめ String 概要は、エージェントが支援するビジネス状況またはタスクの簡潔な説明です。 プレーンテキスト。1 つまたは 2 つの文を目指します。
ステータス String 状態は、フィード項目の現在のライフサイクル状態です。
使用できる値: 未開始、進行中、完了、取り消し
Permissionscheck String フィード項目のセキュリティ チェックを実行し、アクション コントロールがレンダリングされるかどうかを判断するために使用される MenuItems のコンマ区切りのリスト。
例: "PURCHTABLE,VENDTABLE,IMMERSIVEHOME"
cardprovider テキスト カード プロバイダーは、対話型カードをレンダリングする UI/コンポーネント プロバイダーの識別子です。 登録済みのプロバイダー名と一致する必要があります。
例: "DefaultAgentFeedCardProvider"
aicontext String 必須キー TaskType、AgentSchema、RecordType、Priority、Category を含む JSON 文字列。 省略可能: BusinessImpact、SourceApp、WorkspaceLink。 有効な JSON で、ユーザー/アプリ コンテキストを指定する必要があります。
例: json{"TaskType":"Approval","AgentSchema":"msdyn_expenseagent","RecordType":"VendInvoice","Priority":"High","Category":"Procurement","BusinessImpact":"Avoid late fees","SourceApp":"FinanceAndOperations","WorkspaceLink":"https://contoso.com/workspace/123"}

省略可能なパラメーター - フィード項目を作成する

パラメーター タイプ 説明
duedate 日時 タスクの完了予定日/時刻。 ISO 8601 形式: YYYY-MM-DD または YYYY-MM-DDThh:mm:ssZ。 期限がない場合は空白のままにします。
例: "026-01-12"
fnorecord String ナビゲーションを許可する、Finance and Operations エンティティを参照する JSON 配列。
例: json[{"RefRecId":5637144576,"RefTableId":"VendInvoiceTable"},{"RefRecId":5637144588,"RefTableId":"PurchTable"}]

パラメーター ペイロードの例 - フィード項目の作成

{
  "msdyn_AgentFeedCreateFeedItemCustomApi_title": "Quarterly Budget Review",
  "msdyn_AgentFeedCreateFeedItemCustomApi_subtitle": "Review and finalize budget allocations",
  "msdyn_AgentFeedCreateFeedItemCustomApi_correlationid": "42d72a99-9786-4c28-8ab5-66a1451d27a5",
  "msdyn_AgentFeedCreateFeedItemCustomApi_summary": "Submitted expense reports require auditing for accuracy and compliance with company policy.",
  "msdyn_AgentFeedCreateFeedItemCustomApi_status": "Active",
  "msdyn_AgentFeedCreateFeedItemCustomApi_permissionscheck": "VENDTABLE, PURCHTABLE",
  "msdyn_AgentFeedCreateFeedItemCustomApi_cardprovider": "DefaultAgentFeedCardProvider",
  "msdyn_AgentFeedCreateFeedItemCustomApi_duedate": "2025-12-31",
  "msdyn_AgentFeedCreateFeedItemCustomApi_aicontext": "{\"TaskType\": \"Expense Validation\", \"AgentSchema\": \"msdyn_expenseagent\", \"RecordType\": \"Purchase Order\", \"Priority\": \"High\", \"Category\": \"Procurement\", \"BusinessImpact\": \"Payment Blocked\", \"User\": \"jane.smith@microsoft.com\", \"LastViewed\": \"2025-09-17T20:57:52Z\", \"SourceApp\": \"Excel\", \"WorkspaceLink\": \"aka.ms/workspace1\"}",
  "msdyn_AgentFeedCreateFeedItemCustomApi_fnorecord": "[{\"RefRecId\":5637150639,\"RefTableId\":\"CustInvoiceJour\"},{\"RefRecId\":5637150642,\"RefTableId\":\"CustInvoiceJour\"}]"
}

出力 - フィード項目の作成

パラメーター タイプ 説明
feeditemrecid RecId / 小数 フィード項目の識別子
Correlationid String システム間のべき等性とトレースのためのGUID

出力ペイロードの例

{
  "@odata.context": "[environment URL]/api/data/v9.2/$metadata#Microsoft.Dynamics.CRM.msdyn_AgentFeedCreateFeedItemCustomApiResponse",
  "msdyn_AgentFeedCreateFeedItemCustomApi_feeditemrecid": 1342198406,
  "msdyn_AgentFeedCreateFeedItemCustomApi_correlationid": "42d72a99-9786-4c28-8ab5-66a1451d27a5"
}

エンドポイント - フィード項目の更新

POST {organizationUrl}/api/data/v9.2/msdyn_UpdateAgentFeedItemCustomApi

名前空間内のパラメーター msdyn_AgentFeedUpdateFeedItemCustomApi_....

必須パラメーター - フィード項目の更新

パラメーター タイプ 説明
feeditemrecid RecId / 小数 フィード項目の識別子

省略可能なパラメーター - フィード項目の更新

パラメーター タイプ
肩書き String
Subtitle String
まとめ String
ステータス String
Permissionscheck String
duedate 日時
aicontext String

パラメーター ペイロードの例 - フィード項目の更新

{
  "msdyn_AgentFeedUpdateFeedItemCustomApi_feeditemrecid": "5637170826",
  "msdyn_AgentFeedUpdateFeedItemCustomApi_title": "HkH Quarterly Budget Review",
  "msdyn_AgentFeedUpdateFeedItemCustomApi_subtitle": "HkH Review and finalize budget allocations",
  "msdyn_AgentFeedUpdateFeedItemCustomApi_status": "Completed",
  "msdyn_AgentFeedUpdateFeedItemCustomApi_baserank": 0.72,
  "msdyn_AgentFeedUpdateFeedItemCustomApi_permissionscheck": "DIMENSIONFOCUSTABLE",
  "msdyn_AgentFeedUpdateFeedItemCustomApi_duedate": "2026-01-31",
  "msdyn_AgentFeedUpdateFeedItemCustomApi_aicontext": "{'AgentSchema': 'msdyn_AgentFeedUpdateFeedItemCustomApi_expenseagent', 'RecordType': 'Purchase Order', 'Priority': 'High', 'Category': 'Procurement', 'BusinessImpact': 'Payment Blocked', 'SourceApp': 'Excel', 'WorkspaceLink': 'aka.ms/workspace1'}",
  "msdyn_AgentFeedUpdateFeedItemCustomApi_cardprovider": "AgentFeedDefaultCard"
}

出力 - フィード項目の更新

パラメーター タイプ 説明
feeditemrecid RecId / 小数 フィード項目の識別子
Correlationid String システム間のべき等性とトレースのためのGUID

出力ペイロードの例

{
  "@odata.context": "[environment URL]/api/data/v9.2/$metadata#Microsoft.Dynamics.CRM.msdyn_AgentFeedUpdateFeedItemCustomApiResponse",
  "msdyn_AgentFeedUpdateFeedItemCustomApi_correlationid": "42d72a99-9786-4c28-8ab5-66a1451d27a5",
  "msdyn_AgentFeedUpdateFeedItemCustomApi_feeditemrecid": "5637170826"
}

仮想エンティティのドキュメント - AgentFeedEntity

  • AgentFeed データの一覧を取得するには、Dataverse によって提供される標準の (すぐに使用できる) 仮想エンティティ API エンドポイントを使用します。 {organizationUrl}/api/data/v9.2/mserp_agentfeedentities

  • 1 つのレコードの AgentFeed データを取得するには、Dataverse によって提供される標準の (すぐに使用できる) 仮想エンティティ API エンドポイントを使用します。 {organizationUrl}/api/data/v9.2/mserp_agentfeedentities(mserp_agentfeedentityid)

AgentFeedEntity のテーブル スキーマ

列名 タイプ 説明
TimeToLive UTC フィード項目の有効期限を制御します。は、クリーンアップと関連性に役立ちます。 正確な日時。
肩書き 250 - 文字列 フィード項目の人間が判読できるラベル
まとめ メモ フィード項目のコンテンツまたは意図の簡単な説明
Subtitle 250 - 文字列 サブタイトルは、タイトル (フェーズ、アクション、またはフォーカス) に即時コンテキストを提供するセカンダリ行です。
AIContext メモ パーソナル化とエージェントのランク付けの自然言語コンテキスト。
例: json{"TaskType":"Approval","AgentSchema":"msdyn_expenseagent","RecordType":"VendInvoice","Priority":"High","Category":"Procurement","BusinessImpact":"Avoid late fees","SourceApp":"FinanceAndOperations","WorkspaceLink":"https://contoso.com/workspace/123"}
PermissionsCheck メモ PermissionsCheck は、フィード項目のセキュリティ チェックを実行し、アクション コントロールがレンダリングされるかどうかを判断するために使用される MenuItems のコンマ区切りのリストです。
例: "PURCHTABLE,VENDTABLE,IMMERSIVEHOME"
カードプロバイダー 250 - 文字列 カードのレンダリングを担当する Builder クラスまたはハンドラー。 (フレンドリ名を受け入れ、バックエンドが正しい名前を処理します)カード プロバイダーは、対話型カードをレンダリングする UI/コンポーネント プロバイダーの識別子です。 登録済みのプロバイダー名と一致する必要があります。
例: "DefaultAgentFeedCardProvider"
FeedItemRecId recId FnO システムにおけるレコードの recID 品目の固有識別子。
FeedItemID Sysguidstring - string 仮想エンティティ作成の Guid。 CustomAPI を介して自動生成
ステータス ENUM 状態は、フィード項目の現在のライフサイクル状態です。 使用できる値: 未開始、進行中、完了、取り消し。
DueDate UTC 日付/時刻 タスクの完了予定日/時刻。 ISO 8601 形式: YYYY-MM-DD または YYYY-MM-DDThh:mm:ssZ。 タイム バインドされていない場合は空白。
CorrelationId Sysguidstring - 文字列 関連付け ID は、システム全体のべき等性と追跡可能性 (ログ記録、重複除去、再試行) に使用される GUID です。 フィード項目の作成時にアプリ チームによって設定
BaseRank 実数 AI コンテキスト フィールドの Priority タグは、BaseRank の値に影響します。
値の定義: 優先度が "高" の場合、基本ランク = 0.99。 優先度が "低" の場合、基本ランクは 0.33 です。 "中"、空白、またはその他の値の場合、既定の基本ランクは 0.66 です。