你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

快速入门:创建新代理

使用 Azure AI Foundry 代理服务,可以通过自定义说明创建根据需求定制的 AI 代理,并通过高级工具(如代码解释器和自定义函数)进行扩充。

Prerequisites

  • Azure 订阅 - 免费创建订阅
  • 确保创建帐户和项目的个人在订阅范围内具有 Azure AI 帐户所有者 角色,这将授予创建项目所需的权限
    • 或者,在订阅级别具有“参与者”或“认知服务参与者”角色将允许创建项目
  • 创建项目后,请确保项目中的单个创建代理在项目级别具有 Azure AI 用户 角色

Important

Azure AI Foundry 门户目前仅支持基本代理设置。 若要执行标准代理设置,请参阅 环境设置 文章以了解详细信息。

在 Azure AI Foundry 门户中创建 Foundry 帐户和项目

若要在 Azure AI Foundry 中创建帐户和项目,请执行以下步骤:

  1. 转到 Azure AI Foundry。 如果你已进入项目,请选择页面左上角的“Azure AI Foundry”以转到“主页”。

  2. 使用“代理入门”创建流程以获得最快的体验。 单击“ 创建代理”。

    Azure AI Foundry 门户的屏幕截图。

  3. 输入项目的名称。 如果要自定义默认值,请选择 “高级”选项

    用于创建项目的高级选项的屏幕截图。

  4. 选择 创建

  5. 等待资源预配。

    1. 将创建帐户和项目(帐户的子资源)。
    2. gpt-4o 模型将自动部署
    3. 将创建默认代理
  6. 完成后,你将直接进入代理工作区,可以开始创建代理。 你可以给代理提供关于该做什么以及如何去做的说明。 例如: “你是一个有用的代理,可以回答有关地理的问题。 然后,可以开始与代理聊天。

    代理实验场的屏幕截图。

    Note

    如果在尝试配置或创建代理时遇到权限错误,请确保项目上有 Azure AI 用户

| 参考文档 | 示例 | 库源代码 | 包 (NuGet) |

