ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

AI编程:Coze + Cursor 实现思维导图浏览器插件,把 Base URL 改到 TaoToken

AI编程:Coze + Cursor 实现思维导图浏览器插件,把 Base URL 改到 TaoToken 1. 从需求到插件Coze 工作流 Cursor 写一个思维导图浏览器扩展思维导图浏览器插件这个东西说白了就是让你在任意网页上划一段文字点一下浮动按钮右侧滑出一个面板里面直接渲染出这段文字对应的思维导图图片。听起来像个小玩具但它把「AI 生成结构化内容」和「浏览器即时调用」这两件事串起来了很适合拿来跑通一条低成本的 AI 编程闭环。我这次要做的链路分两段第一段在 Coze 上搭一个工作流输入一段文字输出一张思维导图图片的 URL第二段用 Cursor 写一个 Chrome Manifest V3 扩展把选中的文字发给 Coze 工作流拿到图片地址后在侧边栏展示。中间有个关键点——Cursor 里如果要用到兼容 Anthropic 协议的模型能力来辅助写代码或做接口调试可以把 Base URL 指向 TaoToken这样 Key 和模型 ID 的管理会统一很多。适合谁看如果你已经会一点 JavaScript能看懂 manifest.json但没完整做过一个浏览器扩展也没在 Coze 上发布过带 API 的工作流那这篇就是给你准备的。全程不需要服务器不需要备案域名一个 Coze 账号加一个 Cursor 就能跑完。先说清楚最终形态插件加载后你在网页上选中「分布式系统的核心组件」这类文字页面出现一个浮动按钮点击后侧边栏打开几秒后思维导图图片渲染出来。整个过程涉及三个文件manifest.json、background.jsService Worker、sidepanel.html。Coze 那边涉及一个已发布的工作流、一个 Personal Access Token、一个 workflow_id 和一个 app_id。我踩过的坑主要集中在两处一是 Manifest V3 里 Service Worker 不能直接用 DOM侧边栏的打开逻辑必须走 chrome.sidePanel API二是 Coze 返回的 data 字段是个 JSON 字符串得先 JSON.parse 再取 output直接当对象用会报 undefined。下面按步骤拆开讲。2. TaoToken 前置准备Base URL、API Key 与模型 ID 三件套在正式写插件之前先把 Cursor 侧的模型接入配置理清楚。Cursor 本身支持自定义 OpenAI 兼容端点如果你想让 Cursor 里的对话和代码补全走 TaoToken 的通道需要准备三样东西Base URL、API Key、Model ID。这三件套缺一不可很多人只填了 Key 忘了改 Base URL结果一直报 401。Base URL 填https://taotoken.net/api注意这里不要带任何多余路径Cursor 会自动拼接/v1/chat/completions这类后缀。API Key 需要你先登录 TaoToken 控制台在 API Keys 页面创建一个创建后立即复制页面刷新后就看不到了。Model ID 则根据你实际要用的模型来填比如 Claude 系列或其它兼容模型具体可用的 ID 在模型对话页面能看到。配置入口在 Cursor 的 Settings 里找到 Models 或 OpenAI API Key 区域把 Override OpenAI Base URL 打开填入上面的地址再把 Key 粘贴进去。如果你用的是 Claude Code 这类工具配置方式类似核心就是三件套对齐。这里给一个 Cursor 侧可复制的配置片段路径是~/.cursor/config.json不同版本可能略有差异以实际为准{ openai: { baseUrl: https://taotoken.net/api, apiKey: sk-你的TaoToken密钥, model: claude-3-5-sonnet-20241022 } }如果你用的是 Codex 的 auth.json 方式结构是这样的{ base_url: https://taotoken.net/api, api_key: sk-你的TaoToken密钥, model: claude-3-5-sonnet-20241022 }为什么要先做这一步因为后面 Cursor 帮你生成插件代码、修 bug、整合 Coze API 的时候模型响应速度和稳定性直接影响你的开发体验。Base URL 指向 TaoToken 后你在 Cursor 里问「帮我写一个 Manifest V3 的 sidePanel 逻辑」它能稳定返回可用的代码片段而不是频繁超时。另外提醒一句TaoToken 的 API 地址是https://taotoken.net/api不要加 UTM 参数加了反而可能导致签名校验异常。控制台地址和文档地址在文末 CTA 里会给这里先记住三件套的填写位置就行。配置完成后你可以在 Cursor 里发一条测试消息比如「用一句话解释 Manifest V3 的 Service Worker 生命周期」如果能正常返回说明 Base URL 和 Key 都通了。如果报 401优先检查 Key 是否复制完整、Base URL 是否多了斜杠。如果报 model not found检查 Model ID 拼写。这一步做完你的 Cursor 就具备了稳定的代码生成能力接下来写插件框架会顺畅很多。3. 可复制配置manifest.json、Coze 工作流调用与侧边栏代码这一节是全文的核心所有代码都可以直接复制。先给 manifest.json这是 Chrome 扩展的入口文件必须用 V3 版本{ manifest_version: 3, name: 思维导图生成器, version: 1.0.0, description: 选中网页文字一键生成思维导图, permissions: [sidePanel, activeTab, scripting, storage], host_permissions: [https://api.coze.cn/*], background: { service_worker: background.js }, action: { default_title: 生成思维导图 }, side_panel: { default_path: sidepanel.html }, content_scripts: [ { matches: [all_urls], js: [content.js] } ] }注意host_permissions里必须加上 Coze 的 API 域名否则 Service Worker 里发请求会被 CORS 拦截。side_panel字段是 V3 新增的用来指定侧边栏页面路径。接着是 background.js负责接收 content script 发来的选中文字调用 Coze 工作流再把结果转发给侧边栏chrome.runtime.onMessage.addListener((message, sender, sendResponse) { if (message.type GENERATE_MINDMAP) { generateMindMap(message.text).then((url) { sendResponse({ success: true, url }); }).catch((err) { sendResponse({ success: false, error: err.message }); }); return true; } }); async function generateMindMap(inputText) { const COZE_TOKEN pat_你的个人访问令牌; const WORKFLOW_ID 你的workflow_id; const APP_ID 你的app_id; const response await fetch(https://api.coze.cn/v1/workflow/run, { method: POST, headers: { Authorization: Bearer ${COZE_TOKEN}, Content-Type: application/json }, body: JSON.stringify({ workflow_id: WORKFLOW_ID, parameters: { input: inputText }, app_id: APP_ID, is_async: false }) }); const result await response.json(); if (result.code ! 0) { throw new Error(result.msg || Coze 工作流调用失败); } const dataObj JSON.parse(result.data); return dataObj.output; }这里有个关键点result.data是字符串必须JSON.parse之后才能取output。我一开始直接写result.data.output结果一直是 undefined排查了半天。然后是 content.js负责在页面上监听选中文字并显示浮动按钮let floatBtn null; document.addEventListener(mouseup, (e) { const selection window.getSelection().toString().trim(); if (!selection) { if (floatBtn) floatBtn.remove(); floatBtn null; return; } if (!floatBtn) { floatBtn document.createElement(button); floatBtn.textContent 生成思维导图; floatBtn.style.cssText position:absolute;z-index:99999;padding:6px 12px;background:#4f46e5;color:#fff;border:none;border-radius:6px;cursor:pointer;font-size:13px;; floatBtn.addEventListener(click, () { chrome.runtime.sendMessage({ type: GENERATE_MINDMAP, text: selection }); chrome.runtime.sendMessage({ type: OPEN_SIDEPANEL }); }); document.body.appendChild(floatBtn); } floatBtn.style.left ${e.pageX 10}px; floatBtn.style.top ${e.pageY 10}px; });最后是 sidepanel.html负责展示图片!DOCTYPE html html head meta charsetUTF-8 style body { margin: 0; padding: 16px; font-family: sans-serif; } #status { color: #666; font-size: 14px; } #mindmap { width: 100%; margin-top: 12px; border-radius: 8px; } /style /head body div idstatus等待生成.../div img idmindmap styledisplay:none; / script srcsidepanel.js/script /body /htmlsidepanel.js 里监听 background 发来的结果并渲染图片。这套配置复制下来改掉三个占位符Token、workflow_id、app_id就能用。4. 验证请求从 Coze 试运行到插件加载渲染全流程配置写完后先别急着加载插件第一步是验证 Coze 工作流本身能不能跑通。打开 Coze 工作流编辑页点击试运行输入「生成分布式系统的思维导图」看返回的 data 里有没有 output 图片地址。如果试运行成功说明工作流逻辑没问题。第二步用 curl 验证 API 调用。把下面的命令复制到终端替换成你自己的 Token、workflow_id、app_idcurl --location --request POST https://api.coze.cn/v1/workflow/run \ --header Authorization: Bearer pat_你的令牌 \ --header Content-Type: application/json \ --data-raw { workflow_id: 你的workflow_id, parameters: { input: 生成分布式系统的思维导图 }, app_id: 你的app_id, is_async: false }如果返回{code:0,data:{\output\:\https://...\},msg:Success}说明 API 通了。注意 code 必须是 0不是 0 就代表出错msg 里会有原因。第三步加载插件。打开 Chrome地址栏输入chrome://extensions/右上角打开「开发者模式」点击「加载已解压的扩展程序」选择你存放 manifest.json 的文件夹。加载成功后扩展列表里会出现「思维导图生成器」。第四步实测。随便打开一个网页选中一段文字比如「微服务架构包含服务注册、配置中心、网关、链路追踪」页面上会出现蓝色浮动按钮。点击后侧边栏应该自动打开先显示「等待生成...」几秒后图片渲染出来。如果侧边栏没自动打开检查 background.js 里有没有处理OPEN_SIDEPANEL消息以及有没有调用chrome.sidePanel.open()。V3 里侧边栏的打开必须由用户手势触发所以点击按钮这个动作是必须的。如果图片一直不显示打开侧边栏的开发者工具右键侧边栏页面 - 检查看 Console 有没有报错。常见的是 CORS 问题检查 manifest 里的 host_permissions 是否包含https://api.coze.cn/*。整个验证流程走通后你就有了一个可用的思维导图插件。这时候可以回到 Cursor让它帮你优化 UI比如按钮样式、加载动画、错误提示。5. 常见报错排查401、local proxy failed、reading choices 与 OAuth这一节把我在这个链路里遇到的和社区里高频出现的报错集中列一下方便你对照排查。401 Unauthorized这个最常见。分两种情况一种是 Coze 的 Token 失效或复制不完整重新在 Coze 的 PAT 页面创建一个另一种是 Cursor 侧 Base URL 或 Key 填错。如果你在 Cursor 里配了 TaoToken检查baseUrl是不是https://taotoken.net/apiKey 有没有多余空格。401 的本质是认证失败先排除 Key 问题。local proxy failed这个报错通常出现在 Cursor 或 Claude Code 这类工具里意思是本地代理请求失败。原因可能是 Base URL 写成了https://taotoken.net/api/v1这种带多余路径的形式导致请求发到了不存在的端点。改成https://taotoken.net/api即可。另外检查网络是否能正常访问该地址可以用 curl 测一下。reading choices这个报错说明返回结构里没有 choices 字段通常是 Base URL 指向的端点返回了非 OpenAI 格式的响应。比如你把 Base URL 填成了某个只支持 Anthropic 原生协议的地址但工具按 OpenAI 格式解析。解决方法是确认 Base URL 和工具要求的协议一致TaoToken 的/api端点兼容 OpenAI 格式填这个一般不会出问题。OAuth 相关报错如果你在配置 Claude Code 或类似工具时看到 OAuth 失败检查是不是混用了 OAuth 和 API Key 两种认证方式。用 API Key 认证时不需要走 OAuth 流程把 auth.json 或配置文件里的 base_url 和 api_key 填对即可。三件套Base URL Key Model ID对齐后OAuth 报错一般会消失。Coze 返回 code 非 0比如 code 是 4001 或 4100通常是 workflow_id 或 app_id 填错或者工作流没有发布上线。回到 Coze 工作流页面确认已经点击「发布」并勾选了 API 选项。另外基础版账号每月只有 100 次调用超了会报额度不足。侧边栏空白检查 sidepanel.html 路径是否和 manifest 里default_path一致以及 sidepanel.js 有没有正确引入。V3 里 Service Worker 和侧边栏是两个独立上下文通信必须走chrome.runtime.sendMessage。图片不渲染Coze 返回的图片 URL 可能是临时链接有有效期。如果侧边栏打开太慢链接可能已过期。可以在 background.js 里拿到 URL 后立即传给侧边栏减少中间环节。排查思路总结成一句话先确认 Coze 侧 curl 能通再确认插件侧能拿到响应最后确认渲染逻辑没问题。分层排查比一股脑改代码高效得多。6. 把链路跑成习惯从单次插件到可复用的 AI 编程工作流这个思维导图插件本身不复杂但它是一条完整的 AI 编程闭环Coze 负责「生成能力」Cursor 负责「工程实现」TaoToken 负责「模型通道」。三者串起来你就能用很低的成本把想法变成可运行的工具。如果你想继续扩展有几个方向可以试。一是把 Coze 工作流换成别的插件比如文本摘要、代码解释、翻译插件框架不用大改只换 API 调用部分。二是给插件加历史记录用 chrome.storage 存最近生成的导图 URL方便回看。三是把侧边栏改成可拖拽宽度提升使用体验。Cursor 侧的三件套配置建议固定下来Base URL 用https://taotoken.net/apiKey 存在配置文件里Model ID 按需切换。这样你每次开新项目模型通道都是现成的不用重复折腾。最后给一个实用技巧在 Cursor 里让模型帮你写代码时把 Coze 的 curl 示例和返回结构一起贴进提示词模型生成的整合代码准确率会高很多。我试过只描述需求不给示例生成的代码经常在JSON.parse那一步出错给了返回示例后基本一次就能跑通。链路跑通一次之后你会发现真正花时间的不是写代码而是配置对齐和报错排查。把这两块的经验沉淀下来下次做类似插件就是半小时的事。
返回列表