Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Erfahren Sie, wie Sie Azure Functions mithilfe eines warteschlangenbasierten Toolansatzes in Microsoft Foundry-Agents integrieren. In diesem Artikel erfahren Sie, wie Sie benutzerdefinierte serverlose Werkzeuge erstellen, die das Foundry-Modell eines Agenten asynchron über Azure-Warteschlangenspeicher aufrufen kann. Mit diesem Ansatz können Ihre Agenten auf Unternehmenssysteme und komplexe Geschäftslogik zugreifen, mit einem Scale-to-Zero-Preismodell.
Gießerei-Agents stellen eine direkte Verbindung mit der Eingabewarteschlange her, die von Azure Functions mithilfe einer von AzureFunctionsTool bereitgestellten Tooldefinition überwacht wird. Wenn ein Agent dieses Azure Functions gehosteten Tools verwenden muss, wird die Tooldefinition verwendet, um eine Nachricht in einer Eingabewarteschlange zu platzieren, die von der Funktions-App in Azure Functions überwacht wird. Ein Azure Storage Warteschlangentrigger ruft den Funktionscode auf, um die Nachricht zu verarbeiten und ein Ergebnis über eine Ausgabewarteschlangenbindung zurückzugeben. Der Agent liest die Nachricht aus der Ausgabewarteschlange, um die Unterhaltung fortzusetzen.
Funktionen bieten mehrere Hostingpläne. Der Flex-Verbrauchsplan eignet sich ideal für das Hosten Ihrer benutzerdefinierten Tools, da sie Folgendes bietet:
- Hostings ohne Server mit automatischer Skalierung auf Null und verbrauchsbasierten Preisen.
- Identitätsbasierter Zugriff auf Ressourcen in Azure, einschließlich Ressourcen in virtuellen Netzwerken.
- Deklarative Datenquellenverbindungen über Eingabe-/Ausgabebindungen.
Verwendungsunterstützung
Die folgende Tabelle zeigt die SDK- und Setupunterstützung.
| Microsoft Foundry-Unterstützung | Python SDK | C# SDK | JavaScript SDK | Java SDK | REST-API | Grundlegendes Agent-Setup | Standard-Agenten-Einrichtung |
|---|---|---|---|---|---|---|---|
| ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | - | ✔️ |
Voraussetzungen
Die Azure AI Projects-Clientbibliothek für Python (
azure-ai-projects>=2.0.0). Details zur Installation finden Sie in der Schnellstartanleitung .Ein bereitgestellter Agent mit dem Standardsetup
Hinweis
Das grundlegende Agenten-Setup wird nicht unterstützt.
Ein Azure Konto mit einem aktiven Abonnement. Erstellen Sie kostenlos ein Konto.
Codebeispiele
Die folgenden Codebeispiele veranschaulichen, wie Sie ein Azure Function-Tool definieren, das Wetterinformationen für einen angegebenen Standort mithilfe der warteschlangenbasierten Integration abruft.
Installieren des Pakets
Installieren Sie die Clientbibliothek Azure KI-Projekte:
pip install "azure-ai-projects>=2.0.0"
Definieren des Tools und Erstellen eines Agents
from azure.identity import DefaultAzureCredential
from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import (
AzureFunctionBinding,
AzureFunctionDefinition,
AzureFunctionStorageQueue,
AzureFunctionDefinitionFunction,
AzureFunctionTool,
PromptAgentDefinition,
)
# Format: "https://resource_name.ai.azure.com/api/projects/project_name"
PROJECT_ENDPOINT = "your_project_endpoint"
STORAGE_QUEUE_ENDPOINT = "your_storage_queue_service_endpoint"
# Create clients to call Foundry API
project = AIProjectClient(
endpoint=PROJECT_ENDPOINT,
credential=DefaultAzureCredential(),
)
openai = project.get_openai_client()
# Define the Azure Function tool
tool = AzureFunctionTool(
azure_function=AzureFunctionDefinition(
input_binding=AzureFunctionBinding(
storage_queue=AzureFunctionStorageQueue(
queue_name="get-weather-input-queue",
queue_service_endpoint=STORAGE_QUEUE_ENDPOINT,
)
),
output_binding=AzureFunctionBinding(
storage_queue=AzureFunctionStorageQueue(
queue_name="get-weather-output-queue",
queue_service_endpoint=STORAGE_QUEUE_ENDPOINT,
)
),
function=AzureFunctionDefinitionFunction(
name="GetWeather",
description="Get the weather in a location.",
parameters={
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "The location to look up.",
}
},
},
),
)
)
# Create the agent with the Azure Function tool
agent = project.agents.create_version(
agent_name="azure-function-agent-get-weather",
definition=PromptAgentDefinition(
model="gpt-5.1",
instructions="You are a helpful support agent. Answer the user's questions to the best of your ability.",
tools=[tool],
),
)
print(f"Agent created (id: {agent.id}, name: {agent.name}, version: {agent.version})")
Erstellen einer Antwort
response = openai.responses.create(
input="What is the weather in Seattle, WA?",
extra_body={"agent_reference": {"name": agent.name, "type": "agent_reference"}},
)
print(f"Response: {response.output_text}")
Bereinigen
project.agents.delete_version(agent_name=agent.name, agent_version=agent.version)
print("Agent deleted")
Schreiben der Azure-Funktion
In den vorherigen Codebeispielen wird gezeigt, wie man die Azure-Funktion auf der Agentenseite definiert. Sie müssen auch die Funktion schreiben, die die Warteschlangennachrichten verarbeitet. Die Funktion empfängt Eingaben aus der Eingabewarteschlange, führt Ihre benutzerdefinierte Logik aus und gibt ein Ergebnis über die Ausgabewarteschlange zurück.
Das folgende Beispiel zeigt eine funktion mit Warteschlangenauslöser, die Wetterinformationen für einen Standort abruft. Die Funktion analysiert die eingehende Nachricht, extrahiert die Funktionsargumente und gibt eine Antwort mit einem CorrelationId zurück, das der Agent verwendet, um das Ergebnis mit der ursprünglichen Anforderung abzugleichen.
import azure.functions as func
import logging
import json
app = func.FunctionApp()
# Queue trigger receives agent tool calls from the input queue
# and returns results through the output queue binding
@app.queue_trigger(
arg_name="msg",
queue_name="get-weather-input-queue",
connection="STORAGE_CONNECTION",
)
@app.queue_output(
arg_name="outputQueue",
queue_name="get-weather-output-queue",
connection="STORAGE_CONNECTION",
)
def queue_trigger(
msg: func.QueueMessage, outputQueue: func.Out[str]
):
try:
# Parse the incoming message from the agent
messagepayload = json.loads(
msg.get_body().decode("utf-8")
)
logging.info("Received: %s", json.dumps(messagepayload))
# Extract the function arguments
function_args = messagepayload.get("function_args", {})
location = function_args.get("location")
# Run your custom logic (replace with real API calls)
weather_result = (
f"Weather is {len(location)} degrees "
f"and sunny in {location}"
)
# Return result with the CorrelationId from the request
response_message = {
"Value": weather_result,
"CorrelationId": messagepayload["CorrelationId"],
}
outputQueue.set(json.dumps(response_message))
except Exception as e:
logging.error("Error processing message: %s", e)
Wichtig
Die Antwortnachricht muss die CorrelationId aus der ursprünglichen Nachricht enthalten. Der Agent verwendet diesen Wert, um die Funktionsausgabe dem richtigen Toolaufruf zuzuordnen.
Das vollständige Beispiel finden Sie unter Azure Functions Wetterbeispiel im Azure SDK für Python Repository.
Installieren der Pakete
Installieren Sie die Azure AI Projects-Clientbibliotheken:
dotnet add package Azure.AI.Projects
dotnet add package Azure.AI.Extensions.OpenAI
dotnet add package Azure.Identity
Definieren des Tools und Erstellen eines Agents
using System;
using System.Text.Json;
using Azure.AI.Projects;
using Azure.AI.Extensions.OpenAI;
using Azure.Identity;
// Format: "https://resource_name.ai.azure.com/api/projects/project_name"
var projectEndpoint = "your_project_endpoint";
var storageQueueUri = "your_storage_queue_service_endpoint";
AIProjectClient projectClient = new(
endpoint: new Uri(projectEndpoint),
tokenProvider: new DefaultAzureCredential());
AzureFunctionDefinitionFunction functionDefinition = new(
name: "GetWeather",
parameters: BinaryData.FromObjectAsJson(
new
{
Type = "object",
Properties = new
{
location = new
{
Type = "string",
Description = "The location to look up.",
}
}
},
new JsonSerializerOptions() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase }
)
)
{
Description = "Get the weather in a location.",
};
AzureFunctionTool azureFnTool = new(
new AzureFunctionDefinition(
function: functionDefinition,
inputBinding: new AzureFunctionBinding(
new AzureFunctionStorageQueue(
queueServiceEndpoint: storageQueueUri,
queueName: "input")),
outputBinding: new AzureFunctionBinding(
new AzureFunctionStorageQueue(
queueServiceEndpoint: storageQueueUri,
queueName: "output"))
)
);
DeclarativeAgentDefinition agentDefinition = new(model: "gpt-5-mini")
{
Instructions = "You are a helpful support agent. Answer the user's questions "
+ "to the best of your ability.",
Tools = { azureFnTool },
};
AgentVersion agentVersion = await projectClient.AgentAdministrationClient.CreateAgentVersionAsync(
agentName: "azure-function-agent-get-weather",
options: new(agentDefinition));
Console.WriteLine($"Agent created (id: {agentVersion.Id}, name: {agentVersion.Name}, "
+ $"version: {agentVersion.Version})");
Erstellen einer Antwort
ProjectResponsesClient responseClient =
projectClient.ProjectOpenAIClient.GetProjectResponsesClientForAgent(agentVersion.Name);
CreateResponseOptions responseOptions = new()
{
InputItems =
{
ResponseItem.CreateUserMessageItem("What is the weather in Seattle, WA?")
},
};
ResponseResult response = await responseClient.CreateResponseAsync(responseOptions);
Console.WriteLine(response.GetOutputText());
Bereinigen
await projectClient.AgentAdministrationClient.DeleteAgentVersionAsync(
agentName: agentVersion.Name,
agentVersion: agentVersion.Version);
Console.WriteLine("Agent deleted");
Schreiben der Azure-Funktion
In den vorherigen Codebeispielen wird gezeigt, wie man die Azure-Funktion auf der Agentenseite definiert. Sie müssen auch die Funktion schreiben, die die Warteschlangennachrichten verarbeitet. Die Funktion empfängt Eingaben aus der Eingabewarteschlange, führt Ihre benutzerdefinierte Logik aus und gibt ein Ergebnis über die Ausgabewarteschlange zurück.
Das folgende Beispiel zeigt eine funktion mit Warteschlangenauslöser, die Wetterinformationen für einen Standort abruft. In diesem Beispiel wird das Isolated Worker Model verwendet. Die Funktion analysiert die eingehende Nachricht, extrahiert die Funktionsargumente und gibt eine Antwort mit einem CorrelationId zurück, das der Agent verwendet, um das Ergebnis mit der ursprünglichen Anforderung abzugleichen.
using System.Text.Json;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.Logging;
public class GetWeather
{
private readonly ILogger<GetWeather> _logger;
public GetWeather(ILogger<GetWeather> logger)
{
_logger = logger;
}
// Queue trigger receives agent tool calls from the input
// queue and returns results through the output queue
[Function("GetWeather")]
[QueueOutput(
"get-weather-output-queue",
Connection = "STORAGE_CONNECTION")]
public string Run(
[QueueTrigger(
"get-weather-input-queue",
Connection = "STORAGE_CONNECTION")]
string message)
{
_logger.LogInformation("Received: {Message}", message);
// Parse the incoming message from the agent
var payload = JsonSerializer.Deserialize<JsonElement>(
message);
var correlationId = payload
.GetProperty("CorrelationId").GetString();
var functionArgs = payload
.GetProperty("function_args");
var location = functionArgs
.GetProperty("location").GetString();
// Run your custom logic (replace with real API calls)
var weatherResult =
$"Weather is {location!.Length} degrees "
+ $"and sunny in {location}";
// Return result with the CorrelationId from the request
var response = new
{
Value = weatherResult,
CorrelationId = correlationId,
};
return JsonSerializer.Serialize(response);
}
}
Wichtig
Die Antwortnachricht muss die CorrelationId aus der ursprünglichen Nachricht enthalten. Der Agent verwendet diesen Wert, um die Funktionsausgabe dem richtigen Toolaufruf zuzuordnen.
Installieren des Pakets
Fügen Sie die Abhängigkeit "Azure AI Agents" zu Ihrer pom.xml hinzu.
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-ai-agents</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-identity</artifactId>
</dependency>
Definieren des Tools und Erstellen eines Agents
import com.azure.ai.agents.*;
import com.azure.ai.agents.models.*;
import com.azure.core.util.BinaryData;
import com.azure.identity.DefaultAzureCredentialBuilder;
import com.openai.models.responses.Response;
import com.openai.models.responses.ResponseCreateParams;
import java.util.*;
// Format: "https://resource_name.ai.azure.com/api/projects/project_name"
String projectEndpoint = "your_project_endpoint";
String storageQueueUri = "your_storage_queue_service_endpoint";
AgentsClientBuilder builder = new AgentsClientBuilder()
.credential(new DefaultAzureCredentialBuilder().build())
.endpoint(projectEndpoint)
.serviceVersion(AgentsServiceVersion.getLatest());
AgentsClient agentsClient = builder.buildAgentsClient();
ResponsesClient responsesClient = builder.buildResponsesClient();
// Define the function parameters
Map<String, BinaryData> parameters = new HashMap<>();
parameters.put("type", BinaryData.fromString("\"object\""));
parameters.put("properties", BinaryData.fromString(
"{\"location\": {\"type\": \"string\", "
+ "\"description\": \"The location to look up.\"}}"));
AzureFunctionDefinitionDetails function =
new AzureFunctionDefinitionDetails("GetWeather", parameters)
.setDescription("Get the weather in a location.");
AzureFunctionTool azureFnTool = new AzureFunctionTool(
new AzureFunctionDefinition(
function,
new AzureFunctionBinding(
new AzureFunctionStorageQueue(storageQueueUri, "input")),
new AzureFunctionBinding(
new AzureFunctionStorageQueue(storageQueueUri, "output"))
)
);
PromptAgentDefinition agentDefinition = new PromptAgentDefinition("gpt-5.1")
.setInstructions("You are a helpful support agent. Answer the user's "
+ "questions to the best of your ability.")
.setTools(Collections.singletonList(azureFnTool));
AgentVersionDetails agent = agentsClient.createAgentVersion(
"azure-function-agent-get-weather", agentDefinition);
System.out.printf("Agent created (id: %s, name: %s, version: %s)%n",
agent.getId(), agent.getName(), agent.getVersion());
Erstellen einer Antwort
AgentReference agentReference = new AgentReference(agent.getName())
.setVersion(agent.getVersion());
Response response = responsesClient.createAzureResponse(
new AzureCreateResponseOptions().setAgentReference(agentReference),
ResponseCreateParams.builder()
.input("What is the weather in Seattle, WA?"));
System.out.println("Response: " + response.output());
Bereinigen
agentsClient.deleteAgentVersion(agent.getName(), agent.getVersion());
System.out.println("Agent deleted");
Schreiben der Azure-Funktion
In den vorherigen Codebeispielen wird gezeigt, wie man die Azure-Funktion auf der Agentenseite definiert. Sie müssen auch die Funktion schreiben, die die Warteschlangennachrichten verarbeitet. Die Funktion empfängt Eingaben aus der Eingabewarteschlange, führt Ihre benutzerdefinierte Logik aus und gibt ein Ergebnis über die Ausgabewarteschlange zurück.
Das folgende Beispiel zeigt eine funktion mit Warteschlangenauslöser, die Wetterinformationen für einen Standort abruft. Die Funktion analysiert die eingehende Nachricht, extrahiert die Funktionsargumente und gibt eine Antwort mit einem CorrelationId zurück, das der Agent verwendet, um das Ergebnis mit der ursprünglichen Anforderung abzugleichen.
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.microsoft.azure.functions.*;
import com.microsoft.azure.functions.annotation.*;
import java.util.logging.Logger;
public class GetWeather {
// Queue trigger receives agent tool calls from the input
// queue and returns results through the output queue
@FunctionName("GetWeather")
@QueueOutput(
name = "output",
queueName = "get-weather-output-queue",
connection = "STORAGE_CONNECTION")
public String run(
@QueueTrigger(
name = "msg",
queueName = "get-weather-input-queue",
connection = "STORAGE_CONNECTION")
String message,
final ExecutionContext context) {
Logger logger = context.getLogger();
logger.info("Received: " + message);
// Parse the incoming message from the agent
JsonObject payload =
JsonParser.parseString(message)
.getAsJsonObject();
String correlationId =
payload.get("CorrelationId").getAsString();
JsonObject functionArgs =
payload.getAsJsonObject("function_args");
String location =
functionArgs.get("location").getAsString();
// Run your custom logic (replace with real API calls)
String weatherResult =
"Weather is " + location.length()
+ " degrees and sunny in " + location;
// Return result with the CorrelationId
JsonObject response = new JsonObject();
response.addProperty("Value", weatherResult);
response.addProperty(
"CorrelationId", correlationId);
return response.toString();
}
}
Wichtig
Die Antwortnachricht muss die CorrelationId aus der ursprünglichen Nachricht enthalten. Der Agent verwendet diesen Wert, um die Funktionsausgabe dem richtigen Toolaufruf zuzuordnen.
Installieren der Pakete
Installieren Sie die Clientbibliothek Azure KI-Projekte:
npm install @azure/ai-projects @azure/identity
Definieren des Tools und Erstellen eines Agents
import { AIProjectClient } from "@azure/ai-projects";
import { DefaultAzureCredential } from "@azure/identity";
// Format: "https://resource_name.ai.azure.com/api/projects/project_name"
const PROJECT_ENDPOINT = "your_project_endpoint";
const STORAGE_QUEUE_ENDPOINT = "your_storage_queue_service_endpoint";
// Create clients to call Foundry API
const project = new AIProjectClient(PROJECT_ENDPOINT, new DefaultAzureCredential());
const openai = project.getOpenAIClient();
const agent = await project.agents.createVersion(
"azure-function-agent-get-weather",
{
kind: "prompt",
model: "gpt-5.1",
instructions:
"You are a helpful support agent. Answer the user's questions to the best of your ability.",
tools: [
{
type: "azure_function",
azure_function: {
function: {
name: "GetWeather",
description: "Get the weather in a location.",
parameters: {
type: "object",
properties: {
location: {
type: "string",
description: "The location to look up.",
},
},
},
},
input_binding: {
type: "storage_queue",
storage_queue: {
queue_service_endpoint: STORAGE_QUEUE_ENDPOINT,
queue_name: "get-weather-input-queue",
},
},
output_binding: {
type: "storage_queue",
storage_queue: {
queue_service_endpoint: STORAGE_QUEUE_ENDPOINT,
queue_name: "get-weather-output-queue",
},
},
},
},
],
},
);
console.log(`Agent created (id: ${agent.id}, name: ${agent.name}, version: ${agent.version})`);
Erstellen einer Antwort
const response = await openai.responses.create(
{
input: "What is the weather in Seattle, WA?",
},
{
body: {
agent: { name: agent.name, type: "agent_reference" },
},
},
);
console.log(`Response: ${response.output_text}`);
Bereinigen
await project.agents.deleteVersion(agent.name, agent.version);
console.log("Agent deleted");
Schreiben der Azure-Funktion
In den vorherigen Codebeispielen wird gezeigt, wie man die Azure-Funktion auf der Agentenseite definiert. Sie müssen auch die Funktion schreiben, die die Warteschlangennachrichten verarbeitet. Die Funktion empfängt Eingaben aus der Eingabewarteschlange, führt Ihre benutzerdefinierte Logik aus und gibt ein Ergebnis über die Ausgabewarteschlange zurück.
Das folgende Beispiel zeigt eine funktion mit Warteschlangenauslöser, die Wetterinformationen für einen Standort abruft. In diesem Beispiel wird das v4-Programmiermodell verwendet. Die Funktion analysiert die eingehende Nachricht, extrahiert die Funktionsargumente und gibt eine Antwort mit einem CorrelationId zurück, das der Agent verwendet, um das Ergebnis mit der ursprünglichen Anforderung abzugleichen.
import {
app,
InvocationContext,
output,
} from "@azure/functions";
// Define the output queue binding
const queueOutput = output.storageQueue({
queueName: "get-weather-output-queue",
connection: "STORAGE_CONNECTION",
});
interface AgentMessage {
CorrelationId: string;
function_args: { location: string };
}
// Queue trigger receives agent tool calls from the input
// queue and returns results through the output queue
async function getWeather(
message: unknown,
context: InvocationContext
): Promise<void> {
const payload = message as AgentMessage;
context.log("Received:", JSON.stringify(payload));
// Extract the function arguments
const location = payload.function_args.location;
// Run your custom logic (replace with real API calls)
const weatherResult =
`Weather is ${location.length} degrees ` +
`and sunny in ${location}`;
// Return result with the CorrelationId from the request
const response = {
Value: weatherResult,
CorrelationId: payload.CorrelationId,
};
context.extraOutputs.set(queueOutput, response);
}
// Register the queue trigger function
app.storageQueue("getWeather", {
queueName: "get-weather-input-queue",
connection: "STORAGE_CONNECTION",
extraOutputs: [queueOutput],
handler: getWeather,
});
Wichtig
Die Antwortnachricht muss die CorrelationId aus der ursprünglichen Nachricht enthalten. Der Agent verwendet diesen Wert, um die Funktionsausgabe dem richtigen Toolaufruf zuzuordnen.
Erstellen einer Agentversion
Erstellen Sie eine Agentversion mithilfe der Azure Funktionstooldefinition.
curl --request POST \
--url $FOUNDRY_PROJECT_ENDPOINT/agents/azure-function-agent-get-weather/versions?api-version=$API_VERSION \
-H "Authorization: Bearer $AGENT_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"description": "Agent with Azure Function tool",
"definition": {
"kind": "prompt",
"model": "gpt-5.1",
"instructions": "You are a helpful support agent. Answer the user's questions to the best of your ability.",
"tools": [
{
"type": "azure_function",
"azure_function": {
"function": {
"name": "GetWeather",
"description": "Get the weather in a location.",
"parameters": {
"type": "object",
"properties": {
"location": {"type": "string", "description": "The location to look up."}
},
"required": ["location"]
}
},
"input_binding": {
"type": "storage_queue",
"storage_queue": {
"queue_service_endpoint": "https://storageaccount.queue.core.windows.net",
"queue_name": "input"
}
},
"output_binding": {
"type": "storage_queue",
"storage_queue": {
"queue_service_endpoint": "https://storageaccount.queue.core.windows.net",
"queue_name": "output"
}
}
}
}
]
}
}'
Erstellen einer Antwort
Erstellen Sie eine Antwort, die die Agentversion verwendet, um Wetterinformationen abzurufen.
curl --request POST \
--url $FOUNDRY_PROJECT_ENDPOINT/openai/responses?api-version=$API_VERSION \
-H "Authorization: Bearer $AGENT_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"input": "What is the weather in Seattle, WA?",
"agent": {
"name": "azure-function-agent-get-weather",
"type": "agent_reference"
}
}'
Schreiben der Azure-Funktion
Die REST-API-Beispiele zeigen, wie Sie die Definition des Azure Function-Tools konfigurieren. Die Azure Function selbst ist serverseitiger Code, den Sie in einer unterstützten Funktionssprache schreiben. Wählen Sie eine der anderen Sprachen (Python, C#, Java oder TypeScript) aus, um die Funktionsimplementierung anzuzeigen.
Wann Azure Functions gegenüber Funktionsaufrufen verwendet werden
Während Funktionsaufrufe es ermöglichen, Tools zu definieren, die mit Ihrem Agentcode ausgeführt werden, bietet das Hosten von benutzerdefinierten Tools auf Azure Functions zusätzliche Unternehmensfunktionen, wenn diese benötigt werden.
- Trennung von Bedenken: Isolieren Sie Ihre Geschäftslogik vom Agentcode, damit Sie unabhängig entwickeln, testen und bereitstellen können.
- Zentrale Verwaltung: Erstellen Sie wiederverwendbare Tools, die mehrere Agents, Anwendungen oder Teams konsistent verwenden können.
- Sicherheitsisolation: Steuern des Agentzugriffs auf Tools separat vom Toolzugriff auf Unternehmensressourcen. Dieser Ansatz bedeutet, dass Sie Agents nur die spezifischen Berechtigungen zuweisen können, die sie zum Aufrufen des Tools benötigen, ohne direkten Zugriff auf zugrunde liegende Datenbanken, APIs oder Netzwerke bereitstellen zu müssen.
- Externale Abhängigkeiten: Verwenden Sie Nicht-Microsoft Bibliotheken, bestimmte Laufzeitumgebungen oder Ältere Systemintegrationen.
- Komplexe Vorgänge: Verarbeiten von mehrstufigen Workflows und Datentransformationen oder Entladen rechenintensiver Vorgänge.
- Asynchrone Verarbeitung: Führen Sie lang andauernde Operationen mit Wiederholungsfunktionen und robuster Nachrichtenverarbeitung aus.
Integrationsoptionen
Der Foundry Agent Service bietet zwei primäre Möglichkeiten für Ihre Agents, auf Azure Functions gehostete Tools zuzugreifen:
| Funktion | MCP-Server (Model Context Protocol) | Azure-Tools auf Basis der Warteschlangenspeicherung |
|---|---|---|
| Wie funktioniert es? | Agents stellen mithilfe des MCP-Protokolls eine Verbindung mit Ihrer Funktions-App in Azure her. Die Funktions-App selbst dient als benutzerdefinierter MCP-Server und stellt Ihre einzelnen Funktionen als Tools zur Verfügung. Ein benutzerdefinierter MCP-Server abstrahiert die Komplexität des Hostens und Verfügbarmachens von Tools aus Ihrem Agentprojekt und fördert die Wiederverwendbarkeit Ihres Codes. | Agents kommunizieren mit Toolcode in Ihrer Funktions-App in Azure über die Warteschlangenspeicherung, indem sie Nachrichten in eine Warteschlange legen, um die Ausführung des Toolcodes auszulösen. Die Funktions-App lauscht auf die Eingabewarteschlangen, verarbeitet Nachrichten asynchron und gibt eine Antwort auf eine zweite Warteschlange zurück. |
| Wann soll es verwendet werden? | ✔ Am besten geeignet für die Nutzung des Branchenstandardprotokolls für die Integration von Agent-Tools. ✔ Stellt Echtzeit-synchrone Interaktionen mit sofortigen Antworten bereit. |
✔ Am besten geeignet für asynchrone Workflows, für die keine Echtzeitantworten erforderlich sind. ✔ Ideal für die Hintergrundverarbeitung und zuverlässige Nachrichtenübermittlung mit Wiederholungsfunktionen. |
| SDK-Konfiguration | Generisches MCP-Tool | Spezifisch (siehe Codebeispiele oben) |
| Beginnen | Wie man Azure Functions mit MCP verwendet | Siehe Codebeispiele oben. |
Für HTTP-Triggerfunktionen können Sie die Funktion auch integrieren, indem Sie die Funktion über eine OpenAPI-Spezifikation beschreiben und als aufrufbares Tool registrieren, indem Sie das OpenAPI-Tool in Ihrer Agentkonfiguration verwenden. Dieser Ansatz bietet Flexibilität für vorhandene HTTP-basierte Funktionen, erfordert jedoch zusätzliches Setup, um die API-Spezifikation zu definieren.
Unterstützte Modelle
Um alle Funktionen von Funktionsaufrufen zu verwenden, einschließlich paralleler Funktionen, verwenden Sie ein Modell, das nach dem 6. November 2023 veröffentlicht wurde.
Erstellen und Bereitstellen eines Beispiels für die warteschlangenbasierte Toolintegration
Führen Sie die folgenden Schritte aus, um ein Beispiel für die Azure Developer CLI (azd) zu verwenden, das einen Agent mit Funktionen konfiguriert, um die warteschlangenbasierte Toolintegration für Agents zu unterstützen:
Hinweis
Ausführliche Anweisungen zum Definieren und Hosten von funktionenbasierten Tools als MCP-Server finden Sie unter Host-MCP-Server in Azure Functions.
Initialisieren der Projektvorlage
Dieses Projekt verwendet azd, um das Erstellen von Azure-Ressourcen und die Bereitstellung Ihres Codes zu vereinfachen. Diese Bereitstellung folgt den aktuellen bewährten Methoden für sichere und skalierbare Funktionenbereitstellungen. Sie finden die hier verwendete Vorlage und den hier verwendeten Code unter GitHub.
Führen Sie den folgenden
azd initBefehl in einem Terminalfenster aus, um Ihr Projekt aus der azd-Vorlage zu initialisieren:azd init --template azure-functions-ai-services-agent-python
Wenn Sie dazu aufgefordert werden, geben Sie einen Umgebungsnamen an, ai-services-agent-python z. B. In azdder Umgebung wird ein eindeutiger Bereitstellungskontext für Ihre App verwaltet, und Sie können mehrere definieren. Der Umgebungsname wird auch im Namen der Ressourcengruppe und anderer Ressourcen verwendet, die Sie in Azure erstellen.
Führen Sie diesen Befehl aus, damit lokale Setupskripts erfolgreich ausgeführt werden können, was von Ihrem lokalen Betriebssystem abhängt:
Bereitstellen von Ressourcen
Führen Sie den Befehl azd provision aus, um die erforderlichen Ressourcen in Azure zu erstellen:
azd provision
Wenn Sie dazu aufgefordert werden, stellen Sie die folgenden erforderlichen Bereitstellungsparameter bereit:
| Aufforderung | Beschreibung |
|---|---|
| Wählen Sie ein Azure Abonnement aus, das Sie verwenden möchten. | Wählen Sie das Abonnement aus, in dem Sie Ihre Ressourcen erstellen möchten. |
| Standortbereitstellungsparameter | Azure Region, um die Ressourcengruppe zu erstellen, die die neuen Azure Ressourcen enthält. Es werden nur Regionen angezeigt, die den Flex-Verbrauchsplan derzeit unterstützen. |
| vnetEnabled-Bereitstellungsparameter | Während die Vorlage das Erstellen von Ressourcen in einem virtuellen Netzwerk unterstützt, wählen Sie False, um die Bereitstellung und Tests zu vereinfachen. |
azd liest die main.bicep-Bereitstellungsdatei und verwendet sie zum Erstellen dieser Ressourcen in Azure:
- Flex-Verbrauchsplan und Funktionsanwendung
- Agent-Plattform in Foundry, einschließlich:
- Dienstkonto
- Modellbereitstellung
- Projekt
- ** Agenten
- Suche
- Azure Cosmos DB Konto (für Suchzwecke verwendet)
- Azure Storage (erforderlich für Funktionen und KI-Agents) und Application Insights (empfohlen)
- Zugriffsrichtlinien und -rollen für Ihre Konten
- Dienst-zu-Dienst-Verbindungen, die verwaltete Identitäten verwenden (anstelle von gespeicherten Verbindungszeichenfolgen)
Skripts nach der Bereitstellung erstellen auch eine local.settings.json Datei, die Funktionen zum lokalen Ausführen benötigen. Die generierte Datei sollte wie folgt aussehen:
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"FUNCTIONS_WORKER_RUNTIME": "python",
"STORAGE_CONNECTION__queueServiceUri": "https://<storageaccount>.queue.core.windows.net",
"PROJECT_CONNECTION_STRING": "<project connnection for AI Project>"
}
}
Ausführen Der App in Visual Studio Code
- Öffnen Sie den Ordner in einem neuen Terminal.
- Führen Sie den Befehl
code .aus, um das Projekt in Visual Studio Code zu öffnen. - Geben Sie
Azurite: Startin die Befehlspalette (F1) ein. Diese Aktion ermöglicht das Debuggen mithilfe des lokalen Speichers für die Funktionslaufzeit. - Drücken Sie AUSFÜHREN/Debuggen (F5), um den Debugger auszuführen. Wählen Sie Debuggen trotzdem aus, wenn Sie darauf hingewiesen werden, dass der lokale Emulator nicht läuft.
- Senden Sie jeweils die POST-Endpunkte
promptunter Verwendung Ihres HTTP-Testtools. Wenn die Erweiterung RestClient installiert ist, können Sie Anforderungen direkt aus der Projektdateitest.httpausführen.
Bereitstellen in Azure
Führen Sie diesen Befehl azd deploy aus, um Den Projektcode in der Funktions-App und verwandten Azure Ressourcen zu veröffentlichen, die Sie soeben bereitgestellt haben:
azd deploy
Nachdem die Veröffentlichung erfolgreich abgeschlossen wurde, azd erhalten Sie die URL-Endpunkte Ihrer neuen Funktionen, aber ohne die Funktionsschlüsselwerte, die für den Zugriff auf die Endpunkte erforderlich sind. Sie können den Befehl Azure Functions Core Tools func azure functionapp list-functions mit der Option --show-keys verwenden, um die Tasten für Ihre Funktionsendpunkte abzurufen. Weitere Informationen finden Sie unter Work with access keys in Azure Functions.
Code erneut bereitstellen
Führen Sie den Befehl azd up so oft aus, wie Sie ihre Azure Ressourcen bereitstellen und Codeupdates für Ihre Funktions-App bereitstellen müssen.
Hinweis
Das neueste Bereitstellungspaket überschreibt immer bereitgestellte Codedateien.
Bereinigen von Ressourcen
Wenn Sie mit der Arbeit mit Ihrer Funktions-App und verwandten Ressourcen fertig sind, verwenden Sie diesen Befehl, um die Funktions-App und die zugehörigen Ressourcen aus Azure zu löschen und weitere Kosten zu vermeiden. Die --purge-Option führt nicht zu einer weichen Löschung der KI-Ressource und stellt Ihr Kontingent wieder her.
azd down --purge