次の方法で共有


セマンティック カーネルからエージェント フレームワークへの移行ガイド

Microsoft Agent Framework の利点

  • 簡略化された API: 複雑さと定型コードの削減。
  • パフォーマンスの向上: オブジェクトの作成とメモリ使用量を最適化しました。
  • 統合インターフェイス: さまざまな AI プロバイダー間で一貫したパターン。
  • 開発者エクスペリエンスの強化: より直感的で検出可能な API。

次のセクションでは、セマンティック カーネル エージェント フレームワークと Microsoft Agent Framework の主な違いをまとめ、コードの移行に役立ちます。

1. 名前空間の更新

セマンティック カーネル

using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Agents;

エージェント フレームワーク

Agent Framework 名前空間は Microsoft.Agents.AI下にあります。 Agent Framework は、コンポーネント間の通信に、 Microsoft.Extensions.AI のコア AI メッセージとコンテンツ タイプを使用します。

using Microsoft.Extensions.AI;
using Microsoft.Agents.AI;

2. エージェント作成の簡略化

セマンティック カーネル

セマンティック カーネル内のすべてのエージェントは、 Kernel インスタンスに依存し、指定されていない場合は空の Kernel を持っています。

 Kernel kernel = Kernel
    .AddOpenAIChatClient(modelId, apiKey)
    .Build();

 ChatCompletionAgent agent = new() { Instructions = ParrotInstructions, Kernel = kernel };

Azure AI Foundry では、それを使用するローカル エージェント クラスを作成する前に、エージェント リソースをクラウドに作成する必要があります。

PersistentAgentsClient azureAgentClient = AzureAIAgent.CreateAgentsClient(azureEndpoint, new AzureCliCredential());

PersistentAgent definition = await azureAgentClient.Administration.CreateAgentAsync(
    deploymentName,
    instructions: ParrotInstructions);

AzureAIAgent agent = new(definition, azureAgentClient);

エージェント フレームワーク

Agent Framework でのエージェントの作成は、すべてのメイン プロバイダーによって提供される拡張機能により簡単になります。

AIAgent openAIAgent = chatClient.CreateAIAgent(instructions: ParrotInstructions);
AIAgent azureFoundryAgent = await persistentAgentsClient.CreateAIAgentAsync(instructions: ParrotInstructions);
AIAgent openAIAssistantAgent = await assistantClient.CreateAIAgentAsync(instructions: ParrotInstructions);

さらに、ホストされるエージェント プロバイダーの場合は、 GetAIAgent メソッドを使用して、既存のホストされているエージェントからエージェントを取得することもできます。

AIAgent azureFoundryAgent = await persistentAgentsClient.GetAIAgentAsync(agentId);

3. エージェント スレッドの作成

セマンティック カーネル

呼び出し元はスレッドの種類を認識し、手動で作成する必要があります。

// Create a thread for the agent conversation.
AgentThread thread = new OpenAIAssistantAgentThread(this.AssistantClient);
AgentThread thread = new AzureAIAgentThread(this.Client);
AgentThread thread = new OpenAIResponseAgentThread(this.Client);

エージェント フレームワーク

エージェントは、スレッドの作成を担当します。

// New.
AgentThread thread = agent.GetNewThread();

4. ホストされたエージェント スレッドのクリーンアップ

このケースは、まだホストされているスレッドを提供するいくつかの AI プロバイダーにのみ適用されます。

セマンティック カーネル

スレッドには、 self 削除メソッドがあります。

OpenAI アシスタント プロバイダー:

await thread.DeleteAsync();

エージェント フレームワーク

OpenAI Responses では、会話の処理方法を簡略化する新しい会話モデルが導入されました。 この変更により、現在非推奨になった OpenAI Assistants モデルと比較して、ホストされたスレッド管理が簡略化されます。 詳細については、 OpenAI Assistants 移行ガイドを参照してください。

Agent Framework には、ホストされているスレッドまたはスレッドの削除をサポートするプロバイダーがないため、 AgentThread の種類にスレッド削除 API はありません。 この設計は、より多くのプロバイダーが応答ベースのアーキテクチャに移行するにつれて、より一般的になります。

