168 lines
4.5 KiB
Python
168 lines
4.5 KiB
Python
"""
|
||
Think 工具 - 深度推理工具
|
||
|
||
让Agent进行深度思考和推理,用于:
|
||
- 分析复杂情况
|
||
- 规划下一步行动
|
||
- 评估发现的严重性
|
||
- 决定是否需要创建子Agent
|
||
"""
|
||
|
||
import logging
|
||
from typing import Optional
|
||
from pydantic import BaseModel, Field
|
||
|
||
from .base import AgentTool, ToolResult
|
||
|
||
logger = logging.getLogger(__name__)
|
||
|
||
|
||
class ThinkInput(BaseModel):
|
||
"""Think工具输入参数"""
|
||
thought: str = Field(
|
||
...,
|
||
description="思考内容,可以是分析、规划、评估等"
|
||
)
|
||
category: Optional[str] = Field(
|
||
default="general",
|
||
description="思考类别: analysis(分析), planning(规划), evaluation(评估), decision(决策)"
|
||
)
|
||
|
||
|
||
class ThinkTool(AgentTool):
|
||
"""
|
||
Think 工具
|
||
|
||
这是一个让Agent进行深度推理的工具。Agent可以用它来:
|
||
- 分析复杂情况:当面对复杂的代码逻辑或不确定的漏洞线索时
|
||
- 规划下一步行动:在执行具体操作之前先规划策略
|
||
- 评估发现的严重性:发现可疑点后评估其真实性和影响
|
||
- 决定是否需要分解任务:当任务变得复杂时分析是否需要创建子Agent
|
||
|
||
Think工具的输出会被记录到Agent的对话历史中,帮助LLM保持思路的连贯性。
|
||
"""
|
||
|
||
@property
|
||
def name(self) -> str:
|
||
return "think"
|
||
|
||
@property
|
||
def description(self) -> str:
|
||
return """深度思考工具。用于:
|
||
1. 分析复杂的代码逻辑或安全问题
|
||
2. 规划下一步的分析策略
|
||
3. 评估发现的漏洞是否真实存在
|
||
4. 决定是否需要深入调查某个方向
|
||
|
||
使用此工具记录你的推理过程,这有助于保持分析的连贯性。
|
||
|
||
参数:
|
||
- thought: 你的思考内容
|
||
- category: 思考类别 (analysis/planning/evaluation/decision)"""
|
||
|
||
@property
|
||
def args_schema(self):
|
||
return ThinkInput
|
||
|
||
async def _execute(
|
||
self,
|
||
thought: str,
|
||
category: str = "general",
|
||
**kwargs
|
||
) -> ToolResult:
|
||
"""
|
||
执行思考
|
||
|
||
实际上这个工具不执行任何操作,只是记录思考内容。
|
||
但它的存在让Agent有一个"思考"的动作,有助于推理。
|
||
"""
|
||
if not thought or not thought.strip():
|
||
return ToolResult(
|
||
success=False,
|
||
error="思考内容不能为空",
|
||
)
|
||
|
||
thought = thought.strip()
|
||
|
||
# 根据类别添加标记
|
||
category_labels = {
|
||
"analysis": "🔍 分析",
|
||
"planning": "📋 规划",
|
||
"evaluation": "⚖️ 评估",
|
||
"decision": "🎯 决策",
|
||
"general": "💭 思考",
|
||
}
|
||
|
||
label = category_labels.get(category, "💭 思考")
|
||
|
||
logger.debug(f"Think tool called: [{label}] {thought[:100]}...")
|
||
|
||
return ToolResult(
|
||
success=True,
|
||
data={
|
||
"message": f"思考已记录 ({len(thought)} 字符)",
|
||
"category": category,
|
||
"label": label,
|
||
},
|
||
metadata={
|
||
"thought": thought,
|
||
"category": category,
|
||
"char_count": len(thought),
|
||
}
|
||
)
|
||
|
||
|
||
class ReflectTool(AgentTool):
|
||
"""
|
||
反思工具
|
||
|
||
让Agent回顾和总结当前的分析进展
|
||
"""
|
||
|
||
@property
|
||
def name(self) -> str:
|
||
return "reflect"
|
||
|
||
@property
|
||
def description(self) -> str:
|
||
return """反思工具。用于回顾当前的分析进展:
|
||
1. 总结已经发现的问题
|
||
2. 评估当前分析的覆盖度
|
||
3. 识别可能遗漏的方向
|
||
4. 决定是否需要调整策略
|
||
|
||
参数:
|
||
- summary: 当前进展总结
|
||
- findings_so_far: 目前发现的问题数量
|
||
- coverage: 分析覆盖度评估 (low/medium/high)
|
||
- next_steps: 建议的下一步行动"""
|
||
|
||
@property
|
||
def args_schema(self):
|
||
return None
|
||
|
||
async def _execute(
|
||
self,
|
||
summary: str = "",
|
||
findings_so_far: int = 0,
|
||
coverage: str = "medium",
|
||
next_steps: str = "",
|
||
**kwargs
|
||
) -> ToolResult:
|
||
"""执行反思"""
|
||
reflection = {
|
||
"summary": summary,
|
||
"findings_count": findings_so_far,
|
||
"coverage": coverage,
|
||
"next_steps": next_steps,
|
||
}
|
||
|
||
return ToolResult(
|
||
success=True,
|
||
data={
|
||
"message": "反思已记录",
|
||
"reflection": reflection,
|
||
},
|
||
metadata=reflection,
|
||
)
|