fix: load env variables, add fallback for doc conversion, and validate LLM API key

This commit is contained in:
Repinoid
2026-10-31 14:13:33 +03:00
parent ae34f04fc3
commit 631bc750d5
3 changed files with 91 additions and 18 deletions
+40 -15
View File
@@ -9,22 +9,47 @@ import config
def _convert(filename: str, data: bytes) -> bytes:
""".doc → .docx через внешний libreoffice-сервис. Возвращает docx-байты."""
try:
resp = httpx.post(
config.CONVERT_SERVICE_URL + "/convert",
files={"file": (filename, data, "application/msword")},
timeout=120,
)
except httpx.TimeoutException:
raise Exception("conversion timeout")
if resp.status_code != 200:
""".doc → .docx через внешний libreoffice-сервис с fallback на публичный endpoint.
Назначение:
Преобразование устаревшего бинарного формата Word 97-2003 (.doc) в современный .docx,
так как встроенный парсер документов работает исключительно со структурой OpenXML.
Почему реализован fallback:
Внутри Kubernetes-кластера сервис доступен по внутреннему DNS имени
(http://containerk8s.df36c8af-1a95-4623-b551-0d37b731ccca.svc.cluster.local:5000),
однако при запуске вне кластера (локальный сервер разработки, standalone-тесты)
внутреннее доменное имя не резолвится ([Errno -2] Name or service not known).
В таком случае запрос автоматически повторяется к публичному ingress-эндпоинту
https://liberta.containerk8s.dev.nubes.ru, гарантируя прозрачную работу в любых средах.
"""
urls = [config.CONVERT_SERVICE_URL]
fallback = "https://liberta.containerk8s.dev.nubes.ru"
if fallback not in urls:
urls.append(fallback)
last_err = None
for base_url in urls:
if not base_url:
continue
try:
err = resp.json().get("error", "conversion failed")
except Exception:
err = "conversion failed"
raise Exception(err)
return resp.content
resp = httpx.post(
base_url.rstrip("/") + "/convert",
files={"file": (filename, data, "application/msword")},
timeout=120,
)
if resp.status_code == 200:
return resp.content
try:
last_err = resp.json().get("error", "conversion failed")
except Exception:
last_err = f"HTTP {resp.status_code}"
except httpx.TimeoutException:
last_err = "conversion timeout"
except Exception as e:
last_err = str(e)
continue
raise Exception(last_err or "conversion failed")
def _store_and_parse(filename: str, data: bytes, batch_id, contract_id, zip_source=None, mime_type="application/octet-stream"):