Выполнить задачу с помощью 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_KEY— API-ключ для работы в 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_KEY— API-ключ для работы в 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_KEY— API-ключ для работы в 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