Выполнить задачу с помощью Code Interpreter

В Yandex AI Studio с помощью инструмента исполнения кода Code Interpreter вы сможете расширить возможности модели, чтобы она писала и выполняла Python-код в изолированной тестовой среде. Инструмент полезен для задач, в которых модель должна считать, проверять и преобразовывать данные, а не ограничиваться текстовыми рассуждениями.

Примечание

Сессии с Code Interpreter являются контекстно-нагруженными (код, данные, результаты выполнения). Для них рекомендуется использовать модели с большим контекстным окном, например Qwen.

Чтобы воспользоваться примером, вам понадобится сервисный аккаунт с ролями ai.assistants.editor и ai.languageModels.user, а также API-ключ с областью действия yc.ai.foundationModels.execute. API-ключ, который вы можете создать в AI Studio, имеет такие разрешения. Пример того, как настроить рабочее окружение, можно найти в разделе Начало работы.

Создайте агента

import openai
        import json
        import os
        
        YANDEX_MODEL = "qwen3-235b-a22b-fp8"
        YANDEX_API_KEY = os.getenv('YANDEX_API_KEY')
        YANDEX_FOLDER_ID = os.getenv('YANDEX_FOLDER_ID')
        
        client = openai.OpenAI(
            api_key=YANDEX_API_KEY,
            base_url="https://ai.api.cloud.yandex.net/v1",
            project=YANDEX_FOLDER_ID
        )
        
        instruction = """
        Ты программист на питоне и умеешь писать и выполнять код для решения поставленной задачи
        Проверь сначала наличие нужных тебе библиотек и если их нет – установи их
        """
        
        prompt = """
        Сделай мне подробную презентацию в формате pptx про производные – что это такое, как их считать, добавь инфографики.
        Слайдов должно быть не менее 5
        """
        
        stream = client.responses.create(
            model=f"gpt://{YANDEX_FOLDER_ID}/{YANDEX_MODEL}",
            input=prompt,
            tool_choice="auto",
            temperature=0.3,
            tools=[
                {
                    "type": "code_interpreter",
                    "container": {
                        "type": "auto",
                    }
                }
            ],
            stream=True
        )
        
        resp_id = None
        
        print("Начало обработки запроса...\n")
        
        for event in stream:
            if event.type == "response.output_text.delta":
                print(event.delta, end='')
            elif event.type == "response.code_interpreter_call_code.delta":
                print(event.delta, end='')
            elif event.type == "response.reasoning_text.delta":
                print(event.delta, end='')
            elif event.type == "response.reasoning_summary_text.delta":
                print(event.delta, end='')
            elif event.type == "response.code_interpreter_call_code.done":
                print(f"\n\nИтоговый код:\n{event.code}\n")
            elif event.type == "response.code_interpreter_call.in_progress":
                print("\n[Выполняем код...]\n")
            elif event.type == "response.code_interpreter_call.done":
                print("\n[Код выполнен]\n")
            elif event.type == "response.in_progress":
                resp_id = event.response.id
                print(f"\n[Обрабатываем респонс {resp_id}]\n")
        
        print(f"\n\nЗадача решена: {resp_id}\n")
        print("=" * 50 + "\n")
        
        # Получение полного ответа
        response = client.responses.retrieve(resp_id)
        
        # Обработка результатов и скачивание файлов
        print("Обработка результатов выполнения:")
        os.makedirs("./downloaded_files", exist_ok=True)
        
        downloaded_count = 0
        for item in response.output:
            # Вывод результатов выполнения кода
            if item.type == "code_interpreter_call":
                print("\nКод:\n")
                print(item.code, '\n')
                for output_item in item.outputs:
                    output_type = output_item.type
                    logs = output_item.logs.strip()
                    if logs:
                        print(f"[{output_type.upper()}] Вывод:")
                        for log_line in logs.split('\n'):
                            print(f"        {log_line}")
        
            # Скачивание файлов из контейнера
            elif item.type == "message":
                for content in item.content:
                    # Проверяем наличие аннотаций с файлами
                    if hasattr(content, 'annotations') and content.annotations:
                        for annotation in content.annotations:
                            if annotation.type == "container_file_citation":
                                file_id = annotation.file_id
                                file_name = annotation.filename
        
                                print(f"\n📎 Найден файл: {file_name} (ID: {file_id})")
        
                                try:
                                    # Скачиваем файл
                                    file_content = client.files.content(file_id)
        
                                    # Сохраняем локально
                                    local_path = os.path.join("./downloaded_files", file_name)
                                    with open(local_path, 'wb') as f:
                                        f.write(file_content.read())
        
                                    print(f"✅ Файл сохранен: {local_path}")
                                    downloaded_count += 1
                                except Exception as e:
                                    print(f"❌ Ошибка при скачивании файла {file_name}: {e}")
        
        if downloaded_count > 0:
            print(f"\n✅ Всего скачано файлов: {downloaded_count}")
        else:
            print("\nℹ️  Файлы для скачивания не найдены.")
        
        print("\n" + "=" * 50 + "\n")
        
        # Полный ответ
        print("Полный ответ (JSON):")
        print(json.dumps(response.model_dump(), indent=2, ensure_ascii=False))
        

