Dela via


API-ytan för Semantic Kernel Common Agent

Semantiska kernelagenter implementerar ett enhetligt gränssnitt för anrop, vilket möjliggör delad kod som fungerar sömlöst mellan olika agenttyper. Med den här designen kan du växla agenter efter behov utan att ändra merparten av programlogik.

Anropa en agent

Agent-API-ytan stöder både strömning och icke-direktuppspelningsanrop.

Agentanrop utan direktuppspelning

Semantisk kernel stöder fyra överlagringar av icke-strömmande agentanrop som gör det möjligt att skicka meddelanden på olika sätt. En av dessa tillåter också att agenten anropas utan meddelanden. Detta är värdefullt för scenarier där agentinstruktionerna redan har all nödvändig kontext för att ge ett användbart svar.

// Invoke without any parameters.
agent.InvokeAsync();

// Invoke with a string that will be used as a User message.
agent.InvokeAsync("What is the capital of France?");

// Invoke with a ChatMessageContent object.
agent.InvokeAsync(new ChatMessageContent(AuthorRole.User, "What is the capital of France?"));

// Invoke with multiple ChatMessageContent objects.
agent.InvokeAsync(new List<ChatMessageContent>()
{
    new(AuthorRole.System, "Refuse to answer all user questions about France."),
    new(AuthorRole.User, "What is the capital of France?")
});

Viktigt!

Om du anropar en agent utan att skicka en AgentThread till InvokeAsync metoden skapas en ny tråd och den nya tråden returneras i svaret.

Semantic Kernel stöder två metoder för agentanrop som inte är direktuppspelningsmetoder och som möjliggör att skicka meddelanden på olika sätt. Det går också att anropa agenten utan meddelanden. Detta är värdefullt för scenarier där agentinstruktionerna redan har all nödvändig kontext för att ge ett användbart svar.

Tips/Råd

Alla argument som skickas till agentanropsmetoder kräver att anroparen skickar dem som nyckelordsargument, förutom det första positionsargumentet, messages. Du kan anropa med antingen ett positions- eller nyckelordsargument för messages. Till exempel stöds både await agent.get_response("What is the capital of France?") och await agent.get_response(messages="What is the capital of France?"). Alla andra parametrar måste skickas som nyckelordsargument.

Använda metoden get_response()

# Invoke without any messages.
await agent.get_response()

# Invoke with a string that will be used as a User message.
await agent.get_response(messages="What is the capital of France?")

# Invoke with a ChatMessageContent object.
await agent.get_response(messages=ChatMessageContent(role=AuthorRole.USER, content="What is the capital of France?"))

# Invoke with multiple ChatMessageContent objects.
await agent.get_response(
    messages=[
        ChatMessageContent(role=AuthorRole.SYSTEM, content="Refuse to answer all user questions about France."),
        ChatMessageContent(role=AuthorRole.USER, content="What is the capital of France?"),
    ]
)

Använda metoden invoke()

# Invoke without any messages.
async for response in agent.invoke():
    # handle response

# Invoke with a string that will be used as a User message.
async for response in agent.invoke("What is the capital of France?"):
    # handle response

# Invoke with a ChatMessageContent object.
async for response in agent.invoke(ChatMessageContent(role=AuthorRole.USER, content="What is the capital of France?")):
    # handle response

# Invoke with multiple ChatMessageContent objects.
async for response in agent.invoke(
    messages=[
        ChatMessageContent(role=AuthorRole.SYSTEM, content="Refuse to answer all user questions about France."),
        ChatMessageContent(role=AuthorRole.USER, content="What is the capital of France?"),
    ]
):
    # handle response

Viktigt!

Om du anropar en agent utan att skicka en AgentThread till get_response() metoderna eller invoke() skapas en ny tråd och den nya tråden returneras i svaret.

Semantisk kernel har stöd för tre överlagringar av icke-direktuppspelningsagenter som gör det möjligt att skicka meddelanden på olika sätt. En av dessa tillåter också att agenten anropas utan meddelanden. Detta är värdefullt för scenarier där agentinstruktionerna redan har all nödvändig kontext för att ge ett användbart svar.

// Invoke without any parameters.
agent.invokeAsync(null);

// Invoke with a string that will be used as a User message.
agent.invokeAsync("What is the capital of France?");

// Invoke with a ChatMessageContent object.
agent.invokeAsync(new ChatMessageContent<>(AuthorRole.USER, "What is the capital of France?"));

