Повноцінний backend-сервіс та інтерактивний Web UI для ведення окремих чат-сесій з OpenAI. Сервіс зберігає історію діалогів у SQLite, ізолює контекст, підтримує динамічну зміну моделі для кожного окремого повідомлення, soft-reset контексту та live-калькулятор токенів і накопиченої вартості ($).
Вбудований повнофункціональний веб-інтерфейс (Single-Page App на базі Tailwind CSS та FontAwesome без зовнішніх важких фреймворків), який роздається безпосередньо з Express:
- 📂 Керування сесіями в Sidebar: створення нових сесій із персональним
system_promptта вибором дефолтної моделі, перегляд списку сесій із live-відображенням вартості кожної. - 💬 Інтерактивний чат: підтримка багаторядкових повідомлень (
Shift+Enter), відправка заEnter, індикатор очікування відповіді моделі. - ⚡ Динамічний вибір моделі на льоту: можливість прямо у формі вводу обрати іншу модель (
gpt-4o-mini,gpt-4o,gpt-4-turbo,gpt-3.5-turbo) для конкретного запиту. - 📊 Live Cost & Token Tracker: панель у верхній частині екрана відображає сумарні токени (in/out) та точну накопичену вартість сесії в USD з точністю до 6 знаків.
- 🔄 One-Click Context Reset: кнопка скидання контексту сесії (Session ID зберігається, лічильник вартості починається з $0.00, попередня історія безпечно архівується в БД під попередньою ітерацією).
- Backend: Node.js (v18+), Express.js
- Frontend: HTML5, Tailwind CSS (CDN), FontAwesome, Vanilla JS (SPA)
- База даних: SQLite3 (з підтримкою foreign keys, індексацією
idx_messages_session_iteration_created) - LLM SDK: Офіційний
openaiNode.js SDK - Тестування: Вбудований Node.js Test Runner (
node:test,node:assert)
npm installСтворіть файл .env на основі прикладу .env.example:
cp .env.example .envВкажіть ваш дійсний ключ OpenAI:
PORT=3000
OPENAI_API_KEY=sk-...
DATABASE_PATH=./data/chat_sessions.db
DEFAULT_MODEL=gpt-4o-mininpm startВідкрийте у вашому браузері: http://localhost:3000
npm testРозрахунок вартості реалізовано в ізольованому модулі src/services/pricingService.js. Тарифи вказані за 1 000 000 токенів (згідно з публічним прайсингом OpenAI):
| Модель | Input ($ / 1M tokens) | Output ($ / 1M tokens) |
|---|---|---|
gpt-4o-mini (Default) |
$0.15 ($0.00015 / 1k) | $0.60 ($0.00060 / 1k) |
gpt-4o |
$2.50 ($0.00250 / 1k) | $10.00 ($0.01000 / 1k) |
gpt-4-turbo |
$10.00 | $30.00 |
gpt-3.5-turbo |
$0.50 | $1.50 |
Кожне повідомлення розраховується за ставкою саме тієї моделі, яка була використана при запиті.
GET /sessions— список усіх сесій для навігації.POST /sessions— створення нової сесії ({ model, title, system_prompt }).GET /sessions/:id— отримання активної історії поточної ітерації сесії та накопиченої вартості.POST /sessions/:id/messages— відправка повідомлення ({ content, model? }).POST /sessions/:id/reset— очищення активного контексту сесії (вартість = 0, ID незмінний).GET /pricing— довідник підтримуваних моделей і тарифів.GET /health— статус працездатності сервера.
Файл із готовими HTTP-запитами для IDE доступний у requests.http.
CREATE TABLE IF NOT EXISTS sessions (
id TEXT PRIMARY KEY,
title TEXT,
model TEXT NOT NULL,
system_prompt TEXT,
context_iteration INTEGER DEFAULT 1,
total_prompt_tokens INTEGER DEFAULT 0,
total_completion_tokens INTEGER DEFAULT 0,
total_tokens INTEGER DEFAULT 0,
total_cost REAL DEFAULT 0.0,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS messages (
id TEXT PRIMARY KEY,
session_id TEXT NOT NULL,
context_iteration INTEGER DEFAULT 1,
model TEXT,
role TEXT NOT NULL,
content TEXT NOT NULL,
prompt_tokens INTEGER DEFAULT 0,
completion_tokens INTEGER DEFAULT 0,
total_tokens INTEGER DEFAULT 0,
cost REAL DEFAULT 0.0,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (session_id) REFERENCES sessions(id) ON DELETE CASCADE
);
CREATE INDEX IF NOT EXISTS idx_messages_session_iteration_created
ON messages(session_id, context_iteration, created_at ASC);