Skip to main content

Ввод изображения

Отправляйте изображения на сессии Copilot в виде вложений. Существует два способа прикрепить изображения:

  • Файл Attachment (type: "file"): предоставляет абсолютный путь; время выполнения считывает файл с диска, конвертирует его в base64 и отправляет в LLM.
  • Blob attachment (type: "blob"): предоставляет данные с кодом base64 напрямую; полезно, когда изображение уже находится в памяти (например, скриншоты, сгенерированные изображения или данные из API).

Обзор

Диаграмма: диаграмма последовательностей, показывающая описанный процесс.

КонцепцияDescription
Вложение файлаВложение с type: "file" и абсолют path к образу на диске
Прикрепление в виде каплиВложение с type: "blob", закодированным dataв базе 64 , и — mimeTypeне требуется дисковый ввод-вывод
Автоматическое кодированиеДля вложений файлов runtime считывает изображение и автоматически конвертирует его в base64
Автоматическое изменение размераВремя выполнения автоматически изменяет или снижает качество изображений, превышающих специфические для модели ограничения
Возможности обзораМодель должна capabilities.supports.vision = true обрабатывать изображения

Быстрый старт — вложение файла

Прикрепите файл изображения к любому сообщению, используя тип вложения файла. Путь должен быть абсолютным путём к образу на диске.

TypeScript
import { CopilotClient } from "@github/copilot-sdk";

const client = new CopilotClient();
await client.start();

const session = await client.createSession({
    model: "gpt-4.1",
    onPermissionRequest: async () => ({ kind: "approve-once" }),
});

await session.send({
    prompt: "Describe what you see in this image",
    attachments: [
        {
            type: "file",
            path: "/absolute/path/to/screenshot.png",
        },
    ],
});
Python
from copilot import CopilotClient, PermissionDecisionApproveOnce

client = CopilotClient()
await client.start()

session = await client.create_session(
    on_permission_request=lambda req, inv: PermissionDecisionApproveOnce(),
    model="gpt-4.1",
)

await session.send(
    "Describe what you see in this image",
    attachments=[
        {
            "type": "file",
            "path": "/absolute/path/to/screenshot.png",
        },
    ],
)
Go
package main

import (
    "context"
    copilot "github.com/github/copilot-sdk/go"
    "github.com/github/copilot-sdk/go/rpc"
)

func main() {
    ctx := context.Background()
    client := copilot.NewClient(nil)
    client.Start(ctx)

    session, _ := client.CreateSession(ctx, &copilot.SessionConfig{
        Model: "gpt-4.1",
        OnPermissionRequest: func(req copilot.PermissionRequest, inv copilot.PermissionInvocation) (rpc.PermissionDecision, error) {
            return &rpc.PermissionDecisionApproveOnce{}, nil
        },
    })

    path := "/absolute/path/to/screenshot.png"
    session.Send(ctx, copilot.MessageOptions{
        Prompt: "Describe what you see in this image",
        Attachments: []copilot.Attachment{
            &copilot.UserMessageAttachmentFile{
                DisplayName: "screenshot.png",
                Path:        path,
            },
        },
    })
}
ctx := context.Background()
client := copilot.NewClient(nil)
client.Start(ctx)

session, _ := client.CreateSession(ctx, &copilot.SessionConfig{
    Model: "gpt-4.1",
    OnPermissionRequest: func(req copilot.PermissionRequest, inv copilot.PermissionInvocation) (rpc.PermissionDecision, error) {
        return &rpc.PermissionDecisionApproveOnce{}, nil
    },
})

path := "/absolute/path/to/screenshot.png"
session.Send(ctx, copilot.MessageOptions{
    Prompt: "Describe what you see in this image",
    Attachments: []copilot.Attachment{
        &copilot.UserMessageAttachmentFile{
            DisplayName: "screenshot.png",
            Path:        path,
        },
    },
})
.NET
using GitHub.Copilot;
using GitHub.Copilot.Rpc;

public static class ImageInputExample
{
    public static async Task Main()
    {
        await using var client = new CopilotClient();
        await using var session = await client.CreateSessionAsync(new SessionConfig
        {
            Model = "gpt-4.1",
            OnPermissionRequest = (req, inv) =>
                Task.FromResult(PermissionDecision.ApproveOnce()),
        });

        await session.SendAsync(new MessageOptions
        {
            Prompt = "Describe what you see in this image",
            Attachments = new List<UserMessageAttachment>
            {
                new UserMessageAttachmentFile
                {
                    Path = "/absolute/path/to/screenshot.png",
                    DisplayName = "screenshot.png",
                },
            },
        });
    }
}
using GitHub.Copilot;
using GitHub.Copilot.Rpc;

