doc: описание архитектуры — структура, модули, API

This commit is contained in:
Repinoid
2026-05-29 17:27:07 +03:00
parent 2db6cb68a8
commit eab73cd76a
+83 -69
View File
@@ -1,88 +1,102 @@
# Архитектура Elmer (2026-05-25) # Архитектура elmAI
## Принцип: тонкий клиент > v0.28.0-dev, 29 мая 2026
Клиент ничего не знает о диагнозе. Только транспорт: ## Общая схема
``` ```
ELM327 ←Bluetooth SPP→ Android Client ←HTTP JSON→ Сервер ←API→ DeepSeek 📱 Android (elmer-android)
│ Bluetooth
▼
🔌 ELM327
│ OBD-ответы
▼
📱 Android (ScriptRunnerService)
│ HTTPS POST /api/v1/session/upload
▼
🌐 Сервер (5.172.178.213)
├── nginx :443 → gunicorn :8000
├── obd/ — ELM327 протокол
├── brain/ — LLM-клиент
├── api/ — REST, БД, скрипты
└── web/ — точка входа Flask, статика
``` ```
## Режимы работы клиента ## Структура сервера
### Режим «опрос» (основной)
Клиент сам читает VIN + DTC + PID'ы, шлёт готовый JSON серверу.
Быстро: один HTTP-запрос на сессию.
### Режим «ретранслятор» (расширенный)
Сервер шлёт сырые AT-команды, клиент пересылает ответ.
Медленно (каждый PID — HTTP round-trip), но клиент вообще ничего не знает об OBD2.
## Универсальность
- Пользователь вводит URL сервера (или наш по умолчанию)
- Протокол HTTP/JSON документирован
- Любой backend может работать с этим клиентом
## Десктоп (Windows/Linux)
``` ```
Браузер (Chrome) → локальный Flask → pyserial → ELM327 elmer/
├── obd/ # Модуль 1: ELM327 протокол
│ └── protocol.py # AndrOBD — стейт-машина (1:1 копия AndrOBD)
│ # State, Rsp, AdaptiveTiming
│
├── brain/ # Модуль 2: LLM-взаимодействие
│ ├── client.py # Diagnoser — HTTP к api.aillm.ru
│ └── prompts.py # SYSTEM_PROMPT для диагностики
│
├── api/ # Модуль 3: REST API + БД
│ ├── config.py # Загрузка config.yaml
│ ├── db.py # SQLite (sessions, cars, dtc)
│ ├── routes.py # Все эндпоинты (5 шт)
│ ├── scripts.py # Сборка диагностических скриптов
│ └── parser.py # Парсинг ответов ELM327
│
├── web/ # Веб-интерфейс
│ ├── app.py # Точка входа Flask
│ ├── templates/index.html
│ └── static/app-debug.apk
│
├── tools/ # Разработка
│ ├── mock_elm327_v2.py # Мок ELM327 (TCP)
│ └── test_androbd.py # Тесты стейт-машины
│
├── doc/ # Документация
│ ├── architecture.md # Этот файл
│ ├── roadmap.md
│ └── session-*.md # Логи сессий
│
├── config.yaml # LLM API key, порты
└── requirements.txt
``` ```
- Отдельного «приложения» для Windows не нужно ## Взаимодействие модулей
- `web/app.py` — и тестовый UI, и прототип сервера
- Chrome на Android НЕ может: Web Bluetooth API только BLE, Web Serial API не поддерживается
## Открытость и доверие
| Что | Где | Зачем |
|---|---|---|
| **Клиент (Android)** | GitHub (открытый) | Доверие — любой может проверить код, собрать сам |
| **Сервер (Python)** | Gitea (закрытый) | API-ключи, логика, коммерческая часть |
| **Публикация** | RuStore | Бесплатно, модерация = дополнительное доверие |
## Git-стратегия
- `gitea.services.ngcloud.ru/Nail/elmer` — разработка сервера (текущий репо)
- `github.com/Nail/elmer-android` — клиент (будет создан), лицензия MIT
- Серверный репо на GitHub НЕ публикуем
## База данных
### SQLite (MVP)
``` ```
cars — VIN, марка, модель, год, двигатель web/app.py
diagnostic_tokens — id (PK), car_id (FK), created_at └─ import api/routes.py
llm_messages — token_id (FK), role, content, timestamp ├─ import api/config.py → config.yaml
ecu_parameters — token_id (FK), pid_code, value, unit, timestamp ├─ import api/db.py → SQLite
dtc_codes — token_id (FK), code, description, status ├─ import api/scripts.py → сборка скриптов
├─ import api/parser.py → парсинг батча
├─ import brain/client.py → Diagnoser → api.aillm.ru
└─ import brain/prompts.py → SYSTEM_PROMPT
``` ```
### PostgreSQL (production) Каждый модуль можно тестировать отдельно. Циклических зависимостей нет.
Та же схема, миграция при переходе к production-серверу.
## API (прототип) ## API эндпоинты
### POST /api/diagnose | Метод | Путь | Описание | Время |
```json |---|---|---|---|
// Request (от клиента) | GET | /api/v1/ping | Проверка сервера | ~5мс |
{ | GET | /api/v1/ping-llm | Проверка LLM | ~2с |
"vin": "WVWZZZ1KZAW123456", | GET | /api/v1/script?mode= | Скрипт диагностики | ~50мс |
"dtc_codes": [{"code": "P0301", "status": "stored"}], | POST | /api/v1/session/upload | Загрузка батча + LLM | ~30-120с |
"parameters": [{"pid_code": "0105", "name": "coolant_temp", "value": 85.0, "unit": "°C"}] | POST | /api/v1/chat | Вопрос к LLM | ~5-15с |
}
// Response (от сервера) ## Android (отдельный репо)
{
"diagnosis": "## Краткий диагноз\n...", ```
"token_id": 42 elmer-android/app/src/main/java/ru/elmer/client/
} ├── ElmProtocol.kt # ELM327 стейт-машина
├── ObdDecoder.kt # Декодер PID/DTC/VIN
├── ServerClient.kt # HTTP к серверу (retry 3x)
├── ScriptEngine.kt # Движок скриптов
├── ScriptRunnerService.kt # Фоновая диагностика
├── SessionDb.kt # Локальная история
├── MainActivity.kt # UI
├── TestService.kt # (устарел)
└── ElmForwardService.kt # (устарел)
``` ```
## Безопасность Планируется рефакторинг в пакеты: `elm/`, `server/`, `script/`, `db/`, `ui/`, `test/`.
- Permissions Android: только BLUETOOTH + INTERNET
- Никаких SMS/контактов/файлов/звонков
- Пользователь видит permissions ДО установки (RuStore и sideload)
- Модерация RuStore — базовая проверка на вредоносный код