用Electron和大模型API打造AI桌宠:从透明窗口到Agent实战

发布时间:2026/8/31 12:53:01

用Electron和大模型API打造AI桌宠:从透明窗口到Agent实战
把领导做成 AI 桌宠最近在不少年轻打工人的群里刷了屏。乍一听像整活实际上这是一个挺完整的技术项目把一个大模型接入桌面悬浮角色让它陪你上班、回复消息、提醒待办顺便还能自定义成任何形象。这篇文章不打算继续玩梗而是把“AI 桌宠”从概念拆到落地手把手带你用 Electron 大模型 API 做一个能跑起来的桌面宠物并讲清楚里面的透明窗口、点击穿透、对话调优和 Agent 扩展。适合前端入门、桌面应用开发以及想拿 AI 练手的同学。学完之后你不仅能复现一个会对话的桌宠还能理解桌面悬浮应用背后那套不复杂但容易踩坑的工程逻辑。1. AI桌宠为什么会火从一个热梗说起1.1 “把领导做成AI桌宠”到底在说什么这个梗的走红并不难理解很多打工人每天上班面对各种催促、汇报、任务群压力不小。有人开玩笑说与其让领导在各处发消息不如把领导形象做成一个桌面小宠物每天在电脑角落盯着自己干活。听起来是整活但背后对应的技术产品就是“AI 桌宠”。AI 桌宠是最近一年里发展很快的桌面应用形态。它本质上是一个常驻桌面角落的小程序可以显示一个卡通角色、一张图片或者一套动画并且能跟你对话、执行简单任务。和十多年前 QQ 宠物、瑞星小狮子那类纯视觉桌宠不同AI 桌宠加入了真正的大模型能力它能够理解你输入的自然语言能结合上下文回答也能调用待办清单、定时提醒、打开应用等工具。换句话说它从“看起来可爱”进化到了“能帮你把事情办了”。如果从技术角度拆解一个 AI 桌宠通常由四部分组成桌面悬浮窗口、形象渲染层、AI 对话层、工具执行层。桌面悬浮窗口负责把应用做成无边框、透明、始终置顶的小窗体形象渲染层负责显示角色动画和对话气泡AI 对话层负责调用大模型接口完成语义理解与生成工具执行层则通过函数调用或者本地命令完成待办、提醒、打开网页等操作。这四块彼此独立又可以组合成不同产品。还要强调一点把现实中的同事、领导做成桌宠最好先获得对方的允许或者直接换成虚拟角色、卡通形象、AI 生成的图片。玩技术可以别把玩梗变成侵犯肖像权和骚扰。1.2 为什么现在做 AI 桌宠比过去更简单过去做桌宠主要难在交互上。想做一个能听懂人话的形象要么用关键词匹配要么写一堆离线规则体验非常僵硬。现在大模型 API 把语义理解、上下文记忆、工具调用都变成了开箱即用的能力你只需要写一层调用代码。语音方面也可以用 Web Speech API 或本地 TTS 库实现发声。AI 绘画工具还能快速生成一套角色立绘和动作不需要专业美术设计功底。所以AI 桌宠本质上是一个整合型应用。把成熟的桌面端能力、模型能力和创意内容拼在一起难度可控又很有发挥空间。这也是为什么网上会出现 DeepSeek 桌宠插件、Codex 桌宠等各种各样的衍生项目模型底座已经准备好了真正拼的是外层体验。2. 开发前准备技术选型与环境搭建2.1 技术选型思路做桌宠的技术方案并不唯一。可以用 Electron、Tauri、Python 的 PyQt/PySide甚至 Unity。不同方案的侧重点差别很大下面用一张表格说明方案优势劣势适合场景Electron前端生态HTML/CSS 定制自由透明窗口成熟包体大内存占用偏高快速做出交互丰富的桌宠Tauri包体小性能好安全边界清晰透明窗口和系统 API 需要适配轻量桌宠熟悉 Rust 的团队Python PyQt/PySide本地脚本能力强易读UI 需要大量代码动画不如前端灵活想顺便做本地自动化Unity3D 表现力强动画丰富集成较重开发成本高高精度 3D 桌宠如果只是想尽快做出一个能对话、能换皮的 AI 桌宠我更推荐 Electron。原因很直接透明无边框窗口、置顶、托盘图标、跨平台支持Electron 都有成熟方案渲染层用 HTML/CSS/JS可以很轻松地做对话气泡和动画网上能找到大量前端资源直接复用。2.2 环境准备与项目结构本文示例以常见的桌面开发环境为例版本需要根据你的项目实际情况调整。建议安装 Node.js 18因为后面的 AI 请求会用 Node 内置的fetch。如果版本较老也可以安装 axios 替代。还需要准备一个大模型 API Key。现在很多大模型服务商都提供 OpenAI 兼容接口你可以选择自己常用的服务商也可以使用本地部署的模型服务。为了安全API Key 不要硬编码在代码里而是通过环境变量注入。下面是初始化的命令mkdir ai-desktop-pet cd ai-desktop-pet npm init -y npm install --save-dev electron npm install dotenv项目结构建议如下ai-desktop-pet/ ├── src/ │ ├── main.js │ └── preload.js ├── renderer/ │ ├── index.html │ ├── style.css │ ├── renderer.js │ └── assets/ │ └── pet.png ├── .env ├── .gitignore └── package.json这样的结构把主进程、预加载脚本、渲染页面分开职责清晰后续扩展功能也不容易乱。3. 核心设计AI桌宠的三大基础能力3.1 透明置顶窗口让桌宠“浮”在桌面上桌宠和普通应用最大的不同是它需要像贴纸一样浮在桌面最上层同时不能挡住用户操作。Electron 的BrowserWindow提供了几个关键配置transparent: true可以让窗口背景透明frame: false去掉系统边框alwaysOnTop: true保持置顶skipTaskbar: true隐藏任务栏图标。这里需要注意的是透明窗口的宽高要尽量贴近角色图片的实际尺寸不要创建一个几百像素的空旷窗口否则透明区域虽然看起来透明但鼠标交互范围仍然是一整块矩形容易挡住用户点击其他程序。下面是桌宠窗口的最小配置// 文件路径src/main.js const { app, BrowserWindow } require(electron); const path require(path); let win; function createWindow() { win new BrowserWindow({ width: 260, height: 300, frame: false, transparent: true, resizable: false, alwaysOnTop: true, skipTaskbar: true, hasShadow: false, webPreferences: { preload: path.join(__dirname, preload.js), contextIsolation: true, nodeIntegration: false } }); // 置顶层级尽量高避免被其他全屏窗口覆盖 win.setAlwaysOnTop(true, screen-saver); win.loadFile(path.join(__dirname, ../renderer/index.html)); } app.whenReady().then(() { createWindow(); });上面的代码还做了一件事开启contextIsolation并关闭nodeIntegration。这是 Electron 的安全最佳实践渲染进程不能直接访问 Node 环境只能通过 preload 暴露的接口做有限通信避免恶意页面脚本执行系统命令。透明窗口还有一个经典问题既然窗口是透明的那透明区域是否也应该让鼠标穿透过去Electron 提供了setIgnoreMouseEvents方法可以让整个窗口不再接收鼠标事件。但更精细的交互是鼠标移到角色上时恢复点击鼠标移开时把事件穿透下去。这个逻辑在渲染层监听鼠标事件再通过 IPC 通知主进程。// 文件路径src/preload.js const { contextBridge, ipcRenderer } require(electron); contextBridge.exposeInMainWorld(petWindow, { setIgnoreMouse: (ignore) ipcRenderer.send(set-ignore-mouse, ignore), callAi: (messages) ipcRenderer.invoke(call-ai, messages) });主进程对应处理// 文件路径src/main.js追加 ipcMain.on(set-ignore-mouse, (event, ignore) { if (win) { win.setIgnoreMouseEvents(ignore, { forward: true }); } });渲染进程只需要在容器上监听// 文件路径renderer/renderer.js片段 const petRoot document.getElementById(pet-root); petRoot.addEventListener(mouseenter, () { window.petWindow.setIgnoreMouse(false); }); petRoot.addEventListener(mouseleave, () { window.petWindow.setIgnoreMouse(true); });启动后先调用一次setIgnoreMouse(true)这样桌宠放在桌面角落就不会挡住后面的窗口操作。3.2 对话气泡与多轮对话对话气泡是 AI 桌宠最直观的展示层。实现方式并不复杂一个绝对定位的浮层附带一个三角形小尾巴下方一个输入框。为了不让气泡遮住角色通常把气泡放在角色上方宽度控制在 200 像素左右。对话逻辑的核心是调用大模型接口。我在主进程里封装call-ai的 IPC handler渲染进程只需要传消息数组过来主进程负责拼接地址和密钥返回模型回复的文本。这样做有两个好处第一API Key 不会暴露给渲染层避免被开发者工具直接看到第二主进程可以把超时、重试、日志都统一管理起来代码更干净。// 文件路径src/main.js追加 ipcMain.handle(call-ai, async (event, messages) { const baseURL process.env.AI_API_BASE || https://api.example.com/v1; const apiKey process.env.AI_API_KEY; const model process.env.AI_MODEL || gpt-3.5-turbo; if (!apiKey) { throw new Error(未配置 AI_API_KEY请在 .env 文件中设置); } const response await fetch(${baseURL}/chat/completions, { method: POST, headers: { Content-Type: application/json, Authorization: Bearer ${apiKey} }, body: JSON.stringify({ model, messages, temperature: 0.7 }) }); if (!response.ok) { throw new Error(HTTP ${response.status}: ${await response.text()}); } const data await response.json(); return data.choices[0].message.content; });实际使用时把AI_API_BASE换成你的模型服务商提供的 OpenAI 兼容地址AI_MODEL换成对应的模型名。不同服务商接口字段可能有差异一定要以官方文档为准。多轮对话的关键是维护消息历史。每次用户发言后把用户消息和 AI 回复都 push 进一个数组下一次请求时整体传给模型。这里要注意历史消息不能无限增长否则很快会超过模型的上下文长度。简单做法是只保留最近 20 条更复杂的项目可以做摘要压缩。3.3 形象定制把头像做成桌宠形象形象素材是桌宠的“皮”。最简单的方案是使用一张透明背景 PNG窗口宽度和高度直接参照图片比例。如果需要多动作可以准备多张 PNG 图片在空闲、说话、提醒时切换。如果你没有透明背景图片可以用两类方式快速生成一是使用 AI 绘画工具生成角色立绘再去除背景二是直接用卡通头像或开源素材。把形象文件放到renderer/assets/目录在 HTML 中引用img idpet-image src./assets/pet.png alt桌宠 /如果想做成动态效果可以用 CSS 动画让图片轻微上下浮动增强“活着”的感觉#pet-image { animation: float 3s ease-in-out infinite; } keyframes float { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-8px); } }动作切换也可以放在 JS 里。比如根据状态控制图片src或者使用雪碧图切换背景位置。这一步不需要多高深的技术重点是想清楚角色状态机空闲、聆听、思考、回复。每个状态对应表现层的变化会让桌宠显得更真实。4. 完整实战做一个会对话、会提醒工作的AI桌宠4.1 创建项目结构前两章已经把核心原理讲完了这一步我们把它们组装起来。假设项目已经初始化并且安装了electron和dotenv。先创建目录mkdir -p src renderer/assets touch src/main.js src/preload.js renderer/index.html renderer/style.css renderer/renderer.js .env .gitignore4.2 配置文件在.env中填入模型服务信息AI_API_BASEhttps://api.example.com/v1 AI_API_KEY你的API密钥 AI_MODELgpt-3.5-turbo.env文件不要提交到 Git建议写入.gitignorenode_modules/ dist/ .envpackage.json里把启动脚本改一下Electron 的入口指向src/main.js{ name: ai-desktop-pet, version: 1.0.0, main: src/main.js, scripts: { start: electron . } }如果package.json中自动生成了其他字段不用管保留即可。4.3 编写主进程主进程负责创建窗口、托盘、IPC 通信。下面的代码会在桌面右下角附近创建一个透明置顶窗口同时支持鼠标穿透和 AI 调用。// 文件路径src/main.js const { app, BrowserWindow, Tray, Menu, ipcMain, nativeImage } require(electron); const path require(path); require(dotenv).config(); let win; let tray; function createWindow() { win new BrowserWindow({ width: 260, height: 320, frame: false, transparent: true, resizable: false, alwaysOnTop: true, skipTaskbar: true, hasShadow: false, webPreferences: { preload: path.join(__dirname, preload.js), contextIsolation: true, nodeIntegration: false } }); win.setAlwaysOnTop(true, screen-saver); // 让窗口靠近屏幕右下角 const { screen } require(electron); const primaryDisplay screen.getPrimaryDisplay(); const { width, height } primaryDisplay.workAreaSize; win.setPosition(width - 300, height - 380); win.loadFile(path.join(__dirname, ../renderer/index.html)); win.on(closed, () { win null; }); } function createTray() { const icon nativeImage.createFromPath( path.join(__dirname, ../renderer/assets/pet.png) ); tray new Tray(icon.resize({ width: 20, height: 20 })); const menu Menu.buildFromTemplate([ { label: 显示桌宠, click: () { if (win) win.show(); } }, { label: 退出, click: () { app.quit(); } } ]); tray.setToolTip(AI 桌宠); tray.setContextMenu(menu); } app.whenReady().then(() { createWindow(); createTray(); ipcMain.on(set-ignore-mouse, (event, ignore) { if (win) { win.setIgnoreMouseEvents(ignore, { forward: true }); } }); ipcMain.handle(call-ai, async (event, messages) { const baseURL process.env.AI_API_BASE || https://api.example.com/v1; const apiKey process.env.AI_API_KEY; const model process.env.AI_MODEL || gpt-3.5-turbo; if (!apiKey) { throw new Error(未配置 AI_API_KEY); } const response await fetch(${baseURL}/chat/completions, { method: POST, headers: { Content-Type: application/json, Authorization: Bearer ${apiKey} }, body: JSON.stringify({ model, messages, temperature: 0.7 }) }); if (!response.ok) { throw new Error(HTTP ${response.status}: ${await response.text()}); } const data await response.json(); return data.choices[0].message.content; }); }); app.on(window-all-closed, () { // 桌宠应用通常留在托盘不需要退出 });需要注意screen模块在app.whenReady之后使用才安全所以我把位置设置放在createWindow内部而不是模块顶层。4.4 编写预加载脚本为了让渲染进程能安全地和主进程通信preload 暴露两个方法一个控制鼠标穿透一个调用 AI。// 文件路径src/preload.js const { contextBridge, ipcRenderer } require(electron); contextBridge.exposeInMainWorld(petWindow, { setIgnoreMouse: (ignore) ipcRenderer.send(set-ignore-mouse, ignore), callAi: (messages) ipcRenderer.invoke(call-ai, messages) });4.5 编写渲染层页面index.html是桌宠的脸面。这里放一张角色图片、一个对话气泡区域、一个输入框和一个发送按钮。!DOCTYPE html html langzh-CN head meta charsetUTF-8 / link relstylesheet href./style.css / /head body div idpet-root div idbubble span idbubble-text你好我在。/span /div img idpet-image src./assets/pet.png alt桌宠 / div idchat-box input idinput typetext placeholder和桌宠说点什么… / button idsend发送/button /div /div script src./renderer.js/script /body /htmlstyle.css负责把页面做成透明悬浮效果定位到左下角或任意位置。这里有一个关键点html, body的背景必须透明否则窗口会显示白底。/* 文件路径renderer/style.css */ * { margin: 0; padding: 0; box-sizing: border-box; } html, body { width: 100%; height: 100%; background: transparent; overflow: hidden; font-family: system-ui, sans-serif; user-select: none; } #pet-root { position: relative; width: 260px; height: 320px; cursor: pointer; } #pet-image { position: absolute; bottom: 40px; left: 50%; transform: translateX(-50%); width: 180px; animation: float 3s ease-in-out infinite; } keyframes float { 0%, 100% { transform: translateX(-50%) translateY(0); } 50% { transform: translateX(-50%) translateY(-10px); } } #bubble { position: absolute; top: 10px; left: 50%; transform: translateX(-50%); width: 200px; min-height: 60px; background: #ffffff; border-radius: 12px; padding: 10px 12px; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); font-size: 13px; line-height: 1.5; color: #333333; word-break: break-word; } #bubble::after { content: ; position: absolute; bottom: -8px; left: 40px; border: 8px solid transparent; border-top-color: #ffffff; } #chat-box { position: absolute; bottom: 0; left: 50%; transform: translateX(-50%); width: 240px; display: flex; gap: 6px; } #input { flex: 1; height: 28px; border: 1px solid #ddd; border-radius: 6px; padding: 0 8px; font-size: 13px; outline: none; } #send { height: 28px; padding: 0 10px; border: none; border-radius: 6px; background: #4c6ef5; color: #fff; font-size: 13px; cursor: pointer; } #send:hover { background: #3b5bdb; }renderer.js负责处理鼠标穿透、消息渲染和 AI 调用。// 文件路径renderer/renderer.js const petRoot document.getElementById(pet-root); const input document.getElementById(input); const sendBtn document.getElementById(send); const bubbleText document.getElementById(bubble-text); let history []; const SYSTEM_PROMPT 你是一个桌面 AI 助手性格幽默但可靠。 用户通常正在办公桌前工作你需要用简短、清晰的中文回复。 如果用户提到工作安排可以主动提醒他整理待办。 不要输出过长的内容控制在 100 字以内。 ; async function sendMessage() { const text input.value.trim(); if (!text) return; appendBubble(text, user); input.value ; const messages [ { role: system, content: SYSTEM_PROMPT }, ...history.slice(-20), { role: user, content: text } ]; setThinking(true); try { const reply await window.petWindow.callAi(messages); history.push({ role: user, content: text }); history.push({ role: assistant, content: reply }); appendBubble(reply, assistant); } catch (error) { appendBubble(AI 连接失败 error.message, assistant); } finally { setThinking(false); } } function appendBubble(text, who) { bubbleText.textContent text; bubbleText.classList.toggle(user, who user); } function setThinking(thinking) { if (thinking) { bubbleText.textContent 正在思考…; } } sendBtn.addEventListener(click, sendMessage); input.addEventListener(keydown, (event) { if (event.key Enter) { sendMessage(); } }); // 鼠标穿透控制 petRoot.addEventListener(mouseenter, () { window.petWindow.setIgnoreMouse(false); }); petRoot.addEventListener(mouseleave, () { window.petWindow.setIgnoreMouse(true); }); // 初始状态鼠标移开时穿透 window.petWindow.setIgnoreMouse(true);4.6 运行与验证在项目根目录执行npm start预期效果是桌面右下角出现一个透明背景的桌宠形象鼠标移上去时可以点击输入框输入文字并发送气泡区显示模型的回复鼠标移开后整个区域不再阻挡桌面操作。如果看到窗口背景不是透明的多半是窗口配置或 CSS 中background没有设置为transparent可以先检查这两处。5. 从“会聊天”到“会执行”桌宠Agent进阶5.1 让桌宠记住你的待办一个只会聊天的桌宠玩两天就腻了。真正有用的桌宠应该能帮你记待办、定时提醒、打开常用网站。这些能力本质上是从“对话”走向“工具调用”也是 AI Agent 开发的入门实践。做待办最简单的方式是让大模型输出结构化内容再由前端解析。比如定义一条系统提示当用户说“帮我记一下下周一下午三点开会”时输出一条 JSON包含type、content、time三个字段。前端收到 JSON 后把待办存入本地文件或内存中到点再触发提醒。更规范的做法是使用大模型的 function calling 能力。在请求中声明一个函数{ name: create_todo, description: 创建一个待办事项, parameters: { type: object, properties: { content: { type: string, description: 待办内容 }, time: { type: string, description: 提醒时间格式 HH:mm } }, required: [content] } }模型判断用户意图后会返回函数名和参数而不是普通文本。前端拿到后调用本地逻辑创建待办再把执行结果回传给模型形成完整闭环。这个模式就是目前主流 Agent 的基础。5.2 工具调用前的安全边界桌宠一旦有了执行能力就必须考虑安全。例如“打开浏览器”“创建文件”“执行 shell 命令”这类操作应当设置白名单和人工确认。我的建议是默认只开放低风险工具比如创建待办、打开指定网页、设置番茄钟、切换桌宠皮肤。涉及删除文件、修改系统设置、执行 shell 命令的操作一定要弹窗让用户确认。桌宠本质上是一个常驻后台的小应用权限范围越小越不容易出问题。实现时可以把工具函数放到主进程渲染进程只负责把模型返回的工具调用请求转发过来。工具执行结果再通过 IPC 返回给渲染进程继续让模型生成最终回复。这样既保留了灵活性又把系统级操作限制在主进程内方便做审计日志。5.3 语音交互让桌宠开口说话语音交互是增加桌宠真实感的重要一步。Electron 渲染层基于 Chromium直接支持 Web Speech API 的语音合成function speak(text) { const utterance new SpeechSynthesisUtterance(text); utterance.lang zh-CN; speechSynthesis.speak(utterance); }在收到 AI 回复后调用speak(reply)桌宠就会把回复读出来。这个方案兼容性好实现成本低但不同系统的语音音色和稳定性会有差异实际项目中可以替换为本地 TTS 库或在线语音合成服务。语音识别也可以用 Web Speech API或者接入本地的 Whisper 模型做离线识别。把语音转成文字后再走原来的对话流程桌宠就能从“打字聊天”升级成“语音对话”。6. 常见问题与排查思路问题现象常见原因解决思路窗口背景是黑色或白色未开启transparent或 CSS 中background不是透明检查BrowserWindow配置和html/body的背景桌宠不在最前面其他置顶窗口层级更高调用setAlwaysOnTop(true, screen-saver)提高层级鼠标无法点击桌宠鼠标穿透状态没有恢复检查mouseenter是否触发了setIgnoreMouse(false)AI 调用报 401API Key 未配置或配置错误检查.env环境变量确认服务商地址和密钥输入框能打字但发不出去渲染进程没有正确挂载 IPC 方法检查 preload 是否暴露了callAi并在 devtools 中查看报错中文显示乱码HTML 没有声明 UTF-8在head中加入meta charsetUTF-8 /打包后找不到.env环境变量未随应用打包在构建工具中配置extraResources或改用系统环境变量对话历史过多导致报错请求体超出模型上下文长度只保留最近 20 条或对旧消息进行摘要压缩很多透明窗口相关的报错本质上是 Electron 在不同操作系统下的实现差异。遇到问题时优先打开开发者工具看渲染层是否报错再看主进程的console.log输出。逐层排查比反复重启应用更高效。7. 最佳实践与工程建议7.1 合规与伦理“把领导做成 AI 桌宠”作为调侃没问题但如果做成了真人形象并用于公开传播、羞辱他人就会涉及肖像权和人格权风险。实际开发时我强烈建议使用虚拟角色、授权图片或 AI 生成形象。示例代码里的形象只是一个角色不代表任何现实人物。技术可以用来整活但不能成为伤害别人的工具。7.2 API Key 与敏感信息管理无论做什么桌面应用密钥管理都应该是第一优先级。不要把 API Key 写死在代码里也不要提交到 Git 仓库。.gitignore必须包含.env。如果要发布给别人使用更合理的做法是提供一个设置界面让用户自己填写密钥并把密钥存储在系统安全存储中。7.3 日志与可维护性桌宠虽然小但也会遇到各种异常。建议在主进程中统一封装 AI 请求模块记录请求耗时、错误码、模型名称方便后续排查。绘制页面时把形象资源、气泡样式、业务逻辑拆开后续换皮肤或者换模型都不会互相影响。7.4 性能与体验平衡透明窗口会持续渲染动画对性能有一定影响。可以在桌宠处于空闲状态时降低动画帧率或者使用 CSS transform 代替 JavaScript 操作 DOM 来实现动画。多个桌宠同时运行时每个窗口都会占用内存也要提醒用户控制数量。7.5 从轻量接入到 Agent 落地如果只是做一个桌宠直接调用接口就够了。但如果想让它真正“有用”一定要尽早梳理工具边界。最开始只做待办和提醒稳定后再增加日程管理、邮件草稿等能力。每次加工具都要问三个问题模型能正确识别用户意图吗执行结果可回滚吗失败时用户能理解发生了什么吗8. 总结从玩梗到AI应用开发“把领导做成 AI 桌宠”这个梗本质上是年轻人对职场压力的调侃。但把梗拆开来看它涉及的技术点相当完整Electron 透明窗口、IPC 通信、大模型 API 接入、多轮对话、工具调用、语音交互。跟着本文做完你已经掌握了一条从零搭建桌面 AI 应用的完整路径。下一步可以继续往三个方向深入一是优化桌宠形象和交互体验比如接入 Live2D 或 3D 模型二是完善 Agent 能力把待办、定时提醒、语音识别组合成真正能用的个人助理三是考虑打包发布用 electron-builder 或类似工具生成安装包给朋友同事体验。AI 桌宠不一定是“大项目”但它是理解 AI 应用开发非常好的入口。桌面应用提供了一个稳定的交互载体大模型提供了理解和生成能力两者结合后产品的想象空间完全取决于你的设计。如果你也做了一个有趣的桌宠不妨把它当成一个独立作品去完善。玩梗只是入口能动手把想法变成桌面上的小角色已经比大部分人往前迈了一步。如果文章对你有帮助可以先收藏备用等周末有空再动手敲一遍。