スレッドの削除が必要で、プロバイダーが許可する場合、呼び出し元は作成されたスレッドを追跡し、後でプロバイダーの SDK を使用して必要に応じて削除する必要 があります

OpenAI アシスタント プロバイダー:

await assistantClient.DeleteThreadAsync(thread.ConversationId);

5. ツール登録

セマンティック カーネル

関数をツールとして公開するには、次の手順を実行する必要があります。

  1. [KernelFunction]属性を使用して関数を装飾します。
  2. Plugin クラスを持っているか、KernelPluginFactoryを使用して関数をラップします。
  3. プラグインを追加する Kernel があります。
  4. Kernelをエージェントに渡します。
KernelFunction function = KernelFunctionFactory.CreateFromMethod(GetWeather);
KernelPlugin plugin = KernelPluginFactory.CreateFromFunctions("KernelPluginName", [function]);
Kernel kernel = ... // Create kernel
kernel.Plugins.Add(plugin);

ChatCompletionAgent agent = new() { Kernel = kernel, ... };

エージェント フレームワーク

Agent Framework では、1 回の呼び出しで、エージェント作成プロセスにツールを直接登録できます。

AIAgent agent = chatClient.CreateAIAgent(tools: [AIFunctionFactory.Create(GetWeather)]);

6. エージェントの非ストリーミング呼び出し

InvokeからRun、戻り値の型、パラメーターAgentRunOptionsまでのメソッド名に主な違いがあります。

セマンティック カーネル

非ストリーミングでは、複数のエージェント メッセージを返すストリーミング パターン IAsyncEnumerable<AgentResponseItem<ChatMessageContent>> を使用します。

await foreach (AgentResponseItem<ChatMessageContent> result in agent.InvokeAsync(userInput, thread, agentOptions))
{
    Console.WriteLine(result.Message);
}

エージェント フレームワーク

非ストリーミングは、複数のメッセージを含むことができるエージェント応答を含む単一の AgentRunResponse を返します。 実行のテキスト結果は、 AgentRunResponse.Text または AgentRunResponse.ToString()で使用できます。 応答の一部として作成されたすべてのメッセージは、 AgentRunResponse.Messages リストに返されます。 これには、ツール呼び出しメッセージ、関数の結果、推論の更新、および最終的な結果が含まれる場合があります。

AgentRunResponse agentResponse = await agent.RunAsync(userInput, thread);

7. エージェント ストリーミング呼び出し

主な違いは、 Invoke から Run、戻り値の型、パラメーター AgentRunOptionsまでのメソッド名です。

セマンティック カーネル

await foreach (StreamingChatMessageContent update in agent.InvokeStreamingAsync(userInput, thread))
{
    Console.Write(update);
}

エージェント フレームワーク

Agent Framework にも同様のストリーミング API パターンがあります。主な違いは、更新ごとにエージェント関連の情報を含む AgentRunResponseUpdate オブジェクトを返す点です。

AIAgent の基になるサービスによって生成されたすべての更新が返されます。 エージェントのテキスト結果は、 AgentRunResponse.Text 値を連結することによって使用できます。

await foreach (AgentRunResponseUpdate update in agent.RunStreamingAsync(userInput, thread))
{
    Console.Write(update); // Update is ToString() friendly
}

8. ツール関数シグネチャ

問題: セマンティック カーネル プラグイン メソッドには [KernelFunction] 属性が必要です。

public class MenuPlugin
{
    [KernelFunction] // Required.
    public static MenuItem[] GetMenu() => ...;
}

解決策: Agent Framework では、属性なしでメソッドを直接使用できます。

public class MenuTools
{
    [Description("Get menu items")] // Optional description.
    public static MenuItem[] GetMenu() => ...;
}

9. オプションの構成

問題: セマンティック カーネルでの複雑なオプションの設定。

OpenAIPromptExecutionSettings settings = new() { MaxTokens = 1000 };
AgentInvokeOptions options = new() { KernelArguments = new(settings) };

解決策: Agent Framework の簡略化されたオプション。

ChatClientAgentRunOptions options = new(new() { MaxOutputTokens = 1000 });

Important

