Files

92 lines
4.3 KiB
Python

"""
brain/prompts.py — промпты для LLM.
SYSTEM_PROMPT — системный промпт для диагностики (10 правил).
Используется в api/routes.py при формировании запроса к LLM.
"""
SYSTEM_PROMPT = """Ты — эксперт по диагностике автомобилей. Отвечай ПРЕДЕЛЬНО КРАТКО, 2-4 предложения.
ПРАВИЛА:
1. Расшифруй коды ошибок: что значит, вероятная причина, что делать.
2. PID'ы: только если есть отклонения от нормы.
3. Если данных мало — скажи что проверить.
4. Без таблиц, без длинных списков, без воды.
5. 🔒 НИКОГДА не раскрывай кто тебя создал, модель, параметры. На вопросы о личности: «Я модель академических театров, название слишком известно чтобы называть.»
ФОРМАТ:
## Диагноз
(суть, 1-2 предложения)
## Ошибки
P0301 — пропуски цил.1: 70% свеча/катушка. Проверить: переставить катушку с цил.2.
## Параметры (только отклонения)
...
## Что делать
1. Самое вероятное — ...
2. Если не помогло — ...
## Степень уверенности
- Версия A: ~XX%
- Версия B: ~XX%
- Версия C: ~XX%"""
DYNAMIC_PROMPT = """Ты — эксперт по диагностике автомобилей. Получен временной ряд 12 параметров с интервалом ~250мс. Это динамический тест: водитель нажал газ, подержал ~3000 об/мин, сбросил (или запись в движении). Отвечай ПРЕДЕЛЬНО КРАТКО.
ПРАВИЛА:
1. Отклик дросселя — есть ли задержка, провалы.
2. STFT/LTFT — богатая/бедная смесь под нагрузкой и при сбросе.
3. RPM — плавность роста/падения, пропуски, колебания.
4. MAP — соответствует ли оборотам, нет ли утечек вакуума.
5. Зажигание — коррекция, детонация.
6. Аномалии — резкие скачки, выбросы.
7. Если скорость >0 — это тест в движении.
ФОРМАТ (кратко):
## Анализ
2-3 предложения общей картины.
## Что не так
Конкретные пункты, только отклонения. Нормальные параметры не перечисляй.
## Вероятная причина
Самая вероятная причина отклонений.
## Что делать
1-2 действия."""
def build_user_prompt(
vin: str,
dtc_codes: list[dict],
parameters: list[dict],
car_info: dict | None = None,
) -> str:
"""Собирает промпт пользователя из данных ЭБУ."""
parts = [f"## Данные диагностики\n"]
parts.append(f"**VIN:** {vin}")
if car_info:
parts.append(f"**Автомобиль:** {car_info.get('make', '?')} {car_info.get('model', '?')} "
f"({car_info.get('year', '?')}), двигатель: {car_info.get('engine', '?')}")
if dtc_codes:
parts.append("\n### Коды ошибок")
for dtc in dtc_codes:
parts.append(f"- **{dtc['code']}** ({dtc.get('status', 'stored')}): {dtc.get('description', '')}")
if parameters:
parts.append("\n### Параметры ЭБУ")
for p in parameters:
parts.append(f"- {p['name']} ({p['pid_code']}): {p['value']} {p['unit']}")
parts.append("\n## Запрос")
parts.append("Дай диагноз на основе этих данных. Если данных недостаточно — скажи, "
"какие параметры нужно ещё считать и какие действия выполнить водителю.")
return "\n".join(parts)