await using var client = new CopilotClient();
await using var session = await client.CreateSessionAsync(new SessionConfig
{
    Model = "gpt-4.1",
    OnPermissionRequest = (req, inv) =>
        Task.FromResult(PermissionDecision.ApproveOnce()),
});

await session.SendAsync(new MessageOptions
{
    Prompt = "Describe what you see in this image",
    Attachments = new List<UserMessageAttachment>
    {
        new UserMessageAttachmentFile
        {
            Path = "/absolute/path/to/screenshot.png",
            DisplayName = "screenshot.png",
        },
    },
});
Java
import com.github.copilot.sdk.CopilotClient;
import com.github.copilot.sdk.events.*;
import com.github.copilot.sdk.json.*;
import java.util.List;

try (var client = new CopilotClient()) {
    client.start().get();

    var session = client.createSession(
        new SessionConfig()
            .setModel("gpt-4.1")
            .setOnPermissionRequest(PermissionHandler.APPROVE_ALL)
    ).get();

    session.send(new MessageOptions()
        .setPrompt("Describe what you see in this image")
        .setAttachments(List.of(
            new Attachment("file", "/absolute/path/to/screenshot.png", "screenshot.png")
        ))
    ).get();
}

Быстрый старт — прикрепление к каплям

Если у вас уже есть данные изображения в памяти (например, скриншот, сделанный вашим приложением, или изображение, полученное из API), используйте вложение blob, чтобы отправить их напрямую без записи на диск.

TypeScript
import { CopilotClient } from "@github/copilot-sdk";

const client = new CopilotClient();
await client.start();

const session = await client.createSession({
    model: "gpt-4.1",
    onPermissionRequest: async () => ({ kind: "approve-once" }),
});

const base64ImageData = "..."; // your base64-encoded image
await session.send({
    prompt: "Describe what you see in this image",
    attachments: [
        {
            type: "blob",
            data: base64ImageData,
            mimeType: "image/png",
            displayName: "screenshot.png",
        },
    ],
});
Python
from copilot import CopilotClient, PermissionDecisionApproveOnce

client = CopilotClient()
await client.start()

session = await client.create_session(
    on_permission_request=lambda req, inv: PermissionDecisionApproveOnce(),
    model="gpt-4.1",
)

base64_image_data = "..."  # your base64-encoded image
await session.send(
    "Describe what you see in this image",
    attachments=[
        {
            "type": "blob",
            "data": base64_image_data,
            "mimeType": "image/png",
            "displayName": "screenshot.png",
        },
    ],
)
Go
package main

import (
    "context"
    copilot "github.com/github/copilot-sdk/go"
    "github.com/github/copilot-sdk/go/rpc"
)

func main() {
    ctx := context.Background()
    client := copilot.NewClient(nil)
    client.Start(ctx)

    session, _ := client.CreateSession(ctx, &copilot.SessionConfig{
        Model: "gpt-4.1",
        OnPermissionRequest: func(req copilot.PermissionRequest, inv copilot.PermissionInvocation) (rpc.PermissionDecision, error) {
            return &rpc.PermissionDecisionApproveOnce{}, nil
        },
    })

    base64ImageData := "..."
    mimeType := "image/png"
    displayName := "screenshot.png"
    session.Send(ctx, copilot.MessageOptions{
        Prompt: "Describe what you see in this image",
        Attachments: []copilot.Attachment{
            &copilot.UserMessageAttachmentBlob{
                Data:        base64ImageData,
                MIMEType:    mimeType,
                DisplayName: &displayName,
            },
        },
    })
}
mimeType := "image/png"
displayName := "screenshot.png"
session.Send(ctx, copilot.MessageOptions{
    Prompt: "Describe what you see in this image",
    Attachments: []copilot.Attachment{
        &copilot.UserMessageAttachmentBlob{
            Data:        base64ImageData, // base64-encoded string
            MIMEType:    mimeType,
            DisplayName: &displayName,
        },
    },
})
.NET
using GitHub.Copilot;
using GitHub.Copilot.Rpc;

public static class BlobAttachmentExample
{
    public static async Task Main()
    {
        await using var client = new CopilotClient();
        await using var session = await client.CreateSessionAsync(new SessionConfig
        {
            Model = "gpt-4.1",
            OnPermissionRequest = (req, inv) =>
                Task.FromResult(PermissionDecision.ApproveOnce()),
        });

        var base64ImageData = "...";
        await session.SendAsync(new MessageOptions
        {
            Prompt = "Describe what you see in this image",
            Attachments = new List<UserMessageAttachment>
            {
                new UserMessageAttachmentBlob
                {
                    Data = base64ImageData,
                    MimeType = "image/png",
                    DisplayName = "screenshot.png",
                },
            },
        });
    }
}
await session.SendAsync(new MessageOptions
{
    Prompt = "Describe what you see in this image",
    Attachments = new List<UserMessageAttachment>
    {
        new UserMessageAttachmentBlob
        {
            Data = base64ImageData,
            MimeType = "image/png",
            DisplayName = "screenshot.png",
        },
    },
});
Java
import com.github.copilot.sdk.CopilotClient;
import com.github.copilot.sdk.events.*;
import com.github.copilot.sdk.json.*;
import java.util.List;

