fix: load env variables, add fallback for doc conversion, and validate LLM API key
This commit is contained in:
+40
-15
@@ -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"):
|
||||
|
||||
Reference in New Issue
Block a user