О проекте
Команда: K14
Кейс HackAlem.ai: Торговля — Электрокомплект · ekt.kz
Стадия: Рабочий MVP
Задача кейса: AI-консультант по каталогу ekt.kz: товары, аналоги, цены, остатки, корзина
Суть
Витрина на React с AI-консультантом по каталогу ekt.kz: поиск по SKU и тексту, ответы по живым ценам и остаткам из EKT API, вложения (PDF/DOCX/XLSX/фото), аналоги и безопасное предложение добавить товар в корзину.
Как устроено
Сервер синхронизирует страницы каталога из реального EKT API (Basic Auth, LiveEktResponseMapper) в PostgreSQL с FTS и JSONB-характеристиками. ChatService сначала прогоняет запрос через детерминированный роутер, затем ResponsesConsultant (OpenAI Responses API) классифицирует запрос и формирует ответ по свежим фактам из CatalogService; ID товаров и ссылки проверяются сервером. Изменение корзины идёт только через pending offer с offer_id, явным подтверждением, повторной проверкой цены/остатка и ключом идемпотентности. Вложения разбираются локально (OCR Tesseract) и в модель не передаются.
Ключевые решения
- OpenAI Responses API
- PostgreSQL FTS
- JSONB-поиск по характеристикам
- детерминированный роутер диалога
- grounded-ответы с серверной проверкой ID
- pending offer + idempotency key
- Tesseract OCR
- правила совместимости аналогов
- Alembic-миграции
Особенности
Жёсткое разделение ответственности: модель не управляет корзиной, подтверждение — отдельный endpoint с идемпотентностью; вложения не уходят в LLM; честная таблица статуса интеграций (корзина и правила аналогов не подключены, данные не выдумываются). Реальная интеграция с API EKT, 8 миграций, много тестов и UI-аудит со скриншотами.
Стек
Python · FastAPI · PostgreSQL · SQLAlchemy · Alembic · React · TypeScript · Vite · Nginx · Docker Compose
Модели
OpenAI Responses API · gpt-6-luna
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-4cfe9779-k14.
README
README.mdekt.kz Product Assistant
Безопасный MVP AI-ассистента для товарного каталога
Быстрый старт · Возможности · Статус интеграций · Документация
[!IMPORTANT] В
mainобъединены витрина React, FastAPI, ИИ-консультант и реальный API каталога EKT. Это отдельный локальный прототип, а не установленный чат действующего ekt.kz. Реальная корзина, утверждённые правила аналогов и условия покупки пока недоступны. Сервер не подменяет реальный каталог демонстрационными данными; отдельный CLI и явно включаемый автономный режим витрины содержат демоданные.
Что это такое
ekt.kz Product Assistant — витрина с чат-консультантом для поиска электротехнических товаров. Сервер получает товары, изображения, цены и остатки из EKT, а модель классифицирует запрос и формирует ответ по свежим фактам. Поиск, проверка данных и подтверждение предложения остаются в backend; модель не управляет корзиной.
В проект входят web (React/TypeScript/Vite), app (FastAPI/PostgreSQL) и общий ИИ-модуль src/hack_4cfe9779_k14. ResponsesConsultant использует общие схемы Query/Draft и инструкции CLI через асинхронный OpenAI Responses API; модель по умолчанию — gpt-6-luna.
Витрина: запуск и контракт API · Отчёт о проверке интеграции · Отдельный CLI.
Возможности
| Возможность | Как это устроено | |
|---|---|---|
| 💬 | Сессионный диалог | История изолирована по chat session; follow-up вопрос использует только контекст своей сессии. |
| 🔎 | Каталог и поиск | Точный SKU имеет приоритет над текстовым поиском; индекс PostgreSQL поддерживает FTS и JSONB-характеристики. |
| 🧭 | Grounded-ответы | Модель получает свежие факты через CatalogService; ID товаров, источников и ссылки ответа проверяются сервером. |
| 📎 | Вложения | PDF, DOCX, XLSX, JPEG и PNG проходят проверку формата и извлечение данных; содержимое и извлечённые строки обрабатываются локально и не передаются модели. |
| 🛒 | Безопасный pending offer | Изменение корзины требует отдельного offer_id, явного подтверждения, свежей проверки и ключа идемпотентности. |
| 🔌 | Заменяемые интеграции | Catalog, LLM, cart, правила аналогов и условия покупки вынесены в независимые service/adapter boundaries. |
Статус интеграций
| Компонент | Сейчас | Настройка / ограничение |
|---|---|---|
| Витрина | 🟢 React-интерфейс с каталогом, поиском, чатом, файлами и предложениями. | Compose запускает web на порту 8080. |
| Каталог ekt.kz | 🟢 LiveEktResponseMapper и Basic Auth работают с реальными list/detail ответами. | Нужны EKT_API_USERNAME и EKT_API_PASSWORD; без них источник недоступен. |
| Поиск | 🟢 PostgreSQL-индекс, точный SKU, текстовый поиск, страницы каталога. | При старте по умолчанию пять страниц; поиск охватывает только загруженную часть. |
| ИИ | 🟢 Responses API: классификация и ответ по данным сервера. | Нужен OPENAI_API_KEY; модель задаёт OPENAI_MODEL. Прежний LLM_API_* адаптер остаётся альтернативой для классификации. |
| Корзина | 🔴 Создание предложения и его подтверждение реализованы. Настоящая корзина EKT пока не подключена. | Предоставлен API каталога, но нет подтверждённой документации и доступа для операций с корзиной посетителя. После их получения нужно реализовать и проверить подключение корзины. |
| Аналоги | 🟡 Алгоритм проверки совместимости реализован и протестирован. | Правила отключены до утверждения параметров взаимозаменяемости партнёром. |
| Условия покупки и сертификаты | 🔴 Утверждённые условия не предоставлены; сертификаты отсутствуют в проверенном API. | Нужны подтверждённые источники; отсутствующие сведения не выдумываются. |
Почему это важно?
Семантическое сходство не означает совместимость, а правдоподобный текст LLM не является данными каталога. Поэтому неизвестные сведения не заполняются предположениями: отсутствие поля, null, 0 и пустой список остаются различимыми во внутренней модели.
Архитектура
Текущая реализация: отдельная React-витрина, FastAPI и PostgreSQL. ИИ вызывается из API; отдельного сервера модели в Compose нет. Схема показывает вызовы и зависимости, а не порядок выполнения одного запроса.
flowchart TB
Web["React-витрина и чат"] --> Proxy["Nginx в Docker / Vite в разработке"]
Proxy --> API["FastAPI routes"]
API --> Chat["ChatService"]
API --> Catalog["CatalogService"]
API --> Files["AttachmentService: локальное извлечение и OCR"]
API --> Offers["OfferService: создание и подтверждение"]
Chat --> Router["DeterministicDialogueRouter"]
Chat --> Model["Серверный LLM-клиент при настройке"]
Model --> LLM["Внешний API модели"]
Chat --> Catalog
Chat -->|"только создание предложения"| Offers
Offers -->|"CatalogCurrentProductProvider"| Catalog
Catalog --> EKT["EktCatalogAdapter → EktClient → EKT API"]
Offers --> Cart["UnavailableCartGateway: cart_unavailable"]
Chat --> Repos["SQLAlchemy repositories"]
Catalog --> Repos
Offers --> Repos
Files -->|"routes сохраняют результат загрузки"| Repos
Repos --> DB[("PostgreSQL")]
EktClientвыполняет HTTP-запросы с серверным Basic Auth и разбирает ответы черезLiveEktResponseMapper. Поиск использует индекс; цена и остатки для ответа и подтверждения запрашиваются заново черезCatalogService.ChatServiceиспользует детерминированный роутер и при необходимости модель.OPENAI_API_KEYвключаетResponsesConsultantс OpenAI Responses API; альтернативныйOpenAICompatibleLLMClientтолько классифицирует запросы. Без конфигурации используетсяUnavailableLLMClient.- Загрузка вложения и сообщение — отдельные запросы. Routes сохраняют извлечённые данные через
ChatAttachmentRepository; чат читает их поattachment_idsи разбирает локально черезAttachmentItemParser. Вложения и связанные сообщения модели не передаются. OfferProposalCreator— интерфейс создания предложения, реализованныйOfferService, а не отдельный сервис. Подтверждение вызывает только отдельный API endpoint. Реальный gateway корзины отсутствует; аналоги и условия покупки используют недоступные по умолчанию правила/источники.
Подробная архитектура и реальные маршруты.
Быстрый старт
Docker Compose — рекомендуемый путь
cp -n .env.example .env # Не перезаписывайте уже заполненный файл.
# Заполните .env по таблице ниже, затем:
docker compose up -d --build
Нужны Docker Engine и Compose v2. Настройки задаются только в локальном .env:
| Переменная | Назначение |
|---|---|
POSTGRES_PASSWORD | Пароль локальной БД; замените пример своим значением. |
EKT_API_USERNAME, EKT_API_PASSWORD | Серверный Basic Auth каталога EKT. |
OPENAI_API_KEY | Ключ для ИИ; не помещать в Git или VITE_*. |
OPENAI_MODEL | По умолчанию gpt-6-luna. |
CATALOG_SYNC_PAGES | Число страниц начального индекса; по умолчанию 5. |
С пустыми EKT-полями синхронизация пропускается, API запускается без доступного источника каталога. Без настроенной модели остаются детерминированные сценарии по артикулу и локальная обработка файлов. Неверные непустые credentials или недоступный EKT при начальной синхронизации могут остановить запуск API; проверьте конфигурацию и повторите запуск.
После старта:
| Сервис | Адрес |
|---|---|
| Витрина и чат | http://127.0.0.1:8080 |
| Swagger UI | http://localhost:8000/docs |
| Healthcheck | http://localhost:8000/health |
curl http://localhost:8000/health
# {"status":"ok","database":"ok"}
Остановить контейнеры:
docker compose down
Для удаления локальных данных PostgreSQL используйте docker compose down -v.
[!NOTE] Compose поднимает
db,apiиweb. API применяет восемь Alembic-миграций и загружает начальные страницы каталога. Nginx проксирует/apiи/healthк FastAPI; порты привязаны к localhost. Для публичного размещения нужны аутентификация посетителей и защита административных API.
Запуск без Docker
Требуются Python 3.12, PostgreSQL 16, Node 22.18+ (рекомендуется 24) и Tesseract OCR для JPEG/PNG. Команды ниже — для Bash, из корня репозитория:
cp -n .env.example .env
# Задайте DATABASE_URL для своей БД и остальные настройки из таблицы выше.
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
alembic upgrade head
PYTHONPATH=src python -m app.catalog_sync
PYTHONPATH=src uvicorn app.main:app --host 127.0.0.1 --port 8000 --reload
В другом терминале:
npm ci --prefix web
npm run dev --prefix web
Откройте адрес, напечатанный Vite. /api и /health проксируются на 127.0.0.1:8000. Для БД из Compose на хосте используется порт 55432; пароль в DATABASE_URL должен совпадать с POSTGRES_PASSWORD. В контейнере URL БД собирается автоматически из POSTGRES_*.
PYTHONPATH=src нужен для общего ИИ-модуля. Отдельный CLI запускается через uv run --frozen ekt-consultant после uv sync --locked и использует демокаталог или JSON-снимок, а не live EKT. uv sync может удалить зависимости FastAPI из общего .venv; после него повторите установку requirements.txt. Подробнее: CLI, разработка витрины.
Безопасность по умолчанию
Диаграмма показывает текущую ветку подтверждения при доступных цене и остатках. Настоящая корзина не подключена: выполнение останавливается на resolve_cart, до записи и чтения корзины. Проверки успешной записи в OfferService подготовлены для будущего gateway, но сейчас не достигаются.
sequenceDiagram
participant U as Пользователь
participant W as React-витрина
participant A as FastAPI offers route
participant O as OfferService
participant C as CatalogCurrentProductProvider / CatalogService
participant G as UnavailableCartGateway
U->>W: Нажимает «Да, добавить»
W->>A: session_id, offer_id, Idempotency-Key
A->>O: confirm_offer
Note over O: Блокировка предложения, проверка сессии, срока и идемпотентности
O->>C: Свежая цена и остатки из EKT
C-->>O: Текущие данные товара
alt Остатка недостаточно
O-->>A: insufficient_stock
else Цена изменилась
O-->>A: price_changed + новое предложение
else Проверки пройдены
O->>G: resolve_cart
G-->>O: CartUnavailableError
O-->>A: cart_unavailable, cart_url = null
end
A-->>W: Результат подтверждения
W-->>U: Повторное подтверждение новой цены или отказ; товар не добавлен
- LLM не получает tools, доступ к БД, ekt.kz, корзине или секретам. Он возвращает классификацию и текст по переданным сервером фактам. Проверка ID/ссылок не гарантирует правильность каждой фразы; качество свободных ответов требует отдельной оценки.
- Корзина не изменяется по текстовому «да». Нужны конкретный
offer_id, та же сессия, fresh validation иIdempotency-Key. - Внешние ошибки не раскрываются клиенту. Все ожидаемые ошибки имеют форму
{ "code", "message" }. - Credentials остаются на сервере.
.envигнорируется Git; Basic Auth, API keys, URL с секретами и request bodies не попадают в логи. - Вложения недоверенны. Сервис проверяет размер, расширение, MIME и содержимое; извлечение, OCR и сопоставление позиций выполняются локально. Содержимое файлов и связанные с ними сообщения исключаются из контекста внешней модели.
Подробности: security review · контракт ошибок · подтверждение корзины.
API: краткая карта
Полная интерактивная спецификация доступна в Swagger UI после локального запуска.
| Область | Основные endpoints | Назначение |
|---|---|---|
| Health | GET /health | Проверка доступности API и PostgreSQL. |
| Чат | POST /api/chat/sessionsPOST /api/chat/sessions/{id}/messagesGET /api/chat/sessions/{id}/messages | Создание сессии, сообщение и история. |
| Каталог | GET /api/catalog/statusGET /api/catalog/source-page?page=NGET /api/catalog/productsGET /api/catalog/searchGET /api/catalog/products/{article}/freshGET /api/catalog/products/{article}/current | Поиск и актуализация данных через каталоговый сервис. |
| Вложения | POST /api/attachmentsPOST /api/chat/sessions/{id}/attachments | Извлечение или session-scoped загрузка. |
| Offers | POST /api/chat/sessions/{id}/offersPOST /api/chat/sessions/{id}/offers/{offer_id}/confirm | Создание и безопасное подтверждение предложения. |
[!WARNING] Каталог подключён к реальному EKT API при настроенных credentials. Доступ к каталогу не предоставляет доступ к корзине или админке EKT: запись в корзину остаётся недоступной.
Подключение ekt.kz
Сервис не угадывает API партнёра. На данный момент документированы только следующие read-пути:
GET /api/products?page=<number>
GET /api/products/detail?id=<partner-id>
LiveEktResponseMapper уже реализован по фактическим ответам API: сохраняет строковые артикулы, характеристики, изображения, ссылки, цену и остатки по складам. Неизвестные значения остаются неизвестными. Противоречия между названием и характеристиками не исправляются догадкой.
- Задайте
EKT_API_USERNAMEиEKT_API_PASSWORDв.envтолько на сервере. - Запуск Compose загружает
CATALOG_SYNC_PAGESстраниц; просмотр следующих страниц витрины расширяет индекс. Для ручной загрузки:docker compose exec api python -m app.catalog_sync. - Для известного partner ID:
docker compose exec api python -m app.catalog_sync --product-id 515291. Свежая карточка затем читается по сохранённому ID без повторного обхода всего каталога. - Для подключения корзины нужно получить от EKT документацию и доступ к её API: авторизацию, привязку к посетителю, методы чтения/добавления/изменения количества, правила повторных запросов и URL корзины. Затем необходимо реализовать адаптер и проверить фактическое добавление товара. Одного API каталога для этого недостаточно. Для аналогов и условий покупки нужны утверждённые правила и источники.
Подробнее: интеграция ekt.kz · каталог и поиск.
Структура проекта
.
├── app/
│ ├── api/routes/ # FastAPI endpoints
│ ├── config/ # settings, database, logging, reviewable config
│ ├── integrations/ # EKT, LLM и cart boundaries
│ ├── models/ # SQLAlchemy entities
│ ├── repositories/ # persistence queries
│ ├── schemas/ # Pydantic contracts
│ └── services/ # chat, catalog, offers, attachments, analogs
├── web/ # React/TypeScript, Vite, Nginx, витрина и чат
├── src/hack_4cfe9779_k14/ # общий ИИ-модуль и самостоятельный CLI
├── alembic/ # database migrations
├── docs/ # architecture and integration contracts
├── tests/ # unit and integration tests
├── docker-compose.yml
└── .env.example
Ограничения текущей версии
- Поиск — по частичному индексу. По умолчанию загружены пять страниц (100 товаров в проверенном API); поиск возвращает до 100 результатов. Артикул вне загруженной части не находится. Поиск по характеристикам требует загруженных detail-карточек.
- Файлы — до пяти по 10 МБ. Поддержаны PDF/DOCX/XLSX/JPEG/PNG; старые DOC/XLS не поддержаны. PDF читается по текстовому слою: OCR сканированных PDF отсутствует, для OCR используйте JPEG/PNG. Ошибки OCR и неоднозначные количества требуют уточнения; надёжнее таблица «Артикул / Количество».
- Корзина и совместимость ограничены. Реальной записи в корзину нет. Без утверждённых правил аналоги не предлагаются. Количество целочисленное; дробные остатки источника отмечаются как неизвестные.
- История восстанавливает текст. После перезагрузки карточки и незавершённые предложения заново не восстанавливаются; session ID хранится в
sessionStorageвкладки. - Демонстрационные режимы отдельные. CLI содержит
demo_catalog.json; автономный web-режим включается только явно черезVITE_ASSISTANT_API_BASE=demo. Серверный режим не переключается на него при сбое API.
Разработка и качество
# Автотесты backend (после установки requirements.txt)
.venv/bin/python -m pytest -q
# Тесты и production-сборка frontend (после npm ci --prefix web)
npm test --prefix web
npm run build --prefix web
# Проверка импорта/синтаксиса Python
python -m compileall -q app
# Применить миграции
alembic upgrade head
# Очистить временные данные (в production запускается scheduler платформы)
python -m app.maintenance
Проверка интеграции 23 сентября 2026 года: 119 backend-тестов, 2 frontend-теста и production-сборка прошли. Проверены живые EKT/ИИ-ответы, страницы каталога, загрузки, изоляция сессий, предложения и идемпотентный отказ неподключённой корзины. Это результаты проверки кода перед обновлением документации; подробности — в отчёте.
PendingOffer, idempotency keys и нормализованные данные вложений имеют срок жизни. Команда maintenance удаляет истёкшие записи bounded batches; встроенный scheduler намеренно отсутствует.
Ключевые настройки и безопасные значения по умолчанию находятся в .env.example. Реальный .env не коммитится.
Документация
| Тема | Документ |
|---|---|
| HTTP-формат и ошибки | API conventions |
| Каталог, поиск и fresh data | Catalog |
| Диалог и LLM isolation | Chat flow |
| Аналоги и compatibility filters | Analog replacements |
| Pending offer и подтверждение | Offer confirmation flow |
| Загрузка и разбор файлов | Attachments · Chat attachments |
| Условия покупки | Purchase conditions |
| Витрина и её API | Web README |
| Общий ИИ-модуль и CLI | Consultant |
| Результаты проверки интеграции | Integration report |
| Контракт EKT | EKT integration |
| Безопасность | Security review |
Авторы коммитов
История коммитов
- 2026-09-23 17:59deleteDanik0baby
- 2026-09-23 17:54docs: align architecture with implemented servicesTalgat
- 2026-09-23 17:52Clarify missing EKT cart API access and integration requirementsTalgat
- 2026-09-23 17:49Align README with integrated storefront and AI functionalityTalgat
- 2026-09-23 17:46Copy README verbatim from dev2Talgat
- 2026-09-23 17:42Remove bundled frontend widgetDanik0baby
- 2026-09-23 17:42Merge verified EKT storefront and AI consultant into mainTalgat
- 2026-09-23 17:42Prepare verified application and documentation for mainTalgat
Все коммиты (131)
- 2026-09-23 17:36Document and stabilize frontend API contractDanik0baby
- 2026-09-23 17:36Merge latest dev2 and retain live EKT and AI integrationTalgat
- 2026-09-23 17:33Type chat product payloads for API clientsDanik0baby
- 2026-09-23 17:32Merge dev2 and connect storefront to live EKT and AI consultantTalgat
- 2026-09-23 17:20Polish GitHub READMEDanik0baby
- 2026-09-23 17:13Remove runtime mock integrationsDanik0baby
- 2026-09-23 17:08Connect EKT storefront to FastAPI catalog and chatTalgat
- 2026-09-23 16:58Harden pending offer cart confirmation flowDanik0baby
- 2026-09-23 16:57витрина для главной страницы с ui чатботомTalgat
- 2026-09-23 16:44Add compatibility-first product analog selectionDanik0baby
- 2026-09-23 16:35Сверить витрину с оригиналом EKTTalgat
- 2026-09-23 16:33Add grounded session dialogue routingDanik0baby
- 2026-09-23 16:25Implement switchable catalog adapter and search indexDanik0baby
- 2026-09-23 16:11Add local browser chat widgetDanik0baby
- 2026-09-23 16:02Add complete internal product model and demo catalogDanik0baby
- 2026-09-23 15:54новая версия витриныTalgat
- 2026-09-23 15:50Document offer expiry environment variablesDanik0baby
- 2026-09-23 15:50Document offer expiry configurationDanik0baby
- 2026-09-23 15:50Update health error response testDanik0baby
- 2026-09-23 15:50Prepare deployment and demo documentationDanik0baby
- 2026-09-23 15:50Record cleanup and error handling conventionsDanik0baby
- 2026-09-23 15:50Add temporary data cleanup serviceDanik0baby
- 2026-09-23 15:50Add maintenance cleanup commandDanik0baby
- 2026-09-23 15:50Enforce attachment expiry in repositoryDanik0baby
- 2026-09-23 15:50Set expiry for chat attachmentsDanik0baby
- 2026-09-23 15:50Add unified public error handlingDanik0baby
- 2026-09-23 15:50Pass runtime integration settings to APIDanik0baby
- 2026-09-23 15:50Document cleanup environment variablesDanik0baby
- 2026-09-23 15:50Test attachment expiry metadataDanik0baby
- 2026-09-23 15:50Test temporary data cleanup serviceDanik0baby
- 2026-09-23 15:50Test unified public error responsesDanik0baby
- 2026-09-23 15:50Test end-to-end demo purchase journeyDanik0baby
- 2026-09-23 15:50Document deployment security reviewDanik0baby
- 2026-09-23 15:50Document attachment data expiryDanik0baby
- 2026-09-23 15:50Document temporary data cleanupDanik0baby
- 2026-09-23 15:50Add temporary data cleanup settingsDanik0baby
- 2026-09-23 15:50Add expiry to chat attachmentsDanik0baby
- 2026-09-23 15:50Add temporary data expiry migrationDanik0baby
- 2026-09-23 15:50Add cleanup result schemaDanik0baby
- 2026-09-23 15:50Add expired data cleanup repositoryDanik0baby
- 2026-09-23 15:41Report attachment extraction warnings in chatDanik0baby
- 2026-09-23 15:41Test LLM extraction warning contextDanik0baby
- 2026-09-23 15:41Test OCR failure chat responseDanik0baby
- 2026-09-23 15:41Document extraction warnings in chatDanik0baby
- 2026-09-23 15:41Include extraction warnings in LLM contextDanik0baby
- 2026-09-23 15:40Test attachment chat catalog integrationDanik0baby
- 2026-09-23 15:40Document attachment LLM limitDanik0baby
- 2026-09-23 15:40Document chat attachment flowDanik0baby
- 2026-09-23 15:40Document chat attachment APIDanik0baby
- 2026-09-23 15:40Record chat attachment constraintsDanik0baby
- 2026-09-23 15:40Add attachment references to chat messagesDanik0baby
- 2026-09-23 15:40Integrate extracted attachments into chat processingDanik0baby
- 2026-09-23 15:40Add session attachment upload endpointDanik0baby
- 2026-09-23 15:40Wire chat attachment repositoryDanik0baby
- 2026-09-23 15:40Register chat attachment routesDanik0baby
- 2026-09-23 15:40Update chat service LLM mockDanik0baby
- 2026-09-23 15:40Test bounded untrusted LLM attachment dataDanik0baby
- 2026-09-23 15:40Add attachment parsing schemasDanik0baby
- 2026-09-23 15:40Add chat attachment repositoryDanik0baby
- 2026-09-23 15:40Add extracted attachment item parserDanik0baby
- 2026-09-23 15:40Pass bounded untrusted attachment data to LLMDanik0baby
- 2026-09-23 15:40Export chat attachment modelDanik0baby
- 2026-09-23 15:40Add chat attachments migrationDanik0baby
- 2026-09-23 15:40Add chat attachment response schemaDanik0baby
- 2026-09-23 15:39Add attachment LLM text limit settingDanik0baby
- 2026-09-23 15:39Add persisted chat attachment modelDanik0baby
- 2026-09-23 15:30Record attachment handling rulesDanik0baby
- 2026-09-23 15:30Document attachment upload APIDanik0baby
- 2026-09-23 15:30Document attachment processing pipelineDanik0baby
- 2026-09-23 15:30Test attachment service and upload APIDanik0baby
- 2026-09-23 15:30Test attachment extractorsDanik0baby
- 2026-09-23 15:30Document attachment environment settingsDanik0baby
- 2026-09-23 15:29Install Tesseract in API imageDanik0baby
- 2026-09-23 15:29Add attachment extraction dependenciesDanik0baby
- 2026-09-23 15:29Configure attachment processing limitsDanik0baby
- 2026-09-23 15:29Register attachment API routeDanik0baby
- 2026-09-23 15:29Add attachment upload API routeDanik0baby
- 2026-09-23 15:29Add attachment processing serviceDanik0baby
- 2026-09-23 15:29Add attachment processing errorsDanik0baby
- 2026-09-23 15:29Add extractor packageDanik0baby
- 2026-09-23 15:29Add document attachment extractorsDanik0baby
- 2026-09-23 15:29Add attachment result schemasDanik0baby
- 2026-09-23 15:15Record offer confirmation safety rulesDanik0baby
- 2026-09-23 15:15Document safe cart confirmation APIDanik0baby
- 2026-09-23 15:15Document offer confirmation transaction flowDanik0baby
- 2026-09-23 15:15Test offer confirmation API routesDanik0baby
- 2026-09-23 15:15Test safe offer confirmation serviceDanik0baby
- 2026-09-23 15:15Configure offer expiry settingsDanik0baby
- 2026-09-23 15:15Register offer API routesDanik0baby
- 2026-09-23 15:15Add offer confirmation API routesDanik0baby
- 2026-09-23 15:15Add safe offer confirmation serviceDanik0baby
- 2026-09-23 15:15Add offer workflow errorsDanik0baby
- 2026-09-23 15:15Add transactional offer repositoryDanik0baby
- 2026-09-23 15:15Migrate pending offer safety fieldsDanik0baby
- 2026-09-23 15:15Extend pending offer modelDanik0baby
- 2026-09-23 15:15Add cart gateway interfaceDanik0baby
- 2026-09-23 15:15Add offer schemasDanik0baby
- 2026-09-23 15:05Record chat service architecture notesDanik0baby
- 2026-09-23 15:05Document chat API and LLM integrationDanik0baby
- 2026-09-23 15:05Test chat API routesDanik0baby
- 2026-09-23 15:05Test chat service flowDanik0baby
- 2026-09-23 15:05Test LLM client output validationDanik0baby
- 2026-09-23 15:05Document chat processing flowDanik0baby
- 2026-09-23 15:05Document LLM environment variablesDanik0baby
- 2026-09-23 15:05Configure LLM environment settingsDanik0baby
- 2026-09-23 15:05Register chat API routerDanik0baby
- 2026-09-23 15:05Add chat API routesDanik0baby
- 2026-09-23 15:05Add chat service flowDanik0baby
- 2026-09-23 15:05Add chat repositoryDanik0baby
- 2026-09-23 15:05Add LLM client abstractionDanik0baby
- 2026-09-23 15:04Add chat schemasDanik0baby
- 2026-09-23 14:55Витрина ekt.kz c первой версией ии-ассистентаTalgat
- 2026-09-23 14:53Add PostgreSQL catalog search serviceDanik0baby
- 2026-09-23 14:48Harden EKT response validation and loggingDanik0baby
- 2026-09-23 14:46Add isolated ekt.kz API client adapterDanik0baby
- 2026-09-23 14:40Scaffold chat backend with SQLAlchemy and DockerDanik0baby
- 2026-09-23 14:28Ignore Python bytecode and virtualenvDanik0baby
- 2026-09-23 14:28Add EKT API adapter and PostgreSQL catalogDanik0baby
- 2026-09-23 14:23Add repository-local agent skills and guidanceTalgat
- 2026-09-23 13:50new plan and python initTalgat
- 2026-09-23 13:37architectureTalgat
- 2026-09-21 19:38Мой первый коммитTalgat
- 2026-09-21 19:31asdDanik0baby
Структура репозитория (304 файлов)
.dockerignore .env.example .gitignore .python-version AGENTS.md Dockerfile README.md alembic.ini alembic/env.py alembic/script.py.mako alembic/versions/20260923_0001_initial_schema.py alembic/versions/20260923_0002_catalog_fields.py alembic/versions/20260923_0003_pending_offer_safety.py alembic/versions/20260923_0004_chat_attachments.py alembic/versions/20260923_0005_temporary_data_expiry.py alembic/versions/20260923_0006_product_source_completeness.py alembic/versions/20260923_0007_catalog_field_presence_and_search.py alembic/versions/20260923_0008_pending_offer_cart_context.py api/README.md app/__init__.py app/api/__init__.py app/api/routes/__init__.py app/api/routes/attachments.py app/api/routes/catalog.py app/api/routes/chat.py app/api/routes/chat_attachments.py app/api/routes/health.py app/api/routes/offers.py app/catalog_sync.py app/config/__init__.py app/config/compatibility_rules.py app/config/database.py app/config/logging.py app/config/purchase_conditions.py app/config/settings.py app/extractors/__init__.py app/extractors/attachments.py app/integrations/__init__.py app/integrations/cart_gateway.py app/integrations/catalog_adapter.py app/integrations/ekt_client.py app/integrations/ekt_mapper.py app/integrations/llm_client.py app/integrations/responses_consultant.py app/main.py app/maintenance.py app/models/__init__.py app/models/attachment.py app/models/base.py app/models/chat.py app/models/product.py app/models/temporary.py app/repositories/__init__.py app/repositories/attachments.py app/repositories/catalog.py app/repositories/chat.py app/repositories/health.py app/repositories/maintenance.py app/repositories/offers.py app/schemas/__init__.py app/schemas/analogs.py app/schemas/attachment_parsing.py app/schemas/attachments.py app/schemas/catalog.py app/schemas/chat.py app/schemas/errors.py app/schemas/health.py app/schemas/maintenance.py app/schemas/offers.py app/schemas/purchase_conditions.py app/services/__init__.py app/services/analogs.py app/services/attachment_parser.py app/services/attachments.py app/services/catalog.py app/services/chat.py app/services/compatibility.py app/services/dialogue_router.py app/services/errors.py app/services/maintenance.py app/services/offer_product_provider.py app/services/offers.py app/services/purchase_conditions.py docker-compose.yml docs/analog-replacements.md docs/api-conventions.md docs/architecture.md docs/attachments.md docs/backend-integration-report.md docs/backend.md docs/catalog.md docs/chat-attachments.md docs/chat-flow.md docs/consultant.md docs/development-plan.md docs/ekt-integration.md docs/model-development.md docs/offer-confirmation-flow.md docs/purchase-conditions.md docs/security-review.md docs/ui-audit/README.md docs/ui-audit/local-cart-phone.png docs/ui-audit/local-catalog-desktop.png docs/ui-audit/local-catalog-phone.png docs/ui-audit/local-chat-phone.png docs/ui-audit/local-home-desktop.png docs/ui-audit/local-home-phone.png docs/ui-audit/original-cart-phone.png docs/ui-audit/original-catalog-desktop.png docs/ui-audit/original-catalog-phone.png docs/ui-audit/original-home-desktop.png docs/ui-audit/original-home-phone.png docs/ui-audit/updated-desktop-home.png docs/ui-audit/updated-mobile-about.png docs/ui-audit/updated-mobile-benefits.png docs/ui-audit/updated-mobile-categories.png docs/ui-audit/updated-mobile-chat.png docs/ui-audit/updated-mobile-footer.png docs/ui-audit/updated-mobile-home.png pyproject.toml pytest.ini requirements.txt skills/i-have-adhd/LICENSE skills/i-have-adhd/SKILL.md skills/i-have-adhd/agents/gemini.toml skills/i-have-adhd/agents/openai.yaml skills/ponytail/LICENSE skills/ponytail/SKILL.md src/hack_4cfe9779_k14/__init__.py src/hack_4cfe9779_k14/__main__.py src/hack_4cfe9779_k14/catalog.py src/hack_4cfe9779_k14/cli.py src/hack_4cfe9779_k14/consultant.py src/hack_4cfe9779_k14/demo_catalog.json tests/conftest.py tests/test_analogs.py tests/test_attachment_extractors.py tests/test_attachment_service.py tests/test_catalog_adapter.py tests/test_catalog_api.py tests/test_catalog_service.py tests/test_chat_api.py tests/test_chat_attachments.py tests/test_chat_service.py tests/test_consultant.py tests/test_demo_flow.py tests/test_dialogue_layer.py tests/test_ekt_client.py tests/test_error_handling.py tests/test_health.py tests/test_live_integration.py tests/test_llm_client.py tests/test_logging.py tests/test_maintenance.py tests/test_models.py tests/test_offer_api.py tests/test_offer_product_provider.py tests/test_offer_service.py uv.lock web/.dockerignore web/.env.example web/.gitignore web/.nvmrc web/Dockerfile web/README.md web/index.html web/nginx.conf web/package-lock.json web/package.json web/public/reference/260_448.jpg web/public/reference/260kh448-_42_-_1_.jpg web/public/reference/260kh448-unit.jpg web/public/reference/260x448_ru_TRIO.png web/public/reference/260x448_ru_konc_iek.png web/public/reference/313kh424-_-Legrand-_-snizhenie.png web/public/reference/3d.svg web/public/reference/5088ce720b5610802ae30a5bd4ae2365.png web/public/reference/660x440_ELEKTROFORUM.png web/public/reference/660x440_IEK_putevka.png web/public/reference/660x440_TRIO.png web/public/reference/660x440_akciya_chint.png web/public/reference/660x440_konc_iek.png web/public/reference/660x440_mk_leg_rex_prom.png web/public/reference/660x490_IEK_vkluchaisya.png web/public/reference/660x490_Megalight_DEPO.png web/public/reference/660x490_chint_obo_kvt.png web/public/reference/958kh424-_-Legrand-_-snizhenie.png web/public/reference/CHINT-313x424-_1_.png web/public/reference/CHINT-660x440-_1_.png web/public/reference/CHINT-958x424.png web/public/reference/Chint-660x440.png web/public/reference/FORT-660x440.jpg web/public/reference/Group-5.png web/public/reference/IEK-Korpus-TETRA-660x440.png web/public/reference/IEK-TORS_660x440.png web/public/reference/KVT-instrementy-313x424.png web/public/reference/KVT-rus_FQdP.jpg web/public/reference/KVT-rus_FQdP.mp4 web/public/reference/KVT_313x424.jpg web/public/reference/KVT_958x424.jpg web/public/reference/Kabel-313x424.png web/public/reference/Kabel-958x424.png web/public/reference/Kompozitsiya-1_1-_1__FQdP.jpg web/public/reference/Kompozitsiya-1_1-_1__FQdP.mp4 web/public/reference/Kompozitsiya-1_10_FQdP.jpg web/public/reference/Kompozitsiya-1_10_FQdP.mp4 web/public/reference/Lotok-313x424.png web/public/reference/Lotok-958x424.png web/public/reference/Mini_banners_01.jpg web/public/reference/Mini_banners_02.jpg web/public/reference/Mini_banners_121.jpg web/public/reference/Mini_banners_123.jpg web/public/reference/Mini_banners_125-ru.jpg web/public/reference/Mini_banners_127.jpg web/public/reference/Mini_banners_130.jpg web/public/reference/Mini_banners_133.jpg web/public/reference/Mini_banners_135.jpg web/public/reference/Mini_banners_137-_1_.jpg web/public/reference/Mini_banners_137.jpg web/public/reference/Mini_banners_27.jpg web/public/reference/Mini_banners_43.jpg web/public/reference/Mini_banners_45.jpg web/public/reference/Mini_banners_91.jpg web/public/reference/Mini_banners_93.jpg web/public/reference/Mufta-313x424-_1_.png web/public/reference/Mufta-660x440-_2_.png web/public/reference/Mufta-958x424-_3_.png web/public/reference/Promrukav-313x424-_1_.jpg web/public/reference/Promrukav-660x440.jpg web/public/reference/Promrukav-958x424-_1_.jpg web/public/reference/Quattro-313x424.png web/public/reference/Quattro-958x424.png web/public/reference/Quattro_660x440.png web/public/reference/SOURCES.md web/public/reference/Seminar-313x424-rus.png web/public/reference/Seminar-660x440.png web/public/reference/TANDEM-313x424.png web/public/reference/TSO-313x424.png web/public/reference/Unibox-660x440.jpg web/public/reference/Vyklyuchateli_660x440.jpg web/public/reference/WhatsApp-Video-2026_09_18-at-13.01.08_FQdP.jpg web/public/reference/WhatsApp-Video-2026_09_18-at-13.01.08_FQdP.mp4 web/public/reference/avtomatization_icon.png web/public/reference/bc8e282b43e269c3518385316d5cb2b0.png web/public/reference/benefits.png web/public/reference/camera_icon.png web/public/reference/cart.svg web/public/reference/catalog.svg web/public/reference/cp-visa-mastercard.jpg web/public/reference/e8452aacec34c99e89fae86202443e1e.png web/public/reference/fb.svg web/public/reference/footer_rassrochka.jpg web/public/reference/hand.png web/public/reference/ind.png web/public/reference/inst.svg web/public/reference/lamps.png web/public/reference/led-spoty.jpg web/public/reference/logo.svg web/public/reference/main-about.jpg web/public/reference/mobile/OFL-PT-Sans.txt web/public/reference/mobile/category-01.svg web/public/reference/mobile/category-02.svg web/public/reference/mobile/category-03.svg web/public/reference/mobile/category-04.svg web/public/reference/mobile/category-05.svg web/public/reference/mobile/category-06.svg web/public/reference/mobile/category-07.svg web/public/reference/mobile/category-08.svg web/public/reference/mobile/category-09.svg web/public/reference/mobile/category-10.svg web/public/reference/mobile/category-11.svg web/public/reference/mobile/category-12.svg web/public/reference/mobile/icon_cart.svg web/public/reference/mobile/icon_catalog.svg web/public/reference/mobile/icon_ekt_pro.svg web/public/reference/mobile/icon_hamburger.svg web/public/reference/mobile/icon_home.svg web/public/reference/mobile/icon_phone.svg web/public/reference/mobile/icon_user.svg web/public/reference/mobile/kaspi_red.png web/public/reference/mobile/pt-sans-bold.ttf web/public/reference/mobile/pt-sans-regular.ttf web/public/reference/multimetr_icon.png web/public/reference/nal.png web/public/reference/prochee-KIP.png web/public/reference/shchitovoe-oborudovanie.png web/public/reference/toolbox.jpg web/public/reference/ustanovochnaya_produktsiya.png web/public/reference/whatsapp.svg web/public/reference/youtube.svg web/src/Site.tsx web/src/api.ts web/src/homeContent.json web/src/main.tsx web/src/site.css web/src/styles.css web/tests/api.test.mjs web/tsconfig.json web/vite.config.ts widget/Dockerfile widget/app.js widget/index.html widget/nginx.conf widget/styles.css
Ветки (4)
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.