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

基于Cloudflare Workers构建ChatGPT插件:无服务器后端开发实战

1. 项目概述与核心价值最近在折腾AI应用开发特别是如何让ChatGPT这类大语言模型LLM能“动手”去干点实事比如查查天气、搜搜代码库。OpenAI推出的插件Plugin机制正好提供了一个标准化的桥梁。但问题来了作为开发者我们得自己搭建这个桥梁的后端服务处理API请求、认证、逻辑实现还得考虑部署和运维的便捷性。这时候Cloudflare Workers就进入了我的视野。Cloudflare Workers是一个无服务器Serverless边缘计算平台它允许你在全球数百个数据中心运行JavaScript代码响应速度快得惊人而且部署流程极其简单。把ChatGPT插件的后端逻辑放在Workers上简直就像是为这个场景量身定做的无需管理服务器全球低延迟开发部署一体化。Cloudflare官方在GitHub上开源了一个名为cloudflare/chatgpt-plugin的仓库里面提供了几个现成的插件示例这无疑为我们快速上手、理解整个技术栈提供了绝佳的跳板。这个项目本质上是一个“样板间”和“工具箱”。它向我们清晰地展示了如何利用Cloudflare Workers的技术栈从零开始构建一个符合OpenAI插件规范的、功能完整的后端服务。无论你是想做一个查询GitHub仓库的插件还是一个获取实时天气信息的插件都可以在这里找到可以直接运行和修改的代码。对于前端开发者、全栈工程师或者任何对AI应用集成感兴趣的人来说通过这个项目你不仅能快速得到一个可工作的插件更能深入理解ChatGPT插件的工作原理、OpenAI的插件协议规范以及如何利用无服务器架构来高效支撑这类AI交互场景。2. 技术栈深度解析为何是Cloudflare Workers在决定采用某个技术方案前我习惯先问“为什么”。为什么Cloudflare Workers是构建ChatGPT插件的理想选择这背后是一系列技术特性和现实需求的精准匹配。2.1 无服务器架构的天然优势ChatGPT插件的调用模式是典型的事件驱动、按需触发。用户在与ChatGPT对话中提及插件功能时OpenAI的后台才会向我们的插件端点Endpoint发起一个HTTP请求。这种流量模式是突发、间歇性的与传统需要7x24小时运行的Web服务器模型截然不同。Cloudflare Workers的无服务器特性完美契合了这一点。你无需预置或管理任何虚拟机、容器。代码被上传到Cloudflare的全球网络后仅在请求到达时被执行按执行次数和时长计费免费额度非常慷慨。这意味着零运维成本没有服务器需要打补丁、监控或扩容。极致弹性无论突然涌入多少请求Workers都能自动在全球边缘节点分布处理无需你手动配置。成本效益对于中小型、间歇性使用的插件成本可能近乎为零。2.2 边缘计算的低延迟魔力延迟是交互式应用的杀手。想象一下你问ChatGPT“旧金山天气如何”它需要调用你的插件。如果插件服务器在东京而用户在伦敦这个网络往返延迟会明显拖慢对话节奏。Cloudflare拥有全球最庞大的边缘网络之一。当你将Worker部署到“全球网络”Global Network时你的代码实际上被复制到了数百个地理位置。用户的请求会被自动路由到离他最近的Cloudflare数据中心执行。这使得API响应时间可以控制在几十毫秒内对于追求流畅对话体验的ChatGPT插件来说这是至关重要的优势。用户几乎感知不到插件调用的网络延迟感觉就像ChatGPT原生具备了这个能力一样。2.3 与OpenAI插件协议的契合度OpenAI插件协议本质上定义了一套标准的HTTP API接口包括.well-known/ai-plugin.json一个描述插件元数据名称、功能、认证方式等的清单文件。一个或多个操作端点如/search/get_weather用于执行具体功能。通常使用OpenAPI规范Swagger来定义这些端点的细节。Cloudflare Worker就是一个轻量级的HTTP服务器。你可以用非常简洁的代码比如使用itty-router这类轻量级库来定义路由分别处理对ai-plugin.json的请求和对业务端点如/search的请求。Worker的环境支持完整的JavaScript/TypeScript生态可以轻松地集成第三方API如GitHub API、天气API、进行数据转换和错误处理最终返回符合OpenAI期望的JSON格式。2.4 开发体验与部署流水线对于开发者而言体验至关重要。Cloudflare提供了Wrangler CLI工具一个功能强大的命令行工具用于初始化项目、本地开发、测试和部署。wrangler dev命令可以启动一个本地开发服务器并支持热重载调试体验流畅。无缝GitHub集成你可以轻松配置GitHub Actions实现代码推送后自动部署到Workers形成CI/CD流水线。内置KV存储等资源对于需要存储少量状态或配置的插件可以直接使用Workers配套的KV键值存储、D1SQLite数据库等服务无需额外寻找数据库供应商。综合来看选择Cloudflare Workers是选择了开发效率、全球性能、运维简化和成本优化的组合拳。它降低了将AI想法转化为可运行、可全球访问的服务的门槛。3. 核心组件与项目结构拆解让我们打开cloudflare/chatgpt-plugin仓库像解刨麻雀一样看看一个完整的插件项目是如何组织的。理解这个结构是你进行自定义开发的基础。3.1 项目根目录概览仓库通常包含多个独立的插件示例每个示例都是一个可以独立部署的Worker应用。以example-pluginGitHub搜索插件为例其典型结构如下example-plugin/ ├── src/ │ ├── index.ts (或 index.js) # Worker的主入口文件处理所有HTTP请求 │ └── types.ts # TypeScript类型定义用于OpenAI插件协议和API响应 ├── public/ │ └── logo.png # 插件的图标会在ChatGPT界面中显示 ├── schema/ │ └── openapi.json # OpenAPI规范文件描述插件的API接口 ├── wrangler.toml # Cloudflare Worker的配置文件 ├── package.json # Node.js项目依赖和脚本定义 ├── .well-known/ │ └── ai-plugin.json # **核心**插件清单文件 └── README.md # 部署和开发指南3.2 核心文件深度解读3.2.1.well-known/ai-plugin.json插件的“身份证”这个文件是OpenAI发现和识别你插件的关键。当用户在ChatGPT中安装插件时ChatGPT会首先请求这个URL。它必须严格遵循OpenAI定义的格式。{ schema_version: v1, name_for_human: GitHub 仓库搜索器, name_for_model: github_repo_search_tool, description_for_human: 一个用于搜索GitHub仓库的插件。, description_for_model: 当用户想查找GitHub上的仓库时使用此工具。输入可以是仓库名、描述或主题。, auth: { type: none }, api: { type: openapi, url: https://your-worker.your-subdomain.workers.dev/openapi.json, is_user_authenticated: false }, logo_url: https://your-worker.your-subdomain.workers.dev/logo.png, contact_email: your-emailexample.com, legal_info_url: https://your-domain.com/legal }关键字段解析与避坑指南name_for_model这是给AI模型看的内部标识。务必保持简洁、无空格、使用下划线这有助于模型准确理解何时调用该工具。description_for_model这是最重要的提示工程Prompt Engineering部分。你需要用自然语言清晰、无歧义地描述插件的功能、使用场景和输入期望。避免模糊表述例如“搜索东西”就不好应该说“根据仓库名称、描述或编程语言来搜索GitHub上的公开仓库”。api.url这里指向你的OpenAPI规范文件通常是schema/openapi.json的完整公开URL。一个常见的错误是在开发阶段忘记更新这个URL仍然指向localhost。部署后一定要检查并更新为真实的Worker域名。auth.type对于公开数据的插件如示例可以设为none。如果你的API需要认证如OAuth、API Key则需要配置更复杂的service_http或oauth结构这涉及到额外的安全处理流程。3.2.2schema/openapi.json插件的“说明书”这个文件基于OpenAPI 3.0规范详细定义了你的插件对外提供了哪些“工具”端点每个工具需要什么参数以及返回什么格式的数据。ChatGPT会根据这份说明书来构造API请求。{ openapi: 3.0.1, info: { title: GitHub Repo Search, version: 1.0.0 }, servers: [{ url: https://your-worker.your-subdomain.workers.dev }], paths: { /search: { get: { operationId: searchRepos, summary: 搜索GitHub仓库, parameters: [ { name: q, in: query, description: 搜索关键词如仓库名、主题等, required: true, schema: { type: string } } ], responses: { 200: { description: 成功返回仓库列表, content: { application/json: { schema: { $ref: #/components/schemas/SearchResponse } } } } } } } }, components: { schemas: { SearchResponse: { type: object, properties: { items: { type: array, items: { $ref: #/components/schemas/Repository } } } }, Repository: { type: object, properties: { full_name: { type: string }, description: { type: string }, html_url: { type: string }, stargazers_count: { type: integer } } } } } }实操要点精确描述参数description字段要写清楚这能帮助AI更好地理解该如何使用这个参数。例如q参数可以描述为“支持搜索仓库名称、描述、README内容或主题”。定义清晰的响应模式Schema在components.schemas下定义好返回数据的结构。这不仅能生成更好的TypeScript类型也能让ChatGPT更准确地解析和向用户呈现结果。例如定义Repository对象包含full_namedescriptionhtml_urlstargazers_count等字段。服务器URL和ai-plugin.json一样这里的servers.url也需要在部署后更新为生产环境地址。3.2.3src/index.ts插件的“大脑”这是Worker的入口文件负责处理所有传入的HTTP请求。它的核心逻辑是路由分发。import { Router } from itty-router; import { handleSearch } from ./search; // 假设的业务逻辑处理函数 // 创建路由器 const router Router(); // 1. 提供插件清单 router.get(/.well-known/ai-plugin.json, async (request, env) { // 通常可以直接读取并返回本地的ai-plugin.json文件内容 const manifest await env.ASSETS.fetch(request.url); return new Response(manifest.body, { headers: { Content-Type: application/json } }); }); // 2. 提供OpenAPI规范 router.get(/openapi.json, async (request, env) { const openapiSpec await env.ASSETS.fetch(request.url); return new Response(openapiSpec.body, { headers: { Content-Type: application/json } }); }); // 3. 提供静态资源如图标 router.get(/logo.png, async (request, env) { return env.ASSETS.fetch(request.url); }); // 4. 核心业务端点处理GitHub搜索 router.get(/search, async (request) { const query request.query?.q as string; if (!query) { return new Response(JSON.stringify({ error: Missing search query parameter q }), { status: 400 }); } // 调用业务逻辑函数 const results await handleSearch(query); return new Response(JSON.stringify(results), { headers: { Content-Type: application/json } }); }); // 5. 健康检查或根路径 router.get(/, () new Response(GitHub Search Plugin is running.)); // 捕获未匹配的路由 router.all(*, () new Response(Not Found, { status: 404 })); // Worker标准事件监听器 export default { async fetch(request: Request, env: Env, ctx: ExecutionContext): PromiseResponse { return router.handle(request, env, ctx).catch(err { console.error(err); return new Response(Internal Server Error, { status: 500 }); }); } };关键逻辑与经验路由顺序一般先处理静态文件和元数据.well-known/,openapi.json,logo.png再处理业务API。使用itty-router或Hono等轻量级框架能让代码更清晰。错误处理务必对API请求进行健壮的错误处理。例如检查必需参数是否存在调用外部API如GitHub API时使用try...catch并返回结构化的错误信息。ChatGPT需要理解错误原因才能更好地与用户沟通。响应格式返回给ChatGPT的JSON结构应尽量简单、扁平并且与openapi.json中定义的schema保持一致。避免嵌套过深或包含大量无关字段这有助于AI提取关键信息。环境变量与密钥如果需要使用GitHub Token或天气API的Key务必通过wrangler.toml中的vars或kv_namespaces配置并在代码中通过env对象安全访问绝对不要将密钥硬编码在代码中。3.2.4wrangler.toml项目的“配置中心”这个文件定义了Worker的名称、兼容日期、绑定资源等。name github-search-plugin main src/index.ts compatibility_date 2024-03-01 [site] bucket ./public # 指定静态资源目录 [vars] # 环境变量例如外部API的Base URL GITHUB_API_BASE https://api.github.com # 如果需要使用KV存储 [[kv_namespaces]] binding MY_KV id xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx配置心得compatibility_date非常重要它决定了Worker运行时使用的API版本。建议定期更新到较新的日期以获取最新功能和修复但更新前需在测试环境验证兼容性。[site]如果你有图标等静态文件通过site配置绑定一个目录如public是最简单的方式Wrangler会自动将这些文件作为资源Assets上传。环境变量管理对于敏感信息如API密钥使用wrangler secret put KEY_NAME命令来设置它们不会明文出现在wrangler.toml中更安全。4. 从零到一构建并部署你的第一个插件理论说得再多不如亲手跑一遍。我们以example-pluginGitHub搜索为例走通从环境准备到插件安装的完整流程。4.1 本地开发环境搭建安装Node.js和npm确保系统已安装Node.js建议LTS版本和包管理器npm或yarn、pnpm。安装Wrangler CLI这是Cloudflare Workers的官方命令行工具。npm install -g wrangler安装后运行wrangler --version确认安装成功。登录Cloudflare账户wrangler login这个命令会打开浏览器引导你授权Wrangler访问你的Cloudflare账户。你需要有一个Cloudflare账户并且已经开通了Workers服务有免费套餐。克隆示例项目并安装依赖git clone https://github.com/cloudflare/chatgpt-plugin.git cd chatgpt-plugin/example-plugin npm install4.2 关键代码修改与配置在部署前有几处关键配置必须修改否则插件无法被ChatGPT正确发现和调用。修改wrangler.toml将name字段改为一个全局唯一的名称因为Worker的域名将是{name}.{your-subdomain}.workers.dev。name my-awesome-github-plugin # 改成你自己的唯一名称修改.well-known/ai-plugin.jsonapi.url需要指向你未来部署后的OpenAPI文件地址。在本地开发时可以先注释掉或留空但部署前必须更新。logo_url同样需要指向部署后的图标地址。contact_email和legal_info_url填写你自己的信息。将文件中的所有https://your-worker.your-subdomain.workers.dev替换为你预期的Worker域名例如https://my-awesome-github-plugin.my-account.workers.dev。修改schema/openapi.json更新servers数组中的url为你的Worker域名与上面保持一致。4.3 本地测试与调试在修改完配置后强烈建议先在本地进行测试。启动本地开发服务器npm run dev # 或直接使用 wrangler wrangler dev这会在http://localhost:8787启动一个本地Worker实例并支持热重载。测试各个端点打开浏览器或使用curl、Postman等工具。访问http://localhost:8787/.well-known/ai-plugin.json检查清单文件是否能正确返回且内容无误。访问http://localhost:8787/openapi.json检查OpenAPI规范。测试业务API访问http://localhost:8787/search?qcloudflare看看是否能收到格式正确的GitHub仓库搜索结果。本地测试的局限性ChatGPT无法直接访问你的localhost。本地测试主要用于验证后端逻辑和API格式是否正确。与ChatGPT的集成测试必须在部署到公网后进行。4.4 部署到Cloudflare Workers当本地测试通过后就可以部署到生产环境了。执行部署命令npm run deploy # 或 wrangler deployWrangler会将你的代码和静态资源打包上传到Cloudflare全球网络。获取你的Worker域名 部署成功后命令行会输出你的Worker访问地址格式如https://my-awesome-github-plugin.my-account.workers.dev。请务必记下这个地址。更新配置文件中的域名最终确认 由于我们在部署前已经预估了域名并修改了配置理论上部署后即可用。但保险起见再次用实际的部署域名去核对并更新ai-plugin.json和openapi.json文件中的URL然后重新运行wrangler deploy以确保万无一失。4.5 在ChatGPT中安装与测试这是最激动人心的环节让你的插件在ChatGPT中“活”过来。进入ChatGPT插件商店在ChatGPT Web界面或App中确保你已开通ChatGPT Plus或企业版插件功能需要付费订阅。在模型选择区域选择“GPT-4”然后在下拉菜单中点击“Plugins” - “Plugin store”。选择“Develop your own plugin”在插件商店的右下角有一个“Develop your own plugin”的链接。点击它。输入你的插件域名在弹出的对话框中输入你刚刚部署的Worker的根域名例如my-awesome-github-plugin.my-account.workers.dev不要带https://。点击“Find manifest file”。验证与安装ChatGPT会尝试访问你域名下的/.well-known/ai-plugin.json文件。如果一切配置正确它将读取清单并显示你的插件名称和描述。点击“Install”即可完成安装。进行对话测试安装成功后在你的对话中启用这个插件。然后尝试提问“帮我找一下关于React的流行开源项目”或“搜索cloudflare workers相关的仓库”。观察ChatGPT是否会调用你的插件并返回格式正确、信息有用的结果。5. 进阶实战剖析天气插件与自定义开发理解了基础插件后我们再看example-weather-plugin它能帮助我们掌握如何处理更复杂的API交互和错误处理。5.1 天气插件核心逻辑解析天气插件与GitHub搜索插件的核心区别在于依赖外部API需要调用第三方天气服务如Pirate Weather一个OpenWeatherMap的替代品。需要API密钥大多数天气API都需要认证。参数处理更复杂通常需要地理位置城市名或经纬度可能还需要处理时间参数如查询未来几天的预报。查看其src/index.ts关键部分如下// 从环境变量获取API密钥 const API_KEY env.PIRATE_WEATHER_API_KEY; async function handleWeatherRequest(location: string): Promiseany { // 1. 地理位置编码Geocoding // 用户可能输入“北京”需要先转换为经纬度。这里可能需要调用另一个地理编码API。 // 示例中可能简化了假设location直接是坐标或已编码的ID。 const geoData await geocodeLocation(location); if (!geoData) { throw new Error(无法找到地点: ${location}); } // 2. 构造天气API请求 const { lat, lon } geoData; const weatherUrl https://api.pirateweather.net/forecast/${API_KEY}/${lat},${lon}?unitssi; // 使用国际单位制 const response await fetch(weatherUrl); if (!response.ok) { // 处理API错误如密钥无效、额度不足、位置无效等 const errorText await response.text(); console.error(Weather API error: ${response.status} - ${errorText}); throw new Error(获取天气数据失败: ${response.statusText}); } const weatherData await response.json(); // 3. 数据转换与格式化 // 原始天气API返回的数据可能非常庞大。我们需要提取ChatGPT和用户关心的核心信息。 const currentWeather weatherData.currently; const simplifiedResponse { location: ${geoData.name}, ${geoData.country}, current: { temperature: currentWeather.temperature, feels_like: currentWeather.apparentTemperature, condition: currentWeather.summary, humidity: ${currentWeather.humidity * 100}%, wind_speed: ${currentWeather.windSpeed} m/s, }, // 可以选择性添加未来几小时的简要预报 next_hours: weatherData.hourly.data.slice(0, 6).map(h ({ time: new Date(h.time * 1000).toLocaleTimeString(), temp: h.temperature, condition: h.summary })) }; return simplifiedResponse; }从这个例子中学到的数据清洗与适配第三方API返回的数据格式通常不是为AI对话优化的。你的插件需要扮演“适配器”的角色将原始数据提炼、转换成结构清晰、信息密度高的JSON对象。只返回必要字段避免信息过载。健壮的错误处理必须考虑外部API失败的各种情况网络超时、无效密钥、无效位置、额度超限等并返回友好的错误信息让ChatGPT能够向用户解释“为什么没能获取到天气”。环境变量管理API密钥通过env.PIRATE_WEATHER_API_KEY注入在部署时使用wrangler secret put PIRATE_WEATHER_API_KEY来设置保证了安全性。5.2 构思与开发你自己的插件现在你可以基于这个模式开发任何你想要的插件。核心步骤是定义功能明确你的插件要做什么查股票订日历翻译文档控制智能家居功能要具体、可实现。设计API根据功能设计一个或多个HTTP端点如/get_stock_price/add_calendar_event。用OpenAPI规范清晰地定义它们。编写清单精心撰写ai-plugin.json特别是description_for_model这是引导AI正确使用插件的“咒语”。实现后端逻辑在src/index.ts中使用路由框架处理请求。在业务函数中集成必要的第三方API或数据库操作。牢记输入验证、错误处理、数据转换。本地测试使用wrangler dev在本地彻底测试所有端点。部署与安装部署到Cloudflare Workers并在ChatGPT中安装测试。5.3 性能优化与监控当插件真正投入使用后还需要关注以下几点缓存策略对于更新不频繁的数据如天气信息可以缓存10分钟GitHub仓库信息可以缓存时间稍短可以在Worker中使用Cache API来缓存响应大幅减少对外部API的调用和响应延迟。const cache caches.default; const cacheKey new Request(url.toString(), request); let response await cache.match(cacheKey); if (!response) { // 未命中缓存调用真实API response await fetch(realApiUrl); // 克隆响应并存入缓存 const responseToCache response.clone(); ctx.waitUntil(cache.put(cacheKey, responseToCache)); } return response;日志与监控利用console.log或console.error输出日志这些日志可以在Cloudflare Workers仪表板的“日志”中查看。对于关键业务指标可以考虑发送到外部监控服务。速率限制如果你的插件可能被频繁调用考虑在Worker层面实现简单的速率限制Rate Limiting防止滥用。Cloudflare自身也在网络层面提供了一些防护。6. 常见问题与故障排查实录在实际开发和部署过程中我踩过不少坑。这里把最常见的问题和解决方法整理出来希望能帮你节省时间。6.1 插件安装失败问题现象可能原因排查步骤与解决方案ChatGPT提示“无法找到插件清单”1.ai-plugin.json文件未正确部署或路径错误。2. Worker域名无法公网访问。3. CORS跨源资源共享问题。1.检查URL直接在浏览器中访问https://your-worker-domain/.well-known/ai-plugin.json看是否能正常返回JSON。如果404检查wrangler.toml中[site]配置或静态文件路由代码。2.检查部署确认wrangler deploy成功且无报错。在Cloudflare Dashboard的Workers页面查看该Worker是否处于“Active”状态。3.检查CORS在Worker代码中为ai-plugin.json和openapi.json的响应头添加Access-Control-Allow-Origin: *。虽然OpenAI可能不严格要求但加上更安全。安装时提示“清单无效”ai-plugin.json文件格式错误或缺少必需字段。1.使用JSON验证器将你的ai-plugin.json内容粘贴到在线JSON验证工具如jsonlint.com检查语法。2.对照官方文档仔细核对OpenAI插件协议文档确保所有必需字段schema_versionname_for_modeldescription_for_modelapi等都存在且类型正确。3.检查URL字段确保api.url和logo_url是完整的、可访问的HTTPS URL。安装成功但ChatGPT从不调用1.description_for_model描述不清晰AI无法理解何时使用。2. OpenAPI规范中端点定义有问题。1.优化描述重写description_for_model使用更直接、无歧义的语言描述插件的精确用途和触发条件。例如“当用户询问某个地点的当前天气或未来几小时预报时使用此工具。”2.测试API端点手动调用你的业务API如/search确保其返回的JSON格式与openapi.json中定义的schema完全一致。不一致会导致AI解析失败。6.2 API调用失败或返回错误问题现象可能原因排查步骤与解决方案ChatGPT显示“插件返回错误”1. Worker代码运行时异常未捕获的错误。2. 外部API调用失败网络、认证、参数错误。3. 响应格式不符合OpenAPI规范。1.查看Worker日志登录Cloudflare Dashboard进入你的Worker查看“日志”选项卡。这里会显示代码中的console.log/error输出和运行时错误信息是最重要的调试手段。2.模拟请求使用Postman或curl模拟ChatGPT可能发送的请求到你的Worker观察响应。检查状态码、响应头和响应体。3.检查外部API确认你的API密钥有效、额度充足。在代码中增加更详细的错误日志记录外部API的请求和响应。响应超时Worker执行时间过长超过Workers的默认限制如10秒。1.优化代码检查是否有耗时的同步操作或循环。确保所有I/O操作fetch cache等都是异步的。2.设置超时在调用外部API时使用AbortController设置一个合理的超时如5秒避免长时间等待。3.简化响应数据如果返回的数据量非常大尝试只返回最核心的几项数据减少网络传输和处理时间。CORS错误浏览器控制台可见从浏览器直接调用插件API时因同源策略被阻止。在Worker的业务端点响应中添加CORS头。例如return new Response(JSON.stringify(data), { headers: { Content-Type: application/json Access-Control-Allow-Origin: * } });注意生产环境中建议将*替换为具体的域名如https://chat.openai.com以增强安全性。6.3 开发与部署问题问题现象可能原因排查步骤与解决方案wrangler dev运行失败1. 端口被占用。2. 依赖安装不全或版本冲突。3. TypeScript编译错误。1.更换端口使用wrangler dev --port 8788指定其他端口。2.重装依赖删除node_modules和package-lock.json重新运行npm install。3.检查TS错误先运行npx tsc --noEmit检查TypeScript类型错误。wrangler deploy失败1. 未登录或认证过期。2.wrangler.toml配置错误。3. 账户额度不足免费套餐有每日请求数限制。1.重新登录运行wrangler login重新认证。2.检查配置检查wrangler.toml语法特别是name是否唯一。3.查看配额登录Cloudflare Dashboard查看Workers Pages的用量情况。环境变量未生效1. 未通过wrangler secret put设置。2. 代码中引用名称错误。1.设置Secret确保使用wrangler secret put YOUR_API_KEY命令设置而不是在wrangler.toml的[vars]中写明文。2.检查绑定名在代码中通过env.YOUR_API_KEY访问。确保YOUR_API_KEY与wrangler secret put使用的名称完全一致。6.4 经验与技巧总结从简开始第一个插件尽量功能单一如只做一个搜索。成功跑通整个流程开发、部署、安装、调用比做一个复杂但问题百出的插件更重要。日志是你的眼睛在代码的关键节点收到请求、调用外部API前、返回响应前添加console.log这是线上问题排查的生命线。彻底测试OpenAPI规范使用Swagger Editor或类似的工具导入你的openapi.json文件检查其语法和逻辑是否正确。一个错误的schema定义会导致AI无法解析响应。模拟用户对话进行测试在ChatGPT中安装插件后尝试用各种自然语言方式去触发它观察AI的理解是否准确响应是否合理。根据测试结果反复调整description_for_model。关注速率限制和成本无论是Cloudflare Workers的免费额度还是你调用的第三方API如GitHub API有速率限制天气API可能有调用次数限制都要心中有数避免意外超限或产生费用。通过这个项目你将获得的不仅仅是一个能运行的ChatGPT插件更是一套基于现代无服务器架构构建AI应用后端的最佳实践。它把看似复杂的AI集成变成了清晰的、可步进的开发任务。当你看到自己编写的插件在ChatGPT中流畅工作时那种成就感正是驱动我们不断探索和创造的动力。