Prerequisites

  • 设置代理环境
  • Azure AI 用户RBAC 角色 分配给需要使用 SDK 或代理 Playground 创建或编辑代理的每个团队成员
    • 必须在项目范围内分配此角色
    • 所需的最低权限: agents/*/readagents/*/actionagents/*/delete

配置并运行代理

创建 .NET 控制台项目。

dotnet new console

将 .NET 包安装到项目。 例如,如果使用 .NET CLI,请运行以下命令。

dotnet add package Azure.AI.Agents.Persistent
dotnet add package Azure.Identity

接下来,为了验证 API 请求并运行程序,请使用 az login 命令登录 Azure 订阅。

az login

使用以下代码创建并运行代理。 若要运行此代码,需要获取项目的终结点。 此字符串采用以下格式:

https://<AIFoundryResourceName>.services.ai.azure.com/api/projects/<ProjectName>

Important

从 2025 年 5 月开始,Azure AI Agent Service 将改用 Foundry 项目 的终结点,而不再使用以前应用于基于中心项目的连接字符串。 如果使用的是基于中心的项目,则无法使用 SDK 和 REST API 的当前版本。 有关详细信息,请参阅 基于中心的项目的 SDK 使用情况

您可以在项目的 概述中,通过 Azure AI Foundry 门户下的>Azure AI Foundry找到您的终结点。

显示 Azure AI Foundry 门户中终结点的屏幕截图。

在名为 . ProjectEndpoint. 的环境变量中设置此终结点。

您还需要模型的部署名称。 可以在左侧导航菜单中的 “模型 + 终结点 ”中找到它。

一张 AI Foundry 门户模型部署屏幕的截图。

将模型部署名称保存为名为ModelDeploymentName的环境变量。

using Azure;
using Azure.AI.Agents.Persistent;
using Azure.Identity;
using System.Diagnostics;

var projectEndpoint = System.Environment.GetEnvironmentVariable("ProjectEndpoint");
var modelDeploymentName = System.Environment.GetEnvironmentVariable("ModelDeploymentName");



//Create a PersistentAgentsClient and PersistentAgent.
PersistentAgentsClient client = new(projectEndpoint, new DefaultAzureCredential());

//Give PersistentAgent a tool to execute code using CodeInterpreterToolDefinition.
PersistentAgent agent = client.Administration.CreateAgent(
    model: modelDeploymentName,
    name: "My Test Agent",
    instructions: "You politely help with math questions. Use the code interpreter tool when asked to visualize numbers.",
    tools: [new CodeInterpreterToolDefinition()]
);

//Create a thread to establish a session between Agent and a User.
PersistentAgentThread thread = client.Threads.CreateThread();

//Ask a question of the Agent.
client.Messages.CreateMessage(
    thread.Id,
    MessageRole.User,
    "Hi, Agent! Draw a graph for a line with a slope of 4 and y-intercept of 9.");

//Have Agent begin processing user's question with some additional instructions associated with the ThreadRun.
ThreadRun run = client.Runs.CreateRun(
    thread.Id,
    agent.Id,
    additionalInstructions: "Please address the user as Jane Doe. The user has a premium account.");

//Poll for completion.
do
{
    Thread.Sleep(TimeSpan.FromMilliseconds(500));
    run = client.Runs.GetRun(thread.Id, run.Id);
}
while (run.Status == RunStatus.Queued
    || run.Status == RunStatus.InProgress
    || run.Status == RunStatus.RequiresAction);

//Get the messages in the PersistentAgentThread. Includes Agent (Assistant Role) and User (User Role) messages.
Pageable<PersistentThreadMessage> messages = client.Messages.GetMessages(
    threadId: thread.Id,
    order: ListSortOrder.Ascending);

//Display each message and open the image generated using CodeInterpreterToolDefinition.
foreach (PersistentThreadMessage threadMessage in messages)
{
    foreach (MessageContent content in threadMessage.ContentItems)
    {
        switch (content)
        {
            case MessageTextContent textItem:
                Console.WriteLine($"[{threadMessage.Role}]: {textItem.Text}");
                break;
            case MessageImageFileContent imageFileContent:
                Console.WriteLine($"[{threadMessage.Role}]: Image content file ID = {imageFileContent.FileId}");
                BinaryData imageContent = client.Files.GetFileContent(imageFileContent.FileId);
                string tempFilePath = Path.Combine(AppContext.BaseDirectory, $"{Guid.NewGuid()}.png");
                File.WriteAllBytes(tempFilePath, imageContent.ToArray());
                client.Files.DeleteFile(imageFileContent.FileId);

                ProcessStartInfo psi = new()
                {
                    FileName = tempFilePath,
                    UseShellExecute = true
                };
                Process.Start(psi);
                break;
        }
    }
}

//If you want to delete your agent, uncomment the following lines:
//client.Threads.DeleteThread(threadId: thread.Id);
//client.Administration.DeleteAgent(agentId: agent.Id);

| 参考文档 | 示例 | 库源代码 | 包 (PyPi) |

Prerequisites

  • 设置代理环境
  • Azure AI 用户RBAC 角色 分配给需要使用 SDK 或代理 Playground 创建或编辑代理的每个团队成员
    • 必须在项目范围内分配此角色
    • 所需的最低权限: agents/*/readagents/*/actionagents/*/delete

配置并运行代理

运行以下命令以安装 python 包。

pip install azure-ai-projects
pip install azure-identity

接下来,为了验证 API 请求并运行程序,请使用 az login 命令登录 Azure 订阅。

az login

使用以下代码创建并运行代理。 若要运行此代码,需要获取项目的终结点。 此字符串采用以下格式:

https://<AIFoundryResourceName>.services.ai.azure.com/api/projects/<ProjectName>

Important

从 2025 年 5 月开始,Azure AI Agent Service 将改用 Foundry 项目 的终结点,而不再使用以前应用于基于中心项目的连接字符串。 如果使用的是基于中心的项目,则无法使用 SDK 和 REST API 的当前版本。 有关详细信息,请参阅 基于中心的项目的 SDK 使用情况

您可以在项目的 概述中,通过 Azure AI Foundry 门户下的>Azure AI Foundry找到您的终结点。

显示 Azure AI Foundry 门户中终结点的屏幕截图。

将此终结点设置为名为 PROJECT_ENDPOINT 的环境变量。

您还需要模型的部署名称。 可以在左侧导航菜单中的 “模型 + 终结点 ”中找到它。

一张 AI Foundry 门户模型部署屏幕的截图。

