fix: LLM иногда возвращает пустой текст — raise при пустом content, ретрай в generate_response_with_retry, фронтенд показывает ошибку вместо молчания
This commit is contained in:
1 parent
d757d2f8c7
commit
8ca070ed70
3 files changed
+8
-3
No files matched your search
@@ -90,7 +90,10 @@ def generate_response(llm_config, vacancy, resume_text, style_hint=""):
|
|||||||
raise RuntimeError(f"LLM ошибка {resp.status_code}: {resp.text[:300]}")
|
raise RuntimeError(f"LLM ошибка {resp.status_code}: {resp.text[:300]}")
|
||||||
|
|
||||||
data = resp.json()
|
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):
|
def generate_response_with_retry(llm_config, vacancy, resume_text, style_hint="", attempts=2):
|
||||||
|
|||||||
@@ -656,6 +656,8 @@ async function openSendModal(id) {
|
|||||||
renderTexts();
|
renderTexts();
|
||||||
} else if (data.errors && data.errors[id]) {
|
} else if (data.errors && data.errors[id]) {
|
||||||
document.getElementById('send-modal-note').textContent = 'Ошибка: ' + data.errors[id];
|
document.getElementById('send-modal-note').textContent = 'Ошибка: ' + data.errors[id];
|
||||||
|
} else {
|
||||||
|
document.getElementById('send-modal-note').textContent = 'Не удалось сгенерировать текст — попробуйте ещё раз';
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
document.getElementById('send-loading').classList.add('hidden');
|
document.getElementById('send-loading').classList.add('hidden');
|
||||||
|
|||||||
@@ -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,
|
from hh_search import (search_vacancies, fetch_vacancy_details, fetch_my_resumes,
|
||||||
parse_cookies, get_proxies)
|
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
|
from hh_browser import browser_open, browser_send, browser_close
|
||||||
|
|
||||||
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
|
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||||
@@ -508,7 +508,7 @@ def api_generate(name):
|
|||||||
details = fetch_vacancy_details(vid, proxies=get_proxies()) or {}
|
details = fetch_vacancy_details(vid, proxies=get_proxies()) or {}
|
||||||
vacancy_full = {**vacancy, **details}
|
vacancy_full = {**vacancy, **details}
|
||||||
try:
|
try:
|
||||||
texts[vid] = generate_response(cfg.get("llm", {}), vacancy_full,
|
texts[vid] = generate_response_with_retry(cfg.get("llm", {}), vacancy_full,
|
||||||
resume, cfg.get("style", ""))
|
resume, cfg.get("style", ""))
|
||||||
if limit is not None:
|
if limit is not None:
|
||||||
used += 1
|
used += 1
|
||||||
|
|||||||
Reference in new issue
Block a user