Native CLI i18n: The TrustGraph CLI has built-in translation support that dynamically loads language strings. You can test and use different languages by simply passing the --lang flag (e.g., --lang es for Spanish, --lang ru for Russian) or by configuring your environment's LANG variable. Automated Docs Translations: This PR introduces autonomously translated Markdown documentation into several target languages, including Spanish, Swahili, Portuguese, Turkish, Hindi, Hebrew, Arabic, Simplified Chinese, and Russian.
16 KiB
| layout | title | parent |
|---|---|---|
| default | TrustGraph 工具组系统 | Chinese (Beta) |
TrustGraph 工具组系统
Beta Translation: This document was translated via Machine Learning and as such may not be 100% accurate. All non-English languages are currently classified as Beta.
技术规范 v1.0
摘要
本规范定义了一个用于 TrustGraph 代理的工具分组系统,该系统允许对哪些工具可用于特定请求进行细粒度控制。该系统通过配置和请求级别的指定,引入基于组的工具过滤,从而实现更好的安全边界、资源管理以及代理功能的划分。
1. 概述
1.1 问题陈述
目前,TrustGraph 代理可以访问所有配置的工具,而与请求上下文或安全要求无关。这带来了一些挑战:
安全风险: 即使是只读查询,也可能访问到敏感工具(例如,数据修改)。 资源浪费: 即使简单的查询也不需要,也会加载复杂的工具。 功能混淆: 代理可能会选择不合适的工具,而存在更简单的替代方案。 多租户隔离: 不同的用户组需要访问不同的工具集。
1.2 解决方案概述
工具分组系统引入了:
- 组分类: 工具在配置时会被标记为所属的组。
- 请求级别过滤: AgentRequest 指定允许使用的工具组。
- 运行时强制: 代理只能访问与请求的组匹配的工具。
- 灵活分组: 工具可以属于多个组,以适应复杂的场景。
2. 模式变更
2.1 工具配置模式增强
现有的工具配置通过添加一个 group 字段进行增强:
之前:
{
"name": "knowledge-query",
"type": "knowledge-query",
"description": "Query the knowledge graph"
}
翻译后:
{
"name": "knowledge-query",
"type": "knowledge-query",
"description": "Query the knowledge graph",
"group": ["read-only", "knowledge", "basic"]
}
组字段规范:
group: Array(String) - 此工具所属的组列表
可选: 没有组字段的工具属于 "默认" 组
多重隶属: 工具可以属于多个组
区分大小写: 组名必须是完全匹配的字符串
2.1.2 工具状态转换增强
工具可以选择性地指定状态转换和基于状态的可用性:
{
"name": "knowledge-query",
"type": "knowledge-query",
"description": "Query the knowledge graph",
"group": ["read-only", "knowledge", "basic"],
"state": "analysis",
"available_in_states": ["undefined", "research"]
}
状态字段规范:
state: String - 可选 - 成功执行工具后要转换到的状态
available_in_states: Array(String) - 可选 - 此工具可用的状态
默认行为: 没有 available_in_states 的工具在所有状态下都可用
状态转换: 仅在成功执行工具后发生
2.2 AgentRequest 模式增强
trustgraph-base/trustgraph/schema/services/agent.py 中的 AgentRequest 模式已增强:
当前 AgentRequest:
question: String - 用户查询
plan: String - 执行计划(可以删除)
state: String - Agent 状态
history: Array(AgentStep) - 执行历史
增强后的 AgentRequest:
question: String - 用户查询
state: String - Agent 执行状态(现在被积极用于工具过滤)
history: Array(AgentStep) - 执行历史
group: Array(String) - 新增 - 此请求允许的工具组
模式变更:
已移除: plan 字段不再需要,可以删除(最初用于工具规范)
已添加: group 字段用于工具组规范
已增强: state 字段现在控制执行期间的工具可用性
字段行为:
组字段: 可选: 如果未指定,默认为 ["default"] 交集: 只有匹配至少一个指定组的工具才可用 空数组: 没有可用工具(agent 只能使用内部推理) 通配符: 特殊组 "*" 授予访问所有工具的权限
状态字段: 可选: 如果未指定,默认为 "undefined" 基于状态的过滤: 只有在当前状态下可用的工具才有资格 默认状态: "undefined" 状态允许所有工具(受组过滤限制) 状态转换: 成功执行后,工具可以更改状态
3. 自定义组示例
组织可以定义特定领域的组:
{
"financial-tools": ["stock-query", "portfolio-analysis"],
"medical-tools": ["diagnosis-assist", "drug-interaction"],
"legal-tools": ["contract-analysis", "case-search"]
}
4. 实现细节
4.1 工具加载和过滤
配置阶段:
- 所有工具从配置文件中加载,并带有其组分配信息。
- 没有明确组分配的工具将被分配到 "默认" 组。
- 组成员关系将被验证并存储在工具注册表中。
请求处理阶段:
- AgentRequest 携带可选的组指定信息。
- Agent 根据组的交集过滤可用的工具。
- 只有匹配的工具才会被传递到 Agent 执行上下文。
- Agent 在整个请求生命周期内都使用过滤后的工具集。
4.2 工具过滤逻辑
组合组和状态过滤:
For each configured tool:
tool_groups = tool.group || ["default"]
tool_states = tool.available_in_states || ["*"] // Available in all states
For each request:
requested_groups = request.group || ["default"]
current_state = request.state || "undefined"
Tool is available if:
// Group filtering
(intersection(tool_groups, requested_groups) is not empty OR "*" in requested_groups)
AND
// State filtering
(current_state in tool_states OR "*" in tool_states)
状态转换逻辑:
After successful tool execution:
if tool.state is defined:
next_request.state = tool.state
else:
next_request.state = current_request.state // No change
4.3 代理集成点
ReAct 代理:
工具过滤在 agent_manager.py 中在工具注册创建期间发生。
可用工具列表在计划生成之前,会根据组和状态进行过滤。
状态转换会在工具执行成功后更新 AgentRequest.state 字段。
下一次迭代使用更新后的状态进行工具过滤。
基于置信度的代理:
工具过滤在 planner.py 中在计划生成期间发生。
ExecutionStep 验证确保只使用组+状态符合条件的工具。
流程控制器在运行时强制执行工具可用性。
状态转换由流程控制器在步骤之间管理。
5. 配置示例
5.1 带有组和状态的工具配置
tool:
knowledge-query:
type: knowledge-query
name: "Knowledge Graph Query"
description: "Query the knowledge graph for entities and relationships"
group: ["read-only", "knowledge", "basic"]
state: "analysis"
available_in_states: ["undefined", "research"]
graph-update:
type: graph-update
name: "Graph Update"
description: "Add or modify entities in the knowledge graph"
group: ["write", "knowledge", "admin"]
available_in_states: ["analysis", "modification"]
text-completion:
type: text-completion
name: "Text Completion"
description: "Generate text using language models"
group: ["read-only", "text", "basic"]
state: "undefined"
# No available_in_states = available in all states
complex-analysis:
type: mcp-tool
name: "Complex Analysis Tool"
description: "Perform complex data analysis"
group: ["advanced", "compute", "expensive"]
state: "results"
available_in_states: ["analysis"]
mcp_tool_id: "analysis-server"
reset-workflow:
type: mcp-tool
name: "Reset Workflow"
description: "Reset to initial state"
group: ["admin"]
state: "undefined"
available_in_states: ["analysis", "results"]
5.2 请求示例与状态工作流
初始研究请求:
{
"question": "What entities are connected to Company X?",
"group": ["read-only", "knowledge"],
"state": "undefined"
}
可用工具:知识查询,文本补全 知识查询后:状态 → "分析"
分析阶段:
{
"question": "Continue analysis based on previous results",
"group": ["advanced", "compute", "write"],
"state": "analysis"
}
可用工具:复杂分析、图更新、重置工作流程 复杂分析之后:状态 → "结果"
结果阶段:
{
"question": "What should I do with these results?",
"group": ["admin"],
"state": "results"
}
可用的工具:仅限 reset-workflow reset-workflow 之后:状态 → "undefined"
工作流程示例 - 完整流程:
- 开始 (undefined):使用 knowledge-query → 转换到 "analysis"
- 分析状态: 使用 complex-analysis → 转换到 "results"
- 结果状态: 使用 reset-workflow → 转换回 "undefined"
- 返回开始: 所有初始工具再次可用
6. 安全注意事项
6.1 访问控制集成
网关级别的过滤: 网关可以根据用户权限强制执行组限制 防止通过请求修改来提升权限 审计跟踪包括请求和授予的工具组
示例网关逻辑:
user_permissions = get_user_permissions(request.user_id)
allowed_groups = user_permissions.tool_groups
requested_groups = request.group
# Validate request doesn't exceed permissions
if not is_subset(requested_groups, allowed_groups):
reject_request("Insufficient permissions for requested tool groups")
6.2 审计和监控
增强的审计跟踪: 记录每个请求所请求的工具组和初始状态 跟踪按组成员划分的状态转换和工具使用情况 监控未经授权的组访问尝试和无效的状态转换 警报不寻常的组使用模式或可疑的状态工作流程
7. 迁移策略
7.1 向后兼容性
第一阶段:增量更改
向工具配置添加可选的 group 字段
向 AgentRequest 模式添加可选的 group 字段
默认行为:所有现有工具都属于 "默认" 组
现有请求如果没有组字段,则使用 "默认" 组
保留现有行为: 没有组配置的工具继续工作(默认组) 没有状态配置的工具在所有状态下都可用 没有组指定的请求可以访问所有工具(默认组) 没有状态指定的请求使用 "未定义" 状态(所有工具可用) 没有对现有部署进行破坏性更改
8. 监控和可观察性
8.1 新指标
工具组使用情况:
agent_tool_group_requests_total - 按组划分的请求计数器
agent_tool_group_availability - 每个组可用的工具计量
agent_filtered_tools_count - 组+状态过滤后工具计数的直方图
状态工作流程指标:
agent_state_transitions_total - 按工具划分的状态转换计数器
agent_workflow_duration_seconds - 每个状态花费时间的直方图
agent_state_availability - 每个状态可用的工具计量
安全指标:
agent_group_access_denied_total - 未经授权的组访问计数器
agent_invalid_state_transition_total - 无效状态转换计数器
agent_privilege_escalation_attempts_total - 具有可疑请求的计数器
8.2 日志增强
请求日志记录:
{
"request_id": "req-123",
"requested_groups": ["read-only", "knowledge"],
"initial_state": "undefined",
"state_transitions": [
{"tool": "knowledge-query", "from": "undefined", "to": "analysis", "timestamp": "2024-01-01T10:00:01Z"}
],
"available_tools": ["knowledge-query", "text-completion"],
"filtered_by_group": ["graph-update", "admin-tool"],
"filtered_by_state": [],
"execution_time": "1.2s"
}
9. 测试策略
9.1 单元测试
工具过滤逻辑: 测试组的交集计算 测试基于状态的过滤逻辑 验证默认组和状态的分配 测试通配符组的行为 验证空组的处理 测试组合的组+状态过滤场景
配置验证: 测试使用各种组和状态配置加载工具 验证无效的组和状态规范的模式验证 测试与现有配置的向后兼容性 验证状态转换的定义和循环
9.2 集成测试
代理行为: 验证代理只看到组+状态过滤的工具 测试使用各种组组合的请求执行 测试代理执行期间的状态转换 验证在没有可用工具时错误处理 测试通过多个状态的工作流程进度
安全测试: 测试特权提升预防 验证审计跟踪的准确性 测试网关与用户权限的集成
9.3 完整场景
具有状态工作流程的多租户使用:
Scenario: Different users with different tool access and workflow states
Given: User A has "read-only" permissions, state "undefined"
And: User B has "write" permissions, state "analysis"
When: Both request knowledge operations
Then: User A gets read-only tools available in "undefined" state
And: User B gets write tools available in "analysis" state
And: State transitions are tracked per user session
And: All usage and transitions are properly audited
工作流程状态演进:
Scenario: Complete workflow execution
Given: Request with groups ["knowledge", "compute"] and state "undefined"
When: Agent executes knowledge-query tool (transitions to "analysis")
And: Agent executes complex-analysis tool (transitions to "results")
And: Agent executes reset-workflow tool (transitions to "undefined")
Then: Each step has correctly filtered available tools
And: State transitions are logged with timestamps
And: Final state allows initial workflow to repeat
10. 性能考虑
10.1 工具加载的影响
配置加载: 组和状态元数据在启动时加载一次 每个工具的内存开销很小(附加字段) 不会影响工具的初始化时间
请求处理: 组+状态过滤的组合在每个请求中执行一次 复杂度为 O(n),其中 n = 配置的工具数量 状态转换会增加微小的开销(字符串赋值) 对于典型的工具数量(< 100),影响可以忽略不计
10.2 优化策略
预计算的工具集: 根据组+状态组合缓存工具集 避免重复过滤常见的组/状态模式 内存与计算之间的权衡,适用于经常使用的组合
延迟加载: 仅在需要时才加载工具实现 减少具有许多工具的部署的启动时间 基于组需求的动态工具注册
11. 未来增强功能
11.1 动态组分配
基于上下文的组: 根据请求上下文将工具分配到组 基于时间的组可用性(仅在工作时间内) 基于负载的组限制(在低使用情况下限制昂贵的工具)
11.2 组层级结构
嵌套的组结构:
{
"knowledge": {
"read": ["knowledge-query", "entity-search"],
"write": ["graph-update", "entity-create"]
}
}
11.3 工具推荐
基于组的建议: 针对请求类型,推荐最佳工具组。 从使用模式中学习,以改进推荐。 在首选工具不可用时,提供备用组。
12. 开放性问题
-
组验证: 请求中无效的组名是否应导致硬性错误或警告?
-
组发现: 系统是否应提供一个 API 来列出可用的组及其工具?
-
动态组: 组是否应在运行时配置,或者仅在启动时配置?
-
组继承: 工具是否应从其父类别或实现继承组?
-
性能监控: 需要哪些额外的指标来有效跟踪基于组的工具使用情况?
13. 结论
工具组系统提供:
安全性: 对代理功能进行细粒度的访问控制。 性能: 减少工具加载和选择开销。 灵活性: 多维工具分类。 兼容性: 与现有代理架构无缝集成。
该系统使 TrustGraph 部署能够更好地管理工具访问,提高安全边界,并优化资源利用率,同时与现有的配置和请求完全兼容。