Работа с файлами
Модели GigaChat умеют распознавать текстовые документы, изображения и аудио, и использовать полученные данные для генерации ответов.
Работа с хранилищем файлов
В хранилище находятся добавленные файлы и сгенерированные изображения и 3D-модели.
Для работы с хранилищем GigaChat API предоставляет методы:
- POST /files;
- GET /files;
- GET /files/{file};
- POST /files/{file}/delete.
Загрузить файл в хранилище
Для загрузки файла в хранилище используйте метод POST /files.
Хранилище поддерживает текстовые документы, изображения и аудио разных форматов.
| Формат | MIME-тип |
|---|---|
| txt | text/plain |
| doc | application/msword |
| docx | application/vnd.openxmlformats-officedocument.wordprocessingml.document |
| application/pdf | |
| epub | application/epub |
| ppt | application/ppt |
| pptx | application/pptx |
| Формат | MIME-тип |
|---|---|
| jpeg | image/jpeg |
| png | image/png |
| tiff | image/tiff |
| bmp | image/bmp |
| Формат | MIME-тип |
|---|---|
| mp4 | audio/mp4 |
| mp3 | audio/mp3 |
| m4a | audio/x-m4a |
| wav | audio/x-wav audio/wave audio/wav audio/x-pn-wav |
| weba | audio/webm |
| ogg | audio/x-ogg |
| opus | audio/opus |
На размеры файлов действуют ограничения:
- максимальный размер одного аудиофайла в запросе — 35 Мб;
- максимальный размер одного изображения в запросе — 15 Мб;
- максимальный размер одного текстового файла в запросе — 40 Мб.
Общий размер загружаемых аудиофайлов и изображений должен быть меньше 80 Мб.
При загрузке файлов обязательно передавайте purpose="general".
Это позволит использовать файл в запросах на генерацию ответов.
curl --location --request POST 'https://gigachat.devices.sberbank.ru/api/v1/files' \
--header 'Authorization: Bearer access_token' \
--form 'file=@"<путь_к_файлу>/example.jpeg"' \
--form 'purpose="general"'
from gigachat import GigaChat
with GigaChat() as client:
# Загрузка файла
with open("document.pdf", "rb") as f:
uploaded = client.upload_file(f, purpose="general")
print(f"Файл загружен: {uploaded.id}")
public class UploadFileExample {
public static void main(String[] args) {
GigaChatClient client = GigaChatClient.builder()
.authClient(AuthClient.builder()
.withOAuth(OAuthBuilder.builder()
.scope(Scope.GIGACHAT_API_PERS)
.authKey("<ключ_авторизации>")
.build())
.build())
.build();
try {
System.out.println(client.uploadFile(UploadFileRequest.builder()
.file(new byte[1000])
.mimeType("application/pdf")
.fileName("test.pdf")
.purpose("general")
.build()));
} catch (HttpClientException ex) {
System.out.println(ex.statusCode() + " " + ex.bodyAsString());
}
}
}
В ответ вы получите объект с описанием файла:
{
"bytes": 120000,
"created_at": 1677610602,
"filename": "file123",
"id": "6f0b1291-c7f3-43c6-bb2e-9f3efb2dc98e",
"object": "file",
"purpose": "general",
"access_policy": "private",
"modalities": [
"image"
]
}
Описание параметров — в справке API.
Получить список доступных файлов
Для получения списка всех доступных вам файлов используйте метод GET /files:
curl -L -X GET 'https://gigachat.devices.sberbank.ru/api/v1/files' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer access_token'
from gigachat import GigaChat
with GigaChat() as client:
# Загрузка файла
with open("document.pdf", "rb") as f:
uploaded = client.upload_file(f, purpose="general")
print(f"Файл загружен: {uploaded.id}")
# Просмотр списка файлов
files = client.get_files()
for file in files.data:
print(f"{file.id}: {file.filename}")
Получить данные файла
Для получения информации об отдельном файле используйте метод GET /files/{file}:
curl -L -X GET 'https://gigachat.devices.sberbank.ru/api/v1/files/:file' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer access_token'
import requests
url = "https://gigachat.devices.sberbank.ru/api/v1/files/:file"
payload={}
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer access_token'
}
response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)
public class AvailableFilesExample {
public static void main(String[] args) {
GigaChatClient client = GigaChatClient.builder()
.authClient(AuthClient.builder()
.withOAuth(OAuthBuilder.builder()
.scope(Scope.GIGACHAT_API_PERS)
.authKey("<ключ_авторизации>")
.build())
.build())
.build();
try {
System.out.println(client.getListAvailableFile());
} catch (HttpClientException ex) {
System.out.println(ex.statusCode() + " " + ex.bodyAsString());
}
}
}
Удалить файл из хранилища
Для удаления файла из хранилища используйте метод POST /files/{file}/delete. В параметрах пути укажите идентификатор файла, который был получен при его загрузке в хранилище. После удаления файл нельзя будет использовать для генерации.
curl -L -X POST 'https://gigachat.devices.sberbank.ru/api/v1/files/:file/delete' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer access_token'
from gigachat import GigaChat
with GigaChat() as client:
# Загрузка файла
with open("document.pdf", "rb") as f:
uploaded = client.upload_file(f, purpose="general")
print(f"Файл загружен: {uploaded.id}")
# Удаление файла
client.delete_file(uploaded.id)
public class FileDeletedExample {
public static void main(String[] args) {
GigaChatClient client = GigaChatClient.builder()
.authClient(AuthClient.builder()
.withOAuth(OAuthBuilder.builder()
.scope(Scope.GIGACHAT_API_PERS)
.authKey("<ключ_авторизации>")
.build())
.build())
.build();
try {
System.out.println(client.deleteFile(UUID.randomUUID().toString()));
} catch (HttpClientException ex) {
System.out.println(ex.statusCode() + " " + ex.bodyAsString());
}
}
}
Использование файлов для генерации ответов
Доступные в хранилище файлы можно использовать в запросах на генерацию.
Для этого передайте идентификаторы файлов в массиве attachments запроса POST /chat/completions вместе с подходящим промптом.
В одном запр осе можно одновременно использовать текстовые документы и аудиофайлы. При этом результат генерации будет зависеть от положения файла в списке, а качество генерации может снизиться.
Общий размер запроса при работе с изображениями и аудио должен быть меньше 80 Мб.
Например, ваш запрос может включать текст промпта и идентификаторы изображения размером 12 Мб, и двух аудиофайлов размером 33 Мб и 21 Мб. Что в сумме даст запрос размером больше 66 Мб, в зависимости от размера промпта.
Доступ к файлам
Использовать файл для генерации может только тот пользователь, который добавил его в хранилище. Это значит, что в запросе на генерацию нужно передать тот же идентификатор пользователя, который был передан при загрузке файла.
В противном случае вернется ошибка:
{
"status":403,
"message":"Access to file '<идентификатор файла>' is denied"
}
По умолчанию, используется идентификатор Client ID. Идентификатор отображается в проекте GigaChat API, в разделе Настройки API, в поле Client ID.
Чтобы переопределить идентификатор, передайте его явно в заголовке X-Client-ID при загрузке файла.
Для дальнейшей работы с файлом нужно всегда передавать такой же идентификатор.
Текстовые документы
Для генерации с помощью загруженных текстовых документов используется встроенная функция get_file_content.
Чтобы модель учитывала документы при генерации, передайте в запросе:
- идентификаторы файлов в массиве
attachments; - параметр
"function_call": "auto", чтобы включить автоматический режим работы с функциями. Без включения автоматического режима модель будет использовать только первый документ из списка.
Если запрос содержит собственные функции, функцию get_file_content нужно указать в массиве functions.
Подробнее — в разделе Совместное использование встроенных и пользовательских функций.
Размер текстовых документов не учитывается в запросах на генерацию, но их содержимое мож ет быть больше контекста модели. В таком случае вернется ошибка с кодом 422.
Пример запроса на генерацию с двумя документами:
curl -L -X POST 'https://gigachat.devices.sberbank.ru/api/v1/chat/completions' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer access_token' \
--data-raw '{
"model": "GigaChat",
"function_call": "auto",
"messages": [
{
"role": "user",
"content": "Краткий пересказ файлов",
"attachments": [
"b0989008-3ec5-4b80-aaeb-32deba7a541c",
"d24d347f-44d6-444f-bca0-6e9df0fe9e6a"
]
}
]
}'
from gigachat import GigaChat
giga = GigaChat(
credentials="ключ_авторизации",
verify_ssl_certs=False,
)
result = giga.chat(
{
"function_call": "auto",
"messages": [
{
"role": "user",
"content": "Краткий пересказ файлов",
"attachments": ["b0989008-3ec5-4b80-aaeb-32deba7a541c", "d24d347f-44d6-444f-bca0-6e9df0fe9e6a"],
}
],
"temperature": 0.1
}
)
print(result.choices[0].message.content)
public class AttachmentExample {
public static void main(String[] args) {
GigaChatClient client = GigaChatClient.builder()
.verifySslCerts(false)
.authClient(AuthClient.builder()
.withOAuth(OAuthBuilder.builder()
.scope(Scope.GIGACHAT_API_PERS)
.authKey("<ключ_авторизации>")
.build())
.build())
.build();
try {
System.out.println(client.completions(CompletionRequest.builder()
.model(ModelName.GIGA_CHAT_MAX)
.message(ChatMessage.builder()
.content("Сделай краткий пересказ содержимого файла")
.role(ChatMessageRole.USER)
// Для передачи массива идентификаторов, используйте параметр attachments
.attachment("<идентификатор_файла>")
.build())
.build()));
} catch (HttpClientException ex) {
System.out.println(ex.statusCode() + " " + ex.bodyAsString());
}
}
}
Ответ модели будет содержать идентификатор состояния функции function_state_id.
Передавайте его в последующих запросах, чтобы сохранить контекст и повысить качество генерации.
Аудиофайлы
В запросе на генерацию можно передать несколько аудиофайлов. Суммарный размер файлов в запросе должен быть меньше 80 Мб.
curl -L -X POST 'https://gigachat.devices.sberbank.ru/api/v1/chat/completions' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer access_token' \
--data-raw '{
"model": "GigaChat",
"function_call": "auto",
"messages": [
{
"role": "user",
"content": "Сделай краткую выдержку подкастов",
"attachments": [
"b0989008-3ec5-4b80-aaeb-32deba7a541c",
"d24d347f-44d6-444f-bca0-6e9df0fe9e6a"
]
}
]
}'
from gigachat import GigaChat
giga = GigaChat(
credentials="ключ_авторизации",
verify_ssl_certs=False,
)
result = giga.chat(
{
"function_call": "auto",
"messages": [
{
"role": "user",
"content": "Сделай краткую выдержку подкастов",
"attachments": ["b0989008-3ec5-4b80-aaeb-32deba7a541c", "d24d347f-44d6-444f-bca0-6e9df0fe9e6a"],
}
]
}
)
print(result.choices[0].message.content)
public class AttachmentExample {
public static void main(String[] args) {
GigaChatClient client = GigaChatClient.builder()
.verifySslCerts(false)
.authClient(AuthClient.builder()
.withOAuth(OAuthBuilder.builder()
.scope(Scope.GIGACHAT_API_PERS)
.authKey("<ключ_авторизации>")
.build())
.build())
.build();
try {
System.out.println(client.completions(CompletionRequest.builder()
.model(ModelName.GIGA_CHAT_MAX)
.message(ChatMessage.builder()
.content("Сделай краткую выдержку подкаста")
.role(ChatMessageRole.USER)
// Для передачи массива идентификаторов, используйте параметр attachments
.attachment("<идентификатор_файла>")
.build())
.build()));
} catch (HttpClientException ex) {
System.out.println(ex.statusCode() + " " + ex.bodyAsString());
}
}
}
Изображения
В одном сообщении (объект в массиве messages) можно передать только одно изображение.
В одном запросе можно передать до 10 изображений, независимо от количества сообщений.
Примеры запросов на генерацию с использованием загруженных изображений.
curl -L -X POST 'https://gigachat.devices.sberbank.ru/api/v1/chat/completions' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer access_token' \
--data-raw '{
"model": "GigaChat-Pro",
"messages": [
{
"role": "user",
"content": "Что изображено на рисунке?",
"attachments": [
"80e0bcd5-2b78-4fa7-8783-903995f56b4b"
]
}
],
"stream": false,
"update_interval": 0
}'
from gigachat import GigaChat
giga = GigaChat(
credentials="ключ_авторизации",
verify_ssl_certs=False,
model="GigaChat-Pro"
)
result = giga.chat(
{
"messages": [
{
"role": "user",
"content": "Что изображено на рисунке?",
"attachments": ["80e0bcd5-2b78-4fa7-8783-903995f56b4b"],
}
],
"temperature": 0.1
}
)
print(result.choices[0].message.content)
public class VisionExample {
public static void main(String[] args) {
GigaChatClient client = GigaChatClient.builder()
.verifySslCerts(false)
.authClient(AuthClient.builder()
.withOAuth(OAuthBuilder.builder()
.scope(Scope.GIGACHAT_API_PERS)
.authKey("<ключ_авторизации>")
.build())
.build())
.build();
try {
System.out.println(client.completions(CompletionRequest.builder()
.model(ModelName.GIGA_CHAT_MAX)
.message(ChatMessage.builder()
.content("Что изображено на картинке?")
.role(ChatMessageRole.USER)
.attachment("<идентификатор_файла>")
.build())
.build()));
} catch (HttpClientException ex) {
System.out.println(ex.statusCode() + " " + ex.bodyAsString());
}
}
}
Тарификация изображений
При отправке изображений в GigaChat они преобразуются в токены. Количество токенов после преобразования зависит от размера и разрешения изображения. Максимальное количество токенов, которые могут быть потрачены на обработку изображения — 1792.
Токены оплачиваются в соответствии с тарифами GigaChat API.