Wiki AI 助手

First Post:

Last Update:

🤖 Wiki AI 助手

基于 Wiki 知识库的 AI 对话助手

新增说明

  • 主站是真正给用户访问的 https://mornikar.github.io/Mornikar/
  • https://mornikar-ai-wiki.pages.dev 不是主站,而是专门承接 Wiki AI 对话请求的 Cloudflare Pages 代理域名。
  • 主站前端会把浏览器里的对话请求转发到 https://mornikar-ai-wiki.pages.dev/api/v2/chat/completions
  • 完整架构、发布分工、自动同步规则、后续 AI 接手检查顺序,见:
    WIKI_AI_ARCHITECTURE.md

功能特性

  • 📚 知识库问答 — 基于 Wiki 内容进行 RAG 检索增强回答
  • 🔗 多接入方式 — 支持 Dify / 在线 API / 直连模型
  • 🎨 主题风格 — 与网站一致的 Arknights 风格设计
  • ⚙️ 灵活配置 — 支持自定义 System Prompt

接入方式

三种模式

模式 说明 适用场景
Dify 连接本地 Dify RAG 应用 知识库检索增强
在线 API Cloudflare Worker 代理访问远程 API 公网访问内网模型
直连模型 直接连接本地 LM Studio 本地开发测试

Dify 模式

  • Dify 本地部署
  • 配置 RAG 知识库应用
  • 提供 API 地址和应用密钥

在线 API 模式

  • 通过 Cloudflare Worker 代理
  • 解决跨域问题
  • 支持 OpenAI 兼容 API
  • 默认接口为讯飞 MaaS OpenAI 兼容 /v2,浏览器侧会自动经 dify-proxy/v2 路由转发

线上可用性与远端排障

  • Wiki AI 是静态站前端直连线上 API 代理,不依赖站长本地电脑、localhost 服务或本机 LM Studio。线上默认链路为:浏览器 -> https://mornikar-ai-wiki.pages.dev/api/v2/chat/completions -> 讯飞 MaaS OpenAI 兼容接口。
  • 浏览器不能直接请求讯飞 MaaS 原始接口;该接口会触发 CORS 限制,所以线上必须经过 Cloudflare Pages Function 或其他可跨域代理。
  • 如果本地电脑可对话,但远端手机/异地 PC 提示“当前网络无法连接 Wiki AI 线上代理”,优先检查该网络是否能访问 mornikar-ai-wiki.pages.dev
  • 旧版 workers.dev / vercel.app 代理在部分移动网络不可达;当前默认改用 Cloudflare Pages 分配域名。如果个别网络仍不可达,需要给 Cloudflare Pages 项目绑定可访问的自定义域名,再把前端默认代理域名同步替换。
  • 新访客默认使用在线 API 模式、wiki-visitor 用户名、默认 MaaS endpoint/key/model;旧版默认 MaaS/Worker/Vercel 配置会随 settingsVersion 自动迁移到当前可用默认值。

Cloudflare Pages 代理方案

  • 仓库内置 Cloudflare Pages Function:functions/api/v2/chat/completions.js,当前部署地址为 https://mornikar-ai-wiki.pages.dev/api/v2/chat/completions
  • Cloudflare Pages 代理链路为:浏览器 -> https://mornikar-ai-wiki.pages.dev/api/v2/chat/completions -> 讯飞 MaaS OpenAI 兼容接口。
  • 前端代理根地址配置为 https://mornikar-ai-wiki.pages.dev/api,代码会自动拼接 /v2/chat/completions
  • Cloudflare Pages Function 可继续使用浏览器传入的 Authorization,也支持在 Cloudflare Pages 环境变量中配置 MAAS_API_KEY。如果后续要隐藏前端 API Key,可清空前端默认 key,并在 Cloudflare Pages Project Settings -> Environment Variables 中添加 MAAS_API_KEY
  • *.pages.dev 通常比 *.workers.dev 更容易被手机网络访问,但不是百分百保证;如果个别网络仍不可达,需要给 Cloudflare Pages 项目绑定自定义域名。

直连模式

  • 连接本地 LM Studio
  • 需要启用 “Enable API”
  • 适合开发调试

使用方法

