Ferramenta personalizada de interpretação de código para agentes (pré-visualização)

Importante

Os itens marcados (pré-visualização) neste artigo encontram-se atualmente em pré-visualização pública. Esta pré-visualização é fornecida sem um acordo de nível de serviço, e não a recomendamos para cargas de trabalho em produção. Certas funcionalidades podem não ser suportadas ou podem ter capacidades limitadas. Para mais informações, consulte Termos de Utilização Suplementares para Microsoft Azure Pré-visualizações.

Um interpretador de código personalizado dá-lhe controlo total sobre o ambiente de execução para código Python gerado por agentes. Podes configurar pacotes de Python personalizados, recursos de computação e definições de ambiente Azure Container Apps. O contentor do interpretador de código expõe um servidor Model Context Protocol (MCP).

Use um interpretador de código personalizado quando a ferramenta incorporada Code Interpreter para agentes não cumprir os seus requisitos — por exemplo, quando precisa de pacotes de Python específicos, imagens personalizadas de contentores ou recursos de computação dedicados.

Para mais informações sobre o MCP e como os agentes se conectam às ferramentas MCP, consulte Connect to Model Context Protocol servers (pré-visualização).

Suporte de utilização

Este artigo utiliza a CLI do Azure e um projeto de exemplo executável.

A tabela seguinte mostra o suporte para SDK e configuração.

Suporte ao Microsoft Foundry Python SDK C# SDK JavaScript SDK Java SDK API REST Configuração básica do agente Configuração padrão do agente
✔️ ✔️ ✔️ ✔️ ✔️ ✔️ - ✔️

Para o suporte mais recente a SDK e API para ferramentas de agentes, consulte Melhores práticas para usar ferramentas no Microsoft Foundry Agent Service.

Suporte a SDK

O interpretador de código personalizado utiliza o tipo de ferramenta MCP. Qualquer SDK que suporte ferramentas MCP pode criar um agente interpretador de código personalizado. O SDK .NET está atualmente em fase de pré-visualização. Para os passos de provisionamento de infraestrutura (CLI do Azure, Bicep), veja Criar um agente com interpretador de código personalizado.

Pré-requisitos

Antes de começares

Este procedimento prevê infraestrutura Azure, incluindo recursos Azure Container Apps. Revise os requisitos de custo e governação do Azure da sua organização antes de implementar.

Crie um agente com um interpretador de código personalizado

Os passos seguintes mostram como provisionar a infraestrutura e criar um agente que utilize um servidor MCP interpretador de código personalizado. A configuração da infraestrutura aplica-se a todas as línguas. Seguem-se exemplos de código específicos da linguagem.

Registe-se na funcionalidade de pré-visualização

Registe a funcionalidade do servidor MCP para Azure Container Apps Dynamic Sessions:

az feature register --namespace Microsoft.App --name SessionPoolsSupportMCP
az provider register -n Microsoft.App

Obtenha o código de exemplo

Clone o código de exemplo exemplo no repositório GitHub e navegue até à pasta samples/python/prompt-agents/code-interpreter-custom no seu terminal.

Fornecer a infraestrutura

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 implementação pode demorar até uma hora, dependendo do número de instâncias em espera que solicitar. A alocação dinâmica do pool de sessões é o passo mais longo.

Configure e execute o agente

Copie o .env.sample ficheiro do repositório para .env e insira os valores da saída da sua implantação. Pode encontrar esses valores no portal do Azure, sob o grupo de recursos.

Instala as dependências Python usando uv sync ou pip install. Finalmente, executa ./main.py.

Exemplo de código

O seguinte exemplo de Python mostra como criar um agente com uma ferramenta MCP personalizada para interpretar código:

from azure.identity import DefaultAzureCredential
from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import PromptAgentDefinition, MCPTool

# 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()

# Configure the custom code interpreter MCP tool
custom_code_interpreter = MCPTool(
    server_label="custom-code-interpreter",
    server_url=MCP_SERVER_URL,
    project_connection_id=MCP_CONNECTION_ID,
)

# Create an agent with the custom code interpreter
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=[custom_code_interpreter],
    ),
    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)
print("Agent deleted")

Produção esperada

Quando executa a amostra, vê 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

Exemplo de código

O exemplo seguinte de C# mostra como criar um agente com uma ferramenta MCP personalizada para interpretar código. Para mais informações sobre como trabalhar com ferramentas MCP em .NET, consulte o exemplo de ferramenta MCP na SDK do Azure para .NET repositório sobre GitHub.

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());

// Create agent with custom code interpreter MCP tool
// Code runs in a sandboxed Azure Container Apps session
McpTool tool = ResponseTool.CreateMcpTool(
    serverLabel: "custom-code-interpreter",
    serverUri: new Uri(mcpServerUrl));
tool.ProjectConnectionId = mcpConnectionId;

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 = { tool }
};

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");

Produção esperada

Agent created: CustomCodeInterpreterAgent (version 1)
The factorial of 10 is 3,628,800.
Agent deleted

Exemplo de código

O exemplo seguinte de TypeScript mostra como criar um agente com uma ferramenta MCP de interpretação de código personalizada. Para uma versão em JavaScript, consulte o exemplo da ferramenta MCP no repositório SDK do Azure de JavaScript sobre 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();

  // Create agent with custom code interpreter MCP tool
  // The custom code interpreter uses require_approval: "never" because code
  // runs in a sandboxed Azure Container Apps session
  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: "custom-code-interpreter",
        server_url: MCP_SERVER_URL,
        require_approval: "never",
      },
    ],
  });
  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: { name: agent.name, type: "agent_reference" } },
    },
  );
  console.log(`Response: ${response.output_text}`);

  // Clean up
  await project.agents.deleteVersion(agent.name, agent.version);
  console.log("Agent deleted");
}

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

