Files
elmer/doc/STRUCTURE.md

182 lines
14 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Структура репозитория elmAI
> **elmAI** — сервис OBD2-диагностики автомобилей через ELM327 + LLM (DeepSeek).
> Android-приложение + Python-сервер. Анализ ошибок ЭБУ, live-параметры, диагноз через ИИ.
---
## Корневые файлы
| Файл | Назначение |
|------|-----------|
| `run.py` | Главная точка входа (CLI). Подключается к ELM327 по Bluetooth, читает VIN/DTC/PID, сохраняет в SQLite, отправляет в LLM. Запуск: `python run.py [--no-llm] [--port]` |
| `config.yaml` | Конфигурация: LLM (API key, модель), ELM327 (порт, baudrate), список PID для чтения |
| `requirements.txt` | Зависимости Python: pyserial, pyyaml, requests, flask, flask-cors |
| `deploy.sh` | Скрипт деплоя на сервер obdai.ru: обновление репо, venv, systemd-сервис (gunicorn), nginx, SSL (certbot) |
| `legacy-deploy.sh` | Устаревшая версия деплоя (ветка fat-client, GPT-OSS модель) |
| `analysis.md` | Анализ и план проекта от 2025-05-25: железо, ЦА, требования, компоненты, протокол, риски |
| `idea.md` | Концепция сервиса: OBD2 + AI диагностика, три компонента (сервер, Android, десктоп) |
| `morda.md` | Макет UI (морда) v2: иконки-светофоры, кнопка-трансформер, поле вывода, поле ввода |
| `QUICKSTART.md` | Быстрый старт: тест с mock ELM327, тест в машине, веб-интерфейс |
| `resume.txt` | Резюме проекта для нового чата: версия v0.77.0-dev, инструкции по деплою |
| `legacy-resume.txt` | Устаревшее резюме (v0.48.0, ветка master) |
| `CHANGELOG.md` | Полное описание проекта: архитектура, модули, эндпоинты, БД, стейт-машина (актуально v0.95.0-dev) |
| `token.txt` | Токены и ключи: gitea, DeepSeek API, SSH-ключ VM |
| `STRUCTURE.md` | **Этот файл** — описание структуры репозитория |
---
## `api/` — Flask REST API + БД + парсинг
| Файл | Назначение |
|------|-----------|
| `__init__.py` | Пустой (пакет) |
| `config.py` | Загрузка `config.yaml` с подстановкой `${VAR}` из переменных окружения. Кэш через `@lru_cache` |
| `db.py` | SQLite-база данных (WAL mode). Таблицы: `sessions`, `cars`, `diagnostic_tokens`, `llm_messages`, `ecu_parameters`, `dtc_codes`, `command_queue`. Класс `Database` |
| `routes.py` | Основные эндпоинты: `GET /api/v1/script`, `POST /api/v1/session/upload`, `POST /api/v1/chat`, `POST /api/v1/elm/probe`. Проверка X-Api-Key, сборка промпта для LLM |
| `dtc.py` | DTC-эндпоинты: `POST /api/v1/dtc/decode` (расшифровка кодов из справочника), `POST /api/v1/dtc/upload`. Справочник из `doc/dtc_codes.txt` |
| `ping.py` | Эндпоинты проверки: `GET /api/v1/ping` (доступность), `GET /api/v1/ping-llm` (проверка LLM с адаптивным кэшем 60с/7с) |
| `parser.py` | Парсинг батча ELM-ответов: VIN (из decoded и raw HEX), DTC stored/pending (mode 03/07), PID-параметры (mode 01) |
| `scripts.py` | Сборка диагностических скриптов трёх уровней: L0 (5 PID + stored DTC), L1 (8 PID + VIN + stored/pending), L2 (14 PID + калибровки). + динамические скрипты |
| `raw_elm.py` | Сырое взаимодействие с ELM327: локальный режим (прямое подключение) и удалённый (через Android-реле). HTTP-очередь команд |
---
## `brain/` — LLM-клиент и промпты
| Файл | Назначение |
|------|-----------|
| `__init__.py` | Пустой (пакет) |
| `client.py` | `Diagnoser` — HTTP-клиент к OpenAI-совместимому API (api.aillm.ru). Модели: `gpt-oss-120b`, `qwen3-6-27b-fp8`. Обработка ошибок: Timeout, 429, 5xx, 4xx |
| `prompts.py` | `SYSTEM_PROMPT` (10 правил для диагноза: расшифровка, отклонения, степени уверенности), `DYNAMIC_PROMPT` (для динамических тестов), `build_user_prompt()` |
---
## `obd/` — ELM327-протокол (Python, порт AndrOBD)
| Файл | Назначение |
|------|-----------|
| `__init__.py` | Пустой (пакет) |
| `connection.py` | `SerialTransport` — транспортный слой: открыть serial/Bluetooth порт, побайтовое чтение до `>`, запись + flush |
| `protocol.py` | `AndrOBD` — стейт-машина ELM327 (порт ElmProt.java). Состояния: UNDEFINED → INITIALIZING → READY → BUSY → ERROR. Канонический init, обработка BUS ERROR |
| `state.py` | `State` (enum состояний) и `Rsp` (классификация ответов: PROMPT, OK, SEARCHING, ERROR, BUS_ERROR, NODATA и т.д.) |
| `timing.py` | `AdaptiveTiming` — адаптивный таймаут (50..2000мс). Увеличивается при таймаутах, уменьшается при быстрых ответах, сброс при BUS ERROR |
| `commands.py` | Каталог AT-команд ELM327 с метаданными: name, desc, level (0/1/2), safe. L0 (универсальные), L1 (ATAT), L2 (CAF/CFC) |
| `classifier.py` | Классификация сырых ответов ELM327 и определение уровня устройства по ответам на пробинг |
| `probe.py` | Пробинг ELM327: трехуровневый каскад (L0→L1→L2), каждая команда с таймаутом 500мс, без ретраев |
| `raw_console.py` | `RawELM` — сырой слой без стейт-машины: только send/read/drain/available. Для изучения поведения ELM327 |
---
## `web/` — Веб-интерфейс (Flask)
| Файл | Назначение |
|------|-----------|
| `app.py` | Точка входа Flask: регистрация эндпоинтов, режим RAW (блокировка всех, кроме `/elm/raw/*`), раздача APK, главная страница |
| `script_builder.py` | Сборка диагностических скриптов (устаревшая версия — дублирует `api/scripts.py`) |
| `script_endpoint.py` | Эндпоинты скриптов (устаревшая версия — дублирует `api/routes.py`) |
| `script_parser.py` | Парсинг батча (устаревшая версия — дублирует `api/parser.py`) |
| `templates/index.html` | Главная HTML-страница: скачивание APK, десктоп-диагностика, отображение результатов |
| `static/style.css` | Стили: тёмная тема, оранжевый акцент, карточки, спиннеры, DTC-бейджи |
---
## `android/` — Android-приложение (Kotlin)
| Файл | Назначение |
|------|-----------|
| `build.gradle.kts` | Корневой build-файл Gradle: плагины Android + Kotlin |
| `settings.gradle.kts` | Настройки Gradle-проекта |
| `gradle.properties` | Свойства Gradle |
| `gradlew` | Gradle Wrapper (исполняемый) |
| `app/build.gradle.kts` | Модуль app: minSdk 24, OkHttp 4.12.0, зависимости |
| `app/src/` | Исходники Android-приложения (Kotlin) — основной клиент + raw-реле |
| `raw/build.gradle.kts` | Модуль raw — ретранслятор ELM327 через HTTP |
| `doc/opus-review-android.md` | Рецензия кода Android-приложения |
| `doc/opus-questions-android.md` | Вопросы по Android после рецензии |
| `gradle/wrapper/` | Gradle Wrapper JAR и настройки |
---
## `tools/` — Вспомогательные утилиты
| Файл | Назначение |
|------|-----------|
| `mock_elm327.py` | Эмулятор ELM327 v1.5 через TCP (порт 35000). Отвечает на AT-команды, PID, DTC, VIN. Для тестирования без реального сканера |
| `mock_elm327_v2.py` | Улучшенный мок: поддержка `>` как разделителя, ATST, случайные ошибки (BUS BUSY, UNABLE), побайтовая отправка |
| `elm_console.py` | Интерактивная консоль ELM327 (сырой режим). Команды: ATZ, 0105, !drain, !timeout, !log. Для изучения поведения ELM |
| `elm_relay.py` | Интерактивная консоль удалённого управления ELM327 через Android-реле. HTTP-команды: `!status`, `!history`, `!mode` |
| `test_androbd.py` | Тест AndrOBD-протокола против Mock ELM327 v2: проверка что ответы не перемешаны (VIN → DTC → RPM → coolant) |
| `analyze_sessions.py` | Анализ сессий из SQLite: статистика команд, ошибок, пустых ответов |
---
## `scripts/` — Скрипты развёртывания
| Файл | Назначение |
|------|-----------|
| `setup-bt.sh` | Настройка Bluetooth-сопряжения с ELM327: поиск, pairing, rfcomm bind на /dev/rfcomm0 |
---
## `tests/` — Автотесты
| Файл | Назначение |
|------|-----------|
| `test_all.py` | Сквозные тесты (без LLM): сборка скриптов, парсер ELM-ответов (VIN из decoded/raw, DTC, PID), работа с БД, идемпотентность, эндпоинты |
---
## `doc/` — Документация и исследования
| Файл | Назначение |
|------|-----------|
| `architecture.md` | Полная архитектура проекта: два режима (app/raw), схема, эндпоинты, модули |
| `roadmap.md` | План развития проекта |
| `research.md` | Исследования и заметки |
| `competitors.md` | Анализ конкурентов |
| `diagnostic-logic.md` | Логика диагностики |
| `dynamic-diagnostics-analysis-2026-06-14.md` | Анализ динамической диагностики |
| `dynamic-tests.md` | Динамические тесты |
| `dtc_codes.txt` | Справочник DTC-кодов (формат: `P0301=Пропуски зажигания цилиндр 1`) |
| `elm-reference.md` | Справочник по ELM327 |
| `elm-raw-relay-plan.md` | План raw-реле |
| `failures-journal.md` | Журнал отказов |
| `field-test-2026-06-07.md` | Полевой тест |
| `git-guide.md` | Гайд по Git |
| `morda-v2.md` | Макет UI v2 |
| `mpscholar-automotive-sensing-actuators.md` | Обучающий материал |
| `opinion-dynamic-diagnostics-2026-06-14.md` | Мнение по динамической диагностике |
| `relay-mistakes-2026-07-04.md` | Ошибки реле |
| `test-cases.md` | Тест-кейсы |
| `SETUP.md` | Инструкция по установке |
| `audit-2026-06-07.md` | Аудит проекта |
| `audit-prompt.md` | Промпт для аудита |
| `opus-review.md` | Рецензия кода (Opus) |
| `opus-fix-plan.md` | План исправлений по рецензии |
| `opus-questions.md` | Вопросы к Opus |
| `opus-questions-post-tests-2026-06-29.md` | Вопросы после тестов |
| `opus-recheck-request-2026-06-28.md` | Запрос на перепроверку |
| `opus-review-android.md` | Рецензия Android-кода |
| `sonnet-apk-cache-questions-2026-06-28.md` | Вопросы по кэшу APK |
| `android-bugs-2026-05-25.md` | Баги Android |
| `claude-analysis-elm.md` / `claude-analysis-elm-v2.md` | Анализ ELM от Claude |
| `claude-request-elm.md` / `claude-request-elm-v2.md` | Запросы к Claude по ELM |
| `session-*.md` | Логи сессий разработки по датам |
| `session-resume-2026-06-14.md` | Резюме сессии |
| `history/` | Архив старых заметок, логов сессий и результатов тестов по датам |
| `history/2026-05-31.md` | Лог сессии 31 мая |
| `history/2026-06-03.md` | Лог сессии 3 июня |
| `history/2026-06-05.md` | Лог сессии 5 июня |
| `history/2026-06-06.md` | Лог сессии 6 июня |
| `history/2026-06-07.md` | Лог сессии 7 июня |
| `history/2026-06-07-plans.md` | Планы на 7 июня |
| `history/2026-06-10.md` | Лог сессии 10 июня |
| `history/opus-recheck-analysis-2026-06-28.md` | Анализ перепроверки Opus |
| `history/opus-sonnet-comparison-2026-06-29.md` | Сравнение Opus vs Sonnet |
| `history/session-summary-2026-06-28.md` | Сводка сессии 28 июня |
| `history/sonnet-response-post-tests-2026-06-29.md` | Ответ Sonnet после тестов |
| `history/test-results-2026-06-28.md` | Результаты тестов 28 июня |
| `history/test-results-2026-07-04.md` | Результаты тестов 4 июля |