Files
elmer/doc/opus-questions.md
T

7.8 KiB
Raw Blame History

Вопросы к 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.

По каждому вопросу:

  • 🔴 Критическая проблема (если есть)
  • 🟡 Потенциальная проблема / улучшение
  • 🟢 Всё ок
  • Конкретные рекомендации с примерами кода где уместно