fix(site-import): 终审两阻塞——移除诊断落盘(c0eae14 反向提交修正)+ 租户 AI 槽位接线(routes→task→make_provider 传配置快照)

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
浅念
2026-10-21 00:00:31 +08:00
parent 3a51b24565
commit c2ccf8b1ae
4 changed files with 40 additions and 17 deletions
+14 -4
View File
@@ -94,10 +94,14 @@ class ImportTask:
落在抓取段/未知异常)不可复活——重开任务。
"""
def __init__(self, slug: str, task_id: str, url: str | None) -> None:
def __init__(self, slug: str, task_id: str, url: str | None,
config_data: dict | None = None) -> None:
self.slug = slug
self.task_id = task_id
self.url = url
# 租户配置快照(终审 Important #2:AI resolver 走三级链——
# 租户自有 ai.* 配置优先于平台键)
self.tenant_config_data = config_data
self.state = TaskState.PENDING
self.phase: str | None = None # 运行中阶段(crawling/generating)
self.pages_fetched = 0
@@ -152,11 +156,14 @@ def get(slug: str, task_id: str) -> ImportTask | None:
async def start(slug: str, url: str | None, *,
retry_task_id: str | None = None) -> str:
retry_task_id: str | None = None,
config_data: dict | None = None) -> str:
"""新建或复活(retry=generate)导入任务,返回 task_id。
频控守卫最先(超限后 429 优先于一切预检);record 只落在真正发起的
这次——LookupError/ValueError/ConcurrentLimit 不消耗预算。
config_data:租户配置快照(AI resolver 三级链的租户槽位;None 走
平台设置→env——新建空租户即此形态)。
"""
_prune_expired()
key = ("import", slug)
@@ -185,7 +192,8 @@ async def start(slug: str, url: str | None, *,
target.finished_at = None
target.need_crawl = False
else:
target = ImportTask(slug, uuid.uuid4().hex, url)
target = ImportTask(slug, uuid.uuid4().hex, url,
config_data=config_data)
_tasks[(slug, target.task_id)] = target
_import_limiter.record(key)
target._aio_task = asyncio.create_task(_pipeline(target))
@@ -221,7 +229,9 @@ async def _run(task_obj: ImportTask) -> None:
task_obj.crawl_result.get("pages_fetched") or 0)
task_obj.state = TaskState.GENERATING
task_obj.phase = "generating"
provider = generator.make_provider(None) # resolver 三级链(平台设置/env)
# resolver 三级链:租户 ai 组 → 平台设置 → env(终审 Important #2:
# 传租户配置快照——自有 AI 配置的租户导入烧自己的配额,不用平台键)
provider = generator.make_provider(task_obj.tenant_config_data)
# source_text 传 analyze 实际消费的截断后文本(24K 同款——Task 5 备忘:
# 否则截断段数字会被 build 的数字校验误剔除)
source = ((task_obj.crawl_result or {}).get("pages_text")