Produção 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

Adicione a dependência ao seu pom.xml:

<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-ai-agents</artifactId>
    <version>2.0.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 mcpServerUrl = "https://your-mcp-server-url";
        // Optional: set to your project connection ID if your MCP server requires authentication
        String mcpConnectionId = "your-mcp-connection-id";

        // Create clients to call Foundry API
        AgentsClientBuilder builder = new AgentsClientBuilder()
            .credential(new DefaultAzureCredentialBuilder().build())
            .endpoint(projectEndpoint);

        AgentsClient agentsClient = builder.buildAgentsClient();
        ResponsesClient responsesClient = builder.buildResponsesClient();

        // Create custom code interpreter MCP tool
        // Uses require_approval: "never" because code runs in a sandboxed Container Apps session
        McpTool customCodeInterpreter = new McpTool("custom-code-interpreter")
            .setServerUrl(mcpServerUrl)
            .setProjectConnectionId(mcpConnectionId)
            .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(customCodeInterpreter));

        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");
    }
}

Produção 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 seu projeto.
  • AGENT_TOKEN: Um token de autenticação para a 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

1. Criar um agente com interpretador de código personalizado

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": "custom-code-interpreter",
          "server_url": "<MCP_SERVER_URL>",
          "project_connection_id": "<MCP_PROJECT_CONNECTION_ID>",
          "require_approval": "never"
        }
      ]
    }
  }'

2. 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."
  }'

3. Limpeza

curl -X DELETE "$FOUNDRY_PROJECT_ENDPOINT/agents/CustomCodeInterpreterAgent?api-version=v1" \
  -H "Authorization: Bearer $AGENT_TOKEN"

Produção esperada

{
  "id": "resp_xxxxxxxxxxxx",
  "output": [
    {
      "type": "message",
      "role": "assistant",
      "content": [
        {
          "type": "output_text",
          "text": "The factorial of 10 is 3,628,800."
        }
      ]
    }
  ]
}

Verifica a tua configuração

Depois de provisionar a infraestrutura e executar a amostra:

  1. Confirme que a implementação do Azure foi concluída com sucesso.
  2. Confirme que a amostra está conectada usando os valores no seu .env ficheiro.
  3. No Microsoft Foundry, verifica se o teu agente chama a ferramenta usando rastreamento. Para mais informações, consulte Boas práticas para usar ferramentas no Microsoft Foundry Agent Service.

Resolução de problemas

Problema Causa provável Resolução
O registo de funcionalidades ainda está pendente O comando az feature register devolve o estado Registering. Espere que o registo termine (pode demorar 15-30 minutos). Verifique o estado com az feature show --namespace Microsoft.App --name SessionPoolsSupportMCP. Depois executa novamente az provider register -n Microsoft.App.
A implementação falha com erro de permissão Faltam atribuições obrigatórias de funções. Confirme que tem as funções de Proprietário do Azure AI e Colaborador do Ambiente Gerido do Container Apps na subscrição ou grupo de recursos.
Falha na implementação devido a erro de região A região selecionada não suporta Azure Container Apps Dynamic Sessions. Experimenta uma região diferente. Veja Azure Container Apps regiones para regiões suportadas.
O agente não chama a ferramenta A ligação MCP não está configurada corretamente, ou as instruções do agente não indicam a utilização da ferramenta. Use o traçado no Microsoft Foundry para confirmar a invocação de ferramentas. Verifica se o MCP_SERVER_URL corresponde ao endpoint do teu Container Apps implementado. Consulte Melhores práticas.
Limite de tempo de conexão ao servidor MCP O pool de sessões de Container Apps não está em execução ou não tem instâncias em espera. Verifique o estado do pool de sessões no portal do Azure. Aumente standbyInstanceCount no seu template Bicep, se necessário.
Execução de código falha no contentor Faltam pacotes Python no contentor personalizado. Atualize a imagem do seu contentor para incluir os pacotes necessários. Reconstrói e redistribui o contentor.
Erro de autenticação ao ligar ao servidor MCP As credenciais de ligação ao projeto são inválidas ou expiradas. Regenera as credenciais de ligação e atualiza o .env ficheiro. Verifica o MCP_PROJECT_CONNECTION_ID formato.

Limitações

As APIs não suportam diretamente entrada ou saída de ficheiros, nem o uso de armazenamentos de ficheiros. Para receber e retirar dados, deve usar URLs, como URLs de dados para ficheiros pequenos e URLs de assinatura de acesso partilhado (SAS) do Azure Blob Service para ficheiros grandes.

Segurança

Se usar URLs SAS para passar dados para dentro ou fora do tempo de execução:

  • Use tokens de SAS de curta duração.
  • Não registes URLs SAS nem as armazene no controlo do código-fonte.
  • Defina as permissões de escopo para o mínimo necessário (por exemplo, apenas leitura ou apenas escrita).

Limpar

Para evitar a faturação pelos recursos provisionados, elimine os recursos criados pela implementação do exemplo. Se usou um grupo de recursos dedicado para este artigo, elimine o grupo de recursos.