将模型部署名称保存为名为MODEL_DEPLOYMENT_NAME的环境变量。

import os
from pathlib import Path
from azure.ai.projects import AIProjectClient
from azure.identity import DefaultAzureCredential
from azure.ai.agents.models import CodeInterpreterTool

# Create an AIProjectClient from an endpoint, copied from your Azure AI Foundry project.
# You need to login to Azure subscription via Azure CLI and set the environment variables
project_endpoint = os.environ["PROJECT_ENDPOINT"]  # Ensure the PROJECT_ENDPOINT environment variable is set

# Create an AIProjectClient instance
project_client = AIProjectClient(
    endpoint=project_endpoint,
    credential=DefaultAzureCredential(),  # Use Azure Default Credential for authentication
)

code_interpreter = CodeInterpreterTool()
with project_client:
    # Create an agent with the Code Interpreter tool
    agent = project_client.agents.create_agent(
        model=os.environ["MODEL_DEPLOYMENT_NAME"],  # Model deployment name
        name="my-agent",  # Name of the agent
        instructions="You politely help with math questions. Use the Code Interpreter tool when asked to visualize numbers.",  # Instructions for the agent
        tools=code_interpreter.definitions,  # Attach the tool
    )
    print(f"Created agent, ID: {agent.id}")

    # Create a thread for communication
    thread = project_client.agents.threads.create()
    print(f"Created thread, ID: {thread.id}")

    # Add a message to the thread
    message = project_client.agents.messages.create(
        thread_id=thread.id,
        role="user",  # Role of the message sender
        content="Hi, Agent! Draw a graph for a line with a slope of 4 and y-intercept of 9.",  # Message content
    )
    print(f"Created message, ID: {message['id']}")

    # Create and process an agent run
    run = project_client.agents.runs.create_and_process(
        thread_id=thread.id,
        agent_id=agent.id,
        additional_instructions="Please address the user as Jane Doe. The user has a premium account",
    )
    print(f"Run finished with status: {run.status}")

    # Check if the run failed
    if run.status == "failed":
        print(f"Run failed: {run.last_error}")

    # Fetch and log all messages
    messages = project_client.agents.messages.list(thread_id=thread.id)
    for message in messages:
        print(f"Role: {message.role}, Content: {message.content}")

        # Save every image file in the message
        for img in message.image_contents:
            file_id = img.image_file.file_id
            file_name = f"{file_id}_image_file.png"
            project_client.agents.files.save(file_id=file_id, file_name=file_name)
            print(f"Saved image file to: {Path.cwd() / file_name}")

    # Uncomment these lines to delete the agent when done
    # project_client.agents.delete_agent(agent.id)
    # print("Deleted agent")

| 参考文档 | 示例 | 库源代码 | 包 (npm) |

Prerequisites

  • 设置代理环境
  • Azure AI 用户RBAC 角色 分配给需要使用 SDK 或代理 Playground 创建或编辑代理的每个团队成员
    • 必须在项目范围内分配此角色
    • 所需的最低权限: agents/*/readagents/*/actionagents/*/delete

配置并运行代理

此代码中的关键对象包括:

首先,通过运行来初始化新项目:

npm init -y

运行以下命令以安装所需的 npm 包。

npm install @azure/ai-agents @azure/identity
npm install dotenv

接下来,为了验证 API 请求并运行程序,请使用 az login 命令登录 Azure 订阅。

az login

使用以下代码创建并运行上传 CSV 数据的 代理,然后从该数据生成条形图。 若要运行此代码,需要获取项目的终结点。 此字符串采用以下格式:

https://<AIFoundryResourceName>.services.ai.azure.com/api/projects/<ProjectName>

您可以在项目的 概述中,通过 Azure AI Foundry 门户下的>Azure AI Foundry找到您的终结点。

显示 Azure AI Foundry 门户中终结点的屏幕截图。

将此终结点设置为文件中命名 PROJECT_ENDPOINT.env 环境变量。

您还需要模型的部署名称。 可以在左侧导航菜单中的 “模型 + 终结点 ”中找到它。

一张 AI Foundry 门户模型部署屏幕的截图。

将模型部署名称保存为名为MODEL_DEPLOYMENT_NAME的环境变量。

Important

  • 本快速入门代码使用环境变量进行敏感配置。 请务必确保在您的 .env 文件中列出 .env,以避免将 .gitignore 文件提交到版本控制系统。
  • 请记住:如果意外提交了敏感信息,请将这些凭据视为已泄露,并立即更换这些凭据。

接下来,创建一个 index.js 文件并粘贴以下代码:

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.

/**
 * This sample demonstrates how to use agent operations with code interpreter from the Azure Agents service.
 *
 * @summary demonstrates how to use agent operations with code interpreter.
 */
