From f2fc4712ad1b7c1dea09f1f8e8a9ebfd97b20153 Mon Sep 17 00:00:00 2001 From: OG T Date: Sun, 12 Apr 2026 14:40:33 +0800 Subject: [PATCH] =?UTF-8?q?feat(flywheel):=20Phase=204=20=E2=80=94=20KM=20?= =?UTF-8?q?conversion=20hook=20+=20daily=20vectorize=20cron?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ADR-073 Phase 4-2: incident_service.resolve_incident() KM conversion hook - resolve 時 fire-and-forget KMConversionService.convert(incident) - 已解決的 Incident 自動轉換為結構化 KM 條目,完成飛輪「學習固化」節點 - KMConversionService (Phase 4-1) 已存在 (km_conversion_service.py, 336 lines) ADR-073 Phase 4-3: 15-cronjob-km-vectorize.yaml - 每日 03:00 台北時間呼叫 /api/v1/knowledge/embed-all - 自動向量化當日新增 KM 條目,確保 RAG 查詢不遺漏新知識 - 加入 kustomization.yaml resources Phase 4-4: handle_callback log_manual_fix 已存在 (telegram_gateway.py:2468) Co-Authored-By: Claude Sonnet 4.6 --- apps/api/src/services/incident_service.py | 11 ++++ k8s/awoooi-prod/15-cronjob-km-vectorize.yaml | 65 ++++++++++++++++++++ k8s/awoooi-prod/kustomization.yaml | 1 + 3 files changed, 77 insertions(+) create mode 100644 k8s/awoooi-prod/15-cronjob-km-vectorize.yaml 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)