相关文章:

基于Cloudflare Workers构建ChatGPT插件:无服务器后端开发实战

1. 项目概述与核心价值最近在折腾AI应用开发,特别是如何让ChatGPT这类大语言模型(LLM)能“动手”去干点实事,比如查查天气、搜搜代码库。OpenAI推出的插件(Plugin)机制,正好提供了一个标准化的桥…...

CMHG数据集:中国少数民族语言标题生成研究突破

1. CMHG数据集:填补中国少数民族语言标题生成研究空白在自然语言处理领域,标题生成技术一直是个既基础又关键的研究方向。想象一下,当你浏览新闻网站时,那些吸引你点击的标题背后,正是这项技术的实际应用。然而&#x…...

LLM评估偏见:文本相似度与模型规模的影响

1. 研究背景与问题定义在自然语言处理(NLP)领域,文本摘要任务的质量评估一直是个关键挑战。传统上,研究人员依赖ROUGE和BLEU等基于n-gram重叠的指标来衡量机器生成摘要与人类参考摘要的相似度。这些指标计算共同词汇和短语的出现频…...

【硬核科普】IP67防护等级:你的设备真的能“水下30分钟”吗?

🔥作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生,研究方向无线联邦学习 🎬擅长领域:驱动开发,嵌入式软件开发,BSP开发 ❄️作者主页:一个平凡而…...

