千问大模型工具调用异常需依赖外部框架或客户端实现错误处理:一、openclaw配置重试策略;二、工具函数内嵌防御逻辑;三、设置多级降级工具链;四、关键操作启用检查点回滚;五、模型层指令引导结构化错误响应。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

如果您在使用千问大模型进行工具调用时遇到函数返回异常,模型本身不具备原生的自动重试或降级能力,必须依赖外部框架(如OpenClaw)或客户端层主动注入错误处理逻辑。以下是实现该目标的具体方法:
一、启用OpenClaw内置工具调用重试策略
OpenClaw在执行tool_call时会捕获底层异常,并依据retryPolicy配置决定是否重试。该机制适用于网络类、超时类、临时性失败的工具调用,不适用于语义错误或参数非法等永久性错误。
1、打开~/.openclaw/openclaw.json文件,在execution.retryPolicy.custom节点下新增tool_failure条目。
2、配置匹配模式为"tool_error",action设为"exponential_backoff",initialDelay设为2000毫秒。
3、在retryableErrors数组中加入"TOOL_EXECUTION_FAILED"与"TOOL_TIMEOUT"两项。
4、保存后重启OpenClaw网关服务,使配置生效。
二、在工具函数内部嵌入防御性逻辑
工具调用失败常源于输入参数越界、依赖服务不可达或资源临时不足。通过在工具代码中预判并封装异常,可将不可重试错误转化为可恢复状态,从而触发上层重试流程。
1、在Python工具函数开头添加try-except块,捕获requests.exceptions.ConnectionError与subprocess.TimeoutExpired。
2、对ConnectionError,抛出带有重试标识的自定义异常:raise ToolRetryableError("network_unreachable")。
3、对TimeoutExpired,记录当前超时阈值并动态下调:timeout = max(5, timeout // 2)。
4、对ValueError等参数错误,不抛出异常,而是返回结构化响应:{"status": "invalid_input", "suggestion": "请检查file_path格式"}。
三、配置多级降级工具链
当主工具持续失败时,OpenClaw支持按优先级顺序切换至备用工具实现功能降级。该机制需在skill定义中显式声明fallback_tools列表,由模型决策层根据错误类型自动触发切换。
1、在skill.yaml中为web_fetch操作定义primary_tool: "curl_fetch",并设置fallback_tools: ["wget_fetch", "httpx_fetch"]。
2、在openclaw.json中为curl_fetch配置maxAttempts: 2,为wget_fetch配置maxAttempts: 1。
3、当curl_fetch连续两次失败且错误码为"CURLE_COULDNT_CONNECT"时,自动调用wget_fetch替代执行。
4、若所有fallback_tools均失败,则返回error_code: "ALL_TOOLS_UNAVAILABLE",终止当前step并进入人工确认流程。
四、基于检查点的状态回滚与跳过
对于不可重试的关键工具调用(如文件覆盖、数据库写入),OpenClaw提供checkpoint.save()与claw.tool.rollback()接口,可在异常发生后恢复至上一个稳定状态,避免产生脏数据。
1、在调用危险工具前插入claw.checkpoint.save({key: "before_db_write", value: {"backup_id": "20260523_1520"}})。
2、捕获sqlalchemy.exc.IntegrityError后,立即调用claw.tool.rollback("before_db_write")还原备份快照。
3、若rollback成功,记录日志并继续执行后续非依赖步骤。
4、若rollback失败或无对应检查点,则执行skip_and_log动作,标记该step为skipped并输出原始异常堆栈。
五、模型层指令引导式错误响应
当工具返回异常信息时,可通过system prompt强制模型解析错误内容并生成结构化重试指令,而非自由发挥。该方式不依赖框架重试机制,适用于Dify、FastAPI等轻量集成场景。
1、在system prompt末尾追加:“若收到tool_response包含'error'字段,请严格按以下JSON格式响应:{'action': 'retry', 'tool_name': 'xxx', 'args': {...}} 或 {'action': 'skip', 'reason': 'xxx'}。”
2、在客户端解析模型输出时,校验response是否符合该schema,仅对action为retry的响应执行二次调用。
3、若模型未返回合法JSON,或action字段值非法,则丢弃本次输出,直接返回HTTP 422 Unprocessable Entity。
4、对连续两次非法响应,强制终止会话并记录warning级别日志:"模型输出格式失控,已禁用自动重试"。