Где:

  • YANDEX_API_KEYAPI-ключ для работы в AI Studio.
  • YANDEX_FOLDER_IDидентификатор каталога сервисного аккаунта.
  • YANDEX_MODEL — имя модели, которая будет обрабатывать запрос; для задач с кодом рекомендуется использовать модели с поддержкой reasoning.
  • temperature — температура генерации; более низкие значения делают код точнее и предсказуемее.
  • stream=True — включает потоковую передачу событий; позволяет отображать ход выполнения в реальном времени.

Рядом с выполненным файлом будет создана папка downloaded_files с результатами работы модели: файл презентации в формате PPTX и графики. Отчет о проделанной работе будет выведен в консоль.

Фрагмент ответа
Я успешно создал для вас подробную презентацию о производных в формате PowerPoint (PPTX). Презентация содержит **6 слайдов**, включая титульный, теоретические объяснения, правила дифференцирования, примеры, графическую интерпретацию с инфографикой и применение производных в реальной жизни.
        
        ### Содержание презентации:
        1. **Титульный слайд** — название и подзаголовок.
        2. **Что такое производная?** — определение, геометрический смысл, обозначения.
        3. **Правила дифференцирования** — основные формулы и законы.
        4. **Примеры вычисления** — пошаговые расчеты для разных функций.
        5. **Графическая интерпретация** — график функции \( y = x^2 \) и касательная в точке \( x = 1 \) (с визуализацией).
        6. **Применение производных** — физика, экономика, машинное обучение и другие области.
        
        ...
        
        📎 Найден файл: Proizvodnye_Presentation.pptx (ID: fvttk7sto2ne********)
        ✅ Файл сохранен: ./downloaded_files\Proizvodnye_Presentation.pptx
        
        📎 Найден файл: tangent_plot.png (ID: fvtt18umj1gn********)
        ✅ Файл сохранен: ./downloaded_files\tangent_plot.png
        
        ✅ Всего скачано файлов: 2
        