この例では、実装固有のオプションを ChatClientAgentに渡す方法を示します。 すべての AIAgentsChatClientAgentRunOptionsをサポートしているわけではありません。 ChatClientAgent は、基になる推論サービスに基づいてエージェントを構築するために提供されるため、 MaxOutputTokensなどの推論オプションをサポートします。

10. 依存関係の挿入

セマンティック カーネル

エージェントの抽象化はすべて Kernel プロパティを使用して初期化する必要があります。そのため、エージェントを作成できるようにするには、サービス コンテナーにKernel登録が必要です。

セマンティック カーネルは、エージェントの基本抽象化クラスとして Agent 型を使用します。

services.AddKernel().AddProvider(...);
serviceContainer.AddKeyedSingleton<SemanticKernel.Agents.Agent>(
    TutorName,
    (sp, key) =>
        new ChatCompletionAgent()
        {
            // Passing the kernel is required.
            Kernel = sp.GetRequiredService<Kernel>(),
        });

エージェント フレームワーク

Agent Framework は、基本抽象化クラスとして AIAgent 型を提供します。

services.AddKeyedSingleton<AIAgent>(() => client.CreateAIAgent(...));

11. エージェントの種類の統合

セマンティック カーネル

セマンティック カーネルは、次に例を示すさまざまなサービスに固有のエージェント クラスを提供します。

  • ChatCompletionAgent チャット補完ベースの推論サービスで使用できます。
  • OpenAIAssistantAgent OpenAI Assistants サービスで使用できます。
  • AzureAIAgent Azure AI Foundry Agents サービスで使用するために使用します。

エージェント フレームワーク

Agent Framework は、単一のエージェントの種類 ( ChatClientAgent) を介して、上記のすべてのサービスをサポートします。

ChatClientAgent は、 IChatClient インターフェイスを実装する SDK を提供する基になるサービスを使用してエージェントを構築するために使用できます。

主な違い

コードの移行に役立つセマンティック カーネル エージェント フレームワークと Microsoft Agent Framework の主な違いの概要を次に示します。

1. 更新プログラムのパッケージ化とインポート

セマンティック カーネル

セマンティック カーネル パッケージは、 semantic-kernel としてインストールされ、 semantic_kernelとしてインポートされます。 パッケージには、さまざまな AI プロバイダーやその他の機能のさまざまな依存関係をインストールするためにインストールできる多数の extras もあります。

from semantic_kernel import Kernel
from semantic_kernel.agents import ChatCompletionAgent

エージェント フレームワーク

Agent Framework パッケージは agent-framework としてインストールされ、 agent_frameworkとしてインポートされます。 Agent Framework は異なる方法で構築され、コア機能を含むコア パッケージ agent-framework-core があり、そのコア パッケージに依存するパッケージが複数存在します ( agent-framework-azure-aiagent-framework-mem0agent-framework-copilotstudioなど)。 pip install agent-framework --pre 実行すると、コア パッケージと すべての パッケージがインストールされるため、すべての機能をすばやく使い始めることができます。 必要なものがわかっているため、パッケージの数を減らす準備ができたら、必要なパッケージのみをインストールできます。たとえば、Azure AI Foundry と Mem0 のみを使用する予定の場合は、これら 2 つのパッケージのみをインストールできます。 pip install agent-framework-azure-ai agent-framework-mem0 --preagent-framework-core はこれら 2 つのパッケージへの依存関係であるため、自動的にインストールされます。

パッケージが分割されていても、インポートはすべて agent_frameworkから、またはモジュールです。 たとえば、Azure AI Foundry のクライアントをインポートするには、次のようにします。

from agent_framework.azure import AzureAIAgentClient

最もよく使用される型の多くは、 agent_frameworkから直接インポートされます。

from agent_framework import ChatMessage, ChatAgent

2. エージェントの種類の統合

セマンティック カーネル

セマンティック カーネルは、ChatCompletionAgent、AzureAIAgent、OpenAIAssistantAgent など、さまざまなサービスに固有のエージェント クラスを提供します。 セマンティック カーネルのエージェントの種類を参照してください。

エージェント フレームワーク

