mirror of
https://github.com/zhenxun-org/zhenxun_bot.git
synced 2026-10-18 18:50:05 +08:00
* ♻️ refactor(ai): 重构 AI 服务模块并完善文档注释 - 【重构】统一清理并优化所有 AI 服务模块文件的导入语句,将其移至文件顶部 - 【重构】重构 `hooks.py` 中的 `Hooks` 派发逻辑,使用通用管道函数消除重复代码,并引入 `HookPoint` 描述符 - 【重构】重构工具装饰器实现,新增 `toolkit` 类装饰器,优化 `BaseToolkit` 配置合并与前缀处理 - 【功能】Docker 沙箱容器创建时支持自动注入系统代理环境变量并配置 `ExtraHosts` - 【功能】Jupyter 服务启动前自动清理旧进程并初始化临时目录权限 - 【修复】优化 Pydantic 结构化输出校验失败时的错误信息提取,提供更详细的字段级错误反馈 - 【修复】在 `api.py` 中避免将 `ModelRetry` 和 `ControlFlowExit` 异常错误地包装为 `LLMException` - 【文档】为 AI 服务、沙箱、工具链、工作流等核心模块补充完整的 Docstring 和类型注释 * 📝 docs(ai): 补全核心模块文档注释并清理冗余代码 - 补全 `run/context`、`run/hooks` 和 `tools/engine/registry` 中类与方法的中文文档注释 - 清理 `tools/providers/builtin/sandbox` 中未使用的 `PythonPluginProtocol` 协议及相关导入 - 规范化部分代码的格式与尾随逗号 * ♻️ refactor!(flow): 重构 Task 为 AgentTask 并优化工作流元数据定义 - 【Breaking Change】将 `Task` 重命名为 `AgentTask` 以避免命名冲突 - 更新 Agent、Team、Workflow 等模块中的类型声明与相关逻辑 - 引入 `AutoNodeMeta` 强类型元数据,替换工作流装饰器中的裸字典定义 - 将 `StepMeta`、`ConditionMeta` 和 `RouterMeta` 统一移动至 `types.py` - 优化 `RunnableNode` 对上游 `AgentTask` 的处理与拼接逻辑 - 调整团队协作策略中 `FinishAction` 的返回值为完整结果对象 * ♻️ refactor(workflow): 移除人工确认机制并重构错误策略 - 移除工作流节点的人工确认(HITL)与挂起继续机制 - 删除 `auto` 自动化工作流及相关装饰器文件 - 将错误处理策略类从 `types.py` 拆分并移动到新文件 `policies.py` - 优化节点执行失败时的异常信息格式化输出 - 移除 `WorkflowRunResult` 和 `StepOutput` 中与挂起相关的状态字段 * 🚨 auto fix by pre-commit hooks --------- Co-authored-by: webjoin111 <455457521@qq.com> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
58 lines
2.2 KiB
Python
58 lines
2.2 KiB
Python
from zhenxun.services.ai.core.exceptions import AbortException, ToolFatalError
|
|
from zhenxun.services.ai.core.stream_events import ToolStreamChunkEvent
|
|
from zhenxun.services.ai.run.context import RunContext
|
|
from zhenxun.services.ai.run.di import Inject
|
|
from zhenxun.services.ai.tools.core.decorators import tool
|
|
from zhenxun.services.ai.tools.core.toolkit import BaseToolkit
|
|
from zhenxun.services.ai.tools.models import ToolResult
|
|
from zhenxun.services.log import logger
|
|
|
|
|
|
class HITLToolkit(BaseToolkit):
|
|
"""
|
|
Human-in-the-Loop (HITL) 工具箱。
|
|
提供大模型主动挂起执行流并向用户提问求助的能力。
|
|
"""
|
|
|
|
default_prefix = ""
|
|
|
|
default_instructions = (
|
|
"## 人机协同求助系统\n"
|
|
"你拥有向用户发起提问的权限。当你遇到困难时(例如缺少关键信息、连续执行某个操作出错、找不到文件等),"
|
|
"可以使用 `ask_user_for_help` 工具请求用户协助。"
|
|
"用户回答后,你将收到答案并可以继续任务。"
|
|
)
|
|
|
|
@tool(
|
|
name="ask_user_for_help",
|
|
description="向当前对话的用户提出问题以获取信息或指导。当你无法独立完成任务时,请调用此工具。",
|
|
)
|
|
async def ask_user_for_help(
|
|
self,
|
|
question: str,
|
|
hitl: Inject.HITL,
|
|
context: RunContext,
|
|
) -> ToolResult:
|
|
try:
|
|
user_reply = await hitl.ask_text(
|
|
f"🤖 [AI 提问]\n{question}\n\n(请在 60 秒内回复,或回复'取消')",
|
|
timeout=60.0,
|
|
)
|
|
except ToolFatalError:
|
|
return ToolResult(
|
|
output="用户未在规定时间内回复 (超时未响应),"
|
|
"你必须尝试自行解决或中止任务。",
|
|
).as_error()
|
|
except AbortException as e:
|
|
raise e
|
|
|
|
logger.info(f"收到用户求助回复: {user_reply}")
|
|
if context and context.run.event_bus:
|
|
await context.run.event_bus.emit(
|
|
ToolStreamChunkEvent(
|
|
tool_name=context.call.tool_name, content="🗣️ 已收到用户的回复"
|
|
)
|
|
)
|
|
|
|
return ToolResult(output=f"用户提供的回复是: {user_reply}")
|