fix(playbook+flywheel): 修復 PlaybookSource enum + repair_steps 相容 + KM stats raw SQL
修復三個串聯 bug,讓 Playbook seed 能正常執行: 1. PlaybookSource 新增 YAML_RULE enum(alert_rules.yaml 匯入專用) 2. playbook_seed_service: source=YAML_RULE,dedup 改用 raw SQL by name, 不再呼叫 list_playbooks(舊格式 repair_steps 會 validation error) 3. playbook_repository._orm_to_pydantic: 舊格式 repair_steps 補齊 step_number/action_type 必填欄位(向下相容) 4. flywheel_stats_service: embedding IS NULL 改用 raw SQL, 修復 KnowledgeEntryRecord ORM 無 embedding 屬性的 AttributeError Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -79,8 +79,24 @@ def _pydantic_to_orm(playbook: Playbook) -> PlaybookRecord:
|
||||
)
|
||||
|
||||
|
||||
def _normalize_repair_step(step: dict) -> dict:
|
||||
"""舊格式 repair_steps 補齊必填欄位(2026-04-15 ogt: 向下相容)"""
|
||||
step = dict(step)
|
||||
if "step_number" not in step:
|
||||
step["step_number"] = 1
|
||||
if "action_type" not in step:
|
||||
cmd = step.get("command", "")
|
||||
step["action_type"] = "kubectl" if cmd and not cmd.startswith("ssh") else "manual"
|
||||
return step
|
||||
|
||||
|
||||
def _orm_to_pydantic(record: PlaybookRecord) -> Playbook:
|
||||
"""PlaybookRecord ORM → Pydantic Playbook"""
|
||||
raw_steps = record.repair_steps or []
|
||||
normalized_steps = [
|
||||
_normalize_repair_step(s) if isinstance(s, dict) else s
|
||||
for s in raw_steps
|
||||
]
|
||||
return Playbook.model_validate({
|
||||
"playbook_id": record.playbook_id,
|
||||
"name": record.name,
|
||||
@@ -88,7 +104,7 @@ def _orm_to_pydantic(record: PlaybookRecord) -> Playbook:
|
||||
"status": record.status,
|
||||
"source": record.source,
|
||||
"symptom_pattern": record.symptom_pattern,
|
||||
"repair_steps": record.repair_steps,
|
||||
"repair_steps": normalized_steps,
|
||||
"estimated_duration_minutes": record.estimated_duration_minutes,
|
||||
"source_incident_ids": record.source_incident_ids,
|
||||
"ai_confidence": float(record.ai_confidence),
|
||||
|
||||
Reference in New Issue
Block a user