[V10.279] 收斂 Code Review Ollama 路徑並補 Phase80 gate | code_review, market_intel
Some checks failed
CD Pipeline / deploy (push) Has been cancelled
Some checks failed
CD Pipeline / deploy (push) Has been cancelled
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user