В этой статье
Сначала определите, где должен жить бот. Если вам нужен помощник только внутри ChatGPT, речь идёт о Custom GPT. Если бот должен отвечать на сайте, в Telegram или работать с вашей базой пользователей, нужен отдельный сервер и OpenAI API. Названия похожи, но это разные контуры: Custom GPT не встраивается в стороннее приложение, а API-бот не появляется автоматически в каталоге GPT.
Какой вариант выбрать
Custom GPT подходит для внутреннего помощника, эксперимента или инструкции, которую вы хотите использовать в интерфейсе ChatGPT. В нём настраиваются поведение, знания и доступные возможности, а пользователь разговаривает с готовой конфигурацией внутри ChatGPT.
Внешний бот нужен, когда вы контролируете интерфейс и данные: принимаете сообщения на своём сайте, связываете ответы с профилем клиента, храните историю в базе или отправляете результат в Telegram. Здесь ваш сервер обращается к моделям через OpenAI API; подписка и пользовательский интерфейс ChatGPT для этого не используются. OpenAI отдельно описывает GPTs как помощников внутри ChatGPT, а API-интеграции — как разработанные вами приложения вне ChatGPT: GPTs in ChatGPT.
Быстрое правило выбора:
- только диалог в ChatGPT — смотрите в сторону Custom GPT;
- сайт, Telegram, своя авторизация и база данных — стройте API-бота;
- нужны оба сценария — проектируйте их отдельно, не пытаясь выдать API-бота за Custom GPT.
Если после технической настройки вам отдельно нужен доступ к зарубежному цифровому сервису, можно посмотреть каталог Amber Market. Это каталог подписок и цифровых товаров: актуальное наличие и условия проверьте перед заказом, оплатить его можно через СБП. Каталог не пополняет OpenAI API и не заменяет API key — сервер, ключ и вызовы модели настраиваются по описанной ниже схеме.
Как настроить Custom GPT
У этого маршрута есть практическое ограничение: создание нового GPT доступно не всем личным аккаунтам и зависит от текущих условий, рабочего пространства и разрешений. Поэтому сначала проверьте актуальные требования OpenAI и наличие пункта создания именно у вашего аккаунта. Мобильное приложение предназначено для использования GPT, а настройка выполняется в веб-версии. Если нужного разрешения нет, переходите к API, а не ищите несуществующий переключатель.
Если доступ есть, откройте раздел GPTs в ChatGPT и выберите Create. В редакторе можно собрать GPT диалогом или заполнить поля вручную. Минимальная настройка выглядит так:
- Name, Description и Conversation starters. Название объясняет назначение, описание задаёт ожидания, а стартовые фразы показывают пользователю хорошие первые запросы.
- Instructions. Здесь задайте роль, порядок действий, формат ответа и границы. Для многошагового сценария лучше написать условную последовательность: «если пользователь прислал X, проверь Y и верни Z». Правила поведения должны находиться именно здесь.
- Knowledge. Загрузите справочники, регламенты и документы, на которые GPT должен опираться. Файлы дают материал для ответа, но не заменяют инструкции: правило «как отвечать» хранится в Instructions, а содержание каталога — в Knowledge.
- Capabilities. При необходимости включите веб-поиск, генерацию изображений, Canvas или Code Interpreter & Data Analysis. Набор возможностей зависит от аккаунта, рабочего пространства и региона.
- Actions. Если GPT должен обращаться к внешнему API, настройте Action. GPT может использовать либо Actions, либо Apps, но не оба варианта одновременно.
После этого проверьте несколько реальных запросов в Preview: обычный вопрос, неполные входные данные и запрос за пределами роли. Посмотрите не только на вежливость текста, но и на порядок действий: использовал ли GPT нужный файл, запросил ли недостающий параметр и отказался ли от неподходящей операции. Описание полей, знаний, возможностей и проверки через Preview есть в официальной инструкции Creating and editing GPTs.
Важно не строить на Custom GPT ожидание «своего бота на сайте». GPTs предназначены для работы внутри ChatGPT. Для внешнего продукта OpenAI предлагает API, а интерфейс, авторизацию и хранение состояния вы реализуете сами.
Минимальный API-бот
У API-бота цепочка проще, чем кажется:
сообщение пользователя
↓
ваш сервер
↓
Responses API
↓
текстовый ответ
↓
сайт или Telegram
Секретный API key хранится только на сервере — в переменной окружения или менеджере секретов. Не вставляйте его в JavaScript браузера, мобильное приложение или Telegram-клиент: любой пользователь сможет извлечь ключ из клиентского кода. Базовый пример запроса и правила хранения ключа описаны в Developer quickstart и документации по аутентификации.
Ниже — небольшой серверный контур на Node.js. Он показывает границу ответственности: HTTP-обработчик получает текст, функция модели отправляет его в API, затем сервер возвращает output_text. Значение model подставьте из актуальной документации и доступных вашему проекту моделей; не зашивайте в статью или код название, которое может быть снято с доступа.
import express from "express";
import OpenAI from "openai";
const app = express();
app.use(express.json());
const openai = new OpenAI({
apiKey: process.env.OPENAI_API_KEY,
});
async function answerUser(message) {
const response = await openai.responses.create({
model: process.env.OPENAI_MODEL,
input: message,
});
return response.output_text;
}
app.post("/chat", async (req, res) => {
const message = typeof req.body.message === "string"
? req.body.message.trim()
: "";
if (!message) {
return res.status(400).json({ error: "message is required" });
}
try {
const text = await answerUser(message);
return res.json({ text });
} catch (error) {
console.error(error);
return res.status(502).json({ error: "model request failed" });
}
});
app.listen(3000, "127.0.0.1");
Это минимальный пример, а не готовая production-система. В реальном сервисе добавьте аутентификацию своего API, ограничения размера входа, обработку таймаутов и логирование без секретов. Если бот должен помнить диалог, сервер должен сам хранить контекст: например, связать userId с массивом последних сообщений или с идентификатором состояния, выбранным по актуальной документации API. Нельзя считать, что один вызов responses.create автоматически знает всю историю пользователя.
Важна и семантика повтора. Повторить запрос после сетевого обрыва легко, но вы должны понимать, успел ли сервер выполнить первую попытку. Для обычного вопроса повтор обычно терпим. Для операции, которая создаёт заказ или списывает деньги, нужны идентификатор операции и идемпотентная обработка, иначе пользователь получит два результата вместо одного.
Как добавить Telegram
Telegram в этой схеме — транспортный слой, а не отдельная версия GPT. Бот получает обновление, извлекает из него текст и chat.id, передаёт текст в ту же функцию answerUser, затем отправляет результат обратно методом sendMessage.
Упрощённая логика выглядит так:
async function handleTelegramUpdate(update) {
const message = update.message;
const text = message?.text?.trim();
const chatId = message?.chat?.id;
if (!text || !chatId) return;
const answer = await answerUser(text);
await fetch(`https://api.telegram.org/bot${process.env.TELEGRAM_BOT_TOKEN}/sendMessage`, {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({ chat_id: chatId, text: answer }),
});
}
Обновления Telegram можно получать через getUpdates или webhook, а текстовые ответы отправлять через sendMessage. Подробности параметров и формата Update находятся в Telegram Bot API. В рабочем приложении выберите один способ получения обновлений, добавьте проверку ошибок и решите, где хранить историю отдельно для каждого chat.id. Детальная настройка вебхука и деплой здесь не нужны: это следующий слой после проверки самого вызова модели.
Публичный пример на Python для этого же маршрута можно посмотреть в инструкции по GPT-боту в Telegram. Если сначала нужно создать ключ проекта, пригодится отдельная инструкция по получению API key. В обоих случаях ключ остаётся на вашем сервере.
Что проверить перед запуском
Проверьте последовательность по слоям, иначе отладка превращается в поиск иголки между Telegram и моделью:
- Локальный HTTP-эндпоинт принимает непустое сообщение и возвращает предсказуемую ошибку для неверного входа.
- Сервер видит
OPENAI_API_KEY, а ключ не попадает в репозиторий, браузерные бандлы и ответы API. - Прямой тест
answerUserвозвращает текст для выбранной моделью конфигурации. - Telegram-адаптер правильно извлекает
update.message.textиupdate.message.chat.id. - Ошибка модели или Telegram не оставляет пользователя без понятного ответа и не создаёт бесконечный цикл повторов.
- История диалога ограничена по размеру и привязана к нужному пользователю, а не хранится одной общей переменной на весь процесс.
Не называйте этот маршрут Custom GPT: это API-бот со своим сервером. И не рассчитывайте, что техническая инструкция делает использование API бесплатным — серверный вызов зависит от актуальных условий проекта и выбранной модели.
Итого: для помощника внутри ChatGPT сначала проверьте право создать Custom GPT и настройте Instructions, Knowledge и Preview. Для сайта или Telegram поднимите сервер, храните ключ в окружении, вызывайте Responses API и подключите транспортный слой. Именно разделение этих двух маршрутов экономит больше времени, чем попытка найти одну универсальную кнопку «сделать GPT-бота».
Источники
- GPTs in ChatGPTOpenAI Help Center
- Creating and editing GPTsOpenAI Help Center
- Developer quickstartOpenAI Platform
- API Reference — Authentication and backward compatibilityOpenAI Platform
- Telegram Bot APITelegram