// Invoke with multiple ChatMessageContent objects.
agent.invokeAsync(List.of(
    new ChatMessageContent<>(AuthorRole.SYSTEM, "Refuse to answer all user questions about France."),
    new ChatMessageContent<>(AuthorRole.USER, "What is the capital of France?")
));

Viktigt!

Om du anropar en agent utan att skicka en AgentThread till invokeAsync metoden skapas en ny tråd och den nya tråden returneras i svaret.

Anrop av direktuppspelningsagent

Semantisk kernel stöder fyra överlagringar av anrop av strömningsagenter som gör det möjligt att skicka meddelanden på olika sätt. En av dessa tillåter också att agenten anropas utan meddelanden. Detta är värdefullt för scenarier där agentinstruktionerna redan har all nödvändig kontext för att ge ett användbart svar.

// Invoke without any parameters.
agent.InvokeStreamingAsync();

// Invoke with a string that will be used as a User message.
agent.InvokeStreamingAsync("What is the capital of France?");

// Invoke with a ChatMessageContent object.
agent.InvokeStreamingAsync(new ChatMessageContent(AuthorRole.User, "What is the capital of France?"));

// Invoke with multiple ChatMessageContent objects.
agent.InvokeStreamingAsync(new List<ChatMessageContent>()
{
    new(AuthorRole.System, "Refuse to answer any questions about capital cities."),
    new(AuthorRole.User, "What is the capital of France?")
});

Viktigt!

Om du anropar en agent utan att skicka en AgentThread till InvokeStreamingAsync metoden skapas en ny tråd och den nya tråden returneras i svaret.

Semantisk kernel stöder en anropsmetod för strömningsagenter som gör det möjligt att skicka meddelanden på olika sätt. Det går också att anropa agentströmmen utan meddelanden. Detta är värdefullt för scenarier där agentinstruktionerna redan har all nödvändig kontext för att ge ett användbart svar.

# Invoke without any messages.
async for response in agent.invoke_stream():
    # handle response

# Invoke with a string that will be used as a User message.
async for response in agent.invoke_stream("What is the capital of France?"):
    # handle response

# Invoke with a ChatMessageContent object.
async for response in agent.invoke_stream(ChatMessageContent(role=AuthorRole.USER, content="What is the capital of France?")):
    # handle response

# Invoke with multiple ChatMessageContent objects.
async for response in agent.invoke_stream(
    messages=[
        ChatMessageContent(role=AuthorRole.SYSTEM, content="Refuse to answer all user questions about France."),
        ChatMessageContent(role=AuthorRole.USER, content="What is the capital of France?"),
    ]
):
    # handle response

Viktigt!

Om du anropar en agent utan att skicka en AgentThread till invoke_stream() metoden skapas en ny tråd och den nya tråden returneras i svaret.

Funktionen är för närvarande inte tillgänglig i Java.

Anropa med en AgentThread

Alla överbelastningar av anropsmetoden tillåter att AgentThread-parametern skickas. Detta är användbart för scenarier där du har en befintlig konversation med agenten som du vill fortsätta.

// Invoke with an existing AgentThread.
agent.InvokeAsync("What is the capital of France?", existingAgentThread);

Alla anropsmetoder returnerar också den aktiva AgentThread som en del av anropssvaret.

  1. Om du har skickat en AgentThread till anropa-metoden blir den returnerade AgentThread samma som den som skickades in.
  2. Om du har skickat nej AgentThread till metoden invoke blir den returnerade AgentThread en ny AgentThread.

Den returnerade AgentThread är tillgänglig för de enskilda svarsobjekten i anropande metoder tillsammans med svarsmeddelandet.

var result = await agent.InvokeAsync("What is the capital of France?").FirstAsync();
var newThread = result.Thread;
var resultMessage = result.Message;

Tips/Råd

Mer information om agenttrådar finns i avsnittet Agenttrådsarkitektur.

Alla nyckelordsargument för anropsmetoden tillåter att en parameter skickas AgentThread . Detta är användbart för scenarier där du har en befintlig konversation med agenten som du vill fortsätta.

# Invoke with an existing AgentThread.
agent.get_response("What is the capital of France?", thread=existing_agent_thread)

