feat: POST /api/v1/test/next + авто-подбор
This commit is contained in:
@@ -335,6 +335,42 @@ def register(app):
|
|||||||
return jsonify({"ok": True})
|
return jsonify({"ok": True})
|
||||||
|
|
||||||
|
|
||||||
|
@app.route("/api/v1/test/next", methods=["POST"])
|
||||||
|
def test_next():
|
||||||
|
"""Авто-подбор параметров теста. Принимает результаты, возвращает следующий скрипт или done."""
|
||||||
|
data = request.get_json(silent=True) or {}
|
||||||
|
results = data.get("results", [])
|
||||||
|
run = data.get("run", 0)
|
||||||
|
|
||||||
|
# Анализ результатов
|
||||||
|
total = len(results)
|
||||||
|
if total == 0:
|
||||||
|
return jsonify({"done": True, "message": "Нет данных", "script": None})
|
||||||
|
|
||||||
|
ok_count = sum(1 for r in results if r.get("raw", "").startswith("41"))
|
||||||
|
err_pct = (total - ok_count) * 100 // total if total > 0 else 100
|
||||||
|
wait_ms = int(request.args.get("wait", data.get("wait_ms", 1500)))
|
||||||
|
|
||||||
|
max_runs = 5
|
||||||
|
if err_pct < 20 or run >= max_runs:
|
||||||
|
return jsonify({
|
||||||
|
"done": True,
|
||||||
|
"message": f"✅ Стабильно: {ok_count}/{total} ({err_pct}% ошибок) на wait={wait_ms}ms",
|
||||||
|
"script": None,
|
||||||
|
"final_wait_ms": wait_ms,
|
||||||
|
})
|
||||||
|
|
||||||
|
# Увеличиваем паузу
|
||||||
|
new_wait = wait_ms + 300
|
||||||
|
return jsonify({
|
||||||
|
"done": False,
|
||||||
|
"message": f"⚠️ {err_pct}% ошибок — увеличиваю паузу до {new_wait}ms",
|
||||||
|
"run": run + 1,
|
||||||
|
"wait_ms": new_wait,
|
||||||
|
"script": build_test_script(wait_ms=new_wait, pids=["010C", "0106"], repeat=6),
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
def _save_profile(mac: str, profile: dict):
|
def _save_profile(mac: str, profile: dict):
|
||||||
"""Сохраняет профиль в БД (best-effort)."""
|
"""Сохраняет профиль в БД (best-effort)."""
|
||||||
try:
|
try:
|
||||||
|
|||||||
Reference in New Issue
Block a user