当前位置: 首页 > article >正文

串行调用 3 个 API 总翻车?这 3 种错误处理策略让 Skill 稳如泰山

本文收录于GithubAI-From-Zero 项目 —— 一个从零开始系统学习 AI 的知识库。如果觉得有帮助欢迎 ⭐ Star 支持一个Skill需要串行调用三个外部API如何正确处理局部失败一、最常见的错误一刀切的错误处理串行调用三个API最容易犯的错是把三个await直接写在一起然后用一个try/catch包住——这意味着任何一步失败都会中断后续步骤也无法区分是哪一步出了问题更无法决定是否要重试或跳过。说人话就是想象你要做一顿饭需要买菜、洗菜、炒菜三个步骤。如果你采用一刀切的做法买菜时发现超市关门了你就直接放弃整顿饭连家里已有的食材都不用了。但实际上你可能家里还有存货或者可以去其他地方买或者干脆做个简单的面条。在OpenClaw的Skill上下文里Skill的结果最终会被Brain读取并决定下一步行动所以错误信息本身也是有价值的输出——不应该只抛异常而应该把每一步的成功或失败状态都结构化地返回给Brain让LLM来决定如何处理局部失败。二、策略一强依赖链任意失败即中止适用场景步骤之间有严格的数据依赖中间结果缺失无法继续。典型例子获取用户信息 → 查询订单 → 获取物流详情每步都依赖前一步的结果// Skill: 获取用户信息 → 查询订单 → 获取物流详情asyncfunctiongetOrderTrackingSkill(userId){letuser,orders,tracking;// 步骤一获取用户try{userawaitfetchUser(userId);}catch(err){return{success:false,failedAt:fetchUser,error:err.message};}// 步骤二查询订单依赖 user.accountIdtry{ordersawaitfetchOrders(user.accountId);}catch(err){return{success:false,failedAt:fetchOrders,error:err.message};}// 步骤三物流详情依赖 orders[0].trackingIdtry{trackingawaitfetchTracking(orders[0]?.trackingId);}catch(err){return{success:false,failedAt:fetchTracking,error:err.message};}return{success:true,user,orders,tracking};}关键优势明确标注failedAtBrain能知道具体哪步失败精准错误提示可以给用户更具体的反馈而不是模糊的操作失败保留部分数据即使失败也可能包含有用的中间结果三、策略二弱依赖局部失败用降级值填充适用场景某些步骤失败不影响整体流程可以用默认值或空值继续。典型例子生成早报日历 天气 邮件摘要各自独立// Skill: 生成早报日历 天气 邮件摘要各自独立asyncfunctionmorningBriefingSkill(){// 三个步骤并发发起但各自独立捕获错误const[calendarResult,weatherResult,emailResult]awaitPromise.allSettled([fetchCalendarEvents(),fetchWeather(),fetchEmailSummary(),]);// 结构化每一步的结果constbriefing{calendar:calendarResult.statusfulfilled?calendarResult.value:{error:calendarResult.reason?.message||Unknown error,data:[]},weather:weatherResult.statusfulfilled?weatherResult.value:{error:weatherResult.reason?.message||Unknown error,data:null},email:emailResult.statusfulfilled?emailResult.value:{error:emailResult.reason?.message||Unknown error,data:[]},};// 告诉 Brain 哪些部分有问题constpartialFailuresObject.entries(briefing).filter(([,v])v.error).map(([k,v])${k}:${v.error});return{success:partialFailures.length0,partialFailures,briefing};}关键工具Promise.allSettled不会短路一个Promise reject不会影响其他Promise完整结果等待所有Promise完成每个都标记fulfilled或rejected灵活处理可以根据业务需求选择串行或并发执行注意虽然示例使用并发但如果业务要求串行换回逐步await即可错误处理结构不变。四、策略三带重试的串行调用适用场景外部API不稳定瞬时失败应该重试而不是立刻上报错误。重试工具函数asyncfunctionwithRetry(fn,{maxRetries3,baseDelay500}{}){letlastError;for(letattempt0;attemptmaxRetries;attempt){try{returnawaitfn();}catch(err){lastErrorerr;// 不重试客户端错误4xx只重试服务端/网络错误if(err.status400err.status500)throwerr;if(attemptmaxRetries-1){constdelaybaseDelay*Math.pow(2,attempt);// 指数退避awaitsleep(delay);}}}throwlastError;}constsleepmsnewPromise(resolvesetTimeout(resolve,ms));在Skill中的应用asyncfunctionrobustSkill(input){conststep1awaitwithRetry(()callApiA(input),{maxRetries:3});conststep2awaitwithRetry(()callApiB(step1.id),{maxRetries:2});conststep3awaitwithRetry(()callApiC(step2.data),{maxRetries:3});return{step1,step2,step3};}重试策略要点指数退避避免频繁重试加重服务器负担区分错误类型4xx错误客户端错误不重试5xx错误服务端错误重试限制重试次数避免无限重试导致任务长时间阻塞五、把错误结构化返回给Brain是关键OpenClaw的Brain是ReAct循环——它读Skill的输出然后决定下一步Thought和Action。如果Skill直接throw异常Brain只能知道Skill执行失败如果Skill把失败信息结构化返回Brain可以做更细粒度的决策。Skill返回格式的最佳实践// Skill 返回格式的约定供 Brain 解析return{success:false,failedAt:fetchOrders,// Brain 可以据此决策completedSteps:[fetchUser],// 已完成的步骤partialData:{user},// 部分数据仍可用error:Orders API timeout,// 人类可读的错误描述retryable:true,// 是否值得重试suggestedAction:ask_user_for_alternative_account// 建议的下一步行动};结构化错误的优势信息类型传统异常结构化返回Brain能做什么失败位置调用栈failedAt字段精准定位问题已完成步骤无completedSteps避免重复执行部分数据无partialData利用已有信息重试建议无retryable字段自动重试或询问用户下一步建议无suggestedAction智能决策六、设计哲学Skill输出要对LLM友好这个设计哲学和OpenClaw的Skill是Markdown自然语言说明书的理念一致——Skill不只是执行代码它的输出要对LLM友好让Brain能读懂发生了什么而不是只看到一个二进制的成功/失败。对比两种设计思路传统API设计成功返回数据失败抛异常Agent-friendly设计总是返回结构化结果包含成功/失败的详细信息实际效果差异当用户问我的订单到哪了传统设计Skill失败 → Brain收到异常 → 回复抱歉查询失败了结构化设计Skill返回{success: false, failedAt: fetchOrders, partialData: {user: {...}}, error: No orders found}Brain理解用户存在但没有订单 → 回复您还没有下单需要帮您创建订单吗七、选择策略的决策树面对串行API调用如何选择合适的错误处理策略三个API调用是否有数据依赖 ├─ 是 → 是否允许部分成功 │ ├─ 否 → 使用策略一强依赖链 │ └─ 是 → 使用策略二弱依赖降级 └─ 否 → API是否稳定 ├─ 否 → 使用策略三带重试 └─ 是 → 使用策略二并发独立错误处理实用建议优先考虑业务语义技术方案服务于业务需求总是结构化返回无论选择哪种策略都要返回详细的状态信息为Brain提供决策依据错误信息要包含足够的上下文测试各种失败场景确保Skill在各种异常情况下都能优雅降级在Agent时代错误处理不再是简单的try/catch而是为智能决策提供高质量输入的关键环节。

