Инженерный стенд. Мы построили эту платформу целиком — от бэкенда на Flask до биллинга и мультиязычного фронта — и оставили её как витрину четырёх вещей, которые чаще всего просят в заказах на AI-сервисы.
Нажмите — вопрос уйдёт на наш работающий бэкенд, ответ модели пойдёт словами по мере генерации (Server-Sent Events, без буферизации на nginx). Кнопки ниже переключают язык стенда и задают движку язык ответа: базовое правило платформы «отвечать на языке вопроса» они усиливают отдельной инструкцией в системном промпте — так ответ не сваливается в чужой язык на коротких или смешанных вопросах.
Кошелёк с внутренней валютой: каждый вопрос списывает 1 ◆, пополнение идёт начислениями (покупка, реферал, ежедневный бонус), каждое движение пишется отдельной строкой в журнал — баланс всегда можно пересобрать из истории.
crystal_ledgerСчётчик на этой странице живёт в браузере и просто повторяет боевую механику. В работающей платформе баланс и журнал лежат в PostgreSQL, списание идёт транзакцией на стороне сервера, и при нехватке средств запрос до модели не доходит вообще.
Одна модель — одна точка отказа: кончилась квота или провайдер лёг, и сервис молчит. Здесь запрос идёт по цепочке: ключи перебираются по очереди, при лимите или ошибке подхватывает следующий, последним стоит другой поставщик целиком. Пользователь этого не видит — поток просто продолжается.
Правило, которое мы вынесли отсюда в другие проекты: лучше ответ от запасного поставщика, чем честное «сервис недоступен». И наоборот — заведомо мёртвое звено из цепочки надо вынимать, иначе оно съедает секунды на каждом запросе.
| Слой | Как сделано |
|---|---|
| Бэкенд | Python / Flask под gunicorn, systemd-юнит с автоперезапуском и лимитом памяти |
| Данные | PostgreSQL, 34 таблицы: пользователи, кошелёк и журнал операций, заказы, комнаты, реферальная механика, кэш предсказаний, антифрод |
| Потоковая отдача | SSE, proxy_buffering off + X-Accel-Buffering: no — иначе nginx копит ответ и «стриминг» превращается в паузу |
| Языки | Свой словарь ru / en / es на весь интерфейс; язык ответа модели идёт за языком вопроса |
| Защита | Ограничение частоты на запрос (10/мин, 60/час), лимит одновременных соединений с IP, антифрод-проверки, страница обслуживания на 502/503/504 |
| Голос | Отдельный маршрут синтеза речи со своим лимитом |
| Совместные комнаты | Общая сессия по ссылке: несколько человек видят один и тот же поток ответов |