Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
À mesure que nous transférons certains agents de la phase expérimentale à la phase candidate de publication, nous avons mis à jour les API pour simplifier et simplifier leur utilisation. Reportez-vous au guide de scénario spécifique pour savoir comment mettre à jour votre code existant pour utiliser les dernières API disponibles.
API d’appel d’agent commun
Dans la version 1.43.0, nous publions une nouvelle API d’appel d’agent commune, qui permettra à tous les types d’agents d’être appelés via une API commune.
Pour activer cette nouvelle API, nous introduisons le concept d'un AgentThread, qui représente un fil de conversation et abstrait les différentes exigences de gestion des fils pour différents types d'agents. Pour certains types d’agents, il permettra également à l’avenir d’utiliser différentes implémentations de threads avec le même agent.
Les méthodes courantes Invoke que nous introduisons vous permettent de fournir les messages que vous souhaitez transmettre à l’agent et un message facultatif AgentThread. Si un AgentThread est fourni, cela continuera la conversation déjà en cours sur le AgentThread. Si aucun AgentThread n’est fourni, un nouveau fil par défaut sera créé et renvoyé dans la réponse.
Il est également possible de créer manuellement une AgentThread instance, par exemple dans les cas où vous pouvez avoir un ID de thread à partir du service d’agent sous-jacent et que vous souhaitez continuer ce thread. Vous pouvez également personnaliser les options du thread, par exemple les outils associés.
Voici un exemple simple de la façon dont n’importe quel agent peut désormais être utilisé avec du code indépendant de l’agent.
private async Task UseAgentAsync(Agent agent, AgentThread? agentThread = null)
{
// Invoke the agent, and continue the existing thread if provided.
var responses = agent.InvokeAsync(new ChatMessageContent(AuthorRole.User, "Hi"), agentThread);
// Output results.
await foreach (AgentResponseItem<ChatMessageContent> response in responses)
{
Console.WriteLine(response);
agentThread = response.Thread;
}
// Delete the thread if required.
if (agentThread is not null)
{
await agentThread.DeleteAsync();
}
}
Ces modifications ont été appliquées dans :
Options de thread de l’agent Azure AI
Actuellement, le AzureAIAgent prend uniquement en charge les fils de type AzureAIAgentThread.
En plus d’autoriser la création automatique d’un thread sur l’appel de l’agent, vous pouvez également construire manuellement une instance d’un AzureAIAgentThread.
AzureAIAgentThread peut être créé avec des outils et des métadonnées personnalisés, ainsi qu’avec des messages pour amorcer la conversation.
AgentThread thread = new AzureAIAgentThread(
agentsClient,
messages: seedMessages,
toolResources: tools,
metadata: metadata);
Vous pouvez également construire une instance de AzureAIAgentThread qui poursuit une conversation existante.
AgentThread thread = new AzureAIAgentThread(
agentsClient,
id: "my-existing-thread-id");
Options de thread de l’agent Bedrock
Actuellement, le BedrockAgent prend uniquement en charge les fils de type BedrockAgentThread.
En plus d’autoriser la création automatique d’un thread sur l’appel de l’agent, vous pouvez également construire manuellement une instance d’un BedrockAgentThread.
AgentThread thread = new BedrockAgentThread(amazonBedrockAgentRuntimeClient);
Vous pouvez également construire une instance de BedrockAgentThread qui poursuit une conversation existante.
AgentThread thread = new BedrockAgentThread(
amazonBedrockAgentRuntimeClient,
sessionId: "my-existing-session-id");
Options de fil de l’agent de complétion de chat
Actuellement, le ChatCompletionAgent prend uniquement en charge les fils de type ChatHistoryAgentThread.
ChatHistoryAgentThread utilise un objet en mémoire ChatHistory pour stocker les messages sur le thread.
En plus d’autoriser la création automatique d’un thread sur l’appel de l’agent, vous pouvez également construire manuellement une instance d’un ChatHistoryAgentThread.
AgentThread thread = new ChatHistoryAgentThread();
Vous pouvez également construire une instance d’un ChatHistoryAgentThread pour continuer une conversation existante en transmettant un objet ChatHistory avec les messages déjà présents.
ChatHistory chatHistory = new([new ChatMessageContent(AuthorRole.User, "Hi")]);
AgentThread thread = new ChatHistoryAgentThread(chatHistory: chatHistory);
Options de thread de l’Assistant OpenAI
Actuellement, le OpenAIAssistantAgent prend uniquement en charge les fils de type OpenAIAssistantAgentThread.
En plus d’autoriser la création automatique d’un thread sur l’appel de l’agent, vous pouvez également construire manuellement une instance d’un OpenAIAssistantAgentThread.
OpenAIAssistantAgentThread peut être créé avec des outils et des métadonnées personnalisés, ainsi que des messages pour initialiser la conversation.
AgentThread thread = new OpenAIAssistantAgentThread(
assistantClient,
messages: seedMessages,
codeInterpreterFileIds: fileIds,
vectorStoreId: "my-vector-store",
metadata: metadata);
Vous pouvez également construire une instance de OpenAIAssistantAgentThread qui poursuit une conversation existante.
AgentThread thread = new OpenAIAssistantAgentThread(
assistantClient,
id: "my-existing-thread-id");
OpenAIAssistantAgent C# Migration Guide
Nous avons récemment mis en œuvre un changement significatif concernant le OpenAIAssistantAgent dans le framework pour l'agent Kernel sémantique.
Ces modifications ont été appliquées dans :
Ces modifications sont destinées à :
- Aligner avec le modèle à utiliser pour notre
AzureAIAgent. - Corrigez les bogues liés au modèle d’initialisation statique.
- Évitez de limiter les fonctionnalités en fonction de notre abstraction du Kit de développement logiciel (SDK) sous-jacent.
Ce guide fournit des instructions pas à pas pour migrer votre code C# de l’ancienne implémentation vers la nouvelle. Les modifications incluent des mises à jour pour la création d’assistants, la gestion du cycle de vie de l’Assistant, la gestion des threads, des fichiers et des magasins vectoriels.
1. Création d’une instance client
Auparavant, OpenAIClientProvider était nécessaire pour créer n’importe quel OpenAIAssistantAgent. Cette dépendance a été simplifiée.
Nouvelle façon
OpenAIClient client = OpenAIAssistantAgent.CreateAzureOpenAIClient(new AzureCliCredential(), new Uri(endpointUrl));
AssistantClient assistantClient = client.GetAssistantClient();
Old Way (déconseillé)
var clientProvider = new OpenAIClientProvider(...);
2. Cycle de vie de l’Assistant
Création d’un Assistant
Vous pouvez maintenant instancier directement un OpenAIAssistantAgent à l'aide d'une définition d'Assistant existante ou nouvelle depuis AssistantClient.
Nouvelle façon
Assistant definition = await assistantClient.GetAssistantAsync(assistantId);
OpenAIAssistantAgent agent = new(definition, client);
Les plug-ins peuvent être directement inclus lors de l’initialisation :
KernelPlugin plugin = KernelPluginFactory.CreateFromType<YourPlugin>();
Assistant definition = await assistantClient.GetAssistantAsync(assistantId);
OpenAIAssistantAgent agent = new(definition, client, [plugin]);
Création d’une définition d’assistant à l’aide d’une méthode d’extension :
Assistant assistant = await assistantClient.CreateAssistantAsync(
model,
name,
instructions: instructions,
enableCodeInterpreter: true);
Old Way (déconseillé)
Auparavant, les définitions d’assistant étaient gérées indirectement.
3. Invoquer l'Agent
Vous pouvez spécifier RunCreationOptions directement, en activant l’accès complet aux fonctionnalités du Kit de développement logiciel (SDK) sous-jacentes.
Nouvelle façon
RunCreationOptions options = new(); // configure as needed
var result = await agent.InvokeAsync(options);
Old Way (déconseillé)
var options = new OpenAIAssistantInvocationOptions();
4. Suppression de l’Assistant
Vous pouvez gérer directement la suppression de l’Assistant avec AssistantClient.
await assistantClient.DeleteAssistantAsync(agent.Id);
5. Cycle de vie du fil
Création d’un thread
Les threads sont désormais gérés via AssistantAgentThread.
Nouvelle façon
var thread = new AssistantAgentThread(assistantClient);
// Calling CreateAsync is an optional step.
// A thread will be created automatically on first use if CreateAsync was not called.
// Note that CreateAsync is not on the AgentThread base implementation since not all
// agent services support explicit thread creation.
await thread.CreateAsync();
Old Way (déconseillé)
Auparavant, la gestion des threads était indirecte ou liée à l’agent.
Suppression de threads
var thread = new AssistantAgentThread(assistantClient, "existing-thread-id");
await thread.DeleteAsync();
6. Cycle de vie des fichiers
La création et la suppression de fichiers utilisent OpenAIFileClientdésormais .
Chargement de fichiers
string fileId = await client.UploadAssistantFileAsync(stream, "<filename>");
Suppression de fichiers
await client.DeleteFileAsync(fileId);
7. Cycle de vie du stockage vectoriel
Les magasins vectoriels sont gérés directement par le biais de VectorStoreClient, avec des méthodes d'extension pratiques.
Création d’une base de vecteurs
string vectorStoreId = await client.CreateVectorStoreAsync([fileId1, fileId2], waitUntilCompleted: true);
Suppression de la base de données vectorielle
await client.DeleteVectorStoreAsync(vectorStoreId);
Compatibilité rétroactive
Les modèles déconseillés sont marqués avec [Obsolete]. Pour supprimer les avertissements obsolètes (CS0618), mettez à jour votre fichier projet comme suit :
<PropertyGroup>
<NoWarn>$(NoWarn);CS0618</NoWarn>
</PropertyGroup>
Ce guide de migration vous permet de passer en douceur à la nouvelle implémentation, en simplifiant l’initialisation du client, la gestion des ressources et l’intégration avec le SDK .NET du noyau sémantique.
Important
Pour les développeurs qui effectuent une mise à niveau vers Noyau sémantique Python 1.26.1 ou version ultérieure, des mises à jour importantes et des changements cassants ont été introduits pour améliorer notre framework d’agent au fur et à mesure que nous approchons de la disponibilité générale.
Ces modifications ont été appliquées dans :
Les modifications précédentes ont été appliquées dans :
Ce guide fournit des instructions pas à pas pour migrer votre code Python de l’ancienne implémentation vers la nouvelle implémentation.
Importations de l’agent
Tous les chemins d’importation de l’agent ont été consolidés sous semantic_kernel.agents.
Style d’importation mis à jour
from semantic_kernel.agents import (
AutoGenConversableAgent,
AzureAIAgent,
AzureAssistantAgent,
BedrockAgent,
ChatCompletionAgent,
OpenAIAssistantAgent,
)
Style d’importation précédent (déconseillé) :
from semantic_kernel.agents import ChatCompletionAgent
from semantic_kernel.agents.autogen import AutoGenConversableAgent
from semantic_kernel.agents.azure_ai import AzureAIAgent
from semantic_kernel.agents.bedrock import BedrockAgent
from semantic_kernel.agents.open_ai import AzureAssistantAgent, OpenAIAssistantAgent
API d’appel d’agent commun
À partir du noyau sémantique Python 1.26.0 et versions ultérieures, nous avons introduit une nouvelle abstraction commune pour gérer les threads pour tous les agents. Pour chaque agent, nous exposons désormais une classe de thread qui implémente la classe de base, permettant la gestion du contexte via des méthodes telles que AgentThread et create().
Les réponses get_response(...) de l’agent, invoke(...), invoke_stream(...) retournent maintenant un AgentResponseItem[ChatMessageContent], qui ont deux attributs :
message: TMessage # Usually ChatMessageContent
thread: AgentThread # Contains the concrete type for the given agent
Ajout de messages à un thread
Les messages doivent être ajoutés à un thread via l’argument messages dans le cadre des méthodes get_response(...), invoke(...) ou invoke_stream(...) de l’agent.
Fil de l’agent Azure AI
Vous pouvez créer une AzureAIAgentThread valeur comme suit :
from semantic_kernel.agents import AzureAIAgentThread
thread = AzureAIAgentThread(
client: AIProjectClient, # required
messages: list[ThreadMessageOptions] | None = None, # optional
metadata: dict[str, str] | None = None, # optional
thread_id: str | None = None, # optional
tool_resources: "ToolResources | None" = None, # optional
)
La fourniture d’une thread_id (chaîne) vous permet de poursuivre une conversation existante. S’il est omis, un nouveau fil est créé et renvoyé dans la réponse de l’agent.
Exemple d’implémentation complet :
import asyncio
from azure.identity.aio import DefaultAzureCredential
from semantic_kernel.agents import AzureAIAgent, AzureAIAgentSettings, AzureAIAgentThread
USER_INPUTS = [
"Why is the sky blue?",
"What are we talking about?",
]
async def main() -> None:
ai_agent_settings = AzureAIAgentSettings.create()
async with (
DefaultAzureCredential() as creds,
AzureAIAgent.create_client(credential=creds) as client,
):
# 1. Create an agent on the Azure AI agent service
agent_definition = await client.agents.create_agent(
model=ai_agent_settings.model_deployment_name,
name="Assistant",
instructions="Answer the user's questions.",
)
# 2. Create a Semantic Kernel agent for the Azure AI agent
agent = AzureAIAgent(
client=client,
definition=agent_definition,
)
# 3. Create a thread for the agent
# If no thread is provided, a new thread will be
# created and returned with the initial response
thread: AzureAIAgentThread = None
try:
for user_input in USER_INPUTS:
print(f"# User: {user_input}")
# 4. Invoke the agent with the specified message for response
response = await agent.get_response(messages=user_input, thread=thread)
print(f"# {response.content}: {response}")
thread = response.thread
finally:
# 6. Cleanup: Delete the thread and agent
await thread.delete() if thread else None
await client.agents.delete_agent(agent.id)
if __name__ == "__main__":
asyncio.run(main())
Thread de l’agent Bedrock
A BedrockAgent utilise un BedrockAgentThread pour gérer l’historique et le contexte des conversations. Vous pouvez fournir un session_id pour continuer une conversation existante ou en initier une nouvelle.
from semantic_kernel.agents import BedrockAgentThread
thread = BedrockAgentThread(
bedrock_runtime_client: Any,
session_id: str | None = None,
)
Si aucun session_id n'est fourni, un nouveau contexte est créé automatiquement.
Exemple d’implémentation complet :
import asyncio
from semantic_kernel.agents import BedrockAgent, BedrockAgentThread
async def main():
bedrock_agent = await BedrockAgent.create_and_prepare_agent(
"semantic-kernel-bedrock-agent",
instructions="You are a friendly assistant. You help people find information.",
)
# Create a thread for the agent
# If no thread is provided, a new thread will be
# created and returned with the initial response
thread: BedrockAgentThread = None
try:
while True:
user_input = input("User:> ")
if user_input == "exit":
print("\n\nExiting chat...")
break
# Invoke the agent
# The chat history is maintained in the session
response = await bedrock_agent.get_response(
input_text=user_input,
thread=thread,
)
print(f"Bedrock agent: {response}")
thread = response.thread
except KeyboardInterrupt:
print("\n\nExiting chat...")
return False
except EOFError:
print("\n\nExiting chat...")
return False
finally:
# Delete the agent
await bedrock_agent.delete_agent()
await thread.delete() if thread else None
if __name__ == "__main__":
asyncio.run(main())
Fil de discussion de l'agent - Historique des conversations
ChatCompletionAgent utilise ChatHistoryAgentThread pour gérer l’historique des conversations. Il peut être initialisé comme suit :
from semantic_kernel.agents import ChatHistoryAgentThread
thread = ChatHistoryAgentThread(
chat_history: ChatHistory | None = None,
thread_id: str | None = None
)
Fournir un thread_id permet de poursuivre les conversations existantes. Omettre cela crée un nouveau thread. La sérialisation et la réactivation de l’état du thread sont prises en charge pour les contextes de conversation persistants.
Exemple d’implémentation complet :
import asyncio
from semantic_kernel.agents import ChatCompletionAgent, ChatHistoryAgentThread
from semantic_kernel.connectors.ai.open_ai import AzureChatCompletion
# Simulate a conversation with the agent
USER_INPUTS = [
"Hello, I am John Doe.",
"What is your name?",
"What is my name?",
]
async def main():
# 1. Create the agent by specifying the service
agent = ChatCompletionAgent(
service=AzureChatCompletion(),
name="Assistant",
instructions="Answer the user's questions.",
)
# 2. Create a thread to hold the conversation
# If no thread is provided, a new thread will be
# created and returned with the initial response
thread: ChatHistoryAgentThread = None
for user_input in USER_INPUTS:
print(f"# User: {user_input}")
# 3. Invoke the agent for a response
response = await agent.get_response(
messages=user_input,
thread=thread,
)
print(f"# {response.name}: {response}")
# 4. Store the thread, which allows the agent to
# maintain conversation history across multiple messages.
thread = response.thread
# 5. Cleanup: Clear the thread
await thread.delete() if thread else None
if __name__ == "__main__":
asyncio.run(main())
Fil de l’assistant OpenAI
Les AzureAssistantAgent et OpenAIAssistantAgent utilisent AssistantAgentThread pour gérer l’historique des conversations et le contexte.
from semantic_kernel.agents import ChatHistoryAgentThread
thread = AssistantAgentThread(
client: AsyncOpenAI,
thread_id: str | None = None,
messages: Iterable["ThreadCreateMessage"] | NotGiven = NOT_GIVEN,
metadata: dict[str, Any] | NotGiven = NOT_GIVEN,
tool_resources: ToolResources | NotGiven = NOT_GIVEN,
)
Fournir un thread_id permet de poursuivre une conversation existante ; sinon, un nouveau fil est créé.
Exemple d’implémentation complet :
# Copyright (c) Microsoft. All rights reserved.
import asyncio
from semantic_kernel.agents import AzureAssistantAgent
# Simulate a conversation with the agent
USER_INPUTS = [
"Why is the sky blue?",
"What is the speed of light?",
"What have we been talking about?",
]
async def main():
# 1. Create the client using Azure OpenAI resources and configuration
client, model = AzureAssistantAgent.setup_resources()
# 2. Create the assistant on the Azure OpenAI service
definition = await client.beta.assistants.create(
model=model,
instructions="Answer questions about the world in one sentence.",
name="Assistant",
)
# 3. Create a Semantic Kernel agent for the Azure OpenAI assistant
agent = AzureAssistantAgent(
client=client,
definition=definition,
)
# 4. Create a new thread for use with the assistant
# If no thread is provided, a new thread will be
# created and returned with the initial response
thread = None
try:
for user_input in USER_INPUTS:
print(f"# User: '{user_input}'")
# 6. Invoke the agent for the current thread and print the response
response = await agent.get_response(messages=user_input, thread=thread)
print(f"# {response.name}: {response}")
thread = response.thread
finally:
# 7. Clean up the resources
await thread.delete() if thread else None
await agent.client.beta.assistants.delete(assistant_id=agent.id)
if __name__ == "__main__":
asyncio.run(main())
Entrées de message pour l’appel de l’agent
Les implémentations précédentes n’ont autorisé qu’une seule entrée de message à des méthodes telles que get_response(...), invoke(...)et invoke_stream(...). Nous avons maintenant mis à jour ces méthodes pour prendre en charge plusieurs messages (str | ChatMessageContent | list[str | ChatMessageContent]). Les entrées de message doivent être transmises avec l’argument messages de mot clé, tel que agent.get_response(messages="user input") ou agent.invoke(messages="user input").
Les méthodes d’appel d’agent ont besoin de mises à jour comme suit :
Ancienne Méthode
response = await agent.get_response(message="some user input", thread=thread)
Nouvelle façon
response = await agent.get_response(messages=["some initial inputer", "other input"], thread=thread)
AzureAIAgent
Dans Le noyau sémantique Python 1.26.0+, la AzureAIAgent création de threads est désormais gérée via l’objet AzureAIAgentThread , et non directement sur le client.
Ancienne Méthode
thread = await client.agents.create_thread()
Nouvelle façon
from semantic_kernel.agents import AzureAIAgentThread
thread = AzureAIAgentThread(
client: AIProjectClient, # required
messages: list[ThreadMessageOptions] | None = None, # optional
metadata: dict[str, str] | None = None, # optional
thread_id: str | None = None, # optional
tool_resources: "ToolResources | None" = None, # optional
)
Si aucun thread_id n'est fourni initialement, un nouveau thread est créé et retourné dans la réponse de l’agent.
ChatCompletionAgent
Le ChatCompletionAgent a été mis à jour pour simplifier la configuration du service, la gestion des plugins et les processus d’appel de fonction. Voici les principales modifications que vous devez prendre en compte lors de la migration.
1. Spécification du service
Vous pouvez maintenant spécifier le service directement dans le cadre du constructeur de l’agent :
Nouvelle façon
from semantic_kernel.agents import ChatCompletionAgent
from semantic_kernel.connectors.ai.open_ai import AzureChatCompletion
agent = ChatCompletionAgent(
service=AzureChatCompletion(),
name="<name>",
instructions="<instructions>",
)
Remarque : Si un noyau et un service sont fournis, le service est prioritaire s’il partage la même service_id ou ai_model_id. Sinon, s’ils sont séparés, le premier service IA inscrit sur le noyau sera utilisé.
Old Way (toujours valide)
Auparavant, vous ajoutez d’abord un service à un noyau, puis transmettez le noyau à l’agent :
from semantic_kernel.agents import ChatCompletionAgent
from semantic_kernel.connectors.ai.open_ai import AzureChatCompletion
kernel = Kernel()
kernel.add_service(AzureChatCompletion())
agent = ChatCompletionAgent(
kernel=kernel,
name="<name>",
instructions="<instructions>",
)
2. Ajout de plug-ins
Les plug-ins peuvent désormais être fournis directement via le constructeur :
Nouvelle façon
from semantic_kernel.agents import ChatCompletionAgent
from semantic_kernel.connectors.ai.open_ai import AzureChatCompletion
agent = ChatCompletionAgent(
service=AzureChatCompletion(),
name="<name>",
instructions="<instructions>",
plugins=[SamplePlugin()],
)
Old Way (toujours valide)
Auparavant, les plug-ins devaient être ajoutés au noyau séparément :
from semantic_kernel.agents import ChatCompletionAgent
from semantic_kernel.connectors.ai.open_ai import AzureChatCompletion
kernel = Kernel()
kernel.add_plugin(SamplePlugin())
agent = ChatCompletionAgent(
kernel=kernel,
name="<name>",
instructions="<instructions>",
)
Remarque : les deux approches sont valides, mais la spécification directe de plug-ins simplifie l’initialisation.
3. Invoquer l'Agent
Vous disposez maintenant de deux façons d’appeler l’agent. La nouvelle méthode récupère directement une seule réponse, tandis que l’ancienne méthode prend en charge la diffusion en continu.
Nouvelle façon (pas de fil de discussion/contexte)
response = await agent.get_response(messages="user input")
# response is of type AgentResponseItem[ChatMessageContent]
Remarque : si la réponse suivante n’utilise pas le thread retourné, la conversation utilise un nouveau thread et ne continuera donc pas avec le contexte précédent.
New Way (réponse unique avec contexte)
thread = ChatHistoryAgentThread()
for user_input in ["First user input", "Second User Input"]:
response = await agent.get_response(messages=user_input, thread=thread)
# response is of type AgentResponseItem[ChatMessageContent]
thread = response.thread
Old Way (non valide)
chat_history = ChatHistory()
chat_history.add_user_message("<user_input>")
response = agent.get_response(message="user input", chat_history=chat_history)
4. Contrôle de l'appel de fonction
Le comportement d’appel de fonction peut désormais être contrôlé directement lors de la spécification du service dans le constructeur de l’agent :
agent = ChatCompletionAgent(
service=AzureChatCompletion(),
name="<name>",
instructions="<instructions>",
plugins=[MenuPlugin()],
function_choice_behavior=FunctionChoiceBehavior.Auto(
filters={"included_functions": ["get_specials", "get_item_price"]}
),
)
Remarque : Auparavant, la configuration d’appel de fonction nécessitait une configuration distincte sur le noyau ou l’objet de service. Si les paramètres d’exécution spécifient le même service_id ou ai_model_id que la configuration du service IA, le comportement d’appel de fonction défini dans les paramètres d’exécution (via KernelArguments) est prioritaire sur le comportement de choix de fonction défini dans le constructeur.
Ces mises à jour améliorent la simplicité et la configuration, ce qui facilite l’intégration et la maintenance de ChatCompletionAgent.
OpenAIAssistantAgent
Les modifications apportées à AzureAssistantAgent et à OpenAIAssistantAgent incluent des mises à jour concernant la création d’assistants, la création de fils de discussion, la gestion des extensions, l’utilisation de l’outil d’interprétation de code, l’utilisation de l’outil de recherche de fichiers et l’ajout de messages de chat à un fil de discussion.
Configuration des ressources
Ancienne Méthode
Le AsyncAzureOpenAI client a été créé dans le cadre de la création de l’objet Agent.
agent = await AzureAssistantAgent.create(
deployment_name="optional-deployment-name",
api_key="optional-api-key",
endpoint="optional-endpoint",
ad_token="optional-ad-token",
ad_token_provider=optional_callable,
default_headers={"optional_header": "optional-header-value"},
env_file_path="optional-env-file-path",
env_file_encoding="optional-env-file-encoding",
...,
)
Nouvelle façon
L’agent fournit une méthode statique pour créer le client requis pour les ressources spécifiées, où les arguments de mot clé au niveau de la méthode sont prioritaires sur les variables et valeurs d’environnement dans un fichier existant .env .
client, model = AzureAssistantAgent.setup_resources(
ad_token="optional-ad-token",
ad_token_provider=optional_callable,
api_key="optional-api-key",
api_version="optional-api-version",
base_url="optional-base-url",
default_headers="optional-default-headers",
deployment_name="optional-deployment-name",
endpoint="optional-endpoint",
env_file_path="optional-env-file-path",
env_file_encoding="optional-env-file-encoding",
token_scope="optional-token-scope",
)
1. Création d’un Assistant
Ancienne Méthode
agent = await AzureAssistantAgent.create(
kernel=kernel,
service_id=service_id,
name=AGENT_NAME,
instructions=AGENT_INSTRUCTIONS,
enable_code_interpreter=True,
)
or
agent = await OpenAIAssistantAgent.create(
kernel=kernel,
service_id=service_id,
name=<name>,
instructions=<instructions>,
enable_code_interpreter=True,
)
Nouvelle façon
# Azure AssistantAgent
# Create the client using Azure OpenAI resources and configuration
client, model = AzureAssistantAgent.setup_resources()
# Create the assistant definition
definition = await client.beta.assistants.create(
model=model,
instructions="<instructions>",
name="<name>",
)
# Create the agent using the client and the assistant definition
agent = AzureAssistantAgent(
client=client,
definition=definition,
)
or
# OpenAI Assistant Agent
# Create the client using OpenAI resources and configuration
client, model = OpenAIAssistantAgent.setup_resources()
# Create the assistant definition
definition = await client.beta.assistants.create(
model=model,
instructions="<instructions>",
name="<name>",
)
# Create the agent using the client and the assistant definition
agent = OpenAIAssistantAgent(
client=client,
definition=definition,
)
2. Création d’un thread
Ancienne Méthode
thread_id = await agent.create_thread()
Nouvelle façon
from semantic_kernel.agents AssistantAgentThread, AzureAssistantAgent
client, model = AzureAssistantAgent.setup_resources()
# You may create a thread based on an existing thread id
# thread = AssistantAgentThread(client=client, thread_id="existing-thread-id")
# Otherwise, if not specified, a thread will be created during the first invocation
# and returned as part of the response
thread = None
async for response in agent.invoke(messages="user input", thread=thread):
# handle response
print(response)
thread = response.thread
3. Gestion des plug-ins
Ancienne Méthode
# Create the instance of the Kernel
kernel = Kernel()
# Add the sample plugin to the kernel
kernel.add_plugin(plugin=MenuPlugin(), plugin_name="menu")
agent = await AzureAssistantAgent.create(
kernel=kernel,
name="<name>",
instructions="<instructions>"
)
Remarque : Il est toujours possible de gérer les plug-ins via le noyau. Si vous ne fournissez pas de noyau, un noyau est automatiquement créé au moment de la création de l’agent et les plug-ins sont ajoutés à cette instance.
Nouvelle façon
# Create the client using Azure OpenAI resources and configuration
client, model = AzureAssistantAgent.setup_resources()
# Create the assistant definition
definition = await client.beta.assistants.create(
model=model,
instructions="<instructions>",
name="<name>",
)
# Create the agent with plugins passed in as a list
agent = AzureAssistantAgent(
client=client,
definition=definition,
plugins=[MenuPlugin()],
)
Pour plus d’informations, reportez-vous à l’exemple d’implémentation .
4. Utilisation de l’outil Interpréteur de code
Ancienne Méthode
csv_file_path = ...
agent = await AzureAssistantAgent.create(
kernel=kernel,
name="<name>",
instructions="<instructions>",
enable_code_interpreter=True,
code_interpreter_filenames=[csv_file_path],
)
Nouvelle façon
# Create the client using Azure OpenAI resources and configuration
client, model = AzureAssistantAgent.setup_resources()
csv_file_path = ...
# Load the CSV file as a FileObject
with open(csv_file_path, "rb") as file:
file = await client.files.create(file=file, purpose="assistants")
# Get the code interpreter tool and resources
code_interpreter_tool, code_interpreter_tool_resource = AzureAssistantAgent.configure_code_interpreter_tool(file.id)
# Create the assistant definition
definition = await client.beta.assistants.create(
model=model,
name="<name>",
instructions="<instructions>.",
tools=code_interpreter_tool,
tool_resources=code_interpreter_tool_resource,
)
# Create the AzureAssistantAgent instance using the client and the assistant definition
agent = AzureAssistantAgent(
client=client,
definition=definition,
)
Pour plus d’informations, reportez-vous à l’exemple d’implémentation .
5. Utilisation de l’outil de recherche de fichiers
Ancienne Méthode
pdf_file_path = ...
agent = await AzureAssistantAgent.create(
kernel=kernel,
service_id=service_id,
name=AGENT_NAME,
instructions=AGENT_INSTRUCTIONS,
enable_file_search=True,
vector_store_filenames=[pdf_file_path],
)
Nouvelle façon
# Create the client using Azure OpenAI resources and configuration
client, model = AzureAssistantAgent.setup_resources()
pdf_file_path = ...
# Load the employees PDF file as a FileObject
with open(pdf_file_path, "rb") as file:
file = await client.files.create(file=file, purpose="assistants")
# Create a vector store specifying the file ID to be used for file search
vector_store = await client.beta.vector_stores.create(
name="step4_assistant_file_search",
file_ids=[file.id],
)
file_search_tool, file_search_tool_resources = AzureAssistantAgent.configure_file_search_tool(vector_store.id)
# Create the assistant definition
definition = await client.beta.assistants.create(
model=model,
instructions="Find answers to the user's questions in the provided file.",
name="FileSearch",
tools=file_search_tool,
tool_resources=file_search_tool_resources,
)
# Create the AzureAssistantAgent instance using the client and the assistant definition
agent = AzureAssistantAgent(
client=client,
definition=definition,
)
Pour plus d’informations, reportez-vous à l’exemple d’implémentation .
6. Ajout de messages de conversation à un thread
Ancienne Méthode
await agent.add_chat_message(
thread_id=thread_id,
message=ChatMessageContent(role=AuthorRole.USER, content=user_input)
)
Nouvelle façon
Remarque : L’ancienne méthode fonctionne toujours si vous passez un ChatMessageContent, mais vous pouvez désormais également passer une chaîne simple.
await agent.add_chat_message(
thread_id=thread_id,
message=user_input,
)
7. Nettoyage des ressources
Ancienne Méthode
await agent.delete_file(file_id)
await agent.delete_thread(thread_id)
await agent.delete()
Nouvelle façon
await client.files.delete(file_id)
await thread.delete()
await client.beta.assistants.delete(agent.id)
Gestion des sorties structurées
Ancienne Méthode
Non disponible dans l’ancien chemin
Nouvelle façon
# Define a Pydantic model that represents the structured output from the OpenAI service
class ResponseModel(BaseModel):
response: str
items: list[str]
# Create the client using Azure OpenAI resources and configuration
client, model = AzureAssistantAgent.setup_resources()
# Create the assistant definition
definition = await client.beta.assistants.create(
model=model,
name="<name>",
instructions="<instructions>",
response_format=AzureAssistantAgent.configure_response_format(ResponseModel),
)
# Create the AzureAssistantAgent instance using the client and the assistant definition
agent = AzureAssistantAgent(
client=client,
definition=definition,
)
Pour plus d’informations, reportez-vous à l’exemple d’implémentation .
Ce guide de migration doit vous aider à mettre à jour votre code vers la nouvelle implémentation, en tirant parti de la configuration basée sur le client et des fonctionnalités améliorées.
Les agents ne sont pas disponibles dans Java.