update ai insight root cause

This commit is contained in:
Alberto-Audrix committed 2026-10-06 14:26:26 +07:00
1 parent 7e8c06d36f
commit 15ebdcce78
7 files changed
+297 -48

No files matched your search

+64 -38
View File
@@ -254,7 +254,6 @@ class AIInsightViewSet(CycleScopedViewSet):
@action(detail=False, methods=["get"], url_path="cached")
def cached(self, request):
import json
params = request.query_params
cycle_id = params.get("cycle_id")
kandang_id = params.get("kandang_id")
@@ -280,27 +279,7 @@ class AIInsightViewSet(CycleScopedViewSet):
if row is None:
return Response({"detail": "No cached insight."}, status=status.HTTP_404_NOT_FOUND)
raw_cites = row.citations
if isinstance(raw_cites, list):
cites = raw_cites
elif isinstance(raw_cites, str) and raw_cites.strip():
try:
cites = json.loads(raw_cites)
except Exception:
cites = []
else:
cites = []
return Response({
"success": True,
"insight_text": row.insight_text,
"summary": row.summary,
"alert": row.alert,
"citations": cites,
"topic": row.topic,
"report_type": row.report_type,
"report_period": row.report_period,
})
return Response(self._serialize_row(row))
@action(detail=False, methods=["post"], url_path="generate")
def generate(self, request):
@@ -327,27 +306,74 @@ class AIInsightViewSet(CycleScopedViewSet):
.first()
)
if row is not None:
import json
raw_cites = row.citations
try:
cites = json.loads(raw_cites) if isinstance(raw_cites, str) else (raw_cites or [])
except Exception:
cites = []
return Response({
"success": True,
"insight_text": row.insight_text,
"summary": row.summary,
"alert": row.alert,
"citations": cites,
"topic": row.topic,
"report_type": row.report_type,
"report_period": row.report_period,
})
return Response(self._serialize_row(row))
return Response(
{"detail": "Insight belum tersedia pada mirror HQ. Pastikan insight telah di-generate pada site dashboard dan disinkronkan."},
status=status.HTTP_404_NOT_FOUND,
)
def _serialize_row(self, row: AIInsight) -> dict:
import json
raw_cites = row.citations
if isinstance(raw_cites, list):
cites = raw_cites
elif isinstance(raw_cites, str) and raw_cites.strip():
try:
cites = json.loads(raw_cites)
except Exception:
cites = []
else:
cites = []
insight_raw = row.insight_text or ""
akar_masalah = ""
insight_body = insight_raw
structured_end_cycle = None
if "<!--daily_json-->" in insight_raw:
raw = insight_raw.split("<!--daily_json-->", 1)[1].strip()
try:
embedded = json.loads(raw)
if isinstance(embedded, dict):
akar_masalah = str(embedded.get("akar_masalah") or "").strip()
insight_body = str(
embedded.get("insight") or insight_raw.split("<!--daily_json-->", 1)[0]
).strip()
except Exception:
insight_body = insight_raw.split("<!--daily_json-->", 1)[0].strip()
elif "<!--end_cycle_json-->" in insight_raw:
raw = insight_raw.split("<!--end_cycle_json-->", 1)[1].strip()
try:
structured_end_cycle = json.loads(raw)
except Exception:
pass
insight_body = insight_raw.split("<!--end_cycle_json-->", 1)[0].strip()
parts = [row.summary]
if akar_masalah:
parts.append(akar_masalah)
if insight_body:
parts.append(insight_body)
full_text = "\n\n".join(p for p in parts if p) or insight_body or ""
return {
"success": True,
"id": row.pk,
"cycle": row.cycle_id,
"kandang": row.kandang_id,
"topic": row.topic,
"report_type": row.report_type,
"report_period": row.report_period,
"summary": row.summary,
"akar_masalah": akar_masalah,
"insight": insight_body,
"insight_text": full_text,
"structured_end_cycle": structured_end_cycle,
"alert": row.alert,
"citations": cites,
}
class HealthView(APIView):
permission_classes = [AllowAny]