test(base): 造只读探针端到端验证工具拒绝,并修掉它暴露的一个死分支
**为什么造探针**:ToolExecutor 的四种拒绝在真实链路上很难安全触发——要么改客服、风控的
生效配置,要么动 RBAC,两条路都会影响正在工作的 Agent。platform_probe 是个只读、无副作用
的探针:它只声明 probe 一个意图(所以意图分类只可能返回它)、没有发布工具白名单
(天然处于"未配置"状态)、工具只回显参数不碰业务数据。
**它立刻查出一个死分支**:探针报的是「工具不在当前意图白名单」,而不是我新加的
「该意图未配置工具白名单」。原因是 governance.resolve 会为每个 supported_intents
**预填条目**(governance.py:55-61),未配置时得到的是**空元组**——所以
intent not in configured_tools 在运行期**永远不成立**,那个分支是死代码。
单元测试没能发现它,因为我在测试里手工构造了 configured={},而真实链路不产生这个形状。
**这正是端到端测试的价值**:单元测试验证的是我设想的形状,端到端验证的是真实形状。
修法:改判"白名单为空"而非"缺键",文案改为"该意图的工具白名单为空",并注明经过 governance
装配后"完全没配"与"配了空列表"无法区分、也不假装能区分(两者运维动作相同)。新增一条按
**真实形状**({"faq": ()})构造的用例把它锁住。
实测:探针调用 → failed / AGENT_PERMISSION_DENIED,stderr 为
ForbiddenAgentError: 该意图未配置工具白名单(tool_executor.py:108)。
ruff / mypy(136 文件) / 611 unit+contract 全绿。
This commit is contained in:
@@ -17,6 +17,13 @@ from app.service.agent.factory import AgentFactory
|
||||
from app.service.agent.governance import PlatformGovernance
|
||||
from app.service.agent.implementations.customer_service import CustomerServiceAgent
|
||||
from app.service.agent.implementations.fund_query_demo import FundQueryDemoAgent
|
||||
from app.service.agent.implementations.platform_probe import (
|
||||
PROBE_PERMISSION,
|
||||
PROBE_TOOL,
|
||||
PlatformProbeAgent,
|
||||
ProbeEchoArgs,
|
||||
probe_echo_tool,
|
||||
)
|
||||
from app.service.agent.implementations.risk_agent import RiskAgent
|
||||
from app.service.fund_quote_service import query_fund_quote_tool
|
||||
from app.service.intent_classifier import IntentClassifier
|
||||
@@ -171,6 +178,15 @@ def build_memory_recall_service(session: AsyncSession) -> MemoryRecallService:
|
||||
def get_agent_factory() -> AgentFactory:
|
||||
"""HTTP 与 Worker 共用的唯一底座依赖组装入口。"""
|
||||
registry = ToolRegistry()
|
||||
# 基座验证探针的工具:只回显参数,用于端到端触发 ToolExecutor 的四种拒绝分支。
|
||||
# 它不查库、不写状态,注册在这里也不会被任何业务 Agent 的白名单引用。
|
||||
registry.register(ToolDefinition(
|
||||
name=PROBE_TOOL,
|
||||
input_model=ProbeEchoArgs,
|
||||
handler=cast(Any, probe_echo_tool),
|
||||
required_permission=PROBE_PERMISSION,
|
||||
allowed_roles=("admin",),
|
||||
))
|
||||
registry.register(ToolDefinition(
|
||||
name="check_suitability",
|
||||
input_model=SuitabilityToolInput,
|
||||
@@ -263,3 +279,9 @@ def register_business_agents(factory: AgentFactory) -> None:
|
||||
RiskAgent.definition,
|
||||
lambda _context: RiskAgent(RiskAgent.definition),
|
||||
)
|
||||
# 基座验证探针:只读、无副作用,用于端到端验证工具链路的拒绝行为。
|
||||
# 角色限定 admin,业务上不对外暴露用途。
|
||||
factory.register(
|
||||
PlatformProbeAgent.definition,
|
||||
lambda _context: PlatformProbeAgent(PlatformProbeAgent.definition),
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user