[V10.279] 收斂 Code Review Ollama 路徑並補 Phase80 gate | code_review, market_intel
Some checks failed
CD Pipeline / deploy (push) Has been cancelled

This commit is contained in:
OoO
2026-05-19 21:57:44 +08:00
parent 482bfbdb64
commit 03ab276032
11 changed files with 309 additions and 85 deletions

View File

@@ -45,9 +45,12 @@ GEMINI_API_KEY = os.getenv("GEMINI_API_KEY", "")
REVIEW_MODEL = os.getenv("OPENCLAW_MODEL", "gemini-2.5-flash")
CODE_REVIEW_OLLAMA_MODEL = os.getenv(
"CODE_REVIEW_OLLAMA_MODEL",
os.getenv("OPENCLAW_OLLAMA_MODEL", "qwen3:14b"),
os.getenv("OPENCLAW_OLLAMA_MODEL", "qwen2.5-coder:7b"),
)
CODE_REVIEW_OLLAMA_TIMEOUT = int(os.getenv("CODE_REVIEW_OLLAMA_TIMEOUT", "120"))
CODE_REVIEW_OLLAMA_TIMEOUT = int(os.getenv("CODE_REVIEW_OLLAMA_TIMEOUT", "45"))
CODE_REVIEW_HERMES_TIMEOUT = int(os.getenv("CODE_REVIEW_HERMES_TIMEOUT", "35"))
CODE_REVIEW_HERMES_MAX_FILES = int(os.getenv("CODE_REVIEW_HERMES_MAX_FILES", "3"))
CODE_REVIEW_HERMES_MAX_CHARS = int(os.getenv("CODE_REVIEW_HERMES_MAX_CHARS", "2500"))
INTERNAL_TOKEN = os.getenv("INTERNAL_WEBHOOK_TOKEN", "")
AUTO_FIX_ENABLED = os.getenv("CODE_REVIEW_AUTO_FIX_ENABLED", "true").lower() == "true"
ALLOW_INSECURE_WEBHOOK = os.getenv("MOMO_ALLOW_INSECURE_INTERNAL_WEBHOOK_FOR_DEV", "").lower() == "true"
@@ -207,10 +210,13 @@ class CodeReviewPipeline:
def _hermes_scan(self, files: Dict[str, str]) -> List[Dict]:
"""走 OllamaService 三主機級聯GCP-A → GCP-B → 111。"""
try:
files_text = "\n\n".join(
f"### {name}\n```python\n{content}\n```"
for name, content in list(files.items())[:4]
)
compact_files = []
for name, content in list(files.items())[:CODE_REVIEW_HERMES_MAX_FILES]:
clipped = content[:CODE_REVIEW_HERMES_MAX_CHARS]
if len(content) > CODE_REVIEW_HERMES_MAX_CHARS:
clipped += "\n... (截斷,僅掃描前段重點)"
compact_files.append(f"### {name}\n```python\n{clipped}\n```")
files_text = "\n\n".join(compact_files)
prompt = f"""你是資深程式碼審查工程師,請掃描以下程式碼並列出所有問題。
@@ -234,14 +240,16 @@ class CodeReviewPipeline:
model=_HERMES_MODEL,
request_id=f"cr-{self.commit_sha[:8]}",
meta={'commit': self.commit_sha[:8], 'branch': self.branch,
'files': len(files), 'route': 'ollama_first'},
'files': len(files), 'route': 'ollama_first',
'max_files': CODE_REVIEW_HERMES_MAX_FILES,
'max_chars': CODE_REVIEW_HERMES_MAX_CHARS},
) as _ctx:
ollama = OllamaService(model=_HERMES_MODEL)
resp = ollama.generate(
prompt=prompt,
model=_HERMES_MODEL,
temperature=0.1,
timeout=CODE_REVIEW_OLLAMA_TIMEOUT,
timeout=CODE_REVIEW_HERMES_TIMEOUT,
)
actual_provider = get_provider_tag(resp.host or '')
_ctx.set_provider(actual_provider)

View File

@@ -27,10 +27,44 @@ from services.market_intel.candidate_queue_review_decision_writer_run_closeout i
from services.market_intel.candidate_queue_review_decision_post_closeout_inventory import build_candidate_queue_review_decision_post_closeout_inventory
from services.market_intel.candidate_queue_review_completion_archive import build_candidate_queue_review_completion_archive
from services.market_intel.candidate_queue_review_archive_summary import build_candidate_queue_review_archive_summary
from services.market_intel.candidate_queue_review_ai_summary_preflight import build_candidate_queue_review_ai_summary_preflight
BLOCKED_RUN_REVIEW_KEYS = ("ready_for_api_database_write", "ready_for_scheduler_attach", "api_executes_cli", "api_reads_approval_token", "api_writes_file", "api_writes_database", "api_updates_review_state", "approval_record_written", "decision_record_written", "review_state_update_executed", "database_connection_opened", "database_session_created", "explicit_transaction_opened", "transaction_opened", "transaction_committed", "database_write_executed", "database_commit_executed", "database_rollback_executed", "scheduler_attached", "writes_executed", "would_write_database")
PRODUCTION_SMOKE_TARGETS = ("/health", "/market_intel", "/api/market_intel/status", "/api/market_intel/deployment_readiness", "/api/market_intel/schema_smoke", "/api/market_intel/schema_db_probe", "/api/market_intel/platform_seed_db_diff", "/api/market_intel/legacy_source_bridge", "/api/market_intel/mcp_readiness", "/api/market_intel/mcp_tool_contract", "/api/market_intel/mcp_deploy_preflight", "/api/market_intel/mcp_activation_runbook", "/api/market_intel/mcp_fetch_gate", "/api/market_intel/scheduler_plan", "/api/market_intel/manual_sample_plan", "/api/market_intel/manual_sample_acceptance", "/api/market_intel/manual_sample_review", "/api/market_intel/match_review_plan", "/api/market_intel/opportunity_plan", "/api/market_intel/opportunity_scoring_plan", "/api/market_intel/opportunity_evidence_plan", "/api/market_intel/opportunity_alert_plan", "/api/market_intel/migration_apply_drill", "/api/market_intel/migration_catalog_review", "/api/market_intel/migration_live_smoke", "/api/market_intel/live_db_inventory", "/api/market_intel/manual_sample_review/candidate_queue_writer_postwrite_smoke", "/api/market_intel/manual_sample_review/candidate_queue_writer_operator_drill", "/api/market_intel/manual_sample_review/candidate_queue_writer_run_package", "/api/market_intel/manual_sample_review/candidate_queue_writer_run_readiness", "/api/market_intel/manual_sample_review/candidate_queue_writer_run_receipt", "/api/market_intel/manual_sample_review/candidate_queue_writer_run_closeout", "/api/market_intel/manual_sample_review/candidate_queue_review_handoff", "/api/market_intel/manual_sample_review/candidate_queue_review_inventory", "/api/market_intel/manual_sample_review/candidate_queue_review_decision", "/api/market_intel/manual_sample_review/candidate_queue_review_decision_approval", "/api/market_intel/manual_sample_review/candidate_queue_review_decision_transaction", "/api/market_intel/manual_sample_review/candidate_queue_review_decision_writer_preflight", "/api/market_intel/manual_sample_review/candidate_queue_review_decision_writer_postwrite_smoke", "/api/market_intel/manual_sample_review/candidate_queue_review_decision_writer_operator_drill", "/api/market_intel/manual_sample_review/candidate_queue_review_decision_writer_run_package", "/api/market_intel/manual_sample_review/candidate_queue_review_decision_writer_run_readiness", "/api/market_intel/manual_sample_review/candidate_queue_review_decision_writer_run_receipt", "/api/market_intel/manual_sample_review/candidate_queue_review_decision_writer_run_closeout", "/api/market_intel/manual_sample_review/candidate_queue_review_decision_post_closeout_inventory", "/api/market_intel/manual_sample_review/candidate_queue_review_completion_archive", "/api/market_intel/manual_sample_review/candidate_queue_review_archive_summary", "/api/market_intel/manual_sample_review/candidate_queue_review_decision_writer_status")
BLOCKED_RUN_REVIEW_KEYS = (
"ready_for_api_database_write",
"ready_for_scheduler_attach",
"ready_for_ai_summary_generation",
"ready_for_llm_call",
"ready_for_telegram_dispatch",
"api_executes_cli",
"api_reads_approval_token",
"api_writes_file",
"api_writes_database",
"api_updates_review_state",
"approval_record_written",
"decision_record_written",
"summary_file_written",
"summary_record_written",
"summary_manifest_written",
"ai_summary_generated",
"llm_call_executed",
"ollama_call_executed",
"gemini_call_executed",
"telegram_dispatched",
"review_state_update_executed",
"database_connection_opened",
"database_session_created",
"explicit_transaction_opened",
"transaction_opened",
"transaction_committed",
"database_write_executed",
"database_commit_executed",
"database_rollback_executed",
"scheduler_attached",
"writes_executed",
"would_write_database",
)
PRODUCTION_SMOKE_TARGETS = ("/health", "/market_intel", "/api/market_intel/status", "/api/market_intel/deployment_readiness", "/api/market_intel/schema_smoke", "/api/market_intel/schema_db_probe", "/api/market_intel/platform_seed_db_diff", "/api/market_intel/legacy_source_bridge", "/api/market_intel/mcp_readiness", "/api/market_intel/mcp_tool_contract", "/api/market_intel/mcp_deploy_preflight", "/api/market_intel/mcp_activation_runbook", "/api/market_intel/mcp_fetch_gate", "/api/market_intel/scheduler_plan", "/api/market_intel/manual_sample_plan", "/api/market_intel/manual_sample_acceptance", "/api/market_intel/manual_sample_review", "/api/market_intel/match_review_plan", "/api/market_intel/opportunity_plan", "/api/market_intel/opportunity_scoring_plan", "/api/market_intel/opportunity_evidence_plan", "/api/market_intel/opportunity_alert_plan", "/api/market_intel/migration_apply_drill", "/api/market_intel/migration_catalog_review", "/api/market_intel/migration_live_smoke", "/api/market_intel/live_db_inventory", "/api/market_intel/manual_sample_review/candidate_queue_writer_postwrite_smoke", "/api/market_intel/manual_sample_review/candidate_queue_writer_operator_drill", "/api/market_intel/manual_sample_review/candidate_queue_writer_run_package", "/api/market_intel/manual_sample_review/candidate_queue_writer_run_readiness", "/api/market_intel/manual_sample_review/candidate_queue_writer_run_receipt", "/api/market_intel/manual_sample_review/candidate_queue_writer_run_closeout", "/api/market_intel/manual_sample_review/candidate_queue_review_handoff", "/api/market_intel/manual_sample_review/candidate_queue_review_inventory", "/api/market_intel/manual_sample_review/candidate_queue_review_decision", "/api/market_intel/manual_sample_review/candidate_queue_review_decision_approval", "/api/market_intel/manual_sample_review/candidate_queue_review_decision_transaction", "/api/market_intel/manual_sample_review/candidate_queue_review_decision_writer_preflight", "/api/market_intel/manual_sample_review/candidate_queue_review_decision_writer_postwrite_smoke", "/api/market_intel/manual_sample_review/candidate_queue_review_decision_writer_operator_drill", "/api/market_intel/manual_sample_review/candidate_queue_review_decision_writer_run_package", "/api/market_intel/manual_sample_review/candidate_queue_review_decision_writer_run_readiness", "/api/market_intel/manual_sample_review/candidate_queue_review_decision_writer_run_receipt", "/api/market_intel/manual_sample_review/candidate_queue_review_decision_writer_run_closeout", "/api/market_intel/manual_sample_review/candidate_queue_review_decision_post_closeout_inventory", "/api/market_intel/manual_sample_review/candidate_queue_review_completion_archive", "/api/market_intel/manual_sample_review/candidate_queue_review_archive_summary", "/api/market_intel/manual_sample_review/candidate_queue_review_ai_summary_preflight", "/api/market_intel/manual_sample_review/candidate_queue_review_decision_writer_status")
def _run_review_preview_safe(payload, mode):
@@ -178,6 +212,9 @@ def build_deployment_readiness_preview(
candidate_queue_review_archive_summary = build_candidate_queue_review_archive_summary(
review_completion_archive=candidate_queue_review_completion_archive,
)
candidate_queue_review_ai_summary_preflight = build_candidate_queue_review_ai_summary_preflight(
archive_summary=candidate_queue_review_archive_summary,
)
checks = {
"schema_smoke_passed": bool(schema_smoke["passed"]),
"feature_flags_default_safe": bool(
@@ -456,6 +493,10 @@ def build_deployment_readiness_preview(
candidate_queue_review_archive_summary,
"candidate_queue_review_archive_summary_preview",
),
"candidate_queue_review_ai_summary_preflight_preview_safe": _run_review_preview_safe(
candidate_queue_review_ai_summary_preflight,
"candidate_queue_review_ai_summary_preflight_preview",
),
"candidate_queue_review_decision_writer_cli_status_safe": _run_review_preview_safe(
candidate_queue_review_decision_writer_status,
"candidate_queue_review_decision_writer_cli_blocked",
@@ -702,6 +743,7 @@ def build_deployment_readiness_preview(
"candidate_queue_review_decision_post_closeout_inventory": candidate_queue_review_decision_post_closeout_inventory,
"candidate_queue_review_completion_archive": candidate_queue_review_completion_archive,
"candidate_queue_review_archive_summary": candidate_queue_review_archive_summary,
"candidate_queue_review_ai_summary_preflight": candidate_queue_review_ai_summary_preflight,
"candidate_queue_review_decision_writer_status": candidate_queue_review_decision_writer_status,
"match_review_plan": match_review_plan,
"opportunity_plan": opportunity_plan,

View File

@@ -1,3 +1,3 @@
"""市場情報 rollout phase 單一來源。"""
MARKET_INTEL_PHASE = "phase_79_candidate_queue_review_archive_summary"
MARKET_INTEL_PHASE = "phase_80_candidate_queue_review_ai_summary_preflight"