相关新闻

YOLOv8实战:船舶吃水标尺自动检测与读数识别系统

YOLOv8实战:船舶吃水标尺自动检测与读数识别系统

2026/8/31 12:53:01

简介:本资源是一套面向计算机、人工智能及相关专业在校学生的毕业设计级项目,聚焦港口船舶吃水标尺的自动化识别与读数任务,基于YOLOv8目标检测框架实现端到端解决方案。资源适用于毕设、课程设计、大作业及项目立项演示,兼顾入门…

传送带皮带破损检测数据集:VOC格式与YOLO训练实践

传送带皮带破损检测数据集:VOC格式与YOLO训练实践

2026/8/31 12:53:01

简介:本资源是一套面向工业视觉检测初学者与算法工程师的传送带皮带破损识别数据集,聚焦输送系统关键部件的表面缺陷智能诊断问题,适用于目标检测模型训练、工业AI质检项目实践及课程设计等学习场景。压缩包共1682个文件,含700张J…

dcg Windows包详解:del /s、rd /s与PowerShell破坏性命令防护清单

dcg Windows包详解:del /s、rd /s与PowerShell破坏性命令防护清单

2026/8/31 12:53:01

dcg Windows包详解:del /s、rd /s与PowerShell破坏性命令防护清单 【免费下载链接】destructive_command_guard The Destructive Command Guard (dcg) is for blocking dangerous git and shell commands from being executed by agents. 项目地址: https://gitco…

