返回资讯中心
外部精选
软件工程
#开发者实时流

开发者发布开放网页协议,用于本地 LLM 存储共享

来源标题:I made an open-web protocol for local LLM storage sharing

一位开发者推出了名为 Bring Your Own Brain(BYOB)的开放网页协议,让玩家通过本地硬件运行 AI 模型,并提供 V2 SDK 供游戏接入。该协议要求游戏在 AI 响应慢或离线时立即回退到脚本内容,玩家操作须即时中断后台 AI 生成,游戏状态在 AI 推理期间不能阻塞。SDK 会自动检测用户是否安装了 BYOB 浏览器扩展,未安装时回退到网页 iframe 方案。

Hacker News 最新pathmap2026/11/8 · 今天15 分钟阅读

以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。

我为本地 LLM 存储共享做了一个开放网络协议

一份构建由本地 AI 驱动的弹性、非阻塞游戏的指南。 由于 Bring Your Own Brain(BYOB)运行在玩家的本地硬件上(通过浏览器扩展或网页回退方案),推理速度可能因高端 GPU 到集成移动芯片而差异巨大。为 BYOB 设计游戏需要转变思维方式:游戏绝不能等待 AI。

  1. 回退为王:你的游戏必须在没有 AI 的情况下也能 100% 可玩。如果模型运行缓慢、离线或输出乱码,游戏应立刻回退到标准的脚本台词。
  2. 玩家永远优先:玩家的操作(关闭菜单、走开、进入战斗)必须立即打断并取消任何后台 AI 生成,以节省 GPU 算力。
  3. 绝不阻塞事件循环:AI 思考时,游戏状态应继续推进。为请求加上超时包装。

加载 V2 SDK 脚本并实例化 brain。你可以把连接 UI 挂载到 DOM 中的任意位置。SDK 会自动检测用户是否安装了高性能的 BYOB Extension,否则安全回退到网页 iframe。

<!-- 加载 SDK --> <script src="https://bringyourownbrain.org/byob-web-sdk-v2.js"></script> <!-- 连接按钮的容器 --> <div id="connector-slot"></div> <script> const brain = new BringYourOwnBrainWeb({ container: document.getElementById('connector-slot'), width: '210px', height: '40px', onState: (state, msg) => { if (state === 'ready') console.log('Brain connected!'); }); brain.mount(); // 渲染 iframe </script>
  1. 非阻塞请求模式 不要直接 await brain.chat()。而应该用 Promise.race 超时来包装请求,这样即使用户的 GPU 过载,游戏也不会卡住。

/**

  • 安全、可取消的 AI 请求包装器。
  • @param {Array} msgs - 消息数组
  • @param {Object} opts - BYOB 选项(priority、max_tokens 等)
  • @param {Number} timeoutMs - 放弃前的最长等待时间 */ function askBrainSafe(msgs, opts, timeoutMs = 8000) { const result = { cancel: () => {}, promise: null }; try { // 1. 发起请求 const p = brain.chat(msgs, opts); // 2. 暴露原生 cancel 方法 result.cancel = () => { try { p.cancel(); } catch(e){} }; // 3. 设置超时的竞态条件 let timer; const to = new Promise((_, reject) => { timer = setTimeout(() => { result.cancel(); // 终止生成 reject(new Error('timeout')); }, timeoutMs); }); // 4. 返回竞态后的 promise result.promise = Promise.race([p, to]).finally(() => clearTimeout(timer)); } catch(e) { result.promise = Promise.reject(e); return result;
  1. 优先级与算力管理 BYOB 引擎支持基于优先级的队列系统。发送高优先级任务会立即抢占并暂停低优先级任务。

// 玩家正在等待这个: const reply = brain.chat(messages, { priority: 'high', max_tokens: 40, temperature: 0.8 }); // 后台 NPC 只是在思考: const ambient = brain.chat(messages, { priority: 'low', max_tokens: 20 });

  1. 取消(让 GPU 停下来) 如果某个 NPC 正在说话或生成文本,而玩家走开或攻击了它,你必须取消 promise。这会立即释放用户的硬件。

let currentAiTask = null; function chatWithNPC(npc, text) { // 如果它已经在生成别的内容,干掉它! if (currentAiTask) { currentAiTask.cancel(); currentAiTask = askBrainSafe([...], { priority: 'high' }, 5000); currentAiTask.promise .then(reply => npc.say(reply)) .catch(err => { // 优雅地处理超时或手动取消 if (err.cancelled) return; npc.say("I lost my train of thought..."); // 回退! }) .finally(() => currentAiTask = null); // 当玩家触发战斗时: function startCombat() { if (currentAiTask) currentAiTask.cancel();

  1. 预生成与缓存(环境对话的秘密) 不要临时生成环境闲置台词。当游戏引擎检测到玩家处于空闲状态时,用低优先级“预生成”台词并存入数组。当 NPC 需要闲谈时,直接从数组中弹出一句,即时使用。

// 在你的游戏 tick/循环中运行: function ambientTick() { // 仅在我们不忙且玩家最近没有操作时才生成 if (isAiBusy || playerIsActive) return; const idleNPCs = getNPCsWithEmptyCache(); if (idleNPCs.length > 0) { const target = idleNPCs[0]; // 在后台生成一句台词 const task = askBrainSafe( [{role: 'system', content: 'Generate a short idle thought.'}], { priority: 'low' }, 12000 // 给它充足的时间 ); task.promise.then(line => { if (validateLine(line)) { target.dialogueCache.push(line); // 存起来备用! }).catch(() => { /* 静默失败 */ }); // 当 NPC 实际需要在屏幕上说话时: function npcIdleSpeak(npc) { if (npc.dialogueCache.length > 0) { npc.say(npc.dialogueCache.shift()); // 即时送达! } else { npc.say(npc.defaultScriptedLines[0]); // 脚本化回退

  1. 数据校验 本地 AI 模型会产生幻觉。它们可能吐出 Markdown、空括号或系统提示词。绝不要未经清理就把 AI 文本直接送入 UI。如果校验失败,就丢弃它并使用脚本台词。

function cleanAiText(raw) { // 移除 HTML 标签、Markdown 残留并去除首尾空白 let s = String(raw || '').replace(/]>/g, '').trim(); // 移除常见的 AI 前缀 bug(例如 "Bot Name: ") s = s.replace(/^(NPC|Bot|Assistant)\s:\s*/i, ''); return s; function isValidLine(s) { if (!s || s.length 200) return false; // 捕获常见的模型输出异常 if (/[error|

API Reference Overview new BringYourOwnBrainWeb(options) 创建 SDK 实例。

向已连接的模型发送聊天补全请求。 返回:一个解析为字符串的 Promise。该 Promise 对象附带 .cancel() 方法用于中止请求。

以编程方式打开 BYOB hub 连接模态框,无需点击 iframe 内部。最适合与自定义 UI 配合使用。

正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。

打开原文
去社区讨论 →