Narzędzie interpretera kodu dla agentów Microsoft Foundry

Interpreter kodu umożliwia agentowi Microsoft Foundry uruchamianie kodu Python w środowisku wykonywania w trybie piaskownicy. Model Foundry agenta zapisuje i wykonuje kod do analizy danych, generowania wykresów oraz zadań iteracyjnego rozwiązywania problemów.

Wskazówka

Rozważ dodanie tego narzędzia za pomocą przybornika. Korzystając z zestawu narzędzi, można ponownie wykorzystywać narzędzie w różnych agentach i środowiskach uruchomieniowych, a także scentralizować zarządzanie poświadczeniami, wersjonowanie i egzekwowanie zasad za pośrednictwem zarządzanego punktu końcowego MCP. Zobacz krótki przewodnik po przyborniku.

W tym artykule utworzysz agenta, który używa interpretera kodu, przekazuje plik CSV do analizy i pobiera wygenerowany wykres.

Po włączeniu interpretera kodu agent może pisać i uruchamiać Python iteracyjnie kodu w celu rozwiązywania zadań analizy danych i zadań matematycznych oraz generowania wykresów.

Ważne

Interpreter kodu ma dodatkowe opłaty poza opłatami opartymi na tokenach za użycie Azure OpenAI. Jeśli agent wywołuje interpreter kodu jednocześnie w dwóch różnych konwersacjach, tworzy dwie sesje interpretera kodu. Każda sesja jest domyślnie aktywna przez jedną godzinę z limitem czasu bezczynności 30 minut.

Wymagania wstępne

  • Podstawowe lub standardowe środowisko agenta. Aby uzyskać szczegółowe informacje, zobacz Konfigurowanie środowiska agenta .
  • Najnowszy pakiet SDK zainstalowany dla Twojego języka. Zestaw SDK .NET jest obecnie w wersji zapoznawczej. Zobacz przewodnik Szybki start , aby uzyskać instrukcje instalacji.
  • Wdrożenie modelu AI Azure skonfigurowane w projekcie.

Uwaga

Interpreter kodu nie jest dostępny we wszystkich regionach. Zobacz Sprawdzanie dostępności regionów i modeli.

Wsparcie użytkowania

W poniższej tabeli przedstawiono zestaw SDK i obsługę konfiguracji.

Obsługa Microsoft Foundry zestaw SDK Python Zestaw SDK języka C# Zestaw SDK dla języka JavaScript zestaw SDK Java interfejs API REST Konfiguracja agenta podstawowego Konfiguracja agenta standardowego
✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️

Tworzenie agenta za pomocą interpretera kodu

W poniższych przykładach pokazano, jak utworzyć agenta z włączonym interpreterem kodu, przekazać plik do analizy i pobrać wygenerowane dane wyjściowe. Każdy przykład przesyłania plików generuje niewielki plik CSV w bieżącym katalogu roboczym, przesyła go, a następnie usuwa lokalny plik tymczasowy.

Wskazówka

Możesz dostosować zachowanie interpretera kodu w czasie wykonywania, na przykład określając, które pliki uwzględnić lub dostosowując parametry narzędzi na żądanie, przy użyciu ustrukturyzowanych danych wejściowych.

Przykład użycia agenta z narzędziem interpretera kodu w zestawie SDK Python

Poniższy przykład Python pokazuje, jak dodać narzędzie interpretera kodu do przybornika, dołączyć przybornik do agenta, przekazać plik CSV do analizy i zażądać wykresu słupkowego na podstawie danych. Wybierz Prompt Agents, aby użyć zestawu SDK Azure AI Projects do utworzenia agenta promptów po stronie serwera, lub Hosted Agents, aby użyć struktury Agent Framework FoundryChatClient do zbudowania efemerycznego agenta działającego w procesie.

Pobudzaj agentów

W tym przykładzie przedstawiono kompletny przepływ pracy: przekazywanie pliku, tworzenie agenta z włączonym interpreterem kodu, żądanie wizualizacji danych i pobieranie wygenerowanego wykresu.

import os
from azure.identity import DefaultAzureCredential
from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import PromptAgentDefinition, CodeInterpreterTool, AutoCodeInterpreterToolParam

CSV_DATA = """name,sector,operating_profit
SkyBridge Logistics,TRANSPORTATION,185.2
Velocity Rail Freight,TRANSPORTATION,310.2
AeroJet Airlines,TRANSPORTATION,510.6
"""
csv_path = os.path.abspath("synthetic-company-financial-results.csv")
with open(csv_path, "w", encoding="utf-8", newline="") as csv_file:
    csv_file.write(CSV_DATA)

# Format: "https://resource_name.ai.azure.com/api/projects/project_name"
PROJECT_ENDPOINT = "your_project_endpoint"

# Create clients to call Foundry API
project = AIProjectClient(
    endpoint=PROJECT_ENDPOINT,
    credential=DefaultAzureCredential(),
)
openai = project.get_openai_client()