LVGL+FreeRTOS智能手表UI开发实战:从架构到调试

LVGL+FreeRTOS智能手表UI开发实战:从架构到调试

2026/8/31 13:53:03

开发带屏嵌入式设备的人,几乎都会遇到同一个困惑:屏幕点亮容易,界面系统难。尤其是做智能手表这种“麻雀虽小五脏俱全”的项目,要在几寸屏幕上同时处理表盘、菜单、消息通知、传感器数据,还要保证滑动流畅、点击跟手、…

随机子空间识别(SSI)的MATLAB实现与工程实践指南

随机子空间识别(SSI)的MATLAB实现与工程实践指南

2026/8/31 13:53:03

简介:本资源是一套面向结构动力学与模态分析领域的工程技术人员及高校研究者的随机子空间(SSI)算法MATLAB实现代码,专用于从实测响应数据中稳健提取固有频率、阻尼比和模态振型等关键模态参数,广泛适用于桥梁健康监测、…

YOLOv5改进策略:从注意力机制到小目标检测的猕猴桃叶片病害识别实践

YOLOv5改进策略:从注意力机制到小目标检测的猕猴桃叶片病害识别实践

2026/8/31 13:53:03

简介:本资源是一套面向农业智能化应用开发者的猕猴桃叶片病害智能检测系统实现方案,聚焦于解决果园病害人工巡检效率低、识别主观性强等实际问题,适用于计算机视觉初学者、农林信息化开发者及高校课程设计实践者。压缩包共15个文件&#xff0…

