PlatformaAI is a multi-model AI workspace built on Next.js 15. It combines chat, file-assisted prompts, web search, billing, organization controls, and optional Telegram/SSO access in one application.
- Unified chat UI with OpenRouter-backed model selection
- File uploads with text extraction for PDF, DOCX, CSV, TXT, and image attachments
- Optional web search enrichment in chat requests
- Image understanding flow for uploaded images via
/api/ai/image - Prompt library, model catalog, billing, pricing, settings, profile, org, timeline, events, audit, and admin pages
- Organization features: invites, RBAC, cost centers, model policy, DLP policy, SCIM tokens
- Telegram bot and Telegram account linking
- Payment-provider layer for subscriptions, included monthly credits, and top-up refill flows
| Layer | Technology |
|---|---|
| App | Next.js 15 App Router, React 19, TypeScript |
| Styling | Tailwind CSS 4 |
| Auth | Auth.js / NextAuth v5 beta, credentials, optional SSO and Telegram |
| Database | PostgreSQL, Prisma |
| AI | OpenRouter |
| Payments | YooKassa-ready provider layer |
| Bot | Telegraf |
| Tests | Vitest, Playwright |
src/
app/ Next.js pages and route handlers
components/ UI building blocks
lib/ domain logic and integrations
bot/ Telegram bot entrypoint
prisma/ schema, migrations, seed
tests/ unit and e2e coverage
docs/ deployment and API notes
Source-of-truth files when updating docs:
package.jsonfor scripts and tooling.env.exampleandsrc/lib/env.tsfor environment contractsrc/appandsrc/app/apifor pages and HTTP surfacedocker-compose.ymlandDockerfilefor deployment behavior
git clone https://github.com/dontnikolay/platformaai.git
cd platformaai
cp .env.example .env.local
docker compose up -d postgres
npm install
npm run prisma:generate
npm run prisma:migrate
npm run prisma:seed
npm run devLocal PostgreSQL defaults use port 5433, matching .env.example.
If you are creating or editing migrations locally, use npm run prisma:migrate:dev;
npm run prisma:migrate applies existing migrations in a production-safe way.
Required for app startup:
DATABASE_URLAUTH_SECRETNEXTAUTH_URLNEXT_PUBLIC_APP_URLOPENROUTER_API_KEYUNISENDER_API_KEYYOOKASSA_SHOP_ID,YOOKASSA_SECRET_KEYYOOKASSA_RETURN_URL
Optional by feature:
APP_URLUNISENDER_SENDER_EMAIL,UNISENDER_SENDER_NAMEOPENAI_API_KEY,WHISPER_MODEL,WHISPER_LANGUAGETELEGRAM_BOT_TOKEN,TELEGRAM_LOGIN_BOT_NAME,NEXT_PUBLIC_TELEGRAM_LOGIN_BOT_NAME,NEXT_PUBLIC_TELEGRAM_AUTH_ENABLEDNEXT_PUBLIC_TEMP_ACCESS_ENABLED,TEMP_ACCESS_TOKEN,TEMP_ACCESS_EMAIL,TEMP_ACCESS_ROLESSO_ISSUER,SSO_CLIENT_ID,SSO_CLIENT_SECRET,SSO_NAME,NEXT_PUBLIC_SSO_ENABLEDCRON_SECRET,BILLING_REFILL_TOKENAUTH_BYPASS,AUTH_BYPASS_EMAIL,AUTH_BYPASS_ROLE,AUTH_BYPASS_BALANCE- Audit and moderation flags from
.env.example
Validation rules are enforced in src/lib/env.ts.
npm run dev
npm run build
npm run start
npm run lint
npm test
npm run test:e2e
npm run bot:dev
npm run prisma:generate
npm run prisma:migrate
npm run prisma:migrate:dev
npm run prisma:seedPublic entry routes:
/login/pricing/share/[token]/invite/accept?token=...
Authenticated app routes:
//models/prompts/billing/settings/profile/org/timeline/events/audit/admin
/api/ai/api/auth/api/billing/api/chats/api/events/api/files/api/internal/api/me/api/messages/api/models/api/org/api/prompts/api/scim/api/telegram
- Deployment: docs/deployment/self-hosted.md
- Operations: docs/deployment/operations.md
- Docs index: docs/README.md
- Current web login UI uses email and password. SSO and Telegram are optional and env-driven.
- Temporary access is optional and only appears when
NEXT_PUBLIC_TEMP_ACCESS_ENABLED=1andTEMP_ACCESS_TOKENare set. - The root app route
/requires a valid session and redirects unauthenticated users to/login?mode=signin. - Private dashboard pages redirect unauthenticated users to
/login?mode=signin; role-gated pages may still show access-denied states for signed-in users without enough privileges. /api/ai/imagecurrently describes uploaded images; it is not a general image generation endpoint.- Internal protected endpoints use the
x-cron-secretheader whenCRON_SECRETis configured.
PlatformaAI — это мультимодельное AI-приложение на Next.js 15. В нём объединены чат, работа с файлами, веб-поиск, биллинг, организационные политики и опциональные Telegram/SSO-сценарии доступа.
- Единый чат с выбором моделей через OpenRouter
- Загрузка файлов с извлечением текста из PDF, DOCX, CSV, TXT и изображений
- Опциональное веб-поисковое обогащение запроса в чате
- Режим описания загруженных изображений через
/api/ai/image - Страницы промптов, моделей, биллинга, тарифов, настроек, профиля, организации, ленты, событий, аудита и админки
- Организационные возможности: приглашения, RBAC, cost centers, model policy, DLP policy, SCIM tokens
- Telegram-бот и привязка Telegram-аккаунта
- Платежный слой под YooKassa, включенные месячные кредиты и пополнение баланса
| Слой | Технология |
|---|---|
| App | Next.js 15 App Router, React 19, TypeScript |
| Стили | Tailwind CSS 4 |
| Auth | Auth.js / NextAuth v5 beta, credentials, опциональные SSO и Telegram |
| База | PostgreSQL, Prisma |
| AI | OpenRouter |
| Платежи | YooKassa-ready payment layer |
| Бот | Telegraf |
| Тесты | Vitest, Playwright |
src/
app/ страницы Next.js и route handlers
components/ UI-компоненты
lib/ бизнес-логика и интеграции
bot/ точка входа Telegram-бота
prisma/ схема, миграции, seed
tests/ unit и e2e тесты
docs/ deployment и API-документация
Файлы-источники правды для документации:
package.jsonдля команд и tooling.env.exampleиsrc/lib/env.tsдля env-контрактаsrc/appиsrc/app/apiдля страниц и HTTP surfacedocker-compose.ymlиDockerfileдля deployment-поведения
git clone https://github.com/dontnikolay/platformaai.git
cd platformaai
cp .env.example .env.local
docker compose up -d postgres
npm install
npm run prisma:generate
npm run prisma:migrate
npm run prisma:seed
npm run devЛокальный PostgreSQL по умолчанию работает на порту 5433, как и в .env.example.
Если вы создаете или меняете миграции локально, используйте npm run prisma:migrate:dev;
npm run prisma:migrate применяет уже существующие миграции безопасным для production способом.
Нужны для старта приложения:
DATABASE_URLAUTH_SECRETNEXTAUTH_URLNEXT_PUBLIC_APP_URLOPENROUTER_API_KEYUNISENDER_API_KEYYOOKASSA_SHOP_ID,YOOKASSA_SECRET_KEYYOOKASSA_RETURN_URL
Опциональны по включаемым функциям:
APP_URLUNISENDER_SENDER_EMAIL,UNISENDER_SENDER_NAMEOPENAI_API_KEY,WHISPER_MODEL,WHISPER_LANGUAGETELEGRAM_BOT_TOKEN,TELEGRAM_LOGIN_BOT_NAME,NEXT_PUBLIC_TELEGRAM_LOGIN_BOT_NAME,NEXT_PUBLIC_TELEGRAM_AUTH_ENABLEDNEXT_PUBLIC_TEMP_ACCESS_ENABLED,TEMP_ACCESS_TOKEN,TEMP_ACCESS_EMAIL,TEMP_ACCESS_ROLESSO_ISSUER,SSO_CLIENT_ID,SSO_CLIENT_SECRET,SSO_NAME,NEXT_PUBLIC_SSO_ENABLEDCRON_SECRET,BILLING_REFILL_TOKENAUTH_BYPASS,AUTH_BYPASS_EMAIL,AUTH_BYPASS_ROLE,AUTH_BYPASS_BALANCE- Флаги аудита и moderation из
.env.example
Правила валидации заданы в src/lib/env.ts.
npm run dev
npm run build
npm run start
npm run lint
npm test
npm run test:e2e
npm run bot:dev
npm run prisma:generate
npm run prisma:migrate
npm run prisma:migrate:dev
npm run prisma:seedПубличные входные маршруты:
/login/pricing/share/[token]/invite/accept?token=...
Маршруты приложения с обязательной сессией:
//models/prompts/billing/settings/profile/org/timeline/events/audit/admin
/api/ai/api/auth/api/billing/api/chats/api/events/api/files/api/internal/api/me/api/messages/api/models/api/org/api/prompts/api/scim/api/telegram
- Deployment: docs/deployment/self-hosted.md
- Operations: docs/deployment/operations.md
- Индекс docs: docs/README.md
- Текущий веб-логин использует email и пароль. SSO и Telegram подключаются через env.
- Temporary access включается только при
NEXT_PUBLIC_TEMP_ACCESS_ENABLED=1и наличииTEMP_ACCESS_TOKEN. - Корневой маршрут приложения
/требует активную сессию и редиректит неавторизованных пользователей на/login?mode=signin. - Приватные dashboard-страницы редиректят неавторизованных пользователей на
/login?mode=signin; role-based страницы могут дополнительно показыватьaccess deniedуже для вошедшего пользователя без нужных прав. /api/ai/imageсейчас описывает загруженные изображения, а не является общим image generation endpoint.- Защищённые внутренние endpoints используют заголовок
x-cron-secret, если заданCRON_SECRET.
Private repository.