feat: 服务层配置接线——email/push/rate_limit/AI凭据/行为开关/映射表/种子键

Task 9: 服务层对全局 settings 的业务引用清零,每个 DEFAULT_CONFIG 组
都有真实消费方。resolve_*_settings(email/push/ai)以空槽回退 env
(平台默认层);contact 行为开关/种子白名单/国名扩表/限流上限经
manager 的 runtime.config 接线。收口: lead_push session_factory 必填、
config.py 死代码清理、PromptProvider frozen、no_contact 视图直取、
AIService wall 参数定型 CompiledWall。403 测试全绿(389+14)。

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
浅念
2026-10-12 21:37:48 +08:00
parent 8453d3cc56
commit 32b582aac8
15 changed files with 676 additions and 164 deletions
+18 -12
View File
@@ -33,15 +33,16 @@ def _setup(async_db, monkeypatch, ai, lead_succeeds=True):
sent = []
async def fake_lead(customer_profile, contact_info, reasoning,
conversation_messages, intent_level="", cc_info=None):
conversation_messages, intent_level="", cc_info=None,
config_data=None):
sent.append(("lead", dict(contact_info)))
return lead_succeeds
async def fake_nudge(contact_info, cc_info=None):
async def fake_nudge(contact_info, cc_info=None, config_data=None):
sent.append(("returning", dict(contact_info)))
return lead_succeeds
async def fake_fix(contact_info, count=1, cc_info=None):
async def fake_fix(contact_info, count=1, cc_info=None, config_data=None):
sent.append(("correction", dict(contact_info)))
return lead_succeeds
@@ -51,7 +52,8 @@ def _setup(async_db, monkeypatch, ai, lead_succeeds=True):
fired = []
monkeypatch.setattr(lead_push_service, "fire_pending_pushes",
lambda logs, session_factory=None: fired.extend(logs))
lambda logs, session_factory=None, config_data=None:
fired.extend(logs))
monkeypatch.setattr(lead_push_service.settings, "PUSH_ENABLED", True)
async def run():
@@ -160,14 +162,16 @@ def test_push_disabled_writes_nothing(async_db, monkeypatch):
sent = []
async def fake_lead(customer_profile, contact_info, reasoning,
conversation_messages, intent_level="", cc_info=None):
conversation_messages, intent_level="", cc_info=None,
config_data=None):
sent.append("lead")
return True
monkeypatch.setattr(email_service, "send_lead_email", fake_lead)
fired = []
monkeypatch.setattr(lead_push_service, "fire_pending_pushes",
lambda logs, session_factory=None: fired.extend(logs))
lambda logs, session_factory=None, config_data=None:
fired.extend(logs))
async def run():
async with async_db() as db:
@@ -186,7 +190,7 @@ def test_fire_end_to_end_single_loop(async_db, monkeypatch):
"""真 fire + 假 _run_push: 同一事件循环内 stream 完成后任务确实被派发执行。"""
pushed = []
async def fake_run(log_id, payload, session_factory=None):
async def fake_run(log_id, payload, session_factory=None, config_data=None):
pushed.append(log_id)
monkeypatch.setattr(lead_push_service, "_run_push", fake_run)
@@ -195,7 +199,8 @@ def test_fire_end_to_end_single_loop(async_db, monkeypatch):
sent = []
async def fake_lead(customer_profile, contact_info, reasoning,
conversation_messages, intent_level="", cc_info=None):
conversation_messages, intent_level="", cc_info=None,
config_data=None):
sent.append("lead")
return True
@@ -234,11 +239,12 @@ def test_fire_happens_only_after_commit(async_db, monkeypatch):
fired = []
async def fake_lead(customer_profile, contact_info, reasoning,
conversation_messages, intent_level="", cc_info=None):
conversation_messages, intent_level="", cc_info=None,
config_data=None):
sent.append("lead")
return True
async def fake_run(log_id, payload, session_factory=None):
async def fake_run(log_id, payload, session_factory=None, config_data=None):
async with async_db() as db:
try:
row = (await db.execute(
@@ -253,9 +259,9 @@ def test_fire_happens_only_after_commit(async_db, monkeypatch):
real_fire = lead_push_service.fire_pending_pushes
def recording_fire(logs, session_factory=None):
def recording_fire(logs, session_factory=None, config_data=None):
fired.append(True)
real_fire(logs, session_factory)
real_fire(logs, session_factory, config_data)
monkeypatch.setattr(email_service, "send_lead_email", fake_lead)
monkeypatch.setattr(lead_push_service, "_run_push", fake_run)