条件概率:从基础概念到机器学习实战

1. 条件概率的核心概念解析 条件概率是概率论中一个既基础又强大的工具,它描述的是在已知某些事件发生的前提下,另一事件发生的概率。我第一次真正理解这个概念的重要性是在分析用户行为数据时——当我们知道用户已经点击了某个广告,那么他们…...

STM32外部Flash编程与Keil MDK算法开发指南

1. STM32外部Flash编程基础解析在嵌入式系统开发中,外部Flash存储器扩展已成为应对大容量存储需求的常见解决方案。当STM32微控制器的内部Flash容量不足以容纳应用程序代码或数据资源时,外部Flash器件通过SPI、Quad-SPI或Octo-SPI等接口为系统提供额外的…...

NoFences:三分钟搞定Windows桌面混乱的终极分区方案

NoFences:三分钟搞定Windows桌面混乱的终极分区方案 【免费下载链接】NoFences 🚧 Open Source Stardock Fences alternative 项目地址: https://gitcode.com/gh_mirrors/no/NoFences 还在为满屏的桌面图标头疼吗?每次找文件都要"…...

如何快速获取离线小说:Tomato-Novel-Downloader完整指南

如何快速获取离线小说:Tomato-Novel-Downloader完整指南 【免费下载链接】Tomato-Novel-Downloader 番茄小说下载器不精简版 项目地址: https://gitcode.com/gh_mirrors/to/Tomato-Novel-Downloader 番茄小说下载器是一款专为数字阅读爱好者设计的开源工具&a…...

