
AI Agent大模型后端任务调度【免费下载链接】XAgentAn Autonomous LLM Agent for Complex Task Solving项目地址https://gitcode.com/gh_mirrors/xa/XAgent点击查看免费下载XAgent 采用「主脑 Agent 独立工具服务器ToolServer」的分离架构Agent 负责规划与推理而所有工具的执行被隔离在一个远程 ToolServer 进程内二者之间通过一组 RESTful HTTP 接口通信。本文以 toolserver_interface.py 为核心系统讲解ToolServerInterface类的完整方法集会话管理、文件传输、工作空间操作、工具检索与命令执行、is_wrapped_response/unwrap_tool_response响应解包机制以及接口背后与 RunningRecoder 联动实现的请求缓存和状态码语义帮助你在阅读 XAgent 源码或复现/对接其 ToolServer 时准确理解客户端与服务器之间的每一次交互。一、整体定位ToolServerInterface 在 XAgent 架构中的角色从源码结构看XAgent/core.py 中的XAgentCoreComponents将toolserver_interface列为核心组件之一注释中明确标注 toolserver_interface: 工具服务接口 / tool server interface。其装配链路为XAgentCoreComponents.register_toolserver_interface(param)构造ToolServerInterface(self.recorder, loggerself.logger)随后立即调用lazy_init(configparam.config)完成会话初始化组件集关闭时XAgentCoreComponents.close会先调用toolserver_interface.download_all_files()把工作空间整体打包下载再调用close()关闭会话——这保证了 Agent 侧能完整留存 ToolServer 侧产生的所有文件产物。该接口被多处消费function_handler.py 的get_functions调用get_available_tools()拉取全部工具描述handle_tool_call调用execute_command_client执行 LLM 决策的工具调用含超时重试逻辑workflow/task_handler.py 调用retrieve_rapidapi_tools做 RapidAPI 工具的语义检索workflow/plan_exec.py 在计划细化阶段直接执行FileSystemEnv_print_filesys_struture命令打印文件系统结构inner_loop_search_algorithms/ReACT.py 同样通过execute_command_client执行工具命令。对应地ToolServer 节点侧的端点定义在 ToolServer/ToolServerNode/main.py接口路径与客户端一一对应/upload_file、/download_file、/download_workspace、/get_workspace_structure、/get_available_tools、/retrieving_tools、/get_json_schema_for_tools、/execute_tool等。二、配置与连接lazy_init 与 close2.1 配置项ToolServerInterface的连接行为完全由配置驱动。参考配置 assets/gpt-3.5-turbo_config.ymluse_selfhost_toolserver: true selfhost_toolserver_url: http://localhost:8080此外config.py 的XAgentConfig.reload方法会读取环境变量TOOLSERVER_URL来覆盖 YAML 中的selfhost_toolserver_urlos.getenv(TOOLSERVER_URL, self[selfhost_toolserver_url])即支持通过环境变量灵活切换 ToolServer 地址例如把 ToolServerNode 以 Docker 方式部署在其他容器或端口时无需修改配置文件。2.2 lazy_init会话建立lazy_init(config)的执行逻辑见 toolserver_interface.py#L78-L95将config保存到self.config后续execute_command_client会读取self.config[experiment][redo_action]决定是否强制重放动作若config.use_selfhost_toolserver为True则self.url config.selfhost_toolserver_url否则抛出NotImplementedError(Please use selfhost toolserver)——从源码看当前仓库版本只支持自托管 ToolServer非 selfhost 分支尚未实现通过logger.typewriter_log输出 ToolServer connected in {url}向{self.url}/get_cookie发送 POST 请求将返回的 cookies 保存到self.cookies。后续所有请求都携带该 cookies 完成会话身份识别。使用前提与注意事项需要保证selfhost_toolserver_url指向一个已启动的 ToolServerNode 服务且该服务可达若使用非 selfhost ToolServerlazy_init会直接抛异常中断。2.3 close会话关闭close()向{self.url}/close_session发送携带 cookies 的 POST 请求以关闭 ToolServer 会话。在项目中它由 core.py 的close方法调用且必须先调用download_all_files再调用close确保工作空间文件在会话关闭前全部落盘。三、文件传输与工作空间操作以下四个方法构成了 Agent 侧对 ToolServer 工作空间的完整读写能力。3.1 upload_file上传文件upload_file(file_path) - dict将本地文件上传到 ToolServer 工作空间。url f{self.url}/upload_file response requests.post(url, timeout10, cookiesself.cookies, files{file: open(file_path, rb), filename: os.path.basename(file_path)}) response.raise_for_status() return response.json()请求以 multipart/form-data 形式携带文件二进制内容与文件名超时 10 秒成功时返回 ToolServer 的 JSON 响应假设响应为Upload successful则返回值即为该响应的 JSON 结构。使用前提ToolServer 已启动、file_path为有效路径。3.2 download_file下载单个文件download_file(file_path) - str从 ToolServer 下载指定文件并保存到本地记录目录。url f{self.url}/download_file payload {file_path: file_path} response requests.post(url, jsonpayload, timeout10, cookiesself.cookies) response.raise_for_status() save_path os.path.join(self.recorder.record_root_dir, file_path) os.makedirs(os.path.dirname(save_path), exist_okTrue) with open(save_path, wb) as f: f.write(response.content) return save_path关键细节请求体是 JSON payload包含目标文件在 ToolServer 工作空间中的相对路径保存路径由self.recorder.record_root_dirRunningRecoder 的记录根目录拼接file_path得到并自动创建父目录函数返回的是本地保存路径save_path。例如假设文件被保存到/Users/xxx/XAgent/recordings/file.txt返回值即为该字符串。3.3 get_workspace_structure获取工作空间结构get_workspace_structure() - dict向{self.url}/get_workspace_structure发送 POST 请求timeout10携带 cookiesraise_for_status()后以 JSON 形式返回工作空间目录树。返回值结构示例{ workspace: { name: MyWorkspace, folders: [ { name: Folder1, files: [ {name: File1.txt, size: 10KB}, {name: File2.txt, size: 5KB} ] }, { name: Folder2, files: [{name: File3.txt, size: 8KB}] } ] } }3.4 download_all_files整体打包下载工作空间download_all_files() - str向{self.url}/download_workspace发送 POST 请求服务器返回整个工作空间的压缩包字节流客户端将其写入record_root_dir/workspace.zip并返回该保存路径save_path os.path.join(self.recorder.record_root_dir, workspace.zip) os.makedirs(os.path.dirname(save_path), exist_okTrue) with open(save_path, wb) as f: f.write(response.content)从源码看它是任务结束前回收 ToolServer 侧全部文件产物的兜底手段与close组合使用见 core.py#L219-L224。四、工具发现get_available_tools / retrieve_rapidapi_tools / get_json_schema_for_tools4.1 get_available_tools拉取全部可用工具该方法请求{self.url}/get_available_tools但真正的设计亮点在于客户端缓存url f{self.url}/get_available_tools cache_output self.recorder.query_tool_server_cache(url, payload) if cache_output ! None: response cache_output[tool_output] status_code cache_output[response_status_code] else: response requests.post(url, jsonpayload, timeout10, cookiesself.cookies) ... self.recorder.regist_tool_server(urlurl, payloadpayload, tool_outputresponse, response_status_codestatus_code)先通过recorder.query_tool_server_cache(url, payload)查询缓存RunningRecoder 会将每次交互的工具请求/响应持久化到tool_server_pair编号 JSON 文件中见 running_recorder.py缓存未命中时才真正发起 HTTP POST无论命中与否都会调用recorder.regist_tool_server(...)把本次交互注册进记录器——这正是 XAgent 支持**任务回放replay**的基础同一 (url, payload) 组合在回放时可直接复现历史结果异常时抛出Exception(fError when fetching available tools: {e})。返回值形如{ available_tools: [tool1, tool2, tool3], tools_json: [ {name: tool1, description: This is tool1}, {name: tool2, description: This is tool2} ] }在 function_handler.py 中get_functions消费该返回取出available_tools与tools_json按config.tool_blacklist过滤黑名单工具参考配置中默认屏蔽了FileSystemEnv_print_filesys_struture再把每个工具 JSON 注册进全局function_manager最终拼出提供给 LLM 的函数列表。4.2 retrieve_rapidapi_toolsRapidAPI 语义检索retrieve_rapidapi_tools(query: str, top_k: int 10)按自然语言查询从 RapidAPI 工具库中检索相关工具。请求{self.url}/retrieving_toolspayload 为{question: query, top_k: top_k}超时 20 秒同样走「先查缓存 → 未命中再发请求 → 注册记录」三段式流程成功后从响应中提取retrieved_tools工具名列表和tools_json工具描述列表并将每个工具描述注册进function_manager返回(retrieved_tools, tools_json)若检索过程出现异常打印错误信息Tool Retrieval Failed, nothing will be retrieved, please fix here.并返回(None, None)。输出示例retrieved_tools [Tool1, Tool2, Tool3] tools_json [ {name: Tool1, description: This is Tool1}, {name: Tool2, description: This is Tool2}, {name: Tool3, description: This is Tool3} ]该方法在 workflow/task_handler.py 中被调用用于在任务处理阶段动态扩充可用工具集配合配置项rapidapi_retrieve_tool_count控制检索数量。4.3 get_json_schema_for_tools获取工具的 JSON Schemaget_json_schema_for_tools(command_names)批量获取指定工具的 OpenAI function 格式 JSON Schema。请求{self.url}/get_json_schema_for_toolspayload 为{tool_names: command_names}缓存/注册流程与前两个方法一致响应解析完成后调用function_manager.register_function(response)将 schema 注册进全局函数管理器然后返回该 JSON。返回值示例按工具名组织的输入/输出模式{ tool1: { input: {type: string, description: Input string}, output: {type: string, description: Output string} }, tool2: { input: {type: number, description: Input number}, output: {type: number, description: Output number} } }异常时打印 Error when fetching openai function jsons: {e} 并返回None。五、核心执行链路execute_command_clientexecute_command_client(command_name, arguments{})是 Agent 每次工具调用的最终出口也是整个接口中最复杂的方法。完整流程如下见 toolserver_interface.py#L297-L364构造 payloadurl f{self.url}/execute_tool若arguments是字符串会先尝试json.loads转成 dict然后组装payload {tool_name: command_name, arguments: arguments}缓存查询cache_output self.recorder.query_tool_server_cache(url, payload)执行判断当self.config[experiment][redo_action]为True实验配置中默认false或缓存为空时才真正 POST 请求响应解析状态码为200或450时解析 JSON 并调用unwrap_tool_response(command_result, self.logger)解包见下节其他状态码则直接取response.text作为命令结果缓存回写若缓存命中直接用cache_output[tool_output]与response_status_code覆盖结果随后统一regist_tool_server注册状态码映射把 HTTP 状态码翻译成ToolCallStatusCode定义于 XAgent/utils.py#L53-L82HTTP 状态码ToolCallStatusCode含义200TOOL_CALL_SUCCESS工具调用成功404HALLUCINATE_NAME工具名不存在LLM 幻觉出工具名422FORMAT_ERROR参数格式错误450TIMEOUT_ERROR执行超时500TOOL_CALL_FAILED工具执行失败503SERVER_ERROR服务器错误并抛出Exception(Server Error: command_result)其他OTHER_ERROR其他错误返回(command_result, tool_output_status_code)元组例如可能的返回值为(Command result, ToolCallStatusCode.TOOL_CALL_SUCCESS)。5.1 上层消费超时重试function_handler.py 的handle_tool_call展示了该接口的典型消费方式当返回TIMEOUT_ERROR且结果中携带detail.type retry时会按detail[next_calling]给出的下一次调用信息最多重试 10 次每次间隔 3 秒若耗尽重试仍超时则将结果替换为提示文案 Timeout and no content returned! Please check the content you submit!。成功后还会经过long_result_summary对超长网页类结果做解析压缩最后把工具输入/输出/状态码/思考数据一并recorder.regist_tool_call落盘用于记录与回放。5.2 使用注意需要提供正确的command_name与argumentscommand_name必须在 ToolServer 已注册的工具名范围内否则收到 404 / HALLUCINATE_NAME网络请求可能失败或超时上层如handle_tool_call需按状态码做错误处理依赖lazy_init已完成self.url、self.cookies已就绪。六、响应解包机制is_wrapped_response 与 unwrap_tool_responseToolServer 侧会把工具返回值包装成标准化结构再经 JSON 传输包装逻辑见 ToolServer/ToolServerNode/utils/response.py 的wrap_tool_response客户端则用unwrap_tool_response还原。两者共同约定了如下标准结构# 简单类型str/int/float/bool/list直接返回 # 单一值dict 等 { type: simple, data: obj } # 二进制数据bytesbase64 编码 { type: binary, media_type: image/png, name: xxx, data: base64 encoded data } # 多值返回tuple { type: composite, data: [ {type: simple, data: obj1}, {type: simple, data: obj2} ] }6.1 is_wrapped_responseis_wrapped_response(obj: dict) - bool判断一个 dict 是否为「已包装的响应」if type in obj and obj[type] in [simple, composite, binary] and data in obj: return True return False即当且仅当obj同时包含type取值必须是[simple, composite, binary]之一与data两个键时返回True。它被unwrap_tool_response调用用于区分「普通 dict 结果」和「包装容器」。注意一个潜在坑如果工具正常返回的 dict 恰好含type取值合法和data两个键会被误判为包装结构——从源码结构看这是由协议约定兜底的普通工具应避免返回这种形态的 dict。输出示例True使用前提注意事项传入的obj参数必须是字典类型obj必须包含type与data键type的取值必须是[simple, composite, binary]之一。6.2 unwrap_tool_responseunwrap_tool_response(obj, loggerNone)按类型分发处理见 toolserver_interface.py#L29-L66dict 且是包装响应is_wrapped_response为 Truetype simple直接返回obj[data]type binary取obj.get(name, uuid.uuid4().hex)作为文件名若media_type image/png且文件名未以.png结尾则补上.png后缀随后将obj[data]经base64.b64decode解码后写入local_workspace/目录下的对应文件并返回{media_type: ..., file_name: ...}字典type composite对obj[data]中每个元素递归调用unwrap_tool_response返回解包后的列表dict 但不是包装响应原样返回objstr / int / float / bool / list原样返回objNone返回None其他未知类型通过logger.typewriter_log(fUnknown type {type(obj)} in unwrap_tool_response, Fore.YELLOW)打印警告并返回None。输出示例binary 分支PNG 图片被落地到本地后{ media_type: image/png, file_name: example.png }注意事项该函数依赖is_wrapped_response的正确性其处理逻辑依赖响应type字段需保证 ToolServer 侧包装协议wrap_tool_response与本函数匹配。这个机制的实际价值在于工具返回的图片、文件等二进制内容不会占用 LLM 上下文而是被物化到 local_workspace/ 目录Agent 后续只需通过file_name引用即可而execute_command_client中 450超时状态也走 JSON 解析路径意味着 ToolServer 可以在超时响应中返回结构化的 retry 指令供handle_tool_call重试。七、缓存与回放接口与 RunningRecoder 的联动ToolServerInterface自身不存储状态其可回放能力来自构造时注入的RunningRecoderquery_tool_server_cache(url, payload)按请求 URL 与 payload 查询历史交互缓存命中则跳过真实 HTTP 请求regist_tool_server(url, payload, tool_output, response_status_code)把每次交互写入记录持久化为tool_server_pair目录下的编号 JSON 文件见 running_recorder.py#L236-L263。由此形成两个实验能力一是在任务回放/续跑场景下FunctionHandler等消费者可直接复现历史工具结果如ask_human_for_help也复用了同一套缓存查询机制见 function_handler.py#L314-L352二是配合experiment.redo_action: true可在回放时强制重新执行动作而非读取缓存。八、小结与使用要点接入方式先在 YAML 配置中设置use_selfhost_toolserver: true与selfhost_toolserver_url或用环境变量TOOLSERVER_URL覆盖再启动 ToolServerNode 服务最后通过ToolServerInterface(recorder, logger)lazy_init(config)建立带 cookie 的会话方法分工会话管理lazy_init/close、文件传输upload_file/download_file/download_all_files/get_workspace_structure、工具发现get_available_tools/retrieve_rapidapi_tools/get_json_schema_for_tools、命令执行execute_command_client生命周期约定关闭前先download_all_files再close健壮性设计客户端缓存 regist_tool_server记录支撑任务回放HTTP 状态码到ToolCallStatusCode的映射404→幻觉工具名、422→参数错误、450→超时、503→服务器错误让上层 Agent 能对失败做出差异化决策响应协议simple/binary/composite三种包装类型由 ToolServer 侧wrap_tool_response生成、客户端unwrap_tool_response还原binary 数据自动 base64 解码落盘至local_workspace从而把大体积产物与 LLM 上下文解耦。赞分享AI Agent大模型后端任务调度【免费下载链接】XAgentAn Autonomous LLM Agent for Complex Task Solving项目地址https://gitcode.com/gh_mirrors/xa/XAgent点击查看免费下载相关推荐Multipass服务客户端认证机制详解Multipass服务客户端认证机制详解 前言 Multipass作为一款轻量级虚拟机管理工具其服务端与客户端之间的通信安全性至关重要。本文将深入解析Mult虚拟化开发工具云原生Apache Ignite客户端节点连接机制详解Apache Ignite客户端节点连接机制详解 概述 Apache Ignite作为高性能分布式内存计算平台提供了多种客户端连接方式包括 厚客户端Thi数据库分布式数据库后端grpc-java Keepalive 实战基于 HTTP/2 PING 的客户端与服务端保活机制详解grpc java Keepalive 实战基于 HTTP/2 PING 的客户端与服务端保活机制详解 本篇技术指南聚焦 grpc java 仓库中的 Kee后端RPC框架上一篇StarCoder2安全编码指南防范AI生成代码中的安全漏洞下一篇react-native-elements Switch 组件完全指南受控开关的状态管理、主题色定制与跨平台实现原理创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考