const OpenAI = require("openai");
        const fs = require("fs");
        const path = require("path");
        
        const YANDEX_MODEL = "qwen3-235b-a22b-fp8";
        const YANDEX_API_KEY = process.env.YANDEX_API_KEY;
        const YANDEX_FOLDER_ID = process.env.YANDEX_FOLDER_ID;
        
        const client = new OpenAI({
          apiKey: YANDEX_API_KEY,
          baseURL: "https://ai.api.cloud.yandex.net/v1",
          project: YANDEX_FOLDER_ID,
        });
        
        const instruction = `
        Ты программист на питоне и умеешь писать и выполнять код для решения поставленной задачи
        Проверь сначала наличие нужных тебе библиотек и если их нет – установи их
        `;
        
        const prompt = `
        Сделай мне подробную презентацию в формате pptx про производные – что это такое, как их считать, добавь инфографики.
        Слайдов должно быть не менее 5
        `;
        
        async function main() {
          const stream = await client.responses.create({
            model: `gpt://${YANDEX_FOLDER_ID}/${YANDEX_MODEL}`,
            input: prompt,
            tool_choice: "auto",
            temperature: 0.3,
            tools: [
              {
                type: "code_interpreter",
                container: {
                  type: "auto",
                },
              },
            ],
            stream: true,
          });
        
          let respId = null;
        
          console.log("Начало обработки запроса...\n");
        
          for await (const event of stream) {
            if (event.type === "response.output_text.delta") {
              process.stdout.write(event.delta);
            } else if (event.type === "response.code_interpreter_call_code.delta") {
              process.stdout.write(event.delta);
            } else if (event.type === "response.reasoning_text.delta") {
              process.stdout.write(event.delta);
            } else if (event.type === "response.reasoning_summary_text.delta") {
              process.stdout.write(event.delta);
            } else if (event.type === "response.code_interpreter_call_code.done") {
              console.log(`\n\nИтоговый код:\n${event.code}\n`);
            } else if (event.type === "response.code_interpreter_call.in_progress") {
              console.log("\n[Выполняем код...]\n");
            } else if (event.type === "response.code_interpreter_call.done") {
              console.log("\n[Код выполнен]\n");
            } else if (event.type === "response.in_progress") {
              respId = event.response.id;
              console.log(`\n[Обрабатываем респонс ${respId}]\n`);
            }
          }
        
          console.log(`\n\nЗадача решена: ${respId}\n`);
          console.log("=".repeat(50) + "\n");
        
          // Получение полного ответа
          const response = await client.responses.retrieve(respId);
        
          // Обработка результатов и скачивание файлов
          console.log("Обработка результатов выполнения:");
          fs.mkdirSync("./downloaded_files", { recursive: true });
        
          let downloadedCount = 0;
        
          for (const item of response.output) {
            // Вывод результатов выполнения кода
            if (item.type === "code_interpreter_call") {
              console.log("\nКод:\n");
              console.log(item.code, "\n");
        
              for (const outputItem of item.outputs) {
                const outputType = outputItem.type;
                const logs = outputItem.logs?.trim();
                if (logs) {
                  console.log(`[${outputType.toUpperCase()}] Вывод:`);
                  for (const logLine of logs.split("\n")) {
                    console.log(`        ${logLine}`);
                  }
                }
              }
            }
        
            // Скачивание файлов из контейнера
            else if (item.type === "message") {
              for (const content of item.content) {
                // Проверяем наличие аннотаций с файлами
                if (content.annotations && content.annotations.length > 0) {
                  for (const annotation of content.annotations) {
                    if (annotation.type === "container_file_citation") {
                      const fileId = annotation.file_id;
                      const fileName = annotation.filename;
        
                      console.log(`\n📎 Найден файл: ${fileName} (ID: ${fileId})`);
        
                      try {
                        // Скачиваем файл
                        const fileContent = await client.files.content(fileId);
        
                        // Сохраняем локально
                        const localPath = path.join("./downloaded_files", fileName);
                        const buffer = Buffer.from(await fileContent.arrayBuffer());
                        fs.writeFileSync(localPath, buffer);
        
                        console.log(`✅ Файл сохранен: ${localPath}`);
                        downloadedCount++;
                      } catch (e) {
                        console.log(`❌ Ошибка при скачивании файла ${fileName}: ${e.message}`);
                      }
                    }
                  }
                }
              }
            }
          }
        
          if (downloadedCount > 0) {
            console.log(`\n✅ Всего скачано файлов: ${downloadedCount}`);
          } else {
            console.log("\nℹ️  Файлы для скачивания не найдены.");
          }
        
          console.log("\n" + "=".repeat(50) + "\n");
        
          // Полный ответ
          console.log("Полный ответ (JSON):");
          console.log(JSON.stringify(response, null, 2));
        }
        
        main().catch(console.error);
        

Где:

  • YANDEX_API_KEYAPI-ключ для работы в AI Studio.
  • YANDEX_FOLDER_IDидентификатор каталога сервисного аккаунта.
  • YANDEX_MODEL — имя модели, которая будет обрабатывать запрос; для задач с кодом рекомендуется использовать модели с поддержкой reasoning.
  • temperature — температура генерации; более низкие значения делают код точнее и предсказуемее.
  • stream — включает потоковую передачу событий; позволяет отображать ход выполнения в реальном времени.

Рядом с выполненным файлом будет создана папка downloaded_files с результатами работы модели: файл презентации в формате PPTX и графики. Отчет о проделанной работе будет выведен в консоль.

