From 8ca070ed70c3e4c4f9f4bdb9ee02373237849471 Mon Sep 17 00:00:00 2001 From: apuc Date: Tue, 22 Sep 2026 11:37:38 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20LLM=20=D0=B8=D0=BD=D0=BE=D0=B3=D0=B4?= =?UTF-8?q?=D0=B0=20=D0=B2=D0=BE=D0=B7=D0=B2=D1=80=D0=B0=D1=89=D0=B0=D0=B5?= =?UTF-8?q?=D1=82=20=D0=BF=D1=83=D1=81=D1=82=D0=BE=D0=B9=20=D1=82=D0=B5?= =?UTF-8?q?=D0=BA=D1=81=D1=82=20=E2=80=94=20raise=20=D0=BF=D1=80=D0=B8=20?= =?UTF-8?q?=D0=BF=D1=83=D1=81=D1=82=D0=BE=D0=BC=20content,=20=D1=80=D0=B5?= =?UTF-8?q?=D1=82=D1=80=D0=B0=D0=B9=20=D0=B2=20generate=5Fresponse=5Fwith?= =?UTF-8?q?=5Fretry,=20=D1=84=D1=80=D0=BE=D0=BD=D1=82=D0=B5=D0=BD=D0=B4=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=BA=D0=B0=D0=B7=D1=8B=D0=B2=D0=B0=D0=B5=D1=82=20?= =?UTF-8?q?=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D1=83=20=D0=B2=D0=BC=D0=B5=D1=81?= =?UTF-8?q?=D1=82=D0=BE=20=D0=BC=D0=BE=D0=BB=D1=87=D0=B0=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hh_llm.py | 5 ++++- templates/index.html | 2 ++ webui.py | 6 +++--- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/hh_llm.py b/hh_llm.py index 030af68..7b80dca 100644 --- a/hh_llm.py +++ b/hh_llm.py @@ -90,7 +90,10 @@ def generate_response(llm_config, vacancy, resume_text, style_hint=""): raise RuntimeError(f"LLM ошибка {resp.status_code}: {resp.text[:300]}") data = resp.json() - return data["choices"][0]["message"]["content"].strip() + content = (data["choices"][0]["message"].get("content") or "").strip() + if not content: + raise RuntimeError("LLM вернул пустой текст — попробуйте ещё раз") + return content def generate_response_with_retry(llm_config, vacancy, resume_text, style_hint="", attempts=2): diff --git a/templates/index.html b/templates/index.html index 860f5cb..82243fc 100644 --- a/templates/index.html +++ b/templates/index.html @@ -656,6 +656,8 @@ async function openSendModal(id) { renderTexts(); } else if (data.errors && data.errors[id]) { document.getElementById('send-modal-note').textContent = 'Ошибка: ' + data.errors[id]; + } else { + document.getElementById('send-modal-note').textContent = 'Не удалось сгенерировать текст — попробуйте ещё раз'; } } catch (e) { document.getElementById('send-loading').classList.add('hidden'); diff --git a/webui.py b/webui.py index 99bc316..7d2a8d8 100644 --- a/webui.py +++ b/webui.py @@ -31,7 +31,7 @@ from werkzeug.security import check_password_hash, generate_password_hash from hh_search import (search_vacancies, fetch_vacancy_details, fetch_my_resumes, parse_cookies, get_proxies) -from hh_llm import generate_response +from hh_llm import generate_response_with_retry from hh_browser import browser_open, browser_send, browser_close BASE_DIR = os.path.dirname(os.path.abspath(__file__)) @@ -508,8 +508,8 @@ def api_generate(name): details = fetch_vacancy_details(vid, proxies=get_proxies()) or {} vacancy_full = {**vacancy, **details} try: - texts[vid] = generate_response(cfg.get("llm", {}), vacancy_full, - resume, cfg.get("style", "")) + texts[vid] = generate_response_with_retry(cfg.get("llm", {}), vacancy_full, + resume, cfg.get("style", "")) if limit is not None: used += 1 bump_llm_usage(current_user())