ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

WorkBuddy开放平台Agent开发实战:Skill工具调用与授权配置全指南

WorkBuddy开放平台Agent开发实战:Skill工具调用与授权配置全指南 1. 平台定位与接入前准备1.1 WorkBuddy 开放平台解决了什么问题先把话说在前面Agent 应用这两年看起来热闹但真正上手做过一次的人都知道卡人的地方从来不是会不会写提示词而是Agent 到底凭什么能调用我的系统。WorkBuddy 开放平台做的事情本质上是把智能体开发这件事从作坊式变成流水线式。以前你要做一个能查数据、能发通知、能操作内部系统的 Agent至少得自己搞定三件事一个是模型接入一个是工具封装还有一个是最麻烦的授权与安全链路。WorkBuddy 把这三层都收拢成了一套标准化的接入流程开发者只需要把注意力放在我的 Agent 要会什么技能上而不是反复折腾底层的鉴权和回调。对个人开发者来说这个平台最大的价值是降低了触达真实业务的门槛。你不需要先买服务器、配网关、做密钥管理注册一个应用申请对应的 Skill 权限就能在一两天内把一个小型 Agent 从零跑到调通。我自己第一次接入时从注册开发者账号到发布一个能查企业内网工单状态的应用大概花了不到四个小时。这个速度放在传统开发模式下是不可想象的。1.2 账号注册、开发者认证与基础环境接入 WorkBuddy 开放平台的第一步自然是注册账号并完成开发者认证。这里面有几个容易踩的细节我说一下我实际操作的顺序。先在开放平台官网注册一个平台账号注意这里用的是平台账号不是 WorkBuddy 客户端的个人账号。两个账号体系在初期是打通的但开发者认证、应用管理、接口调用凭证都在开放平台侧。注册完成后进入控制台找到开发者认证入口根据页面提示提交身份信息。个人开发者认证一般只需要身份证正反面和手机号绑定企业开发者会多一步对公账户打款验证周期会长一些。认证通过之后需要创建一个应用。这个应用就是未来所有 Agent 能力的容器它的 AppKey 和 AppSecret 是你在调用开放接口时的身份凭证相当于你应用的身份证 银行卡密码。这里有一个很多新手容易忽视的点AppSecret 只在创建时完整展示一次之后不会再明文显示。我在第一次接入时顺手把页面关了结果只能重新生成密钥还导致旧环境里的缓存凭证全部失效。建议创建后第一时间把密钥存到本地密码管理器里。基础环境方面个人开发者一般不需要购买服务器平台提供的沙箱环境足够完成开发和测试。如果你之后要接入自有数据库或内网系统那才需要准备一台有公网出口的测试服务器以及一个可以接收回调的 HTTPS 端点。操作系统没有限制Windows、macOS、Linux 都行我在 Ubuntu 上跑过完整的接入测试Python 3.10 和 Node.js 18 两个版本都验证过下文统称本地开发机。2. 应用创建与开放平台配置实战2.1 创建第一个 Agent 应用的核心流程进入控制台的应用管理页面点击创建应用选择应用类型为Agent 应用。这里有一个类型选择的细节平台目前提供对话型 Agent、任务型 Agent和Skill 型应用三类前两者的差别在后面编排工作流时会体现出来对话型更强调多轮上下文理解任务型更强调一次调用完成一个确定性目标。如果你是第一次尝试我建议选任务型 Agent起步它的调试路径更短成功感来得更快。创建应用后平台会自动生成三个核心信息AppKey应用唯一标识类似用户名。AppSecret调用签名密钥类似密码绝不能暴露在前端代码里。Agent ID后续调用 Agent 执行、查询会话状态时都要带上。接下来是配置能力范围。Agent 应用默认只具备基础的对话能力如果你想让它具备调工具的能力需要手动开启工具调用Tool Calling开关。这个开关藏得比较深在应用详情的模型配置页签里不是很好找。我一开始没开这个开关导致我写好的 Skill 在测试时完全没有被触发排查了半天才发现是这里的问题。后来我把这个开关理解为给 Agent 装上手脚——不打开它只会聊天不会干活。2.2 权限配置与授权回调的踩坑记录Agent 应用要访问用户数据必须走 OAuth 2.0 授权流程。WorkBuddy 开放平台的授权流程分为两步第一步引导用户在浏览器中登录并授权第二步用授权码换取访问令牌。这里的安全级别比较高全程要求 HTTPS 回调HTTP 地址会被直接拒绝。回调地址的配置是新手最容易卡住的地方。在应用设置-安全设置里填写回调地址时必须和实际发起授权请求时携带的 redirect_uri 保持完全一致包括协议、域名、端口、路径一个字符都不能差。我踩过的坑是平台要求填写的是精确匹配的回调地址而不是支持通配符的域名白名单。我在测试时本地起了一个 8080 端口填了 http://localhost:8080/callback测试没问题。但部署到服务器后把回调地址改成了 https://api.example.com/callback却发现线上仍然回调失败最后排查发现是旧配置里残留了一个不带 /callback 后缀的地址。清理掉旧的回调记录后授权流程立刻恢复正常。另外一个值得注意的点是授权 scope 的最小化原则。创建 Skill 时平台会列出一堆权限点比如读取工单列表、创建工单、修改工单状态等。新手很容易图省事一次性全勾上但这样有两个隐患一是应用在审核时容易被驳回平台会质疑你的应用为什么要申请这么多敏感权限二是如果应用密钥泄露攻击者能拿到的权限范围也会更大。我的建议是只勾选当前版本真正用到的权限后续迭代再补充申请。3. Skill 开发工具调用的核心设计3.1 Skill 到底是个什么东西Skill 是 WorkBuddy 开放平台里最核心的抽象概念我类比一下如果 Agent 是大脑Skill 就是大脑可以控制的手脚如果你希望大脑能查天气就给装一个查天气的手希望它能发邮件就给装一个发邮件的手。从技术实现角度看一个 Skill 本质上就是一个符合平台规范的工具函数描述由三部分组成Skill 名称、入参定义、实现逻辑。名称和入参定义用于让大模型理解这个工具是干什么的、应该传什么参数实现逻辑则是你真正写的那个业务函数。平台支持用 Python 和 Node.js 两种语言开发 Skill内部是通过容器化沙箱运行的所以你不必担心函数实现里的依赖会影响平台本身的稳定性。在创建 Skill 时建议先做一个小设计把业务能力拆成多个单职责的 Skill而不是做一个大而全的 Skill。比如查询订单和创建订单是两个 Skill而不是一个订单操作 Skill。原因很简单大模型在决定调用哪个工具时是根据工具名称和参数描述来做语义匹配的。一个 Skill 的职责越单一描述越精确模型选错工具的概率就越低。我见过一个项目把十个操作塞进一个 Skill 里结果模型经常不知道该传什么参数接口报错率直接飙到 30% 以上。3.2 从零写一个可用的 Skill 示例我以一个实际做过的部门待办查询 Skill 为例讲一下完整的开发路径。这个 Skill 的职责是接收一个部门名称参数返回该部门所有未完成的待办任务列表。因为拿不到真实的内部系统我用一个模拟数据源来演示但接入真实 API 的路径是完全一样的。创建 Skill 后平台会生成一个标准函数模板你只需要填充实现逻辑。对应的核心代码如下from workbuddy.skill import SkillContext import requests def handle(context: SkillContext, department: str) - list: 查询指定部门下所有未完成待办 Args: department: 部门名称例如研发部 Returns: 待办列表每个元素包含 title、assignee、due_date、status 字段 # 这里换成你真实业务系统的 API 调用 resp requests.post( https://api.example.com/v1/todo/query, json{department: department, status: open}, headers{Authorization: fBearer {context.secret(TODO_API_KEY)}}, timeout5, ) resp.raise_for_status() data resp.json() todos [] for item in data.get(items, []): todos.append({ title: item[title], assignee: item[assignee], due_date: item[due_date], status: pending, }) return todos这个 Skill 需要注意几个点入参名字起得越直白越好。department就是部门模型一眼就能明白如果你为了好看起名叫dep模型可能就不知道应该传什么进去。这里平台支持在参数描述里补充更详细的中文说明我的经验是描述写两行一行解释参数含义一行写出数据示例比如department: 部门名称例如研发部。业务调用必须设置超时。Agent 场景下一次对话可能要串行调用多个 Skill如果某一个工具调用卡住整个会话都会卡死。我习惯把每个 Skill 的对外请求超时控制在 3 到 5 秒宁可这次调用失败、让 Agent 回复查询超时也不要让用户等十几秒没有响应。密钥不要硬编码在函数里。WorkBuddy 平台提供了密钥管理能力你在创建 Skill 时声明的敏感配置会在函数运行时段通过context.secret(TODO_API_KEY)注入。这样代码可以随便发到仓库里不用担心密钥泄露。我见过有人把数据库密码直接写死在代码里的案例后续排查时才发现所有开发者都能看到这个密钥这是很严重的安全事故。3.3 Skill 注册、调试与版本管理写好函数后需要在平台侧配置入参的 JSON Schema这样模型才能正确理解并调用。以刚才的查询 Skill 为例入参定义长这样{ type: object, properties: { department: { type: string, description: 部门名称例如研发部 } }, required: [department] }平台会根据这段 Schema 自动生成参数提取规则。这里有个技术细节模型从用户对话中提取参数不是靠正则而是靠语义理解所以描述写得好不好直接决定提取准确率。我第一次写描述时用了非常笼统的部门字段结果用户说帮我看看技术那边的待办模型经常提取不到参数。把它改成部门名称支持常见简称如研发技术RD之后提取成功率大幅提升。从这个经验可以得出结论参数描述中尽可能列出可能出现的同义词和别名。Skill 调试用平台自带的调试控制台不需要启动本地服务。调试控制台会展示模型理解的参数、实际调用的入参、函数返回结果以及每一步的时间消耗。你可以先在调试控制台里把 Skill 的单次调用测通再接入到 Agent 里做多轮对话测试。发布到生产环境前记得给 Skill 打一个版本号。我使用 Skill 时通常把逻辑修改和参数描述修改放在一起发版因为二者的匹配关系才是调用准确的保证分开发版反而容易出现线上行为不一致的情况。4. Agent 编排把能力串成解决方案4.1 工作流编排的思路与配置单个 Skill 解决的是点的问题Agent 应用解决的是线的问题。你要把一个复杂任务拆成多个步骤让 Agent 按顺序调用不同的 Skill 完成整体目标这就是工作流编排。WorkBuddy 开放平台的工作流编排是在可视化画布上完成的。你可以把多个 Skill 节点拖到画布上用连线指定依赖关系每个节点可以配置输入映射和输出变量。编排的核心思路是把一个目标拆解为多个确定性步骤。比如做一个新员工入职助手可以拆为创建企业邮箱账号、开通办公系统权限、发送欢迎邮件、创建入职培训待办。每一步对应一个 Skill前后存在依赖关系——必须先有邮箱账号才能把邮箱写入欢迎邮件。配置节点时最关键的是输入映射。每个 Skill 的输入参数从哪来只有两个来源一是用户对话中由模型提取的字段二是前序 Skill 的输出结果。在画布上操作时需要明确地把上一节点的 output.email映射到下一节点的 employee_email。这里有个容易搞错的地方如果不做映射模型有可能自作主张去对话历史中找邮箱信息找到的可能是用户几天前提过的旧邮箱导致后续步骤全部用错了参数。4.2 模型选择、参数与提示词调优WorkBuddy 开放平台目前接入了多个主流大模型开发者在创建 Agent 时可以选择默认模型也可以允许运行时动态选择。我的建议是个人开发者在初期阶段不要纠结模型选型直接用平台默认推荐的模型就行等到应用流量上来、使用场景变复杂后再根据业务反馈调整模型。原因很简单不同模型对工具调用的指令遵循能力有差异但差异幅度放在简单任务上并不大而切换模型会导致对话风格和响应格式的变化增加调试成本。模型参数方面有个设置项叫temperature控制回答的随机性取值范围 0 到 2。对 Agent 应用来说我强烈建议把 temperature 设置在 0.1 到 0.3 之间。做任务型应用时你希望模型稳定、可预测而不是每次回答得天花乱坠。我做测试时把 temperature 设为 1.0结果同一个问题问五次三次回复不一样的查询结果用户完全没法用。把它降到 0.2 之后回复质量和稳定性都明显提升。提示词System Prompt的设计是编排中最重要的环节之一。写系统提示词时有几个经验明确告诉 Agent 自己是谁、能做什么、不能做什么。提供如果用户意图不明确请先向用户确认这样的兜底指令。明确要求当工具调用失败时如实告诉用户失败原因不要编造结果。最后这条很重要。很多 Agent 在工具调用失败后会用类似暂时无法获取数据请稍后重试的模糊表述把问题掩盖掉而实际上可能是参数错误需要立刻调整。我在提示词里加上必须返回具体错误码和原因之后Agent 的自主排查能力明显增强。4.3 会话记忆与上下文窗口管理Agent 应用不可避免要处理多轮对话。WorkBuddy 平台默认支持会话级记忆也就是说同一个会话内的历史消息会自动携带到后续请求中。不过这里隐藏着一个上下文窗口管理的问题大模型的上下文窗口有限无论窗口多大长时间对话后总有超限的风险。我的处理方式是在提示词里加一条规则当用户开始一个新任务时只保留最近两轮对话内容更早的历史记录由 Agent 主动总结成要点而不是逐字携带。这样既不会丢失关键信息又能有效控制 token 消耗。平台也提供了手动管理会话记忆的 API。如果应用逻辑比较复杂比如用户在多轮对话中反复修改需求你可以在每次对话结束时把当前确认过的需求作为一条结构化记忆写入平台。下次对话时Agent 优先读取这段结构化记忆而不是翻完整段聊天记录。这样可以显著降低记忆混乱的情况。5. 全链路测试与上线发布5.1 沙箱环境和端到端测试方法在应用正式上线前WorkBuddy 开放平台提供了一套完整的沙箱环境沙箱与生产环境在接口地址和权限策略上完全隔离。在沙箱里测试时所有调用都会指向真实模型但不会产生真实费用这一点对个人开发者非常友好。沙箱测试最关键的是做端到端验证而不是只测单个 Skill。我的习惯是准备一份测试用例表覆盖以下几类场景正常场景用户给出了所有必要参数Agent 应按预期调用 Skill 并返回正确结果。缺参场景用户没给参数Agent 应主动询问或给出示例引导。歧义场景用户使用了部门简称Agent 应能正确解析。异常场景Skill 内部接口超时或返回错误Agent 应如实反馈并给出下一步建议。安全场景用户试图让 Agent 绕过权限去查询无权限数据Agent 应拒绝执行。把这张用例表在沙箱里全部跑一遍记录每一次的回复内容和耗时。不要跳过异常场景因为异常场景往往能暴露出提示词设计的漏洞。我曾经遇到过一个问题当 Skill 抛出异常后Agent 自行编造了一个查询成功但结果为空的假响应用户完全被误导。直到我在测试用例里专门加了异常场景才发现这个严重缺陷。5.2 发布审核、灰度与版本回滚沙箱测试通过后就可以提交发布审核了。WorkBuddy 开放平台的审核重点有三个Skill 权限是否超出实际需要、应用描述是否真实准确、是否存在诱导用户泄露信息的风险。个人开发者做应用时描述部分建议直接写清楚应用的功能边界不要使用智能万能这类词汇反而更容易过审。审核通过后应用进入已上线状态。平台支持灰度发布你可以先配置一个 5% 的流量比例观察线上日志和错误率确认稳定后再逐步放量到全量。更新 Skill 逻辑时不要直接在线上版本上覆盖先创建新版本在沙箱验证通过后再提审。一旦线上出现严重问题可以在控制台快速回滚到上一个版本。我这里着重提醒一下回滚到上一个版本意味着线上立即恢复旧逻辑但已产生的会话记录可能仍然引用旧工具定义所以回滚后要观察一段时间确认没有因为版本不一致引发新的报错。5.3 本地部署与自托管选项如果个人开发者对数据隐私要求较高或者希望完全掌控自己的运行环境WorkBuddy 也提供了自托管部署方案。有一段时间很多人在讨论WorkBuddy 本地部署和WorkBuddy 网页版的区别这里我顺便说清楚网页版是直接用官方托管的服务配置简单、上手最快本地部署则是把 WorkBuddy 的开源运行时安装到自己的服务器上所有数据存储和模型调用都在自己的环境里完成。本地部署的主要步骤是先准备一台满足配置要求的服务器建议 CPU 4 核以上、内存 16G 以上然后安装 Docker 和 Docker Compose接着用官方提供的编排文件一键拉起运行时服务最后再通过命令行工具把自托管实例注册到开放平台。我在 Ubuntu 20.04 上做过完整的本地部署总体过程顺畅但要注意网络环境对 Docker 镜像拉取的速度影响很大推荐配置好国内镜像加速源。本地部署的优点是可以不受平台默认配额的限制在调用频次和并发上有更多自主空间缺点是所有基础设施维护、模型鉴权管理、日志采集都要自己负责。比如模型调用方面本地部署默认使用 WorkBuddy 开放平台的模型网关但如果你自己有模型的 API 密钥也可以在配置里改成自带的模型接入信息灵活性更高。6. 常见问题与排查技巧实录6.1 授权回调与鉴权失败的排查把高频问题整理成一份速查表是做过一遍项目之后最值得沉淀的东西。以下是我在接入过程中和一些学员反馈中遇到的典型问题现象可能原因处理建议授权回调地址不匹配redirect_uri 与后台配置不一致比对两个 URL 的协议、域名、端口、路径逐字符校验请求报 invalid signature时间戳偏差过大检查本地服务器时钟同步 NTP 时间平台要求时间戳误差在 5 分钟内Access Token 突然失效刷新令牌因重复使用被吊销确认代码中未把刷新流程放入循环每次刷新成功后立即更新存储回调后页面白屏授权码被消费了两次授权码只能使用一次排查是否有重复回调请求沙箱环境下 Skill 无法触发未开启工具调用开关应用详情的模型配置页签中打开 Tool Calling授权流程的排查我有一条经验先在浏览器里手动走一遍授权页面在回调 URL 里看一眼携带的 code 和 state 参数是否正常再用 curl 手动发起换取 token 的请求。大部分鉴权问题都能在这一步暴露出来。6.2 Agent 执行异常与模型误调用的处理群里不少人问过一个问题Agent 在调用 Skill 时报错agent execution terminated due to error整个会话直接中断。这类问题一般有几种情况我按频率排序第一种是参数提取错误导致 Skill 内部报错。比如用户说查一下最近一周的待办但你的 Skill 只支持按部门查询模型无法把最近一周映射到入参上就可能传一个奇怪的值。解决办法是增强入参描述或者将 Skill 内部逻辑改为支持更宽松的入参校验。第二种是模型选错了 Skill。因为候选 Skill 数量太多或描述相似模型不知道该调用哪一个。我的建议是限制单个 Agent 内的 Skill 数量最多不要超过 5 个如果超过就要考虑拆成多个 Agent 应用或者用路由节点做一层意图分类。第三种是依赖的前序节点数据为空。工作流中下游节点拿到了空值比如查询用户订单返回空列表下游生成订单摘要处理空列表时抛异常。这种问题最好的解决方式不是在代码里疯狂判空而是在工作流的节点之间加入存在性检查条件分支如果前序输出为空就走一条兜底回复分支而不是继续执行下游节点。还有一个常见问题是模型幻觉——Agent 在找不到真实数据时自己编造一个答案。对这种问题最有效的做法是在提示词里硬性约束只有调用 Skill 成功且返回非空数据时才能输出数据相关内容如果 Skill 调用失败或返回为空必须直接告知用户禁止推测或编造任何信息。把这个约束写在系统提示词里放在指令的显眼位置能极大减少编造输出的概率。6.3 性能瓶颈与成本控制建议个人开发者接入 Agent 应用时往往会忽略性能和成本问题直到应用真的跑起来才后悔。这里分享几条降低成本和提升响应速度的经验把模型调用集中在高频节点上不要每个节点都调一次大模型。部分节点的输入输出可以在工作流里写死映射不需要交给模型理解。对耗时超过 2 秒的 Skill 调用开启异步模式让 Agent 先回复正在处理中处理完成后再通过消息通道推送结果避免用户长时间等待。利用平台提供的缓存能力对相同参数的查询类 Skill 结果缓存一定时间。比如查询当前部门待办这个动作同一用户在一分钟内重复查询的概率很高缓存直接省掉这部分模型和接口消耗。监控每个 Skill 的调用频次和平均耗时定期清理调用量极低的 Skill。我见过有人在一个 Agent 里挂了十几个 Skill实际每周只有两三个被触发其余的全在干扰模型判断删掉之后整体响应质量反而提高了。成本方面WorkBuddy 开放平台对个人开发者有一些免费额度超出后按 token 计费。实操中一个容易被忽略的点是多轮对话的上下文累积会快速消耗 token。每轮对话即使只输入一句话由于历史消息会全部带上实际 token 消耗是成倍增长的。建议在应用设计时主动限制单会话的最大轮数比如 20 轮超出后引导用户开启新会话。这个方案既保护了体验也能有效控制成本。7. 个人实践中的一些心得项目做完整条链路我再补几个可能对你有用的个人观察。第一Skill 的命名和描述值得多花时间去打磨这是整个接入过程中性价比最高的一项工作。很多开发者把这个环节视为填空随便写两句就完事结果后续所有问题都出在模型不理解工具上。花半小时把参数说明里的示例、别名、边界写清楚后面调试能省下好几天。第二有条件的话把工作流节点的每个输入输出都打印一份日志。平台自带日志系统确实能看到调用记录但自定义日志能帮你更精确地定位问题。我在调试一个多节点编排时就靠输出日志定位到了某个节点偶发返回空对象的问题这个 bug 在平台日志里只会显示为下游节点执行失败很难直接看出根因。第三Community 和官方文档里的教程要多看但别照着抄。不同开发者遇到的问题场景千差万别照抄别人的 Skill 设计往往水土不服。我建议把教程里的思路消化后结合自己的业务重新写实现哪怕代码简单一点也没关系核心是逻辑要完全能 hold 住自己的场景。WorkBuddy 其实是兼具智能助手和开放平台双重身份的产品如果你想了解日常使用场景下的功能怎么配、自定义指令推荐怎么写可以在客户端里多试试如果你要做开发就走我在上文讲的这套开放平台流程。最后再分享一个我在多个项目里反复验证过的经验一个 Agent 应用想要稳定运行核心不在于模型多强而在于把工具定义清晰度和异常兜底策略这两件事做到位。工具定义清晰了模型就不容易犯错异常兜底做好了就算模型犯错用户也不会觉得这个应用完全不可用。希望这篇实战记录能帮你少走一些弯路尽早跑通自己的第一个 Agent 应用。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进