Only RK

Price: 500000

Number of applications: 2

Decision acceptance deadline

02.11.26 (inclusive)

Form of award

денежное

Product status

Idea

Task type

ICT tasks

Сфера применения

Media sphere

Область задачи

Other technological solutions

Purpose and description of task (project)

Наш API-шлюз к языковым моделям ограничивает число запросов на каждый API-ключ, чтобы один клиент не расходовал общую квоту провайдера

Type of product

Software/ IS

Problem description

Сервис на FastAPI с эндпоинтом POST /v1/echo, который принимает заголовок Authorization: Bearer <key>. На каждый ключ действует лимит N запросов за T секунд по скользящему окну; состояние хранится в Redis. При превышении - ответ 429 с заголовком Retry-After. Лимиты задаются через переменные окружения Django-проект с моделями Company и Task: название, email ответственного, cycle_days, дата последнего выполнения, статус. Метод Task.is_due(days_ahead) говорит, подходит ли срок. Ежедневная задача Celery beat находит задачи со сроком в ближайшие 3 дня и отправляет каждому ответственному одно письмо-дайджест (достаточно console email backend). Повторно в тот же день письмо не уходит. Отметка «выполнено» в Django admin сдвигает следующий срок Сервис на FastAPI + PostgreSQL: • POST /jobs — создать задание (prompt и параметры), статус queued. • POST /jobs/claim — воркер атомарно забирает одно задание через SELECT … FOR UPDATE SKIP LOCKED, статус running. • POST /jobs/{id}/complete и POST /jobs/{id}/fail — результат или ошибка. • GET /jobs/{id} — статус для клиента. Плюс воркер на Python, который в цикле забирает задания и имитирует генерацию (пауза и текстовый результат). Задания, которые висят в running дольше 10 минут, возвращаются в очередь. SPA на React + TypeScript (Vite). Данные — JSON на 500+ записей, сгенерированный скриптом: время, модель, статус (200 / 429 / 500), токены на вход и выход, задержка в мс, стоимость в $. На странице: • таблица с пагинацией и сортировкой по времени, задержке и стоимости; • фильтры по модели, статусу и датам, которые сохраняются в URL; • карточки итогов: число запросов, доля ошибок, средняя задержка, сумма; • график задержки по времени (Recharts или аналог). Данные загружаются через TanStack Query с имитацией сетевой задержки.

Expected effect

Репозиторий с README и docker-compose.yml (api + redis). Тесты pytest (можно с fakeredis): лимит не превышен; превышен; окно сдвинулось; разные ключи не влияют друг на друга. Репозиторий с README и docker-compose.yml (web, db, redis, celery, beat). Тесты pytest-django на is_due и на задачу рассылки. Репозиторий с README и docker-compose.yml (db, api, 2 воркера). Тесты: два воркера не получают одно задание; переходы статусов; возврат зависших заданий. Репозиторий с README и демо на GitHub Pages или Vercel. Тесты Vitest на функции фильтрации и подсчёта итогов.

Full name of responsible person

Нижников Владимир Григорьевич

Note