エージェント フレームワークでは、ほとんどのエージェントは、Azure AI Foundry、OpenAI ChatCompletion、OpenAI Responses などのすべてのChatAgent ベースのサービスで使用できるChatClientを使用して構築されます。 エージェントには、Copilot Studio で使用する CopilotStudioAgent と A2A で使用する A2AAgent の 2 つがあります。

すべての組み込みエージェントは、BaseAgent (from agent_framework import BaseAgent) に基づいています。 また、すべてのエージェントは、 AgentProtocol (from agent_framework import AgentProtocol) インターフェイスと一貫性があります。

3. エージェント作成の簡略化

セマンティック カーネル

セマンティック カーネル内のすべてのエージェントは、 Kernel インスタンスに依存し、指定されていない場合は空の Kernel を持つことになります。

from semantic_kernel.agents import ChatCompletionAgent
from semantic_kernel.connectors.ai.open_ai import OpenAIChatCompletion

agent = ChatCompletionAgent(
    service=OpenAIChatCompletion(),
    name="Support",
    instructions="Answer in one sentence.",
)

エージェント フレームワーク

Agent Framework でのエージェントの作成は、次の 2 つの方法で直接実行できます。

from agent_framework.azure import AzureAIAgentClient
from agent_framework import ChatMessage, ChatAgent

agent = ChatAgent(chat_client=AzureAIAgentClient(credential=AzureCliCredential()), instructions="You are a helpful assistant")

または、チャット クライアントによって提供される便利なメソッドを使用します。

from agent_framework.azure import AzureOpenAIChatClient
from azure.identity import AzureCliCredential
agent = AzureOpenAIChatClient(credential=AzureCliCredential()).create_agent(instructions="You are a helpful assistant")

ダイレクト メソッドは、エージェントに対して設定できるすべてのパラメーターを公開します。 便利なメソッドにはサブセットが含まれていますが、ダイレクト メソッドを内部的に呼び出すので、同じパラメーター セットを渡すことができます。

4. エージェント スレッドの作成

セマンティック カーネル

呼び出し元はスレッドの種類を認識し、手動で作成する必要があります。

from semantic_kernel.agents import ChatHistoryAgentThread

thread = ChatHistoryAgentThread()

エージェント フレームワーク

エージェントは、新しいスレッドを作成するように求めることができます。

agent = ...
thread = agent.get_new_thread()

その後、次の 3 つの方法のいずれかでスレッドが作成されます。

  1. エージェントに thread_id (または conversation_id など) が設定されている場合、その ID を持つスレッドが基になるサービスに作成されます。 スレッドに service_thread_idが設定されると、そのスレッドを使用してメモリにメッセージを格納できなくなります。 これは、サービス側スレッドの概念を持つエージェントにのみ適用されます。 Azure AI Foundry Agents や OpenAI Assistants など。
  2. エージェントに chat_message_store_factory が設定されている場合は、そのファクトリを使用してメッセージ ストアを作成し、それを使用してメモリ内スレッドを作成します。 その後、 store パラメーターが True に設定されたエージェントでは使用できなくなります。
  3. 前の設定がどちらも設定されていない場合は、 uninitialized と見なされ、使用方法に応じて、インメモリ スレッドまたはサービス スレッドになります。

エージェント フレームワーク

OpenAI Responses では、会話の処理方法を簡略化する新しい会話モデルが導入されました。 これにより、現在非推奨になった OpenAI Assistants モデルと比較して、ホストされたスレッド管理が簡略化されます。 詳細については、 OpenAI Assistants 移行ガイドを参照してください。

Agent Framework では、すべてのプロバイダーがホストされたスレッドまたはスレッドの削除をサポートしているわけではないので、 AgentThread の種類にスレッド削除 API はありません。これは、より多くのプロバイダーが応答ベースのアーキテクチャに移行するにつれて一般的になります。

スレッドの削除が必要で、プロバイダーがこれを許可する場合、呼び出し元は作成されたスレッドを追跡し、後でプロバイダーの SDK を使用して必要に応じて削除する必要 があります

OpenAI アシスタント プロバイダー:

# OpenAI Assistants threads have self-deletion method in Semantic Kernel
await thread.delete_async()