// @ts-nocheck
import type {
  MessageDeltaChunk,
  MessageDeltaTextContent,
  MessageImageFileContent,
  MessageTextContent,
  ThreadRun,
} from "@azure/ai-agents";
import {
  RunStreamEvent,
  MessageStreamEvent,
  DoneEvent,
  ErrorEvent,
  AgentsClient,
  isOutputOfType,
  ToolUtility,
} from "@azure/ai-agents";
import { DefaultAzureCredential } from "@azure/identity";

import * as fs from "fs";
import path from "node:path";
import "dotenv/config";

const projectEndpoint = process.env["PROJECT_ENDPOINT"] || "<project endpoint>";
const modelDeploymentName = process.env["MODEL_DEPLOYMENT_NAME"] || "gpt-4o";

export async function main(): Promise<void> {
  // Create an Azure AI Client
  const client = new AgentsClient(projectEndpoint, new DefaultAzureCredential());

  // Upload file and wait for it to be processed
  const filePath = "./data/nifty500QuarterlyResults.csv";
  const localFileStream = fs.createReadStream(filePath);
  const localFile = await client.files.upload(localFileStream, "assistants", {
    fileName: "myLocalFile",
  });

  console.log(`Uploaded local file, file ID : ${localFile.id}`);

  // Create code interpreter tool
  const codeInterpreterTool = ToolUtility.createCodeInterpreterTool([localFile.id]);

  // Notice that CodeInterpreter must be enabled in the agent creation, otherwise the agent will not be able to see the file attachment
  const agent = await client.createAgent(modelDeploymentName, {
    name: "my-agent",
    instructions: "You are a helpful agent",
    tools: [codeInterpreterTool.definition],
    toolResources: codeInterpreterTool.resources,
  });
  console.log(`Created agent, agent ID: ${agent.id}`);

  // Create a thread
  const thread = await client.threads.create();
  console.log(`Created thread, thread ID: ${thread.id}`);

  // Create a message
  const message = await client.messages.create(
    thread.id,
    "user",
    "Could you please create a bar chart in the TRANSPORTATION sector for the operating profit from the uploaded CSV file and provide the file to me?",
  );

  console.log(`Created message, message ID: ${message.id}`);

  // Create and execute a run
  const streamEventMessages = await client.runs.create(thread.id, agent.id).stream();

  for await (const eventMessage of streamEventMessages) {
    switch (eventMessage.event) {
      case RunStreamEvent.ThreadRunCreated:
        console.log(`ThreadRun status: ${(eventMessage.data as ThreadRun).status}`);
        break;
      case MessageStreamEvent.ThreadMessageDelta:
        {
          const messageDelta = eventMessage.data as MessageDeltaChunk;
          messageDelta.delta.content.forEach((contentPart) => {
            if (contentPart.type === "text") {
              const textContent = contentPart as MessageDeltaTextContent;
              const textValue = textContent.text?.value || "No text";
              console.log(`Text delta received:: ${textValue}`);
            }
          });
        }
        break;

      case RunStreamEvent.ThreadRunCompleted:
        console.log("Thread Run Completed");
        break;
      case ErrorEvent.Error:
        console.log(`An error occurred. Data ${eventMessage.data}`);
        break;
      case DoneEvent.Done:
        console.log("Stream completed.");
        break;
    }
  }

  // Delete the original file from the agent to free up space (note: this does not delete your version of the file)
  await client.files.delete(localFile.id);
  console.log(`Deleted file, file ID : ${localFile.id}`);

  // Print the messages from the agent
  const messagesIterator = client.messages.list(thread.id);
  const messagesArray = [];
  for await (const m of messagesIterator) {
    messagesArray.push(m);
  }
  console.log("Messages:", messagesArray);

  // Get most recent message from the assistant
// Get most recent message from the assistant
  const assistantMessage = messagesArray.find((msg) => msg.role === "assistant");
  if (assistantMessage) {
    // Look for an image file in the assistant's message
    const imageFileOutput = assistantMessage.content.find(content => 
      content.type === "image_file" && content.imageFile?.fileId);
    
    if (imageFileOutput) {
      try {
        // Save the newly created file
        console.log(`Saving new files...`);
        const imageFile = imageFileOutput.imageFile.fileId;
        const imageFileName = path.resolve(
          "./data/" + (await client.files.get(imageFile)).filename + "ImageFile.png",
        );
        console.log(`Image file name : ${imageFileName}`);

        const fileContent = await client.files.getContent(imageFile).asNodeStream();
        if (fileContent && fileContent.body) {
          const chunks = [];
          for await (const chunk of fileContent.body) {
            chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
          }
          const buffer = Buffer.concat(chunks);
          fs.writeFileSync(imageFileName, buffer);
          console.log(`Successfully saved image to ${imageFileName}`);
        } else {
          console.error("No file content available in the response");
        }
      } catch (error) {
        console.error("Error saving image file:", error);
      }
    } else {
      console.log("No image file found in assistant's message");
    }
  } else {
    console.log("No assistant message found");
  }

  // Iterate through messages and print details for each annotation
  console.log(`Message Details:`);
  messagesArray.forEach((m) => {
    console.log(`File Paths:`);
    console.log(`Type: ${m.content[0].type}`);
    if (isOutputOfType<MessageTextContent>(m.content[0], "text")) {
      const textContent = m.content[0] as MessageTextContent;
      console.log(`Text: ${textContent.text.value}`);
    }
    console.log(`File ID: ${m.id}`);
    // firstId and lastId are properties of the paginator, not the messages array
    // Removing these references as they don't exist in this context
  });

  // Uncomment these lines to delete the agent once done
  //await client.deleteAgent(agent.id);
  //console.log(`Deleted agent, agent ID: ${agent.id}`);
}