如何在2026年继续畅玩经典Flash游戏:CefFlashBrowser完全指南

如何在2026年继续畅玩经典Flash游戏:CefFlashBrowser完全指南 【免费下载链接】CefFlashBrowser Flash浏览器 / Flash Browser 项目地址: https://gitcode.com/gh_mirrors/ce/CefFlashBrowser 当主流浏览器纷纷放弃对Flash的支持后,你是否还在为无…...

手把手教你用frp+WebSocket,把家里的树莓派服务安全暴露到公网(保姆级配置)

树莓派私有云安全外网访问:基于frp与WebSocket的全链路加密方案 在家庭宽带环境下搭建私有云服务(如Nextcloud、Home Assistant或Jellyfin媒体服务器)时,最大的痛点莫过于如何安全稳定地从外网访问这些服务。传统方案需要公网IP和…...

SPI、I2C、UART怎么选?一个实际项目中的通信协议选型踩坑与避坑指南

SPI、I2C、UART通信协议选型实战:从理论到避坑指南 在嵌入式系统设计中,通信协议的选择往往决定了整个项目的成败。作为一名经历过多次"踩坑"的工程师,我深刻体会到协议选型不仅仅是技术参数的对比,更需要考虑实际工程环…...

告别模糊!用iPhone 15 Pro Max的屏幕参数,手把手教你设置完美手机壁纸和视频封面

