如何用 Tauri + Rust 打造 2.5k Star 开源笔记 NoteGen?TaoToken 开发心得
1. 从碎片记录到知识库NoteGen 要解决的真实问题我平时写代码、开会、看文档信息像沙子一样从指缝溜走。截图、代码片段、临时灵感散落在不同 App 里想整理成一篇能读的文章往往要手动复制粘贴半小时。NoteGen 这个项目就是冲着这个痛点去的它是一款基于 Tauri 的 Markdown 笔记应用GitHub 上已经拿到 2.5k Star核心思路是用 AI 把「记录」和「写作」桥接起来让碎片化内容自动变成可读草稿。它适合谁三类人最明显一是开发者需要随手存代码片段和报错日志二是写作者需要把零散素材整理成文章三是效率工具爱好者喜欢本地优先、数据自己掌控的笔记方案。NoteGen 的安装包只有 20MB 左右支持 Mac、Windows、Linux这背后就是 Tauri 的功劳——用 Rust 做内核保证性能和安全前端仍然用你熟悉的 HTML/JS 写界面。这篇文章不聊虚的我会把 NoteGen 的工程化落地拆开Tauri 配置怎么写、Rust 后端命令怎么组织、多端打包怎么验证以及怎么通过 TaoToken 统一 Key 和 API 通道把 AI 能力接进桌面端。你跟着做能跑出一个可构建、可调试、可接入 AI 的本地版本。先说清楚一个边界NoteGen 是笔记应用不是编辑器替代品它的价值在于「记录 → 整理 → 写作」这条链路。Tauri 在这里的角色是容器和桥接层Rust 负责文件系统、OCR、网络请求这些重活前端负责交互。理解这个分工后面配置才不会乱。2. TaoToken 前置统一 Key 与 API 通道的接入准备在给 NoteGen 接 AI 能力之前先解决一个工程问题模型调用如果散落在前端各处Key 会暴露、切换模型要改代码、不同厂商的接口格式还不一样。我的做法是走 TaoToken 统一通道把 Base URL、Key、Model ID 三件套集中管理前端只调一个本地 Rust 命令Rust 再去请求统一 API。TaoToken 的定位是 AI 能力接入层官网入口是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 地址是 https://taotoken.net/api 。你需要先拿到一个 API Key然后把它写进本地配置而不是硬编码在前端代码里。这一步很关键因为 Tauri 的前端产物是可以被解包的Key 放前端等于公开。具体操作路径打开控制台创建 Key地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 创建完在 API Keys 页面复制地址是 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。如果你只是想先验证模型通不通可以用模型对话页面快速试一条请求地址是 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里面写了请求格式和参数说明。如果你后面要做长期编码或 Agent 类功能可以看 Coding Plan地址是 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。Claude Code 相关的接入说明在 https://taotoken.net/claudecode?utm_sourcetaotoken_aicg_blog_endutm_contentclaudecodeutm_campaignrewrite 。这里有个工程细节NoteGen 的 AI 调用我放在 Rust 侧用reqwest发请求前端通过invoke调用。这样 Key 存在本地配置文件或环境变量里前端拿不到明文。配置结构我习惯用 JSON路径放在用户目录下的.notegen/config.json和 NoteGen 的原文路径保持一致方便你对照。注意不要把 Key 提交到 Git 仓库。建议在.gitignore里加上config.json和.env本地开发用环境变量覆盖。3. 可复制配置Tauri Rust 后端命令与 settings 片段这一节给你能直接抄的配置。先看 Tauri 的核心配置文件src-tauri/tauri.conf.json重点是窗口、构建命令和打包目标{ build: { beforeDevCommand: pnpm dev, beforeBuildCommand: pnpm build, devPath: http://localhost:1420, distDir: ../dist }, package: { productName: NoteGen, version: 0.1.0 }, tauri: { allowlist: { fs: { all: true, scope: [$APPDATA/*, $DOCUMENT/*] }, shell: { open: true }, http: { all: true, scope: [https://taotoken.net/*] } }, windows: [ { title: NoteGen, width: 1200, height: 800, resizable: true } ], bundle: { active: true, targets: [dmg, msi, deb, appimage], identifier: com.notegen.app } } }allowlist.http.scope里我只放https://taotoken.net/*这是最小权限原则避免前端能请求任意域名。fs.scope限定在 APPDATA 和 DOCUMENT笔记文件不会乱写。再看 Rust 侧的 AI 调用命令文件src-tauri/src/ai.rsuse serde::{Deserialize, Serialize}; use reqwest::Client; #[derive(Serialize)] struct ChatRequest { model: String, messages: VecMessage, } #[derive(Serialize, Deserialize)] struct Message { role: String, content: String, } #[derive(Deserialize)] struct ChatResponse { choices: VecChoice, } #[derive(Deserialize)] struct Choice { message: Message, } #[tauri::command] pub async fn chat_completion(prompt: String, model: String) - ResultString, String { let api_key std::env::var(TAOTOKEN_API_KEY) .map_err(|_| missing TAOTOKEN_API_KEY.to_string())?; let client Client::new(); let body ChatRequest { model, messages: vec![Message { role: user.into(), content: prompt, }], }; let resp client .post(https://taotoken.net/api/v1/chat/completions) .bearer_auth(api_key) .json(body) .send() .await .map_err(|e| e.to_string())?; let data: ChatResponse resp.json().await.map_err(|e| e.to_string())?; data.choices .into_iter() .next() .map(|c| c.message.content) .ok_or_else(|| empty choices.to_string()) }然后在src-tauri/src/main.rs里注册命令fn main() { tauri::Builder::default() .invoke_handler(tauri::generate_handler![ai::chat_completion]) .run(tauri::generate_context!()) .expect(error while running tauri application); }前端调用就一行import { invoke } from tauri-apps/api/tauri; const result await invoke(chat_completion, { prompt: 把这段记录整理成周报, model: gpt-4o-mini, });三件套在这里体现得很清楚Base URL 是https://taotoken.net/apiKey 走环境变量TAOTOKEN_API_KEYModel ID 由前端传入。如果你用 Cline MCP 或 Codex 的auth.json做本地辅助开发也按同样三件套填Base URL、Key、Model ID不要只填一半。4. 验证请求与本地构建从 dev 到多端打包配置写完先验证 AI 通道通不通。最直接的方式是在 Rust 侧写个测试或者用 curl 打一条请求curl -X POST https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer $TAOTOKEN_API_KEY \ -H Content-Type: application/json \ -d { model: gpt-4o-mini, messages: [{role: user, content: 用一句话解释 Tauri}] }返回里能看到choices[0].message.content就说明通道正常。如果返回 401先检查 Key 有没有复制完整如果返回local proxy failed检查你的网络请求是不是被本地代理拦了Tauri 的allowlist.http.scope是否放行了taotoken.net。通道通了之后跑本地开发pnpm install pnpm tauri dev第一次编译 Rust 依赖会比较慢耐心等。窗口起来后在笔记里选中一段文字触发 AI 整理看能不能返回结果。这一步成功说明前端 → Rust → TaoToken → 模型这条链路完整。接着验证构建。多端打包命令pnpm tauri build产物在src-tauri/target/release/bundle/下Mac 出 dmgWindows 出 msiLinux 出 deb 和 AppImage。我实测下来首次构建大概几分钟增量构建快很多。如果你只想验证某一个平台可以加--target参数比如pnpm tauri build --target x86_64-pc-windows-msvc。构建过程中常见的坑是图标缺失Tauri 要求src-tauri/icons下有对应尺寸的 png 和 ico。用pnpm tauri icon path/to/logo.png自动生成一套省得手动裁。验证构建成功的标志安装包能双击打开笔记能新建、保存、重启后还在AI 整理按钮能返回内容。这三条过了工程化落地就算跑通了。5. 本篇常见错排查401、local proxy failed、reading choices、OAuth接入过程里我踩过的坑集中在几个报错逐个说清楚。401 Unauthorized最常见。原因通常是 Key 没读到、Key 失效、或者请求头格式不对。检查TAOTOKEN_API_KEY是否在当前 shell 生效echo $TAOTOKEN_API_KEY看一下。Rust 里用std::env::var读环境变量如果你在 IDE 里跑记得在运行配置里也加上。请求头必须是Authorization: Bearer key少个空格都会 401。local proxy failed这个报错一般出现在请求被本地网络层拦截时。先确认tauri.conf.json的allowlist.http.scope包含https://taotoken.net/*再确认系统没有设置会干扰请求的本地转发规则。如果你在公司网络下问一下网管是否放行了目标域名。这个错和 Key 无关别去反复换 Key。reading choices 报错通常是响应结构和你反序列化的结构对不上。比如返回体里choices为空或者字段名拼错。我建议先把原始响应println!出来看结构再写Deserialize。另外注意有些模型返回的是流式如果你没处理 SSE直接resp.json()会失败。非流式请求记得在 body 里不要带stream: true。OAuth 相关报错如果你用 Claude Code 或 Codex 这类工具做辅助开发遇到 OAuth 报错多半是认证方式选错了。走 API Key 通道时不需要 OAuth 流程直接填 Base URL、Key、Model ID 三件套即可。如果你在 CC Switch 或 Cline MCP 里配置确认填的是 API Key 模式而不是账号登录模式。三件套缺一个都会报认证失败。排查顺序建议先 curl 验证通道再验证 Rust 命令最后验证前端调用。一层层缩小范围比一上来就改代码高效得多。6. 语义一致 CTA把 AI 能力稳定接进你的桌面端NoteGen 这类 Tauri 应用的工程化核心就三件事配置最小权限、Rust 侧收口敏感逻辑、AI 通道统一管理。你把 Base URL、Key、Model ID 三件套固定下来后面换模型、加功能都不用动前端。如果你要复现这套接入建议按这个顺序走先去 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 拿 Key再对照 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 的请求格式写 Rust 命令验证阶段用 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 快速试模型。长期做编码或 Agent 功能可以看 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。最后留一个实用技巧把 AI 调用的超时和重试写在 Rust 侧前端只负责展示 loading 和结果。桌面端网络环境比浏览器复杂Rust 侧控制更稳。我试过在弱网下加 3 次重试体验比前端重试好很多。