相关文章:

串行调用 3 个 API 总翻车?这 3 种错误处理策略让 Skill 稳如泰山

🚀 本文收录于Github:AI-From-Zero 项目 —— 一个从零开始系统学习 AI 的知识库。如果觉得有帮助,欢迎 ⭐ Star 支持! 一个Skill需要串行调用三个外部API,如何正确处理局部失败?一、最常见的错误&#xff…...

GitHub学生认证保姆级教程,两年Copilot!

一、材料准备1.纸质证明准备以下纸质资料:2.信息文字材料准备(关于学校的学校官网基本上都有):① 学校邮箱 ② 市,省,国 (如:Changshu,Suzhou,China)(学校地址) ③ 学校官…...

升级炸裂!zmaiFy 双版本 AI 断句革新,字幕翻译效率再翻番

在影视内容出海与跨语言观影需求爆发的当下,字幕翻译与音频转录的效率、精准度,直接决定了内容传播的广度与深度。2026 年 3 月,一站式字幕处理平台 zmaiFy 迎来重磅版本升级,豆包模型大版本迭代 多模型语义断句升级双重福利重磅…...

基于matlab的模拟退火算法优化TSP(SA-TSP),最优路径动态寻优。 输出最优路径值、...

基于matlab的模拟退火算法优化TSP(SA-TSP),最优路径动态寻优。 输出最优路径值、路径曲线、迭代曲线。 数据可更换自己的,程序已调通,可直接运行。咱们今天来玩点刺激的——用MATLAB搞个会自己找最优路线的模拟退火快递小哥!先看效…...

一种融合Circle混沌映射、Levy飞行策略与透镜成像折射学习的改进长鼻浣熊优化算法--MA...

一种改进的长鼻浣熊优化算法--MATLAB 改进包括: Circle混沌映射 Levy飞行策略 透镜成像折射学习长鼻浣熊优化算法(COOA)最近在群体智能领域冒了个泡,这货模仿了浣熊水下摸石头找食物的行为。原始版本在复杂问题上容易卡在局…...

