- 原缺陷:流式路径经 loop.toolSchemas(capacity 允许集 + restrict)过滤,而 agent 静音/内部路径 (RunStep,被 services/automations 等使用)广告 dispatcher **全量** ⇒ 两条路径不一致 - 修法(方案 1):**过滤实现只留一份**(loop.toolSchemas);l.agentStep 调用同一个函数,结果经 agent.WithToolSurface(ctx, …) 下传,agent 的 buildRequest 原样广告(取不到才回退全量,保持既有回退语义) · 按构造相同:同一次函数调用、同一份输入 ⇒ 不存在第二份可漂移的实现 · 未选「抽共享函数两侧各调一次」:loop 的过滤输入含 loop 私有会话环境 ctx key 与 capacity 判定器, agent 侧凑齐等于再造一套 ctx 管线,漂移面更大 - 复核:agent/loop 包测试绿;新增 parity 用例(owner 与 group 两组,静音 == 流式); 变异(撤掉下传行)→ parity 必红且精确复现「静音=全量 4 个」,已还原 - 附注:全仓仅剩 `services/automations` 的「无 Loop 回退」仍广告全量(没有循环就没有闸可言); 子代理 ToolWhitelist 是执行期否决、本不参与 schema 过滤(未改)
- 新增 reasoning_shape.go:**每个 provider 形状一个 resolver,只发自己形状的字段** · deepseek:thinking{type} + reasoning_effort(依据 DevDocs/reference/deepseek 官方本地副本) · vllm:chat_template_kwargs.enable_thinking · dashscope:顶层 enable_thinking(**只允许显式声明**) · openai:仅 reasoning_effort · anthropic:自己的 thinking{budget_tokens}(未改) · 未知 kind → WARN 且一个字段都不发(不许静默失效) - 形状载体:models.json 组级 `reasoning.kind`(可热更新,未声明则不写该键)+ env `LLM_REASONING_KIND` - 红线:`effort:none` 在只有布尔开关的形状上翻成**显式关思考**,绝不降成任何强度档 - 03.4.1 余项:`Request.PersonaID` + `RuntimeLLM.ForPersona(pid)` 视图; 每 persona 协议一条链并消费 `RouteProviderForPersona`;`agent/request.go` 非流式路径同一钩子 - **生产装配(主会话补)**:默认 agent 与 personaAgentPool 都改用 `ForPersona(pid)` 视图—— 否则角色级模型/提供商路由在生产里永不被选中(形同虚设) - 复核:build/vet 绿 + model/agent/config/cmd 包测试绿;5 条变异反证先红后还原 (其中一条「红但没钉住」已改用例:通道读取加 2s 超时,避免整包 panic 掩盖信号) - 未落:DashScope 的 auto 推断(缺官方依据,只允许显式声明);Qwen `/think` 前导消息 (design/01 §2.1 与 design/11 §3 口径冲突,停手报告)