From 0702640abafcd07c0237838ca7141855704c64e4 Mon Sep 17 00:00:00 2001 From: ymq Date: Tue, 8 Sep 2026 17:26:46 +0800 Subject: [PATCH] =?UTF-8?q?fix(gate):=20=5Fgate=5Fplan=E6=8C=89(=E8=AF=B7?= =?UTF-8?q?=E6=B1=82=E8=83=BD=E5=8A=9B,=E6=A8=A1=E5=9E=8B=E8=83=BD?= =?UTF-8?q?=E5=8A=9B)=E5=AF=B9=E8=A7=84=E5=88=92=E9=97=A8=E7=A6=81?= =?UTF-8?q?=E2=80=94=E2=80=94=E6=98=BE=E5=BC=8Ft2i=E9=80=89=E4=B8=ADi2i?= =?UTF-8?q?=E6=88=96=E8=87=AA=E5=8A=A8=E9=80=89=E5=9E=8B=E8=90=BD=E5=88=B0?= =?UTF-8?q?i2i=E4=B8=94=E6=97=A0=E5=AA=92=E4=BD=93=E2=86=92t2i=E5=A5=91?= =?UTF-8?q?=E7=BA=A6=E4=BB=A3=E7=A0=81=E8=A1=A8=E5=88=A4=E5=AE=9A;?= =?UTF-8?q?=E5=B8=A6=E5=AA=92=E4=BD=93=3D=E7=9C=9Fi2i=E8=B5=B0LLM=E5=B1=82?= =?UTF-8?q?;=E4=BF=AE=E8=87=AA=E5=8A=A8=E9=80=89=E5=9E=8B=E8=B7=AF?= =?UTF-8?q?=E5=BE=84cap=5Freq=E7=A9=BA=E4=B8=8D=E6=8D=A2=E7=AE=97=E8=87=B4?= =?UTF-8?q?LLM=E6=8C=89i2i=E5=A5=91=E7=BA=A6=E8=AF=AF=E6=8B=A6(2026-09-08?= =?UTF-8?q?=E5=AE=9E=E6=B5=8B)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pipeline_service/platform_model_tools.py | 65 ++++++++++++++---------- 1 file changed, 39 insertions(+), 26 deletions(-) diff --git a/pipeline_service/platform_model_tools.py b/pipeline_service/platform_model_tools.py index 07ed718..992361d 100644 --- a/pipeline_service/platform_model_tools.py +++ b/pipeline_service/platform_model_tools.py @@ -91,30 +91,45 @@ def _biz_media(biz, key): return bool(str(v or "").strip()) -def _degrade_gate_cap(cap, biz): - """能力降级门禁换算(2026-09-08,i2i→t2i / r2v→t2v)。 +def _gate_plan(cap_req, cap_model, biz): + """能力降级门禁规划(2026-09-08,i2i→t2i / r2v→t2v)。 - 选中模型能力是降级源(i2i/r2v)但调用没带该能力必需的媒体输入时, - 说明任务实际是请求能力(t2i/t2v)形态——门禁按请求能力契约校验 - (只要 task 描述),否则 i2i 模型承接文生图任务会被「缺输入图」误拦。 - 带了媒体输入 = 真 i2i/r2v 用法,契约不变。 + cap_req = 调用方显式指定的能力(空 = 自动选型,请求能力未知)。 + 返回 (gate_cap, use_code_table): + - 显式请求且 CAP_DEGRADE[cap_req]==cap_model(如 t2i 选中 i2i 模型)且未带 + 模型能力必需媒体 → 契约=请求能力、代码表判定(LLM/模型技能层会按模型 + 自身 i2i 契约误判,实测 2026-09-08 拦截合法文生图任务) + - 自动选型(cap_req 空)且模型是降级源(i2i/r2v)且未带媒体 → 任务实为 + t2i/t2v 形态,契约=降级目标能力、代码表判定 + - 带媒体输入 → 真 i2i/r2v 用法,契约=模型能力,LLM 层 + - 其余 → 契约=显式请求能力(空则模型能力),LLM 层 """ try: - from pipeline_llm.selection import CAP_DEGRADE_SOURCE + from pipeline_llm.selection import CAP_DEGRADE, CAP_DEGRADE_SOURCE except ImportError: - return cap - src = CAP_DEGRADE_SOURCE.get((cap or "").strip().lower()) - if not src: - return cap - for req in _CAP_REQUIRED.get(cap, ()): - if req == "task": - continue - if req == "any_media": - if not any(_biz_media(biz or {}, k) for k in _MEDIA_KEYS): - return src - elif not _biz_media(biz or {}, req): - return src - return cap + return (cap_req or cap_model or ''), False + cap_req = (cap_req or '').strip().lower() + cap_model = (cap_model or '').strip().lower() + + def _no_media(): + for req in _CAP_REQUIRED.get(cap_model, ()): + if req == 'task': + continue + if req == 'any_media': + if not any(_biz_media(biz or {}, k) for k in _MEDIA_KEYS): + return True + elif not _biz_media(biz or {}, req): + return True + return False + + if cap_req: + if CAP_DEGRADE.get(cap_req) == cap_model and _no_media(): + return cap_req, True + return cap_req, False + src = CAP_DEGRADE_SOURCE.get(cap_model) + if src and _no_media(): + return src, True + return (cap_model or ''), False def _check_completeness_code(capability, task, biz): @@ -381,12 +396,10 @@ async def tool_invoke_model(params, org_id, user_id=""): # capability/description 未显式给出时按选中模型反查。 desc = "" cap2, desc = await _resolve_capability(model, org_id) - cap = cap or cap2 - # 能力降级门禁换算:i2i/r2v 模型无媒体输入时按 t2i/t2v 契约校验 - cap_gate = _degrade_gate_cap(cap, biz) - if cap_gate != (cap or "").strip().lower(): - # 降级执行:契约是确定性规则,直接代码表判定——LLM/模型技能层会按 - # 模型自身能力(i2i 要源图)误判,实测 2026-09-08 拦截了合法文生图任务 + cap_req = cap or cap2 + # 能力降级门禁规划:(契约能力, 是否代码表判定) + cap_gate, use_code = _gate_plan(cap_req, cap2, biz) + if use_code: gap = _check_completeness_code(cap_gate, task, biz) else: gap = await judge_completeness(model, cap_gate, task, biz,