🔁

Microsoft 365 Agents SDK での状態管理の変更に関するエラーについて

に公開

はじめに

Microsoft 365 Agents SDK では、状態管理に使用していた IStatePropertyAccessor インターフェースは非推奨になりました。Microsoft Bot Framework では、IStatePropertyAccessor インターフェースによって状態が自動的に保存されていました。Microsoft 365 Agents SDK では、ターンの前後に ITurnState インターフェースの読み込みと保存が行われます。ITurnState インターフェースは、ConversationState クラスや UserState クラスなどの状態クラスをまとめて管理します。

Microsoft Bot Framework では ConversationState クラスおよび UserState クラスは DI によって解決されます。これをそのまま Microsoft 365 Agents SDK に移行し、AgentApplication クラスを使用した場合、自動読み込みと自動保存は機能しません。具体的には、次のエラーが発生します。

{{name}} is not loaded.

原因

AgentApplication クラスでは、ITurnState インターフェースのインスタンスを初期化するために AgentApplicationOptions クラスを使用します。AgentApplicationOptions クラスには TurnStateFactory メソッドがあります。このメソッドが null であれば新しい TurnState クラスのインスタンスを初期化し、null でなければそのメソッドで初期化します。

このとき、TurnState クラスは ConversationState クラスおよび UserState クラスを DI から取得しません。そのため、DI で管理されているインスタンスと AgentApplication クラスで管理されているインスタンスが異なります。結果として、自動読み込みと自動保存が機能しません。

対応方法

AgentApplicationOptions クラスの TurnStateFactory メソッドで、値を DI から返すように変更します。

- _ = builder.AddAgentApplicationOptions();
+ _ = builder.Services.AddSingleton((provider) => new AgentApplicationOptions(provider.GetRequiredService<IStorage>())
+ {
+     TurnStateFactory = () => new TurnState(
+         provider.GetRequiredService<ConversationState>(),
+         provider.GetRequiredService<UserState>(),
+         new TempState()
+     )
+ });

おわりに

Microsoft Bot Framework から Microsoft 365 Agents SDK への移行ガイダンスにも、次の記載があります。

https://learn.microsoft.com/ja-jp/microsoft-365/agents-sdk/bf-migration-dotnet?WT.mc_id=M365-MVP-5002941

この作業を単なるパッケージの入れ替えではなく、最新化の取り組みとして扱います。

互換性はあまり高くないものと考え、十分な検証をすることが重要です。

Discussion