{"meta":{"title":"Ввод изображения","intro":"Отправляйте изображения на сессии Copilot в виде вложений. Существует два способа прикрепить изображения:","product":"GitHub Copilot","breadcrumbs":[{"href":"/ru/enterprise-cloud@latest/copilot","title":"GitHub Copilot"},{"href":"/ru/enterprise-cloud@latest/copilot/how-tos","title":"Инструкции"},{"href":"/ru/enterprise-cloud@latest/copilot/how-tos/copilot-sdk","title":"Второй пилот SDK"},{"href":"/ru/enterprise-cloud@latest/copilot/how-tos/copilot-sdk/features","title":"Возможности"},{"href":"/ru/enterprise-cloud@latest/copilot/how-tos/copilot-sdk/features/image-input","title":"Ввод изображения"}],"documentType":"article"},"body":"# Ввод изображения\n\nОтправляйте изображения на сессии Copilot в виде вложений. Существует два способа прикрепить изображения:\n\n<!-- markdownlint-disable GHD046 GHD005 -->\n\n<!-- Suppressed: GHD046 (outdated release terminology), GHD005 (hardcoded data variable) -->\n\n* **Файл Attachment** (`type: \"file\"`): предоставляет абсолютный путь; время выполнения считывает файл с диска, конвертирует его в base64 и отправляет в LLM.\n* **Blob attachment** (`type: \"blob\"`): предоставляет данные с кодом base64 напрямую; полезно, когда изображение уже находится в памяти (например, скриншоты, сгенерированные изображения или данные из API).\n\n## Обзор\n\n![Диаграмма: диаграмма последовательностей, показывающая описанный процесс.](/assets/images/help/copilot/copilot-sdk/features-image-input-diagram-0.png)\n\n| Концепция                            | Description                                                                                                                |\n| ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------- |\n| **Вложение файла**                   | Вложение с `type: \"file\"` и абсолют `path` к образу на диске                                                               |\n| **Прикрепление в виде капли**        | Вложение с `type: \"blob\"`, закодированным `data`в базе 64 , и — `mimeType`не требуется дисковый ввод-вывод                 |\n| **Автоматическое кодирование**       | Для вложений файлов runtime считывает изображение и автоматически конвертирует его в base64                                |\n| **Автоматическое изменение размера** | Время выполнения автоматически изменяет или снижает качество изображений, превышающих специфические для модели ограничения |\n| **Возможности обзора**               | Модель должна `capabilities.supports.vision = true` обрабатывать изображения                                               |\n\n## Быстрый старт — вложение файла\n\nПрикрепите файл изображения к любому сообщению, используя тип вложения файла. Путь должен быть абсолютным путём к образу на диске.\n\n<div class=\"ghd-codetabs\">\n<div class=\"ghd-codetab\" data-lang=\"typescript\" data-label=\"TypeScript\"><div class=\"ghd-codetab-fallback-label\" role=\"heading\" aria-level=\"3\">TypeScript</div>\n\n```typescript\nimport { CopilotClient } from \"@github/copilot-sdk\";\n\nconst client = new CopilotClient();\nawait client.start();\n\nconst session = await client.createSession({\n    model: \"gpt-5.4\",\n    onPermissionRequest: async () => ({ kind: \"approve-once\" }),\n});\n\nawait session.send({\n    prompt: \"Describe what you see in this image\",\n    attachments: [\n        {\n            type: \"file\",\n            path: \"/absolute/path/to/screenshot.png\",\n        },\n    ],\n});\n```\n\n</div>\n\n<div class=\"ghd-codetab\" data-lang=\"python\" data-label=\"Python\"><div class=\"ghd-codetab-fallback-label\" role=\"heading\" aria-level=\"3\">Python</div>\n\n```python\nfrom copilot import CopilotClient, PermissionDecisionApproveOnce\n\nclient = CopilotClient()\nawait client.start()\n\nsession = await client.create_session(\n    on_permission_request=lambda req, inv: PermissionDecisionApproveOnce(),\n    model=\"gpt-5.4\",\n)\n\nawait session.send(\n    \"Describe what you see in this image\",\n    attachments=[\n        {\n            \"type\": \"file\",\n            \"path\": \"/absolute/path/to/screenshot.png\",\n        },\n    ],\n)\n```\n\n</div>\n\n<div class=\"ghd-codetab\" data-lang=\"go\" data-label=\"Go\"><div class=\"ghd-codetab-fallback-label\" role=\"heading\" aria-level=\"3\">Go</div>\n\n```golang\nctx := context.Background()\nclient := copilot.NewClient(nil)\nclient.Start(ctx)\n\nsession, _ := client.CreateSession(ctx, &copilot.SessionConfig{\n    Model: \"gpt-5.4\",\n    OnPermissionRequest: func(req copilot.PermissionRequest, inv copilot.PermissionInvocation) (rpc.PermissionDecision, error) {\n        return &rpc.PermissionDecisionApproveOnce{}, nil\n    },\n})\n\npath := \"/absolute/path/to/screenshot.png\"\nsession.Send(ctx, copilot.MessageOptions{\n    Prompt: \"Describe what you see in this image\",\n    Attachments: []copilot.Attachment{\n        &copilot.AttachmentFile{\n            DisplayName: \"screenshot.png\",\n            Path:        path,\n        },\n    },\n})\n```\n\n</div>\n\n<div class=\"ghd-codetab\" data-lang=\"dotnet\" data-label=\".NET\"><div class=\"ghd-codetab-fallback-label\" role=\"heading\" aria-level=\"3\">.NET</div>\n\n```csharp\nusing GitHub.Copilot;\nusing GitHub.Copilot.Rpc;\n\nawait using var client = new CopilotClient();\nawait using var session = await client.CreateSessionAsync(new SessionConfig\n{\n    Model = \"gpt-5.4\",\n    OnPermissionRequest = (req, inv) =>\n        Task.FromResult(PermissionDecision.ApproveOnce()),\n});\n\nawait session.SendAsync(new MessageOptions\n{\n    Prompt = \"Describe what you see in this image\",\n    Attachments = new List<Attachment>\n    {\n        new AttachmentFile\n        {\n            Path = \"/absolute/path/to/screenshot.png\",\n            DisplayName = \"screenshot.png\",\n        },\n    },\n});\n```\n\n</div>\n\n<div class=\"ghd-codetab\" data-lang=\"java\" data-label=\"Java\"><div class=\"ghd-codetab-fallback-label\" role=\"heading\" aria-level=\"3\">Java</div>\n\n```java\nimport com.github.copilot.CopilotClient;\nimport com.github.copilot.rpc.*;\nimport java.util.List;\n\ntry (var client = new CopilotClient()) {\n    client.start().get();\n\n    var session = client.createSession(\n        new SessionConfig()\n            .setModel(\"gpt-5.4\")\n            .setOnPermissionRequest(PermissionHandler.APPROVE_ALL)\n    ).get();\n\n    session.send(new MessageOptions()\n        .setPrompt(\"Describe what you see in this image\")\n        .setAttachments(List.of(\n            new Attachment(\"file\", \"/absolute/path/to/screenshot.png\", \"screenshot.png\")\n        ))\n    ).get();\n}\n```\n\n</div>\n\n</div>\n\n## Быстрый старт — прикрепление к каплям\n\nЕсли у вас уже есть данные изображения в памяти (например, скриншот, сделанный вашим приложением, или изображение, полученное из API), используйте вложение blob, чтобы отправить их напрямую без записи на диск.\n\n<div class=\"ghd-codetabs\">\n<div class=\"ghd-codetab\" data-lang=\"typescript\" data-label=\"TypeScript\"><div class=\"ghd-codetab-fallback-label\" role=\"heading\" aria-level=\"3\">TypeScript</div>\n\n```typescript\nimport { CopilotClient } from \"@github/copilot-sdk\";\n\nconst client = new CopilotClient();\nawait client.start();\n\nconst session = await client.createSession({\n    model: \"gpt-5.4\",\n    onPermissionRequest: async () => ({ kind: \"approve-once\" }),\n});\n\nconst base64ImageData = \"...\"; // your base64-encoded image\nawait session.send({\n    prompt: \"Describe what you see in this image\",\n    attachments: [\n        {\n            type: \"blob\",\n            data: base64ImageData,\n            mimeType: \"image/png\",\n            displayName: \"screenshot.png\",\n        },\n    ],\n});\n```\n\n</div>\n\n<div class=\"ghd-codetab\" data-lang=\"python\" data-label=\"Python\"><div class=\"ghd-codetab-fallback-label\" role=\"heading\" aria-level=\"3\">Python</div>\n\n```python\nfrom copilot import CopilotClient, PermissionDecisionApproveOnce\n\nclient = CopilotClient()\nawait client.start()\n\nsession = await client.create_session(\n    on_permission_request=lambda req, inv: PermissionDecisionApproveOnce(),\n    model=\"gpt-5.4\",\n)\n\nbase64_image_data = \"...\"  # your base64-encoded image\nawait session.send(\n    \"Describe what you see in this image\",\n    attachments=[\n        {\n            \"type\": \"blob\",\n            \"data\": base64_image_data,\n            \"mimeType\": \"image/png\",\n            \"displayName\": \"screenshot.png\",\n        },\n    ],\n)\n```\n\n</div>\n\n<div class=\"ghd-codetab\" data-lang=\"go\" data-label=\"Go\"><div class=\"ghd-codetab-fallback-label\" role=\"heading\" aria-level=\"3\">Go</div>\n\n```golang\nmimeType := \"image/png\"\ndisplayName := \"screenshot.png\"\nsession.Send(ctx, copilot.MessageOptions{\n    Prompt: \"Describe what you see in this image\",\n    Attachments: []copilot.Attachment{\n        &copilot.AttachmentBlob{\n            Data:        &base64ImageData, // base64-encoded string\n            MIMEType:    mimeType,\n            DisplayName: &displayName,\n        },\n    },\n})\n```\n\n</div>\n\n<div class=\"ghd-codetab\" data-lang=\"dotnet\" data-label=\".NET\"><div class=\"ghd-codetab-fallback-label\" role=\"heading\" aria-level=\"3\">.NET</div>\n\n```csharp\nawait session.SendAsync(new MessageOptions\n{\n    Prompt = \"Describe what you see in this image\",\n    Attachments = new List<Attachment>\n    {\n        new AttachmentBlob\n        {\n            Data = base64ImageData,\n            MimeType = \"image/png\",\n            DisplayName = \"screenshot.png\",\n        },\n    },\n});\n```\n\n</div>\n\n<div class=\"ghd-codetab\" data-lang=\"java\" data-label=\"Java\"><div class=\"ghd-codetab-fallback-label\" role=\"heading\" aria-level=\"3\">Java</div>\n\n```java\nimport com.github.copilot.CopilotClient;\nimport com.github.copilot.rpc.*;\nimport java.util.List;\n\ntry (var client = new CopilotClient()) {\n    client.start().get();\n\n    var session = client.createSession(\n        new SessionConfig()\n            .setModel(\"gpt-5.4\")\n            .setOnPermissionRequest(PermissionHandler.APPROVE_ALL)\n    ).get();\n\n    var base64ImageData = \"...\"; // your base64-encoded image\n    session.send(new MessageOptions()\n        .setPrompt(\"Describe what you see in this image\")\n        .setAttachments(List.of(\n            new BlobAttachment()\n                .setData(base64ImageData)\n                .setMimeType(\"image/png\")\n                .setDisplayName(\"screenshot.png\")\n        ))\n    ).get();\n}\n```\n\n</div>\n\n</div>\n\n## Поддерживаемые форматы\n\nПоддерживаемые форматы изображений включают JPG, PNG, GIF и другие распространённые типы изображений. Для вложения файлов среда выполнения считывает образ с диска и конвертирует его по необходимости. Для blob-вложений вы предоставляете данные base64 и тип MIME напрямую. Используйте PNG или JPEG для наилучших результатов, так как это самые популярные форматы.\n\nПоле `capabilities.limits.vision.supported_media_types` модели показывает точные типы MIME, которые она принимает.\n\n## Автоматическая обработка\n\nСреда выполнения автоматически обрабатывает изображения, соответствующие ограничениям модели. Ручное изменение размера не требуется.\n\n* Изображения, превышающие лимиты размеров или размеров модели, автоматически изменяются (сохраняя соотношение сторон) или уменьшаются по качеству.\n* Если изображение не может быть перенесено в пределы ограничений после обработки, оно пропускается и не отправляется в LLM.\n* Поле модели `capabilities.limits.vision.max_prompt_image_size` указывает максимальный размер изображения в байтах.\n\nВы можете проверить эти ограничения во время выполнения через объект возможностей модели. Для лучшего опыта используйте изображения разумного размера в формате PNG или JPEG.\n\n## Возможности модели зрения\n\nНе все модели поддерживают зрение. Проверьте возможности модели перед отправкой изображений.\n\n### Поля возможностей\n\n| Поле                                               | Тип        | Description                                                                   |\n| -------------------------------------------------- | ---------- | ----------------------------------------------------------------------------- |\n| `capabilities.supports.vision`                     | `boolean`  | Может ли модель обрабатывать входные изображения                              |\n| `capabilities.limits.vision.supported_media_types` | `string[]` | Типы MIME, которые принимает модель (например, `[\"image/png\", \"image/jpeg\"]`) |\n| `capabilities.limits.vision.max_prompt_images`     | `number`   | Максимальное количество изображений в каждом запросе                          |\n| `capabilities.limits.vision.max_prompt_image_size` | `number`   | Максимальный размер изображения в байтах                                      |\n\n### Тип ограничений зрения\n\n```typescript\nvision?: {\n    supported_media_types: string[];\n    max_prompt_images: number;\n    max_prompt_image_size: number; // bytes\n};\n```\n\n## Получение изображений\n\nКогда инструменты возвращают изображения (например, скриншоты или сгенерированные диаграммы), результат содержит `\"image\"` блоки контента с данными, закодированными в base64.\n\n| Поле       | Тип       | Description                                  |\n| ---------- | --------- | -------------------------------------------- |\n| `type`     | `\"image\"` | Дискриминатор типа блока контента            |\n| `data`     | `string`  | Данные изображений, закодированных в Base64, |\n| `mimeType` | `string`  | Тип MIME (например, `\"image/png\"`)           |\n\nЭти блоки изображений появляются в `tool.execution_complete` результатах событий. Смотрите [руководство AUTOTITLE](/ru/enterprise-cloud@latest/copilot/how-tos/copilot-sdk/features/streaming-events) , чтобы узнать полный жизненный цикл события.\n\n## Советы и ограничения\n\n| Tip                                                 | Details                                                                                                              |\n| --------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- |\n| **Используйте PNG или JPEG напрямую**               | Избегает накладных расходов на конвертацию — эти данные отправляются в LLM as-is                                     |\n| **Держите изображения разумного размера**           | Большие изображения могут быть снижены по качеству, что приводит к потере важных деталей                             |\n| **Используйте абсолютные пути для вложения файлов** | Среда выполнения читает файлы с диска; Относительные пути могут неправильно разрешиться                              |\n| **Используйте вложения blob для данных в памяти**   | Когда у вас уже есть данные base64 (например, скриншоты, ответы API), blob избегает ненужного дискового ввода-вывода |\n| **Сначала проверьте поддержку зрения**              | Отправка изображений в модель без зрения приводит к трате токен без визуального понимания                            |\n| **Поддерживается несколько изображений**            | Прикрепите несколько вложений в одном сообщении, до предела лимита `max_prompt_images` модели                        |\n| **SVG не поддерживается**                           | SVG-файлы являются текстовыми и не подлежат обработке изображений                                                    |\n\n## См. также\n\n* [События потоковых сессий](/ru/enterprise-cloud@latest/copilot/how-tos/copilot-sdk/features/streaming-events): жизненный цикл события, включая блоки содержимого результатов инструментов\n* [Рулевое управление и очередь](/ru/enterprise-cloud@latest/copilot/how-tos/copilot-sdk/features/steering-and-queueing): отправка последующих сообщений с вложениями"}