LiuJuan20260223Zimage镜像免配置:内置模型路径校验、依赖自动安装与健康检查脚本

LiuJuan20260223Zimage镜像免配置:内置模型路径校验、依赖自动安装与健康检查脚本 1. 开箱即用:一个为LiuJuan图片生成而优化的AI镜像 如果你正在寻找一个能快速生成LiuJuan风格图片的AI工具,但又不想折腾复杂的模型部署和环境配置&#xf…...

扣子平台客服智能体实战:从架构设计到生产环境部署

最近在负责公司客服系统的智能化升级,原来的系统在高并发下经常“罢工”,用户意图识别也总是不准,搞得客服和用户都很头疼。经过一番调研和折腾,我们最终基于扣子平台的客服智能体,搭建了一套相对稳定、高效的解决方案…...

Infoseek品牌公关:主动防控舆情,筑牢品牌发展根基

数字化时代信息传播呈现“快、广、杂”的特点,网络中一句负面评价、一条不实谣言,都可能快速发酵为品牌危机,严重影响企业口碑与经营。多数中小企业缺乏专业公关能力,面对舆情往往被动应对,不仅处置成本高、效率低&…...

Qwen-Image-2512-Pixel-Art-LoRA 商业案例:为品牌打造限量版像素艺术数字藏品

Qwen-Image-2512-Pixel-Art-LoRA 商业案例:为品牌打造限量版像素艺术数字藏品 最近几年,数字藏品这个概念越来越火,很多品牌都在琢磨怎么用它来和用户玩点新花样。但说实话,很多项目要么是简单地把实体产品拍个照做成数字版&…...

pycharm实现skills示例

文章目录步骤报错 未找到技能: python步骤 1、新建一个项目,名称为:skills_demo 2、在项目根目录下,创建一个名为 main.py 的文件,并将以下代码复制进去,代码: import json import os from dataclasses i…...

Linux vim编辑器中文乱码解决方案

问题现象在Linux终端中,命令行可以正常显示中文,但使用Vim打开文件时,中文内容变成乱码(如���或��),或者Vim启动时报错E749: Empty buffer。这通常…...

小白程序员必看:轻松入门大模型Agent实战技巧(含收藏)

本文详细介绍了大模型Agent的核心构成(LLM、记忆、工具、规划)及与普通Prompt调用的区别。深入解析了规划模块(CoT/ToT/GoT)、工具类型与定义、ReAct框架原理、记忆模块分类。同时,探讨了死循环解决、工具调用准确率提…...

Tableau实战:5分钟搞定高级扇形图设计(附层叠饼图完整配置)

Tableau实战:5分钟打造高级扇形图与层叠饼图全攻略 在数据可视化领域,扇形图及其变体(如层叠饼图、镶嵌饼图)因其直观展示比例关系的特点,成为商业分析报告中不可或缺的元素。但许多Tableau初学者常陷入两个困境&#…...

07|Token 与上下文窗口:为什么它会忘、为什么会贵