5. ツール登録

セマンティック カーネル

関数をツールとして公開するには、次の手順を実行する必要があります。

  1. @kernel_functionデコレーターで関数を装飾します。
  2. Plugin クラスを持っているか、カーネル プラグイン ファクトリを使用して関数をラップします。
  3. プラグインを追加する Kernel があります。
  4. Kernelをエージェントに渡します。
from semantic_kernel.functions import kernel_function

class SpecialsPlugin:
    @kernel_function(name="specials", description="List daily specials")
    def specials(self) -> str:
        return "Clam chowder, Cobb salad, Chai tea"

agent = ChatCompletionAgent(
    service=OpenAIChatCompletion(),
    name="Host",
    instructions="Answer menu questions accurately.",
    plugins=[SpecialsPlugin()],
)

エージェント フレームワーク

1 回の呼び出しで、エージェント作成プロセスでツールを直接登録できます。 Agent Framework には、複数の関数をラップするプラグインの概念はありませんが、必要に応じてそれを行うことができます。

ツールを作成する最も簡単な方法は、Python 関数を作成することです。

def get_weather(location: str) -> str:
    """Get the weather for a given location."""
    return f"The weather in {location} is sunny."

agent = chat_client.create_agent(tools=get_weather)

tools パラメーターは、エージェントの作成、runメソッドとrun_streamメソッド、およびget_responseメソッドとget_streaming_responseメソッドの両方に存在し、リストまたは単一の関数の両方としてツールを提供できます。

関数の名前がツールの名前になり、docstring がツールの説明になります。パラメーターに説明を追加することもできます。

from typing import Annotated

def get_weather(location: Annotated[str, "The location to get the weather for."]) -> str:
    """Get the weather for a given location."""
    return f"The weather in {location} is sunny."

最後に、デコレーターを使用して、ツールの名前と説明をさらにカスタマイズできます。

from typing import Annotated
from agent_framework import ai_function

@ai_function(name="weather_tool", description="Retrieves weather information for any location")
def get_weather(location: Annotated[str, "The location to get the weather for."])
    """Get the weather for a given location."""
    return f"The weather in {location} is sunny."

これは、複数のツールをメソッドとして持つクラスを作成する場合にも機能します。

エージェントを作成するときに、 tools パラメーターに渡すことで、関数ツールをエージェントに提供できるようになりました。

class Plugin:

    def __init__(self, initial_state: str):
        self.state: list[str] = [initial_state]

    def get_weather(self, location: Annotated[str, "The location to get the weather for."]) -> str:
        """Get the weather for a given location."""
        self.state.append(f"Requested weather for {location}. ")
        return f"The weather in {location} is sunny."

    def get_weather_details(self, location: Annotated[str, "The location to get the weather details for."]) -> str:
        """Get detailed weather for a given location."""
        self.state.append(f"Requested detailed weather for {location}. ")
        return f"The weather in {location} is sunny with a high of 25°C and a low of 15°C."

plugin = Plugin("Initial state")
agent = chat_client.create_agent(tools=[plugin.get_weather, plugin.get_weather_details])

... # use the agent

print("Plugin state:", plugin.state)

クラス内の関数を @ai_function で修飾して、ツールの名前と説明をカスタマイズすることもできます。

このメカニズムは、接続、シークレットなど、LLM で提供できない追加の入力を必要とするツールにも役立ちます。

互換性: Agent Framework ツールとしての KernelFunction の使用

(プロンプトまたはメソッドから) KernelFunction インスタンスを含むセマンティック カーネル コードが既にある場合は、 .as_agent_framework_tool メソッドを使用して、それらを Agent Framework ツールに変換できます。

Important

この機能には、 semantic-kernel バージョン 1.38 以降が必要です。

プロンプト テンプレートからの KernelFunction の使用

from semantic_kernel import Kernel
from semantic_kernel.functions import KernelFunctionFromPrompt
from semantic_kernel.connectors.ai.open_ai import OpenAIChatCompletion, OpenAIChatPromptExecutionSettings
from semantic_kernel.prompt_template import KernelPromptTemplate, PromptTemplateConfig
from agent_framework.openai import OpenAIResponsesClient