iPhone 15 Pro Max屏幕适配终极指南:打造完美壁纸与封面的专业技巧 每次在社交媒体上看到别人分享的iPhone壁纸都清晰锐利,而自己设置的却总是模糊或被裁剪?作为内容创作者,你是否也遇到过精心设计的视频封面在上传后变得面目全非…...

别再被硬盘容量搞懵了!手把手教你用IDEMA公式算清512B和4K扇区的真实大小

别再被硬盘容量搞懵了!手把手教你用IDEMA公式算清512B和4K扇区的真实大小 每次购买新硬盘时,你是否也遇到过这样的困惑:明明包装上写着1TB,插到电脑上却只显示931GB?这消失的69GB去哪儿了?今天我们就来彻底…...

Bodymovin扩展面板:5步快速上手After Effects动画导出终极指南

Bodymovin扩展面板:5步快速上手After Effects动画导出终极指南 【免费下载链接】bodymovin-extension Bodymovin UI extension panel 项目地址: https://gitcode.com/gh_mirrors/bod/bodymovin-extension Bodymovin扩展面板是连接Adobe After Effects与Web、…...

命令行AI助手chatgpt-cli:多模型集成与智能代理实战

1. 项目概述:一个全能型命令行AI助手如果你和我一样,每天有大量时间花在终端里,同时又频繁地与各种大语言模型(LLM)打交道,那么你肯定也经历过这种割裂感:写代码、查日志、调试系统时&#xff0…...