Umi-OCR免费离线OCR软件怎么用?完整上手指南

Umi-OCR免费离线OCR软件怎么用?完整上手指南

2026/8/31 13:53:03

Umi-OCR免费离线OCR软件怎么用?完整上手指南 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二维码。内置多国语言库。 项…

美团测试笔试题复盘:从用例设计到自动化测试的全栈能力考察

美团测试笔试题复盘:从用例设计到自动化测试的全栈能力考察

2026/8/31 13:53:03

美团2020校招测试方向笔试题,光看标题可能觉得只是一份普通的招聘考题。但我在测试这行干了这么多年,回过头来再看这些题目,发现它其实代表了互联网大厂对测试工程师的真实能力预期——不是招一个只会点点点的执行者,而是招一个能…

基于YOLOv8-Pose的智慧工地未戴安全绳预警系统实战解析

基于YOLOv8-Pose的智慧工地未戴安全绳预警系统实战解析

2026/8/31 13:43:03

简介:本资源是一套面向计算机、人工智能及相关专业在校学生与初学者的智慧工地安全监管实战项目,聚焦于施工人员未佩戴安全绳行为的实时检测与预警,解决传统人工巡检效率低、漏检率高的工程管理痛点,适用于毕业设计、课程设计、大…

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

2026/8/31 1:38:25