try (var client = new CopilotClient()) {
    client.start().get();

    var session = client.createSession(
        new SessionConfig()
            .setModel("gpt-4.1")
            .setOnPermissionRequest(PermissionHandler.APPROVE_ALL)
    ).get();

    var base64ImageData = "..."; // your base64-encoded image
    session.send(new MessageOptions()
        .setPrompt("Describe what you see in this image")
        .setAttachments(List.of(
            new BlobAttachment()
                .setData(base64ImageData)
                .setMimeType("image/png")
                .setDisplayName("screenshot.png")
        ))
    ).get();
}

Поддерживаемые форматы

Поддерживаемые форматы изображений включают JPG, PNG, GIF и другие распространённые типы изображений. Для вложения файлов среда выполнения считывает образ с диска и конвертирует его по необходимости. Для blob-вложений вы предоставляете данные base64 и тип MIME напрямую. Используйте PNG или JPEG для наилучших результатов, так как это самые популярные форматы.

Поле capabilities.limits.vision.supported_media_types модели показывает точные типы MIME, которые она принимает.

Автоматическая обработка

Среда выполнения автоматически обрабатывает изображения, соответствующие ограничениям модели. Ручное изменение размера не требуется.

  • Изображения, превышающие лимиты размеров или размеров модели, автоматически изменяются (сохраняя соотношение сторон) или уменьшаются по качеству.
  • Если изображение не может быть перенесено в пределы ограничений после обработки, оно пропускается и не отправляется в LLM.
  • Поле модели capabilities.limits.vision.max_prompt_image_size указывает максимальный размер изображения в байтах.

Вы можете проверить эти ограничения во время выполнения через объект возможностей модели. Для лучшего опыта используйте изображения разумного размера в формате PNG или JPEG.

Возможности модели зрения

Не все модели поддерживают зрение. Проверьте возможности модели перед отправкой изображений.

Поля возможностей

ПолеТипDescription
capabilities.supports.visionbooleanМожет ли модель обрабатывать входные изображения
capabilities.limits.vision.supported_media_typesstring[]Типы MIME, которые принимает модель (например, ["image/png", "image/jpeg"])
capabilities.limits.vision.max_prompt_imagesnumberМаксимальное количество изображений в каждом запросе
capabilities.limits.vision.max_prompt_image_sizenumberМаксимальный размер изображения в байтах

Тип ограничений зрения

interface VisionCapabilities {
    vision?: {
        supported_media_types: string[];
        max_prompt_images: number;
        max_prompt_image_size: number; // bytes
    };
}
vision?: {
    supported_media_types: string[];
    max_prompt_images: number;
    max_prompt_image_size: number; // bytes
};

Получение изображений

Когда инструменты возвращают изображения (например, скриншоты или сгенерированные диаграммы), результат содержит "image" блоки контента с данными, закодированными в base64.

ПолеТипDescription
type"image"Дискриминатор типа блока контента
datastringДанные изображений, закодированных в Base64,
mimeTypestringТип MIME (например, "image/png")

Эти блоки изображений появляются в tool.execution_complete результатах событий. Смотрите руководство AUTOTITLE , чтобы узнать полный жизненный цикл события.

Советы и ограничения

TipDetails
Используйте PNG или JPEG напрямуюИзбегает накладных расходов на конвертацию — эти данные отправляются в LLM as-is
Держите изображения разумного размераБольшие изображения могут быть снижены по качеству, что приводит к потере важных деталей
Используйте абсолютные пути для вложения файловСреда выполнения читает файлы с диска; Относительные пути могут неправильно разрешиться
Используйте вложения blob для данных в памятиКогда у вас уже есть данные base64 (например, скриншоты, ответы API), blob избегает ненужного дискового ввода-вывода
Сначала проверьте поддержку зренияОтправка изображений в модель без зрения приводит к трате токен без визуального понимания
Поддерживается несколько изображенийПрикрепите несколько вложений в одном сообщении, до предела лимита max_prompt_images модели
SVG не поддерживаетсяSVG-файлы являются текстовыми и не подлежат обработке изображений

См. также