Partager via


Agents en cours d’exécution

L’abstraction de l’agent de base expose différentes options d’exécution de l’agent. Les appelants peuvent choisir de fournir zéro, un ou plusieurs messages d’entrée. Les appelants peuvent également choisir entre la diffusion en continu et la non-diffusion en continu. Examinons les différents scénarios d’utilisation.

Diffusion en continu et non streaming

Microsoft Agent Framework prend en charge les méthodes de diffusion en continu et de non-diffusion en continu pour l’exécution d’un agent.

Pour la non diffusion en continu, utilisez la RunAsync méthode.

Console.WriteLine(await agent.RunAsync("What is the weather like in Amsterdam?"));

Pour la diffusion en continu, utilisez la RunStreamingAsync méthode.

await foreach (var update in agent.RunStreamingAsync("What is the weather like in Amsterdam?"))
{
    Console.Write(update);
}

Pour la non diffusion en continu, utilisez la run méthode.

result = await agent.run("What is the weather like in Amsterdam?")
print(result.text)

Pour la diffusion en continu, utilisez la run_stream méthode.

async for update in agent.run_stream("What is the weather like in Amsterdam?"):
    if update.text:
        print(update.text, end="", flush=True)

Options d’exécution de l’agent

L’abstraction de l’agent de base permet de transmettre un objet options pour chaque exécution de l’agent, mais la possibilité de personnaliser une exécution au niveau de l’abstraction est assez limitée. Les agents peuvent varier considérablement et, par conséquent, il n’existe pas vraiment d’options de personnalisation courantes.

Dans les cas où l’appelant connaît le type de l’agent avec lequel il travaille, il est possible de passer des options spécifiques de type pour permettre la personnalisation de l’exécution.

Par exemple, ici, l’agent est un ChatClientAgent et il est possible de passer un ChatClientAgentRunOptions objet qui hérite de AgentRunOptions. Cela permet à l’appelant de fournir des options personnalisées ChatOptions fusionnées avec toutes les options au niveau de l’agent avant d’être IChatClient passées à celle-ciChatClientAgent.

var chatOptions = new ChatOptions() { Tools = [AIFunctionFactory.Create(GetWeather)] };
Console.WriteLine(await agent.RunAsync("What is the weather like in Amsterdam?", options: new ChatClientAgentRunOptions(chatOptions)));

Les agents Python prennent en charge le passage d’arguments de mot clé pour personnaliser chaque exécution. Les options spécifiques disponibles dépendent du type d’agent, mais ChatAgent prend en charge de nombreux paramètres client de conversation qui peuvent être passés aux deux run méthodes et run_stream aux méthodes.

Options courantes pour ChatAgent inclure :

  • max_tokens: nombre maximal de jetons à générer
  • temperature: contrôle l’aléatoire dans la génération de réponse
  • model: remplacer le modèle pour cette exécution spécifique
  • tools: Ajouter des outils supplémentaires pour cette exécution uniquement
  • response_format: spécifiez le format de réponse (par exemple, sortie structurée)
# Run with custom options
result = await agent.run(
    "What is the weather like in Amsterdam?",
    temperature=0.3,
    max_tokens=150,
    model="gpt-4o"
)

# Streaming with custom options
async for update in agent.run_stream(
    "Tell me a detailed weather forecast",
    temperature=0.7,
    tools=[additional_weather_tool]
):
    if update.text:
        print(update.text, end="", flush=True)

Lorsque les valeurs par défaut au niveau de l’agent et les options au niveau de l’exécution sont fournies, les options au niveau de l’exécution sont prioritaires.

Types de réponse

Les réponses de diffusion en continu et de non-diffusion en continu des agents contiennent tout le contenu produit par l’agent. Le contenu peut inclure des données qui ne sont pas le résultat (c’est-à-dire la réponse à la question de l’utilisateur) de l’agent. Parmi les autres données retournées, citons les appels d’outils de fonction, les résultats des appels d’outil de fonction, le texte de raisonnement, les mises à jour d’état, etc.

Étant donné que tout le contenu retourné n’est pas le résultat, il est important de rechercher des types de contenu spécifiques lors de la tentative d’isoler le résultat de l’autre contenu.

Pour extraire le résultat du texte d’une réponse, tous les TextContent éléments de tous les ChatMessages éléments doivent être agrégés. Pour simplifier ce problème, nous fournissons une Text propriété sur tous les types de réponse qui agrègent tous .TextContent

Pour le cas de non-diffusion en continu, tout est retourné dans un objet AgentRunResponse . AgentRunResponse autorise l’accès aux messages produits via la Messages propriété.

var response = await agent.RunAsync("What is the weather like in Amsterdam?");
Console.WriteLine(response.Text);
Console.WriteLine(response.Messages.Count);

