fix(knowledge): classify assets and fail soft list readback
Some checks failed
CD Pipeline / workflow-shape (push) Successful in 0s
CD Pipeline / cancel-stale-cd (push) Has been skipped
CD Pipeline / build-and-deploy (push) Has been cancelled
CD Pipeline / post-deploy-checks (push) Has been cancelled
CD Pipeline / tests (push) Has been cancelled

This commit is contained in:
Your Name
2026-07-03 09:00:42 +08:00
parent cc5b508ac5
commit 77daf55cdd
7 changed files with 266 additions and 75 deletions

View File

@@ -40,6 +40,22 @@ logger = structlog.get_logger(__name__)
_knowledge_service: "KnowledgeService | None" = None
def build_knowledge_list_readback_degraded_response(reason: str) -> KnowledgeListResponse:
"""主 KM readback 失敗時回保守 payload避免前端誤判成知識庫歸零。"""
return KnowledgeListResponse(
items=[],
total=0,
categories=[],
readback_status="degraded",
operator_stage="knowledge_readback_degraded_ai_controlled_repair",
next_step=(
"queue_ai_controlled_km_readback_retry_tagging_and_connector_verifier"
),
writes_on_read=False,
manual_review_required=False,
)
def get_knowledge_service() -> "KnowledgeService":
"""取得 Knowledge Service 實例"""
global _knowledge_service
@@ -140,24 +156,37 @@ class KnowledgeService:
offset: int = 0,
) -> KnowledgeListResponse:
"""列出知識條目 + 分類統計"""
async with get_db_context() as db:
repo: IKnowledgeRepository = KnowledgeDBRepository(db)
items, total = await repo.list_entries(
try:
async with get_db_context() as db:
repo: IKnowledgeRepository = KnowledgeDBRepository(db)
items, total = await repo.list_entries(
category=category,
entry_type=entry_type,
status=status,
tags=tags,
q=q,
limit=limit,
offset=offset,
)
categories_raw = await repo.get_categories()
categories = [
CategoryCount(category=cat, count=cnt) for cat, cnt in categories_raw
]
return KnowledgeListResponse(
items=items, total=total, categories=categories
)
except Exception as exc: # noqa: BLE001 - production readback must fail soft
logger.warning(
"knowledge_list_readback_degraded",
error=str(exc),
category=category,
entry_type=entry_type,
status=status,
tags=tags,
entry_type=entry_type.value if entry_type else None,
status=status.value if status else None,
q=q,
limit=limit,
offset=offset,
)
categories_raw = await repo.get_categories()
categories = [
CategoryCount(category=cat, count=cnt) for cat, cnt in categories_raw
]
return KnowledgeListResponse(
items=items, total=total, categories=categories
)
return build_knowledge_list_readback_degraded_response(str(exc))
async def get_categories(self) -> list[CategoryCount]:
"""取得分類統計(直接呼叫 repo不走 list_entries"""