|
@@ -20,6 +20,7 @@ class FindAgentGateRules:
|
|
|
min_share_count: int
|
|
min_share_count: int
|
|
|
min_content_50_plus_ratio: float
|
|
min_content_50_plus_ratio: float
|
|
|
min_account_50_plus_ratio: float
|
|
min_account_50_plus_ratio: float
|
|
|
|
|
+ allow_missing_elder_portrait: bool
|
|
|
festival_lead_days: int
|
|
festival_lead_days: int
|
|
|
event_max_age_days: int
|
|
event_max_age_days: int
|
|
|
seasonal_max_age_days: int
|
|
seasonal_max_age_days: int
|
|
@@ -106,6 +107,9 @@ def get_gate_rules() -> FindAgentGateRules:
|
|
|
min_share_count=settings.find_agent_min_share_count,
|
|
min_share_count=settings.find_agent_min_share_count,
|
|
|
min_content_50_plus_ratio=settings.find_agent_min_content_50_plus_ratio,
|
|
min_content_50_plus_ratio=settings.find_agent_min_content_50_plus_ratio,
|
|
|
min_account_50_plus_ratio=settings.find_agent_min_account_50_plus_ratio,
|
|
min_account_50_plus_ratio=settings.find_agent_min_account_50_plus_ratio,
|
|
|
|
|
+ allow_missing_elder_portrait=(
|
|
|
|
|
+ settings.find_agent_allow_missing_elder_portrait
|
|
|
|
|
+ ),
|
|
|
festival_lead_days=settings.find_agent_festival_lead_days,
|
|
festival_lead_days=settings.find_agent_festival_lead_days,
|
|
|
event_max_age_days=settings.find_agent_event_max_age_days,
|
|
event_max_age_days=settings.find_agent_event_max_age_days,
|
|
|
seasonal_max_age_days=settings.find_agent_seasonal_max_age_days,
|
|
seasonal_max_age_days=settings.find_agent_seasonal_max_age_days,
|
|
@@ -136,7 +140,11 @@ def load_rule_snapshot(value: Mapping[str, Any] | str | None) -> dict[str, Any]:
|
|
|
else:
|
|
else:
|
|
|
loaded = dict(value or {})
|
|
loaded = dict(value or {})
|
|
|
fallback = build_rule_snapshot()
|
|
fallback = build_rule_snapshot()
|
|
|
- return {**fallback, **loaded}
|
|
|
|
|
|
|
+ if value is None:
|
|
|
|
|
+ return fallback
|
|
|
|
|
+ # 旧运行的规则快照没有此字段时保持原有严格行为,避免环境变量变化
|
|
|
|
|
+ # 反向修改已经创建的运行。
|
|
|
|
|
+ return {**fallback, "allow_missing_elder_portrait": False, **loaded}
|
|
|
|
|
|
|
|
|
|
|
|
|
def parse_datetime_value(
|
|
def parse_datetime_value(
|
|
@@ -594,22 +602,29 @@ def evaluate_candidate_gate(
|
|
|
account_pass = (
|
|
account_pass = (
|
|
|
account_ratio is not None and account_ratio >= min_account_ratio
|
|
account_ratio is not None and account_ratio >= min_account_ratio
|
|
|
)
|
|
)
|
|
|
|
|
+ allow_missing_portrait = bool(rules["allow_missing_elder_portrait"])
|
|
|
portrait_compensated = False
|
|
portrait_compensated = False
|
|
|
|
|
+ portrait_config_bypassed = False
|
|
|
if content_pass or account_pass:
|
|
if content_pass or account_pass:
|
|
|
portrait_status = "pass"
|
|
portrait_status = "pass"
|
|
|
portrait_reason_code = None
|
|
portrait_reason_code = None
|
|
|
elif content_ratio is None and account_ratio is None:
|
|
elif content_ratio is None and account_ratio is None:
|
|
|
- portrait_compensated = _can_compensate_missing_portrait(
|
|
|
|
|
- candidate,
|
|
|
|
|
- account_ratio,
|
|
|
|
|
- min_account_ratio=min_account_ratio,
|
|
|
|
|
- )
|
|
|
|
|
- if portrait_compensated:
|
|
|
|
|
|
|
+ if allow_missing_portrait:
|
|
|
portrait_status = "pass"
|
|
portrait_status = "pass"
|
|
|
portrait_reason_code = None
|
|
portrait_reason_code = None
|
|
|
|
|
+ portrait_config_bypassed = True
|
|
|
else:
|
|
else:
|
|
|
- portrait_status = "fail"
|
|
|
|
|
- portrait_reason_code = "CONTENT_PORTRAIT_MISSING"
|
|
|
|
|
|
|
+ portrait_compensated = _can_compensate_missing_portrait(
|
|
|
|
|
+ candidate,
|
|
|
|
|
+ account_ratio,
|
|
|
|
|
+ min_account_ratio=min_account_ratio,
|
|
|
|
|
+ )
|
|
|
|
|
+ if portrait_compensated:
|
|
|
|
|
+ portrait_status = "pass"
|
|
|
|
|
+ portrait_reason_code = None
|
|
|
|
|
+ else:
|
|
|
|
|
+ portrait_status = "fail"
|
|
|
|
|
+ portrait_reason_code = "CONTENT_PORTRAIT_MISSING"
|
|
|
else:
|
|
else:
|
|
|
portrait_status = "fail"
|
|
portrait_status = "fail"
|
|
|
portrait_reason_code = "PORTRAIT_50_PLUS_TOO_LOW"
|
|
portrait_reason_code = "PORTRAIT_50_PLUS_TOO_LOW"
|
|
@@ -628,6 +643,7 @@ def evaluate_candidate_gate(
|
|
|
"min_account_50_plus_ratio": min_account_ratio,
|
|
"min_account_50_plus_ratio": min_account_ratio,
|
|
|
},
|
|
},
|
|
|
"compensated": portrait_compensated,
|
|
"compensated": portrait_compensated,
|
|
|
|
|
+ "config_bypassed": portrait_config_bypassed,
|
|
|
}
|
|
}
|
|
|
)
|
|
)
|
|
|
|
|
|