Exploring the Semantic Kernel Chat Completion Agent

Warning

The Semantic Kernel Agent Framework is in preview and is subject to change.

Detailed API documentation related to this discussion is available at:

Agents are currently unavailable in Java.

Chat Completion in Semantic Kernel

Chat Completion is fundamentally a protocol for a chat-based interaction with an AI model where the chat-history maintained and presented to the model with each request. Semantic Kernel AI services offer a unified framework for integrating the chat-completion capabilities of various AI models.

A chat completion agent can leverage any of these AI services to generate responses, whether directed to a user or another agent.

For .NET, chat-completion AI Services are based on the IChatCompletionService interface.

For .NET, some of AI services that support models with chat-completion include:

Model Semantic Kernel AI Service
Azure Open AI Microsoft.SemanticKernel.Connectors.AzureOpenAI
Gemini Microsoft.SemanticKernel.Connectors.Google
HuggingFace Microsoft.SemanticKernel.Connectors.HuggingFace
Mistral Microsoft.SemanticKernel.Connectors.MistralAI
OpenAI Microsoft.SemanticKernel.Connectors.OpenAI
Onnx Microsoft.SemanticKernel.Connectors.Onnx

Agents are currently unavailable in Java.

Creating a Chat Completion Agent

A chat completion agent is fundamentally based on an AI services. As such, creating an chat completion agent starts with creating a Kernel instance that contains one or more chat-completion services and then instantiating the agent with a reference to that Kernel instance.

// Initialize a Kernel with a chat-completion service
IKernelBuilder builder = Kernel.CreateBuilder();

builder.AddAzureOpenAIChatCompletion(/*<...configuration parameters>*/);

Kernel kernel = builder.Build();

// Create the agent
ChatCompletionAgent agent =
    new()
    {
        Name = "SummarizationAgent",
        Instructions = "Summarize user input",
        Kernel = kernel
    };
# Define the Kernel
kernel = Kernel()

# Add the AzureChatCompletion AI Service to the Kernel
kernel.add_service(AzureChatCompletion(service_id="<service_id>"))

# Create the agent
agent = ChatCompletionAgent(
  service_id="agent", 
  kernel=kernel, 
  name="<agent name>", 
  instructions="<agent instructions>",
)

Agents are currently unavailable in Java.

AI Service Selection

No different from using Semantic Kernel AI services directly, a chat completion agent support the specification of a service-selector. A service-selector indentifies which AI service to target when the Kernel contains more than one.

Note: If multiple AI services are present and no service-selector is provided, the same default logic is applied for the agent that you'd find when using an AI services outside of the Agent Framework

IKernelBuilder builder = Kernel.CreateBuilder();

// Initialize multiple chat-completion services.
builder.AddAzureOpenAIChatCompletion(/*<...service configuration>*/, serviceId: "service-1");
builder.AddAzureOpenAIChatCompletion(/*<...service configuration>*/, serviceId: "service-2");

Kernel kernel = builder.Build();

ChatCompletionAgent agent =
    new()
    {
        Name = "<agent name>",
        Instructions = "<agent instructions>",
        Kernel = kernel,
        Arguments = // Specify the service-identifier via the KernelArguments
          new KernelArguments(
            new OpenAIPromptExecutionSettings() 
            { 
              ServiceId = "service-2" // The target service-identifier.
            });
    };
# Define the Kernel
kernel = Kernel()

# Add the AzureChatCompletion AI Service to the Kernel
kernel.add_service(AzureChatCompletion(service_id="<service_id>"))

# Create the agent
agent = ChatCompletionAgent(
  service_id="agent", 
  kernel=kernel, 
  name="<agent name>", 
  instructions="<agent instructions>",
)

Agents are currently unavailable in Java.

Conversing with Chat Completion Agent

Conversing with your Chat Completion Agent is based on a Chat History instance, no different from interacting with a Chat Completion AI service.

// Define agent
ChatCompletionAgent agent = ...;

// Create a ChatHistory object to maintain the conversation state.
ChatHistory chat = [];

// Add a user message to the conversation
chat.Add(new ChatMessageContent(AuthorRole.User, "<user input>"));

// Generate the agent response(s)
await foreach (ChatMessageContent response in agent.InvokeAsync(chat))
{
  // Process agent response(s)...
}
# Define agent
agent = ChatCompletionAgent(...)

# Define the chat history
chat = ChatHistory()

# Add the user message
chat.add_message(ChatMessageContent(role=AuthorRole.USER, content=input))

# Generate the agent response(s)
async for response in agent.invoke(chat):
  # process agent response(s)

Agents are currently unavailable in Java.

How-To:

For an end-to-end example for a Chat Completion Agent, see: