Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Návod:
Důležité
Tato funkce je v experimentální fázi. Funkce v této fázi jsou ve vývoji a před přechodem na fázi Preview nebo release candidate se můžou změnit.
Přehled
V této ukázce se zaměříme na nastavení pluginu pro přístup k rozhraní GitHub API a poskytnutí pokynů podle šablony pro ChatCompletionAgent k zodpovězení otázek týkajících se úložiště GitHub. Tento přístup bude rozdělen krok za krokem, aby zdůraznil klíčové části procesu kódování. V rámci úlohy bude agent v odpovědi poskytovat citace dokumentů.
Streamování se použije k doručování odpovědí agenta. To bude poskytovat aktualizace v reálném čase při průběhu úkolu.
Začínáme
Než budete pokračovat v kódování funkcí, ujistěte se, že je vaše vývojové prostředí plně nastavené a nakonfigurované.
Začněte vytvořením projektu konzoly . Pak zahrňte následující odkazy na balíčky, abyste zajistili, že jsou k dispozici všechny požadované závislosti.
Pokud chcete přidat závislosti balíčků z příkazového řádku, použijte tento dotnet příkaz:
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
Důležité
Pokud spravujete balíčky NuGet v sadě Visual Studio, ujistěte se, že je zaškrtnuté Include prerelease.
Soubor projektu (.csproj) by měl obsahovat následující PackageReference definice:
<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 je experimentální a vyžaduje potlačení upozornění. To se může vyřešit jako vlastnost v souboru projektu (.csproj):
<PropertyGroup>
<NoWarn>$(NoWarn);CA2007;IDE1006;SKEXP0001;SKEXP0110;OPENAI001</NoWarn>
</PropertyGroup>
Kromě toho zkopírujte modul plug-in a modely GitHubu (GitHubPlugin.csaGitHubModels.cs) z projektu sémantického jádraLearnResources. Přidejte tyto soubory do složky projektu.
Začněte vytvořením složky, která bude obsahovat váš skript (.py soubor) a ukázkové prostředky. Na začátek souboru .py zahrňte následující importy:
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
Kromě toho zkopírujte modul plug-in a modely GitHubu (github.py) z projektu sémantického jádraLearnResources. Přidejte tyto soubory do složky projektu.
Začněte vytvořením projektu konzoly Maven. Pak zahrňte následující odkazy na balíčky, abyste zajistili, že jsou k dispozici všechny požadované závislosti.
Projekt pom.xml by měl obsahovat následující závislosti:
<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>
Kromě toho zkopírujte modul plug-in a modely GitHubu (GitHubPlugin.javaaGitHubModels.java) z projektu sémantického jádraLearnResources. Přidejte tyto soubory do složky projektu.
Konfigurace
Tato ukázka vyžaduje nastavení konfigurace pro připojení ke vzdáleným službám. Budete muset definovat nastavení pro OpenAI nebo Azure OpenAI a také pro GitHub.
Poznámka:
Informace o osobních přístupových tokenech GitHubu najdete v tématu: Správa osobních přístupových tokenů.
# 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>"
Následující třída se používá ve všech příkladech agenta. Nezapomeňte ho zahrnout do projektu, abyste zajistili správné funkce. Tato třída slouží jako základní komponenta pro následující příklady.
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();
}
}
Nejrychlejší způsob, jak začít se správnou konfigurací pro spuštění ukázkového kódu, je vytvořit .env soubor v kořenovém adresáři projektu (kde se spouští váš skript).
Nakonfigurujte následující nastavení v souboru .env pro buď Azure OpenAI, nebo OpenAI.
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=""
Po nakonfigurování příslušné třídy služby AI vyberou požadované proměnné a použijí je během inicializace.
Definujte následující proměnné prostředí ve vašem systému.
# 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=""
V horní části souboru můžete načíst jejich hodnoty následujícím postupem.
// 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");
Kódování
Proces kódování pro tuto ukázku zahrnuje:
- Nastavení – Inicializace nastavení a modulu plug-in.
-
AgentDefinice – VytvořteChatCompletionAgents pokyny pro šablony a plug-in. - smyčka chatu – napište smyčku, která řídí interakci uživatele nebo agenta.
Úplný ukázkový kód je k dispozici v části Konečný . Kompletní implementaci najdete v této části.
Nastavení
Před vytvořením ChatCompletionAgent musí být nastavení konfigurace, moduly plug-in a Kernel inicializovány.
Inicializujte Settings třídu odkazovanou v předchozí části Konfigurace.
Settings settings = new();
Inicializace modulu plug-in pomocí jeho nastavení
Tady se zobrazí zpráva, která označuje průběh.
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);
Nyní inicializujte Kernel instanci s IChatCompletionService a dříve vytvořenou GitHubPlugin instancí.
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();
Definice agenta
Nakonec jsme připraveni vytvořit instanci ChatCompletionAgent s jejími pokyny, přidruženými Kernela výchozími argumenty a nastavením spuštění. V tomto případě chceme, aby se všechny funkce modulu plug-in automaticky spouštěly.
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();
Komunikační smyčka
Nakonec můžeme koordinovat interakci mezi uživatelem a Agent. Začněte vytvořením objektu ChatHistoryAgentThread pro zachování stavu konverzace a vytvořením prázdné smyčky.
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
}
Teď zachytáme vstup uživatele v rámci předchozí smyčky. V tomto případě se prázdný vstup ignoruje a termín EXIT bude signalizovat, že konverzace je dokončená.
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;
}
}
Pokud chcete vygenerovat Agent odpověď na vstup uživatele, využitím Argumentů poskytněte závěrečný parametr šablony, který určuje aktuální datum a čas.
Odpověď Agent se pak uživateli zobrazí.
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();
}
Konečný
Spojte všechny kroky dohromady, máme pro tento příklad konečný kód. Kompletní implementace je uvedená níže.
Zkuste použít tyto navrhované vstupy:
- Jaké je moje uživatelské jméno?
- Popište repozitář.
- Popište nejnovější problém vytvořený v úložišti.
- Seznam prvních 10 problémů uzavřených během posledního týdne
- Jak byly tyto problémy označeny?
- Seznam 5 naposledy otevřených problémů s popiskem Agenti
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())
Úplný kód , jak je znázorněno výše, najdete v našem úložišti.
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();
}
}
}
}