Фрагмент ответа
Я успешно создал для вас подробную презентацию о производных в формате PowerPoint (PPTX). Презентация содержит **6 слайдов**, включая титульный, теоретические объяснения, правила дифференцирования, примеры, графическую интерпретацию с инфографикой и применение производных в реальной жизни.
        
        ### Содержание презентации:
        1. **Титульный слайд** — название и подзаголовок.
        2. **Что такое производная?** — определение, геометрический смысл, обозначения.
        3. **Правила дифференцирования** — основные формулы и законы.
        4. **Примеры вычисления** — пошаговые расчеты для разных функций.
        5. **Графическая интерпретация** — график функции \( y = x^2 \) и касательная в точке \( x = 1 \) (с визуализацией).
        6. **Применение производных** — физика, экономика, машинное обучение и другие области.
        
        ...
        
        📎 Найден файл: Proizvodnye_Presentation.pptx (ID: fvttk7sto2ne********)
        ✅ Файл сохранен: ./downloaded_files\Proizvodnye_Presentation.pptx
        
        📎 Найден файл: tangent_plot.png (ID: fvtt18umj1gn********)
        ✅ Файл сохранен: ./downloaded_files\tangent_plot.png
        
        ✅ Всего скачано файлов: 2
        
package main
        
        import (
          "context"
          "encoding/json"
          "fmt"
          "io"
          "log"
          "os"
          "path/filepath"
        
          "github.com/openai/openai-go"
          "github.com/openai/openai-go/option"
          "github.com/openai/openai-go/responses"
        )
        
        const YANDEX_MODEL = "qwen3-235b-a22b-fp8"
        
        var (
          YANDEX_API_KEY   = os.Getenv("YANDEX_API_KEY")
          YANDEX_FOLDER_ID = os.Getenv("YANDEX_FOLDER_ID")
        )
        
        const instruction = `
        Ты программист на питоне и умеешь писать и выполнять код для решения поставленной задачи
        Проверь сначала наличие нужных тебе библиотек и если их нет – установи их
        `
        
        const prompt = `
        Сделай мне подробную презентацию в формате pptx про производные – что это такое, как их считать, добавь инфографики.
        Слайдов должно быть не менее 5
        `
        
        func main() {
          client := openai.NewClient(
            option.WithAPIKey(YANDEX_API_KEY),
            option.WithBaseURL("https://ai.api.cloud.yandex.net/v1"),
            option.WithProject(YANDEX_FOLDER_ID),
          )
        
          model := fmt.Sprintf("gpt://%s/%s", YANDEX_FOLDER_ID, YANDEX_MODEL)
        
          stream := client.Responses.NewStreaming(context.Background(), responses.ResponseNewParams{
            Model:        model,
            Instructions: openai.String(instruction),
            Input: responses.ResponseNewParamsInputUnion{
              OfString: openai.String(prompt),
            },
            ToolChoice: responses.ResponseNewParamsToolChoiceUnion{
              OfToolChoiceMode: openai.Opt(responses.ToolChoiceOptionsAuto),
            },
            Temperature: openai.Float(0.3),
            Tools: []responses.ToolUnionParam{
              {
                OfCodeInterpreter: &responses.ToolCodeInterpreterParam{
                  Container: responses.ToolCodeInterpreterContainerUnionParam{
                    OfCodeInterpreterContainerAuto: &responses.ToolCodeInterpreterContainerCodeInterpreterContainerAutoParam{},
                  },
                },
              },
            },
          })
        
          var respID string
        
          fmt.Println("Начало обработки запроса...\n")
        
          for stream.Next() {
            event := stream.Current()
        
            switch event.Type {
            case "response.output_text.delta":
              fmt.Print(event.Delta)
            case "response.code_interpreter_call_code.delta":
              fmt.Print(event.Delta)
            case "response.reasoning_text.delta":
              fmt.Print(event.Delta)
            case "response.reasoning_summary_text.delta":
              fmt.Print(event.Delta)
            case "response.code_interpreter_call_code.done":
              fmt.Printf("\n\nИтоговый код:\n%s\n", event.Code)
            case "response.code_interpreter_call.in_progress":
              fmt.Println("\n[Выполняем код...]\n")
            case "response.code_interpreter_call.completed":
              fmt.Println("\n[Код выполнен]\n")
            case "response.in_progress":
              respID = event.Response.ID
              fmt.Printf("\n[Обрабатываем респонс %s]\n", respID)
            }
          }
        
          if err := stream.Err(); err != nil {
            log.Fatalf("Ошибка стриминга: %v", err)
          }
        
          fmt.Printf("\n\nЗадача решена: %s\n", respID)
          fmt.Println("=" + fmt.Sprintf("%-50s", "") + "\n")
        
          // Получение полного ответа
          response, err := client.Responses.Get(context.Background(), respID, responses.ResponseGetParams{})
          if err != nil {
            log.Fatalf("Ошибка получения ответа: %v", err)
          }
        
          // Обработка результатов и скачивание файлов
          fmt.Println("Обработка результатов выполнения:")
          if err := os.MkdirAll("./downloaded_files", 0755); err != nil {
            log.Fatalf("Ошибка создания директории: %v", err)
          }
        
          downloadedCount := 0
        
          for _, item := range response.Output {
            switch item.Type {
            case "code_interpreter_call":
              ci := item.AsCodeInterpreterCall()
              fmt.Println("\nКод:\n")
              fmt.Println(ci.Code, "\n")
              for _, output := range ci.Outputs {
                if output.Logs != "" {
                  fmt.Printf("[%s] Вывод:\n", output.Type)
                  fmt.Printf("        %s\n", output.Logs)
                }
              }
        
            case "message":
              msg := item.AsMessage()
              for _, content := range msg.Content {
                if content.Type == "output_text" {
                  text := content.AsOutputText()
                  for _, annotation := range text.Annotations {
                    if annotation.Type == "container_file_citation" {
                      fileID := annotation.FileID
                      fileName := annotation.Filename
        
                      fmt.Printf("\n📎 Найден файл: %s (ID: %s)\n", fileName, fileID)
        
                      fileContent, err := client.Files.Content(context.Background(), fileID)
                      if err != nil {
                        fmt.Printf("❌ Ошибка при скачивании файла %s: %v\n", fileName, err)
                        continue
                      }
        
                      localPath := filepath.Join("./downloaded_files", fileName)
                      data, err := io.ReadAll(fileContent.Body)
                      if err != nil {
                        fmt.Printf("❌ Ошибка чтения файла %s: %v\n", fileName, err)
                        continue
                      }
        
                      if err := os.WriteFile(localPath, data, 0644); err != nil {
                        fmt.Printf("❌ Ошибка сохранения файла %s: %v\n", fileName, err)
                        continue
                      }
        
                      fmt.Printf("✅ Файл сохранен: %s\n", localPath)
                      downloadedCount++
                    }
                  }
                }
              }
            }
          }
        
          if downloadedCount > 0 {
            fmt.Printf("\n✅ Всего скачано файлов: %d\n", downloadedCount)
          } else {
            fmt.Println("\nℹ️  Файлы для скачивания не найдены.")
          }
        
          fmt.Println("\n" + "==================================================\n")
        
          // Полный ответ
          fmt.Println("Полный ответ (JSON):")
          finalJSON, _ := json.MarshalIndent(response, "", "  ")
          fmt.Println(string(finalJSON))
        }
        