# Create a kernel with services and plugins
kernel = Kernel()
# will get the api_key and model_id from the environment
kernel.add_service(OpenAIChatCompletion(service_id="default"))

# Create a function from a prompt template that uses plugin functions
function_definition = """
Today is: {{time.date}}
Current time is: {{time.time}}

Answer to the following questions using JSON syntax, including the data used.
Is it morning, afternoon, evening, or night (morning/afternoon/evening/night)?
Is it weekend time (weekend/not weekend)?
"""

prompt_template_config = PromptTemplateConfig(template=function_definition)
prompt_template = KernelPromptTemplate(prompt_template_config=prompt_template_config)

# Create a KernelFunction from the prompt
kernel_function = KernelFunctionFromPrompt(
    description="Determine the kind of day based on the current time and date.",
    plugin_name="TimePlugin",
    prompt_execution_settings=OpenAIChatPromptExecutionSettings(service_id="default", max_tokens=100),
    function_name="kind_of_day",
    prompt_template=prompt_template,
)

# Convert the KernelFunction to an Agent Framework tool
agent_tool = kernel_function.as_agent_framework_tool(kernel=kernel)

# Use the tool with an Agent Framework agent
agent = OpenAIResponsesClient(model_id="gpt-4o").create_agent(tools=agent_tool)
response = await agent.run("What kind of day is it?")
print(response.text)

メソッドからの KernelFunction の使用

from semantic_kernel.functions import kernel_function
from agent_framework.openai import OpenAIResponsesClient

# Create a plugin class with kernel functions
@kernel_function(name="get_weather", description="Get the weather for a location")
def get_weather(self, location: str) -> str:
    return f"The weather in {location} is sunny."

# Get the KernelFunction and convert it to an Agent Framework tool
agent_tool = get_weather.as_agent_framework_tool()

# Use the tool with an Agent Framework agent
agent = OpenAIResponsesClient(model_id="gpt-4o").create_agent(tools=agent_tool)
response = await agent.run("What's the weather in Seattle?")
print(response.text)

create_search_functionでの VectorStore の使用

セマンティック カーネルの VectorStore と Agent Framework の統合を使用することもできます。 ベクター ストア コレクションの create_search_function メソッドは、Agent Framework ツールに変換できる KernelFunction を返します。

from semantic_kernel import Kernel
from semantic_kernel.connectors.ai.open_ai import OpenAITextEmbedding
from semantic_kernel.connectors.azure_ai_search import AzureAISearchCollection
from semantic_kernel.functions import KernelParameterMetadata
from agent_framework.openai import OpenAIResponsesClient

# Define your data model
class HotelSampleClass:
    HotelId: str
    HotelName: str
    Description: str
    # ... other fields

# Create an Azure AI Search collection
collection = AzureAISearchCollection[str, HotelSampleClass](
    record_type=HotelSampleClass,
    embedding_generator=OpenAITextEmbedding()
)

async with collection:
    await collection.ensure_collection_exists()
    # Load your records into the collection
    # await collection.upsert(records)

    # Create a search function from the collection
    search_function = collection.create_search_function(
        description="A hotel search engine, allows searching for hotels in specific cities.",
        search_type="keyword_hybrid",
        filter=lambda x: x.Address.Country == "USA",
        parameters=[
            KernelParameterMetadata(
                name="query",
                description="What to search for.",
                type="str",
                is_required=True,
                type_object=str,
            ),
            KernelParameterMetadata(
                name="city",
                description="The city that you want to search for a hotel in.",
                type="str",
                type_object=str,
            ),
            KernelParameterMetadata(
                name="top",
                description="Number of results to return.",
                type="int",
                default_value=5,
                type_object=int,
            ),
        ],
        string_mapper=lambda x: f"(hotel_id: {x.record.HotelId}) {x.record.HotelName} - {x.record.Description}",
    )

    # Convert the search function to an Agent Framework tool
    search_tool = search_function.as_agent_framework_tool()

    # Use the tool with an Agent Framework agent
    agent = OpenAIResponsesClient(model_id="gpt-4o").create_agent(
        instructions="You are a travel agent that helps people find hotels.",
        tools=search_tool
    )
    response = await agent.run("Find me a hotel in Seattle")
    print(response.text)

