Skip to content

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

3 Commits

Folders and files

Repository files navigation

OpenAI Chat Sessions & Cost Tracker (Node.js & Express + Web Chat UI)

Повноцінний backend-сервіс та інтерактивний Web UI для ведення окремих чат-сесій з OpenAI. Сервіс зберігає історію діалогів у SQLite, ізолює контекст, підтримує динамічну зміну моделі для кожного окремого повідомлення, soft-reset контексту та live-калькулятор токенів і накопиченої вартості ($).


🎨 Що зроблено в межах Creative Challenge (Interactive Web Chat UI)

Вбудований повнофункціональний веб-інтерфейс (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: Офіційний openai Node.js SDK
  • Тестування: Вбудований Node.js Test Runner (node:test, node:assert)

🚀 Інструкція із запуску

1. Встановлення залежностей

npm install

2. Налаштування змінних оточення

Створіть файл .env на основі прикладу .env.example:

cp .env.example .env

Вкажіть ваш дійсний ключ OpenAI:

PORT=3000
OPENAI_API_KEY=sk-...
DATABASE_PATH=./data/chat_sessions.db
DEFAULT_MODEL=gpt-4o-mini

3. Запуск сервісу та відкриття Web UI

npm start

Відкрийте у вашому браузері: http://localhost:3000

4. Запуск автоматичних тестів

npm test

💰 Моделі, ставки та розрахунок вартості (Pricing)

Розрахунок вартості реалізовано в ізольованому модулі 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

Формула розрахунку:

$$\text{Total Cost} = \left(\frac{\text{Prompt Tokens}}{1,000,000} \times \text{Input Rate}\right) + \left(\frac{\text{Completion Tokens}}{1,000,000} \times \text{Output Rate}\right)$$

Кожне повідомлення розраховується за ставкою саме тієї моделі, яка була використана при запиті.


📡 REST API Документація

  • 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.


🗄 Схема Бази Даних (SQLite)

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);

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages