Без Ollama приложение больше не выглядит зависшим
Проверка работы с недоступной Ollama показала: если машина с ней просто выключена, пакеты уходят в никуда и каждый вызов честно ждёт свой таймаут. Замер: запись одной вещи — 92 секунды, разбор фразы — 154, правка — 30. Формально всё работало, но пользоваться этим невозможно. Предохранитель в ollama.py: - перед дорогим запросом быстрая проверка TCP-соединения (1.5 с вместо 120); - после неудачи 30 секунд к серверу вообще не обращаемся; - при успехе результат кешируется на 5 секунд, чтобы не проверять на каждом шаге; - смена адреса в настройках и проба адреса сбрасывают паузу, иначе новый сервер полминуты считался бы мёртвым. Замер после: те же операции отвечают мгновенно, первая проверка — 1.5 с. Проверено в двух режимах недоступности: закрытый порт и молчащий адрес. Тесты закрепляют поведение: запись, разбор фразы и поиск при мёртвом адресе обязаны укладываться в 3 секунды и работать по существу — вещь записывается без тегов, фраза разбирается регулярками, поиск идёт по словам. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -177,6 +177,47 @@ config.DB_FILE.write_text("{ битый json", encoding="utf-8")
|
||||
r.check("битая база не роняет", c.get("/api/tree").status_code == 200)
|
||||
r.check("пустой ввод не роняет", "reply" in j("POST", "/api/say", text=" "))
|
||||
|
||||
print("\n== Работа без Ollama: не ждём таймаутов ==")
|
||||
# Машина с Ollama бывает выключена, и тогда пакеты уходят в никуда. Без
|
||||
# предохранителя запись одной вещи ждала 92 секунды, разбор фразы — 154:
|
||||
# пользователь решит, что приложение зависло. 192.0.2.1 — из блока TEST-NET-1
|
||||
# (RFC 5737), он гарантированно не отвечает.
|
||||
import time as _time # noqa: E402
|
||||
_was_host = config.OLLAMA_HOST
|
||||
try:
|
||||
config.OLLAMA_HOST = "http://192.0.2.1:11434"
|
||||
ollama.reset_breaker()
|
||||
|
||||
t0 = _time.time()
|
||||
alive = ollama.check()
|
||||
first = _time.time() - t0
|
||||
r.check("недоступность видна быстро", not alive and first < 5, "%.1f с" % first)
|
||||
|
||||
t0 = _time.time()
|
||||
d = j("POST", "/api/put", name="вещь без ии")
|
||||
put_time = _time.time() - t0
|
||||
r.check("запись вещи не ждёт таймаут", d.get("ok") and put_time < 3,
|
||||
"%.1f с, ответ: %s" % (put_time, d))
|
||||
r.check("тегов нет, но вещь записана",
|
||||
d.get("item", {}).get("aliases") == [], d.get("item"))
|
||||
|
||||
t0 = _time.time()
|
||||
d = j("POST", "/api/say", text="положил кусачки в коробку D1")
|
||||
say_time = _time.time() - t0
|
||||
r.check("свободная фраза не ждёт таймаут", say_time < 3, "%.1f с" % say_time)
|
||||
r.check("фраза разобрана регулярками", d.get("kind") == "put", d)
|
||||
|
||||
t0 = _time.time()
|
||||
d = c.get("/api/find?q=вещь без ии").get_json()
|
||||
r.check("поиск работает без ИИ", d["items"] and _time.time() - t0 < 3, d)
|
||||
|
||||
r.check("смена адреса сбрасывает паузу",
|
||||
(ollama.reset_breaker() or True) and ollama._down_until == 0)
|
||||
finally:
|
||||
config.OLLAMA_HOST = _was_host
|
||||
ollama.reset_breaker()
|
||||
r.check("после возврата адреса связь есть", ollama.check() if HAS_AI else True)
|
||||
|
||||
print("\n== Батники: только ASCII ==")
|
||||
# cmd.exe читает .cmd в системной кодировке. Кириллица внутри — даже
|
||||
# в комментарии rem — превращается в мусор, и cmd пытается выполнить обрывки
|
||||
|
||||
Reference in New Issue
Block a user