相关新闻

claude code 使用提示 ‼Auth conflict: ANTHROPIC_AUTH_TOKEN 与 ANTHROPIC_API_KEY 同时存在时改到 TaoToken

claude code 使用提示 ‼Auth conflict: ANTHROPIC_AUTH_TOKEN 与 ANTHROPIC_API_KEY 同时存在时改到 TaoToken

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 17:03:31 阅读更多 →
收藏必备!从RAG到In-Context检索:大模型检索技术演进与实战指南(TaoToken统一Key接入篇)

收藏必备!从RAG到In-Context检索:大模型检索技术演进与实战指南(TaoToken统一Key接入篇)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 17:03:31 阅读更多 →
提示工程 × 上下文管理:2025-2026 完整技术全景与 TaoToken 统一接入实践

提示工程 × 上下文管理:2025-2026 完整技术全景与 TaoToken 统一接入实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 17:03:31 阅读更多 →

最新新闻

深度学习驱动的角色动画:MotorNerve交互动画系统实战

深度学习驱动的角色动画:MotorNerve交互动画系统实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 17:36:47 阅读更多 →
多波束数据处理与潮汐改正:从原始ping到海底地形的完整链路

多波束数据处理与潮汐改正:从原始ping到海底地形的完整链路

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 17:36:47 阅读更多 →
嵌入式软硬协同:从寄存器到焊点的工程能力构建

