Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Nasıl yapılır:
Önemli
Bu özellik deneysel aşamadadır. Bu aşamadaki özellikler geliştirme aşamasındadır ve önizleme veya sürüm adayı aşamasına geçmeden önce değiştirilebilir.
Genel bakış
Bu örnekte, GitHub API'sine erişmek için bir eklenti yapılandırmayı keşfedecek ve GitHub deposu hakkındaki soruları yanıtlamak için ChatCompletionAgent
öğesine şablonlu yönergeler sağlayacağız. Bu yaklaşım, kodlama sürecinin önemli kısımlarını vurgulamak için adım adım açıklanacaktır. Görevin bir parçası olarak, görevli yanıt içinde belge alıntıları sağlayacaktır.
Akış, temsilcinin yanıtlarını sunmak için kullanılacaktır. Bu, görev ilerledikçe gerçek zamanlı güncelleştirmeler sağlar.
Kullanmaya Başlama
Özellik kodlamaya devam etmeden önce geliştirme ortamınızın tam olarak ayarlandığından ve yapılandırıldığından emin olun.
Konsol projesi oluşturarak başlayın. Ardından, gerekli tüm bağımlılıkların kullanılabilir olduğundan emin olmak için aşağıdaki paket başvurularını ekleyin.
Komut satırından paket bağımlılıkları eklemek için komutunu dotnet
kullanın:
dotnet add package Azure.Identity
dotnet add package Microsoft.Extensions.Configuration
dotnet add package Microsoft.Extensions.Configuration.Binder
dotnet add package Microsoft.Extensions.Configuration.UserSecrets
dotnet add package Microsoft.Extensions.Configuration.EnvironmentVariables
dotnet add package Microsoft.SemanticKernel.Connectors.AzureOpenAI
dotnet add package Microsoft.SemanticKernel.Agents.Core --prerelease
Önemli
Visual Studio'da NuGet paketlerini yönetiyorsanız, Include prerelease
işaretli olduğundan emin olun.
Proje dosyası (.csproj
) aşağıdaki PackageReference
tanımları içermelidir:
<ItemGroup>
<PackageReference Include="Azure.Identity" Version="<stable>" />
<PackageReference Include="Microsoft.Extensions.Configuration" Version="<stable>" />
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="<stable>" />
<PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="<stable>" />
<PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="<stable>" />
<PackageReference Include="Microsoft.SemanticKernel.Agents.Core" Version="<latest>" />
<PackageReference Include="Microsoft.SemanticKernel.Connectors.AzureOpenAI" Version="<latest>" />
</ItemGroup>
Agent Framework
deneyseldir ve uyarı gizleme gerektirir. Proje dosyasında bir özellik olarak belirtilmiş olabilir (.csproj
):
<PropertyGroup>
<NoWarn>$(NoWarn);CA2007;IDE1006;SKEXP0001;SKEXP0110;OPENAI001</NoWarn>
</PropertyGroup>
Ayrıca, GitHubPlugin.cs
GitHub eklentisini ve modellerini (GitHubModels.cs
ve LearnResources
) kopyalayın. Bu dosyaları proje klasörünüzde ekleyin.
Betiğinizi (.py
dosya) ve örnek kaynakları barındıracak bir klasör oluşturarak başlayın. Dosyanızın .py
en üstüne aşağıdaki içe aktarımları ekleyin:
import asyncio
import os
import sys
from datetime import datetime
from semantic_kernel.agents import ChatCompletionAgent, ChatHistoryAgentThread
from semantic_kernel.connectors.ai import FunctionChoiceBehavior
from semantic_kernel.connectors.ai.open_ai import AzureChatCompletion
from semantic_kernel.functions import KernelArguments
from semantic_kernel.kernel import Kernel
# Adjust the sys.path so we can use the GitHubPlugin and GitHubSettings classes
# This is so we can run the code from the samples/learn_resources/agent_docs directory
# If you are running code from your own project, you may not need need to do this.
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))
from plugins.GithubPlugin.github import GitHubPlugin, GitHubSettings # noqa: E402
Ayrıca, github.py
GitHub eklentisini ve modellerini (LearnResources
) kopyalayın. Bu dosyaları proje klasörünüzde ekleyin.
Maven konsol projesi oluşturarak başlayın. Ardından, gerekli tüm bağımlılıkların kullanılabilir olduğundan emin olmak için aşağıdaki paket başvurularını ekleyin.
Proje pom.xml
aşağıdaki bağımlılıkları içermelidir:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.microsoft.semantic-kernel</groupId>
<artifactId>semantickernel-bom</artifactId>
<version>[LATEST]</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>com.microsoft.semantic-kernel</groupId>
<artifactId>semantickernel-agents-core</artifactId>
</dependency>
<dependency>
<groupId>com.microsoft.semantic-kernel</groupId>
<artifactId>semantickernel-aiservices-openai</artifactId>
</dependency>
</dependencies>
Ayrıca, GitHubPlugin.java
GitHub eklentisini ve modellerini (GitHubModels.java
ve LearnResources
) kopyalayın. Bu dosyaları proje klasörünüzde ekleyin.
Yapılandırma
Bu örnek, uzak hizmetlere bağlanmak için yapılandırma ayarı gerektirir. OpenAI veya Azure OpenAI ve GitHub ayarlarını tanımlamanız gerekir.
Uyarı
GitHub Kişisel Erişim Belirteçleri hakkında bilgi için bkz. Kişisel erişim belirteçlerinizi yönetme.
# OpenAI
dotnet user-secrets set "OpenAISettings:ApiKey" "<api-key>"
dotnet user-secrets set "OpenAISettings:ChatModel" "gpt-4o"
# Azure OpenAI
dotnet user-secrets set "AzureOpenAISettings:ApiKey" "<api-key>" # Not required if using token-credential
dotnet user-secrets set "AzureOpenAISettings:Endpoint" "<model-endpoint>"
dotnet user-secrets set "AzureOpenAISettings:ChatModelDeployment" "gpt-4o"
# GitHub
dotnet user-secrets set "GitHubSettings:BaseUrl" "https://api.github.com"
dotnet user-secrets set "GitHubSettings:Token" "<personal access token>"
Aşağıdaki sınıf tüm Agent örneklerinde kullanılır. Düzgün işlevsellik sağlamak için bunu projenize eklediğinizden emin olun. Bu sınıf, aşağıdaki örnekler için temel bir bileşen olarak hizmet eder.
using System.Reflection;
using Microsoft.Extensions.Configuration;
namespace AgentsSample;
public class Settings
{
private readonly IConfigurationRoot configRoot;
private AzureOpenAISettings azureOpenAI;
private OpenAISettings openAI;
public AzureOpenAISettings AzureOpenAI => this.azureOpenAI ??= this.GetSettings<Settings.AzureOpenAISettings>();
public OpenAISettings OpenAI => this.openAI ??= this.GetSettings<Settings.OpenAISettings>();
public class OpenAISettings
{
public string ChatModel { get; set; } = string.Empty;
public string ApiKey { get; set; } = string.Empty;
}
public class AzureOpenAISettings
{
public string ChatModelDeployment { get; set; } = string.Empty;
public string Endpoint { get; set; } = string.Empty;
public string ApiKey { get; set; } = string.Empty;
}
public TSettings GetSettings<TSettings>() =>
this.configRoot.GetRequiredSection(typeof(TSettings).Name).Get<TSettings>()!;
public Settings()
{
this.configRoot =
new ConfigurationBuilder()
.AddEnvironmentVariables()
.AddUserSecrets(Assembly.GetExecutingAssembly(), optional: true)
.Build();
}
}
Örnek kodu çalıştırmak için uygun yapılandırmayı kullanmaya başlamanın en hızlı yolu, projenizin kökünde (betiğinizin çalıştırıldığı) bir .env
dosya oluşturmaktır.
Azure OpenAI veya OpenAI için dosyanızda .env
aşağıdaki ayarları yapılandırın:
AZURE_OPENAI_API_KEY="..."
AZURE_OPENAI_ENDPOINT="https://<resource-name>.openai.azure.com/"
AZURE_OPENAI_CHAT_DEPLOYMENT_NAME="..."
AZURE_OPENAI_API_VERSION="..."
OPENAI_API_KEY="sk-..."
OPENAI_ORG_ID=""
OPENAI_CHAT_MODEL_ID=""
Yapılandırıldıktan sonra ilgili yapay zeka hizmet sınıfları gerekli değişkenleri alır ve örnekleme sırasında kullanır.
Sisteminizde aşağıdaki ortam değişkenlerini tanımlayın.
# Azure OpenAI
AZURE_OPENAI_API_KEY=""
AZURE_OPENAI_ENDPOINT="https://<resource-name>.openai.azure.com/"
AZURE_CHAT_MODEL_DEPLOYMENT=""
# OpenAI
OPENAI_API_KEY=""
OPENAI_MODEL_ID=""
Dosyanın en üstünde, değerlerini aşağıdaki gibi alabilirsiniz.
// Azure OpenAI
private static final String AZURE_OPENAI_API_KEY = System.getenv("AZURE_OPENAI_API_KEY");
private static final String AZURE_OPENAI_ENDPOINT = System.getenv("AZURE_OPENAI_ENDPOINT");
private static final String AZURE_CHAT_MODEL_DEPLOYMENT = System.getenv().getOrDefault("AZURE_CHAT_MODEL_DEPLOYMENT", "gpt-4o");
// OpenAI
private static final String OPENAI_API_KEY = System.getenv("OPENAI_API_KEY");
private static final String OPENAI_MODEL_ID = System.getenv().getOrDefault("OPENAI_MODEL_ID", "gpt-4o");
Kodlama
Bu örnek için kodlama işlemi şunları içerir:
- Kurulum - Ayarları ve eklentiyi başlatma.
-
Agent
Tanım - Şablonlu yönergeler ve eklenti ileChatCompletionAgent
öğesini oluşturun. - Sohbet Döngüsü - Kullanıcı/aracı etkileşimini yönlendiren döngüleri yazın.
Örnek kodun tamamı Final bölümünde verilmiştir. Tam uygulama için bu bölüme bakın.
Ayarlama
Bir ChatCompletionAgent
oluşturmadan önce, yapılandırma ayarları, eklentiler ve Kernel
başlatılmalıdır.
Settings
Önceki Yapılandırma bölümünde başvurulan sınıfı başlatın.
Settings settings = new();
Eklentiyi ayarlarını kullanarak başlatın.
Burada ilerleme durumunu göstermek için bir ileti görüntüleniyor.
Console.WriteLine("Initialize plugins...");
GitHubSettings githubSettings = settings.GetSettings<GitHubSettings>();
GitHubPlugin githubPlugin = new(githubSettings);
gh_settings = GitHubSettings(
token="<PAT value>"
)
kernel.add_plugin(GitHubPlugin(settings=gh_settings), plugin_name="github")
var githubPlugin = new GitHubPlugin(GITHUB_PAT);
Şimdi bir Kernel
örneğini, daha önce oluşturulmuş bir IChatCompletionService
ve GitHubPlugin
ile başlatın.
Console.WriteLine("Creating kernel...");
IKernelBuilder builder = Kernel.CreateBuilder();
builder.AddAzureOpenAIChatCompletion(
settings.AzureOpenAI.ChatModelDeployment,
settings.AzureOpenAI.Endpoint,
new AzureCliCredential());
builder.Plugins.AddFromObject(githubPlugin);
Kernel kernel = builder.Build();
kernel = Kernel()
# Add the AzureChatCompletion AI Service to the Kernel
service_id = "agent"
kernel.add_service(AzureChatCompletion(service_id=service_id))
settings = kernel.get_prompt_execution_settings_from_service_id(service_id=service_id)
# Configure the function choice behavior to auto invoke kernel functions
settings.function_choice_behavior = FunctionChoiceBehavior.Auto()
OpenAIAsyncClient client = new OpenAIClientBuilder()
.credential(new AzureKeyCredential(AZURE_OPENAI_API_KEY))
.endpoint(AZURE_OPENAI_ENDPOINT)
.buildAsyncClient();
ChatCompletionService chatCompletion = OpenAIChatCompletion.builder()
.withModelId(AZURE_CHAT_MODEL_DEPLOYMENT)
.withOpenAIAsyncClient(client)
.build();
Kernel kernel = Kernel.builder()
.withAIService(ChatCompletionService.class, chatCompletion)
.withPlugin(KernelPluginFactory.createFromObject(githubPlugin, "GitHubPlugin"))
.build();
Ajan Tanımı
Son olarak, yönergeleri, ilişkili ChatCompletionAgent
ile, varsayılan Bağımsız Değişkenler ve Yürütme Ayarları kullanarak Kernel
örneğini oluşturmaya hazırız. Bu durumda, herhangi bir eklenti işlevinin otomatik olarak yürütülmesini istiyoruz.
Console.WriteLine("Defining agent...");
ChatCompletionAgent agent =
new()
{
Name = "SampleAssistantAgent",
Instructions =
"""
You are an agent designed to query and retrieve information from a single GitHub repository in a read-only manner.
You are also able to access the profile of the active user.
Use the current date and time to provide up-to-date details or time-sensitive responses.
The repository you are querying is a public repository with the following name: {{$repository}}
The current date and time is: {{$now}}.
""",
Kernel = kernel,
Arguments =
new KernelArguments(new AzureOpenAIPromptExecutionSettings() { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto() })
{
{ "repository", "microsoft/semantic-kernel" }
}
};
Console.WriteLine("Ready!");
agent = ChatCompletionAgent(
kernel=kernel,
name="SampleAssistantAgent",
instructions=f"""
You are an agent designed to query and retrieve information from a single GitHub repository in a read-only
manner.
You are also able to access the profile of the active user.
Use the current date and time to provide up-to-date details or time-sensitive responses.
The repository you are querying is a public repository with the following name: microsoft/semantic-kernel
The current date and time is: {{$now}}.
""",
arguments=KernelArguments(
settings=settings,
),
)
// Invocation context for the agent
InvocationContext invocationContext = InvocationContext.builder()
.withFunctionChoiceBehavior(FunctionChoiceBehavior.auto(true))
.build()
ChatCompletionAgent agent = ChatCompletionAgent.builder()
.withName("SampleAssistantAgent")
.withKernel(kernel)
.withInvocationContext(invocationContext)
.withTemplate(
DefaultPromptTemplate.build(
PromptTemplateConfig.builder()
.withTemplate(
"""
You are an agent designed to query and retrieve information from a single GitHub repository in a read-only manner.
You are also able to access the profile of the active user.
Use the current date and time to provide up-to-date details or time-sensitive responses.
The repository you are querying is a public repository with the following name: {{$repository}}
The current date and time is: {{$now}}.
""")
.build()))
.withKernelArguments(
KernelArguments.builder()
.withVariable("repository", "microsoft/semantic-kernel-java")
.withExecutionSettings(PromptExecutionSettings.builder()
.build())
.build())
.build();
Sohbet Döngüsü
Sonunda kullanıcı ile Agent
arasındaki etkileşimi koordine edebiliyoruz. Konuşma durumunu korumak için bir ChatHistoryAgentThread
nesne oluşturarak ve boş bir döngü oluşturarak başlayın.
ChatHistoryAgentThread agentThread = new();
bool isComplete = false;
do
{
// processing logic here
} while (!isComplete);
thread: ChatHistoryAgentThread = None
is_complete: bool = False
while not is_complete:
# processing logic here
AgentThread agentThread = new ChatHistoryAgentThread();
boolean isComplete = false;
while (!isComplete) {
// processing logic here
}
Şimdi önceki döngüde kullanıcı girişini yakalayalım. Bu durumda boş giriş yoksayılır ve terim EXIT
konuşmanın tamamlandığını gösterir.
Console.WriteLine();
Console.Write("> ");
string input = Console.ReadLine();
if (string.IsNullOrWhiteSpace(input))
{
continue;
}
if (input.Trim().Equals("EXIT", StringComparison.OrdinalIgnoreCase))
{
isComplete = true;
break;
}
var message = new ChatMessageContent(AuthorRole.User, input);
Console.WriteLine();
user_input = input("User:> ")
if not user_input:
continue
if user_input.lower() == "exit":
is_complete = True
break
Scanner scanner = new Scanner(System.in);
while (!isComplete) {
System.out.print("> ");
String input = scanner.nextLine();
if (input.isEmpty()) {
continue;
}
if (input.equalsIgnoreCase("exit")) {
isComplete = true;
break;
}
}
Kullanıcı girişine Agent
yanıt oluşturmak için, geçerli tarih ve saati belirten son şablon parametresini sağlamak amacıyla Parametreler'i kullanarak aracıyı çağırın.
Ardından Agent
yanıt kullanıcıya görüntülenir.
DateTime now = DateTime.Now;
KernelArguments arguments =
new()
{
{ "now", $"{now.ToShortDateString()} {now.ToShortTimeString()}" }
};
await foreach (ChatMessageContent response in agent.InvokeAsync(message, agentThread, options: new() { KernelArguments = arguments }))
{
Console.WriteLine($"{response.Content}");
}
arguments = KernelArguments(
now=datetime.now().strftime("%Y-%m-%d %H:%M")
)
async for response in agent.invoke(messages=user_input, thread=thread, arguments=arguments):
print(f"{response.content}")
thread = response.thread
var options = AgentInvokeOptions.builder()
.withKernelArguments(KernelArguments.builder()
.withVariable("now", OffsetDateTime.now())
.build())
.build();
for (var response : agent.invokeAsync(message, agentThread, options).block()) {
System.out.println(response.getMessage());
agentThread = response.getThread();
}
Nihai
Tüm adımları bir araya getirdiğimizde, bu örneğin son koduna sahibiz. Uygulamanın tamamı aşağıda verilmiştir.
Şu önerilen girişleri kullanmayı deneyin:
- Kullanıcı adım nedir?
- Depo hakkında açıklama yapın.
- Depoda oluşturulan en yeni sorunu açıklayın.
- Geçen hafta kapatılan ilk 10 sorunu listeleyin.
- Bu sorunlar nasıl etiketlendi?
- "Aracılar" etiketiyle en son açılan 5 sorunu listeleyin
using System;
using System.Threading.Tasks;
using Azure.Identity;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Agents;
using Microsoft.SemanticKernel.ChatCompletion;
using Microsoft.SemanticKernel.Connectors.AzureOpenAI;
using Plugins;
namespace AgentsSample;
public static class Program
{
public static async Task Main()
{
// Load configuration from environment variables or user secrets.
Settings settings = new();
Console.WriteLine("Initialize plugins...");
GitHubSettings githubSettings = settings.GetSettings<GitHubSettings>();
GitHubPlugin githubPlugin = new(githubSettings);
Console.WriteLine("Creating kernel...");
IKernelBuilder builder = Kernel.CreateBuilder();
builder.AddAzureOpenAIChatCompletion(
settings.AzureOpenAI.ChatModelDeployment,
settings.AzureOpenAI.Endpoint,
new AzureCliCredential());
builder.Plugins.AddFromObject(githubPlugin);
Kernel kernel = builder.Build();
Console.WriteLine("Defining agent...");
ChatCompletionAgent agent =
new()
{
Name = "SampleAssistantAgent",
Instructions =
"""
You are an agent designed to query and retrieve information from a single GitHub repository in a read-only manner.
You are also able to access the profile of the active user.
Use the current date and time to provide up-to-date details or time-sensitive responses.
The repository you are querying is a public repository with the following name: {{$repository}}
The current date and time is: {{$now}}.
""",
Kernel = kernel,
Arguments =
new KernelArguments(new AzureOpenAIPromptExecutionSettings() { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto() })
{
{ "repository", "microsoft/semantic-kernel" }
}
};
Console.WriteLine("Ready!");
ChatHistoryAgentThread agentThread = new();
bool isComplete = false;
do
{
Console.WriteLine();
Console.Write("> ");
string input = Console.ReadLine();
if (string.IsNullOrWhiteSpace(input))
{
continue;
}
if (input.Trim().Equals("EXIT", StringComparison.OrdinalIgnoreCase))
{
isComplete = true;
break;
}
var message = new ChatMessageContent(AuthorRole.User, input);
Console.WriteLine();
DateTime now = DateTime.Now;
KernelArguments arguments =
new()
{
{ "now", $"{now.ToShortDateString()} {now.ToShortTimeString()}" }
};
await foreach (ChatMessageContent response in agent.InvokeAsync(message, agentThread, options: new() { KernelArguments = arguments }))
{
// Display response.
Console.WriteLine($"{response.Content}");
}
} while (!isComplete);
}
}
import asyncio
import os
import sys
from datetime import datetime
from semantic_kernel.agents import ChatCompletionAgent, ChatHistoryAgentThread
from semantic_kernel.connectors.ai import FunctionChoiceBehavior
from semantic_kernel.connectors.ai.open_ai import AzureChatCompletion
from semantic_kernel.functions import KernelArguments
from semantic_kernel.kernel import Kernel
# Adjust the sys.path so we can use the GitHubPlugin and GitHubSettings classes
# This is so we can run the code from the samples/learn_resources/agent_docs directory
# If you are running code from your own project, you may not need need to do this.
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))
from plugins.GithubPlugin.github import GitHubPlugin, GitHubSettings # noqa: E402
async def main():
kernel = Kernel()
# Add the AzureChatCompletion AI Service to the Kernel
service_id = "agent"
kernel.add_service(AzureChatCompletion(service_id=service_id))
settings = kernel.get_prompt_execution_settings_from_service_id(service_id=service_id)
# Configure the function choice behavior to auto invoke kernel functions
settings.function_choice_behavior = FunctionChoiceBehavior.Auto()
# Set your GitHub Personal Access Token (PAT) value here
gh_settings = GitHubSettings(token="") # nosec
kernel.add_plugin(plugin=GitHubPlugin(gh_settings), plugin_name="GithubPlugin")
current_time = datetime.now().isoformat()
# Create the agent
agent = ChatCompletionAgent(
kernel=kernel,
name="SampleAssistantAgent",
instructions=f"""
You are an agent designed to query and retrieve information from a single GitHub repository in a read-only
manner.
You are also able to access the profile of the active user.
Use the current date and time to provide up-to-date details or time-sensitive responses.
The repository you are querying is a public repository with the following name: microsoft/semantic-kernel
The current date and time is: {current_time}.
""",
arguments=KernelArguments(settings=settings),
)
thread: ChatHistoryAgentThread = None
is_complete: bool = False
while not is_complete:
user_input = input("User:> ")
if not user_input:
continue
if user_input.lower() == "exit":
is_complete = True
break
arguments = KernelArguments(now=datetime.now().strftime("%Y-%m-%d %H:%M"))
async for response in agent.invoke(messages=user_input, thread=thread, arguments=arguments):
print(f"{response.content}")
thread = response.thread
if __name__ == "__main__":
asyncio.run(main())
Yukarıda belirtildiği gibi tam kodu'i depomuzda bulabilirsiniz.
import com.microsoft.semantickernel.Kernel;
import com.microsoft.semantickernel.agents.AgentInvokeOptions;
import com.microsoft.semantickernel.agents.AgentThread;
import com.microsoft.semantickernel.agents.chatcompletion.ChatCompletionAgent;
import com.microsoft.semantickernel.agents.chatcompletion.ChatHistoryAgentThread;
import com.microsoft.semantickernel.aiservices.openai.chatcompletion.OpenAIChatCompletion;
import com.microsoft.semantickernel.contextvariables.ContextVariableTypeConverter;
import com.microsoft.semantickernel.functionchoice.FunctionChoiceBehavior;
import com.microsoft.semantickernel.implementation.templateengine.tokenizer.DefaultPromptTemplate;
import com.microsoft.semantickernel.orchestration.InvocationContext;
import com.microsoft.semantickernel.orchestration.PromptExecutionSettings;
import com.microsoft.semantickernel.plugin.KernelPluginFactory;
import com.microsoft.semantickernel.samples.plugins.github.GitHubModel;
import com.microsoft.semantickernel.samples.plugins.github.GitHubPlugin;
import com.microsoft.semantickernel.semanticfunctions.KernelArguments;
import com.microsoft.semantickernel.semanticfunctions.PromptTemplateConfig;
import com.microsoft.semantickernel.services.chatcompletion.AuthorRole;
import com.microsoft.semantickernel.services.chatcompletion.ChatCompletionService;
import com.microsoft.semantickernel.services.chatcompletion.ChatMessageContent;
import com.azure.ai.openai.OpenAIAsyncClient;
import com.azure.ai.openai.OpenAIClientBuilder;
import com.azure.core.credential.AzureKeyCredential;
import java.time.OffsetDateTime;
import java.util.Scanner;
public class CompletionAgent {
// Azure OpenAI
private static final String AZURE_OPENAI_API_KEY = System.getenv("AZURE_OPENAI_API_KEY");
private static final String AZURE_OPENAI_ENDPOINT = System.getenv("AZURE_OPENAI_ENDPOINT");
private static final String AZURE_CHAT_MODEL_DEPLOYMENT = System.getenv().getOrDefault("AZURE_CHAT_MODEL_DEPLOYMENT", "gpt-4o");
// GitHub Personal Access Token
private static final String GITHUB_PAT = System.getenv("GITHUB_PAT");
public static void main(String[] args) {
System.out.println("======== ChatCompletion Agent ========");
OpenAIAsyncClient client = new OpenAIClientBuilder()
.credential(new AzureKeyCredential(AZURE_OPENAI_API_KEY))
.endpoint(AZURE_OPENAI_ENDPOINT)
.buildAsyncClient();
var githubPlugin = new GitHubPlugin(GITHUB_PAT);
ChatCompletionService chatCompletion = OpenAIChatCompletion.builder()
.withModelId(AZURE_CHAT_MODEL_DEPLOYMENT)
.withOpenAIAsyncClient(client)
.build();
Kernel kernel = Kernel.builder()
.withAIService(ChatCompletionService.class, chatCompletion)
.withPlugin(KernelPluginFactory.createFromObject(githubPlugin, "GitHubPlugin"))
.build();
InvocationContext invocationContext = InvocationContext.builder()
.withFunctionChoiceBehavior(FunctionChoiceBehavior.auto(true))
.withContextVariableConverter(new ContextVariableTypeConverter<>(
GitHubModel.Issue.class,
o -> (GitHubModel.Issue) o,
o -> o.toString(),
s -> null))
.build();
ChatCompletionAgent agent = ChatCompletionAgent.builder()
.withName("SampleAssistantAgent")
.withKernel(kernel)
.withInvocationContext(invocationContext)
.withTemplate(
DefaultPromptTemplate.build(
PromptTemplateConfig.builder()
.withTemplate(
"""
You are an agent designed to query and retrieve information from a single GitHub repository in a read-only manner.
You are also able to access the profile of the active user.
Use the current date and time to provide up-to-date details or time-sensitive responses.
The repository you are querying is a public repository with the following name: {{$repository}}
The current date and time is: {{$now}}.
""")
.build()))
.withKernelArguments(
KernelArguments.builder()
.withVariable("repository", "microsoft/semantic-kernel-java")
.withExecutionSettings(PromptExecutionSettings.builder()
.build())
.build())
.build();
AgentThread agentThread = new ChatHistoryAgentThread();
boolean isComplete = false;
Scanner scanner = new Scanner(System.in);
while (!isComplete) {
System.out.print("> ");
String input = scanner.nextLine();
if (input.isEmpty()) {
continue;
}
if (input.equalsIgnoreCase("EXIT")) {
isComplete = true;
break;
}
var message = new ChatMessageContent<>(AuthorRole.USER, input);
var options = AgentInvokeOptions.builder()
.withKernelArguments(KernelArguments.builder()
.withVariable("now", OffsetDateTime.now())
.build())
.build();
for (var response : agent.invokeAsync(message, agentThread, options).block()) {
System.out.println(response.getMessage());
agentThread = response.getThread();
}
}
}
}