Генерация изображений
Некоторые модели могут создавать изображения из текстовых запросов, когда вы указываете соответствующие модальности в вашем запросе.
Использование API
Для генерации изображений отправьте запрос к эндпоинту /v1/chat/completions
с параметром modalities
, установленным для включения как "image"
, так и "text"
.
Базовая генерация изображений
python
import requests
import json
url = "https://api.aitunnel.ru/v1/chat/completions"
headers = {
"Authorization": "Bearer sk-aitunnel-xxx",
"Content-Type": "application/json"
}
payload = {
"model": "gemini-2.5-flash-image-preview",
"messages": [
{
"role": "user",
"content": "Создай красивый закат над горами"
}
],
"modalities": ["image", "text"]
}
response = requests.post(url, headers=headers, json=payload)
result = response.json()
# Сгенерированное изображение будет в сообщении
if result.get("choices"):
message = result["choices"][0]["message"]
if message.get("images"):
for image in message["images"]:
image_url = image["image_url"]["url"] # Base64 data URL
print(f"Сгенерированное изображение: {image_url[:50]}...")
typescript
const url = "https://api.aitunnel.ru/v1/chat/completions";
const headers = {
"Authorization": "Bearer sk-aitunnel-xxx",
"Content-Type": "application/json"
};
const payload = {
model: "gemini-2.5-flash-image-preview",
messages: [
{
role: "user",
content: "Создай красивый закат над горами"
}
],
modalities: ["image", "text"]
};
const response = await fetch(url, {
method: "POST",
headers: headers,
body: JSON.stringify(payload)
});
const result = await response.json();
// Сгенерированное изображение будет в сообщении ассистента
if (result.choices) {
const message = result.choices[0].message;
if (message.images) {
message.images.forEach((image: any) => {
const imageUrl = image.image_url.url; // Base64 data URL
console.log(`Сгенерированное изображение: ${imageUrl.slice(0, 50)}...`);
});
}
}
Стриминговая генерация изображений
Генерация изображений также работает со стриминговыми ответами:
python
import requests
import json
url = "https://api.aitunnel.ru/v1/chat/completions"
headers = {
"Authorization": "Bearer sk-aitunnel-xxx",
"Content-Type": "application/json"
}
payload = {
"model": "gemini-2.5-flash-image-preview",
"messages": [
{
"role": "user",
"content": "Создай изображение футуристического города"
}
],
"modalities": ["image", "text"],
"stream": True
}
response = requests.post(url, headers=headers, json=payload, stream=True)
for line in response.iter_lines():
if line:
line = line.decode('utf-8')
if line.startswith('data: '):
data = line[6:]
if data != '[DONE]':
try:
chunk = json.loads(data)
if chunk.get("choices"):
delta = chunk["choices"][0].get("delta", {})
if delta.get("images"):
for image in delta["images"]:
print(f"Сгенерированное изображение: {image['image_url']['url'][:50]}...")
except json.JSONDecodeError:
continue
typescript
const url = "https://api.aitunnel.ru/v1/chat/completions";
const headers = {
"Authorization": "Bearer sk-aitunnel-xxx",
"Content-Type": "application/json"
};
const payload = {
model: "gemini-2.5-flash-image-preview",
messages: [
{
role: "user",
content: "Создай изображение футуристического города"
}
],
modalities: ["image", "text"],
stream: true
};
const response = await fetch(url, {
method: "POST",
headers: headers,
body: JSON.stringify(payload)
});
const reader = response.body?.getReader();
const decoder = new TextDecoder();
while (true) {
const { done, value } = await reader!.read();
if (done) break;
const chunk = decoder.decode(value);
const lines = chunk.split('\n');
for (const line of lines) {
if (line.startsWith('data: ')) {
const data = line.slice(6);
if (data !== '[DONE]') {
try {
const parsed = JSON.parse(data);
if (parsed.choices) {
const delta = parsed.choices[0].delta;
if (delta?.images) {
delta.images.forEach((image: any) => {
console.log(`Сгенерированное изображение: ${image.image_url.url.slice(0, 50)}...`);
});
}
}
} catch (e) {
// Игнорируем ошибки парсинга
}
}
}
}
}
Формат ответа
При генерации изображений сообщение ассистента включает поле images
, содержащее сгенерированные изображения:
json
{
"choices": [
{
"message": {
"role": "assistant",
"content": "Я создал красивое изображение заката для вас.",
"images": [
{
"type": "image_url",
"image_url": {
"url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA..."
}
}
]
}
}
]
}
Формат изображения
- Формат: Изображения возвращаются как base64-кодированные data URL
- Типы: Обычно формат PNG (
data:image/png;base64,
) - Несколько изображений: Некоторые модели могут генерировать несколько изображений в одном ответе
- Размер: Размеры изображений варьируются в зависимости от возможностей модели
Лучшие практики
- Четкие промпты: Предоставляйте детальные описания для лучшего качества изображений
- Выбор модели: Выбирайте модели, специально разработанные для генерации изображений
- Обработка ошибок: Проверяйте наличие поля
images
в ответах перед обработкой - Хранение: Подумайте о том, как вы будете обрабатывать и хранить данные изображений в формате base64
Устранение неполадок
Нет изображений в ответе?
- Проверьте, что вы включили
"modalities": ["image", "text"]
в ваш запрос - Убедитесь, что ваш промпт запрашивает генерацию изображения
Примеры использования
Создание художественных изображений
python
payload = {
"model": "gemini-2.5-flash-image-preview",
"messages": [
{
"role": "user",
"content": "Создай абстрактную картину в стиле Кандинского с яркими цветами"
}
],
"modalities": ["image", "text"]
}
Генерация иллюстраций для контента
python
payload = {
"model": "gemini-2.5-flash-image-preview",
"messages": [
{
"role": "user",
"content": "Создай простую иллюстрацию для статьи о возобновляемой энергии: солнечные панели и ветряки на зеленом холме"
}
],
"modalities": ["image", "text"]
}
Совет
Для получения лучших результатов используйте детальные описания, включая стиль, цвета, композицию и настроение изображения.