1. 打开 AI 助手

点击页面右下角的 🔵 蓝色按钮,或访问 /Mornikar/login/ 页面。

2. 配置接入方式

在登录页面选择接入模式:

  • Dify — 连接本地知识库
  • 在线 API — 通过代理访问远程模型
  • 直连模型 — 直接连接本地模型

3. 自定义 Prompt

在设置面板中修改 System Prompt,自定义 AI 的角色和行为。

4. 开始对话

配置完成后,在对话框中输入问题即可获得回答。


TTS 文字转语音架构

  • Live2D 工具栏和 Wiki AI 共用 localStorage.waifu_tts_settings,字段为 enabledvoice
  • 音色切换后会派发 waifu-tts-settings-changed 事件,Live2D 对话框和 Wiki AI 都必须监听该事件,并取消旧朗读队列。
  • 每次真正调用 speechSynthesis.speak() 前,代码都要重新读取 waifu_tts_settings,再用当前 voice 匹配 speechSynthesis.getVoices(),避免切换成功提示使用新音色、AI 回复仍使用旧音色。
  • 音色来自当前浏览器/系统的 Web Speech API 本机 voice 列表,不来自服务器,也不由 IP 决定。Edge Neural 预设(晓晓、云希、云扬、云夏、云健、小艺)只会在当前设备真实存在时显示为可选;手机、非 Edge 浏览器或没有 Edge 语音库的系统会自动回退到本机可用中文音色。
  • 不存在的 Edge 预设会置灰并提示“当前设备没有这个 Edge 音色”,不会再保存成“切换成功”。弹窗会额外展示“本机可用”中文音色,远端用户应优先选择这些真实存在的声音。
  • Chrome 在 speechSynthesis.cancel() 后立刻 speak() 可能吞掉后续播放,因此清空队列后保留短延迟再创建新的 SpeechSynthesisUtterance
  • 远端发布 TTS 相关修复时,需要同步刷新 /js/wiki-chat.js/live2d/live2d.js/live2d/Core/waifu-tips.js/live2d/chatCore/waifu-chat.js 的版本参数,避免 GitHub Pages 或浏览器缓存继续加载旧逻辑。

System Prompt

默认 Prompt

1
你是一个基于 Wiki 知识库的 AI 助手,擅长回答关于编程、AI、LLM、RAG 等技术问题。请用中文回答,保持简洁准确。

自定义配置

支持在设置面板中修改:

  • 自定义角色设定
  • 特定领域知识注入
  • 回复风格约束

常见问题

AI 助手没有出现?

  1. 检查浏览器 Console 是否有报错
  2. 确认 JS 文件是否正确加载
  3. 检查网络连接

API 请求失败?

  1. 确认对应服务是否运行
  2. 检查 API 地址和密钥配置
  3. 查看浏览器 Network 面板错误信息

如何关闭?

在设置面板中选择关闭,或联系网站管理员配置 _config.yml


📝 在线内容管理 CMS

博客内容可通过在线 CMS 管理,访问 /Mornikar/admin/ 即可打开。

登录方式

方式 说明
GitHub OAuth 一键登录 点击「GitHub 一键登录」按钮,授权后自动登录
手动输入 Token 生成 GitHub Personal Access Token(需 repo 权限),粘贴登录

功能

  • 📂 集合浏览 — 按分类浏览文章(AIGC / 学习随笔 / 学习笔记 / 机器学习 / 云环境)
  • ✏️ Markdown 编辑 — 在线编辑文章内容,支持实时预览
  • 🏷️ 标签管理 — 添加/删除标签
  • 📷 图片上传 — 拖拽上传图片到 GitHub 仓库
  • 📄 新建文章 — 在指定分类下创建新文章
  • 🗑️ 删除文章 — 确认后删除(不可撤销)

架构

1
2
3
4
5
浏览器 → Cloudflare Worker(统一 Worker v4)
├── /auth → GitHub OAuth 授权
├── /callback → OAuth 回调
├── /api/gh/* → GitHub API 代理(解决 CORS)
└── /api/upload → 图片上传

💡 所有 API 请求通过 Cloudflare Worker 代理,Token 仅存储在浏览器本地。