Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Importante
Itens marcados (versão prévia) neste artigo estão atualmente em versão prévia pública. Essa versão prévia é fornecida sem um contrato de nível de serviço e não recomendamos isso para cargas de trabalho de produção. Alguns recursos podem não ter suporte ou ter recursos restritos. Para obter mais informações, consulte Supplemental Terms of Use for Microsoft Azure Previews.
Um interpretador de código personalizado fornece controle total sobre o ambiente de runtime para o código de Python gerado pelo agente. Você pode configurar pacotes de Python personalizados, recursos de computação e configurações do ambiente do Aplicativos de Contêiner do Azure. O contêiner do interpretador de código expõe um servidor MCP (Model Context Protocol).
Use um interpretador de código personalizado quando a ferramenta interna Code Interpreter para agentes não atender aos seus requisitos, por exemplo, quando você precisar de pacotes Python específicos, imagens de contêiner personalizadas ou recursos de computação dedicados.
Para obter mais informações sobre o MCP e como os agentes se conectam às ferramentas do MCP, consulte Conectar-se aos servidores do Protocolo de Contexto de Modelo (versão prévia).
Dica
Considere adicionar essa ferramenta usando uma caixa de ferramentas. Usando uma caixa de ferramentas, você pode reutilizar a ferramenta entre agentes e runtimes, bem como centralizar o gerenciamento de credenciais, controle de versão e imposição de política por meio de um ponto de extremidade MCP gerenciado. Consulte o início rápido da caixa de ferramentas.
Pré-requisitos
CLI do Azure versão 2.60.0 ou posterior.
Python 3.12 ou posterior para o projeto de exemplo mantido.
(Opcional) uv para gerenciamento de pacotes Python mais rápido.
Uma assinatura Azure e um grupo de recursos com as seguintes atribuições de função:
Usuário do Foundry no projeto do Foundry para configurar e executar o agente após o provisionamento.
Importante
As funções RBAC do Foundry foram renomeadas recentemente. Foundry User, Foundry Owner, Foundry Account Owner e Foundry Project Manager eram anteriormente chamados de Usuário do Azure AI, Proprietário do Azure AI, Proprietário da conta do Azure AI e Gerente de Projeto do Azure AI. Você ainda pode ver os nomes anteriores em alguns lugares enquanto essa mudança de nome está sendo implementada. Os IDs das funções e as permissões principais não são alterados com a mudança de nome.
Proprietário do Foundry apenas no grupo de recursos de destino enquanto a implantação de exemplo cria os recursos do Foundry e a conexão do projeto.
Colaborador de ManagedEnvironment dos Aplicativos de Contêiner no grupo de recursos de destino somente enquanto a implantação de exemplo cria o ambiente de Aplicativos de Contêiner.
Ative as funções de provisionamento bem a tempo por meio de Microsoft Entra Privileged Identity Management (PIM) e desative-as após a implantação. Os desenvolvedores do agente diário e os usuários de runtime não precisam dessas funções de provisionamento.
Um SDK do Microsoft Foundry. Consulte o início rápido para instalação.
Uma região com suporte de ambos: Foundry Agent Service e Aplicativos de Contêiner do Azure Dynamic Sessions. Consulte as regiões das Sessões Dinâmicas do Aplicativos de Contêiner do Azure.
Suporte ao uso
Este artigo usa o CLI do Azure e um projeto de exemplo executável.
A tabela a seguir mostra o SDK e o suporte à instalação.
| Suporte ao Microsoft Foundry | SDK do Python | C# SDK | SDK para JavaScript | SDK do Java | API REST | Configuração básica do agente | Configuração do agente padrão |
|---|---|---|---|---|---|---|---|
| ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | - | ✔️ |
Para obter o suporte mais recente do SDK e da API para ferramentas de agentes, consulte as melhores práticas para usar ferramentas no Microsoft Foundry Agent Service.
Suporte ao SDK
O interpretador de código personalizado usa o tipo de ferramenta MCP. Qualquer SDK que dê suporte a ferramentas MCP pode criar um agente de interpretador de código personalizado. O SDK do .NET está atualmente em versão prévia. Para obter as etapas de provisionamento de infraestrutura (CLI do Azure, Bicep), consulte Criar um agente com interpretador de código personalizado.
Antes de começar
Esse procedimento provisiona a infraestrutura do Azure, incluindo recursos do Aplicativos de Contêiner do Azure. Examine os requisitos de custo e governança Azure da sua organização antes da implantação.
Criar um agente com interpretador de código personalizado
As etapas a seguir mostram como provisionar a infraestrutura e criar um agente que usa um servidor MCP de interpretador de código personalizado. A configuração da infraestrutura se aplica a todos os idiomas. Seguem exemplos de código específicos do idioma.
Registrar o recurso de visualização
Registre o recurso de servidor MCP para Aplicativos de Contêiner do Azure Sessões Dinâmicas:
az feature register --namespace Microsoft.App --name SessionPoolsSupportMCP
az provider register -n Microsoft.App
Obter o código de exemplo
Clone o código sample no repositório GitHub e navegue até a pasta samples/python/prompt-agents/code-interpreter-custom em seu terminal.
Provisionar a infraestrutura
O exemplo mantido de agente direto armazena o ponto de extremidade MCP do pool de sessões na conexão do projeto. As definições do Toolbox também exigem que o endpoint seja especificado como server_url. Adicione essa saída ao arquivo clonado infra.bicep :
output MCP_SERVER_URL string = sessionPool.properties.mcpServerSettings.mcpServerEndpoint
Não use poolManagementEndpoint. Esse valor é o ponto de extremidade de gerenciamento de Sessões Dinâmicas, não o ponto de extremidade do servidor MCP.
Para provisionar a infraestrutura, execute o seguinte comando usando o CLI do Azure (az):
az deployment group create \
--name custom-code-interpreter \
--subscription <your_subscription> \
--resource-group <your_resource_group> \
--template-file ./infra.bicep
Nota
A implantação pode levar até uma hora, dependendo do número de instâncias em espera solicitadas. A alocação dinâmica do pool de sessão é a etapa mais longa.
Configurar e executar o agente
Copie o .env.sample arquivo do repositório para .env. Mapeie as saídas da implantação do Bicep às variáveis de ambiente correspondentes:
| saída Bicep | Variável de ambiente | Usado para |
|---|---|---|
AZURE_AI_PROJECT_ENDPOINT |
AZURE_AI_PROJECT_ENDPOINT |
Endpoint do projeto Foundry. |
AZURE_AI_CONNECTION_ID |
AZURE_AI_CONNECTION_ID |
Conexão do projeto cujo destino é o servidor MCP de interpretador de código personalizado. |
MCP_SERVER_URL |
MCP_SERVER_URL |
Endpoint MCP do pool de sessões exigido pelas definições da toolbox. |
AZURE_AI_MODEL_DEPLOYMENT_NAME |
AZURE_AI_MODEL_DEPLOYMENT_NAME |
Implantação do modelo do agente. |
Os exemplos embutidos usam PROJECT_ENDPOINT para AZURE_AI_PROJECT_ENDPOINT e MCP_CONNECTION_ID para AZURE_AI_CONNECTION_ID. O exemplo mantido de agente direto resolve o destino MCP por meio da conexão de projeto e usa https://localhost como uma URL de espaço reservado obrigatória. Para um toolbox, defina MCP_SERVER_URL para a saída mcpServerEndpoint porque MCPToolboxTool requer server_url ou connector_id, mesmo quando você também fornece uma conexão com o projeto.
Instale as dependências do Python e execute o exemplo mantido com um destes pares de comandos:
uv sync
uv run ./main.py
Ou crie um ambiente virtual e instale os requisitos de check-in:
python -m venv .venv
./.venv/bin/pip install -r requirements.txt
./.venv/bin/python ./main.py
Exemplo de código
O exemplo de Python a seguir mostra como criar um agente com uma ferramenta MCP de interpretador de código personalizada:
from azure.identity import DefaultAzureCredential
from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import MCPTool, MCPToolboxTool, PromptAgentDefinition
# Format: "https://resource_name.ai.azure.com/api/projects/project_name"
PROJECT_ENDPOINT = "your_project_endpoint"
MCP_SERVER_URL = "https://your-mcp-server-url"
# Optional: set to your project connection ID if your MCP server requires authentication
MCP_CONNECTION_ID = "your-mcp-connection-id"
# Create clients to call Foundry API
project = AIProjectClient(
endpoint=PROJECT_ENDPOINT,
credential=DefaultAzureCredential(),
)
openai = project.get_openai_client()
# Add the custom code interpreter MCP server to a toolbox. Using a toolbox is the
# recommended way to give agents tools: you curate tools once and reuse the toolbox
# across agents. See /azure/foundry/agents/concepts/toolbox-overview
toolbox = project.toolboxes.create_version(
name="custom-code-interpreter-toolbox",
description="Toolbox with the custom code interpreter MCP server",
tools=[
MCPToolboxTool(
server_label="custom-code-interpreter",
server_url=MCP_SERVER_URL,
project_connection_id=MCP_CONNECTION_ID,
)
],
)
# The toolbox exposes an MCP-compatible endpoint.
TOOLBOX_MCP_URL = (
f"{PROJECT_ENDPOINT}/toolboxes/{toolbox.name}"
f"/versions/{toolbox.version}/mcp?api-version=v1"
)
# Create a remote-tool project connection that points at the toolbox endpoint.
# Use a user Entra token so the caller's identity is passed through
# (audience https://ai.azure.com). Create the connection once, for example with
# the Azure Developer CLI:
#
# azd ai connection create custom-code-interpreter-toolbox-conn \
# --kind remote-tool \
# --target "<TOOLBOX_MCP_URL>" \
# --auth-type user-entra-token \
# --audience https://ai.azure.com
TOOLBOX_CONNECTION_NAME = "custom-code-interpreter-toolbox-conn"
# Create an agent that uses the toolbox as an MCP tool
agent = project.agents.create_version(
agent_name="CustomCodeInterpreterAgent",
definition=PromptAgentDefinition(
model="gpt-5-mini",
instructions="You are a helpful assistant that can run Python code to analyze data and solve problems.",
tools=[
MCPTool(
server_label="toolbox",
server_url=TOOLBOX_MCP_URL,
require_approval="never",
project_connection_id=TOOLBOX_CONNECTION_NAME,
)
],
),
description="Agent with custom code interpreter for data analysis.",
)
print(f"Agent created (id: {agent.id}, name: {agent.name}, version: {agent.version})")
# Test the agent with a simple calculation
response = openai.responses.create(
input="Calculate the factorial of 10 using Python.",
extra_body={"agent_reference": {"name": agent.name, "type": "agent_reference"}},
)
print(f"Response: {response.output_text}")
# Clean up
project.agents.delete_version(agent_name=agent.name, agent_version=agent.version)
project.toolboxes.delete_toolbox_version(
toolbox_name=toolbox.name,
version=toolbox.version,
)
print("Agent deleted")
Saída esperada
Ao executar o exemplo, você verá uma saída semelhante a:
Agent created (id: agent-xxxxxxxxxxxx, name: CustomCodeInterpreterAgent, version: 1)
Response: The factorial of 10 is 3,628,800. I calculated this using Python's math.factorial() function.
Agent deleted
Usar um agente hospedado
Este exemplo usa FoundryChatClient do Microsoft Agent Framework e se conecta ao ponto de extremidade MCP da caixa de ferramentas usando FoundryToolbox.
import asyncio
from agent_framework import Agent
from agent_framework.foundry import FoundryChatClient, FoundryToolbox
from azure.identity import AzureCliCredential
from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import MCPToolboxTool
PROJECT_ENDPOINT = "https://<account>.services.ai.azure.com/api/projects/<project>"
MCP_SERVER_URL = "https://your-mcp-server-url"
# Optional: set to your project connection ID if your MCP server requires authentication
MCP_CONNECTION_ID = "your-mcp-connection-id"
async def main() -> None:
credential = AzureCliCredential()
# 1. Create the custom code interpreter MCP tool and add it to a toolbox. Using a toolbox is the
# recommended way to give agents tools: curate tools once and reuse the
# toolbox across agents. See /azure/foundry/agents/concepts/toolbox-overview
project = AIProjectClient(endpoint=PROJECT_ENDPOINT, credential=credential)
toolbox = project.toolboxes.create_version(
name="custom-code-interpreter-toolbox",
description="Toolbox with the custom code interpreter MCP server",
tools=[
MCPToolboxTool(
server_label="custom-code-interpreter",
server_url=MCP_SERVER_URL,
project_connection_id=MCP_CONNECTION_ID,
)
],
)
# 2. The toolbox exposes an MCP-compatible endpoint.
TOOLBOX_MCP_URL = (
f"{PROJECT_ENDPOINT}/toolboxes/{toolbox.name}"
f"/versions/{toolbox.version}/mcp?api-version=v1"
)
# 3. Attach the toolbox to the hosted agent as an MCP tool.
, timeout=120.0)
toolbox_tool = FoundryToolbox(credential, url=TOOLBOX_MCP_URL)
agent = Agent(
client=FoundryChatClient(credential=credential),
instructions="You are a helpful assistant that can run Python code to analyze data and solve problems.",
tools=[toolbox_tool],
)
result = await agent.run("Calculate the factorial of 10 using Python.")
print(result.text)
project.toolboxes.delete_toolbox_version(
toolbox_name=toolbox.name,
version=toolbox.version,
)
if __name__ == "__main__":
asyncio.run(main())
Exemplo de código
O exemplo de C# a seguir mostra como criar um agente com uma ferramenta MCP de interpretador de código personalizada. Para obter mais informações sobre como trabalhar com ferramentas MCP no .NET, consulte o exemplo de ferramenta MCP no SDK do Azure para .NET repositório em GitHub.
using System;
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 mcpServerUrl = "https://your-mcp-server-url";
// Optional: set to your project connection ID if your MCP server requires authentication
var mcpConnectionId = "your-mcp-connection-id";
// Create project client to call Foundry API
AIProjectClient projectClient = new(
endpoint: new Uri(projectEndpoint),
tokenProvider: new DefaultAzureCredential());
// Add the custom code interpreter MCP server to a toolbox. Using a toolbox is the
// recommended way to give agents tools. See /azure/foundry/agents/concepts/toolbox-overview
// Code runs in a sandboxed Azure Container Apps session.
McpTool customCodeInterpreter = ResponseTool.CreateMcpTool(
serverLabel: "custom-code-interpreter",
serverUri: new Uri(mcpServerUrl));
customCodeInterpreter.ProjectConnectionId = mcpConnectionId;
ToolboxVersion toolboxVersion = projectClient.AgentAdministrationClient
.GetAgentToolboxes().CreateToolboxVersion(
toolboxName: "custom-code-interpreter-toolbox",
tools: [ProjectsAgentTool.AsProjectTool(customCodeInterpreter)],
description: "Toolbox with the custom code interpreter MCP server");
// The toolbox exposes an MCP-compatible endpoint.
var toolboxMcpUrl = new Uri(
$"{projectEndpoint}/toolboxes/{toolboxVersion.Name}" +
$"/versions/{toolboxVersion.Version}/mcp?api-version=v1");
// Create a remote-tool project connection that points at the toolbox endpoint.
// Use a user Entra token so the caller's identity is passed through
// (audience https://ai.azure.com). Create the connection once, for example
// with the Azure Developer CLI:
//
// azd ai connection create custom-code-interpreter-toolbox-conn \
// --kind remote-tool \
// --target "<toolboxMcpUrl>" \
// --auth-type user-entra-token \
// --audience https://ai.azure.com
var toolboxConnectionName = "custom-code-interpreter-toolbox-conn";
McpTool toolboxTool = ResponseTool.CreateMcpTool(
serverLabel: "toolbox",
serverUri: toolboxMcpUrl,
toolCallApprovalPolicy: new McpToolCallApprovalPolicy(
GlobalMcpToolCallApprovalPolicy.NeverRequireApproval));
toolboxTool.ProjectConnectionId = toolboxConnectionName;
DeclarativeAgentDefinition agentDefinition = new(model: "gpt-5-mini")
{
Instructions = "You are a helpful assistant that can run Python code to analyze data and solve problems.",
Tools = { toolboxTool }
};
AgentVersion agent = projectClient.AgentAdministrationClient.CreateAgentVersion(
agentName: "CustomCodeInterpreterAgent",
options: new(agentDefinition));
Console.WriteLine($"Agent created: {agent.Name} (version {agent.Version})");
// Create a response using the agent
ProjectResponsesClient responseClient = projectClient.ProjectOpenAIClient.GetProjectResponsesClientForAgent(agent.Name);
ResponseResult response = responseClient.CreateResponse(
new([ResponseItem.CreateUserMessageItem("Calculate the factorial of 10 using Python.")]));
Console.WriteLine(response.GetOutputText());
// Clean up
projectClient.AgentAdministrationClient.DeleteAgentVersion(
agentName: agent.Name,
agentVersion: agent.Version);
Console.WriteLine("Agent deleted");
Exclua a versão da caixa de ferramentas depois que o agente não fizer mais referência a ela. Consulte Excluir uma versão da caixa de ferramentas para a chamada .NET verificada.
Saída esperada
Agent created: CustomCodeInterpreterAgent (version 1)
The factorial of 10 is 3,628,800.
Agent deleted
Usar um agente hospedado
Este exemplo usa a integração do Microsoft Agent Framework AddFoundryToolboxes para conectar o agente hospedado à caixa de ferramentas.
using System;
using Azure.AI.AgentServer.Responses;
using Azure.AI.AgentServer.Responses.Models;
using Azure.AI.OpenAI;
using Azure.AI.Projects;
using Azure.AI.Extensions.OpenAI;
using Azure.Identity;
using Microsoft.Agents.AI;
using Microsoft.Agents.AI.Foundry.Hosting;
using Microsoft.Extensions.DependencyInjection;
using OpenAI.Chat;
const string AgentInstructions = "You are a helpful assistant that can run Python code to analyze data and solve problems.";
const string AgentName = "CustomCodeInterpreterAgent";
string projectEndpoint = Environment.GetEnvironmentVariable("AZURE_AI_PROJECT_ENDPOINT")
?? "https://<account>.services.ai.azure.com/api/projects/<project>";
string openAiEndpoint = Environment.GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT")
?? throw new InvalidOperationException("AZURE_OPENAI_ENDPOINT is not set.");
string deploymentName = Environment.GetEnvironmentVariable("AZURE_AI_MODEL_DEPLOYMENT_NAME") ?? "gpt-5-mini";
string mcpServerUrl = "https://your-mcp-server-url";
string mcpConnectionId = "your-mcp-connection-id";
DefaultAzureCredential credential = new();
// 1. Create the custom code interpreter MCP tool and add it to a toolbox. Using a toolbox is the
// recommended way to give agents tools. See /azure/foundry/agents/concepts/toolbox-overview
AIProjectClient projectClient = new(
endpoint: new Uri(projectEndpoint),
tokenProvider: credential);
McpTool customCodeInterpreter = ResponseTool.CreateMcpTool(
serverLabel: "custom-code-interpreter",
serverUri: new Uri(mcpServerUrl));
customCodeInterpreter.ProjectConnectionId = mcpConnectionId;
ToolboxVersion toolboxVersion = projectClient.AgentAdministrationClient
.GetAgentToolboxes().CreateToolboxVersion(
toolboxName: "custom-code-interpreter-toolbox",
tools: [ProjectsAgentTool.AsProjectTool(customCodeInterpreter)],
description: "Toolbox with the custom code interpreter MCP server");
// Create the hosted agent and register the toolbox integration.
AIAgent agent = projectClient.AsAIAgent(
model: deploymentName,
instructions: "You are a helpful assistant with access to the toolbox tools.",
name: "hosted-toolbox-agent");
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddFoundryResponses(agent);
builder.Services.AddFoundryToolboxes(credential, toolboxVersion.Name);
var app = builder.Build();
app.MapFoundryResponses();
app.Run();
Exemplo de código
O exemplo de TypeScript a seguir mostra como criar um agente com uma ferramenta MCP de interpretador de código personalizada. Para obter uma versão do JavaScript, consulte o exemplo de ferramenta MCP no repositório SDK do Azure para JavaScript no GitHub.
import { DefaultAzureCredential } from "@azure/identity";
import { AIProjectClient } from "@azure/ai-projects";
// Format: "https://resource_name.ai.azure.com/api/projects/project_name"
const PROJECT_ENDPOINT = "your_project_endpoint";
const MCP_SERVER_URL = "https://your-mcp-server-url";
export async function main(): Promise<void> {
// Create clients to call Foundry API
const project = new AIProjectClient(PROJECT_ENDPOINT, new DefaultAzureCredential());
const openai = project.getOpenAIClient();
// Add the custom code interpreter MCP server to a toolbox. Using a toolbox is
// the recommended way to give agents tools. Code runs in a sandboxed Azure
// Container Apps session, so the tool uses require_approval: "never".
// See /azure/foundry/agents/concepts/toolbox-overview
const toolbox = await project.toolboxes.createVersion(
"custom-code-interpreter-toolbox",
[
{
type: "mcp",
server_label: "custom-code-interpreter",
server_url: MCP_SERVER_URL,
require_approval: "never",
},
],
{ description: "Toolbox with the custom code interpreter MCP server" },
);
// The toolbox exposes an MCP-compatible endpoint.
const toolboxMcpUrl =
`${PROJECT_ENDPOINT}/toolboxes/${toolbox.name}` +
`/versions/${toolbox.version}/mcp?api-version=v1`;
// Create a remote-tool project connection that points at the toolbox endpoint.
// Use a user Entra token so the caller's identity is passed through
// (audience https://ai.azure.com). Create the connection once, for example
// with the Azure Developer CLI:
//
// azd ai connection create custom-code-interpreter-toolbox-conn \
// --kind remote-tool \
// --target "<toolboxMcpUrl>" \
// --auth-type user-entra-token \
// --audience https://ai.azure.com
const toolboxConnectionName = "custom-code-interpreter-toolbox-conn";
// Create an agent that uses the toolbox as an MCP tool
const agent = await project.agents.createVersion("CustomCodeInterpreterAgent", {
kind: "prompt",
model: "gpt-5-mini",
instructions:
"You are a helpful assistant that can run Python code to analyze data and solve problems.",
tools: [
{
type: "mcp",
server_label: "toolbox",
server_url: toolboxMcpUrl,
require_approval: "never",
project_connection_id: toolboxConnectionName,
},
],
});
console.log(`Agent created (name: ${agent.name}, version: ${agent.version})`);
// Send a request to the agent
const response = await openai.responses.create(
{
input: "Calculate the factorial of 10 using Python.",
},
{
body: { agent_reference: { name: agent.name, type: "agent_reference" } },
},
);
console.log(`Response: ${response.output_text}`);
// Clean up
await project.agents.deleteVersion(agent.name, agent.version);
await project.toolboxes.deleteVersion(toolbox.name, toolbox.version);
console.log("Agent deleted");
}
main().catch((err) => {
console.error("The sample encountered an error:", err);
});
Saída esperada
Agent created (name: CustomCodeInterpreterAgent, version: 1)
Response: The factorial of 10 is 3,628,800. I calculated this using Python's math.factorial() function.
Agent deleted
Dica
Recomendado: Para a maioria dos agentes, adicione ferramentas por meio de uma caixa de ferramentas e anexe a caixa de ferramentas ao agente como uma ferramenta MCP. O SDK Java ainda não expõe uma API de criação de caixa de ferramentas, portanto, crie a caixa de ferramentas usando o exemplo Python, API REST, C#ou TypeScript ou o portal do Foundry e, em seguida, referencie seu ponto de extremidade MCP do agente Java como um McpTool. O exemplo a seguir anexa o endpoint MCP do toolbox que contém o interpretador de código personalizado ao agente.
Adicione a dependência ao seu pom.xml:
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-ai-agents</artifactId>
<version>2.4.0</version>
</dependency>
Exemplo de código
import com.azure.ai.agents.AgentsClient;
import com.azure.ai.agents.AgentsClientBuilder;
import com.azure.ai.agents.ResponsesClient;
import com.azure.ai.agents.models.AgentReference;
import com.azure.ai.agents.models.AgentVersionDetails;
import com.azure.ai.agents.models.AzureCreateResponseOptions;
import com.azure.ai.agents.models.McpTool;
import com.azure.ai.agents.models.PromptAgentDefinition;
import com.azure.identity.DefaultAzureCredentialBuilder;
import com.openai.models.responses.Response;
import com.openai.models.responses.ResponseCreateParams;
import java.util.Collections;
public class CustomCodeInterpreterExample {
public static void main(String[] args) {
// Format: "https://resource_name.ai.azure.com/api/projects/project_name"
String projectEndpoint = "your_project_endpoint";
String toolboxMcpUrl = projectEndpoint + "/toolboxes/custom-code-interpreter-toolbox/versions/1/mcp?api-version=v1";
// Set to the remote-tool project connection that points at the toolbox MCP endpoint.
String toolboxConnectionId = "custom-code-interpreter-toolbox-conn";
// Create clients to call Foundry API
AgentsClientBuilder builder = new AgentsClientBuilder()
.credential(new DefaultAzureCredentialBuilder().build())
.endpoint(projectEndpoint);
AgentsClient agentsClient = builder.buildAgentsClient();
ResponsesClient responsesClient = builder.buildResponsesClient();
// Attach the toolbox MCP endpoint as an MCP tool.
// Uses require_approval: "never" because code runs in a sandboxed Container Apps session.
McpTool toolboxTool = new McpTool("toolbox")
.setServerUrl(toolboxMcpUrl)
.setProjectConnectionId(toolboxConnectionId)
.setRequireApproval("never");
PromptAgentDefinition agentDefinition = new PromptAgentDefinition("gpt-5-mini")
.setInstructions("You are a helpful assistant that can run Python code to analyze data and solve problems.")
.setTools(Collections.singletonList(toolboxTool));
AgentVersionDetails agent = agentsClient.createAgentVersion(
"CustomCodeInterpreterAgent", agentDefinition);
System.out.printf("Agent created: %s (version %s)%n", agent.getName(), agent.getVersion());
// Create a response
AgentReference agentReference = new AgentReference(agent.getName())
.setVersion(agent.getVersion());
Response response = responsesClient.createAzureResponse(
new AzureCreateResponseOptions().setAgentReference(agentReference),
ResponseCreateParams.builder()
.input("Calculate the factorial of 10 using Python."));
System.out.println("Response: " + response.output());
// Clean up
agentsClient.deleteAgentVersion(agent.getName(), agent.getVersion());
System.out.println("Agent deleted");
}
}
Saída esperada
Agent created: CustomCodeInterpreterAgent (version 1)
Response: The factorial of 10 is 3,628,800.
Agent deleted
Pré-requisitos
Defina estas variáveis de ambiente:
-
FOUNDRY_PROJECT_ENDPOINT: URL do endpoint do projeto. -
AGENT_TOKEN: um token de portador para o Foundry.
Obtenha um token de acesso:
export AGENT_TOKEN=$(az account get-access-token --scope "https://ai.azure.com/.default" --query accessToken -o tsv)
Exemplo de código
Criar uma caixa de ferramentas com o interpretador de código personalizado
Adicione o interpretador de código personalizado criando uma caixa de ferramentas. Em seguida, anexe a caixa de ferramentas ao agente como uma ferramenta MCP. Para obter mais informações, consulte o que é uma caixa de ferramentas?
curl -X POST "$FOUNDRY_PROJECT_ENDPOINT/toolboxes/custom-code-interpreter-toolbox/versions?api-version=v1" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $AGENT_TOKEN" \
-d '{
"description": "Toolbox with the custom code interpreter MCP server",
"tools": [
{
"type": "mcp",
"server_label": "custom-code-interpreter",
"server_url": "<MCP_SERVER_URL>",
"project_connection_id": "<MCP_PROJECT_CONNECTION_ID>",
"require_approval": "never"
}
]
}'
O kit de ferramentas expõe um endpoint compatível com MCP em $FOUNDRY_PROJECT_ENDPOINT/toolboxes/custom-code-interpreter-toolbox/versions/<version>/mcp?api-version=v1, em que <version> é a versão retornada pela chamada anterior.
Criar uma conexão de ferramenta remota com a caixa de ferramentas
Crie uma conexão de projeto para ferramenta remota que aponte para o endpoint da caixa de ferramentas. Use um token de usuário do Entra para que a identidade do chamador seja propagada (audience https://ai.azure.com):
azd ai connection create custom-code-interpreter-toolbox-conn \
--kind remote-tool \
--target "$FOUNDRY_PROJECT_ENDPOINT/toolboxes/custom-code-interpreter-toolbox/versions/<version>/mcp?api-version=v1" \
--auth-type user-entra-token \
--audience https://ai.azure.com
Criar um agente que use a caixa de ferramentas
curl -X POST "$FOUNDRY_PROJECT_ENDPOINT/agents?api-version=v1" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $AGENT_TOKEN" \
-d '{
"name": "CustomCodeInterpreterAgent",
"definition": {
"kind": "prompt",
"model": "<MODEL_DEPLOYMENT>",
"instructions": "You are a helpful assistant that can run Python code to analyze data and solve problems.",
"tools": [
{
"type": "mcp",
"server_label": "toolbox",
"server_url": "'$FOUNDRY_PROJECT_ENDPOINT'/toolboxes/custom-code-interpreter-toolbox/versions/<version>/mcp?api-version=v1",
"require_approval": "never",
"project_connection_id": "custom-code-interpreter-toolbox-conn"
}
]
}
}'
Criar uma resposta
curl -X POST "$FOUNDRY_PROJECT_ENDPOINT/openai/v1/responses" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $AGENT_TOKEN" \
-d '{
"agent_reference": {"type": "agent_reference", "name": "CustomCodeInterpreterAgent"},
"input": "Calculate the factorial of 10 using Python."
}'
Limpar
curl -X DELETE "$FOUNDRY_PROJECT_ENDPOINT/agents/CustomCodeInterpreterAgent?api-version=v1" \
-H "Authorization: Bearer $AGENT_TOKEN"
curl -X DELETE \
"$FOUNDRY_PROJECT_ENDPOINT/toolboxes/custom-code-interpreter-toolbox/versions/<version>?api-version=v1" \
-H "Authorization: Bearer $AGENT_TOKEN"
Saída esperada
{
"id": "resp_xxxxxxxxxxxx",
"output": [
{
"type": "message",
"role": "assistant",
"content": [
{
"type": "output_text",
"text": "The factorial of 10 is 3,628,800."
}
]
}
]
}
Verificar sua configuração
Depois de provisionar a infraestrutura e executar o exemplo:
- Confirme se a implantação do Azure foi concluída com êxito.
- Confirme se a amostra se conecta usando os valores no arquivo
.env. - No Microsoft Foundry, verifique se o seu agente está chamando a ferramenta usando o rastreamento. Para obter mais informações, consulte as melhores práticas no uso de ferramentas no Microsoft Foundry Agent Service.
Solucionando problemas
| Questão | Causa provável | Resolução |
|---|---|---|
| O registro da funcionalidade ainda está aguardando conclusão | O az feature register comando retorna Registering o estado. |
Aguarde a conclusão do registro (pode levar de 15 a 30 minutos). Verifique o status com az feature show --namespace Microsoft.App --name SessionPoolsSupportMCP. Em seguida, execute az provider register -n Microsoft.App novamente. |
| A implantação falha devido a um erro de permissão | Ausentes as atribuições de função necessárias. | Para implantação de infraestrutura, ative o Proprietário do Foundry e o Colaborador do ManagedEnvironment do Container Apps no grupo de recursos de destino por meio do Microsoft Entra PIM. Desative-os após a implantação. Para operações de agente, confirme se você tem o Usuário do Foundry no projeto Foundry. |
| Falha na implantação devido a erro de região | A região selecionada não dá suporte a Aplicativos de Contêiner do Azure Sessões Dinâmicas. | Tente uma região diferente. Consulte as regiões do Aplicativos de Contêiner do Azure para regiões com suporte. |
| O agente não chama a ferramenta | A conexão MCP não está configurada corretamente ou as instruções do agente não solicitam o uso da ferramenta. | Use o rastreamento no Microsoft Foundry para confirmar a invocação da ferramenta. Verifique se o MCP_SERVER_URL corresponde ao ponto de extremidade dos Aplicativos de Contêiner implantados. Consulte as práticas recomendadas. |
| Tempo limite de conexão do servidor MCP | O pool de sessões de Aplicativos de Contêiner não está em execução ou não possui instâncias em espera. | Verifique o status do pool de sessões no portal do Azure. Aumente standbyInstanceCount em seu modelo de Bicep, se necessário. |
| Falha na execução do código no contêiner | Pacotes de Python ausentes no contêiner personalizado. | Atualize sua imagem de contêiner para incluir pacotes necessários. Recompile e reimplante o contêiner. |
| Erro de autenticação ao se conectar ao servidor MCP | As credenciais de conexão do projeto são inválidas ou expiradas. | Regenerar as credenciais de conexão e atualizar o .env arquivo. Verifique o MCP_PROJECT_CONNECTION_ID formato. |
Limitações
As APIs não dão suporte diretamente à entrada ou saída do arquivo ou ao uso de repositórios de arquivos. Para transferir dados para dentro e para fora, você deve usar URLs, como URLs de dados para arquivos pequenos e URLs SAS (assinatura de acesso compartilhado) do Serviço Blob do Azure para arquivos grandes.
Segurança
Trate o código gerado e suas dependências como não confiáveis. Use uma imagem base aprovada e uma lista de pacotes permitidos, execute com o mínimo de recursos computacionais e permissões necessários e restrinja o acesso de rede de saída aos destinos necessários. Não monte dados confidenciais ou credenciais de produção na sessão.
Se você usar URLs SAS para passar dados dentro ou fora do runtime:
- Use tokens SAS de curta duração.
- Não registre URLs SAS nem armazene-as no controle de versão.
- Limite as permissões ao mínimo necessário (por exemplo, apenas leitura ou apenas gravação).
Limpar
Para interromper a cobrança de recursos provisionados, exclua os recursos criados pela implantação de exemplo. Se você usou um grupo de recursos dedicado para este artigo, exclua o grupo de recursos.