嵌入式软硬协同:从寄存器到焊点的工程能力构建

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 17:36:47 阅读更多 →
PADS Logic VX2.5自定义元件库创建全流程与高频问题排查

PADS Logic VX2.5自定义元件库创建全流程与高频问题排查

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 17:36:47 阅读更多 →
AstroPaper 草稿机制全解析:用 frontmatter 的 draft 字段控制文章发布

AstroPaper 草稿机制全解析:用 frontmatter 的 draft 字段控制文章发布

前端 【免费下载链接】astro-paper A minimal, accessible and SEO-friendly Astro blog theme. 项目地址: https://gitcode.com/GitHub_Trending/as/astro-paper 点击查看 免费下载 在 AstroPaper 主题中,一篇还没写完、不想让读者看到的文章&#xff…

2026/10/2 17:36:47 阅读更多 →
变转速变载荷下滚动轴承退化指标构建:RBFNN与KPCA组合方法

变转速变载荷下滚动轴承退化指标构建:RBFNN与KPCA组合方法

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 17:35:46 阅读更多 →

日新闻

从零搭建AI工程化:模型之外的完整闭环

从零搭建AI工程化:模型之外的完整闭环

先搞清楚一件事:从零开始做 AI 工程化,难的从来不是调模型、写提示词,而是把一套原型 Demo 变成长得像是“正经系统”的东西。你手里可能已经有了能跑通的代码,也可能刚读完一些概念,但真到了要把它变成可维护、可观测…

2026/10/2 0:00:20 阅读更多 →
大模型训练显存估计与混合精度训练实战指南

大模型训练显存估计与混合精度训练实战指南

1. 大模型训练显存估计与混合精度训练详解显存不够用,几乎是每个做大模型训练的人都会撞上的第一堵墙。你可能也经历过:模型代码写完了,数据管道跑通了,满心欢喜地按下训练启动脚本,结果几秒钟后终端弹出一行红字——C…

2026/10/2 0:00:20 阅读更多 →
小样本学习数据集选型指南:27个真正可用的高质量数据集

小样本学习数据集选型指南:27个真正可用的高质量数据集

1. 小样本学习的“弹药库”:为什么你总在找数据集,却总找不到真正能用的? 小样本、数据集——这两个词最近半年在我处理的200多个AI项目咨询里,出现频率排进前三。不是模型调不好,不是代码写不对,而是卡在…

2026/10/2 0:00:20 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/10/1 19:40:48 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/10/1 19:41:40 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/10/1 20:05:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 10:36:31 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 5:26:06 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 6:09:11 阅读更多 →