Где:

  • YANDEX_API_KEYAPI-ключ для работы в AI Studio.
  • YANDEX_FOLDER_IDидентификатор каталога сервисного аккаунта.
  • YANDEX_MODEL — имя модели, которая будет обрабатывать запрос; для задач с кодом рекомендуется использовать модели с поддержкой reasoning.
  • temperature — температура генерации; более низкие значения делают код точнее и предсказуемее.
  • stream — включает потоковую передачу событий; позволяет отображать ход выполнения в реальном времени.

Рядом с выполненным файлом будет создана папка downloaded_files с результатами работы модели: файл презентации в формате PPTX и графики. Отчет о проделанной работе будет выведен в консоль.

Фрагмент ответа
Я успешно создал для вас подробную презентацию о производных в формате PowerPoint (PPTX). Презентация содержит **6 слайдов**, включая титульный, теоретические объяснения, правила дифференцирования, примеры, графическую интерпретацию с инфографикой и применение производных в реальной жизни.
        
        ### Содержание презентации:
        1. **Титульный слайд** — название и подзаголовок.
        2. **Что такое производная?** — определение, геометрический смысл, обозначения.
        3. **Правила дифференцирования** — основные формулы и законы.
        4. **Примеры вычисления** — пошаговые расчеты для разных функций.
        5. **Графическая интерпретация** — график функции \( y = x^2 \) и касательная в точке \( x = 1 \) (с визуализацией).
        6. **Применение производных** — физика, экономика, машинное обучение и другие области.
        
        ...
        
        📎 Найден файл: Proizvodnye_Presentation.pptx (ID: fvttk7sto2ne********)
        ✅ Файл сохранен: ./downloaded_files\Proizvodnye_Presentation.pptx
        
        📎 Найден файл: tangent_plot.png (ID: fvtt18umj1gn********)
        ✅ Файл сохранен: ./downloaded_files\tangent_plot.png
        
        ✅ Всего скачано файлов: 2
        

См. также