本篇目标:这是卷 1(LLM 核心原理)的第一篇。我们将拆解“Token”这个 AI 计费的最小单位,让你看懂账单,并理解为什么聊久了它就“失忆”。一、Token 是什么?(不是“字”,是“块”&am…...

Qt 工业机器视觉开发

Qt在工业视觉开发中的应用Qt是一个跨平台的C应用程序开发框架,广泛用于工业视觉系统的开发。其强大的图形界面能力和丰富的库支持,使其成为工业视觉领域的理想选择。工业视觉开发的核心需求工业视觉系统通常需要实时图像处理、高精度测量、缺陷检测等功能…...

Day 3 复盘:我为什么选择了 OpenClaw

Day 3 复盘:我为什么选择了 OpenClaw 技术选择没有标准答案,只有最适合的场景。 在经历了多个项目的 CI/CD 工具选型后,我最终决定将 OpenClaw 作为核心自动化平台。今天想和大家分享一下这个决策背后的思考过程。 🔍 选型背景 作为一名开发经理,我接触过各种自动化工具…...

2026年游戏主题海报制作复盘:从找图卡壳到快速出稿的全过程

我是个游戏社群的运营,这周五前要给周末的线上活动赶一张主题海报。主题是经典的游戏角色风格,类似大家熟知的“马里奥”那种。听起来不难,但真动起手来,我卡了两天,主要是找不到风格统一、清晰度又够用的素材。直接用…...

Figma学习

一、快捷键的使用 1、F 预选手机屏幕框架 2、选中主体按alt拖动实现复制3、shiftR标尺显示与消失 4、 ctrlG 成组...

AI智能分析系统在班级与教学楼的应用解决方案

目录 引言 一、方案背景与客户需求 方案背景 客户需求 二、AI智能分析系统方案说明 系统架构 前端设备 AI Box边缘计算设备 算法部署与应用 三、实施效果与优势 实施效果 方案优势 四、结论与展望 引言 随着教育信息化与智能化浪潮的推进,智慧教育环境建设已成为…...

springboot无人机农田巡查系统设计-

目录系统架构设计无人机控制模块实现农田数据采集模块数据分析处理模块用户界面与权限控制系统集成与测试部署运维方案项目技术支持可定制开发之功能创新亮点源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作系统架构设计 采用SpringBoot作为…...

ArduinoIDE调试ESP32的5个隐藏技巧:从串口监视器到错误定位的实战手册

ArduinoIDE调试ESP32的5个隐藏技巧:从串口监视器到错误定位的实战手册 当你在深夜赶项目时,突然遇到ESP32编译报错却找不到问题所在;当你精心编写的代码上传后,串口监视器却一片空白;当你试图追踪变量值时,…...

如何使用 Docker 安全地部署 OpenClaw (龙虾)

OpenClaw (龙虾) 是一个强大的个人 AI 助手,它可以连接各种消息平台并执行工具。本文介绍如何通过 Docker Compose 安全地部署 OpenClaw,并解析其中的关键配置。 OpenClaw 提供了强大的 AI 能力,但也意味着它需要访问你的文件、工具和 API 密…...

计算机组成原理视角下的AI算力:剖析万象熔炉·丹青幻境的GPU资源利用

计算机组成原理视角下的AI算力:剖析万象熔炉丹青幻境的GPU资源利用 最近在折腾一个挺有意思的AI绘画模型,叫“万象熔炉丹青幻境”。名字听着挺玄乎,其实就是个能根据文字描述生成各种风格图片的模型。玩了几次之后,我发现它生成图…...

02 今日内容大纲

02 今日内容大纲计算机相关概述Linux系统简介Linux安装环境搭建 安装vmware虚拟化软件安装linux虚拟机安装远程连接工具 finallshell crt. tabby配置finalshell 连接虚拟机 - 修改虚拟机 - 修改vmware软件的ip信息 - 修改本地vmnet8的网卡信息 - 配置finalshell软件的连接信息…...

阿里大模型二面:在 Agent 的设计中,“规划能力“至关重要。请谈谈目前有哪些主流方法可以赋予 LLM 规划能力?(例如 CoT, ToT, GoT 等)

1. 题目分析这道题考察的是你对 Agent 核心能力之一——规划(Planning)的系统性理解。面试官提到了 CoT、ToT、GoT 这些关键词,但他真正想听的不是你把这几个缩写展开然后各背一段定义,而是你能不能把这些方法放到一条演进脉络上&…...

Qwen3-VL-8B轻量部署全攻略:从环境搭建到API调用,一步到位

Qwen3-VL-8B轻量部署全攻略:从环境搭建到API调用,一步到位 在当今AI技术快速发展的时代,多模态模型正成为行业新宠。然而,大多数高性能视觉语言模型对硬件要求极高,让许多开发者和中小企业望而却步。Qwen3-VL-8B-Inst…...

2026.3.16oj总结

1.学生信息问题描述你的程序需要从标准输入设备(通常为键盘)中输入N(1≤N≤10)个学生的信息,每项信息包含该学生的编号、姓名、性别、年龄、成绩共五项,按成绩进行排序,然后按成绩从低到高输出&…...

GLM-OCR入门教程:3步完成Ubuntu20.04环境部署与首次调用

GLM-OCR入门教程:3步完成Ubuntu20.04环境部署与首次调用 你是不是也遇到过这种情况:手头有一堆图片,里面全是文字信息,比如扫描的文档、截图的聊天记录,或者拍下来的白板内容。一个个手动敲键盘录入?太费时…...

为RVC模型设计自动化测试流水线:确保模型更新后的质量稳定

为RVC模型设计自动化测试流水线:确保模型更新后的质量稳定 每次更新RVC模型,心里是不是都有点打鼓?新版本的声音转换效果真的比老版本好吗?有没有在某个你没注意到的场景下,效果反而变差了?手动测试几个样…...

【CVPR26-Min Tan-杭电】基于多线索学习的伪标签进化融合与优化:用于无监督伪装检测

文章:EReCu: Pseudo-label Evolution Fusion and Refinement with Multi-Cue Learning for Unsupervised Camouflage Detection代码:https://github.com/JSLiam94/EReCu单位:杭州电子科技大学、浙江大学一、问题背景伪装目标检测的核心难点&a…...