main().catch((err) => {
  console.error("The sample encountered an error:", err);
});

使用 node index.js 运行代码。 此代码从上传的 CSV 文件生成一个 TRANSPORTATION 部门的营业利润条形图 PNG 图像文件,并将该文件提供给你。 提供完整的 示例源代码

| 参考文档 | 样品 | 库源代码 | 包 (Maven) |

Prerequisites

  • 设置代理环境
  • Azure AI 用户RBAC 角色 分配给需要使用 SDK 或代理 Playground 创建或编辑代理的每个团队成员
    • 必须在项目范围内分配此角色
    • 所需的最低权限: agents/*/readagents/*/actionagents/*/delete

配置并运行代理

首先,创建新的 Java 控制台项目。 需要以下依赖项才能运行代码:

<dependencies>
    <dependency>
        <groupId>com.azure</groupId>
        <artifactId>azure-ai-agents-persistent</artifactId>
        <version>1.0.0-beta.2</version>
    </dependency>
    <dependency>
        <groupId>com.azure</groupId>
        <artifactId>azure-identity</artifactId>
        <version>1.17.0-beta.1</version>
    </dependency>
</dependencies>

接下来,为了验证 API 请求并运行程序,请使用 az login 命令登录 Azure 订阅。

az login

使用以下代码创建并运行代理。 若要运行此代码,需要获取项目的终结点。 此字符串采用以下格式:

https://<AIFoundryResourceName>.services.ai.azure.com/api/projects/<ProjectName>

Important

从 2025 年 5 月开始,Azure AI Agent Service 将改用 Foundry 项目 的终结点,而不再使用以前应用于基于中心项目的连接字符串。 如果使用的是基于中心的项目,则无法使用 SDK 和 REST API 的当前版本。 有关详细信息,请参阅 基于中心的项目的 SDK 使用情况

您可以在项目的 概述中,通过 Azure AI Foundry 门户下的>Azure AI Foundry找到您的终结点。

显示 Azure AI Foundry 门户中终结点的屏幕截图。

在名为 . PROJECT_ENDPOINT. 的环境变量中设置此终结点。

您还需要模型的部署名称。 可以在左侧导航菜单中的 “模型 + 终结点 ”中找到它。

一张 AI Foundry 门户模型部署屏幕的截图。

将模型部署名称保存为名为MODEL_DEPLOYMENT_NAME的环境变量。

代码示例

package com.example.agents;

import com.azure.ai.agents.persistent.MessagesClient;
import com.azure.ai.agents.persistent.PersistentAgentsAdministrationClient;
import com.azure.ai.agents.persistent.PersistentAgentsClient;
import com.azure.ai.agents.persistent.PersistentAgentsClientBuilder;
import com.azure.ai.agents.persistent.RunsClient;
import com.azure.ai.agents.persistent.ThreadsClient;
import com.azure.ai.agents.persistent.models.CodeInterpreterToolDefinition;
import com.azure.ai.agents.persistent.models.CreateAgentOptions;
import com.azure.ai.agents.persistent.models.CreateRunOptions;
import com.azure.ai.agents.persistent.models.MessageImageFileContent;
import com.azure.ai.agents.persistent.models.MessageRole;
import com.azure.ai.agents.persistent.models.MessageTextContent;
import com.azure.ai.agents.persistent.models.PersistentAgent;
import com.azure.ai.agents.persistent.models.PersistentAgentThread;
import com.azure.ai.agents.persistent.models.RunStatus;
import com.azure.ai.agents.persistent.models.ThreadMessage;
import com.azure.ai.agents.persistent.models.ThreadRun;
import com.azure.ai.agents.persistent.models.MessageContent;
import com.azure.core.http.rest.PagedIterable;
import com.azure.identity.DefaultAzureCredentialBuilder;
import java.util.Arrays;

public class AgentSample {

    public static void main(String[] args) {
        // variables for authenticating requests to the agent service 
        String projectEndpoint = System.getenv("PROJECT_ENDPOINT");
        String modelName = System.getenv("MODEL_DEPLOYMENT_NAME");

        // initialize clients to manage various aspects of agent runtime
        PersistentAgentsClientBuilder clientBuilder = new PersistentAgentsClientBuilder()
            .endpoint(projectEndpoint)
            .credential(new DefaultAzureCredentialBuilder().build());
        PersistentAgentsClient agentsClient = clientBuilder.buildClient();
        PersistentAgentsAdministrationClient administrationClient = agentsClient.getPersistentAgentsAdministrationClient();
        ThreadsClient threadsClient = agentsClient.getThreadsClient();
        MessagesClient messagesClient = agentsClient.getMessagesClient();
        RunsClient runsClient = agentsClient.getRunsClient();
        
        
        String agentName = "my-agent"; // the name of the agent
        CreateAgentOptions createAgentOptions = new CreateAgentOptions(modelName)
            .setName(agentName)
            .setInstructions("You are a helpful agent") // system insturctions
            .setTools(Arrays.asList(new CodeInterpreterToolDefinition()));
        PersistentAgent agent = administrationClient.createAgent(createAgentOptions);

        PersistentAgentThread thread = threadsClient.createThread();
        ThreadMessage createdMessage = messagesClient.createMessage(
            thread.getId(),
            MessageRole.USER,
            "I need to solve the equation `3x + 11 = 14`. Can you help me?"); // The message to the agent

        try {
            //run the agent
            CreateRunOptions createRunOptions = new CreateRunOptions(thread.getId(), agent.getId())
                .setAdditionalInstructions("");
            ThreadRun threadRun = runsClient.createRun(createRunOptions);
            // wait for the run to complete before printing the message
            waitForRunCompletion(thread.getId(), threadRun, runsClient);
            printRunMessages(messagesClient, thread.getId());
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        } finally {
            //cleanup - uncomment these lines if you want to delete the agent
            //threadsClient.deleteThread(thread.getId());
            //administrationClient.deleteAgent(agent.getId());
        }
    }

    // A helper function to print messages from the agent
    public static void printRunMessages(MessagesClient messagesClient, String threadId) {

        PagedIterable<ThreadMessage> runMessages = messagesClient.listMessages(threadId);
        for (ThreadMessage message : runMessages) {
            System.out.print(String.format("%1$s - %2$s : ", message.getCreatedAt(), message.getRole()));
            for (MessageContent contentItem : message.getContent()) {
                if (contentItem instanceof MessageTextContent) {
                    System.out.print((((MessageTextContent) contentItem).getText().getValue()));
                } else if (contentItem instanceof MessageImageFileContent) {
                    String imageFileId = (((MessageImageFileContent) contentItem).getImageFile().getFileId());
                    System.out.print("Image from ID: " + imageFileId);
                }
                System.out.println();
            }
        }
    }

    // a helper function to wait until a run has completed running
    public static void waitForRunCompletion(String threadId, ThreadRun threadRun, RunsClient runsClient)
        throws InterruptedException {

        do {
            Thread.sleep(500);
            threadRun = runsClient.getRun(threadId, threadRun.getId());
        }
        while (
            threadRun.getStatus() == RunStatus.QUEUED
                || threadRun.getStatus() == RunStatus.IN_PROGRESS
                || threadRun.getStatus() == RunStatus.REQUIRES_ACTION);

        if (threadRun.getStatus() == RunStatus.FAILED) {
            System.out.println(threadRun.getLastError().getMessage());
        }
    }
}

| 参考文档 |

Prerequisites

  • 设置代理环境
  • Azure AI 用户RBAC 角色 分配给需要使用 SDK 或代理 Playground 创建或编辑代理的每个团队成员
    • 必须在项目范围内分配此角色
    • 所需的最低权限: agents/*/readagents/*/actionagents/*/delete