# Upload the generated CSV file for the code interpreter to use
with open(csv_path, "rb") as csv_file:
    file = openai.files.create(purpose="assistants", file=csv_file)
os.remove(csv_path)

# Create agent with code interpreter tool
agent = project.agents.create_version(
    agent_name="MyAgent",
    definition=PromptAgentDefinition(
        model="gpt-5-mini",
        instructions="You are a helpful assistant.",
        tools=[CodeInterpreterTool(container=AutoCodeInterpreterToolParam(file_ids=[file.id]))],
    ),
    description="Code interpreter agent for data analysis and visualization.",
)

# Create a conversation for the agent interaction
conversation = openai.conversations.create()

# Send request to create a chart and generate a file
response = openai.responses.create(
    conversation=conversation.id,
    input="Could you please create bar chart in TRANSPORTATION sector for the operating profit from the uploaded csv file and provide file to me?",
    extra_body={"agent_reference": {"name": agent.name, "type": "agent_reference"}},
)

# Extract file information from response annotations
file_id = ""
filename = ""
container_id = ""

# Get the last message which should contain file citations
last_message = response.output[-1]  # ResponseOutputMessage
if (
    last_message.type == "message"
    and last_message.content
    and last_message.content[-1].type == "output_text"
    and last_message.content[-1].annotations
):
    file_citation = last_message.content[-1].annotations[-1]  # AnnotationContainerFileCitation
    if file_citation.type == "container_file_citation":
        file_id = file_citation.file_id
        filename = file_citation.filename
        container_id = file_citation.container_id
        print(f"Found generated file: {filename} (ID: {file_id})")

# Clean up resources
project.agents.delete_version(agent_name=agent.name, agent_version=agent.version)

# Download the generated file if available
if file_id and filename:
    file_content = openai.containers.files.content.retrieve(file_id=file_id, container_id=container_id)
    print(f"File ready for download: {filename}")
    file_path = os.path.join(os.path.dirname(__file__), filename)
    with open(file_path, "wb") as f:
        f.write(file_content.read())
    print(f"File downloaded successfully: {file_path}")
else:
    print("No file generated in response")

Oczekiwane dane wyjściowe

Przykładowy kod generuje dane wyjściowe podobne do następującego przykładu:

Found generated file: transportation_operating_profit_bar_chart.png (ID: file-xxxxxxxxxxxxxxxxxxxx)
File ready for download: transportation_operating_profit_bar_chart.png
File downloaded successfully: transportation_operating_profit_bar_chart.png

Agent przekazuje plik CSV do magazynu Azure, tworzy środowisko Python w trybie piaskownicy, filtruje firmy sektora transportu, generuje wykres słupkowy PNG przedstawiający zysk operacyjny firmy i pobiera wykres do katalogu lokalnego. Adnotacje pliku w odpowiedzi zawierają identyfikator pliku i informacje o kontenerze potrzebne do pobrania wygenerowanego wykresu.

Hostowani agenci

Ten przykład tworzy zestaw narzędzi interpretera kodu, a następnie używa FoundryChatClient z Microsoft Agent Framework i łączy się z punktem końcowym MCP tego zestawu narzędzi za pomocą FoundryToolbox. Ustaw zmienne środowiskowe FOUNDRY_PROJECT_ENDPOINT i FOUNDRY_MODEL oraz zaloguj się za pomocą az login.

import asyncio
import os

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 CodeInterpreterToolboxTool, AutoCodeInterpreterToolParam

PROJECT_ENDPOINT = "https://<account>.services.ai.azure.com/api/projects/<project>"
CSV_DATA = """name,sector,operating_profit
SkyBridge Logistics,TRANSPORTATION,185.2
Velocity Rail Freight,TRANSPORTATION,310.2
AeroJet Airlines,TRANSPORTATION,510.6
"""


