简介:这份PDF手册面向智能体开发者、产品经理及技术爱好者,系统讲解Coze插件的概念、类型、费用与权限管理,以及从创建到使用的完整流程。内容涵盖插件与工具(API)的对应关系、同一插件内域名一致性要求、免费与付费插件的每日调用次数差异,以及基础版与专业版在限额和QPS上的区别。资源包为1个PDF文件,大小约2.64MB,结构紧凑,便于随时查阅。手册重点展开创建插件的前置准备,包括API选择、token获取与鉴权方式,并逐步演示创建、配置、试运行、发布插件及在智能体中添加测试的实操环节。读者可借此掌握自定义插件的集成方法,理解工作空间插件数量、工具上限与团队权限规则,从而快速扩展智能体的资讯阅读、效率办公等能力,提升开发与业务落地效率。目前已有380人学习。
1. Coze 插件开发与应用手册:从零到一跑通第一个自定义插件
你在 Coze 上搭了一个智能体,对话流畅、人设稳定,但一旦用户问「帮我查一下今天的快递到哪了」,它就开始编。不是模型不行,是它没有手——插件就是给智能体装的那双手。Coze 插件本质是一个符合 OpenAPI 规范的 HTTP 接口描述,平台把接口的入参、出参、鉴权方式解析成模型能理解的工具定义,模型在对话中判断需要调用时,由平台发起真实请求并把结果回填给模型。整条链路里,你真正要写的只有三样东西:一份 API 描述、一个能返回 JSON 的服务、一套鉴权配置。适合谁?手上有一堆内部系统 API 但不知道怎么接进智能体的后端工程师,或者想用 Coze 工作流把重复操作自动化的业务同学。这篇手册按「先跑通最小闭环,再补鉴权、错误处理和调试」的顺序展开,每一步都给可复现的命令和参数。
2. 拆解 Coze 插件的运行链路:从工具定义到真实 HTTP 请求
2.1 插件、工具、API 三者的关系
在 Coze 的模型里,插件(Plugin)是一个容器,工具(Tool)是容器里的具体能力。一个插件可以挂多个工具,每个工具对应一个 API 端点。比如你做一个「快递查询」插件,里面可以有「查物流轨迹」和「查预计送达」两个工具,分别对应两个不同的 URL。平台在解析时,会把每个工具的 name、description、parameters 抽出来,拼进模型的 system prompt 里,模型看到的是类似「你可以调用 queryLogistics,参数是 trackingNumber」这样的描述。所以 description 写得清不清楚,直接决定模型会不会在正确的时机调用、参数填得对不对。这是很多人翻车的第一现场:接口通了,但模型从来不调,或者调了但传错参数,九成是 description 太模糊。
2.2 一次工具调用的完整生命周期
用户在对话框输入「帮我查顺丰单号 SF1234567890」,链路是这样走的:模型先判断意图,决定调用 queryLogistics 工具,输出一个结构化的调用请求;Coze 运行时拿到这个请求,按插件配置的鉴权方式补上请求头,向你的服务地址发起 HTTP 请求;你的服务返回 JSON;Coze 把 JSON 截断、清洗后作为 tool result 塞回对话上下文;模型基于这个结果生成自然语言回复。整条链路里,你的服务只需要保证两件事:能在合理时间内返回、返回结构稳定。超时和结构突变是线上最常见的两类故障,后面避坑章节会细说。
2.3 最小可运行插件的目录与文件构成
一个能导入 Coze 的插件,最小构成是一份 OpenAPI 3.0 的 JSON 或 YAML 描述文件,加上一个真实可访问的 HTTPS 端点。描述文件里必须包含 openapi 版本、info、servers、paths 四段。下面是一个查天气的最小示例,你可以直接改成自己的接口:
{ "openapi": "3.0.0", "info": { "title": "Weather Query", "version": "1.0.0", "description": "查询指定城市的实时天气" }, "servers": [ { "url": "https://your-domain.com/api" } ], "paths": { "/weather": { "get": { "operationId": "queryWeather", "summary": "查询城市天气", "description": "根据城市名称返回当前温度和天气状况,城市名用中文,例如 北京", "parameters": [ { "name": "city", "in": "query", "required": true, "description": "城市中文名称", "schema": { "type": "string" } } ], "responses": { "200": { "description": "成功返回天气数据", "content": { "application/json": { "schema": { "type": "object", "properties": { "temperature": { "type": "string" }, "condition": { "type": "string" } } } } } } } } } } }这份描述里,operationId 是工具在平台内的唯一标识,建议用英文驼峰,别用中文;description 是给模型看的,要写清楚「什么时候用、参数长什么样」;servers.url 必须是 HTTPS,Coze 不接受明文 HTTP。参数说明里我特意写了「城市名用中文,例如 北京」,就是为了减少模型传拼音或英文的概率。改完这份文件,在 Coze 插件页面选「导入 OpenAPI」,粘贴或上传即可,平台会自动解析出工具列表。
3. 从零实现一个带鉴权的 Coze 插件服务
3.1 用 Python 写一个可被 Coze 调用的最小服务
本地起服务用 FastAPI 最快,装好依赖后写一个带 API Key 校验的接口:
from fastapi import FastAPI, Header, HTTPException, Query import uvicorn app = FastAPI() # 与 Coze 插件配置里填的 API Key 保持一致 EXPECTED_KEY = "your-secret-key-here" @app.get("/api/weather") def query_weather( city: str = Query(..., description="城市中文名称"), authorization: str = Header(None) ): # 校验鉴权头,格式为 Bearer <key> if not authorization or not authorization.startswith("Bearer "): raise HTTPException(status_code=401, detail="missing token") token = authorization.split(" ", 1)[1] if token != EXPECTED_KEY: raise HTTPException(status_code=403, detail="invalid token") # 真实场景这里去调第三方或查库,示例直接返回 return { "temperature": "26", "condition": "多云" } if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=8000)逻辑说明:Header 里取 authorization,按 Bearer 格式切出 token 做比对,不匹配直接返回 401 或 403。参数说明:EXPECTED_KEY 换成你自己的密钥,别硬编码在仓库里,生产环境用环境变量注入;port 8000 本地调试用,线上建议走反向代理加 HTTPS。跑起来后本地用 curl 验证:
curl -H "Authorization: Bearer your-secret-key-here" \ "http://127.0.0.1:8000/api/weather?city=北京"返回 200 和 JSON 就说明服务侧通了。注意 Coze 要求公网 HTTPS,本地调试可以用内网穿透工具把 8000 端口暴露出去,但暴露前务必确认鉴权已经生效,否则等于把接口裸奔在公网上。
3.2 在 Coze 里配置鉴权:Service 与 OAuth 怎么选
Coze 插件支持几种鉴权方式,最常用的是 Service 鉴权(也就是 API Key)和 OAuth 2.0。选型逻辑很简单:如果你的接口是自建服务、调用方只有 Coze,用 Service 鉴权,配置里填 Header 名和 Key 值即可,平台会在每次请求时自动带上。如果接口是第三方 SaaS 且要求用户授权(比如访问某个用户自己的数据),才用 OAuth。配置 Service 鉴权时,Header 名要和代码里读的一致,常见的是 Authorization,值填 Bearer 加空格加 Key。这里有个高频坑:平台配置里填了 Bearer 前缀,代码里又拼了一次,结果变成 Bearer Bearer xxx,直接 401。两边约定好谁负责拼前缀,只拼一次。
3.3 参数映射与返回值裁剪
Coze 会把模型生成的参数按 OpenAPI 描述映射到请求里,query 参数拼 URL,body 参数发 JSON。返回值这边,平台对 tool result 有长度限制,返回体过大时会被截断,截断位置不可控,模型可能拿到半截 JSON 直接解析失败。所以你的接口应该只返回模型真正需要的字段,别把整个数据库行丢回去。比如查天气只返回 temperature 和 condition,不要返回湿度、气压、紫外线、更新时间一大堆。裁剪在服务端做,比在平台侧做可靠。返回值类型也要稳定,同一个字段别这次返回字符串下次返回数字,模型对类型突变很敏感。
4. 插件调试与工作流联动:让智能体真正用起来
4.1 在 Coze 调试台验证工具调用
插件发布前,Coze 提供调试面板,可以手动填参数触发调用,看请求和响应。这一步别跳过,它能帮你区分是「接口本身不通」还是「模型不调」。手动调用返回正常,但对话里模型不调,问题就在 description 或参数描述上。调试时重点看三样:HTTP 状态码、响应体结构、耗时。耗时超过平台超时阈值(通常几秒)的接口,在对话里会表现为「模型说正在查询然后没下文」,实际是请求超时被吞了。
4.2 把插件挂进工作流节点
Coze 工作流里可以直接把插件作为节点使用,这时候不经过模型判断,是确定性调用。适合流程固定、参数来自上游节点的场景。配置时把上游节点的输出字段映射到插件入参,注意类型要对齐,上游给的是字符串,插件要的是数字,得加一个转换节点。工作流里插件节点的失败处理要显式配置,默认失败会中断整个流程,建议加分支:调用失败时走兜底回复,别让用户看到报错。
4.3 用日志定位「模型不调用」的问题
模型不调用工具,排查顺序是:先看工具 description 是否说清了使用场景,再看参数 description 是否给了示例,最后看工具数量是不是太多。一个智能体挂十几个工具时,模型选择困难,调用准确率会下降。常见做法是按场景拆成多个智能体,或者把低频工具收进工作流由主流程按条件触发。description 里加上「当用户询问 X 时使用本工具」这类触发条件描述,比只写「查询天气」有效得多。
5. Coze 插件开发避坑清单:五条血泪经验
现象:配置完鉴权后一直返回 401。原因:Header 名大小写不一致,或者 Bearer 前缀被拼了两次。 解决:抓一次真实请求看 Header 原文,确认 Authorization 的值只有一个 Bearer 前缀,Header 名按平台配置原样传。
现象:手动调试正常,对话里模型从不调用。原因:工具 description 太笼统,模型判断不出该在什么时机用。 解决:description 里写清触发场景和参数示例,比如「当用户提供快递单号并询问物流时调用,单号格式为字母加数字」。
现象:接口返回数据正常,但模型回复说「查询失败」。原因:返回体过大被截断,JSON 不完整导致解析失败。 解决:服务端只返回必要字段,控制响应体在几 KB 以内,嵌套层级别超过三层。
现象:偶发调用超时,用户侧表现为无响应。原因:接口依赖的第三方慢,或者服务端有同步阻塞操作。 解决:给下游调用加超时和重试,服务端做异步化,必要时先返回「查询中」再由工作流轮询。
现象:工作流里插件节点报参数类型错误。原因:上游节点输出是字符串,插件入参声明为 integer,映射时没转换。 解决:在中间加一个变量转换节点,或在插件描述里把参数类型放宽为 string 由服务端解析。
6. 进阶:用 OpenAPI 复用与版本管理稳住插件迭代
插件上线只是开始,接口改字段、加参数是常态。我的习惯是插件描述文件跟服务代码放同一个仓库,用 Git 管版本,每次接口变更同步改 OpenAPI 文件,再重新导入 Coze。这样出问题时能对着 commit 回溯是哪次改动引入的。复用方面,同一份 OpenAPI 描述可以导入多个插件实例,指向不同环境的 servers.url,测试环境和生产环境各一份,避免调试时打到线上数据。
验证插件是否健康,我一般做三件事:一是用脚本定时调一次核心工具,记录状态码和耗时,做成简单监控;二是每次改完 description 后,在调试台用三到五个典型问法测模型调用率;三是把返回体结构做一次快照对比,字段增删能第一时间发现。下面这个脚本可以放在 CI 里做基础连通性检查:
import requests def check_plugin(base_url, key, city="北京"): headers = {"Authorization": f"Bearer {key}"} resp = requests.get( f"{base_url}/api/weather", params={"city": city}, headers=headers, timeout=5 ) # 状态码和关键字段双重校验 assert resp.status_code == 200, f"status {resp.status_code}" data = resp.json() assert "temperature" in data and "condition" in data, "missing field" print("plugin ok:", data) if __name__ == "__main__": check_plugin("https://your-domain.com", "your-secret-key-here")参数说明:timeout 设 5 秒,超过就说明接口有性能问题;断言里同时检查状态码和字段,防止接口返回 200 但结构变了。这个脚本跑通,至少说明插件在服务侧是活的。至于模型调不调、调得准不准,那要靠 description 的持续打磨,没有一劳永逸的写法,只有不断根据真实对话日志去调。我自己踩过最深的坑就是以为接口通了就完事,结果上线一周发现模型调用率不到三成,回头改 description 改到怀疑人生。把工具描述当成给模型写的使用说明书,而不是给同事看的接口文档,这个心态转变之后,插件才真正好用起来。希望帮到你。
本文还有配套的精品资源,点击获取