Pour le cas de diffusion en continu, AgentRunResponseUpdate les objets sont diffusés en continu à mesure qu’ils sont produits. Chaque mise à jour peut contenir une partie du résultat de l’agent, ainsi que divers autres éléments de contenu. Comme pour le cas de non diffusion en continu, il est possible d’utiliser la Text propriété pour obtenir la partie du résultat contenu dans la mise à jour et d’explorer les détails via la Contents propriété.

await foreach (var update in agent.RunStreamingAsync("What is the weather like in Amsterdam?"))
{
    Console.WriteLine(update.Text);
    Console.WriteLine(update.Contents.Count);
}

Pour le cas de non-diffusion en continu, tout est retourné dans un objet AgentRunResponse . AgentRunResponse autorise l’accès aux messages produits via la messages propriété.

Pour extraire le résultat du texte d’une réponse, tous les TextContent éléments de tous les ChatMessage éléments doivent être agrégés. Pour simplifier ce problème, nous fournissons une text propriété sur tous les types de réponse qui agrègent tous .TextContent

response = await agent.run("What is the weather like in Amsterdam?")
print(response.text)
print(len(response.messages))

# Access individual messages
for message in response.messages:
    print(f"Role: {message.role}, Text: {message.text}")

Pour le cas de diffusion en continu, AgentRunResponseUpdate les objets sont diffusés en continu à mesure qu’ils sont produits. Chaque mise à jour peut contenir une partie du résultat de l’agent, ainsi que divers autres éléments de contenu. Comme pour le cas de non diffusion en continu, il est possible d’utiliser la text propriété pour obtenir la partie du résultat contenu dans la mise à jour et d’explorer les détails via la contents propriété.

async for update in agent.run_stream("What is the weather like in Amsterdam?"):
    print(f"Update text: {update.text}")
    print(f"Content count: {len(update.contents)}")

    # Access individual content items
    for content in update.contents:
        if hasattr(content, 'text'):
            print(f"Content: {content.text}")

Types de messages

Les entrées et sorties des agents sont représentées en tant que messages. Les messages sont subdivisés en éléments de contenu.

Microsoft Agent Framework utilise les types de message et de contenu fournis par les Microsoft.Extensions.AI abstractions. Les messages sont représentés par la ChatMessage classe et toutes les classes de contenu héritent de la classe de base AIContent .

Il existe différentes AIContent sous-classes utilisées pour représenter différents types de contenu. Certains sont fournis dans le cadre des abstractions de base Microsoft.Extensions.AI , mais les fournisseurs peuvent également ajouter leurs propres types, le cas échéant.

Voici quelques types populaires de Microsoft.Extensions.AI:

Type Descriptif
TextContent Contenu textuel qui peut être à la fois une entrée, par exemple à partir d’un utilisateur ou d’un développeur, et la sortie de l’agent. Contient généralement le résultat du texte d’un agent.
DataContent Contenu binaire pouvant être à la fois d’entrée et de sortie. Peut être utilisé pour transmettre des données image, audio ou vidéo vers et depuis l’agent (où il est pris en charge).
UriContent URL qui pointe généralement vers du contenu hébergé tel qu’une image, un audio ou une vidéo.
FunctionCallContent Demande d’un service d’inférence pour appeler un outil de fonction.
FunctionResultContent Résultat d’un appel d’outil de fonction.

Python Agent Framework utilise des types de messages et de contenu à partir du agent_framework package. Les messages sont représentés par la ChatMessage classe et toutes les classes de contenu héritent de la classe de base BaseContent .

Différentes BaseContent sous-classes existent qui sont utilisées pour représenter différents types de contenu :

Type Descriptif
TextContent Contenu textuel qui peut être à la fois entrée et sortie de l’agent. Contient généralement le résultat du texte d’un agent.
DataContent Contenu binaire représenté en tant qu’URI de données (par exemple, images encodées en base64). Peut être utilisé pour transmettre des données binaires vers et depuis l’agent.
UriContent URI qui pointe vers du contenu hébergé tel qu’une image, un fichier audio ou un document.
FunctionCallContent Demande d’un service IA pour appeler un outil de fonction.
FunctionResultContent Résultat d’un appel d’outil de fonction.
ErrorContent Informations d’erreur lors de l’échec du traitement.
UsageContent Informations d’utilisation et de facturation des jetons du service IA.

Voici comment utiliser différents types de contenu :

from agent_framework import ChatMessage, TextContent, DataContent, UriContent

# Create a text message
text_message = ChatMessage(role="user", text="Hello!")

# Create a message with multiple content types
image_data = b"..."  # your image bytes
mixed_message = ChatMessage(
    role="user",
    contents=[
        TextContent("Analyze this image:"),
        DataContent(data=image_data, media_type="image/png"),
    ]
)

# Access content from responses
response = await agent.run("Describe the image")
for message in response.messages:
    for content in message.contents:
        if isinstance(content, TextContent):
            print(f"Text: {content.text}")
        elif isinstance(content, DataContent):
            print(f"Data URI: {content.uri}")
        elif isinstance(content, UriContent):
            print(f"External URI: {content.uri}")

Étapes suivantes