Создание и скачивание 3D-моделей
С помощью моделей GigaChat можно создавать 3D-модели в формате FBX на основе текстового описания. В этом разделе вы узнаете как генерировать и скачивать модели с помощью GigaChat API.
Генерация 3D-моделей
Чтобы сгенерировать модель, передайте в запросе POST /chat/completions встроенную функцию text2model3d и включить автоматический режим работы с функциями ("function_call": "auto").
При обнаружении подходящего сообщения, например «Сгенерируй 3D-модель шара», модель использует переданную функцию для генерации 3D-модели.
В отличие от создания изображений, наличие функции в массиве functions обязательно для генерации 3D-моделей.
Подробнее о функциях GigaChat API — в разделе Обращение к встроенным функциям
Созданная модель сохраняется в хранилище, а ответ от API будет содержать div-блок с идентификатором файла data-model-id:
<div data-model-id="e10675c7-4128-4dbf-9f68-b10876ac1951" fuse="true"/> Модель шара успешно создана. Представляю тебе реалистичный трехмерный шар.
Для скачивания файла используйте запрос GET /files/{file_id}/content.
Подробнее о хранилище файлов — в разделе Обработка файлов.
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 <токен_доступа>' \
--data-raw '{
"model": "GigaChat",
"messages": [
{
"role": "user",
"content": "Сгенерируй 3D-модель шара"
}
],
"function_call": "auto",
"functions": [
{
"name": "text2model3d"
}
]
}'
Генерация с помощью SDK:
from gigachat import GigaChat
from gigachat.models import Chat, Messages, MessagesRole, Function
giga = GigaChat(
credentials="<ключ_авторизации>",
verify_ssl_certs=False,
# Повышение времени ожидания, так как создание модели — длительный процесс
timeout=200
)
payload = Chat(
messages=[Messages(role=MessagesRole.USER, content="Сгенерируй 3D-модель шара")],
function_call="auto",
functions=[
Function(name="text2model3d")
]
)
response = giga.chat(payload)
print (response)
Генерация с помощью партнерского пакета langchain-gigachat:
from langchain_gigachat.chat_models import GigaChat
from langchain_core.prompts import ChatPromptTemplate
llm = GigaChat(
credentials="<ключ_авторизациии>",
# Повышение времени ожидания, так как создание модели — длительный процесс
timeout=200
)
tools = [
{
"name": "text2model3d",
},
]
# Метод `bind_tools(tools=[], tool_choice="auto")` сообщает модели, что нужно использовать встроенные функции.
llm = llm.bind_tools(tools=tools, tool_choice="auto")
# Промпт для создания 3D-модели
prompt = ChatPromptTemplate.from_messages(
[
("user", """{topic}"""),
]
)
# Цепочка для создания 3D-модели
generate_3d_model_chain = prompt | llm
response = generate_3d_model_chain.invoke({"topic": "Сгенерируй 3D-модель шара"})
print(response)
Генерация с помощью SDK:
import { GigaChat } from 'gigachat';
import { Agent } from 'node:https';
const httpsAgent = new Agent({
rejectUnauthorized: false,
});
const giga = new GigaChat({
credentials: '<ключ_авторизации>',
timeout: 200
});
const resp = await giga.chat({
messages: [
{
role: "user",
content: "Сгенерируй 3D-модель шара",
},
],
functions: [
{"name": 'text2model3d',}
],
function_call: 'auto'
});
console.log(resp.choices[0]?.message.content);
Скачивание 3D-модели
Ответ GigaChat API будет содержать идентификатор получившейся 3D-модели.
Он передается в поле message.content, в теге <div>, в атрибуте data-model-id:
{
"choices": [
{
"message": {
"content": "<div data-model-id=\"ef486a65-b03a-48e0-a9dc-6bda7317d835\" fuse=\"true\"/> Модель шара успешно создана. Представляю себе идеальный круглый шар — простую форму, воплощающую гармонию пропорций и симметрию.",
"role": "assistant",
"functions_state_id": "21283471-5a89-49ef-a5a3-92280e0eed34"
},
"index": 0,
"finish_reason": "stop"
}
],
"created": 1753273828,
"model": "GigaChat:2.0.28.2",
"object": "chat.completion",
"usage": {
"prompt_tokens": 638,
"completion_tokens": 55,
"total_tokens": 693,
"precached_prompt_tokens": 4
}
}
Для скачивания файла передайте полученный идентификатор в запросе GET /files/{file_id}/content.
Если запрос на генерацию содержал заголовок X-Client-ID, то такой же заголовок нужно передавать в запросе на скачивание файла.
curl -L -X GET 'https://gigachat.devices.sberbank.ru/api/v1/files/<идентификатор_3D_модели>/content' -o "<имя_файла>.fbx" \
-H 'Accept: application/fbx' \
-H 'X-Client-ID: <идентификатор_пользователя>' \
-H 'Authorization: Bearer <токен_доступа>'
curl -L -X GET 'https://gigachat.devices.sberbank.ru/api/v1/files/идентификатор_3D_модели/content' -o "<имя_файла>.fbx" \
-H 'Accept: application/fbx' \
-H 'Authorization: Bearer <токен_доступа>'
Для извлечения идентификатора созданной модели, вы можете использовать Python-библиотеку Beautiful Soup.
import base64
from gigachat import GigaChat
from gigachat.models import Chat, Messages, MessagesRole, Function
from bs4 import BeautifulSoup
giga = GigaChat(
credentials="<ключ_авторизации>",
# Повышение времени ожидания, так как создание модели — длительный процесс
timeout=200
)
payload = Chat(
messages=[Messages(role=MessagesRole.USER, content="Сгенерируй 3D-модель шара")],
function_call="auto",
functions=[
Function(name="text2model3d")
]
)
response = giga.chat(payload).choices[0].message.content
# Получение идентификатора файла из ответа модели
# с помощью библиотеки BeautifulSoup
file_id = BeautifulSoup(response, "html.parser").find('div').get("data-model-id")
model = giga.get_image(file_id)
# Сохранение 3D-модели в файл
with open('model.fbx', mode="wb") as fd:
fd.write(base64.b64decode(model.content))
import { GigaChat } from 'gigachat';
import * as fs from 'fs';
const giga = new GigaChat({
credentials: '<ключ_авторизации>',
// Увеличение ожидания, так как создание модели занимает время
timeout: 200,
});
const resp = await giga.chat({
messages: [
{
role: "user",
content: "Сгенерируй 3D-модель шара",
},
],
function_call: 'auto',
functions: [
{
name: 'text2model3d',
}
],
});
// Функция, выделяющая идентификатор фа йла в ответе
function detectModel(message) {
const regex = /<div\sdata-model-id="(?<uuid>.+?)"\sfuse="true"\/>(?<postfix>.*)?/ms;
const match = regex.exec(message);
if (!match || !match.groups) return null;
return {
uuid: match.groups['uuid'],
postfix: match.groups['postfix'],
};
}
const detectedModel = detectModel(resp.choices[0]?.message.content ?? '');
// Метод getImage() подходит и для скачивания 3D-моделей
const model = await giga.getImage(detectedModel.uuid);
fs.writeFile('model.fbx', model.content, 'binary', err => {
if (err) {
console.error(err);
} else {
console.log('File has been created');
}
});
Если вы используете коллекцию запросов Postman, сохраните ответ на запрос GET /files/{file_id}/content в файл с помощью опции Save response to file.
Ответ на запрос будет содержать бинарное представление файла в формате FBX.