From 456e86ef9a3fe5c73b6e06136a4f8bbddca8dc4b Mon Sep 17 00:00:00 2001 From: Vladimir Bryzgalov Date: Mon, 17 Aug 2026 14:03:46 +0500 Subject: [PATCH] =?UTF-8?q?=D0=A1=D1=82=D1=80=D0=B0=D0=BD=D0=B8=D1=86?= =?UTF-8?q?=D0=B0=20=D0=BE=D0=B1=D1=8A=D1=8F=D1=81=D0=BD=D1=8F=D0=B5=D1=82?= =?UTF-8?q?,=20=D0=BF=D0=BE=D1=87=D0=B5=D0=BC=D1=83=20=D0=BD=D0=B5=D1=82?= =?UTF-8?q?=20=D1=80=D0=B0=D0=B7=D0=B1=D0=B8=D0=B2=D0=BA=D0=B8=20=D0=BD?= =?UTF-8?q?=D0=B0=20=D0=BF=D1=80=D0=B5=D0=B4=D0=BB=D0=BE=D0=B6=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Результаты, обработанные до 0.14.0, не содержат массива sentences. Пустой блок разметки выглядел бы поломкой страницы - теперь он говорит, что нужно отправить запись заново. Co-Authored-By: Claude Opus 5 (1M context) --- app/view.py | 21 ++++++++++++++++----- tests/test_view.py | 9 +++++++++ 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/app/view.py b/app/view.py index b83b2c0..caf339d 100644 --- a/app/view.py +++ b/app/view.py @@ -67,6 +67,20 @@ def render_job(job: dict) -> str: # Внутри в тексте # закрыла бы тег и всё, что дальше, браузер прочитал бы как разметку. + if sentences: + roles_block = ( + '
Вставьте ответ модели - строку из букв M и C, ' + 'по одной на предложение. Диалог соберётся ниже, и станет видно, ' + 'где ошибка: в тексте от сервиса или в расстановке ролей.
' + '') + else: + # Массив предложений появился в 0.14.0. Без него собирать диалог не из + # чего, и молчаливо пустой блок выглядел бы поломкой страницы. + roles_block = ( + '
В этом результате нет разбивки на предложения: ' + 'запись обработана версией сервиса старше 0.14.0. Отправьте её заново, ' + 'чтобы собрать диалог по ролям.
') + payload = json.dumps( [{"n": s["n"], "text": s["text"], "start": s["start"]} for s in sentences], ensure_ascii=False).replace("<", "\\u003c").replace("\u2028", "\\u2028") @@ -119,10 +133,7 @@ def render_job(job: dict) -> str: {"".join(rows) or "
реплик нет
"}

Разметка ролей

-
Вставьте ответ модели - строку из букв M и C, по одной -на предложение. Диалог соберётся ниже, и станет видно, где ошибка: -в тексте от сервиса или в расстановке ролей.
- +{roles_block}
@@ -151,5 +162,5 @@ function draw() {{ buf.push(s.text.replace(/[&<>]/g, c => ({{'&':'&','<':'<','>':'>'}})[c])); }}); flush(); out.innerHTML = html; }} -box.addEventListener('input', draw); +if (box) box.addEventListener('input', draw); """ diff --git a/tests/test_view.py b/tests/test_view.py index de295c6..c88ac9f 100644 --- a/tests/test_view.py +++ b/tests/test_view.py @@ -71,3 +71,12 @@ class TestPage: def test_survives_empty_result(self): page = render_job({"job_id": "x", "turns": [], "sentences": [], "duration_sec": 0}) assert "реплик нет" in page + + def test_old_result_explains_missing_sentences(self): + """Результаты до 0.14.0 не содержат предложений - пустой блок выглядел бы поломкой.""" + page = render_job({"job_id": "x", "turns": [], "sentences": [], "duration_sec": 10}) + assert "старше 0.14.0" in page + assert "