告别集中式服务器:深入解读Kimera-Multi的分布式GNC算法如何实现高效鲁棒的多机SLAM

分布式SLAM的革命:Kimera-Multi如何用GNC算法重塑多机器人协同建图 当三个机器人在茂密的森林中执行搜救任务时,它们面临着一个经典困境:如何在有限的通信带宽下,准确识别彼此的位置并构建统一的环境地图?传统集中式SL…...

为本地大模型注入联网与工具调用能力:MCP服务器实战指南

1. 项目概述:一个为本地大模型注入“联网”与“工具调用”能力的MCP服务器如果你和我一样,是个喜欢折腾本地大模型(LLM)的开发者,那你肯定对“上下文窗口耗尽”和“知识截止日期”这两个词深恶痛绝。我们费尽心思部署了…...

多模态大语言模型的搜索增强技术与实践

1. 多模态大语言模型的搜索增强挑战与突破在开放世界的知识问答场景中,多模态大语言模型(MLLMs)面临着两个核心挑战:一是如何有效整合视觉与文本的跨模态理解能力,二是如何实时获取动态更新的外部知识。传统方法主要依…...

Upload-Labs靶场通关前必读:从安装到漏洞分类的完整学习路线

Upload-Labs靶场通关实战指南:从漏洞解析到防御体系构建 当你第一次打开Upload-Labs靶场界面,面对20个看似相似却又各不相同的文件上传关卡时,是否感到无从下手?这个看似简单的靶场实则暗藏玄机,涵盖了从基础绕过到高级…...

