1. 浏览器里复刻 Cursor:左侧写代码,右侧直接玩
DeepSeek V3 这个模型在代码生成上的表现,最近被讨论得很多。但真正让我觉得有意思的,不是它单独能写多少行代码,而是把它塞进一个「浏览器版 Cursor」的交互框架里——左边是 AI 实时吐出的网页游戏代码,右边 iframe 立刻渲染出可玩的画面。你改一句提示词,右边刷新一下,游戏就能跑起来。这种边写边玩的感觉,比单纯在聊天框里贴代码要直观得多。
这篇要解决的问题很具体:很多人想自己搭一个这样的分栏工具,但卡在 Key 管理和模型接入上。要么是每个项目单独申请 Key,要么是 base_url 填错导致请求 404,要么是模型名写成了deepseek-chat却不知道 V3 对应的具体标识。我实测下来,用 TaoToken 做统一 Key 层,配合一份settings.json骨架,可以把 DeepSeek V3 的接入流程压缩到几分钟内跑通。
适合谁看?如果你手头有一个前端项目,想加一个「AI 生成网页游戏 + 即时预览」的模块,或者你单纯想复刻 DeepSite 那种左右分栏体验,这篇的配置可以直接复制。不需要你懂模型部署,也不需要你折腾环境变量,只要你会改 JSON 文件、会发一个 HTTP 请求就行。
下面我会先讲清楚 TaoToken 在这里扮演什么角色,然后给出完整的settings.json配置骨架,接着用一次「改代码→刷新右侧→可玩」的验证动作来确认链路通了,最后把常见的报错和排查方法列出来。你跟着走一遍,应该能拿到一个能跑的最小闭环。
2. TaoToken 前置:统一 Key 层解决什么问题
在浏览器版 Cursor 这个场景里,前端代码需要频繁调用模型接口。如果直接把模型厂商的 Key 写在前端,会有两个麻烦:一是 Key 暴露在浏览器里不安全,二是换模型时要改代码。TaoToken 在这里的作用是做一个统一的 API 入口,你只需要在配置里填一次 Key 和 base_url,后面切换 DeepSeek V3 或者其他模型,改一个模型名就行。
具体来说,TaoToken 提供了兼容 OpenAI 格式的接口。这意味着你前端里用的 SDK 或者 fetch 写法,不需要为了 DeepSeek V3 单独适配。base_url填 TaoToken 的 API 地址,api_key填你在控制台生成的 Key,model填 DeepSeek V3 对应的模型标识。这三样东西填对,请求就能通。
如果你还没有 Key,可以去控制台创建一个。地址是https://taotoken.net/console,进去之后在 API Keys 页面生成一个,复制出来备用。注意 Key 只显示一次,复制后先存到安全的地方。
模型名这块要留意:DeepSeek V3 在 TaoToken 上的模型标识,建议直接去模型对话页面确认一下当前可用的名称。你可以打开https://taotoken.net/models或者用模型对话功能试一下,输入框里选 DeepSeek V3,看它实际发出的请求里 model 字段是什么。我实测时用的是deepseek-v3这个标识,但模型列表会更新,以你看到的为准。
base_url 的填写位置很关键。TaoToken 的 API 地址是https://taotoken.net/api,注意不要加 UTM 参数,也不要写成首页地址。如果你用的是 OpenAI SDK,base_url 通常要写到/v1这一层,具体看 SDK 的要求。下面配置骨架里我会标清楚。
3. 可复制配置:settings.json 骨架与参数说明
这个settings.json是给浏览器版 Cursor 的前端读取用的。你可以把它放在项目的public目录或者通过环境变量注入,核心字段就三个:apiKey、baseUrl、model。下面是一个可以直接复制的骨架,我把每个字段的填写位置和注意事项都标在注释里。
{ "taotoken": { "apiKey": "sk-你的TaoTokenKey", "baseUrl": "https://taotoken.net/api", "model": "deepseek-v3", "endpoint": "/v1/chat/completions" }, "editor": { "leftPanel": "code", "rightPanel": "iframe", "autoRun": true, "refreshDelay": 800 }, "game": { "defaultPrompt": "写一个打砖块的网页游戏,用 Canvas 实现,包含挡板、球、砖块和得分", "iframeSandbox": "allow-scripts allow-same-origin" } }apiKey这里填你从控制台复制的 Key,注意不要带多余空格。baseUrl填https://taotoken.net/api,如果你的请求库要求带/v1,那就写成https://taotoken.net/api/v1,但注意不要重复拼接。model填deepseek-v3,如果请求返回模型不存在,就去模型对话页面确认当前标识。
endpoint是聊天补全的路径,TaoToken 兼容 OpenAI 格式,所以用/v1/chat/completions。editor里的refreshDelay是右侧 iframe 刷新的延迟,设成 800 毫秒是为了等左侧代码流式输出完再刷新,避免频繁重绘。iframeSandbox要允许脚本执行,否则游戏跑不起来。
前端调用的时候,可以这样发请求:
async function generateGame(prompt) { const config = await fetch('/settings.json').then(r => r.json()); const { apiKey, baseUrl, model, endpoint } = config.taotoken; const response = await fetch(`${baseUrl}${endpoint}`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${apiKey}` }, body: JSON.stringify({ model: model, messages: [ { role: 'system', content: '你是一个网页游戏生成器,只输出完整的 HTML 代码,不要解释。' }, { role: 'user', content: prompt } ], stream: true }) }); return response; }这段代码里,Authorization头是Bearer加空格再加 Key,不要漏掉空格。stream: true是为了让左侧代码逐行出现,体验更接近 Cursor。如果你不需要流式,改成false也行,但右侧刷新就要等完整响应回来。
4. 验证请求:改代码→刷新右侧→可玩
配置填好之后,先别急着做完整的分栏界面,用最小步骤验证链路。打开你的项目,在浏览器控制台里跑一次请求,确认能拿到 DeepSeek V3 的返回。
第一步,确认 Key 和 base_url 通。在控制台执行:
fetch('https://taotoken.net/api/v1/chat/completions', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer sk-你的Key' }, body: JSON.stringify({ model: 'deepseek-v3', messages: [{ role: 'user', content: '返回一个只包含 hello 的 JSON' }] }) }).then(r => r.json()).then(console.log)如果返回里有choices字段,说明 Key 和 base_url 没问题。如果返回 401,检查 Key 是否复制完整;如果返回 404,检查 base_url 是否多写或少写了/v1。
第二步,把返回的代码塞进右侧 iframe。假设左侧已经拿到了模型返回的 HTML 字符串,你可以这样刷新右侧:
function renderGame(htmlCode) { const iframe = document.getElementById('game-preview'); const blob = new Blob([htmlCode], { type: 'text/html' }); const url = URL.createObjectURL(blob); iframe.src = url; }用 Blob URL 的好处是不需要后端中转,直接在前端把代码变成可访问的页面。注意每次刷新后,旧的 Blob URL 可以调URL.revokeObjectURL释放,避免内存泄漏。
第三步,做一次完整的「改代码→刷新右侧→可玩」动作。在左侧输入提示词「写一个贪吃蛇游戏,蛇是猫咪元素,食物是老鼠样式」,等代码流式输出完,调用renderGame把结果塞进 iframe。右侧应该出现一个可以用键盘控制的贪吃蛇。如果画面出来了但键盘没反应,检查 iframe 是否获取了焦点,可以在 iframe 加载完后调一下iframe.contentWindow.focus()。
我试过用这个流程生成打砖块和贪吃蛇,打砖块一次就跑起来了,贪吃蛇的键盘监听需要手动点一下 iframe 才能生效。这个细节在分栏界面里加一个「点击预览区域开始操作」的提示就能解决。
5. 本篇常见错排查
报错一:401 Unauthorized。最常见的原因是 Key 没填对。检查settings.json里的apiKey是否有多余空格,或者复制时漏了字符。另外确认请求头是Authorization: Bearer sk-xxx,不是api-key或者其他字段名。
报错二:404 Not Found。通常是 base_url 拼接问题。TaoToken 的 API 地址是https://taotoken.net/api,如果你用的 SDK 会自动加/v1,那 base_url 就填到/api为止;如果 SDK 不自动加,就填https://taotoken.net/api/v1。不要写成https://taotoken.net/api/v1/v1/chat/completions。
报错三:模型不存在。model字段填的标识和实际可用名称不一致。去模型对话页面选一次 DeepSeek V3,看请求里发的 model 是什么,复制过来用。模型列表会更新,以页面显示为准。
报错四:右侧 iframe 空白。检查iframeSandbox是否允许脚本执行。如果 sandbox 设成了allow-same-origin但没有allow-scripts,游戏脚本不会跑。另外确认 Blob URL 创建成功,可以在控制台打印一下url看是否以blob:开头。
报错五:流式输出中断。如果用了stream: true,但前端没有正确处理 SSE 格式,代码可能只显示一半。检查响应是否按data:分行解析,遇到[DONE]结束。如果不想处理流式,先把stream设成false,等完整返回再渲染。
报错六:键盘事件无效。iframe 里的游戏监听的是 iframe 内部的键盘事件,但焦点可能在父页面。在 iframe 加载完成后,调一下iframe.contentWindow.focus(),或者在 iframe 上方加一个透明遮罩,点击后把焦点传进去。
6. 拿到 Key 之后:接入文档与模型对话入口
配置跑通之后,如果你想把 TaoToken 的 Key 用到其他项目里,比如长期编码或者 Agent 场景,可以直接复用同一套 Key 和 base_url。接入文档在https://taotoken.net/doc,里面有不同语言和框架的示例,包括 Python、Node.js 和 curl 的写法。你前端里用的 fetch 写法,和文档里的 Node.js 示例基本一致,改一下运行环境就行。
想先确认 DeepSeek V3 在当前 Key 下的表现,可以去模型对话页面直接试。地址是https://taotoken.net/models,选 DeepSeek V3,输入一段游戏描述,看它返回的代码质量。这个页面也可以用来测试其他模型,比如你想对比不同模型生成网页游戏的效果,切换模型名就行,Key 和 base_url 不用改。
如果你打算把这个浏览器版 Cursor 做成长期用的工具,或者想接入 Coding Plan 做更复杂的代码生成,可以看一下https://taotoken.net/coding-plan。它适合需要频繁调用模型、做多轮代码迭代的场景。API Keys 的管理在https://taotoken.net/api-keys,你可以给不同项目生成不同的 Key,方便追踪用量。
整个流程走下来,最花时间的其实是调 iframe 的刷新时机和键盘焦点,模型接入本身反而很快。把settings.json里的refreshDelay调到 800 到 1200 毫秒之间,基本能避免代码没输出完就刷新的问题。右侧 iframe 的 sandbox 记得同时给allow-scripts和allow-same-origin,少一个都可能让游戏跑不起来。