AAYMA
RU
Войти

ekt.kz Product Assistant

Витрина на React с AI-консультантом по каталогу ekt.kz: поиск по SKU и тексту, ответы по живым ценам и остаткам из EKT API, вложения…

Рабочий MVP
Команда «K14» 6💬 0 комментариевс 21 сентября 2026 г.

О проекте

Команда: 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.md

ekt.kz Product Assistant

Безопасный MVP AI-ассистента для товарного каталога

Python 3.12 FastAPI PostgreSQL 16 Docker Compose

Быстрый старт · Возможности · Статус интеграций · Документация

[!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 UIhttp://localhost:8000/docs
Healthcheckhttp://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Назначение
HealthGET /healthПроверка доступности API и PostgreSQL.
ЧатPOST /api/chat/sessions
POST /api/chat/sessions/{id}/messages
GET /api/chat/sessions/{id}/messages
Создание сессии, сообщение и история.
КаталогGET /api/catalog/status
GET /api/catalog/source-page?page=N
GET /api/catalog/products
GET /api/catalog/search
GET /api/catalog/products/{article}/fresh
GET /api/catalog/products/{article}/current
Поиск и актуализация данных через каталоговый сервис.
ВложенияPOST /api/attachments
POST /api/chat/sessions/{id}/attachments
Извлечение или session-scoped загрузка.
OffersPOST /api/chat/sessions/{id}/offers
POST /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: сохраняет строковые артикулы, характеристики, изображения, ссылки, цену и остатки по складам. Неизвестные значения остаются неизвестными. Противоречия между названием и характеристиками не исправляются догадкой.

  1. Задайте EKT_API_USERNAME и EKT_API_PASSWORD в .env только на сервере.
  2. Запуск Compose загружает CATALOG_SYNC_PAGES страниц; просмотр следующих страниц витрины расширяет индекс. Для ручной загрузки: docker compose exec api python -m app.catalog_sync.
  3. Для известного partner ID: docker compose exec api python -m app.catalog_sync --product-id 515291. Свежая карточка затем читается по сохранённому ID без повторного обхода всего каталога.
  4. Для подключения корзины нужно получить от 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 dataCatalog
Диалог и LLM isolationChat flow
Аналоги и compatibility filtersAnalog replacements
Pending offer и подтверждениеOffer confirmation flow
Загрузка и разбор файловAttachments · Chat attachments
Условия покупкиPurchase conditions
Витрина и её APIWeb README
Общий ИИ-модуль и CLIConsultant
Результаты проверки интеграцииIntegration report
Контракт EKTEKT integration
БезопасностьSecurity review

Витрина, FastAPI и ИИ объединены в main; реальный каталог подключён, корзина ожидает API партнёра.
Звёзды
⭐ 1
Форки
0
Язык
Python
Последний push
в прошлом месяце
Коммиты
131
Авторы
2
Файлы
304
Ветки
4

Авторы коммитов

Danik0baby 114Talgat 17

История коммитов

  • 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 комментариев

Войдите, чтобы комментировать

Пока нет комментариев — будьте первым.