7.8 KiB
Вопросы к 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— парсинг ответов ELM327web/app.py— точка входа Flaskdoc/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/VINui/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)
Вопросы:
- Есть ли race conditions или deadlocks в переходах состояний?
- Что если
>приходит НЕ после полного ответа (мусор в буфере)? - Корректна ли логика восстановления после BUS ERROR? Не теряем ли мы ответы при ATPC→ATSP0?
- Достаточен ли 1мс поллинг или на некоторых ELM нужен меньше?
- Есть ли риск бесконечного цикла в
_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
Вопросы:
- Какие ещё причины HTTP 499 на мобильной сети кроме таймаутов?
- Достаточна ли стратегия ретраев? Может, нужен exponential backoff?
- Может ли проблема быть в отправке тела запроса (write timeout) на медленной сети?
- Стоит ли разбивать upload на чанки или сжать JSON?
- Корректно ли мы обрабатываем случай, когда сервер получил запрос но клиент упал — данные могут дублироваться?
Вопрос 3. Архитектура: три модуля + Android пакеты
Файлы: doc/architecture.md, web/app.py, api/routes.py
Сервер разбит на obd/, brain/, api/. Android — на elm/, server/, script/, db/, ui/.
Вопросы:
- Чистые ли границы между модулями? Нет ли неявных зависимостей?
api/routes.pyделаетfrom brain.client import Diagnoserвнутри функций — это нормально или лучше на уровне модуля?- Стоит ли вынести
config.yamlизapi/на уровень выше? web/app.pyзависит отapi/routes.py— это правильное направление?- Какие модули можно было бы легко заменить (например,
brain/на локальный LLM)?
Вопрос 4. SQL схема: таблица sessions
Файлы: api/db.py
Таблица sessions — 30+ колонок (IP, телефон, ELM, авто, сессия, LLM). VIN — nullable.
Также старые таблицы: cars, diagnostic_tokens, llm_messages, ecu_parameters, dtc_codes.
Вопросы:
- 30+ колонок в одной таблице — это нормально для SQLite или лучше разбить?
- raw_responses хранится как JSON TEXT — ок ли для SQLite?
- Индексы: по
created_at,vin,elm_mac,android_id— достаточны? - Старые таблицы (cars, dtc_codes) всё ещё создаются в
_init_schema()но не используются. Удалять или оставить для совместимости? - Нет ли проблем с конкурентным доступом к SQLite из gunicorn (4 воркера)?
Вопрос 5. LLM-интеграция: промпты и таймауты
Файлы: brain/client.py, brain/prompts.py, api/routes.py
- Diagnoser использует
requests.postбез streaming - SYSTEM_PROMPT — 10 правил ответа
- Для /chat — лимит 20 строк, история диалога (последние 10 сообщений)
Вопросы:
- Достаточен ли промпт для качественной диагностики? Чего не хватает?
requests.postбез streaming при таймауте 180с — ок или лучше streaming + heartbeat?- Для /chat: правильно ли форматируется история диалога? Не переполнит ли контекст?
- Модель gpt-oss-120b — адекватный выбор? Какие альтернативы для авто-диагностики?
- Как правильно обрабатывать ошибки LLM API (rate limit, timeout, bad response)?
Вопрос 6. Безопасность API
Файлы: api/routes.py, web/app.py
- API без аутентификации, только HTTPS через nginx
- API ключ LLM на сервере, не в APK
usesCleartextTrafficубран из манифеста
Вопросы:
- Достаточен ли HTTPS без API-ключей для MVP? Какие риски?
- Какие минимальные меры добавить: rate limiting, API key в APK, CORS?
raw_responsesпишутся в БД — есть ли риск инъекции через ответы ELM327?/api/v1/chatбез аутентификации — можно ли его абузить (спамить токенами)?- Нужно ли скрывать API-ключ LLM за прокси или текущая схема ок?
Формат ответа
Пожалуйста, запиши ответ в файл /home/naeel/elmer/doc/opus-review.md.
По каждому вопросу:
- 🔴 Критическая проблема (если есть)
- 🟡 Потенциальная проблема / улучшение
- 🟢 Всё ок
- Конкретные рекомендации с примерами кода где уместно