Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
L'astrazione dell'agente di base espone varie opzioni per l'esecuzione dell'agente. I chiamanti possono scegliere di specificare zero, uno o più messaggi di input. I chiamanti possono anche scegliere tra streaming e non in streaming. Esaminiamo i diversi scenari di utilizzo.
Streaming e non streaming
Microsoft Agent Framework supporta metodi di streaming e non di streaming per l'esecuzione di un agente.
Per i dati non in streaming, usare il RunAsync metodo .
Console.WriteLine(await agent.RunAsync("What is the weather like in Amsterdam?"));
Per lo streaming, usare il RunStreamingAsync metodo .
await foreach (var update in agent.RunStreamingAsync("What is the weather like in Amsterdam?"))
{
Console.Write(update);
}
Per i dati non in streaming, usare il run metodo .
result = await agent.run("What is the weather like in Amsterdam?")
print(result.text)
Per lo streaming, usare il run_stream metodo .
async for update in agent.run_stream("What is the weather like in Amsterdam?"):
if update.text:
print(update.text, end="", flush=True)
Opzioni di esecuzione dell'agente
L'astrazione dell'agente di base consente di passare un oggetto opzioni per ogni esecuzione dell'agente, ma la possibilità di personalizzare un'esecuzione a livello di astrazione è piuttosto limitata. Gli agenti possono variare in modo significativo e pertanto non esistono opzioni di personalizzazione comuni.
Nei casi in cui il chiamante conosce il tipo di agente con cui lavora, è possibile passare opzioni specifiche del tipo per consentire la personalizzazione dell'esecuzione.
Ad esempio, qui l'agente è e ChatClientAgent è possibile passare un ChatClientAgentRunOptions oggetto che eredita da AgentRunOptions.
In questo modo il chiamante può fornire un oggetto personalizzato ChatOptions unito a qualsiasi opzione a livello di agente prima di essere passata all'oggetto IChatClientChatClientAgent su cui è basato.
var chatOptions = new ChatOptions() { Tools = [AIFunctionFactory.Create(GetWeather)] };
Console.WriteLine(await agent.RunAsync("What is the weather like in Amsterdam?", options: new ChatClientAgentRunOptions(chatOptions)));
Gli agenti Python supportano la personalizzazione di ogni esecuzione tramite il options parametro . Le opzioni vengono passate come TypedDict e possono essere impostate in fase di costruzione (tramite default_options) e per esecuzione (tramite options). Ogni provider ha una propria classe TypedDict che fornisce il completamento automatico completo dell'IDE e il controllo dei tipi per le impostazioni specifiche del provider.
Le opzioni più comuni includono:
-
max_tokens: numero massimo di token da generare -
temperature: controlla la casualità nella generazione della risposta -
model_id: eseguire l'override del modello per questa esecuzione specifica -
top_p: parametro di campionamento del nucleo -
response_format: specificare il formato di risposta (ad esempio, output strutturato)
Annotazioni
I tools parametri e instructions rimangono come argomenti di parola chiave diretta e non vengono passati tramite il options dizionario.
from agent_framework.openai import OpenAIChatClient, OpenAIChatOptions
# Set default options at construction time
agent = OpenAIChatClient().as_agent(
instructions="You are a helpful assistant",
default_options={
"temperature": 0.7,
"max_tokens": 500
}
)
# Run with custom options (overrides defaults)
# OpenAIChatOptions provides IDE autocomplete for all OpenAI-specific settings
options: OpenAIChatOptions = {
"temperature": 0.3,
"max_tokens": 150,
"model_id": "gpt-4o",
"presence_penalty": 0.5,
"frequency_penalty": 0.3
}
result = await agent.run(
"What is the weather like in Amsterdam?",
options=options
)
# Streaming with custom options
async for update in agent.run_stream(
"Tell me a detailed weather forecast",
options={"temperature": 0.7, "top_p": 0.9},
tools=[additional_weather_tool] # tools is still a keyword argument
):
if update.text:
print(update.text, end="", flush=True)
Ogni provider ha una propria classe TypedDict (ad esempio, OpenAIChatOptions, AnthropicChatOptions, OllamaChatOptions) che espone il set completo di opzioni supportate da tale provider.
Quando vengono forniti sia che default_options per options esecuzione, le opzioni per esecuzione hanno la precedenza e vengono unite con le impostazioni predefinite.
Tipi di risposta
Sia le risposte in streaming che le risposte non in streaming dagli agenti contengono tutto il contenuto prodotto dall'agente. Il contenuto può includere dati che non sono il risultato (ovvero la risposta alla domanda dell'utente) dell'agente. Esempi di altri dati restituiti includono le chiamate agli strumenti di funzione, i risultati delle chiamate degli strumenti di funzione, il testo di ragionamento, gli aggiornamenti dello stato e molti altri ancora.
Poiché non tutti i contenuti restituiti sono i risultati, è importante cercare tipi di contenuto specifici quando si tenta di isolare il risultato dall'altro contenuto.
Per estrarre il risultato del testo da una risposta, tutti gli TextContent elementi di tutti gli ChatMessages elementi devono essere aggregati.
Per semplificare questa operazione, una Text proprietà è disponibile in tutti i tipi di risposta che aggregano tutti .TextContent
Per il caso non in streaming, tutto viene restituito in un oggetto AgentResponse .
AgentResponse consente l'accesso ai messaggi prodotti tramite la Messages proprietà .
var response = await agent.RunAsync("What is the weather like in Amsterdam?");
Console.WriteLine(response.Text);
Console.WriteLine(response.Messages.Count);
Per il caso di streaming, AgentResponseUpdate gli oggetti vengono trasmessi man mano che vengono prodotti.
Ogni aggiornamento può contenere una parte del risultato dell'agente e anche vari altri elementi di contenuto.
Analogamente al caso non di streaming, è possibile usare la Text proprietà per ottenere la parte del risultato contenuto nell'aggiornamento ed esaminare i dettagli tramite la Contents proprietà .
await foreach (var update in agent.RunStreamingAsync("What is the weather like in Amsterdam?"))
{
Console.WriteLine(update.Text);
Console.WriteLine(update.Contents.Count);
}
Per il caso non in streaming, tutto viene restituito in un oggetto AgentResponse .
AgentResponse consente l'accesso ai messaggi prodotti tramite la messages proprietà .
Per estrarre il risultato del testo da una risposta, tutti gli TextContent elementi di tutti gli ChatMessage elementi devono essere aggregati.
Per semplificare questa operazione, una Text proprietà è disponibile in tutti i tipi di risposta che aggregano tutti .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}")
Per il caso di streaming, AgentResponseUpdate gli oggetti vengono trasmessi man mano che vengono prodotti.
Ogni aggiornamento può contenere una parte del risultato dell'agente e anche vari altri elementi di contenuto.
Analogamente al caso non di streaming, è possibile usare la text proprietà per ottenere la parte del risultato contenuto nell'aggiornamento ed esaminare i dettagli tramite la contents proprietà .
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}")
Tipi di messaggio
L'input e l'output degli agenti vengono rappresentati come messaggi. I messaggi sono suddivisi in elementi di contenuto.
Microsoft Agent Framework usa i tipi di messaggio e di contenuto forniti dalle Microsoft.Extensions.AI astrazioni.
I messaggi sono rappresentati dalla ChatMessage classe e tutte le classi di contenuto ereditano dalla classe base AIContent .
Esistono varie AIContent sottoclassi usate per rappresentare tipi diversi di contenuto. Alcuni vengono forniti come parte delle astrazioni di base Microsoft.Extensions.AI , ma i provider possono anche aggiungere i propri tipi, se necessario.
Ecco alcuni tipi comuni di Microsoft.Extensions.AI:
| TIPO | Description |
|---|---|
| TextContent | Contenuto testuale che può essere sia input, ad esempio da un utente o uno sviluppatore, sia l'output dell'agente. In genere contiene il risultato del testo da un agente. |
| DataContent | Contenuto binario che può essere sia di input che di output. Può essere usato per passare dati di immagine, audio o video da e verso l'agente (se supportato). |
| UriContent | URL che in genere punta a contenuto ospitato, ad esempio un'immagine, un audio o un video. |
| FunctionCallContent | Richiesta da parte di un servizio di inferenza per richiamare uno strumento di funzione. |
| FunctionResultContent | Risultato della chiamata di uno strumento di funzione. |
Python Agent Framework usa i tipi di messaggio e contenuto del agent_framework pacchetto.
I messaggi sono rappresentati dalla ChatMessage classe e tutte le classi di contenuto ereditano dalla classe base BaseContent .
Esistono varie BaseContent sottoclassi usate per rappresentare tipi diversi di contenuto:
| TIPO | Description |
|---|---|
Content |
Tipo di contenuto unificato con metodi factory (Content.from_text(), Content.from_data(), Content.from_uri()). Usare la proprietà per controllare il type tipo di contenuto ("text", "data", "uri"). |
FunctionCallContent |
Richiesta da parte di un servizio di intelligenza artificiale per richiamare uno strumento per le funzioni. |
FunctionResultContent |
Risultato della chiamata di uno strumento di funzione. |
ErrorContent |
Informazioni sull'errore durante l'elaborazione non riesce. |
UsageContent |
Informazioni sull'utilizzo dei token e sulla fatturazione dal servizio di intelligenza artificiale. |
Ecco come usare tipi di contenuto diversi:
from agent_framework import ChatMessage, Content
# 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=[
Content.from_text("Analyze this image:"),
Content.from_data(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 content.type == "text":
print(f"Text: {content.text}")
elif content.type == "data":
print(f"Data URI: {content.uri}")
elif content.type == "uri":
print(f"External URI: {content.uri}")