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

news2026/4/27 22:18:57
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中流畅工作时那种成就感正是驱动我们不断探索和创造的动力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2560842.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…