VS Code Copilot Next 安全配置黄金清单:从本地缓存加密到企业代理审计日志,12项NIST SP 800-218合规实践

更多请点击: https://intelliparadigm.com 第一章:VS Code Copilot Next 自动化工作流配置安全性最佳方案 VS Code Copilot Next 在提升开发效率的同时,其自动化补全、代码生成与工作流集成能力也引入了新的安全边界挑战。为确保敏感上下文不…...

告别答辩 PPT 熬夜,PaperXie 用 15776 套模板帮你轻松通关毕业季

paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AI PPThttps://www.paperxie.cn/ppt/createhttps://www.paperxie.cn/ppt/create 答辩前三天,宿舍台灯下的你是不是又在对着空白 PPT 发呆?论文写了大半个月,却卡在了 “把…...

告别熬夜改 PPT!Paperxie AI 一键搞定毕业论文答辩 PPT,从容站上讲台

paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AI PPThttps://www.paperxie.cn/ppt/createhttps://www.paperxie.cn/ppt/create 毕业季的深夜,你是不是对着空白的 PPT 模板发呆?论文改了十几遍,答辩 PPT 却还是一团乱…...

别再只算极差了!用SPSSAU三因素方差分析,5分钟搞定正交试验结果解读

正交试验数据分析进阶:从极差分析到方差分析的实战指南 在工程优化和科研实验中,正交试验设计因其高效性被广泛应用。许多研究者习惯使用极差分析法处理正交试验数据——这种方法直观简单,只需计算各因素水平下指标的平均值,然后比…...

