diff --git a/web/script_endpoint.py b/web/script_endpoint.py index 55f95ed..316be31 100644 --- a/web/script_endpoint.py +++ b/web/script_endpoint.py @@ -131,6 +131,89 @@ def register(app): "llm_success": llm_success, }) + @app.route("/api/v1/chat", methods=["POST"]) + def chat(): + """Свободный вопрос к LLM (без ELM).""" + from flask import request, jsonify + from elmer.config import load + from elmer.diagnose import Diagnoser + + data = request.get_json(silent=True) + if not data or "question" not in data: + return jsonify({"error": "missing 'question'"}), 400 + + question = data["question"].strip() + if not question: + return jsonify({"answer": "Пустой вопрос."}) + + # История диалога + history = data.get("history", []) + history_text = "" + if history: + history_text = "## История диалога\n" + for m in history[-10:]: # последние 10 сообщений + role = "Водитель" if m.get("role") == "user" else "Автоэксперт" + history_text += f"{role}: {m.get('content', '')}\n" + history_text += "\n" + + cfg = load() + api_key = cfg["llm"]["api_key"] + if not api_key: + return jsonify({"answer": "LLM не настроен."}) + + prompt = ( + f"{history_text}" + f"Ты — автоэксперт. Помни контекст диалога выше. " + f"Отвечай КРАТКО, не более 20 строк. Без воды, только по делу.\n\n" + f"Вопрос: {question}" + ) + + try: + diagnoser = Diagnoser( + api_key=api_key, + model=cfg["llm"].get("model", "gpt-oss-120b"), + base_url=cfg["llm"].get("base_url", "https://api.aillm.ru/v1"), + ) + answer = diagnoser.diagnose( + "Ты — лаконичный автоэксперт. Помни контекст диалога. Отвечай кратко, максимум 20 строк.", + prompt, + ) + except Exception as e: + answer = f"LLM недоступен: {e}" + + return jsonify({"answer": answer}) + + @app.route("/api/v1/ping", methods=["GET"]) + def ping(): + """Быстрая проверка доступности сервера.""" + return {"ok": True} + + @app.route("/api/v1/ping-llm", methods=["GET"]) + def ping_llm(): + """Быстрая проверка доступности LLM.""" + from flask import jsonify + from elmer.config import load + from elmer.diagnose import Diagnoser + + cfg = load() + api_key = cfg["llm"]["api_key"] + if not api_key: + return jsonify({"ok": False, "error": "no API key"}) + + t0 = time.time() + try: + diagnoser = Diagnoser( + api_key=api_key, + model=cfg["llm"].get("model", "gpt-oss-120b"), + base_url=cfg["llm"].get("base_url", "https://api.aillm.ru/v1"), + ) + diagnoser.diagnose("Отвечай одним словом.", "OK") + ms = int((time.time() - t0) * 1000) + return jsonify({"ok": True, "ms": ms}) + except Exception as e: + ms = int((time.time() - t0) * 1000) + return jsonify({"ok": False, "ms": ms, "error": str(e)[:100]}) + def _summary(p: dict) -> dict: return { diff --git a/web/templates/index.html b/web/templates/index.html index d58c138..ddcadcb 100644 --- a/web/templates/index.html +++ b/web/templates/index.html @@ -12,14 +12,14 @@

🔧 elmAI

Диагностика авто через ELM327 + ИИ

-

v0.18.0-dev — 28 мая 2026

+

v0.27.0-dev — 29 мая 2026

📱 Скачай приложение на телефон:

⬇️ Скачать elmAI APK -

v0.18.0-dev • нажмите чтобы скачать

+

v0.27.0-dev • нажмите чтобы скачать