async def main() -> None:
    credential = AzureCliCredential()

    csv_path = os.path.abspath("synthetic-company-financial-results.csv")
    with open(csv_path, "w", encoding="utf-8", newline="") as csv_file:
        csv_file.write(CSV_DATA)

    # 1. Add the code interpreter tool 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
    project = AIProjectClient(endpoint=PROJECT_ENDPOINT, credential=credential)
    openai = project.get_openai_client()
    with open(csv_path, "rb") as csv_file:
        file = openai.files.create(purpose="assistants", file=csv_file)
    os.remove(csv_path)
    toolbox = project.toolboxes.create_version(
        name="code-interpreter-toolbox",
        description="Toolbox with the code interpreter tool",
        tools=[CodeInterpreterToolboxTool(container=AutoCodeInterpreterToolParam(file_ids=[file.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 write and execute Python code to solve problems.",
        tools=[toolbox_tool],
    )

    result = await agent.run("Use code to calculate the factorial of 100.")
    print(f"Agent: {result.text}")


if __name__ == "__main__":
    asyncio.run(main())

Oczekiwane dane wyjściowe

Agent generuje kod w języku Python, uruchamia go w odizolowanym kontenerze i zwraca odpowiedź:

Agent: 100! = 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000

Pełny przykład (w tym dane wejściowe pliku i wyodrębnianie wygenerowanego kodu) można znaleźć w foundry_chat_client_with_code_interpreter.py i foundry_chat_client_code_interpreter_files.py.


Tworzenie wykresu za pomocą interpretera kodu w języku C#

Poniższy przykład w języku C# pokazuje, jak dodać narzędzie Interpreter kodu do przybornika, dołączyć przybornik do agenta, przekazać plik CSV do analizy i pobrać wygenerowany wykres. Wybierz Prompt Agents, aby za pomocą zestawu SDK Azure AI Projects utworzyć po stronie serwera agenta opartego na monicie, lub Hosted Agents, aby za pomocą Microsoft Agent Framework utworzyć tymczasowego agenta działającego w procesie.

Pobudzaj agentów

Aby zapoznać się z użyciem asynchronicznym, zobacz próbkę kodu przykład kodu w repozytorium Azure SDK dla .NET na GitHubie.

using System;
using System.IO;
using Azure.AI.Projects;
using Azure.AI.Extensions.OpenAI;
using Azure.Identity;
using OpenAI.Files;

const string CsvData = """
name,sector,operating_profit
SkyBridge Logistics,TRANSPORTATION,185.2
Velocity Rail Freight,TRANSPORTATION,310.2
AeroJet Airlines,TRANSPORTATION,510.6
""";
string csvPath = Path.GetFullPath("synthetic-company-financial-results.csv");
File.WriteAllText(csvPath, CsvData);

// Format: "https://resource_name.ai.azure.com/api/projects/project_name"
var projectEndpoint = "your_project_endpoint";

// Create project client to call Foundry API
AIProjectClient projectClient = new(
    endpoint: new Uri(projectEndpoint),
    tokenProvider: new DefaultAzureCredential());

// Upload a CSV file for Code Interpreter to analyze
OpenAIFileClient fileClient = projectClient.ProjectOpenAIClient.GetOpenAIFileClient();
OpenAIFile uploadedFile = fileClient.UploadFile(
  filePath: csvPath,
    purpose: FileUploadPurpose.Assistants);
File.Delete(csvPath);
Console.WriteLine($"Uploaded file: {uploadedFile.Id}");

// Create an agent with Code Interpreter enabled
DeclarativeAgentDefinition agentDefinition = new(model: "gpt-5-mini")
{
    Instructions = "You are a helpful assistant.",
    Tools = {
        ResponseTool.CreateCodeInterpreterTool(
            new CodeInterpreterToolContainer(
                CodeInterpreterToolContainerConfiguration.CreateAutomaticContainerConfiguration(
                    fileIds: [uploadedFile.Id]
                )
            )
        ),
    }
};
ProjectsAgentVersion agentVersion = projectClient.AgentAdministrationClient.CreateAgentVersion(
    agentName: "myChartAgent",
    options: new(agentDefinition));

// Request chart generation from the uploaded CSV data
AgentReference agentReference = new(name: agentVersion.Name, version: agentVersion.Version);
ProjectResponsesClient responseClient = projectClient.ProjectOpenAIClient.GetProjectResponsesClientForAgent(agentReference);

ResponseResult response = responseClient.CreateResponse(
    "Could you please create bar chart in TRANSPORTATION sector for the operating profit " +
    "from the uploaded csv file and provide file to me?");

Console.WriteLine(response.GetOutputText());

// Extract file information from response annotations
ContainerFileCitationMessageAnnotation containerAnnotation = null;
foreach (ResponseItem item in response.OutputItems)
{
    if (item is MessageResponseItem messageItem)
    {
        foreach (ResponseContentPart content in messageItem.Content)
        {
            foreach (ResponseMessageAnnotation annotation in content.OutputTextAnnotations)
            {
                if (annotation is ContainerFileCitationMessageAnnotation cntrAnnotation)
                {
                    containerAnnotation = cntrAnnotation;
                }
            }
        }
    }
}

// Download the generated chart if available
if (containerAnnotation is not null)
{
    ContainerClient containerClient = projectClient.ProjectOpenAIClient.GetContainerClient();
    BinaryData fileData = containerClient.DownloadContainerFile(
        containerId: containerAnnotation.ContainerId,
        fileId: containerAnnotation.FileId);
    File.WriteAllBytes("chart.png", fileData.ToArray());
    Console.WriteLine($"Chart downloaded: {Path.GetFullPath("chart.png")}");
}
else
{
    Console.WriteLine("No file generated in response");
}

// Clean up resources
projectClient.AgentAdministrationClient.DeleteAgentVersion(
    agentName: agentVersion.Name, agentVersion: agentVersion.Version);

Oczekiwane dane wyjściowe

Przykładowy kod generuje dane wyjściowe podobne do następującego przykładu:

Uploaded file: file-xxxxxxxxxxxxxxxxxxxx
Here is the bar chart showing operating profit by company in the TRANSPORTATION sector...
Chart downloaded: C:\Users\you\chart.png

Agent przesyła plik CSV do magazynu Azure, tworzy izolowane środowisko Pythona, analizuje dane w celu filtrowania rekordów sektora transportowego i generuje wykres słupkowy PNG. Analizowanie adnotacji wyodrębnia identyfikator kontenera i identyfikator pliku z odpowiedzi, które są używane do pobierania wykresu do katalogu lokalnego.

Hostowani agenci

Ten przykład tworzy zestaw narzędzi interpretera kodu, a następnie używa integracji z platformą Microsoft Agent Framework AddFoundryToolboxes, aby udostępnić Interpreter kodu hostowanemu agentowi. Ustaw zmienne środowiskowe AZURE_AI_PROJECT_ENDPOINT, AZURE_OPENAI_ENDPOINT i AZURE_AI_MODEL_DEPLOYMENT_NAME, a następnie zaloguj się za pomocą az login.

using System;
using System.IO;
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.Extensions.AI;
using Microsoft.Agents.AI;
using Microsoft.Agents.AI.Foundry.Hosting;
using Microsoft.Extensions.DependencyInjection;
using OpenAI.Chat;
using OpenAI.Files;

const string CsvData = """
name,sector,operating_profit
SkyBridge Logistics,TRANSPORTATION,185.2
Velocity Rail Freight,TRANSPORTATION,310.2
AeroJet Airlines,TRANSPORTATION,510.6
""";
const string AgentInstructions = "You are a personal math tutor. When asked a math question, write and run code using the python tool to answer the question.";
const string AgentName = "CoderAgent";

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

DefaultAzureCredential credential = new();

// 1. Add the code interpreter tool 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);
OpenAIFileClient fileClient = projectClient.ProjectOpenAIClient.GetOpenAIFileClient();
string csvPath = Path.GetFullPath("synthetic-company-financial-results.csv");
File.WriteAllText(csvPath, CsvData);
OpenAIFile uploadedFile = fileClient.UploadFile(
  filePath: csvPath,
    purpose: FileUploadPurpose.Assistants);
File.Delete(csvPath);

ProjectsAgentTool codeInterpreterTool = ProjectsAgentTool.AsProjectTool(
    ResponseTool.CreateCodeInterpreterTool(
        new CodeInterpreterToolContainer(
            CodeInterpreterToolContainerConfiguration.CreateAutomaticContainerConfiguration(
                fileIds: [uploadedFile.Id]
            )
        )
    ));

ToolboxVersion toolboxVersion = projectClient.AgentAdministrationClient
    .GetAgentToolboxes().CreateToolboxVersion(
        toolboxName: "code-interpreter-toolbox",
        tools: [codeInterpreterTool],
        description: "Toolbox with the code interpreter tool");

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

Oczekiwane dane wyjściowe

Agent hostowany używa punktu końcowego MCP zestawu narzędzi do uruchamiania języka Python w środowisku izolowanym i zwrócenia odpowiedzi końcowej:

Response: One solution is x ≈ 6.36, since sin(x) + x^2 is approximately 42 at that value.

Informacje o utrzymywanej integracji platformy .NET Agent Framework znajdziesz w artykule Korzystanie z przybornika z hostowanym agentem.


Przykład użycia agenta z narzędziem interpretera kodu w zestawie SDK języka TypeScript

Poniższy przykład języka TypeScript pokazuje, jak dodać narzędzie interpretera kodu do przybornika, dołączyć przybornik do agenta, przekazać plik CSV do analizy i zażądać wykresu słupkowego na podstawie danych. Aby zapoznać się z wersją języka JavaScript, zobacz przykład JavaScript w repozytorium Azure SDK dla języka JavaScript w witrynie GitHub.

import { DefaultAzureCredential } from "@azure/identity";
import { AIProjectClient } from "@azure/ai-projects";
import * as fs from "fs";
import * as path from "path";

// Format: "https://resource_name.ai.azure.com/api/projects/project_name"
const PROJECT_ENDPOINT = "your_project_endpoint";
const CSV_DATA = `name,sector,operating_profit
SkyBridge Logistics,TRANSPORTATION,185.2
Velocity Rail Freight,TRANSPORTATION,310.2
AeroJet Airlines,TRANSPORTATION,510.6
`;

export async function main(): Promise<void> {
  // Create clients to call Foundry API
  const project = new AIProjectClient(PROJECT_ENDPOINT, new DefaultAzureCredential());
  const openai = project.getOpenAIClient();

  // Generate and upload the CSV file
  const csvPath = "synthetic-company-financial-results.csv";
  fs.writeFileSync(csvPath, CSV_DATA);
  const fileStream = fs.createReadStream(csvPath);

  // Upload CSV file
  const uploadedFile = await openai.files.create({
    file: fileStream,
    purpose: "assistants",
  });
  fs.unlinkSync(csvPath);

  console.log("Creating a toolbox with the code interpreter tool...");

  // 1. Add the code interpreter tool to a toolbox. Using a toolbox is the recommended
  //    way to give agents tools. See /azure/foundry/agents/concepts/toolbox-overview
  const toolbox = await project.toolboxes.createVersion(
    "code-interpreter-toolbox",
    [
      {
        type: "code_interpreter",
        container: {
          type: "auto",
          file_ids: [uploadedFile.id],
        },
      },
    ],
    { description: "Toolbox with the code interpreter tool" },
  );

  // 2. The toolbox exposes an MCP-compatible endpoint.
  const toolboxMcpUrl =
    `${PROJECT_ENDPOINT}/toolboxes/${toolbox.name}` +
    `/versions/${toolbox.version}/mcp?api-version=v1`;

  // 3. 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 code-interpreter-toolbox-conn \
  //      --kind remote-tool \
  //      --target "<toolboxMcpUrl>" \
  //      --auth-type user-entra-token \
  //      --audience https://ai.azure.com
  const toolboxConnectionName = "code-interpreter-toolbox-conn";

  // 4. Attach the toolbox to a prompt agent as an MCP tool.
  const agent = await project.agents.createVersion("MyAgent", {
    kind: "prompt",
    model: "gpt-5-mini",
    instructions: "You are a helpful assistant.",
    tools: [
      {
        type: "mcp",
        server_label: "toolbox",
        server_url: toolboxMcpUrl,
        require_approval: "never",
        project_connection_id: toolboxConnectionName,
      },
    ],
  });

  // Create a conversation
  const conversation = await openai.conversations.create();

  // Request chart generation
  const response = await openai.responses.create(
    {
      conversation: conversation.id,
      input:
        "Could you please create bar chart in TRANSPORTATION sector for the operating profit from the uploaded csv file and provide file to me?",
    },
    {
      body: { agent_reference: { name: agent.name, type: "agent_reference" } },
    },
  );

  // Extract file information from response annotations
  let fileId = "";
  let filename = "";
  let containerId = "";

  // Get the last message which should contain file citations
  const lastMessage = response.output?.[response.output.length - 1];
  if (lastMessage && lastMessage.type === "message") {
    // Get the last content item
    const textContent = lastMessage.content?.[lastMessage.content.length - 1];
    if (textContent && textContent.type === "output_text" && textContent.annotations) {
      // Get the last annotation (most recent file)
      const fileCitation = textContent.annotations[textContent.annotations.length - 1];
      if (fileCitation && fileCitation.type === "container_file_citation") {
        fileId = fileCitation.file_id;
        filename = fileCitation.filename;
        containerId = fileCitation.container_id;
        console.log(`Found generated file: ${filename} (ID: ${fileId})`);
      }
    }
  }

  // Download the generated file if available
  if (fileId && filename) {
    const safeFilename = path.basename(filename);
    const fileContent = await openai.containers.files.content.retrieve(
      fileId,
      { container_id: containerId },
    );
    const buffer = Buffer.from(await fileContent.arrayBuffer());

    fs.writeFileSync(safeFilename, buffer);
    console.log(`File ${safeFilename} downloaded successfully.`);
    console.log(`File ready for download: ${safeFilename}`);
  } else {
    console.log("No file generated in response");
  }

  // Clean up resources
  await project.agents.deleteVersion(agent.name, agent.version);
}

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

Oczekiwane dane wyjściowe

Przykładowy kod generuje dane wyjściowe podobne do następującego przykładu:

Found generated file: transportation_operating_profit_bar_chart.png (ID: file-xxxxxxxxxxxxxxxxxxxx)
File transportation_operating_profit_bar_chart.png downloaded successfully.
File ready for download: transportation_operating_profit_bar_chart.png

Agent przekazuje plik CSV do magazynu Azure, tworzy środowisko Python w trybie piaskownicy, filtruje firmy sektora transportu, generuje wykres słupkowy PNG przedstawiający zysk operacyjny firmy i pobiera wykres do katalogu lokalnego. Adnotacje pliku w odpowiedzi zawierają identyfikator pliku i informacje o kontenerze potrzebne do pobrania wygenerowanego wykresu.

Tworzenie wykresu za pomocą interpretera kodu w Java

W przypadku większości agentów dodaj narzędzie interpretera kodu za pomocą zestawu narzędzi i dołącz ten zestaw narzędzi do agenta jako narzędzie MCP. Zestaw SDK Java nie uwidacznia jeszcze interfejsu API tworzenia przybornika, dlatego utwórz przybornik przy użyciu jednej z aktualnie obsługiwanych metod (Python, interfejsu API REST, języka C#, języka TypeScript lub portalu Foundry). Po utworzeniu zestawu narzędzi odwołaj się do jego punktu końcowego MCP z poziomu agenta Java jako McpTool. Poniższy przykład podłącza do agenta punkt końcowy MCP zestawu narzędzi interpretera kodu.

Dodaj zależność do elementu pom.xml:

<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-ai-agents</artifactId>
    <version>2.2.0</version>
</dependency>

Tworzenie agenta i generowanie wykresu

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 CodeInterpreterChartExample {
    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/code-interpreter-toolbox/versions/1/mcp?api-version=v1";
        String toolboxConnectionName = "code-interpreter-toolbox-conn";

        AgentsClientBuilder builder = new AgentsClientBuilder()
            .credential(new DefaultAzureCredentialBuilder().build())
            .endpoint(projectEndpoint);

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

        // The Java SDK doesn't yet expose a toolbox creation API. Create the
        // code-interpreter toolbox with Python, REST, C#, TypeScript, or the
        // Foundry portal, then attach its MCP endpoint as an MCP tool.
        McpTool toolboxTool = new McpTool("toolbox")
            .setServerUrl(toolboxMcpUrl)
            .setProjectConnectionId(toolboxConnectionName)
            .setRequireApproval("never");

        // Create agent with the code-interpreter toolbox MCP tool
        PromptAgentDefinition agentDefinition = new PromptAgentDefinition("gpt-5-mini")
            .setInstructions("You are a data visualization assistant. When asked to create charts, "
                + "write and run Python code using matplotlib to generate them.")
            .setTools(Collections.singletonList(toolboxTool));

        AgentVersionDetails agent = agentsClient.createAgentVersion("chart-agent", agentDefinition);

        // Request a bar chart with inline data
        AgentReference agentReference = new AgentReference(agent.getName())
            .setVersion(agent.getVersion());

        Response response = responsesClient.createAzureResponse(
            new AzureCreateResponseOptions().setAgentReference(agentReference),
            ResponseCreateParams.builder()
                .input("Create a bar chart showing quarterly revenue for 2025: "
                    + "Q1=$2.1M, Q2=$2.8M, Q3=$3.2M, Q4=$2.9M. "
                    + "Use a blue color scheme, add data labels on each bar, "
                    + "and title the chart 'Quarterly Revenue 2025'. "
                    + "Save the chart as a PNG file."));

        System.out.println("Response: " + response.output());

        // Clean up
        agentsClient.deleteAgentVersion(agent.getName(), agent.getVersion());
    }
}

Oczekiwane dane wyjściowe

Response: Here is the bar chart showing quarterly revenue for 2025 with Q1 ($2.1M), Q2 ($2.8M), Q3 ($3.2M), and Q4 ($2.9M) displayed in blue with data labels.

Agent używa narzędzia Code Interpreter za pośrednictwem punktu końcowego MCP zestawu narzędzi, pisze kod w języku Python przy użyciu biblioteki matplotlib do wygenerowania wykresu i uruchamia go w izolowanym środowisku. Na przykład, który przekazuje plik CSV i pobiera wygenerowany wykres, wybierz pozycję Python lub TypeScript z selektora języka w górnej części tego artykułu. Aby uzyskać więcej przykładów, zobacz próbki Azure AI Agents Java SDK.

Tworzenie wykresu z interpreterem kodu przy użyciu interfejsu API REST

W poniższym przykładzie pokazano, jak przekazać plik CSV, utworzyć agenta z interpreterem kodu, zażądać wykresu i pobrać wygenerowany plik.

Wymagania wstępne

Ustaw następujące zmienne środowiskowe:

  • FOUNDRY_PROJECT_ENDPOINT: adres URL punktu końcowego projektu.
  • AGENT_TOKEN: token elementu nośnego dla rozwiązania Foundry.

Uzyskiwanie tokenu dostępu:

export AGENT_TOKEN=$(az account get-access-token --scope "https://ai.azure.com/.default" --query accessToken -o tsv)

Użyj Code Interpreter w zestawie narzędzi

Aby przesłać plik do użycia przez Code Interpreter za pośrednictwem przybornika, prześlij plik do punktu końcowego Files na poziomie zasobu (POST {account_endpoint}/openai/v1/files) z nagłówkiem x-aml-project-id. W przeciwieństwie do przepływu agenta promptów pliki przesyłane za pośrednictwem punktu końcowego Files o zakresie projektu (/api/projects/{name}/openai/v1/files) otrzymują identyfikator owner_id, którego kontener narzędzi nie może zweryfikować, więc tools/call kończy się niepowodzeniem z błędem weryfikacji własności.

  1. Pobierz identyfikator GUID projektu z Azure Resource Manager. Użyj properties.amlWorkspace.internalId (format UUID z myślnikami), a nieproperties.internalId (bez myślników — kontener zestawu narzędzi go odrzuca):

    ARM_TOKEN=$(az account get-access-token --query accessToken -o tsv)
    PROJECT_GUID=$(curl -s -H "Authorization: Bearer $ARM_TOKEN" \
      "https://management.azure.com/subscriptions/{sub}/resourceGroups/{rg}/providers/Microsoft.CognitiveServices/accounts/{account}/projects/{project}?api-version=2025-06-01" \
      | jq -r '.properties.amlWorkspace.internalId')
    
  2. Prześlij plik na poziomie konta (zasobu) z nagłówkiem x-aml-project-id:

    cat > synthetic-company-financial-results.csv <<'CSV'
    name,sector,operating_profit
    SkyBridge Logistics,TRANSPORTATION,185.2
    Velocity Rail Freight,TRANSPORTATION,310.2
    AeroJet Airlines,TRANSPORTATION,510.6
    CSV
    
    TOKEN=$(az account get-access-token --scope https://ai.azure.com/.default --query accessToken -o tsv)
    curl -X POST "https://{account}.services.ai.azure.com/openai/v1/files" \
      -H "Authorization: Bearer $TOKEN" \
      -H "x-aml-project-id: $PROJECT_GUID" \
      -F "purpose=assistants" \
      -F "file=@synthetic-company-financial-results.csv"
    rm synthetic-company-financial-results.csv
    

Zwrócony plik id to wartość, którą podajesz jako <FILE_ID> w konfiguracji narzędzia. Pliki są instalowane w piaskownicy pod adresem /mnt/data/{file-id}-{original-filename}.

Ważne

Gdy interpreter kodu jest używany za pośrednictwem narzędzia w hostowanym agencie, izolacja użytkownika nie jest obsługiwana. Wszyscy użytkownicy w tym samym projekcie mają ten sam kontekst kontenera.

Dodaj interpreter kodu do zestawu narzędzi

Dodaj interpreter kodu, tworząc przybornik, a następnie dołącz przybornik do agenta jako narzędzie MCP. Aby uzyskać więcej informacji, zobacz Co to jest zestaw narzędzi?

  • Utwórz przybornik zawierający narzędzie interpretera kodu:

    curl --request POST \
      --url "$FOUNDRY_PROJECT_ENDPOINT/toolboxes/code-interpreter-toolbox/versions?api-version=v1" \
      -H "Authorization: Bearer $AGENT_TOKEN" \
      -H "Content-Type: application/json" \
      --data '{
        "description": "Toolbox with the code interpreter tool",
        "tools": [
          {
            "type": "code_interpreter",
            "container": {
              "type": "auto",
              "file_ids": ["<FILE_ID>"]
            }
          }
        ]
      }'
    

    Zestaw narzędzi udostępnia punkt końcowy zgodny z MCP pod adresem $FOUNDRY_PROJECT_ENDPOINT/toolboxes/code-interpreter-toolbox/versions/<version>/mcp?api-version=v1, gdzie <version> to wersja zwrócona przez poprzednie wywołanie.

  • Utwórz połączenie projektu narzędzia zdalnego, które wskazuje punkt końcowy zestawu narzędzi, przy użyciu tokenu Entra użytkownika, aby tożsamość wywołującego została przekazana dalej (dla grupy odbiorców https://ai.azure.com).

    azd ai connection create code-interpreter-toolbox-conn \
      --kind remote-tool \
      --target "$FOUNDRY_PROJECT_ENDPOINT/toolboxes/code-interpreter-toolbox/versions/<version>/mcp?api-version=v1" \
      --auth-type user-entra-token \
      --audience https://ai.azure.com
    

Utwórz agenta za pomocą zestawu narzędzi interpretera kodu

curl -X POST "$FOUNDRY_PROJECT_ENDPOINT/agents?api-version=v1" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $AGENT_TOKEN" \
  -d '{
    "name": "chart-agent",
    "definition": {
      "kind": "prompt",
      "model": "<MODEL_DEPLOYMENT>",
      "instructions": "You are a data visualization assistant. When asked to create charts, write and run Python code using matplotlib to generate them.",
      "tools": [
        {
          "type": "mcp",
          "server_label": "toolbox",
          "server_url": "'$FOUNDRY_PROJECT_ENDPOINT'/toolboxes/code-interpreter-toolbox/versions/<version>/mcp?api-version=v1",
          "require_approval": "never",
          "project_connection_id": "code-interpreter-toolbox-conn"
        }
      ]
    }
  }'

Generowanie wykresu

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": "chart-agent"},
    "input": "Create a bar chart of operating profit by company for the TRANSPORTATION sector from the uploaded CSV file. Use a blue color scheme and add data labels."
  }'

Odpowiedź zawiera container_file_citation adnotacje z wygenerowanymi szczegółami pliku. Zapisz wartości container_id i file_id z adnotacji.

Pobieranie wygenerowanego wykresu

curl -X GET "$FOUNDRY_PROJECT_ENDPOINT/openai/v1/containers/<CONTAINER_ID>/files/<FILE_ID>/content" \
  -H "Authorization: Bearer $AGENT_TOKEN" \
  --output chart.png

Czyszczenie

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

Sprawdzanie dostępności regionów i modeli

Dostępność narzędzi różni się w zależności od regionu i modelu.

Aby zapoznać się z bieżącą listą obsługiwanych regionów i modeli interpretera kodu, zobacz Najlepsze praktyki dotyczące używania narzędzi w usłudze Microsoft Foundry Agent Service.

Obsługiwane typy plików

Format pliku typ MIME
.c text/x-c
.cpp text/x-c++
.csv application/csv
.docx application/vnd.openxmlformats-officedocument.wordprocessingml.document
.html text/html
.java text/x-java
.json application/json
.md text/markdown
.pdf application/pdf
.php text/x-php
.pptx application/vnd.openxmlformats-officedocument.presentationml.presentation
.py text/x-python
.py text/x-script.python
.rb text/x-ruby
.tex text/x-tex
.txt text/plain
.css text/css
.jpeg image/jpeg
.jpg image/jpeg
.js text/javascript
.gif image/gif
.png image/png
.tar application/x-tar
.ts application/typescript
.xlsx application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
.xml application/xml Lub text/xml
.zip application/zip

Rozwiązywanie problemów

Kwestia Prawdopodobna przyczyna Rozdzielczość
Interpreter kodu nie jest uruchamiany. Narzędzie nie jest włączone lub model nie obsługuje go w Twoim regionie. Upewnij się, że interpreter kodu jest włączony w agencie. Sprawdź, czy wdrożenie Twojego modelu obsługuje narzędzie w Twoim regionie. Zobacz Sprawdzanie dostępności regionów i modeli.
Nie jest generowany żaden plik. Agent zwrócił odpowiedź tylko tekstową bez adnotacji pliku. Sprawdź adnotacje odpowiedzi dla elementu container_file_citation. Jeśli żaden z nich nie istnieje, agent nie wygenerował pliku. Przeformułuj monit, aby wyraźnie zażądać danych wyjściowych pliku.
Przekazywanie plików kończy się niepowodzeniem. Nieobsługiwany typ pliku lub niewłaściwy cel. Upewnij się, że typ pliku znajduje się na liście obsługiwanych typów plików . Załaduj przy użyciu purpose="assistants".
Wygenerowany plik jest uszkodzony lub pusty. Błąd wykonywania kodu lub niekompletne przetwarzanie. Sprawdź odpowiedź agenta pod kątem komunikatów o błędach. Sprawdź, czy dane wejściowe są prawidłowe. Najpierw spróbuj wykonać prostsze żądanie.
Limit czasu sesji lub duże opóźnienie. Sesje interpretera kodu mają limity czasu. Sesje mają 1-godzinny limit czasu aktywnego i 30-minutowy limit czasu bezczynności. Zmniejsz złożoność operacji lub podziel je na mniejsze zadania.
Nieoczekiwane opłaty rozliczeniowe. Utworzono wiele współbieżnych sesji. Każda konwersacja tworzy oddzielną sesję. Monitoruj użycie sesji i konsoliduj operacje tam, gdzie to możliwe.
Python pakiet jest niedostępny. Interpreter kodu ma stały zestaw pakietów. Interpreter kodu zawiera typowe pakiety nauki o danych. W przypadku pakietów niestandardowych użyj niestandardowego interpretera kodu.
Pobieranie pliku kończy się niepowodzeniem. Nieprawidłowy identyfikator kontenera lub identyfikator pliku. Sprawdź, czy używasz poprawnych container_id i file_id z adnotacji odpowiedzi.

Czyszczenie zasobów

Usuń zasoby utworzone w tym przykładzie, gdy nie są już potrzebne, aby uniknąć bieżących kosztów:

  • Usuń wersję agenta.
  • Usuń konwersację.
  • Usuń przekazane pliki.

Przykłady wzorców konwersacji i oczyszczania plików można znaleźć w temacie Web search tool (Narzędzie wyszukiwania w Internecie ) i File search tool for agents (Narzędzie wyszukiwania plików dla agentów).

Środowisko wykonywania w trybie piaskownicy

Interpreter kodu uruchamia kod Python w piaskownicy zarządzanej przez Microsoft. Piaskownica jest przeznaczona do uruchamiania niezaufanego kodu i używa dynamicznych sesji (sesje interpretera kodu) w Azure Container Apps. Każda sesja jest izolowana przez granicę Hyper-V.

Kluczowe zachowania do uwzględnienia przy planowaniu:

  • Region: Piaskownica interpretera kodu działa w tym samym regionie Azure co projekt Foundry.
  • Okres istnienia sesji: sesja interpretera kodu jest aktywna przez maksymalnie jedną godzinę z limitem czasu bezczynności (zobacz Ważną notatkę na początku tego artykułu).
  • Izolacja: każda sesja jest uruchamiana w środowisku izolowanym. Jeśli agent wywołuje interpreter kodu współbieżnie w różnych konwersacjach, tworzone są oddzielne sesje.
  • Izolacja sieci i dostęp do Internetu: piaskownica nie dziedziczy konfiguracji podsieci agenta, a sesje dynamiczne nie mogą wysyłać wychodzących żądań sieciowych.
  • Pliki w piaskownicy: Piaskownicowe środowisko uruchomieniowe Pythona ma dostęp do plików dołączanych do analizy. Interpreter kodu może również generować pliki, takie jak wykresy, i zwracać je jako dane wyjściowe do pobrania.

Jeśli potrzebujesz większej kontroli nad środowiskiem uruchomieniowym sandbox, czy potrzebujesz innego modelu izolacji, zobacz Niestandardowe narzędzie interpretera kodu dla agentów.