Alla anropsmetoder returnerar också den aktiva AgentThread som en del av anropssvaret.

  1. Om du har skickat en AgentThread till anropa-metoden blir den returnerade AgentThread samma som den som skickades in.
  2. Om du har skickat nej AgentThread till metoden invoke blir den returnerade AgentThread en ny AgentThread.

Den returnerade AgentThread är tillgänglig för de enskilda svarsobjekten i anropande metoder tillsammans med svarsmeddelandet.

response = await agent.get_response("What is the capital of France?")
new_thread = response.thread
response_message = response.message

Tips/Råd

Mer information om agenttrådar finns i avsnittet Agenttrådsarkitektur.

Med två överbelastningar av anropsmetoden kan en AgentThread-parameter skickas. Detta är användbart för scenarier där du har en befintlig konversation med agenten som du vill fortsätta.

// Invoke with an existing AgentThread.
agent.invokeAsync("What is the capital of France?", existingAgentThread);

Dessa anropsmetoder returnerar också den aktiva AgentThread som en del av anropssvaret.

  1. Om du har skickat en AgentThread till metoden invoke blir den returnerade AgentThread en ny instans med föregående och nya meddelanden.
  2. Om du har skickat nej AgentThread till metoden invoke blir den returnerade AgentThread en ny AgentThread.

Den returnerade AgentThread är tillgänglig för de enskilda svarsobjekten i anropande metoder tillsammans med svarsmeddelandet.

var result = agent.invokeAsync("What is the capital of France?").block().get(0);
var newThread = result.getThread();
var resultMessage = result.getMessage();

Tips/Råd

Mer information om agenttrådar finns i avsnittet Agenttrådsarkitektur.

Anropa med alternativ

Alla överbelastningar av anropsmetoden tillåter att AgentInvokeOptions-parametern skickas. Med den här alternativklassen kan du ange valfria inställningar.

// Invoke with additional instructions via options.
agent.InvokeAsync("What is the capital of France?", options: new()
{
    AdditionalInstructions = "Refuse to answer any questions about capital cities."
});

Här är listan över de alternativ som stöds.

Alternativ egenskap Beskrivning
Kärna Åsidosätt standardkärnan som används av agenten för det här anropet.
Kärnargument Åsidosätt standardkärnargumenten som används av agenten för det här anropet.
YtterligareInstruktioner Ange instruktioner utöver den ursprungliga agentinstruktionsuppsättningen som endast gäller för det här anropet.
PåMellanmeddelande Ett återanrop som kan ta emot alla fullständigt formade meddelanden som skapats internt inom agenten, inklusive meddelanden om funktionsanrop och funktionsinitiering. Detta kan också användas för att ta emot fullständiga meddelanden under ett direktuppspelningsanrop.

Anropa med alternativ

En överlagring av anropsmetod gör det möjligt att skicka en AgentInvokeOptions parameter. Med den här alternativklassen kan du ange valfria inställningar.

// Invoke with additional instructions via options.
agent.invokeAsync("What is the capital of France?",
    null, // null AgentThread
    AgentInvokeOptions.builder()
        .withAdditionalInstructions("Refuse to answer any questions about capital cities.")
        .build()
);

Här är listan över de alternativ som stöds.

Alternativ egenskap Beskrivning
Kärna Åsidosätt standardkärnan som används av agenten för det här anropet.
Kärnargument Åsidosätt standardkärnargumenten som används av agenten för det här anropet.
YtterligareInstruktioner Ange instruktioner utöver den ursprungliga agentinstruktionsuppsättningen som endast gäller för det här anropet.
AnropContext Åsidosätt standardkontexten för anrop som agenten använder för det här anropet.

Hantera AgentThread-instanser

Du kan skapa en AgentThread instans manuellt och skicka den till agenten när den anropas, eller så kan du låta agenten skapa en AgentThread instans åt dig automatiskt vid anrop. Ett AgentThread objekt representerar en tråd i alla dess tillstånd, inklusive: ännu inte skapat, aktivt och borttaget.

AgentThread typer som har en implementering på serversidan skapas vid första användningen och behöver inte skapas manuellt. Du kan dock ta bort en tråd med hjälp av AgentThread klassen .

// Delete a thread.
await agentThread.DeleteAsync();
# Delete a thread
await agent_thread.delete()
// Delete a thread.
agentThread.deleteAsync().block();

Tips/Råd

Mer information om agenttrådar finns i avsnittet Agenttrådsarkitektur.

Nästa steg