Генерация изображений
Полный список моделей можно посмотреть на странице Модели или получить динамически через API эндпоинты: https://openai.bothub.chat/v1/images/models и https://bothub.chat/api/v2/replicate/v1/models
Для генерации изображений в BotHub используется единая экосистема шлюзов. Вы можете работать как с моделями через OpenAI совместимые шлюзы, так и через наш кастомный шлюз Replicate.
Интеграция выполняется через три различных эндпоинта в зависимости от задачи и выбранной модели:
Варианты интеграции
- OpenAI Generate Images API (
/v1/images/generations) — используется для генерации изображений на основе промпта и входных параметров - OpenAI Edit Images API (
/v1/images/edits) — используется для генерации изображений на основе других изображений (для моделей, поддерживающих входные данные в виде изображений) - Кастомный шлюз Replicate API (
/replicate/v1/images/generations) — выделенный шлюз BotHub для работы с моделями Replicate. Все кастомные параметры передаются в объектеinputбез изменений.
1. OpenAI Generation Images API
Используется для генерации изображений по промпту и входным параметрам. Промпт передается в свойстве prompt тела запроса, модель - в свойстве model.
Некоторые модели поддерживают или требуют в качестве обязательного параметра входное изображение. Поддержку передачи входного изображения и обязательность его наличия можно проверить по свойствам модели supports_image_input и requires_image_input в ответе на запрос к эндпоинту https://openai.bothub.chat/v1/images/models
Формат ответа (b64_json или url) определяется полем response_format. Дефолтным значением является b64_json.
Список специфичных для модели входных параметров доступен при запросе через API эндпоинт https://openai.bothub.chat/v1/images/models в свойстве params модели.
Пример запроса
- JS
- Python
- Go
- cURL
import OpenAI from 'openai';
const openai = new OpenAI({
apiKey: 'ВАШ_API_КЛЮЧ_BOTHUB',
baseURL: 'https://openai.bothub.chat/v1'
});
async function main() {
const response = await openai.images.generate({
model: "gemini-2.5-flash-image",
prompt: "Нарисуй милого рыжего кота",
response_format: "url",
});
console.log(response);
}
main();
from openai import OpenAI
client = OpenAI(
api_key='ВАШ_API_КЛЮЧ_BOTHUB',
base_url='https://openai.bothub.chat/v1'
)
response = client.images.generate(
model='gemini-2.5-flash-image',
prompt="Нарисуй милого рыжего кота",
response_format="url",
)
print(response)
package main
import (
"context"
"encoding/json"
"fmt"
"github.com/openai/openai-go"
"github.com/openai/openai-go/option"
)
func main() {
client := openai.NewClient(
option.WithAPIKey("ВАШ_API_КЛЮЧ_BOTHUB"),
option.WithBaseURL("https://openai.bothub.chat/v1"),
)
response, err := client.Images.Generate(context.Background(), openai.ImageGenerateParams{
Model: openai.ImageModel("gemini-2.5-flash-image"),
Prompt: "Нарисуй милого рыжего кота",
ResponseFormat: openai.ImageGenerateParamsResponseFormatURL,
})
if err != nil {
panic(err)
}
b, err := json.MarshalIndent(response, "", " ")
if err != nil {
panic(err)
}
fmt.Println(string(b))
}
curl https://openai.bothub.chat/v1/images/generations \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ВАШ_API_КЛЮЧ_BOTHUB" \
-d '{
"model": "gemini-2.5-flash-image",
"prompt": "Нарисуй милого рыжего кота",
"response_format": "url"
}'
Пример ответа:
{
"created": 1781041942,
"data": [
{
"url": "https://32b76580-04bc-45a6-83c4-37b3a03f1877.selstorage.ru/production-timeweb/images/ba990baf-eaeb-4ea0-885e-21bc00950af2.png"
}
],
usage: {
input_tokens: 17,
input_tokens_details: { text_tokens: 17, image_tokens: 0 },
output_tokens: 1302,
output_tokens_details: { text_tokens: 12, image_tokens: 1290 },
total_tokens: 1319
}
}
2. OpenAI Edits Images API
Используется для генерации на основе входных изображений. Поддерживается только для моделей, принимающих изображения в качестве входного параметра. Поддержку передачи входного изображения можно проверить по свойствам модели supports_image_input и requires_image_input в ответе на запрос к эндпоинту https://openai.bothub.chat/v1/images/models.
Эндпоинт ожидает тело запроса в виде multipart/form-data. Входящие изображения передаются в поле image в binary формате.
Формат ответа (b64_json или url) определяется полем response_format. Дефолтным значением является b64_json.
Список специфичных для модели входных параметров доступен при запросе через API эндпоинт: https://openai.bothub.chat/v1/images/models в свойстве params модели.
Пример запроса
- JS
- Python
- Go
- cURL
import OpenAI, {toFile} from 'openai';
const openai = new OpenAI({
apiKey: 'ВАШ_API_КЛЮЧ_BOTHUB',
baseURL: 'https://openai.bothub.chat/v1'
});
async function main() {
const image = await toFile(fs.createReadStream("input.png"), "input.png", {
type: "image/png",
});
const response = await openai.images.edit({
model: "gemini-2.5-flash-image",
prompt: "Измени цвет котика на черный",
image,
response_format: "url",
});
console.log(response);
}
main();
from openai import OpenAI
client = OpenAI(
api_key='ВАШ_API_КЛЮЧ_BOTHUB',
base_url='https://openai.bothub.chat/v1'
)
with open("input.png", "rb") as image:
response = client.images.edit(
model="gemini-2.5-flash-image",
prompt="Измени цвет котика на черный",
image=("input.png", image, "image/png"),
response_format="url",
)
print(response)
package main
import (
"context"
"encoding/json"
"fmt"
"os"
"github.com/openai/openai-go"
"github.com/openai/openai-go/option"
)
func main() {
client := openai.NewClient(
option.WithAPIKey("ВАШ_API_КЛЮЧ_BOTHUB"),
option.WithBaseURL("https://openai.bothub.chat/v1"),
)
file, err := os.Open("input.png")
if err != nil {
panic(err)
}
defer file.Close()
response, err := client.Images.Edit(context.Background(), openai.ImageEditParams{
Model: openai.ImageModel("gemini-2.5-flash-image"),
Prompt: "Измени цвет котика на черный",
Image: openai.File(file, "input.png", "image/png"),
ResponseFormat: openai.ImageEditParamsResponseFormatURL,
})
if err != nil {
panic(err)
}
b, err := json.MarshalIndent(response, "", " ")
if err != nil {
panic(err)
}
fmt.Println(string(b))
}
curl https://openai.bothub.chat/v1/images/edits \
-H "Authorization: Bearer ВАШ_API_КЛЮЧ_BOTHUB" \
-F 'model=gemini-2.5-flash-image' \
-F 'prompt=Измени цвет котика на черный' \
-F 'response_format=url' \
-F 'image=@image.png;type=image/png'
Пример ответа:
{
created: 1785408240,
data: [
{
url: 'https://32b76580-04bc-45a6-83c4-37b3a03f1877.selstorage.ru/production-timeweb/images/b16b5ae4-8b4a-4d4b-af43-a02472ac449d.png'
}
],
usage: {
input_tokens: 265,
input_tokens_details: { text_tokens: 265, image_tokens: 0 },
output_tokens: 1308,
output_tokens_details: { text_tokens: 18, image_tokens: 1290 },
total_tokens: 1573
}
}
3. Кастомный шлюз Replicate API
Поскольку архитектура Replicate принципиально отличается от OpenAI, для работы с этими моделями (например, flux-2-max) также существует прямой HTTP-шлюз по адресу https://bothub.chat/api/v2/replicate/v1/images/generations.
Все специфичные для конкретной модели параметры передаются внутри объекта input в неизменном виде. Официальные SDK Replicate или OpenAI для этого эндпоинта использовать нельзя. Мы так же проксируем ссылку ответа чтобы вы имели доступ к конт енту без ВПН
В теле запроса вы можете передать необязательный объект bothub для настройки прокси:
include_usage(boolean) — возвращает объектusageс информацией о затраченных капсах платформы.return_base64(boolean) — еслиtrue, шлюз вернет изображение в виде Base64-строки вместо ссылки.
Поддерживаемые параметры необходимо уточнять у конкретной модели.
Пример запроса
- JS
- Python
- Go
- cURL
async function main() {
const response = await fetch(
'https://bothub.chat/api/v2/replicate/v1/images/generations',
{
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: 'Bearer ВАШ_API_КЛЮЧ_BOTHUB',
},
body: JSON.stringify({
model: 'flux-2-max',
input: {
prompt: 'Ретро-автомобиль в пустыне, стиль 80-х, фотореализм',
aspect_ratio: '16:9',
output_format: 'png',
output_quality: 90,
},
bothub: {
include_usage: true,
return_base64: false,
},
}),
},
);
const result = await response.json();
const url = result.url;
console.log(url);
}
main();
import requests
url = "https://bothub.chat/api/v2/replicate/v1/images/generations"
headers = {
"Content-Type": "application/json",
"Authorization": "Bearer ВАШ_API_КЛЮЧ_BOTHUB"
}
data = {
"model": "flux-2-max",
"input": {
"prompt": "Ретро-автомобиль в пустыне, стиль 80-х, фотореализм",
"aspect_ratio": "16:9",
"output_format": "png",
"output_quality": 90,
},
"bothub": {
"include_usage": True,
"return_base64": False
}
}
response = requests.post(url, json=data, headers=headers)
result = response.json()
url = result.get('url')
print(url)
package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
)
func main() {
payload := map[string]any{
"model": "flux-2-max",
"input": map[string]any{
"prompt": "Ретро-автомобиль в пустыне, стиль 80-х, фотореализм",
"aspect_ratio": "16:9",
"output_format": "png",
"output_quality": 90,
},
"bothub": map[string]any{
"include_usage": true,
"return_base64": false,
},
}
body, err := json.Marshal(payload)
if err != nil {
panic(err)
}
req, err := http.NewRequest("POST", "https://bothub.chat/api/v2/replicate/v1/images/generations", bytes.NewReader(body))
if err != nil {
panic(err)
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "Bearer ВАШ_API_КЛЮЧ_BOTHUB")
resp, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
data, err := io.ReadAll(resp.Body)
if err != nil {
panic(err)
}
var result map[string]any
if err := json.Unmarshal(data, &result); err != nil {
panic(err)
}
fmt.Println(result["url"])
}
curl https://bothub.chat/api/v2/replicate/v1/images/generations \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ВАШ_API_КЛЮЧ_BOTHUB" \
-d '{
"model": "flux-2-max",
"input": {
"prompt": "Ретро-автомобиль в пустыне, стиль 80-х, фотореализм",
"aspect_ratio": "16:9",
"output_format": "png"
},
"bothub": {
"include_usage": true,
"return_base64": false
}
}'
Пример ответа:
{
"url": "https://32b76580-04bc-45a6-83c4-37b3a03f1877.selstorage.ru/production-timeweb/images/b7e1ecee-0d89-44eb-b801-7a43e50dbfa0.png",
"usage": {
"bothub": {
"caps": 71199.648
}
}
}