diff --git a/apps/api/src/services/incident_service.py b/apps/api/src/services/incident_service.py index db2461ab..378a5fdb 100644 --- a/apps/api/src/services/incident_service.py +++ b/apps/api/src/services/incident_service.py @@ -836,6 +836,17 @@ class IncidentService: except Exception: logger.exception("kb_extract_task_create_failed", incident_id=incident_id) + # ADR-073 Phase 4-2: resolve 時觸發 KM conversion (2026-04-12 ogt) + # 將已解決的 Incident 轉換為結構化 KM 條目,驅動飛輪學習固化節點 + try: + import asyncio + from src.services.km_conversion_service import get_km_conversion_service + asyncio.create_task( + get_km_conversion_service().convert(incident) + ) + except Exception: + logger.exception("km_conversion_task_create_failed", incident_id=incident_id) + # 2026-04-07 Claude Code: Sprint 4 B4 — 手動處理推斷 # I1+S1 Fix: 委託 derive_key_from_incident() 統一推導 try: diff --git a/k8s/awoooi-prod/15-cronjob-km-vectorize.yaml b/k8s/awoooi-prod/15-cronjob-km-vectorize.yaml new file mode 100644 index 00000000..7234db7b --- /dev/null +++ b/k8s/awoooi-prod/15-cronjob-km-vectorize.yaml @@ -0,0 +1,65 @@ +# ============================================================================= +# KM Vectorize CronJob - ADR-073 Phase 4-3 飛輪學習固化 +# ============================================================================= +# 每日 03:00 台北 (19:00 UTC 前一天) 自動向量化新增 KM 條目 +# 確保 RAG 查詢可存取最新知識,完成飛輪「學習固化」節點 +# +# 2026-04-12 ogt (ADR-073 Phase 4-3) +# ============================================================================= + +apiVersion: batch/v1 +kind: CronJob +metadata: + name: km-vectorize + namespace: awoooi-prod + labels: + app: awoooi + component: km-vectorize + phase: "4-3" +spec: + # 每日 19:00 UTC = 03:00 台北 + schedule: "0 19 * * *" + timeZone: "Asia/Taipei" + concurrencyPolicy: Forbid + successfulJobsHistoryLimit: 3 + failedJobsHistoryLimit: 3 + startingDeadlineSeconds: 300 + jobTemplate: + spec: + backoffLimit: 2 + activeDeadlineSeconds: 300 + template: + metadata: + labels: + app: awoooi + component: km-vectorize + spec: + restartPolicy: OnFailure + containers: + - name: km-vectorize + image: 192.168.0.110:5000/awoooi-api:latest + imagePullPolicy: Always + command: + - python + - -c + - | + import asyncio, httpx, os + async def main(): + api = os.environ.get("INTERNAL_API_URL", "http://awoooi-api:8000") + async with httpx.AsyncClient(timeout=120) as c: + r = await c.post(f"{api}/api/v1/knowledge/embed-all") + print("embed-all:", r.status_code, r.text[:200]) + asyncio.run(main()) + env: + - name: TZ + value: "Asia/Taipei" + - name: INTERNAL_API_URL + value: "http://awoooi-api.awoooi-prod.svc.cluster.local:8000" + resources: + requests: + cpu: "50m" + memory: "64Mi" + limits: + cpu: "200m" + memory: "128Mi" + serviceAccountName: awoooi-api diff --git a/k8s/awoooi-prod/kustomization.yaml b/k8s/awoooi-prod/kustomization.yaml index 15fd0735..c6fdb512 100644 --- a/k8s/awoooi-prod/kustomization.yaml +++ b/k8s/awoooi-prod/kustomization.yaml @@ -30,6 +30,7 @@ resources: - 09-pdb.yaml - 13-cronjob-k3s-report.yaml - 14-cronjob-weekly-report.yaml +- 15-cronjob-km-vectorize.yaml # 映像配置 (Tag 由 CI 動態注入) # Harbor 金庫: 110 主機 (192.168.0.110:5000)