Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Útmutató:
Fontos
Ez a funkció a kiadásra jelölt fázisban van. A funkciók ebben a szakaszban szinte teljesek és általában stabilak, bár kisebb finomításokon vagy optimalizálásokon eshetnek át, mielőtt elérnék a teljes általános rendelkezésre állást.
Áttekintés
Ebben a példában megvizsgáljuk, hogyan használhatja az OpenAIAssistantAgent kódértelmező eszközt az adatelemzési feladatok elvégzéséhez. A megközelítés lépésről lépésre bontva lesz, hogy a kódolási folyamat főbb részeit jól megvilágítsa. A feladat részeként az ügynök kép- és szöveges válaszokat is generál. Ez bemutatja ennek az eszköznek a sokoldalúságát a mennyiségi elemzés során.
A streamelés az ügynök válaszainak továbbítására szolgál. Ez valós idejű frissítéseket biztosít a tevékenység előrehaladása során.
Első lépések
A funkciókódolás előtt győződjön meg arról, hogy a fejlesztési környezet teljesen be van állítva és konfigurálva van.
Először hozzon létre egy konzolprojektet. Ezután adja meg a következő csomaghivatkozásokat, hogy az összes szükséges függőség elérhető legyen.
Ha csomagfüggőségeket szeretne hozzáadni a parancssorból, használja a dotnet következő parancsot:
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
dotnet add package Microsoft.SemanticKernel.Agents.OpenAI --prerelease
Fontos
Ha NuGet-csomagokat kezel a Visual Studióban, ellenőrizze, hogy Include prerelease van-e bejelölve.
A projektfájlnak (.csproj) a következő PackageReference definíciókat kell tartalmaznia:
<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" Version="<latest>" />
<PackageReference Include="Microsoft.SemanticKernel.Agents.OpenAI" Version="<latest>" />
</ItemGroup>
A Agent Framework kísérleti jellegű, és figyelmeztetések elnyomását igényli. Ez megadható a projektfájl tulajdonságaként (.csproj).
<PropertyGroup>
<NoWarn>$(NoWarn);CA2007;IDE1006;SKEXP0001;SKEXP0110;OPENAI001</NoWarn>
</PropertyGroup>
Emellett másolja a PopulationByAdmin1.csv és PopulationByCountry.csv adatfájlokat a Szemantikus Kernel LearnResources Projekttel kapcsolatban. Vegye fel ezeket a fájlokat a projektmappába, és konfigurálja, hogy azokat a kimeneti könyvtárba másolja:
<ItemGroup>
<None Include="PopulationByAdmin1.csv">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="PopulationByCountry.csv">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
Először hozzon létre egy mappát, amely a szkriptet (.py fájlt) és a mintaerőforrásokat fogja tárolni. Helyezze el a következő importálásokat a .py fájl tetején:
import asyncio
import os
from semantic_kernel.agents import AssistantAgentThread, AzureAssistantAgent
from semantic_kernel.contents import StreamingFileReferenceContent
Emellett másolja a PopulationByAdmin1.csv a PopulationByCountry.csv és learn_resources/resources adatfájlokat. Vegye fel ezeket a fájlokat a munkakönyvtárba.
A funkció jelenleg nem érhető el a Javában.
Konfiguráció
Ez a minta konfigurációs beállítást igényel a távoli szolgáltatásokhoz való csatlakozáshoz. Meg kell adnia az OpenAI vagy az Azure OpenAI beállításait.
# 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"
A rendszer az alábbi osztályt használja az összes ügynök-példában. A megfelelő működés érdekében mindenképpen vegye fel a projektbe. Ez az osztály alapvető összetevőként szolgál az alábbi példákhoz.
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();
}
}
A mintakód futtatásához szükséges megfelelő konfiguráció használatának leggyorsabb módja egy .env fájl létrehozása a projekt gyökerénél (ahol a szkript fut).
Konfigurálja a következő beállításokat az .env fájlban az Azure OpenAI vagy az OpenAI számára:
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=""
Tipp
Az Azure Assistants legalább 2024-05-01 előzetes verziójú API-verziót igényel. Az új funkciók bevezetésekor az API-verziók ennek megfelelően frissülnek. E cikk írásakor a legújabb verzió: 2025-01-01-előzetes. A legfrissebb verziószámozási részletekért tekintse meg az Azure OpenAI API előzetes életciklusát.
A konfigurálás után a megfelelő AI-szolgáltatásosztályok felveszik a szükséges változókat, és a példányosítás során használják őket.
A funkció jelenleg nem érhető el a Javában.
Kódolás
A minta kódolási folyamata a következőket foglalja magában:
- Beállítás – Beállítások inicializálása és a beépülő modul.
-
Ügynökdefiníciós – A _OpenAI_Assistant
Agentlétrehozása templatizált utasítások és beépülő modul használatával. - A csevegési ciklus – Írja meg a felhasználói/ügynöki interakciót hajtó hurkot.
A teljes példakód az Utolsó szakaszban található. A teljes megvalósításhoz tekintse meg ezt a szakaszt.
Beállítás
A OpenAIAssistantAgentlétrehozása előtt győződjön meg arról, hogy a konfigurációs beállítások elérhetők, és előkészíti a fájlerőforrásokat.
Példányosítsa az osztályt, amelyre az előző Settings szakaszban hivatkoztak. A beállításokkal létrehozhat egy AzureOpenAIClient-t az ügynökdefinícióhoz, valamint a fájlfeltöltéshez.
Settings settings = new();
AzureOpenAIClient client = OpenAIAssistantAgent.CreateAzureOpenAIClient(new AzureCliCredential(), new Uri(settings.AzureOpenAI.Endpoint));
A funkció jelenleg nem érhető el a Javában.
Használd a AzureOpenAIClient-t egy OpenAIFileClient eléréséhez, és töltsd fel az előző Konfiguráció szakaszban ismertetett két adatfájlt, a Fájlhivatkozás megőrzésével a végleges törléshez.
Console.WriteLine("Uploading files...");
OpenAIFileClient fileClient = client.GetOpenAIFileClient();
OpenAIFile fileDataCountryDetail = await fileClient.UploadFileAsync("PopulationByAdmin1.csv", FileUploadPurpose.Assistants);
OpenAIFile fileDataCountryList = await fileClient.UploadFileAsync("PopulationByCountry.csv", FileUploadPurpose.Assistants);
Mielőtt létrehoz egy AzureAssistantAgent vagy egy OpenAIAssistantAgent, győződjön meg arról, hogy a konfigurációs beállítások elérhetők, és előkészíti a fájlerőforrásokat.
Tipp
Előfordulhat, hogy módosítania kell a fájl elérési útját attól függően, hogy hol találhatók a fájlok.
# Let's form the file paths that we will use as part of file upload
csv_file_path_1 = os.path.join(
os.path.dirname(os.path.dirname(os.path.realpath(__file__))),
"resources",
"PopulationByAdmin1.csv",
)
csv_file_path_2 = os.path.join(
os.path.dirname(os.path.dirname(os.path.realpath(__file__))),
"resources",
"PopulationByCountry.csv",
)
# Create the client using Azure OpenAI resources and configuration
client, model = AzureAssistantAgent.setup_resources()
# Upload the files to the client
file_ids: list[str] = []
for path in [csv_file_path_1, csv_file_path_2]:
with open(path, "rb") as file:
file = await client.files.create(file=file, purpose="assistants")
file_ids.append(file.id)
# Get the code interpreter tool and resources
code_interpreter_tools, code_interpreter_tool_resources = AzureAssistantAgent.configure_code_interpreter_tool(
file_ids=file_ids
)
# Create the assistant definition
definition = await client.beta.assistants.create(
model=model,
instructions="""
Analyze the available data to provide an answer to the user's question.
Always format response using markdown.
Always include a numerical index that starts at 1 for any lists or tables.
Always sort lists in ascending order.
""",
name="SampleAssistantAgent",
tools=code_interpreter_tools,
tool_resources=code_interpreter_tool_resources,
)
Először az Azure OpenAI-erőforrásokat állítjuk be az ügyfél és a modell beszerzéséhez. Ezután feltöltjük a CSV-fájlokat a megadott útvonalakról az ügyfél Files API-jával. Ezután a code_interpreter_tool a feltöltött fájlazonosítók használatával konfiguráljuk, amelyek a létrehozáskor az asszisztenshez vannak csatolva a modell, az utasítások és a név mellett.
A funkció jelenleg nem érhető el a Javában.
Ügynökdefiníció
Most már készen állunk egy OpenAIAssistantAgent létrehozására úgy, hogy először készítünk egy segítő definíciót. Az asszisztens úgy van konfigurálva, hogy tartalmazza a célmodelljét, az Utasításokat, és engedélyezve van a Kódértelmező eszköz. Emellett kifejezetten társítjuk a két adatfájlt a Kódértelmező eszközzel.
Console.WriteLine("Defining agent...");
AssistantClient assistantClient = client.GetAssistantClient();
Assistant assistant =
await assistantClient.CreateAssistantAsync(
settings.AzureOpenAI.ChatModelDeployment,
name: "SampleAssistantAgent",
instructions:
"""
Analyze the available data to provide an answer to the user's question.
Always format response using markdown.
Always include a numerical index that starts at 1 for any lists or tables.
Always sort lists in ascending order.
""",
enableCodeInterpreter: true,
codeInterpreterFileIds: [fileDataCountryList.Id, fileDataCountryDetail.Id]);
// Create agent
OpenAIAssistantAgent agent = new(assistant, assistantClient);
Most készen állunk egy AzureAssistantAgent példányának létrehozására. Az ügynök az ügyféllel és az asszisztens definíciójával van konfigurálva.
# Create the agent using the client and the assistant definition
agent = AzureAssistantAgent(
client=client,
definition=definition,
)
A funkció jelenleg nem érhető el a Javában.
A csevegési ciklus
Végre össze tudjuk hangolni a felhasználó és a Agentközötti interakciót. Először hozzon létre egy AgentThread a beszélgetés állapotának fenntartásához és egy üres hurok létrehozásához.
Gondoskodjunk arról is, hogy az erőforrások a végrehajtás végén el legyenek távolítva a szükségtelen díjak minimalizálása érdekében.
Console.WriteLine("Creating thread...");
AssistantAgentThread agentThread = new();
Console.WriteLine("Ready!");
try
{
bool isComplete = false;
List<string> fileIds = [];
do
{
} while (!isComplete);
}
finally
{
Console.WriteLine();
Console.WriteLine("Cleaning-up...");
await Task.WhenAll(
[
agentThread.DeleteAsync(),
assistantClient.DeleteAssistantAsync(assistant.Id),
fileClient.DeleteFileAsync(fileDataCountryList.Id),
fileClient.DeleteFileAsync(fileDataCountryDetail.Id),
]);
}
thread: AssistantAgentThread = None
try:
is_complete: bool = False
file_ids: list[str] = []
while not is_complete:
# agent interaction logic here
finally:
print("\nCleaning up resources...")
[await client.files.delete(file_id) for file_id in file_ids]
await thread.delete() if thread else None
await client.beta.assistants.delete(agent.id)
A funkció jelenleg nem érhető el a Javában.
Most rögzítsük a felhasználói bemenetet az előző ciklusban. Ebben az esetben a rendszer figyelmen kívül hagyja az üres bemenetet, és a kifejezés EXIT azt jelzi, hogy a beszélgetés befejeződött.
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
A funkció jelenleg nem érhető el a Javában.
A Agent válasz meghívása előtt adjunk hozzá néhány segítő módszert a Agentáltal esetleg létrehozott fájlok letöltéséhez.
Itt fájltartalmat helyezünk el a rendszer által meghatározott ideiglenes könyvtárban, majd elindítjuk a rendszer által definiált megtekintő alkalmazást.
private static async Task DownloadResponseImageAsync(OpenAIFileClient client, ICollection<string> fileIds)
{
if (fileIds.Count > 0)
{
Console.WriteLine();
foreach (string fileId in fileIds)
{
await DownloadFileContentAsync(client, fileId, launchViewer: true);
}
}
}
private static async Task DownloadFileContentAsync(OpenAIFileClient client, string fileId, bool launchViewer = false)
{
OpenAIFile fileInfo = client.GetFile(fileId);
if (fileInfo.Purpose == FilePurpose.AssistantsOutput)
{
string filePath =
Path.Combine(
Path.GetTempPath(),
Path.GetFileName(Path.ChangeExtension(fileInfo.Filename, ".png")));
BinaryData content = await client.DownloadFileAsync(fileId);
await using FileStream fileStream = new(filePath, FileMode.CreateNew);
await content.ToStream().CopyToAsync(fileStream);
Console.WriteLine($"File saved to: {filePath}.");
if (launchViewer)
{
Process.Start(
new ProcessStartInfo
{
FileName = "cmd.exe",
Arguments = $"/C start {filePath}"
});
}
}
}
import os
async def download_file_content(agent, file_id: str):
try:
# Fetch the content of the file using the provided method
response_content = await agent.client.files.content(file_id)
# Get the current working directory of the file
current_directory = os.path.dirname(os.path.abspath(__file__))
# Define the path to save the image in the current directory
file_path = os.path.join(
current_directory, # Use the current directory of the file
f"{file_id}.png" # You can modify this to use the actual filename with proper extension
)
# Save content to a file asynchronously
with open(file_path, "wb") as file:
file.write(response_content.content)
print(f"File saved to: {file_path}")
except Exception as e:
print(f"An error occurred while downloading file {file_id}: {str(e)}")
async def download_response_image(agent, file_ids: list[str]):
if file_ids:
# Iterate over file_ids and download each one
for file_id in file_ids:
await download_file_content(agent, file_id)
A funkció jelenleg nem érhető el a Javában.
Ha Agent választ szeretne létrehozni a felhasználói bemenetre, hívja meg az ügynököt az üzenet és a AgentThreadmegadásával. Ebben a példában egy streamelt választ választunk, és rögzítjük a létrehozott fájlhivatkozásokat letöltésre és áttekintésre a válaszciklus végén. Fontos megjegyezni, hogy a létrehozott kódot egy metaadat-kulcs jelenléte azonosítja a válaszüzenetben, megkülönböztetve azt a beszélgetési választól.
bool isCode = false;
await foreach (StreamingChatMessageContent response in agent.InvokeStreamingAsync(message, agentThread))
{
if (isCode != (response.Metadata?.ContainsKey(OpenAIAssistantAgent.CodeInterpreterMetadataKey) ?? false))
{
Console.WriteLine();
isCode = !isCode;
}
// Display response.
Console.Write($"{response.Content}");
// Capture file IDs for downloading.
fileIds.AddRange(response.Items.OfType<StreamingFileReferenceContent>().Select(item => item.FileId));
}
Console.WriteLine();
// Download any files referenced in the response.
await DownloadResponseImageAsync(fileClient, fileIds);
fileIds.Clear();
is_code = False
last_role = None
async for response in agent.invoke_stream(messages=user_input, thread=thread):
current_is_code = response.metadata.get("code", False)
if current_is_code:
if not is_code:
print("\n\n```python")
is_code = True
print(response.content, end="", flush=True)
else:
if is_code:
print("\n```")
is_code = False
last_role = None
if hasattr(response, "role") and response.role is not None and last_role != response.role:
print(f"\n# {response.role}: ", end="", flush=True)
last_role = response.role
print(response.content, end="", flush=True)
file_ids.extend([
item.file_id for item in response.items if isinstance(item, StreamingFileReferenceContent)
])
thread = response.thread
if is_code:
print("```\n")
print()
await download_response_image(agent, file_ids)
file_ids.clear()
A funkció jelenleg nem érhető el a Javában.
Végső
Az összes lépést összehozva, itt van a végleges kód ehhez a példához. A teljes megvalósítást alább találja.
Próbálja meg használni a következő javasolt bemeneteket:
- Hasonlítsa össze a fájlokat annak megállapításához, hogy hány országban nincs meghatározva állam vagy tartomány a teljes számhoz képest
- Hozzon létre egy táblát azoknak az országoknak, amelyekben az állam vagy a tartomány definiálva van. Az államok vagy tartományok és a teljes népesség számának belefoglalása
- Adjon meg sávdiagramot azoknak az országoknak, amelyeknek a neve ugyanazzal a betűvel kezdődik, és rendezze az x tengelyt a legmagasabbtól a legalacsonyabbig (az összes országot is belefoglalva)
using Azure.AI.OpenAI;
using Azure.Identity;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Agents.OpenAI;
using Microsoft.SemanticKernel.ChatCompletion;
using OpenAI.Assistants;
using OpenAI.Files;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
namespace AgentsSample;
public static class Program
{
public static async Task Main()
{
// Load configuration from environment variables or user secrets.
Settings settings = new();
// Initialize the clients
AzureOpenAIClient client = OpenAIAssistantAgent.CreateAzureOpenAIClient(new AzureCliCredential(), new Uri(settings.AzureOpenAI.Endpoint));
//OpenAIClient client = OpenAIAssistantAgent.CreateOpenAIClient(new ApiKeyCredential(settings.OpenAI.ApiKey)));
AssistantClient assistantClient = client.GetAssistantClient();
OpenAIFileClient fileClient = client.GetOpenAIFileClient();
// Upload files
Console.WriteLine("Uploading files...");
OpenAIFile fileDataCountryDetail = await fileClient.UploadFileAsync("PopulationByAdmin1.csv", FileUploadPurpose.Assistants);
OpenAIFile fileDataCountryList = await fileClient.UploadFileAsync("PopulationByCountry.csv", FileUploadPurpose.Assistants);
// Define assistant
Console.WriteLine("Defining assistant...");
Assistant assistant =
await assistantClient.CreateAssistantAsync(
settings.AzureOpenAI.ChatModelDeployment,
name: "SampleAssistantAgent",
instructions:
"""
Analyze the available data to provide an answer to the user's question.
Always format response using markdown.
Always include a numerical index that starts at 1 for any lists or tables.
Always sort lists in ascending order.
""",
enableCodeInterpreter: true,
codeInterpreterFileIds: [fileDataCountryList.Id, fileDataCountryDetail.Id]);
// Create agent
OpenAIAssistantAgent agent = new(assistant, assistantClient);
// Create the conversation thread
Console.WriteLine("Creating thread...");
AssistantAgentThread agentThread = new();
Console.WriteLine("Ready!");
try
{
bool isComplete = false;
List<string> fileIds = [];
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();
bool isCode = false;
await foreach (StreamingChatMessageContent response in agent.InvokeStreamingAsync(message, agentThread))
{
if (isCode != (response.Metadata?.ContainsKey(OpenAIAssistantAgent.CodeInterpreterMetadataKey) ?? false))
{
Console.WriteLine();
isCode = !isCode;
}
// Display response.
Console.Write($"{response.Content}");
// Capture file IDs for downloading.
fileIds.AddRange(response.Items.OfType<StreamingFileReferenceContent>().Select(item => item.FileId));
}
Console.WriteLine();
// Download any files referenced in the response.
await DownloadResponseImageAsync(fileClient, fileIds);
fileIds.Clear();
} while (!isComplete);
}
finally
{
Console.WriteLine();
Console.WriteLine("Cleaning-up...");
await Task.WhenAll(
[
agentThread.DeleteAsync(),
assistantClient.DeleteAssistantAsync(assistant.Id),
fileClient.DeleteFileAsync(fileDataCountryList.Id),
fileClient.DeleteFileAsync(fileDataCountryDetail.Id),
]);
}
}
private static async Task DownloadResponseImageAsync(OpenAIFileClient client, ICollection<string> fileIds)
{
if (fileIds.Count > 0)
{
Console.WriteLine();
foreach (string fileId in fileIds)
{
await DownloadFileContentAsync(client, fileId, launchViewer: true);
}
}
}
private static async Task DownloadFileContentAsync(OpenAIFileClient client, string fileId, bool launchViewer = false)
{
OpenAIFile fileInfo = client.GetFile(fileId);
if (fileInfo.Purpose == FilePurpose.AssistantsOutput)
{
string filePath =
Path.Combine(
Path.GetTempPath(),
Path.GetFileName(Path.ChangeExtension(fileInfo.Filename, ".png")));
BinaryData content = await client.DownloadFileAsync(fileId);
await using FileStream fileStream = new(filePath, FileMode.CreateNew);
await content.ToStream().CopyToAsync(fileStream);
Console.WriteLine($"File saved to: {filePath}.");
if (launchViewer)
{
Process.Start(
new ProcessStartInfo
{
FileName = "cmd.exe",
Arguments = $"/C start {filePath}"
});
}
}
}
}
import asyncio
import logging
import os
from semantic_kernel.agents import AssistantAgentThread, AzureAssistantAgent
from semantic_kernel.contents import StreamingFileReferenceContent
logging.basicConfig(level=logging.ERROR)
"""
The following sample demonstrates how to create a simple,
OpenAI assistant agent that utilizes the code interpreter
to analyze uploaded files.
"""
# Let's form the file paths that we will later pass to the assistant
csv_file_path_1 = os.path.join(
os.path.dirname(os.path.dirname(os.path.realpath(__file__))),
"resources",
"PopulationByAdmin1.csv",
)
csv_file_path_2 = os.path.join(
os.path.dirname(os.path.dirname(os.path.realpath(__file__))),
"resources",
"PopulationByCountry.csv",
)
async def download_file_content(agent: AzureAssistantAgent, file_id: str):
try:
# Fetch the content of the file using the provided method
response_content = await agent.client.files.content(file_id)
# Get the current working directory of the file
current_directory = os.path.dirname(os.path.abspath(__file__))
# Define the path to save the image in the current directory
file_path = os.path.join(
current_directory, # Use the current directory of the file
f"{file_id}.png", # You can modify this to use the actual filename with proper extension
)
# Save content to a file asynchronously
with open(file_path, "wb") as file:
file.write(response_content.content)
print(f"File saved to: {file_path}")
except Exception as e:
print(f"An error occurred while downloading file {file_id}: {str(e)}")
async def download_response_image(agent: AzureAssistantAgent, file_ids: list[str]):
if file_ids:
# Iterate over file_ids and download each one
for file_id in file_ids:
await download_file_content(agent, file_id)
async def main():
# Create the client using Azure OpenAI resources and configuration
client, model = AzureAssistantAgent.setup_resources()
# Upload the files to the client
file_ids: list[str] = []
for path in [csv_file_path_1, csv_file_path_2]:
with open(path, "rb") as file:
file = await client.files.create(file=file, purpose="assistants")
file_ids.append(file.id)
# Get the code interpreter tool and resources
code_interpreter_tools, code_interpreter_tool_resources = AzureAssistantAgent.configure_code_interpreter_tool(
file_ids=file_ids
)
# Create the assistant definition
definition = await client.beta.assistants.create(
model=model,
instructions="""
Analyze the available data to provide an answer to the user's question.
Always format response using markdown.
Always include a numerical index that starts at 1 for any lists or tables.
Always sort lists in ascending order.
""",
name="SampleAssistantAgent",
tools=code_interpreter_tools,
tool_resources=code_interpreter_tool_resources,
)
# Create the agent using the client and the assistant definition
agent = AzureAssistantAgent(
client=client,
definition=definition,
)
thread: AssistantAgentThread = None
try:
is_complete: bool = False
file_ids: list[str] = []
while not is_complete:
user_input = input("User:> ")
if not user_input:
continue
if user_input.lower() == "exit":
is_complete = True
break
is_code = False
last_role = None
async for response in agent.invoke_stream(messages=user_input, thread=thread):
current_is_code = response.metadata.get("code", False)
if current_is_code:
if not is_code:
print("\n\n```python")
is_code = True
print(response.content, end="", flush=True)
else:
if is_code:
print("\n```")
is_code = False
last_role = None
if hasattr(response, "role") and response.role is not None and last_role != response.role:
print(f"\n# {response.role}: ", end="", flush=True)
last_role = response.role
print(response.content, end="", flush=True)
file_ids.extend([
item.file_id for item in response.items if isinstance(item, StreamingFileReferenceContent)
])
thread = response.thread
if is_code:
print("```\n")
print()
await download_response_image(agent, file_ids)
file_ids.clear()
finally:
print("\nCleaning up resources...")
[await client.files.delete(file_id) for file_id in file_ids]
await thread.delete() if thread else None
await client.beta.assistants.delete(agent.id)
if __name__ == "__main__":
asyncio.run(main())
A teljes kóda fent látható módon az adattárunkban található.
A funkció jelenleg nem érhető el a Javában.