配置并运行代理

为了验证 API 请求,请使用 az login 命令登录 Azure 订阅。

az login

接下来,你需要提取 Entra ID 令牌,作为 API 调用的授权。 使用 CLI 命令提取令牌:

az account get-access-token --resource 'https://ai.azure.com' | jq -r .accessToken | tr -d '"'

将访问令牌设置为名为 AGENT_TOKEN 的环境变量。

若要成功调用 Azure AI Foundry 代理服务 REST API,需要使用项目的终结点:

https://<your_ai_service_name>.services.ai.azure.com/api/projects/<your_project_name>

例如,终结点将如下所示:

https://exampleaiservice.services.ai.azure.com/api/projects/project

将此终结点设置为名为 AZURE_AI_FOUNDRY_PROJECT_ENDPOINT 的环境变量。

Note

  • 对于 api-version 参数,GA API 版本是 2025-05-01 最新的预览版 API 版本 2025-05-15-preview。 对于处于预览状态的工具,必须使用预览 API。
  • 请考虑使 API 版本成为环境变量,例如 $API_VERSION

创建代理

Note

使用 Azure AI 代理服务时,model 参数需要模型部署名称。 如果模型部署名称与基础模型名称不同,则将代码调整为 "model": "{your-custom-model-deployment-name}"

