From acab1cd95ece8e9edd364b80cf759ef625236b2e Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 21 Apr 2026 15:19:02 +0800 Subject: [PATCH] =?UTF-8?q?fix(gitea-review):=20PR/push=20AI=20analysis=20?= =?UTF-8?q?always=20failing=20=E2=80=94=20=E5=85=A9=E5=80=8B=E6=A0=B9?= =?UTF-8?q?=E5=9B=A0=E4=BF=AE=E5=BE=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Root cause 1 (push review): local_code_review_service.review_push() 回傳 dict,但呼叫端直接存取 analysis.issues → AttributeError。 修復:_call_openclaw_push_review 將 dict 轉成 CodeReviewResult。 Root cause 2 (PR review): openclaw_http_service 呼叫 /api/v1/analyze/code-review 但 OpenClaw 從未實作此 endpoint(404)。 修復:_call_openclaw_code_review 改走 local_code_review_service.review_pr() (Ollama qwen2.5-coder + Gemini fallback)。 Co-Authored-By: Claude Sonnet 4.6 --- .../api/src/services/gitea_webhook_service.py | 50 +++++++++++++------ 1 file changed, 34 insertions(+), 16 deletions(-) diff --git a/apps/api/src/services/gitea_webhook_service.py b/apps/api/src/services/gitea_webhook_service.py index e26221a3..2a438c7f 100644 --- a/apps/api/src/services/gitea_webhook_service.py +++ b/apps/api/src/services/gitea_webhook_service.py @@ -214,22 +214,27 @@ class GiteaWebhookService: Phase 22 P0 修復: 使用 OpenClawHttpService (2026-03-31) """ try: - from src.services.openclaw_http_service import get_openclaw_http_service - service = get_openclaw_http_service() - data = await service.code_review( - repo_name=repo_name, - pr_title=pr_title, - pr_body=pr_body, - diff_content=diff_content, - changed_files=changed_files, - additions=additions, - deletions=deletions, - prefer_local=True, - timeout=120.0, + from src.services.local_code_review_service import get_local_code_review_service + svc = get_local_code_review_service() + pr_id = f"{repo_name}-{pr_title[:20]}" + result = await svc.review_pr( + pr_id=pr_id, + repo=repo_name, + title=pr_title, + diff=diff_content, ) - - if data: - return CodeReviewResult(**data) + if result and isinstance(result, dict): + review_text = result.get("review_text", "") + issues_count = result.get("issues_count", 0) + return CodeReviewResult( + summary=review_text[:300] if review_text else "PR review completed", + issues=[{"text": line} for line in review_text.split("\n") if "⚠️" in line], + suggestions=[], + security_concerns=[], + quality_score=max(0.0, 100.0 - issues_count * 15), + analyzed_by=result.get("model", "ollama"), + confidence=0.7, + ) return None except Exception as e: @@ -268,7 +273,20 @@ class GiteaWebhookService: commit_summary=commit_msgs, files_summary=files_summary, ) - return result + # local_code_review_service 回傳 dict,需轉成 CodeReviewResult + if result and isinstance(result, dict): + issues_count = result.get("issues_count", 0) + review_text = result.get("review_text", "") + return CodeReviewResult( + summary=review_text[:300] if review_text else "Push review completed", + issues=[{"text": line} for line in review_text.split("\n") if "⚠️" in line], + suggestions=[], + security_concerns=[], + quality_score=max(0.0, 100.0 - issues_count * 15), + analyzed_by=result.get("model", "ollama"), + confidence=0.7, + ) + return result # type: ignore[return-value] # None case except Exception as e: logger.exception("openclaw_push_review_error", error=str(e))