你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
-
2025-06-07
在本快速入门中,我们将指导你使用 Azure AI Foundry SDK 设置本地开发环境。 我们会编写提示,将其作为应用代码的一部分运行,跟踪进行的 LLM 调用,并在 LLM 的输出上运行基本评估。
小窍门
本文的其余部分介绍如何使用 基于中心的项目。 如果要改用 Foundry 项目 ,请选择本文顶部的 Foundry 项目。
先决条件
- 一个 Azure 订阅。 如果没有 Azure 订阅,请在开始操作前先创建一个免费帐户。
- 基于中心的项目。 如果你不熟悉 Azure AI Foundry 并且没有基于中心的项目,请选择本文顶部的 Foundry 项目 以改用 Foundry 项目。
设置开发环境
请确保安装以下包:
pip install azure-ai-projects azure-ai-inference azure-identity
部署模型
小窍门
由于可以在 Azure AI Foundry 门户中 自定义左窗格 ,因此你可能会看到与这些步骤中显示的项不同。 如果未看到要查找的内容,请选择 ... 左窗格底部的更多内容。
登录到 Azure AI Foundry。
选择基于中心的项目。 如果没有基于中心的项目,请选择本文顶部的“Foundry 项目”以改用 Foundry 项目。
从左窗格中选择 “模型目录 ”。
从模型列表中选择“gpt-4o-mini”模型。 可以使用搜索栏查找它。
在模型详细信息页上,选择“部署”。
保留默认部署名称。 选择“部署”。
部署模型后,选择“在操场中打开”以测试模型。
生成聊天应用
创建一个名为 chat.py 的文件。 将以下代码复制并粘贴到其中。
from azure.ai.projects import AIProjectClient
from azure.identity import DefaultAzureCredential
project_connection_string = "<your-connection-string-goes-here>"
project = AIProjectClient.from_connection_string(
conn_str=project_connection_string, credential=DefaultAzureCredential()
)
chat = project.inference.get_chat_completions_client()
response = chat.complete(
model="gpt-4o-mini",
messages=[
{
"role": "system",
"content": "You are an AI assistant that speaks like a techno punk rocker from 2350. Be cool but not too cool. Ya dig?",
},
{"role": "user", "content": "Hey, can you help me with my taxes? I'm a freelancer."},
],
)
print(response.choices[0].message.content)
插入连接字符串
项目连接字符串需要从代码调用 Azure AI Foundry 模型中的 Azure OpenAI。
在你曾在 Azure AI Foundry 操场快速入门中创建的 Azure AI Foundry 项目中查找连接字符串。 打开项目,然后在“概述”页上找到连接字符串。
复制连接字符串并替换 chat.py 文件中的 <your-connection-string-goes-here>
。
运行聊天脚本
运行脚本以查看来自模型的响应。
python chat.py
根据用户输入和提示模板生成提示
该脚本使用硬编码的输入和输出消息。 在实际应用中,你将从客户端应用程序获取输入,生成带有模型内部指令的系统消息,然后使用所有消息调用 LLM。
让我们更改脚本,从客户端应用程序获取输入,并使用提示模板生成系统消息。
删除输出响应的脚本的最后一行。
现在定义一个
get_chat_response
函数,该函数会接收消息和上下文、使用提示模板生成系统消息并调用模型。 将此代码添加到现有 chat.py 文件:from azure.ai.inference.prompts import PromptTemplate def get_chat_response(messages, context): # create a prompt template from an inline string (using mustache syntax) prompt_template = PromptTemplate.from_string( prompt_template=""" system: You are an AI assistant that speaks like a techno punk rocker from 2350. Be cool but not too cool. Ya dig? Refer to the user by their first name, try to work their last name into a pun. The user's first name is {{first_name}} and their last name is {{last_name}}. """ ) # generate system message from the template, passing in the context as variables system_message = prompt_template.create_messages(data=context) # add the prompt messages to the user messages return chat.complete( model="gpt-4o-mini", messages=system_message + messages, temperature=1, frequency_penalty=0.5, presence_penalty=0.5, )
注释
提示模板使用 mustache 格式。
get_chat_response 函数可以轻松添加为 FastAPI 或 Flask 应用的路由,以便从前端 Web 应用程序调用此函数。
现在模拟将信息从前端应用程序传递到此函数。 将以下代码添加到 chat.py 文件的末尾。 随意处理消息并添加自己的名字。
if __name__ == "__main__": response = get_chat_response( messages=[{"role": "user", "content": "what city has the best food in the world?"}], context={"first_name": "Jessie", "last_name": "Irwin"}, ) print(response.choices[0].message.content)
运行修订后的脚本以使用此新输入查看模型的响应。
python chat.py
后续步骤
在本快速入门中,你将使用 Azure AI Foundry :
- 创建项目
- 部署模型
- 运行聊天完成
- 创建并运行代理
- 将文件上传到代理
Azure AI Foundry SDK 以多种语言提供,包括 Python、Java、JavaScript 和 C# 。 本快速入门提供了每种语言的说明。
小窍门
本文的其余部分介绍如何使用 Foundry 项目。 如果要改用基于中心的项目,请选择本文顶部的“基于中心的项目”。
先决条件
- 一个 Azure 订阅。 如果没有 Azure 订阅,请在开始操作前先创建一个免费帐户。
- 必须是订阅的 所有者 才能接收使用项目所需的适当访问控制。
重要
本文中标记了“(预览版)”的项目目前为公共预览版。 此预览版未提供服务级别协议,不建议将其用于生产工作负载。 某些功能可能不受支持或者受限。 有关详细信息,请参阅 Microsoft Azure 预览版补充使用条款。
从项目和模型开始
在主页上,选择“ 创建代理”。
填写要用于项目的名称,然后选择“ 创建”。
一旦创建资源,你就进入了代理操场。
如果系统要求你选择模型,请搜索并选择 gpt-4o。
- 选择“确认”。
- 不要更改默认设置。 选择“部署”。
现在,你有一个项目和一个可用于代理的模型。
配置你的环境
无需安装 Azure AI Foundry 门户。
安装以下包:
pip install openai azure-ai-projects azure-identity
-
在项目的“概述”部分中复制 Azure AI Foundry 项目终结点。 稍后会用到它。
小窍门
如果未看到 Azure AI Foundry 项目终结点,则使用的是基于中心的项目。 (请参阅 项目类型)。 切换到 Foundry 项目,或使用前面的步骤创建一个。
在运行 Python 脚本之前,请确保使用 CLI
az login
(或az login --use-device-code
) 命令登录以进行身份验证。
注释
本文中的所有代码都在 GitHub 快速入门中。
-
在项目的“概述”部分中复制 Azure AI Foundry 项目终结点。 稍后会用到它。
小窍门
如果未看到 Azure AI Foundry 项目终结点,则使用的是基于中心的项目。 (请参阅 项目类型)。 切换到 Foundry 项目,或使用前面的步骤创建一个。
设置这些环境变量以在脚本中使用:
# Azure AI Foundry Endpoint AZURE_ENDPOINT=your_endpoint_here # Azure AI Foundry Model Deployment Name AZURE_DEPLOYMENT=your_deployment_name_here # Project ID (Optional - will be generated if not provided) PROJECT_ID=your_project_id_here MODEL_DEPLOYMENT_NAME=gpt-4o # Note: This sample uses DefaultAzureCredential for authentication # Please ensure you are logged in with Azure CLI using 'az login' # For more authentication options, see: https://learn.microsoft.com/en-us/java/api/overview/azure/identity-readme?view=azure-java-stable
在运行 Java 脚本之前,请确保使用 CLI
az login
(或az login --use-device-code
) 命令登录以进行身份验证。将POM.XML下载到 Java IDE。
注释
本文中的所有代码都在 GitHub 快速入门中。
在运行 JavaScript 脚本之前,请确保使用 CLI
az login
(或az login --use-device-code
) 命令登录以进行身份验证。下载 package.json。
使用
npm install
安装包-
在项目的“概述”部分中复制 Azure AI Foundry 项目终结点。 稍后会用到它。
小窍门
如果未看到 Azure AI Foundry 项目终结点,则使用的是基于中心的项目。 (请参阅 项目类型)。 切换到 Foundry 项目,或使用前面的步骤创建一个。
设置这些环境变量以在脚本中使用:
MODEL_DEPLOYMENT_NAME=gpt-4o PROJECT_ENDPOINT=https://<your-foundry-resource-name>.services.ai.azure.com/api/projects/<your-foundry-project-name>
注释
本文中的所有代码都在 GitHub 快速入门中。
安装包:
若要在 .NET 项目中使用 Azure AI 服务,需要安装多个 NuGet 包。 在集成终端中使用 .NET CLI 添加 NuGet 包:
# Add Azure AI SDK packages dotnet add package Azure.Identity dotnet add package Azure.AI.Projects dotnet add package Azure.AI.Agents.Persistent dotnet add package Azure.AI.Inference
-
在项目的“概述”部分中复制 Azure AI Foundry 项目终结点。 稍后会用到它。
小窍门
如果未看到 Azure AI Foundry 项目终结点,则使用的是基于中心的项目。 (请参阅 项目类型)。 切换到 Foundry 项目,或使用前面的步骤创建一个。
设置这些环境变量以在脚本中使用:
AZURE_AI_ENDPOINT=https://your.services.ai.azure.com/api/projects/project AZURE_AI_MODEL=your_model_name
在运行 C# 脚本之前,请确保使用 CLI
az login
(或az login --use-device-code
) 命令登录以进行身份验证。
注释
本文中的所有代码都在 GitHub 快速入门中。
在运行下一个命令之前,请确保使用 CLI
az login
(或az login --use-device-code
) 命令登录以进行身份验证。获取临时访问令牌。 它将在 60-90 分钟内过期,之后需要刷新。
az account get-access-token --scope https://ai.azure.com/.default
将结果保存为环境变量
AZURE_AI_AUTH_TOKEN
。
注释
本文中的所有代码都在 GitHub 快速入门中。
与代理聊天
代理通过使用工具具有强大的能力。 首先与代理聊天。
执行前述步骤后,你现在位于代理操场。
- 添加说明,例如“你是一个有用的写作助手”。
- 例如,开始与你的经纪人聊天,例如,“给我写一首关于鲜花的诗”。
用你的终结点替换此代码中的 endpoint
:
from azure.ai.projects import AIProjectClient
from azure.identity import DefaultAzureCredential
from azure.ai.agents.models import ListSortOrder, FilePurpose
project = AIProjectClient(
endpoint="https://your-foundry-resource-name.ai.azure.com/api/projects/project-name",
credential=DefaultAzureCredential(),
)
agent = project.agents.create_agent(
model="gpt-4o",
name="my-agent",
instructions="You are a helpful writing assistant")
thread = project.agents.threads.create()
message = project.agents.messages.create(
thread_id=thread.id,
role="user",
content="Write me a poem about flowers")
run = project.agents.runs.create_and_process(thread_id=thread.id, agent_id=agent.id)
if run.status == "failed":
# Check if you got "Rate limit is exceeded.", then you want to get more quota
print(f"Run failed: {run.last_error}")
# Get messages from the thread
messages = project.agents.messages.list(thread_id=thread.id)
# Get the last message from the sender
messages = project.agents.messages.list(thread_id=thread.id, order=ListSortOrder.ASCENDING)
for message in messages:
if message.run_id == run.id and message.text_messages:
print(f"{message.role}: {message.text_messages[-1].text.value}")
# Delete the agent once done
project.agents.delete_agent(agent.id)
print("Deleted agent")
package com.azure.ai.foundry.samples;
import com.azure.ai.foundry.samples.utils.ConfigLoader;
import com.azure.ai.projects.ProjectsClient;
import com.azure.ai.projects.ProjectsClientBuilder;
import com.azure.ai.projects.models.agent.Agent;
import com.azure.ai.projects.models.agent.AgentClient;
import com.azure.ai.projects.models.agent.AgentMessage;
import com.azure.ai.projects.models.agent.AgentOptions;
import com.azure.ai.projects.models.agent.AgentRole;
import com.azure.ai.projects.models.agent.AgentRun;
import com.azure.ai.projects.models.agent.AgentRunStatus;
import com.azure.ai.projects.models.agent.AgentThread;
import com.azure.identity.DefaultAzureCredential;
import java.util.List;
/**
* This sample demonstrates how to create and run an agent using the Azure AI Foundry SDK.
*
* Agents in Azure AI Foundry are specialized AI assistants that can be customized with
* specific instructions and capabilities to perform particular tasks. They maintain conversation
* history in threads and can be deployed for various use cases.
*
* This sample shows:
* 1. How to authenticate with Azure AI Foundry using DefaultAzureCredential
* 2. How to create an agent with specific instructions and capabilities
* 3. How to create a thread for conversation with the agent
* 4. How to send messages to the agent and run it
* 5. How to wait for the agent to complete its execution
* 6. How to retrieve and display the agent's response
*
* Prerequisites:
* - An Azure account with access to Azure AI Foundry
* - Azure CLI installed and logged in ('az login')
* - Environment variables set in .env file (AZURE_ENDPOINT, AZURE_DEPLOYMENT)
*/
public class AgentSample {
public static void main(String[] args) {
// Load configuration values from the .env file
// These include the service endpoint and the deployment name of the model to use
String endpoint = ConfigLoader.getAzureEndpoint();
String deploymentName = ConfigLoader.getAzureDeployment();
// Get DefaultAzureCredential for authentication
// This uses the most appropriate authentication method based on the environment
// For local development, it will use your Azure CLI login credentials
DefaultAzureCredential credential = ConfigLoader.getDefaultCredential();
// Create a projects client to interact with Azure AI Foundry services
// The client requires an authentication credential and an endpoint
ProjectsClient client = new ProjectsClientBuilder()
.credential(credential)
.endpoint(endpoint)
.buildClient();
// Get an agent client, which provides operations for working with AI agents
// This includes creating, configuring, and running agents
AgentClient agentClient = client.getAgentClient();
// Create a new agent with specialized capabilities and instructions
// The agent is configured with a name, description, instructions, and underlying model
System.out.println("Creating agent...");
Agent agent = agentClient.createAgent(new AgentOptions()
.setName("Research Assistant") // Descriptive name for the agent
.setDescription("An agent that helps with research tasks") // Brief description of the agent's purpose
.setInstructions("You are a research assistant. Help users find information and summarize content.") // Detailed instructions for the agent's behavior
.setModel(deploymentName)); // The underlying AI model to power the agent
System.out.println("Agent created: " + agent.getName() + " (ID: " + agent.getId() + ")");
// Create a thread for the conversation with the agent
// Threads maintain conversation history and state across multiple interactions
System.out.println("Creating thread...");
AgentThread thread = agentClient.createThread();
System.out.println("Thread created: " + thread.getId());
// Create a user message
AgentMessage userMessage = new AgentMessage()
.setRole(AgentRole.USER)
.setContent("Explain what cloud computing is and list three benefits.");
// Run the agent
System.out.println("Running agent...");
AgentRun run = agentClient.createRun(thread.getId(), agent.getId(), userMessage);
System.out.println("Run created: " + run.getId());
// Wait for the run to complete
AgentRun completedRun = waitForRunCompletion(agentClient, thread.getId(), run.getId());
System.out.println("Run completed with status: " + completedRun.getStatus());
// Get messages from the thread
List<AgentMessage> messages = agentClient.getMessages(thread.getId());
// Display the assistant's response
System.out.println("\nConversation:");
for (AgentMessage message : messages) {
System.out.println(message.getRole() + ": " + message.getContent());
}
}
private static AgentRun waitForRunCompletion(AgentClient agentClient, String threadId, String runId) {
AgentRun run = agentClient.getRun(threadId, runId);
while (run.getStatus() == AgentRunStatus.QUEUED || run.getStatus() == AgentRunStatus.IN_PROGRESS) {
try {
System.out.println("Run status: " + run.getStatus() + " - waiting...");
Thread.sleep(1000); // Wait for 1 second before checking again
run = agentClient.getRun(threadId, runId);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
throw new RuntimeException("Thread was interrupted", e);
}
}
return run;
}
}
const endpoint = process.env.PROJECT_ENDPOINT;
const deployment = process.env.MODEL_DEPLOYMENT_NAME || 'gpt-4o';
const client = new AIProjectClient(endpoint, new DefaultAzureCredential());
// Create an Agent
const agent = await client.agents.createAgent(deployment, {
name: 'my-agent',
instructions: 'You are a helpful agent'
});
console.log(`\n==================== 🕵️ POEM AGENT ====================`);
// Create a thread and message
const thread = await client.agents.threads.create();
const prompt = 'Write me a poem about flowers';
console.log(`\n---------------- 📝 User Prompt ---------------- \n${prompt}`);
await client.agents.messages.create(thread.id, 'user', prompt);
// Create run
let run = await client.agents.runs.create(thread.id, agent.id);
// Wait for run to complete
console.log(`\n---------------- 🚦 Run Status ----------------`);
while (['queued', 'in_progress', 'requires_action'].includes(run.status)) {
// Avoid adding a lot of messages to the console
await new Promise((resolve) => setTimeout(resolve, 1000));
run = await client.agents.runs.get(thread.id, run.id);
console.log(`Run status: ${run.status}`);
}
console.log('\n---------------- 📊 Token Usage ----------------');
console.table([run.usage]);
const messagesIterator = await client.agents.messages.list(thread.id);
const assistantMessage = await getAssistantMessage(messagesIterator);
console.log('\n---------------- 💬 Response ----------------');
printAssistantMessage(assistantMessage);
// Clean up
console.log(`\n---------------- 🧹 Clean Up Poem Agent ----------------`);
await client.agents.deleteAgent(agent.id);
console.log(`Deleted Agent, Agent ID: ${agent.id}`);
using Azure;
using Azure.Identity;
using Azure.AI.Agents.Persistent;
// Creating the Client for agents
var projectEndpoint = System.Environment.GetEnvironmentVariable("AZURE_AI_ENDPOINT");
var modelDeploymentName = System.Environment.GetEnvironmentVariable("AZURE_AI_MODEL");
PersistentAgentsClient client = new(projectEndpoint, new DefaultAzureCredential());
// Create an Agent with toolResources and process Agent run
PersistentAgent agent = client.Administration.CreateAgent(
model: modelDeploymentName,
name: "SDK Test Agent - Tutor",
instructions: "You are a personal electronics tutor. Write and run code to answer questions.",
tools: new List<ToolDefinition> { new CodeInterpreterToolDefinition() });
// Create thread for communication
PersistentAgentThread thread = client.Threads.CreateThread();
// Create message to thread
PersistentThreadMessage messageResponse = client.Messages.CreateMessage(
thread.Id,
MessageRole.User,
"I need to solve the equation `3x + 11 = 14`. Can you help me?");
// Run the Agent
ThreadRun run = client.Runs.CreateRun(thread, agent);
// Wait for the run to complete
do
{
Thread.Sleep(TimeSpan.FromMilliseconds(500));
run = client.Runs.GetRun(thread.Id, run.Id);
}
while (run.Status == RunStatus.Queued
|| run.Status == RunStatus.InProgress);
Pageable<PersistentThreadMessage> messages = client.Messages.GetMessages(
threadId: thread.Id,
order: ListSortOrder.Ascending
);
// Print the messages in the thread
WriteMessages(messages);
// Delete the thread and agent after use
client.Threads.DeleteThread(thread.Id);
client.Administration.DeleteAgent(agent.Id);
// Temporary function to use a list of messages in the thread and write them to the console.
static void WriteMessages(IEnumerable<PersistentThreadMessage> messages)
{
foreach (PersistentThreadMessage threadMessage in messages)
{
Console.Write($"{threadMessage.CreatedAt:yyyy-MM-dd HH:mm:ss} - {threadMessage.Role,10}: ");
foreach (MessageContent contentItem in threadMessage.ContentItems)
{
if (contentItem is MessageTextContent textItem)
{
Console.Write(textItem.Text);
}
else if (contentItem is MessageImageFileContent imageFileItem)
{
Console.Write($"<image from ID: {imageFileItem.FileId}");
}
Console.WriteLine();
}
}
}
将 YOUR-FOUNDRY-RESOURCE-NAME
和 YOUR-PROJECT-NAME
替换为你的值:
# Create agent
curl --request POST --url "https://YOUR-FOUNDRY-RESOURCE-NAME.services.ai.azure.com/api/projects/YOUR-PROJECT-NAME/assistants?api-version=v1" \
-h "authorization: Bearer $AZURE_AI_AUTH_TOKEN" \
-h "content-type: application/json" \
-d '{
"model": "gpt-4o",
"name": "my-agent",
"instructions": "You are a helpful writing assistant"
}'
#Lets say agent ID created is asst_123456789. Use this to run the agent
# Create thread
curl --request POST --url 'https://YOUR-FOUNDRY-RESOURCE-NAME.services.ai.azure.com/api/projects/YOUR-PROJECT-NAME/threads?api-version=v1' \
-h 'authorization: Bearer $AZURE_AI_AUTH_TOKEN' \
-h 'content-type: application/json'
#Lets say thread ID created is thread_123456789. Use this in the next step
# Create message using thread ID
curl --request POST --url 'https://YOUR-FOUNDRY-RESOURCE-NAME.services.ai.azure.com/api/projects/YOUR-PROJECT-NAME/threads/thread_123456789/messages?api-version=v1' \
-h 'authorization: Bearer $AZURE_AI_AUTH_TOKEN' \
-h 'content-type: application/json' \
-d '{
"role": "user",
"content": "Write me a poem about flowers"
}'
# Run thread with the agent - use both agent id and thread id
curl --request POST --url 'https://YOUR-FOUNDRY-RESOURCE-NAME.services.ai.azure.com/api/projects/YOUR-PROJECT-NAME/threads/thread_123456789/runs?api-version=v1' \
-h 'authorization: Bearer $AZURE_AI_AUTH_TOKEN' \
-h 'content-type: application/json' \
--data '{
"assistant_id": "asst_123456789"
}'
# List the messages in the thread using thread ID
curl --request GET --url 'https://YOUR-FOUNDRY-RESOURCE-NAME.services.ai.azure.com/api/projects/YOUR-PROJECT-NAME/threads/thread_123456789/messages?api-version=v1' \
-h 'authorization: Bearer $AZURE_AI_AUTH_TOKEN' \
-h 'content-type: application/json'
# Delete agent once done using agent id
curl --request DELETE --url 'https://YOUR-FOUNDRY-RESOURCE-NAME.services.ai.azure.com/api/projects/YOUR-PROJECT-NAME/assistants/asst_123456789?api-version=v1' \
-h 'authorization: Bearer $AZURE_AI_AUTH_TOKEN' \
-h 'content-type: application/json'
将文件添加到代理
现在,让我们添加一个文件搜索工具,使我们能够进行知识检索。
- 下载 product_info_1.md 以提供给代理。
- 在代理的 “设置 ”窗格中,根据需要向下滚动以查找 知识。
- 选择 并添加。
- 选择“文件”以上传 product_info_1.md 文件。
- 选择“添加文件”下的“选择本地文件”。
- 选择“ 上传并保存”。
- 更改代理说明,例如,“你是一个有用的助手,可以从上传的文件搜索信息。
- 问一个问题,例如,“你好,你知道哪些 Contoso 产品?
- 若要添加更多文件,请在 AgentVectorStore 上选择 ... ,然后选择“ 管理”。
用你的终结点替换此代码中的 endpoint
:
from azure.ai.projects import AIProjectClient
from azure.identity import DefaultAzureCredential
from azure.ai.agents.models import ListSortOrder, FileSearchTool
project = AIProjectClient(
endpoint="https://your-foundry-resource-name.ai.azure.com/api/projects/project-name",
credential=DefaultAzureCredential(),
)
# Upload file and create vector store
file = project.agents.files.upload(file_path="./product_info_1.md", purpose=FilePurpose.AGENTS)
vector_store = project.agents.vector_stores.create_and_poll(file_ids=[file.id], name="my_vectorstore")
# Create file search tool and agent
file_search = FileSearchTool(vector_store_ids=[vector_store.id])
agent = project.agents.create_agent(
model="gpt-4o",
name="my-assistant",
instructions="You are a helpful assistant and can search information from uploaded files",
tools=file_search.definitions,
tool_resources=file_search.resources,
)
# Create thread and process user message
thread = project.agents.threads.create()
project.agents.messages.create(thread_id=thread.id, role="user", content="Hello, what Contoso products do you know?")
run = project.agents.runs.create_and_process(thread_id=thread.id, agent_id=agent.id)
# Handle run status
if run.status == "failed":
print(f"Run failed: {run.last_error}")
# Print thread messages
messages = project.agents.messages.list(thread_id=thread.id, order=ListSortOrder.ASCENDING)
for message in messages:
if message.run_id == run.id and message.text_messages:
print(f"{message.role}: {message.text_messages[-1].text.value}")
# Cleanup resources
project.agents.vector_stores.delete(vector_store.id)
project.agents.files.delete(file_id=file.id)
project.agents.delete_agent(agent.id)
package com.azure.ai.foundry.samples;
import com.azure.ai.foundry.samples.utils.ConfigLoader;
import com.azure.ai.projects.ProjectsClient;
import com.azure.ai.projects.ProjectsClientBuilder;
import com.azure.ai.projects.models.agent.Agent;
import com.azure.ai.projects.models.agent.AgentClient;
import com.azure.ai.projects.models.agent.AgentMessage;
import com.azure.ai.projects.models.agent.AgentOptions;
import com.azure.ai.projects.models.agent.AgentRole;
import com.azure.ai.projects.models.agent.AgentRun;
import com.azure.ai.projects.models.agent.AgentRunStatus;
import com.azure.ai.projects.models.agent.AgentThread;
import com.azure.ai.projects.models.agent.FileTool;
import com.azure.ai.projects.models.file.File;
import com.azure.ai.projects.models.file.FileClient;
import com.azure.identity.DefaultAzureCredential;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;
/**
* This sample demonstrates how to create an agent with file search capability using the Azure AI Foundry SDK.
*
* File search agents can analyze and extract information from documents, allowing users to ask
* questions about the content of those documents. This extends the capabilities of regular agents
* by giving them access to specific information contained in files.
*
* This sample shows:
* 1. How to authenticate with Azure AI Foundry using DefaultAzureCredential
* 2. How to create and upload a sample document
* 3. How to create an agent with file search capabilities
* 4. How to configure the agent with access to specific files
* 5. How to run the agent and ask questions about the document content
* 6. How to retrieve and display the agent's responses
*
* Use cases for file search agents include:
* - Document analysis and summarization
* - Question answering from technical documentation
* - Data extraction from structured files
* - Research assistance across multiple documents
*
* Prerequisites:
* - An Azure account with access to Azure AI Foundry
* - Azure CLI installed and logged in ('az login')
* - Environment variables set in .env file (AZURE_ENDPOINT, AZURE_DEPLOYMENT)
*/
public class FileSearchAgentSample {
public static void main(String[] args) {
// Load configuration values from the .env file
// These include the service endpoint and the deployment name of the model to use
String endpoint = ConfigLoader.getAzureEndpoint();
String deploymentName = ConfigLoader.getAzureDeployment();
// Get DefaultAzureCredential for authentication
// This uses the most appropriate authentication method based on the environment
// For local development, it will use your Azure CLI login credentials
DefaultAzureCredential credential = ConfigLoader.getDefaultCredential();
// Create a projects client to interact with Azure AI Foundry services
// The client requires an authentication credential and an endpoint
ProjectsClient client = new ProjectsClientBuilder()
.credential(credential)
.endpoint(endpoint)
.buildClient();
try {
// Create a sample document containing information about cloud computing
// In a real application, you would use your own existing documents
Path tempFile = createSampleDocument();
// Get a file client to handle file operations
// This is used to upload files that the agent will search through
FileClient fileClient = client.getFileClient();
// Upload the file to Azure AI Foundry
// The uploaded file will be available for the agent to search and analyze
System.out.println("Uploading file: " + tempFile);
File uploadedFile = fileClient.uploadFile(tempFile.toString());
System.out.println("File uploaded with ID: " + uploadedFile.getId());
// Get an agent client
AgentClient agentClient = client.getAgentClient();
// Create an agent with file search capability
System.out.println("Creating agent with file search capability...");
Agent agent = agentClient.createAgent(new AgentOptions()
.setName("Document Assistant")
.setDescription("An agent that helps with document searching")
.setInstructions("You are a document assistant. Help users find information in their documents.")
.setModel(deploymentName)
.addTool(new FileTool()
.addFile(uploadedFile.getId())));
System.out.println("Agent created: " + agent.getName() + " (ID: " + agent.getId() + ")");
// Create a thread for the conversation
System.out.println("Creating thread...");
AgentThread thread = agentClient.createThread();
System.out.println("Thread created: " + thread.getId());
// Create a user message
AgentMessage userMessage = new AgentMessage()
.setRole(AgentRole.USER)
.setContent("Find and list the benefits of cloud computing from my document.");
// Run the agent
System.out.println("Running agent...");
AgentRun run = agentClient.createRun(thread.getId(), agent.getId(), userMessage);
System.out.println("Run created: " + run.getId());
// Wait for the run to complete
AgentRun completedRun = waitForRunCompletion(agentClient, thread.getId(), run.getId());
System.out.println("Run completed with status: " + completedRun.getStatus());
// Get messages from the thread
List<AgentMessage> messages = agentClient.getMessages(thread.getId());
// Display the assistant's response
System.out.println("\nConversation:");
for (AgentMessage message : messages) {
System.out.println(message.getRole() + ": " + message.getContent());
}
// Clean up the temporary file
Files.deleteIfExists(tempFile);
} catch (IOException e) {
System.err.println("Error working with files: " + e.getMessage());
e.printStackTrace();
}
}
private static Path createSampleDocument() throws IOException {
String content = "# Cloud Computing Overview\n\n" +
"Cloud computing is the delivery of computing services—including servers, storage, databases, networking, software, analytics, and intelligence—over the Internet ("the cloud") to offer faster innovation, flexible resources, and economies of scale.\n\n" +
"## Benefits of Cloud Computing\n\n" +
"1. **Cost Savings**: Cloud computing eliminates the capital expense of buying hardware and software and setting up and running on-site data centers.\n\n" +
"2. **Scalability**: Cloud services can be scaled up or down based on demand, providing businesses with flexibility as their needs change.\n\n" +
"3. **Performance**: The biggest cloud computing services run on a worldwide network of secure data centers, which are regularly upgraded to the latest generation of fast and efficient computing hardware.\n\n" +
"4. **Reliability**: Cloud computing makes data backup, disaster recovery, and business continuity easier and less expensive because data can be mirrored at multiple redundant sites on the cloud provider's network.\n\n" +
"5. **Security**: Many cloud providers offer a broad set of policies, technologies, and controls that strengthen your security posture overall.";
Path tempFile = Files.createTempFile("cloud-computing-info-", ".md");
Files.writeString(tempFile, content);
return tempFile;
}
private static AgentRun waitForRunCompletion(AgentClient agentClient, String threadId, String runId) {
AgentRun run = agentClient.getRun(threadId, runId);
while (run.getStatus() == AgentRunStatus.QUEUED || run.getStatus() == AgentRunStatus.IN_PROGRESS) {
try {
System.out.println("Run status: " + run.getStatus() + " - waiting...");
Thread.sleep(1000); // Wait for 1 second before checking again
run = agentClient.getRun(threadId, runId);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
throw new RuntimeException("Thread was interrupted", e);
}
}
return run;
}
}
// Upload a file named product_info_1.md
console.log(`\n==================== 🕵️ FILE AGENT ====================`);
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const filePath = path.join(__dirname, '../data/product_info_1.md');
const fileStream = fs.createReadStream(filePath);
fileStream.on('data', (chunk) => {
console.log(`Read ${chunk.length} bytes of data.`);
});
const file = await client.agents.files.upload(fileStream, 'assistants', {
fileName: 'product_info_1.md'
});
console.log(`Uploaded file, ID: ${file.id}`);
const vectorStore = await client.agents.vectorStores.create({
fileIds: [file.id],
name: 'my_vectorstore'
});
console.log('\n---------------- 🗃️ Vector Store Info ----------------');
console.table([
{
'Vector Store ID': vectorStore.id,
'Usage (bytes)': vectorStore.usageBytes,
'File Count': vectorStore.fileCounts?.total ?? 'N/A'
}
]);
// Create an Agent and a FileSearch tool
const fileSearchTool = ToolUtility.createFileSearchTool([vectorStore.id]);
const fileAgent = await client.agents.createAgent(deployment, {
name: 'my-file-agent',
instructions: 'You are a helpful assistant and can search information from uploaded files',
tools: [fileSearchTool.definition],
toolResources: fileSearchTool.resources,
});
// Create a thread and message
const fileSearchThread = await client.agents.threads.create({ toolResources: fileSearchTool.resources });
const filePrompt = 'What are the steps to setup the TrailMaster X4 Tent?';
console.log(`\n---------------- 📝 User Prompt ---------------- \n${filePrompt}`);
await client.agents.messages.create(fileSearchThread.id, 'user', filePrompt);
// Create run
let fileSearchRun = await client.agents.runs.create(fileSearchThread.id, fileAgent.id).stream();
for await (const eventMessage of fileSearchRun) {
if (eventMessage.event === DoneEvent.Done) {
console.log(`Run completed: ${eventMessage.data}`);
}
if (eventMessage.event === ErrorEvent.Error) {
console.log(`An error occurred. ${eventMessage.data}`);
}
}
const fileSearchMessagesIterator = await client.agents.messages.list(fileSearchThread.id);
const fileAssistantMessage = await getAssistantMessage(fileSearchMessagesIterator);
console.log(`\n---------------- 💬 Response ---------------- \n`);
printAssistantMessage(fileAssistantMessage);
// Clean up
console.log(`\n---------------- 🧹 Clean Up File Agent ----------------`);
client.agents.vectorStores.delete(vectorStore.id);
client.agents.files.delete(file.id);
client.agents.deleteAgent(fileAgent.id);
console.log(`Deleted VectorStore, File, and FileAgent. FileAgent ID: ${fileAgent.id}`);
using Azure;
using Azure.Identity;
using Azure.AI.Agents.Persistent;
// Creating the Client for agents and vector stores
var projectEndpoint = System.Environment.GetEnvironmentVariable("AZURE_AI_ENDPOINT");
var modelDeploymentName = System.Environment.GetEnvironmentVariable("AZURE_AI_MODEL");
PersistentAgentsClient client = new(projectEndpoint, new DefaultAzureCredential());
PersistentAgentFileInfo uploadedAgentFile = client.Files.UploadFile(
filePath: "product_info_1.md",
purpose: PersistentAgentFilePurpose.Agents);
// Create a vector store with the file and wait for it to be processed.
// If you do not specify a vector store, create_message will create a vector store with a default expiration policy of seven days after they were last active
Dictionary<string, string> fileIds = new()
{
{ uploadedAgentFile.Id, uploadedAgentFile.Filename }
};
PersistentAgentsVectorStore vectorStore = client.VectorStores.CreateVectorStore(
name: "my_vector_store");
// Add file ID to vector store.
VectorStoreFile vctFile = client.VectorStores.CreateVectorStoreFile(
vectorStoreId: vectorStore.Id,
fileId: uploadedAgentFile.Id
);
Console.WriteLine($"Added file to vector store. The id file in the vector store is {vctFile.Id}.");
FileSearchToolResource fileSearchToolResource = new FileSearchToolResource();
fileSearchToolResource.VectorStoreIds.Add(vectorStore.Id);
// Create an Agent with toolResources and process Agent run
PersistentAgent agent = client.Administration.CreateAgent(
model: modelDeploymentName,
name: "SDK Test Agent - Retrieval",
instructions: "You are a helpful agent that can help fetch data from files you know about.",
tools: new List<ToolDefinition> { new FileSearchToolDefinition() },
toolResources: new ToolResources() { FileSearch = fileSearchToolResource });
// Create thread for communication
PersistentAgentThread thread = client.Threads.CreateThread();
// Create message to thread
PersistentThreadMessage messageResponse = client.Messages.CreateMessage(
thread.Id,
MessageRole.User,
"Can you give me information on how to mount the product?");
// Run the Agent
ThreadRun run = client.Runs.CreateRun(thread, agent);
// Wait for the run to complete
// This is a blocking call, so it will wait until the run is completed
do
{
Thread.Sleep(TimeSpan.FromMilliseconds(500));
run = client.Runs.GetRun(thread.Id, run.Id);
}
while (run.Status == RunStatus.Queued
|| run.Status == RunStatus.InProgress);
// Create a list of messages in the thread and write them to the console.
Pageable<PersistentThreadMessage> messages = client.Messages.GetMessages(
threadId: thread.Id,
order: ListSortOrder.Ascending
);
WriteMessages(messages, fileIds);
// Delete the thread and agent after use
client.VectorStores.DeleteVectorStore(vectorStore.Id);
client.Files.DeleteFile(uploadedAgentFile.Id);
client.Threads.DeleteThread(thread.Id);
client.Administration.DeleteAgent(agent.Id);
// Helper method to write messages to the console
static void WriteMessages(IEnumerable<PersistentThreadMessage> messages, Dictionary<string, string> fileIds)
{
foreach (PersistentThreadMessage threadMessage in messages)
{
Console.Write($"{threadMessage.CreatedAt:yyyy-MM-dd HH:mm:ss} - {threadMessage.Role,10}: ");
foreach (MessageContent contentItem in threadMessage.ContentItems)
{
if (contentItem is MessageTextContent textItem)
{
if (threadMessage.Role == MessageRole.Agent && textItem.Annotations.Count > 0)
{
string strMessage = textItem.Text;
foreach (MessageTextAnnotation annotation in textItem.Annotations)
{
if (annotation is MessageTextFilePathAnnotation pathAnnotation)
{
strMessage = replaceReferences(fileIds, pathAnnotation.FileId, pathAnnotation.Text, strMessage);
}
else if (annotation is MessageTextFileCitationAnnotation citationAnnotation)
{
strMessage = replaceReferences(fileIds, citationAnnotation.FileId, citationAnnotation.Text, strMessage);
}
}
Console.Write(strMessage);
}
else
{
Console.Write(textItem.Text);
}
}
else if (contentItem is MessageImageFileContent imageFileItem)
{
Console.Write($"<image from ID: {imageFileItem.FileId}");
}
Console.WriteLine();
}
}
}
// Helper method to replace file references in the text
static string replaceReferences(Dictionary<string, string> fileIds, string fileID, string placeholder, string text)
{
if (fileIds.TryGetValue(fileID, out string replacement))
return text.Replace(placeholder, $" [{replacement}]");
else
return text.Replace(placeholder, $" [{fileID}]");
}
将 YOUR-FOUNDRY-RESOURCE-NAME
和 YOUR-PROJECT-NAME
替换为你的值:
#Upload the file
curl --request POST --url 'https://YOUR-FOUNDRY-RESOURCE-NAME.services.ai.azure.com/api/projects/YOUR-PROJECT-NAME/files?api-version=v1' \
-h 'authorization: Bearer $AZURE_AI_AUTH_TOKEN' \
-f purpose="assistant" \
-f file="@product_info_1.md" #File object (not file name) to be uploaded.
#Lets say file ID created is assistant-123456789. Use this in the next step
# create vector store
curl --request POST --url 'https://YOUR-FOUNDRY-RESOURCE-NAME.services.ai.azure.com/api/projects/YOUR-PROJECT-NAME/vector_stores?api-version=v1' \
-h 'authorization: Bearer $AZURE_AI_AUTH_TOKEN' \
-h 'content-type: application/json' \
-d '{
"name": "my_vectorstore",
"file_ids": ["assistant-123456789"]
}'
#Lets say Vector Store ID created is vs_123456789. Use this in the next step
# Create Agent for File Search
curl --request POST --url 'https://YOUR-FOUNDRY-RESOURCE-NAME.services.ai.azure.com/api/projects/YOUR-PROJECT-NAME/assistants?api-version=v1' \
-h 'authorization: Bearer $AZURE_AI_AUTH_TOKEN' \
-h 'content-type: application/json' \
-d '{
"model": "gpt-4o",
"name": "my-assistant",
"instructions": "You are a helpful assistant and can search information from uploaded files",
"tools": [{"type": "file_search"}],
"tool_resources": {"file_search": {"vector_store_ids": ["vs_123456789"]}}
}'
#Lets say agent ID created is asst_123456789. Use this to run the agent
# Create thread
curl --request POST --url 'https://YOUR-FOUNDRY-RESOURCE-NAME.services.ai.azure.com/api/projects/YOUR-PROJECT-NAME/threads?api-version=v1' \
-h 'authorization: Bearer $AZURE_AI_AUTH_TOKEN' \
-h 'content-type: application/json'
#Lets say thread ID created is thread_123456789. Use this in the next step
# Create message using thread ID
curl --request POST --url 'https://YOUR-FOUNDRY-RESOURCE-NAME.services.ai.azure.com/api/projects/YOUR-PROJECT-NAME/threads/thread_123456789/messages?api-version=v1' \
-h 'authorization: Bearer $AZURE_AI_AUTH_TOKEN' \
-h 'content-type: application/json' \
-d '{
"role": "user",
"content": "Hello, what Contoso products do you know?"
}'
# Run thread with the agent - use both agent id and thread id
curl --request POST --url 'https://YOUR-FOUNDRY-RESOURCE-NAME.services.ai.azure.com/api/projects/YOUR-PROJECT-NAME/threads/thread_123456789/runs?api-version=v1' \
-h 'authorization: Bearer $AZURE_AI_AUTH_TOKEN' \
-h 'content-type: application/json' \
--data '{
"assistant_id": "asst_123456789"
}'
# List the messages in the thread using thread ID
curl --request GET --url 'https://YOUR-FOUNDRY-RESOURCE-NAME.services.ai.azure.com/api/projects/YOUR-PROJECT-NAME/threads/thread_123456789/messages?api-version=v1' \
-h 'authorization: Bearer $AZURE_AI_AUTH_TOKEN' \
-h 'content-type: application/json'
# Delete agent once done using agent id
curl --request DELETE --url 'https://YOUR-FOUNDRY-RESOURCE-NAME.services.ai.azure.com/api/projects/YOUR-PROJECT-NAME/assistants/asst_123456789?api-version=v1' \
-h 'authorization: Bearer $AZURE_AI_AUTH_TOKEN' \
-h 'content-type: application/json'
运行聊天完成
聊天完成是 AI 应用程序的基本构建基块。 使用聊天完成功能,您可以发送消息列表,并从模型而非人工获取响应。
- 在左窗格中,选择 游乐场。
- 选择“试用聊天操场”。
- 填写提示并选择 “发送 ”按钮。
- 模型在 “响应 ”窗格中返回响应。
用你的终结点替换此代码中的 endpoint
:
from azure.ai.projects import AIProjectClient
from azure.identity import DefaultAzureCredential
project = AIProjectClient(
endpoint="https://your-foundry-resource-name.ai.azure.com/api/projects/project-name",
credential=DefaultAzureCredential(),
)
models = project.inference.get_azure_openai_client(api_version="2024-10-21")
response = models.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "You are a helpful writing assistant"},
{"role": "user", "content": "Write me a poem about flowers"},
],
)
print(response.choices[0].message.content)
package com.azure.ai.foundry.samples;
import com.azure.ai.foundry.samples.utils.ConfigLoader;
import com.azure.ai.projects.ProjectsClient;
import com.azure.ai.projects.ProjectsClientBuilder;
import com.azure.ai.projects.models.chat.ChatClient;
import com.azure.ai.projects.models.chat.ChatCompletion;
import com.azure.ai.projects.models.chat.ChatCompletionOptions;
import com.azure.ai.projects.models.chat.ChatMessage;
import com.azure.ai.projects.models.chat.ChatRole;
import com.azure.identity.DefaultAzureCredential;
import com.azure.identity.DefaultAzureCredentialBuilder;
import com.azure.ai.projects.models.chat.ChatCompletionResponse;
import java.util.Arrays;
import java.util.List;
/**
* This sample demonstrates how to use the chat completion API with the Azure AI Foundry SDK.
*
* Chat completions allow you to have interactive, conversational interactions with AI models
* by providing a list of messages and receiving AI-generated responses that maintain context
* across the conversation.
*
* This sample shows:
* 1. How to authenticate with Azure AI Foundry using DefaultAzureCredential
* 2. How to create a chat client for a specific model deployment
* 3. How to structure a conversation with system and user messages
* 4. How to configure and send a chat completion request
* 5. How to process and display the AI-generated response
*
* Prerequisites:
* - An Azure account with access to Azure AI Foundry
* - Azure CLI installed and logged in ('az login')
* - Environment variables set in .env file (AZURE_ENDPOINT, AZURE_DEPLOYMENT)
*/
public class ChatCompletionSample {
public static void main(String[] args) {
// Load configuration values from the .env file
// These include the service endpoint and the deployment name of the model to use
String endpoint = ConfigLoader.getAzureEndpoint();
String deploymentName = ConfigLoader.getAzureDeployment();
// Get DefaultAzureCredential for authentication
// This uses the most appropriate authentication method based on the environment
// For local development, it will use your Azure CLI login credentials
DefaultAzureCredential credential = ConfigLoader.getDefaultCredential();
// Create a projects client to interact with Azure AI Foundry services
// The client requires an authentication credential and an endpoint
ProjectsClient client = new ProjectsClientBuilder()
.credential(credential)
.endpoint(endpoint)
.buildClient();
// Get a chat client for the specified model deployment
// This client provides access to chat completion functionality
ChatClient chatClient = client.getChatClient(deploymentName);
// Create a list of chat messages to form the conversation
// This includes a system message to set the assistant's behavior
// and a user message containing the user's question or prompt
List<ChatMessage> messages = Arrays.asList(
new ChatMessage(ChatRole.SYSTEM, "You are a helpful assistant."),
new ChatMessage(ChatRole.USER, "Tell me about Azure AI Foundry.")
);
// Configure chat completion options including the messages, temperature, and token limit
// - Temperature controls randomness: lower values (like 0.2) give more focused responses,
// higher values (like 0.8) give more creative responses
// - MaxTokens limits the length of the response
ChatCompletionOptions options = new ChatCompletionOptions(messages)
.setTemperature(0.7) // Balanced between deterministic and creative
.setMaxTokens(800); // Limit response length
System.out.println("Sending chat completion request...");
// Send the request and get the AI-generated completion
ChatCompletion completion = chatClient.getChatCompletion(options);
// Display the response
System.out.println("\nResponse from assistant:");
System.out.println(completion.getChoices().get(0).getMessage().getContent());
// Display usage statistics
System.out.println("\nUsage Statistics:");
System.out.println("Prompt Tokens: " + completion.getUsage().getPromptTokens());
System.out.println("Completion Tokens: " + completion.getUsage().getCompletionTokens());
System.out.println("Total Tokens: " + completion.getUsage().getTotalTokens());
}
}
// Get the Azure AI endpoint and deployment name from environment variables
const endpoint = process.env.PROJECT_ENDPOINT;
const deployment = process.env.MODEL_DEPLOYMENT_NAME || 'gpt-4o';
// Create an Azure OpenAI Client
const project = new AIProjectClient(endpoint, new DefaultAzureCredential());
const client = await project.inference.azureOpenAI({
// The API version should match the version of the Azure OpenAI resource
apiVersion: "2024-12-01-preview"
});
// Create a chat completion
const chatCompletion = await client.chat.completions.create({
model: deployment,
messages: [
{ role: "system", content: "You are a helpful writing assistant" },
{ role: "user", content: "Write me a poem about flowers" },
],
});
console.log(`\n==================== 🌷 COMPLETIONS POEM ====================\n`);
console.log(chatCompletion.choices[0].message.content);
using Azure;
using Azure.Identity;
using Azure.AI.Projects;
using Azure.AI.Inference;
var projectEndpoint = new Uri(System.Environment.GetEnvironmentVariable("AZURE_AI_ENDPOINT"));
var modelDeploymentName = System.Environment.GetEnvironmentVariable("AZURE_AI_MODEL");
var credential = new DefaultAzureCredential();
AIProjectClient client = new AIProjectClient(projectEndpoint, credential);
ChatCompletionsClient chatClient = client.GetChatCompletionsClient();
var requestOptions = new ChatCompletionsOptions()
{
Messages =
{
new ChatRequestSystemMessage("You are a helpful assistant."),
new ChatRequestUserMessage("How many feet are in a mile?"),
},
Model = modelDeploymentName
};
Response<ChatCompletions> response = chatClient.Complete(requestOptions);
Console.WriteLine(response.Value.Content);
用您的值替换YOUR-FOUNDRY-RESOURCE-NAME
:
curl --request POST --url 'https://YOUR-FOUNDRY-RESOURCE-NAME.services.ai.azure.com/openai/deployments/gpt-4o/chat/completions?api-version=2024-10-21' \
-h 'authorization: Bearer $AZURE_AI_AUTH_TOKEN' \
-h 'content-type: application/json' \
-d '{
"messages": [
{"role": "system",
"content": "You are a helpful writing assistant"},
{"role": "user",
"content": "Write me a poem about flowers"}
],
"model": "gpt-4o"
}'
清理资源
如果不再需要它们,请删除与项目关联的资源组。
在 Azure AI Foundry 门户中,选择右上角的项目名称。 然后选择资源组的链接,在 Azure 门户中将其打开。 选择资源组,然后选择“ 删除”。 确认要删除资源组。
相关内容
反馈
此页面是否有帮助?