别再死记硬背了!一张图帮你理清线性方程组‘有解无解’的所有情况

线性方程组解的类型判定:从几何直观到矩阵秩的完美映射 每次面对线性方程组解的判定问题时,你是否总在纠结该用哪个定理?齐次与非齐次、有解无解、唯一解还是无穷多解——这些概念确实容易混淆。但事实上,只要理解了背后的几何意义…...

别再手动处理MRI数据了!用Freesurfer 7.2.0一键完成皮层重建(Ubuntu 20.04保姆级教程)

告别低效:Freesurfer 7.2.0全自动皮层重建实战指南(Ubuntu 20.04) 在神经影像研究领域,手动处理MRI数据就像用螺丝刀组装汽车——理论上可行,但效率低得令人崩溃。想象一下:你花了整整三天时间手动分割海马…...

SmartDB MCP:为AI编程助手构建安全智能的数据库网关

1. 项目概述:当AI助手需要“看见”你的数据库如果你正在使用Cursor、Claude Desktop、Windsurf这类集成了MCP(Model Context Protocol)协议的AI编程助手,可能会遇到一个痛点:当你想让AI帮你分析业务数据、优化SQL查询或…...

为什么你的RISC-V驱动总在QEMU跑通、真机崩溃?深度解析特权级切换与CSR寄存器初始化陷阱

更多请点击: https://intelliparadigm.com 第一章:RISC-V驱动真机适配失败的典型现象与国产化背景 在国产芯片自主可控战略加速推进的背景下,RISC-V 架构正成为嵌入式、边缘计算及服务器级设备的重要技术路径。然而,将上游 Linux…...

Golang如何忽略JSON空字段_Golang JSON omitempty教程【最新】

...

嵌入式C代码合规性断崖式升级(2026 RTOS新规深度拆解)

更多请点击: https://intelliparadigm.com 第一章:嵌入式C代码合规性断崖式升级的背景与动因 近年来,ISO/IEC 17961(C Secure Coding Standard)、MISRA C:2023 和 AUTOSAR C14 子集等标准加速演进,叠加功能…...

ResNeSt实战:用PyTorch复现Split-Attention模块,提升下游任务性能

ResNeSt实战:从PyTorch代码解析到下游任务迁移指南 当你在Kaggle竞赛中看到某个团队用ResNeSt-101模型在ADE20K语义分割任务上刷新记录时,是否好奇这个"Split-Attention"机制究竟如何工作?作为ResNet家族的最新进化形态&#xff0c…...