147 lines
7.8 KiB
Markdown
147 lines
7.8 KiB
Markdown
# Вопросы к Opus 4.8 по проекту elmAI
|
||
|
||
> v0.35.0-dev, 31 мая 2026
|
||
> Сервер: Ubuntu 24, Python/Flask, gunicorn + nginx
|
||
> Android: Kotlin, minSdk 24, OkHttp
|
||
> LLM: api.aillm.ru, модель gpt-oss-120b
|
||
|
||
---
|
||
|
||
## Какие файлы смотреть (и только их)
|
||
|
||
### Сервер (elmer/)
|
||
- `obd/protocol.py` — ELM327 стейт-машина AndrOBD (State, Rsp, AdaptiveTiming)
|
||
- `brain/client.py` — Diagnoser (HTTP к LLM API)
|
||
- `brain/prompts.py` — SYSTEM_PROMPT для диагностики
|
||
- `api/routes.py` — все 5 эндпоинтов (script, upload, chat, ping, ping-llm)
|
||
- `api/db.py` — SQLite: таблица sessions (30+ полей)
|
||
- `api/scripts.py` — сборка диагностических скриптов
|
||
- `api/parser.py` — парсинг ответов ELM327
|
||
- `web/app.py` — точка входа Flask
|
||
- `doc/architecture.md` — описание архитектуры
|
||
|
||
### Android (elmer-android/)
|
||
- `script/ScriptRunnerService.kt` — сервис фоновой диагностики
|
||
- `script/ScriptEngine.kt` — движок выполнения скриптов
|
||
- `script/UploadProgress.kt` — таймер прогресса загрузки
|
||
- `server/ServerClient.kt` — HTTP-клиент (OkHttp, retry 3x)
|
||
- `elm/ElmProtocol.kt` — ELM327 стейт-машина (Kotlin)
|
||
- `elm/ObdDecoder.kt` — декодер PID/DTC/VIN
|
||
- `ui/MainActivity.kt` — главный экран
|
||
- `db/SessionDb.kt` — локальная SQLite
|
||
|
||
---
|
||
|
||
## Вопрос 1. Стейт-машина ELM327: баги и крайние случаи
|
||
|
||
**Файлы**: `obd/protocol.py`, `elm/ElmProtocol.kt`
|
||
|
||
Стейт-машина — 1:1 копия AndrOBD (ElmProt.java). Ключевые моменты:
|
||
- Байт-за-байтом чтение с 1мс поллингом
|
||
- `>` как разделитель ответов
|
||
- Адаптивный таймаут (200мс ± 4мс)
|
||
- Восстановление после BUS ERROR (ATPC → ATSP0)
|
||
|
||
Вопросы:
|
||
1. Есть ли race conditions или deadlocks в переходах состояний?
|
||
2. Что если `>` приходит НЕ после полного ответа (мусор в буфере)?
|
||
3. Корректна ли логика восстановления после BUS ERROR? Не теряем ли мы ответы при ATPC→ATSP0?
|
||
4. Достаточен ли 1мс поллинг или на некоторых ELM нужен меньше?
|
||
5. Есть ли риск бесконечного цикла в `_exec()` (10 ретраев)?
|
||
|
||
---
|
||
|
||
## Вопрос 2. HTTP 499 при upload с мобильной сети
|
||
|
||
**Файлы**: `script/ScriptRunnerService.kt`, `server/ServerClient.kt`, `api/routes.py`
|
||
|
||
**Симптом**: сервер получает POST, но клиент обрывает соединение (nginx: 499).
|
||
- Connect timeout: 30с, read: 180с, write: 60с
|
||
- 3 ретрая с задержкой 2с
|
||
- nginx: client_body_timeout 120s, proxy_read_timeout 300s
|
||
- gunicorn: timeout 180s
|
||
|
||
Вопросы:
|
||
1. Какие ещё причины HTTP 499 на мобильной сети кроме таймаутов?
|
||
2. Достаточна ли стратегия ретраев? Может, нужен exponential backoff?
|
||
3. Может ли проблема быть в отправке тела запроса (write timeout) на медленной сети?
|
||
4. Стоит ли разбивать upload на чанки или сжать JSON?
|
||
5. Корректно ли мы обрабатываем случай, когда сервер получил запрос но клиент упал — данные могут дублироваться?
|
||
|
||
---
|
||
|
||
## Вопрос 3. Архитектура: три модуля + Android пакеты
|
||
|
||
**Файлы**: `doc/architecture.md`, `web/app.py`, `api/routes.py`
|
||
|
||
Сервер разбит на `obd/`, `brain/`, `api/`. Android — на `elm/`, `server/`, `script/`, `db/`, `ui/`.
|
||
|
||
Вопросы:
|
||
1. Чистые ли границы между модулями? Нет ли неявных зависимостей?
|
||
2. `api/routes.py` делает `from brain.client import Diagnoser` внутри функций — это нормально или лучше на уровне модуля?
|
||
3. Стоит ли вынести `config.yaml` из `api/` на уровень выше?
|
||
4. `web/app.py` зависит от `api/routes.py` — это правильное направление?
|
||
5. Какие модули можно было бы легко заменить (например, `brain/` на локальный LLM)?
|
||
|
||
---
|
||
|
||
## Вопрос 4. SQL схема: таблица sessions
|
||
|
||
**Файлы**: `api/db.py`
|
||
|
||
Таблица `sessions` — 30+ колонок (IP, телефон, ELM, авто, сессия, LLM). VIN — nullable.
|
||
Также старые таблицы: `cars`, `diagnostic_tokens`, `llm_messages`, `ecu_parameters`, `dtc_codes`.
|
||
|
||
Вопросы:
|
||
1. 30+ колонок в одной таблице — это нормально для SQLite или лучше разбить?
|
||
2. raw_responses хранится как JSON TEXT — ок ли для SQLite?
|
||
3. Индексы: по `created_at`, `vin`, `elm_mac`, `android_id` — достаточны?
|
||
4. Старые таблицы (cars, dtc_codes) всё ещё создаются в `_init_schema()` но не используются. Удалять или оставить для совместимости?
|
||
5. Нет ли проблем с конкурентным доступом к SQLite из gunicorn (4 воркера)?
|
||
|
||
---
|
||
|
||
## Вопрос 5. LLM-интеграция: промпты и таймауты
|
||
|
||
**Файлы**: `brain/client.py`, `brain/prompts.py`, `api/routes.py`
|
||
|
||
- Diagnoser использует `requests.post` без streaming
|
||
- SYSTEM_PROMPT — 10 правил ответа
|
||
- Для /chat — лимит 20 строк, история диалога (последние 10 сообщений)
|
||
|
||
Вопросы:
|
||
1. Достаточен ли промпт для качественной диагностики? Чего не хватает?
|
||
2. `requests.post` без streaming при таймауте 180с — ок или лучше streaming + heartbeat?
|
||
3. Для /chat: правильно ли форматируется история диалога? Не переполнит ли контекст?
|
||
4. Модель gpt-oss-120b — адекватный выбор? Какие альтернативы для авто-диагностики?
|
||
5. Как правильно обрабатывать ошибки LLM API (rate limit, timeout, bad response)?
|
||
|
||
---
|
||
|
||
## Вопрос 6. Безопасность API
|
||
|
||
**Файлы**: `api/routes.py`, `web/app.py`
|
||
|
||
- API без аутентификации, только HTTPS через nginx
|
||
- API ключ LLM на сервере, не в APK
|
||
- `usesCleartextTraffic` убран из манифеста
|
||
|
||
Вопросы:
|
||
1. Достаточен ли HTTPS без API-ключей для MVP? Какие риски?
|
||
2. Какие минимальные меры добавить: rate limiting, API key в APK, CORS?
|
||
3. `raw_responses` пишутся в БД — есть ли риск инъекции через ответы ELM327?
|
||
4. `/api/v1/chat` без аутентификации — можно ли его абузить (спамить токенами)?
|
||
5. Нужно ли скрывать API-ключ LLM за прокси или текущая схема ок?
|
||
|
||
---
|
||
|
||
## Формат ответа
|
||
|
||
Пожалуйста, запиши ответ в файл `/home/naeel/elmer/doc/opus-review.md`.
|
||
|
||
По каждому вопросу:
|
||
- 🔴 Критическая проблема (если есть)
|
||
- 🟡 Потенциальная проблема / улучшение
|
||
- 🟢 Всё ок
|
||
- Конкретные рекомендации с примерами кода где уместно
|