yumoqing 8e32cb85f3 feat(llm): 会话agent可选模型收窄为对话能力t2t/i2t/m2t+能力字典加m2t(2026-09-06用户定夺)
- selection.CHAT_CAPS=('t2t','i2t','m2t') 作为会话形态能力白名单唯一事实源
- model_options/resolve_model_name 加 capabilities 参数('chat'哨兵),
  IN 列表展开占位符(sqlor传list会崩),capability 空串按 t2t 归一(COALESCE+NULLIF)
- chat_inference 同步门禁从「只认 t2t」放宽到 CHAT_CAPS——
  实测根因:测试库 6 个机构策略主模型全是 qwen3.8-max(i2t),
  16:28 已产生 FAILED「capability mismatch: i2t != t2t」,会话agent选它必挂
- m2t 入字典四处同步:种子 init/data.json + 端点注释 models.dspy
  + design-spec §6 能力表(+ 提取提示词在 pipeline-platform)
2026-09-06 19:32:59 +08:00

44 lines
1.7 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# models.dspy — 按能力分类列出可用模型(对齐 llmage v1/models 的分类方式)
#
# URL: /pipeline_llm/api/v1/models?catelogid=t2t
# catelogid 可选t2t / t2i / t2v / i2v / r2v / i2i / embedding / rerank / tts / asr / i2t / m2t ...
# (能力类型标准 = 模型治理 appcodes llm_capability新增走评审禁止野生标签
# 不传 = 全部能力
#
# 鉴权Authorization: Bearer *** token>(与 chat/completions 一致)。
# 机构隔离:只列本机构治理链可用的模型(无策略 = 空列表)。
auth = ''
try:
auth = request.headers.get('Authorization', '') or ''
except Exception:
auth = ''
if not auth:
auth = (params_kw or {}).get('api_key', '') or ''
if not auth:
return json.dumps({"error": {"message": "缺少 Authorization Bearer token",
"type": "invalid_request_error", "code": "missing_token"}},
ensure_ascii=False)
ok, info = await verify_llm_token(auth)
if not ok:
return json.dumps({"error": {"message": str(info),
"type": "invalid_request_error", "code": "invalid_token"}},
ensure_ascii=False)
catelogid = (params_kw or {}).get('catelogid', '') or ''
rows = await llm_list_models(info.get('org_id', '') or '', catelogid=catelogid)
# OpenAI 兼容输出 + 分类字段catelogid 照 llmage 叫法,值 = 能力类型标准)
out = {"object": "list", "data": []}
for r in rows:
out["data"].append({
"id": r.get('model_id', '') or r.get('name', ''),
"object": "model",
"name": r.get('name', ''),
"catelogid": r.get('capability', ''),
"vendor": r.get('vendor', ''),
})
return json.dumps(out, ensure_ascii=False)