curl --request POST \
  --url $AZURE_AI_FOUNDRY_PROJECT_ENDPOINT/assistants?api-version=2025-05-01 \
  -H "Authorization: Bearer $AGENT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "instructions": "You are a helpful agent.",
    "name": "my-agent",
    "tools": [{"type": "code_interpreter"}],
    "model": "gpt-4o-mini"
  }'

创建线程

curl --request POST \
  --url $AZURE_AI_FOUNDRY_PROJECT_ENDPOINT/threads?api-version=2025-05-01 \
  -H "Authorization: Bearer $AGENT_TOKEN" \
  -H "Content-Type: application/json" \
  -d ''

将用户问题添加到线程

curl --request POST \
  --url $AZURE_AI_FOUNDRY_PROJECT_ENDPOINT/threads/thread_abc123/messages?api-version=2025-05-01 \
  -H "Authorization: Bearer $AGENT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
      "role": "user",
      "content": "I need to solve the equation `3x + 11 = 14`. Can you help me?"
    }'

运行线程

curl --request POST \
  --url $AZURE_AI_FOUNDRY_PROJECT_ENDPOINT/threads/thread_abc123/runs?api-version=2025-05-01 \
  -H "Authorization: Bearer $AGENT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "assistant_id": "asst_abc123",
  }'

获取运行状态

curl --request GET \
  --url $AZURE_AI_FOUNDRY_PROJECT_ENDPOINT/threads/thread_abc123/runs/run_abc123?api-version=2025-05-01 \
  -H "Authorization: Bearer $AGENT_TOKEN"

检索代理响应

curl --request GET \
  --url $AZURE_AI_FOUNDRY_PROJECT_ENDPOINT/threads/thread_abc123/messages?api-version=2025-05-01 \
  -H "Authorization: Bearer $AGENT_TOKEN"

后续步骤

了解可用于扩展代理功能 的工具 ,例如访问 Web、提供基础信息等。