UPDATE
This commit is contained in:
@@ -18,6 +18,7 @@ from rag.chat import (
|
||||
build_rag_context,
|
||||
)
|
||||
from rag.config import RAGConfig, get_service_config, load_rag_config
|
||||
from rag.failure_contract import RAGServiceError
|
||||
from rag.user_data import build_plant_text
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
@@ -73,18 +74,47 @@ def _clean_json(raw: str) -> dict[str, Any]:
|
||||
cleaned = cleaned[4:]
|
||||
cleaned = cleaned.strip()
|
||||
if not cleaned:
|
||||
return {}
|
||||
raise RAGServiceError(
|
||||
error_code="empty_response",
|
||||
message="Pest disease LLM response was empty.",
|
||||
source="llm",
|
||||
retriable=True,
|
||||
details={"service_id": SERVICE_ID},
|
||||
http_status=502,
|
||||
)
|
||||
try:
|
||||
return json.loads(cleaned)
|
||||
except (json.JSONDecodeError, ValueError):
|
||||
parsed = json.loads(cleaned)
|
||||
except (json.JSONDecodeError, ValueError) as exc:
|
||||
logger.warning("Invalid JSON returned by pest_disease LLM: %s", cleaned[:500])
|
||||
return {}
|
||||
raise RAGServiceError(
|
||||
error_code="invalid_json",
|
||||
message="Pest disease LLM response was not valid JSON.",
|
||||
source="llm",
|
||||
retriable=True,
|
||||
details={"service_id": SERVICE_ID},
|
||||
http_status=502,
|
||||
) from exc
|
||||
if not isinstance(parsed, dict):
|
||||
raise RAGServiceError(
|
||||
error_code="invalid_schema",
|
||||
message="Pest disease LLM response root must be a JSON object.",
|
||||
source="llm",
|
||||
details={"service_id": SERVICE_ID},
|
||||
http_status=502,
|
||||
)
|
||||
return parsed
|
||||
|
||||
|
||||
def _load_farm_or_error(farm_uuid: str) -> dict[str, Any]:
|
||||
farm_details = get_farm_details(farm_uuid)
|
||||
if farm_details is None:
|
||||
raise ValueError("farm_uuid نامعتبر است یا اطلاعات مزرعه پیدا نشد.")
|
||||
raise RAGServiceError(
|
||||
error_code="farm_not_found",
|
||||
message="farm_uuid نامعتبر است یا اطلاعات مزرعه پیدا نشد.",
|
||||
source="farm_data",
|
||||
details={"farm_uuid": farm_uuid},
|
||||
http_status=404,
|
||||
)
|
||||
return farm_details
|
||||
|
||||
|
||||
@@ -213,9 +243,12 @@ def _validate_detection_result(parsed: dict[str, Any]) -> dict[str, Any]:
|
||||
}
|
||||
missing = [key for key in required_keys if key not in parsed]
|
||||
if missing:
|
||||
raise ValueError(
|
||||
"Pest disease detection response is missing required fields: "
|
||||
+ ", ".join(missing)
|
||||
raise RAGServiceError(
|
||||
error_code="invalid_schema",
|
||||
message="Pest disease detection response is missing required fields: " + ", ".join(missing),
|
||||
source="llm",
|
||||
details={"missing_fields": missing, "service_id": SERVICE_ID},
|
||||
http_status=502,
|
||||
)
|
||||
return parsed
|
||||
|
||||
@@ -232,9 +265,12 @@ def _validate_risk_result(parsed: dict[str, Any]) -> dict[str, Any]:
|
||||
}
|
||||
missing = [key for key in required_keys if key not in parsed]
|
||||
if missing:
|
||||
raise ValueError(
|
||||
"Pest disease risk response is missing required fields: "
|
||||
+ ", ".join(missing)
|
||||
raise RAGServiceError(
|
||||
error_code="invalid_schema",
|
||||
message="Pest disease risk response is missing required fields: " + ", ".join(missing),
|
||||
source="llm",
|
||||
details={"missing_fields": missing, "service_id": SERVICE_ID},
|
||||
http_status=502,
|
||||
)
|
||||
return parsed
|
||||
|
||||
@@ -301,7 +337,12 @@ def get_pest_disease_detection(
|
||||
) -> dict[str, Any]:
|
||||
normalized_images = _normalize_images(images)
|
||||
if not normalized_images:
|
||||
raise ValueError("حداقل یک تصویر برای تشخیص لازم است.")
|
||||
raise RAGServiceError(
|
||||
error_code="missing_images",
|
||||
message="حداقل یک تصویر برای تشخیص لازم است.",
|
||||
source="request",
|
||||
http_status=400,
|
||||
)
|
||||
|
||||
cfg = load_rag_config()
|
||||
service, client, model = _build_service_client(cfg)
|
||||
@@ -338,12 +379,25 @@ def get_pest_disease_detection(
|
||||
raw = response.choices[0].message.content.strip()
|
||||
parsed = _clean_json(raw)
|
||||
_complete_audit_log(audit_log, raw)
|
||||
except RAGServiceError as exc:
|
||||
logger.error("Pest disease detection failed for %s: %s", farm_uuid, exc)
|
||||
_fail_audit_log(audit_log, str(exc))
|
||||
raise
|
||||
except Exception as exc:
|
||||
logger.error("Pest disease detection failed for %s: %s", farm_uuid, exc)
|
||||
_fail_audit_log(audit_log, str(exc))
|
||||
raise RuntimeError(f"Pest disease detection failed for farm {farm_uuid}.") from exc
|
||||
raise RAGServiceError(
|
||||
error_code="upstream_failure",
|
||||
message=f"Pest disease detection failed for farm {farm_uuid}.",
|
||||
source="llm",
|
||||
retriable=True,
|
||||
details={"farm_uuid": farm_uuid, "service_id": SERVICE_ID},
|
||||
http_status=503,
|
||||
) from exc
|
||||
|
||||
parsed = _validate_detection_result(parsed)
|
||||
parsed["status"] = "success"
|
||||
parsed["source"] = "llm"
|
||||
parsed["farm_uuid"] = farm_uuid
|
||||
parsed["raw_response"] = raw
|
||||
return parsed
|
||||
@@ -392,12 +446,25 @@ def get_pest_disease_risk(
|
||||
raw = response.choices[0].message.content.strip()
|
||||
parsed = _clean_json(raw)
|
||||
_complete_audit_log(audit_log, raw)
|
||||
except RAGServiceError as exc:
|
||||
logger.error("Pest disease risk prediction failed for %s: %s", farm_uuid, exc)
|
||||
_fail_audit_log(audit_log, str(exc))
|
||||
raise
|
||||
except Exception as exc:
|
||||
logger.error("Pest disease risk prediction failed for %s: %s", farm_uuid, exc)
|
||||
_fail_audit_log(audit_log, str(exc))
|
||||
raise RuntimeError(f"Pest disease risk prediction failed for farm {farm_uuid}.") from exc
|
||||
raise RAGServiceError(
|
||||
error_code="upstream_failure",
|
||||
message=f"Pest disease risk prediction failed for farm {farm_uuid}.",
|
||||
source="llm",
|
||||
retriable=True,
|
||||
details={"farm_uuid": farm_uuid, "service_id": SERVICE_ID},
|
||||
http_status=503,
|
||||
) from exc
|
||||
|
||||
parsed = _validate_risk_result(parsed)
|
||||
parsed["status"] = "success"
|
||||
parsed["source"] = "llm"
|
||||
parsed["farm_uuid"] = farm_uuid
|
||||
parsed["raw_response"] = raw
|
||||
return parsed
|
||||
|
||||
Reference in New Issue
Block a user