このパターンは、任意のセマンティック カーネル VectorStore コネクタ (Azure AI Search、Qdrant、Pinecone など) で動作し、Agent Framework エージェントで既存のベクター検索インフラストラクチャを活用できます。

この互換性レイヤーを使用すると、セマンティック カーネルから Agent Framework にコードを段階的に移行し、Agent Framework の簡略化されたエージェントの作成と実行パターンを利用しながら、既存の KernelFunction 実装を再利用できます。

6. エージェントの非ストリーミング呼び出し

メソッド名には、 invoke から run、戻り値の型 ( AgentRunResponseなど) とパラメーターの主な違いがあります。

セマンティック カーネル

非ストリーミング呼び出しでは、非同期反復子パターンを使用して複数のエージェント メッセージを返します。

async for response in agent.invoke(
    messages=user_input,
    thread=thread,
):
    print(f"# {response.role}: {response}")
    thread = response.thread

そして、最終的な応答を得るための便利な方法があった:

response = await agent.get_response(messages="How do I reset my bike tire?", thread=thread)
print(f"# {response.role}: {response}")

エージェント フレームワーク

ストリーミング以外の実行では、複数のメッセージを含むことができるエージェント応答を含む単一の AgentRunResponse が返されます。 実行のテキスト結果は、 response.text または str(response)で使用できます。 応答の一部として作成されたすべてのメッセージは、 response.messages リストに返されます。 これには、ツール呼び出しメッセージ、関数の結果、推論の更新、最終結果が含まれる場合があります。

agent = ...

response = await agent.run(user_input, thread)
print("Agent response:", response.text)

7. エージェント ストリーミング呼び出し

メソッド名の主な違いは、 invoke から run_stream、戻り値の型 (AgentRunResponseUpdate) とパラメーターです。

セマンティック カーネル

async for update in agent.invoke_stream(
    messages="Draft a 2 sentence blurb.",
    thread=thread,
):
    if update.message:
        print(update.message.content, end="", flush=True)

エージェント フレームワーク

同様のストリーミング API パターンと主な違いは、更新ごとにより多くのエージェント関連情報を含む AgentRunResponseUpdate オブジェクトを返す点です。

エージェントの基になるサービスによって生成されたすべてのコンテンツが返されます。 エージェントの最終的な結果は、 update 値を 1 つの応答に結合することによって使用できます。

from agent_framework import AgentRunResponse
agent = ...
updates = []
async for update in agent.run_stream(user_input, thread):
    updates.append(update)
    print(update.text)

full_response = AgentRunResponse.from_agent_run_response_updates(updates)
print("Full agent response:", full_response.text)

これを直接行うことさえできます。

from agent_framework import AgentRunResponse
agent = ...
full_response = AgentRunResponse.from_agent_response_generator(agent.run_stream(user_input, thread))
print("Full agent response:", full_response.text)

8. オプションの構成

問題: セマンティック カーネルでの複雑なオプションの設定

from semantic_kernel.connectors.ai.open_ai import OpenAIPromptExecutionSettings

settings = OpenAIPromptExecutionSettings(max_tokens=1000)
arguments = KernelArguments(settings)

response = await agent.get_response(user_input, thread=thread, arguments=arguments)

解決策: Agent Framework の簡略化されたオプション

Agent Framework では、すべてのパラメーターを関連するメソッドに直接渡すことができます。そのため、必要な場合を除き、追加のものをインポートしたり、オプション オブジェクトを作成したりする必要はありません。 内部的には、ChatOptionsChatClientsChatAgents オブジェクトを使用します。これを作成して渡すこともできます。 これは、オプションを保持する ChatAgent にも作成され、呼び出しごとにオーバーライドできます。

agent = ...

response = await agent.run(user_input, thread, max_tokens=1000, frequency_penalty=0.5)

上記はChatAgentに固有です。他のエージェントには異なるオプションがあるため、messagesで定義されているため、すべてのエージェントがパラメーターとしてAgentProtocolを受け入れる必要があります。

次のステップ