每年校招季我都会接触不少准备数据库方向笔试的同学,看到最多的状态就是:简历上写着“熟悉 MySQL”“了解索引优化”,一碰到数据库管理工程师的笔试卷,却在索引、事务、锁、备份恢复这些题目上翻车。网易这套 2018 校园招聘数据库…

数字电路时序基石:深入理解建立时间与保持时间

数字电路时序基石:深入理解建立时间与保持时间

2026/8/31 7:20:57

1. 这不是“背公式”的事:时间参数到底在约束什么你翻过数字电路教材,一定见过这两个词:建立时间(Setup Time)和保持时间(Hold Time)。它们常被并列写在触发器(Flip-Flop&#xff09…

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

2026/8/30 0:01:07

1. 项目缘起:从赛题到超声波测距机的诞生第八届蓝桥杯单片机设计与开发国赛的题目,我至今记忆犹新。它没有直接给出一个花哨的名字,而是用“超声波测距机”这个朴实无华的功能描述,精准地勾勒出了考核的核心。对于当时备赛的我而言…

MCU无DAC如何用定时器+DMA 2D输出高保真任意波形

MCU无DAC如何用定时器+DMA 2D输出高保真任意波形

2026/8/31 0:02:27

接到一个仪表类项目,要在 LAT1189 上输出几种不同波形:正弦、三角、带可调死区的脉冲,频率和幅度都得能实时改。板子上没有 DAC,就一个定时器加几个 DMA 通道。我一开始觉得在定时器中断里改比较寄存器也能应付,后来把…

Cortex-M3 Flash下载失败?从编程错误标志到供电瞬态排查

Cortex-M3 Flash下载失败?从编程错误标志到供电瞬态排查

2026/8/31 0:02:27

前两周调试一块带着Cortex-M3内核的板子,IDE里下载固件时突然弹出一行刺眼的错误: error: flash download failed - cortex-m3 。这种报错在嵌入式开发里太常见了,常见到很多人第一反应就是换根数据线、重插一下调试器,但重启三…

STM32 TouchGFX屏幕切换Transition优化:原理、配置与排障实战

STM32 TouchGFX屏幕切换Transition优化:原理、配置与排障实战

2026/8/31 0:02:27

做STM32 GUI开发的朋友应该都有体会——界面搭得再漂亮,一旦屏幕切换卡成PPT,整个产品的档次瞬间就没了。早期我在LAT1212这个基于STM32的GUI工程上用TouchGFX做二次开发,最头疼的不是画界面,而是怎么让切换动画既流畅又自然。Tou…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/28 7:35:26

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/28 7:34:51

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/28 7:34:35

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…