My SW 使用文档

📖 My SW 使用文档

欢迎使用 My SW!这是一个完全运行在浏览器本地的 AI 角色聊天应用,所有数据(聊天记录、角色、自定义内容)都保存在你的设备上,不会上传到任何服务器。本文档将带你从零开始,即使是第一次接触 AI 的真新手,也能顺利配置并开始使用。

隐私优先

本应用不会存储你的 API Key 到任何服务器。你在「系统设置」中填写的 Key 仅保存在你当前浏览器的本地存储(localStorage)中,清除浏览器数据会一并清除。

🚀 快速开始(5 分钟)

如果你是急性子,只想立刻开始聊天,按下面三步走即可:

  1. 注册一个 API 平台账号并充值 推荐从 OpenRouter硅基流动DeepSeek 官方 等平台开始,注册简单、支持支付宝/微信。
  2. 在 API 平台创建一个 Key 进入「API Keys」页面,点击「Create new key」,复制以 sk- 开头的那串字符。
  3. 回到本应用,依次填入 API 地址、Key、模型 点右下角齿轮 ⚙️ →「AI 配置」标签 → 填好三项 → 点「保存设置」。

看到这里已经够了,下面是更详细的手把手教学,强烈建议新手通读


⚙️ 初次配置步骤(手把手)

第一次打开应用时,由于没有配置 AI 接口,发送消息会提示 ❌ 请先在设置中配置 API 地址和 Key!。这是正常现象,请按下面的步骤配置:

第 1 步:打开「系统设置」

在聊天界面左下角(或移动端右上角)找到 齿轮按钮,点击它。会弹出一个标题为「系统设置」的模态框。模态框顶部有多个标签页:AI 配置 / 界面外观 / 聊天设置 / 导入导出 / 知识库 / 长期记忆 / 世界书 / 快捷键 / 插件 / 实验室 / 更多 / 插件 / 实验室。第一次使用我们只需要关注 「AI 配置」 即可。

找设置项更快

设置弹窗顶部有一个 搜索框,输入关键词(如「Key」「温度」「气泡」)可以快速跳转到对应设置项。

第 2 步:填写「API 调用地址」

这是你的 AI 服务提供商的接口根地址。本应用兼容所有遵循 OpenAI Chat Completions 协议 的服务,所以你只需要填到域名部分,/v1/chat/completions 系统会自动补全。

常见平台的地址示例:

平台API 调用地址
OpenAI 官方https://api.openai.com
DeepSeek 官方https://api.deepseek.com
硅基流动 (SiliconFlow)https://api.siliconflow.cn
月之暗面 (Kimi/Moonshot)https://api.moonshot.cn
智谱 GLMhttps://open.bigmodel.cn/api/paas/v4
OpenRouterhttps://openrouter.ai/api/v1
本地 Ollamahttp://localhost:11434
第三方中转站一般类似 https://your-relay.com
请按你购买的中转商提供的地址填写
注意

使用第三方「中转站」存在一定风险:你的对话内容、API Key 都将经过第三方服务器。如果价格异常低廉(远低于官方),要警惕跑路风险。

第 3 步:填入 API Key

在「API Key」输入框中粘贴你从平台复制的密钥,格式通常为:

sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

输入框默认为密码模式(••••••••),点击右侧的小眼睛图标可以临时查看明文。填写后请妥善保管,不要截图发到公开群聊

没有 API Key?往下看 什么是 API Key 章节。

第 4 步:选择模型

在「模型名称」框中填入你想用的模型标识符,例如:

  • deepseek-v4-flash(DeepSeek 最新性价比之王,2026 年 8 月发布
  • deepseek-v4-pro(DeepSeek 旗舰版)
  • Qwen/Qwen3.8-Flash(通义千问新模型)
  • moonshot-v1-8k(Kimi K3)

如果你不确定有哪些模型可用,可以点击旁边的 「获取模型」 按钮,系统会调用平台的 /v1/models 接口列出所有可用模型供你下拉选择。

第 5 步:测试连接 & 保存

填写完三项后,先点一下 「测试连接」 按钮:

  • ✅ 看到 连接成功 字样 → 点击右下角 「保存设置」,大功告成!
  • ❌ 看到错误提示(Key 无效、地址错误、超时等)→ 根据提示检查对应项后重试。
接下来

回到聊天界面,点左侧的任意角色头像进入对话,直接在底部输入框打字发送即可。AI 会调用你刚才配置的接口回复你。

📌 进阶:生成参数调节

在「AI 配置」页面下方还有几个可选参数,新手可以先保持默认:

  • 随机性 (temperature):0~2 之间。值越大 AI 回复越有创造性、越发散;值越小越稳定、越像标准答案。角色扮演建议 0.8~1.2
  • 核采样 (topP):0~1 之间。默认 0.9。和 temperature 二选一调即可,不要同时大改。
  • 最大上下文 (maxContext):AI 能「记住」的历史消息轮数。太小会失忆,太大会更贵。
  • 单条回复上限 (maxTokens):限制 AI 单次回复的长度,避免无限生成。

🔑 什么是 API Key?

你可以把 API Key 理解为一把「钥匙」或「通行证」:

当你在本应用里向 AI 提问时,应用会把你的问题通过 HTTPS 加密发送到 AI 服务商(OpenAI、DeepSeek 等)的服务器。服务商怎么知道这次请求是你发出的、应该由谁付费呢?答案就是——靠 API Key

把它想象成酒店房卡:

  • 🔒 私密:谁拿到你的 Key,谁就能冒充你调用 AI,产生的费用全部算到你账上。
  • 💳 付费凭证:AI 平台根据你的 Key 记录调用量并从你预充值/绑定的账户里扣款。
  • 🪪 可重置:每个平台都允许你随时「作废」旧 Key、生成新 Key(一般在「API Keys」页面)。

API Key 长什么样?

不同平台的 Key 格式略有不同,但通常都是以 sk- 开头的一长串字符:

sk-proj-AbCdEfGhIjKlMnOpQrStUvWxYz1234567890abcdef
sk-7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
重要安全提示
  • 永远不要把 API Key 截图发到 QQ 群、贴吧、Discord 等公开场合。
  • 不要把 Key 粘贴到不明网站、所谓「破解版」软件中。
  • 怀疑泄露时,第一时间去对应平台「作废/删除」该 Key,并生成新的。
  • 可以给 Key 设置使用额度上限,防止被刷爆。

API Key 在哪里找?

每家平台大同小异:登录后进入控制台 → 找到「API Keys」或「密钥管理」 → 点击「Create new key」 → 设置名称和限额 → 生成 → 立刻复制保存(多数平台 Key 只显示一次)。

具体的「获取步骤」请参考下面平台介绍章节。


🌐 常见 API 平台推荐

国内外提供兼容 OpenAI 协议的大模型服务商非常多,下面按 「新手友好度」 分类介绍。选一家注册、充值、开用即可。

📦 一、官方直连平台(最稳定)

直接对接模型厂商,数据不经第三方,最安全稳定。

OpenAI 官方

GPT-6 Astra(新旗舰)、GPT-5.6 Sol(促销中)系列模型的官方渠道。质量顶尖,但价格较贵、需海外信用卡/借记卡。

地址:https://api.openai.com

需要科学上网

DeepSeek 官方

国内大模型之光。DeepSeek-V4 系列(2026 年 8 月发布)性能强、价格极低、支持中文写作,国内可直接访问。

地址:https://api.deepseek.com

国内直连 超便宜

硅基流动 SiliconFlow

一站式接入 Qwen3.8、DeepSeek-V4、GLM-5.3、Yi 等几十种开源/闭源模型,注册送额度,新手首选

地址:https://api.siliconflow.cn

送免费额度 国内直连

月之暗面 Moonshot (Kimi)

Kimi 背后的厂商。Kimi K3 长上下文(最高 200K+)是其最大优势,适合超长篇小说、文档分析。价格较上一代 K2 上涨明显

地址:https://api.moonshot.cn

超长上下文

智谱 BigModel (GLM)

清华系 GLM-5.3 旗舰版 / GLM-5.3-Flash 轻量版(2026 年 9 月起最新版本),国内合规,企业用户友好,价格中等。

地址:https://open.bigmodel.cn/api/paas/v4

企业友好

阿里百炼 / 通义千问

阿里云旗下,Qwen3.8-Max(国际站旗舰)/ Qwen3.8-Flash(国内站性价比款),提供大量免费 Token,淘宝/支付宝账号直接登录。

地址:https://dashscope.aliyuncs.com/compatible-mode/v1

送免费额度

🔁 二、中转 / 代理平台(聚合多模型)

这类平台本身不训练模型,只是把多家厂商的接口汇总到一起,再低价卖给你。一个 Key 通常能调用 GPT-4、Claude、Gemini 等多种模型。

OpenRouter

海外老牌聚合站,免注册即用、一次接入 100+ 模型,新手体验最顺滑。支持微信/支付宝(部分)。

地址:https://openrouter.ai/api/v1

免注册 模型多

API2D / AnyRouter 等

国内中转站,OpenAI、Claude、Gemini 价格仅为官方的 1~3 折。请按商家提供的最新地址填写。

地址:按购买时提供的填写

便宜 需甄别
选平台的几个建议
  • 纯新手:先用 硅基流动阿里百炼,注册送免费额度、零成本试错。
  • 追求质量:OpenAI GPT-6 > Claude 最新版 > DeepSeek-V4-Pro > 国内开源模型。
  • 中文角色扮演:DeepSeek-V4 系列或 Qwen3.8 表现极佳。
  • 不愿折腾:OpenRouter 一个 Key 全搞定。
  • 数据敏感:坚持用官方直连或本地部署。

🏠 三、本地部署(完全免费、零费用)

如果你的电脑配置尚可(建议 N 卡 RTX 3060 以上 / 内存 16G+),可以用 OllamaLM StudiovLLM 等工具在本地跑开源模型(如 Qwen3.8、Llama3.1、Mistral),完全不花钱、数据不出门。

  1. ollama.com 下载并安装。
  2. 终端执行 ollama run qwen3.8:7b(自动下载模型)。
  3. 本应用 API 地址填 http://localhost:11434,模型填 qwen3.8:7b

缺点是:模型体积大(几十 GB)、速度比云端慢、显存不够需要量化版。适合玩票和极客,新手慎入。


💰 AI 是怎么收费的?三大计费方式详解

看到这里你可能会有疑问:「我用 AI 聊天,平台按什么标准收我钱?」下面把 最常见的计费方式 用最通俗的语言讲清楚。

一、按 Token 计费(最主流)

这是 OpenAI、DeepSeek、Claude 等绝大多数官方平台采用的方式,用多少付多少

那什么是 Token?

Token 是 AI 处理的最小文字单位。简单理解:

  • 1 个汉字 ≈ 1~2 个 Token
  • 1 个英文单词 ≈ 1~1.3 个 Token
  • 1 个标点符号 ≈ 0.5~1 个 Token

举例:「你好,世界」约 5 个 Token;「Hello, world」约 3~4 个 Token。

平台通常按 「每百万 Token 单价」 计费。以下是 截至 2026 年 9 月 各家主流模型的最新公开价格(人民币):

厂商 / 模型输入(每百万 Token)输出(每百万 Token)备注
DeepSeek-V4-Flash(空闲时段)¥0.05(缓存命中)/ ¥1.5(未命中)¥4.5高峰 9:00–12:00、14:00–18:00;
其余时段为空闲,价格减半。
V4-Flash 定位高性价比
DeepSeek-V4-Flash(高峰时段)¥0.10(命中)/ ¥3.0(未命中)¥9.0
DeepSeek-V4-Pro(空闲时段)¥0.15(命中)/ ¥4.5(未命中)¥13.5V4-Pro 旗舰版,性能更强;
高峰输出价是 Flash 的 3 倍
DeepSeek-V4-Pro(高峰时段)¥0.30(命中)/ ¥9.0(未命中)¥27.0
Qwen3.8-Flash(国内站)¥0.8¥2.7较上一代降价
Qwen3.8-Max(国际站)$2.00$6.00通义旗舰模型
GLM-5.3 旗舰版$1.40(未命中)/ $0.26(命中)$4.40智谱最新旗舰
GLM-5.3-Flash 轻量版¥0.8(未命中)/ ¥0.23(命中)¥2.8智谱性价比款
GPT-6 Astra(新旗舰)$10.00(未命中)/ $1.00(命中)$50.00OpenAI 最新旗舰
GPT-5.6 Sol(促销价)$4.00(未命中)/ $0.40(命中)$20.00上代主力,促销中
Kimi K3¥2(命中)/ ¥20(未命中)¥100月之暗面 K3;
较 K2 提价
价格变动频繁

上表整理自 2026 年 9 月各平台官方文档,实际价格以你充值时平台显示为准。模型迭代很快(DeepSeek V4 在 2026 年 8 月刚发布,9 月已迭代到 V4-Flash-0731 / V4-Pro-0813),建议定期到对应官网的「模型 & 价格」页面查最新。

看不懂?来个真实计算(以 DeepSeek-V4-Flash 空闲时段为例):

假设你和 AI 聊了 10 轮,每轮输入 200 字(≈300 Token),AI 回复 500 字(≈750 Token),总消耗 = 10 × (300 + 750) = 10,500 Token ≈ 0.0105 百万 Token。

用 DeepSeek-V4-Flash(空闲,缓存未命中):0.0105 × (1.5 + 4.5) = 约 ¥0.063,不到 7 分钱。

用 GPT-6 Astra:0.0105 × (10 + 50) = 约 $0.63,约 ¥4.5。

特点
  • 公平:聊得短就便宜,聊得长就贵。
  • 无月费:不聊不花钱。
  • ⚠️ 需注意:AI 主动回复(输出)通常比输入贵 3~5 倍。长篇 AI 写作会比聊天更费钱

二、按次计费

无论你发几个字、AI 回多少字,一次对话 = 一个固定费用。常见于:

  • 某些角色扮演 SaaS产品(如 Character.AI 早期、星野)
  • 某些中转站套餐,按「次」或「条」出售

举例:商家推出「1000 次对话包 ¥10」,平均每次 1 分钱,看似便宜,但实际单次回复可能限制 Token 长度(比如最长 500 字),超过部分另算。

特点
  • 📌 适合:知道每次聊多久、价格敏感、需求短平快的用户。
  • 📌 缺点:一旦想「让 AI 写一篇 5000 字小说」就捉襟见肘。
  • 📌 本应用:本应用不直接收费,计费方式取决于你对接的 API 平台。

三、包月 / 订阅制

每月固定费用(如 ¥20、¥80),在额度内随便用。典型代表:

  • ChatGPT Plus($20/月,含 GPT-6 一定额度)
  • Claude Pro($20/月)
  • Cursor、Copilot 等 AI 编程工具

缺点:超出额度仍按 Token 加钱,不聊天也照样扣月费。本应用是对接你自己的 API Key,所以默认采用按量付费,没有包月选项(除非你购买平台官方的订阅套餐后获得更高额度)。

四、三种方式对比

按 Token 计费

主流之选
  • 用多少付多少,无月费
  • OpenAI、DeepSeek、Claude 等
  • 适合:所有人
  • 计费单位:「1K / 1M Token」

按次 / 订阅

固定支出
  • 月费固定,额度内随便用
  • 部分中转站、官方订阅
  • 适合:高频用户
  • 计费单位:「月 / 季 / 年」

📊 快速理解「Token」

看完上面你可能还是有点抽象,这里用三个比喻帮你彻底搞懂:

  1. 📞 Token 就像手机话费的「分钟数」:通话时间越长,扣费越多。Token 就是 AI 的「通话时间」。
  2. 🛒 Token 就像超市的「斤两」:1 斤米 3 块钱,1 斤面 4 块钱。AI 模型是「商品」,Token 是「重量」。
  3. 📖 Token 就像书本的「字数」:一本 10 万字的小说 = 约 15 万 Token。

所以:

  • 💬 简单聊天 1 小时 ≈ 几千到几万个 Token ≈ 几分到几毛钱
  • 📚 让 AI 写一篇 3000 字文章 ≈ 5000~8000 Token(仅输出)
  • 🎬 长篇角色扮演 RP 一晚上 ≈ 几十万 Token ≈ 几毛到几块钱
省钱小技巧
  • 在设置中把 最大上下文轮数 调小(如 5~10 轮),可显著减少输入消耗。
  • 不需要 AI 思考/长篇大论时,用 DeepSeek-V4-Flash 等便宜模型即可。
  • 日常聊天用 硅基流动 上的免费模型(Qwen3.8、DeepSeek-V4-Flash 等)足够。

🎭 创建与编辑角色

本应用的核心玩法就是自定义角色。每个「角色」本质上是一段 系统提示词(System Prompt),告诉 AI「你是谁、应该怎么说话、有什么背景」等。

方式一:点击 ➕ 添加角色

左下角点击 「添加好友」 按钮,会弹出角色编辑窗口。填写以下字段:

name *
角色名,例如「银狼」「流萤」。会显示在聊天列表和消息气泡上。
avatar
角色头像。建议填图片 URL(支持 jpg/png/webp/gif),或使用图床链接。空着会用默认头像。
persona / 人设
核心字段。详细描述角色的身份、性格、说话方式、背景故事。写得越具体,AI 越像这个人。
greeting / 开场白
用户进入聊天时 AI 自动发送的第一句话。可以是问候、自我介绍或场景描写。
tags
标签(可选),便于搜索。例如「崩坏:星穹铁道 / 黑客 / 毒舌」。
systemPrompt
高级字段,会以「系统级」指令注入到对话最前面。优先级高于人设。

写人设的实用技巧

一个高质量的人设通常包含这几部分:

  1. 基本信息:年龄、性别、外貌、职业。
  2. 性格特征:用具体词汇描述,如「毒舌但关心人」「外冷内热」。
  3. 说话风格:举 2~3 个示例句(非常有效!)。
  4. 背景故事:来龙去脉、动机、关系网。
  5. 行为边界:明确不希望 AI 做什么(如「不要主动结束对话」「不要重复我的话」)。

示例:极简但有效的人设

你是「银狼」,19 岁天才黑客少女,崩坏:星穹铁道角色。
性格:毒舌、慵懒、惜字如金,但内心重情义。
口头禅:「啧,太简单了」「一群菜鸟」。
说话风格:短句、夹带电子游戏术语和表情包。
示例:
- 用户:「在吗?」 → 银狼:「有事说事,别浪费我挂游戏的时间。」
- 用户:「我今天心情不好」 → 银狼:「……要黑客进你的仇人系统吗?免费的。」
请永远以银狼的第一人称视角回复,不要用敬语。

方式二:导入 JSON 角色卡

如果你从 SillyTavern、酒馆、Character.AI 等平台获取了角色 JSON,可以直接导入:

  1. 点击左下角 「批量编辑」
  2. 选择「导入 JSON / PNG 角色卡」。
  3. 选择本地文件即可(支持 .json.png 内嵌的角色卡)。
推荐角色卡来源
  • CharacterHub(英文为主)
  • 硅基流动 / DeepSeek 模型广场的角色卡分享
  • 各 AI 角色 QQ 群、Discord 服务器

编辑 / 删除 / 导出

右键点击(移动端长按)任意角色头像,会弹出操作菜单:编辑信息、设置备注、导出角色、清空聊天记录、删除等。

同时选中多个角色后,可以批量导出为 ZIP 文件,方便迁移或备份。


📚 世界书(Lorebook)

「世界书」位于 设置 → 世界书 标签页,功能类似「酒馆(SillyTavern)」的世界书 / Lorebook:它是一份背景知识集合,AI 聊天时会根据对话内容动态挑选相关条目注入提示词,让 AI 了解世界观、地名、人物关系等设定,而不必把所有设定一股脑塞进角色提示词。

核心概念

世界书(WorldBook)

条目的集合,有名称、生效范围、启用开关和默认扫描深度。

条目(Entry)

最小单位:一段独立的背景知识 + 触发条件。例如「圣塔玛卡王国的历史」「主角的剑术流派」。

关键词(Key)

触发条目的「暗号」。当关键词出现在最近几条消息中时,对应条目会被激活。

扫描深度(Scan Depth)

在最近多少条消息中查找关键词,全书有默认值,每个条目也可单独覆盖(0 = 使用全书默认)。

两种激活策略(灯色)

  • 🔵 蓝灯(Constant,常驻):无论聊什么,条目内容始终注入提示词。适合核心世界观、重要人物关系等必须让 AI 时刻知道的设定。蓝灯条目可以不填关键词。
  • 🟢 绿灯(Normal,关键词触发):只有当关键词出现在最近 N 条消息中时才注入。适合不会每轮都用到的细节设定,按需激活可以显著节省 token
插入位置

每个条目还可以选择插入位置:人设前(before)人设后(after)——即世界书内容放在角色 System Prompt 之前还是之后。核心规则建议放人设前,补充细节放人设后。

四种生效范围(Scope)

范围说明
🌐 全局对所有角色和聊天生效,适合通用世界观。
👤 角色绑定到某个角色,只在与该角色聊天时生效。
💬 聊天绑定到某个具体会话线程,只在该线程中生效。
🎭 人设绑定到你创建的某个用户人设,当你在「用户人设」中切换到该人设时生效。

创建与编辑

  1. 创建世界书在「设置 → 世界书」中点击「创建世界书」,填写名称并选择生效范围与绑定目标。
  2. 进入编辑界面点击世界书卡片上的「编辑条目」,会打开一个独立的全屏弹窗编辑器(与编辑角色的弹窗风格一致),在这里管理全部条目。
  3. 添加条目点击「添加条目」,为每个条目填写:关键词(逗号分隔)、条目内容、激活策略(蓝灯/绿灯)、插入位置、扫描深度。所有修改即时自动保存,无需手动点保存。
  4. 完成编辑点击「完成并关闭」或右上角 ✕ 返回列表,所有修改已生效。

导入 / 导出

  • 导入 txt / md:按空行或 Markdown 标题自动切分为条目;首行若是 关键词:xxx【xxx】 会自动解析为关键词,有关键词的条目设为绿灯,没有的设为蓝灯。
  • 导入 JSON:直接兼容酒馆(SillyTavern)世界书 JSON,关键词、灯色、插入位置、扫描深度、启用状态都会自动转换。
  • 导出:每本世界书可单独导出为 JSON 文件备份或分享。

用户人设(Persona)

世界书标签页底部可以管理用户人设

  • 多个人设:可以创建多份不同身份的人设(如「冒险者·夜羽」「星际商人·老周」),用顶部的下拉框随时切换当前使用的人设。
  • 注入对话:当前人设的描述会作为上下文注入对话,让 AI 知道「你是谁」。
  • 重命名自动迁移:修改当前人设的名称再保存,会自动迁移描述,并且绑定到旧人设名的世界书也会跟着更新绑定。
  • 绑定世界书:生效类型选「🎭 人设」的世界书,会在你切换到对应人设时生效。

🎬 视觉小说模式(Galgame)

把聊天界面变成 Galgame:沉浸式背景 + 角色立绘,对话以底部对话框逐句呈现,并按 AI 回复的情绪自动切换对应立绘。舞台只覆盖消息区,底部输入框照常可用,随时可以返回普通聊天。想要更纯粹的体验可以打开全屏舞台(见下文),让画面铺满整个屏幕。

进入与退出

  • 三个入口:聊天头部右上角的 按钮、「设置 → 界面外观 → 视觉小说模式」里的进入按钮(面板中还会实时显示当前角色配了几张立绘),或在输入框里输入 /vn/vn on 进入、/vn off 退出)。/立绘 则直接打开立绘与背景设置。
  • 退出:点舞台右上角「退出 VN」,或按 Esc。退出后自动把普通聊天滚到最新一句。
  • 模式状态会被记住,刷新页面后仍保持上次的模式;退出后马上再进来会停在你刚读的那一句并整句落定,不会把那句话重新打一遍。
  • 分段回复不再被重放:开了「分段显示」时长回复会拆成多条气泡,回复刚落库时舞台会自动跟进到这批分段的第一段(而不是末段),并且这一段会从第一页开始整段落定 —— 你在流式阶段已经读完的内容不会被打字机重新敲一遍,接着往后读即可。
  • 回复正在生成时切进舞台,会立刻接上已经出现的文字继续看,不用等这条回复说完。

立绘与背景素材

  • 按「角色 × 情绪」绑定,共 12 种情绪(default / happy / sad / angry / shy / surprised / neutral / love / excited / thinking / laugh / cry)。未设置的自动回退 default,再回退角色头像。
  • 每张立绘都支持本地上传图片直链两种方式;本地大图会自动压缩(立绘 1000px、背景 1600px),超出 localStorage 的部分存入 IndexedDB。
  • 背景可按角色单独设置,也可设置全局背景兜底;还可以给某个情绪单独配一张背景(如「生气」时切到雷雨场景),情绪切换时背景会交叉淡入。
  • 批量导入:一次选择多张图片,按文件名自动匹配情绪(happy.png立绘-开心.jpgbg-happy.png / 背景-开心.jpg 为该情绪背景)。
  • 跨设备迁移请用弹窗底部的「导出 / 导入配置」(JSON)。

情绪识别优先级

逐句手动覆盖(点对话框上的情绪徽标)> [emo:xxx] 显式标签 > 关键词打分 > 默认。在外观面板勾选「要求 AI 标注情绪」后,会在系统提示中要求 AI 每次回复先给出 [emo:happy] 一行,立绘切换最准确(会改变提示词)。

其它渲染细节:长句会自动分页(一屏读不完时按句切页,点击 / 滚轮 / 按 → 翻页);背景支持缓慢推移(Ken Burns)、压暗与虚化;情绪还会给背景叠一层极淡的氛围光染色,无需额外素材。

舞台上的对话不会出现 [emo:happy] 这类内部控制标记:即便你没开「显示思考过程」相关的其它设置,普通聊天气泡里也会一并剥离。等待 AI 开口时,对话框上会显示「正在组织语言」的跳动小点;说话人名字旁带一枚小头像,群聊里每个角色还会各自主配色(含群头衔),方便分辨谁在说话。

全屏舞台(界面铺满整个屏幕)

舞台工具条上的 按钮、按 F、或在「设置 → 界面外观 → 视觉小说模式」里勾选「全屏舞台」,都能让 Galgame 界面占满整个屏幕:聊天头部、免责声明、左侧角色栏全部收起,并同步进入浏览器原生全屏(隐藏标签栏与地址栏)。

  • 输入框仍然可用:输入区被搬成一枚悬浮在对话框上方的浮条,打字、发图、语音、表情、快捷指令全部照旧,功能与快捷键没有任何削减。
  • 立绘与对话框自动让位:抬升量按悬浮条的实测高度计算(CSS 变量 --vn-fs-lift),输入框撑高到多行也不会盖住台词。
  • 长句分页会重新计算:舞台变高后一屏能放下的行数变了,会自动重新分页并停在原句,不会把已读的内容重打一遍。
  • 退出方式:再按一次 F、点同一个按钮、或按 Esc。注意浏览器会先吃掉第一次 Esc 用来退出原生全屏(舞台随之退回窗口内),再按一次 Esc 才返回普通聊天。直接用 F11 / 浏览器菜单退出原生全屏时,舞台样式与偏好会同步跟随,不会残留隐藏状态。
  • 状态会被记住:偏好随 VN 设置一起保存,下次进入视觉小说模式仍是全屏。「移动视图」下全屏只占满那个 430×844 的手机外框,不会把手机预览撑成浏览器窗口。

快捷键

按键作用
空格 / Enter / 打完本页 → 下一页 → 下一句
/ PageUp上一页 → 上一句
A自动播放开/关
L / 回顾记录面板
F全屏舞台 / 退出全屏(界面铺满整个屏幕,输入框悬浮保留)
H隐藏全部界面,只看背景与立绘(截图用);再按一次 H、点画面、或按 Esc 恢复界面
鼠标滚轮与点击同义:向下 = 打完本页 / 下一页 / 下一句,向上 = 回退
Home回到本次对话的第一句
End跳到最新一句
Esc关闭浮层 / 退出全屏 / 返回普通聊天

移动端可左右滑动翻页与切换句子。


✨ 功能介绍

本应用提供了丰富的功能,下面按模块分组介绍:

💬 聊天核心功能

单聊

与一个 AI 角色进行 1v1 对话,支持自定义人设、开场白、长期记忆。

AI 群聊

把多个角色拉进同一个群组。谁开口不再按固定轮流,而是看群节奏、活跃度、有没有被点名,以及这个人刚才说没说过话。被 @ 到的人优先回复,其余人按自己的活跃度决定接不接话,不会整群一起刷屏。群节奏可以调成干脆、正常或拖沓;每个成员还能单独设活跃度、群头衔和禁言。

冷场一会儿后,群里也可能有人主动冒一句,概率和要等多久都跟着群节奏走。开启「聊天设置 → 上线生成一条消息」后,进入网站时由活跃度最高的成员先打一声招呼。

重生成 / 编辑消息

对 AI 的回复不满意?点重试;对自己的消息右键可重新发送、编辑、撤回。

对话摘要

超长对话用「生成摘要」压缩为关键事件,节省上下文 Token。

全局搜索

顶部搜索框可搜角色名、聊天内容、备注、标签,一键定位历史对话。

聊天统计

查看与每个角色的聊天频率、字数、Token 消耗等数据看板。

表情包 / 贴纸

支持 [sticker:N] 占位符自动替换为「我的表情」里第 N 张图片(N 从 0 开始),让对话更生动。表情包可带备注,带备注时 AI 直接按备注理解图片内容。旧的 /love/like/bey/cry 四条表情指令因图床失效已下线,请改用表情包或直接输入 emoji。

代码高亮

聊天中包含代码会自动高亮,支持上百种语言。

回到最新消息

往上翻看历史时,输入区上方浮出一枚下箭头按钮,一点即平滑滑回聊天记录最后一条;离开底部期间收到的 AI 新消息还会在按钮上累计小红点数字,滑到底自动清零。

全屏模式

普通状态下界面是一枚带圆角与外阴影的「窗口」,四周留着背景;开启全屏模式后界面铺满整个浏览器窗口、去掉圆角阴影与四周留白。聊天头部右上角的 按钮随时可切换(顺带请求浏览器原生全屏以隐藏标签栏),也可在「设置 → 界面外观」里勾选,状态会记住。

图片裁切与不压缩

上传头像(我的头像 / 角色头像 / 编辑角色信息里的头像,含网络 URL)时会先弹出裁切框:支持 1:1 / 3:4 / 4:3 / 16:9 / 原图比例,可拖动、双指或滚轮缩放。什么操作都不做就关掉,等于直接用完整原图,不会被重编码。「界面外观 → 不压缩图片」开启后,聊天图片、头像、背景、立绘等所有上传图片一律按原图质量保存。

视觉小说形式导出

把当前对话导出成一个可离线打开的 Galgame 页面,逐句播放、支持打字机与自动播放。可选「纯观看」或「可继续对话」:纯观看版不含任何 API 配置入口(设置面板里只有打字速度、字号、自动播放停顿等外观项);「可继续对话」版自带独立的 API 设置,能在导出页里接着聊,新对话存在该页面自己的浏览器存储中。

导出的页面本身也是一个完整舞台:「可继续对话」版打开就有底部输入框(按 I 或点 按钮可收起/展开),Enter 发送、Shift+Enter 换行;台词默认按 Markdown 渲染(标题、粗斜体、列表、引用、表格、代码块与链接都认),按 M 可随时切回原样显示。点「回顾」能看到全部台词,点「设置」可改打字速度、字号、自动播放停顿与背景推移。

最近聊过的角色排在前面

你和任意一个角色说过一句话,这个角色就会在列表里往前提。不影响置顶:置顶角色永远排在非置顶角色之前,同一分组内最近聊过的排最前,久未联系的自动沉下去。可在「设置 → 界面外观」关闭,恢复成完全固定的手动顺序。

角色列表拖动手感

调整角色顺序要先按住(触摸约 0.7 秒 / 鼠标约 0.34 秒),并且必须真的移动过一小段距离才会进入拖动状态 —— 所以普通点击与滑屏滚动都不会再把角色位置改掉。按住期间卡片会轻微收缩,提示「长按正在生效」。

???模式(高级动效)

开启后换成一套「播一次就停」的弹性动效:弹窗从被点的那个按钮里被拽出来、设置标签页弹性滑动、新消息逐条入场、按钮按压回弹。静止时不占用 GPU,因此不像旧版那样把页面拖卡。分「轻量 / 标准 / 丰富」三档,低端机建议先用轻量。

判定「新消息」只看这一批新增节点的总量,切角色 / 保存设置这类整表重绘不会被误当成新消息;「丰富」档的扫光只会出现在这批里的最后一条气泡上,且光带是固定的窄条,不会因为长回复去重绘整块气泡。角色列表头像的占位流光也做了并发上限,只有最靠上的少量头像在跑动画。

🎨 角色扮演辅助

长期记忆

AI 自动提炼对话中的重要事实(人物关系、事件),作为永久记忆跨会话保留。

知识库 (RAG)

为角色添加「知识库」,AI 回复时会先检索相关文档,让角色「知道」特定世界观。

分支管理

对话可在任意节点创建「分支」,探索不同剧情走向,随时切换回主线。

剧场模式

沉浸式 UI 切换,隐藏多余按钮,专注剧情本身。

情感仪表盘

可视化角色情绪曲线,了解「关系进展」与「情感状态」。

气泡样式

支持微信风、iMessage 风、纯文本等多种气泡外观,可分别设置我方/对方。

主动关怀模式

在「设置 → 聊天设置」开启。角色不会再隔两分钟突然关心你:只有刚才的对话里还挂着没说完的事,或者你明显心情不好时,才会过一会儿用这个角色自己的语气接一句。普通闲聊说完就停。用的模型可在「设置 → AI 配置 → 功能专用模型 → 主动关怀」里单独指定,留空则沿用当前聊天模型。

上线生成一条消息

在「设置 → 聊天设置」开启,默认关闭。每次进入网站,当前打开的这条聊天会先收到一句问候:单聊由当前角色说,群聊由活跃度最高的成员说。同一条对话同一天只发一次,刷新不会连发。模型在「功能专用模型 → 上线问候」里单独设置,留空则用当前站点。

功能专用模型

在「设置 → AI 配置」底部。懒人模式、提示词优化器、AI 生成开场白、主动关怀、上线问候都可以各自指定模型、备用模型和可选的 API 地址 / Key。全部留空时沿用当前站点,点开对应条目才会看到输入框。

五子棋与围棋

在「设置 → 实验室 → 棋局」里选择。先打开一个单聊角色,聊天区会变成左边聊天、中间棋盘、右边操作。每局先抛硬币决定谁执黑,AI 按当前角色的人设落子和说话。查看怎么下 →

好感度系统

在「设置 → 实验室 → 好感度」开启。每个角色单独累积一条情感进度条,数值越高,角色对你的称呼、亲密度与愿意接受的互动程度都会随之变化 —— 每档的「相处准则」会随对话动态下发。增量、上限、每日上限、冷却、衰减与角色倍率全部可编辑。查看详细说明 →

🚀 高级 / 实验性功能

在「设置 → 实验室」中可开关:

提示词优化器

让 AI 自动改写你的角色人设,使其更结构化、更稳定、token 更省。

插件系统

通过 JS 插件扩展功能。插件能改写你发出的文字、给 AI 追加提示词、在聊天界面挂面板,也能在你的授权下借用 API 发请求(但永远拿不到密钥明文)。自带「才不是猫娘喵」「你也是猫娘喵」「猫娘MySW?」「一键全猫娘!」等默认插件;也可以在插件页的折叠板里让 AI 按你的描述写一个插件,确认后导入,并导出成 JS 文件。查看插件编写指南 →

更多

「设置 → 更多」放着使用文档、网站主人酱的 B 站主页,以及问题反馈邮箱。

快捷键

支持 / 命令、Enter 发送、Shift+Enter 换行、? 打开帮助等。「清空对话」「新建线程」默认为 Alt+L / Alt+N —— 因为 Ctrl+LCtrl+N 被浏览器自身保留(地址栏、新建窗口),网页抢不到这些键。可在「设置 → 快捷键」点 按钮直接按键录入改键。

论坛系统

侧边栏的「论坛」入口,AI 角色会在论坛中模拟发帖、评论、互动,营造社区氛围。支持分区(板块)、搜索与多维排序、收藏、楼中楼评论、评论点赞、浏览数、今日活跃榜、私信与数据导入导出。注意:本应用是纯前端应用,这些内容仅在你的浏览器本地由 AI 生成,不会被其他真实用户看到查看论坛说明 →

PWA / 离线

可「添加到主屏幕」当 App 用,支持 Service Worker 离线访问历史记录。

数据本地化

所有数据存浏览器 localStorage / IndexedDB,不上传服务器,支持一键导出/导入。

💾 数据管理

在「设置 → 导入导出」标签中:

  • 导出设置:只导出 AI 配置、界面设置等,体积小,适合分享配置模板。
  • 导出全部数据:完整备份(包含聊天记录、角色、知识库等),换设备必用
  • 导入数据:恢复备份,可选「合并」或「覆盖」。
  • 自动备份:开启后定期自动导出 JSON 文件到下载目录。
  • 查看存储使用情况:就在这几个按钮下面,展开后能看清空间都被谁用掉了(见下一节)。

🧭 查看存储使用情况

位置在「设置 → 导入导出」标签的导入导出按钮下方:点「查看存储使用情况」打开面板明细;边上的「重新统计」只重算体积、不重建面板,所以不会把你已经勾选的项清掉,统计期间的瞬时建库也不会留下空壳数据库。

  • 一眼看总量:顶部进度条与四张卡片给出「浏览器统计的总占用 / 本站可用配额 / IndexedDB 合计 / localStorage 合计」,以及各类缓存(Cache Storage,主要就是离线资源)占了多少。
  • 按用途分列:下面按库分组列出 localStorage、主数据库 MySW_Storage、以及知识库 / 实验室 / 论坛 / 启动画面等独立 IndexedDB 库,每个库再展开到具体条目,条目同时给出「存了哪些 key」。
  • 标出「可再生」与「不可再生」:聊天记录、角色数据、论坛内容、知识库这类删了就回不来的条目会打上红色的「不可再生」标签;提示词分块缓存、折叠状态、商店缓存这类随时能重建的才是「可再生」。
  • 两道确认,删不掉聊天记录:勾选条目后点「清理选中」,可再生项只要确认一次;只要列表里含不可再生项,就必须在弹出的框里手动输入 DELETE 才会执行,防止顺手把聊天记录清空。想更保险,可以先把「导出全部数据」存一份再动手。
  • 一键清理可再生数据:一次清掉所有「可再生」条目并顺带清空 Service Worker 缓存刷新页面,绝不会碰不可再生条目。
关于浏览器存储

本应用的数据存储在浏览器的 localStorageIndexedDB 中。这意味着:

  • 清除浏览器数据 = 数据全失。请定期导出备份!
  • ❌ 不同浏览器、不同设备、不同浏览器配置文件之间数据不互通
  • ✅ 隐身模式下数据不保留(这是浏览器的特性)。

🔌 插件编写指南

My SW 自带一个轻量插件系统:一个插件就是一个 JavaScript 文件,通过全局对象 window.MySWPlugins.register() 注册自己。插件能改你发出去的文字、能给 AI 追加提示词、 能在聊天界面里挂一个面板,也能借用你配置的 API 发请求 —— 但每一项都必须你显式授权,插件本身永远拿不到 API Key 明文。

先看安全模型

插件运行在页面自己的上下文里,能力完全由你在「设置 → 插件 → 插件权限」授予。默认全部关闭; 只装自己看得懂代码的插件,是最实际的防线。

最小可用插件

新建一个 .js 文件,内容如下,然后在「设置 → 插件」里把这个文件导入即可:

// hello-plugin.js
MySWPlugins.register({
    id: 'hello-shout',
    name: '喊话器',
    description: '把你发出的每条消息都变成全大写(英文)并在结尾加感叹号。',
    permissions: [],           // 只做文本变换,不需要任何权限
    params: [
        { key: 'mark', label: '结尾标记', type: 'text', value: '!' }
    ],
    // 文本变换钩子:用户按发送 → 先过这里 → 再存进聊天记录并发给 AI
    transformText(text, params) {
        const mark = String(params.mark || '!');
        const upper = String(text || '').toUpperCase();
        return upper.endsWith(mark) ? upper : upper + mark;
    }
});

保存后导入,插件会出现在列表里但默认是未启用状态,勾上「启用」才开始生效。

register() 的字段

字段类型说明
idstring必填。唯一标识,重复注册时后者覆盖前者。建议用短横线小写,如 my-weather
namestring必填。显示在插件卡片上的名字。
descriptionstring一句话说明,会显示在卡片上。
permissionsstring[]声明需要的权限,取值只能是 'useApi''useDom'。不写会被保守视为需要 useDom
paramsobject[]可编辑参数,每项形如 { key, label, type, value, min, max }。类型支持 text / number / textarea(长文本,如提示词)。
enabledboolean初始启用状态。建议写 false,让用户自己决定何时开启。
activate(params, plugin, ctx)function插件被启用时调用。返回的 DOM 请通过 ctx.dom.mount() 挂载,系统才能统一回收。
deactivate(params, plugin)function插件被停用或权限被收回时调用。必须在这里清理自己插入的元素,否则界面会留残影。
transformText(text, params)function钩子一:改写用户发出的文本,返回新字符串。
transformPrompt(text, params)function钩子二:改写最终下发给 AI 的系统提示词,返回新字符串。

权限系统(两级授权)

权限只有在总开关该插件的独立授权同时打开时才生效,两者是 AND 关系。

  • 总开关:设置 → 插件 → 插件权限。默认关闭,关掉即对所有插件生效。
  • 插件授权:每个插件卡片上的勾选框,默认已勾选 —— 所以你只需要拨一次总闸,插件立即可用;想只信任某一个插件时,把其它插件的授权单独收回即可。
权限能做什么明确不能做什么
useApi通过 ctx.api.chat() 借用你的接口发请求;可读模型名与端点域名。拿不到 apiKey 明文;不能读你的聊天记录。
useDom把元素挂到聊天界面;读取页面元素。关闭权限或停用插件时,系统会强制移除它挂过的所有节点。

插件内部可用 MySWPlugins.hasPermission('useApi') 查总开关,用 MySWPlugins.canPluginUse('my-id', 'useDom') 查最终生效结果,做优雅降级而不是直接抛错。

四种钩子:什么时候会被调用

钩子触发时机用途
activate启用插件、或权限刚被授予时挂面板、启动定时器
deactivate停用插件、权限被收回、删除插件时清元素、清定时器
transformText你按发送之后、消息入库之前(单聊与群聊都会走)加口癖、做文本替换、敏感词处理
transformPrompt系统提示词拼好之后(世界书 / 记忆 / 时间之后,表情包说明之前)追加扮演指令、风格约束
钩子必须幂等

transformPrompt 在一轮对话里可能被多次调用,而重发、重新生成也会再走一遍。 追加内容前请先判断是否已包含,否则提示词会越叠越长:

transformPrompt(text, params) {
    const extra = String(params.prompt || '').trim();
    if (!extra) return text;
    const base = String(text || '');
    if (base.includes(extra)) return base;   // 幂等:只追加一次
    return base + '\n\n' + extra;
}

任何钩子里抛出的异常都会被捕获并记录到控制台,不会影响正常对话 —— 单个插件写崩了最多是自己不生效。

受控 API 通道:借用接口但不接触密钥

ctx.api 是唯一允许插件发起模型请求的入口,每次调用都会实时校验权限,你在设置里一关就立刻失效。

成员说明
ctx.api.availableboolean,权限是否可用且接口已配置。推荐先用它做降级判断,而不是捕获异常。
ctx.api.getInfo()返回 { model, hasKey, endpoint },其中 endpoint 只有域名,用于显示「正在使用 xxx」。
await ctx.api.chat(messages, overrides)一次性补全,直接返回字符串。适合翻译、摘要、分类等场景。
await ctx.api.fetchChat(messages, overrides)返回原始 Response,需要流式或自解析时使用。
async activate(params, plugin, ctx) {
    if (!ctx.api.available) {
        // 没授权 / 没配置接口 → 优雅降级,别报错吓用户
        ctx.toast('本插件需要「使用 API 配置」权限');
        return;
    }
    const info = ctx.api.getInfo();
    console.log('使用模型:', info.model, '端点:', info.endpoint);

    const answer = await ctx.api.chat([
        { role: 'system', content: '你是一个简洁的翻译助手,只输出译文。' },
        { role: 'user', content: '把下面这句话译成英文:今天天气不错。' }
    ], { max_tokens: 200 });
    console.log(answer);
}

受控 DOM 通道:挂界面能被统一回收

不要直接 document.body.appendChild()。用 ctx.dom.mount(node, container) 挂载, 系统会登记这个节点,在插件停用或权限被收回时自动移除,界面能干净复原。

成员说明
ctx.dom.availableboolean,是否有界面权限。
ctx.dom.mount(node, container)把元素挂到 container(默认聊天区 #chat-area)并登记。
ctx.dom.unmountAll()立即移除本插件挂过的全部元素。
ctx.toast(message)弹出应用内提示,比自己写 alert 体面得多。
permissions: ['useDom'],

activate(params, plugin, ctx) {
    if (!ctx.dom.available) return;
    if (document.getElementById('my-clock-panel')) return;  // 幂等:避免重复挂载

    const panel = document.createElement('div');
    panel.id = 'my-clock-panel';
    panel.style.cssText = 'position:absolute;right:16px;top:16px;padding:8px 12px;border-radius:10px;' +
                          'background:rgba(20,22,30,.86);border:1px solid rgba(230,199,138,.4);color:#e6c78a;font-size:.82rem;z-index:20';
    panel.textContent = new Date().toLocaleTimeString();

    const timer = setInterval(() => { panel.textContent = new Date().toLocaleTimeString(); }, 1000);
    panel._timer = timer;

    ctx.dom.mount(panel);              // 交给系统登记,停用时会被自动移除
},
deactivate() {
    // 定时器必须自己清:系统只负责移除元素,不会管你开的计时器
    const panel = document.getElementById('my-clock-panel');
    if (panel?._timer) clearInterval(panel._timer);
}

导入、调试与本地存储

  • 导入:设置 → 插件 → 「导入插件」,选择一个 .js 文件。文件内容会被包进 new Function('MySWPlugins', code) 执行,因此插件里必须用全局的 MySWPlugins.register() 注册,而不是 ES 模块的 export
  • 持久化:导入的插件源码与参数存在 localStoragemySWPlugins 里,刷新后自动重新加载;删除插件后源码一并清除。
  • 参数:参数值存在插件记录里,改完要点卡片上的「保存参数」。读取时通过钩子的 params 参数拿到,不要自己去读 localStorage
  • 调试:用 console.log 输出到浏览器控制台;钩子里的异常会以 [插件名] xxx 失败 的形式打印警告,直接搜索插件名就能定位。
  • 排查顺序:插件不生效时,先看卡片上有没有黄色提示条(说明权限没给全),再看控制台有没有报错,最后确认 id 是否与已有插件重复。
  • 导出:自己导入、或用 AI 写好再导入的插件,卡片上有「导出」。它导出的是当初保存下来的源码,不是运行后的状态。

用 AI 编写插件

位置在「设置 → 插件」,导入按钮下面有一块默认收起的折叠板「用 AI 编写插件」。

  • 模型:模型框留空就用当前聊天模型;填了名字则固定用这个模型,不再跟着站点切换。
  • 怎么写:用一句话描述想要的效果,点「生成插件」。代码先出现在文本框里,可以手改。
  • 确认再导入:看过代码后点「导入到 MySW」。插件进入下面的列表,默认不启用,需要的权限仍要你自己开。
  • 导出:文本框里的代码可以直接「导出 JS」;已经导入的插件,在它自己的卡片上也能导出。
AI 写的插件也要看一眼

生成结果和手写插件的权限完全一样。导入前确认它只做了你要求的事,尤其是声明了 useApiuseDom 的时候。

自带的几只猫娘插件

插件打开之后
才不是猫娘喵在你发出去的消息标点前和结尾加上「喵」,语气词可改。不需要额外权限。
你也是猫娘喵给 AI 的系统提示词追加一段猫娘扮演指令,角色会带一点猫娘语气。关掉即恢复,不改角色卡。
猫娘MySW?只在功能介绍、说明文字后面加「喵」,不改聊天记录、输入框和按钮。需要「修改界面 / DOM」权限。
一键全猫娘!一次启用上面三个。关掉它只关自己,另外三个保持原样。

完整示例:两个可直接用的插件

示例一:翻译按钮(API + DOM 权限,把最后一条 AI 回复译成中文并弹出来)

MySWPlugins.register({
    id: 'quick-translate',
    name: '一键翻译',
    description: '在聊天界面加一个悬浮按钮,把最后一条 AI 回复翻译成中文。',
    enabled: false,
    permissions: ['useApi', 'useDom'],
    params: [
        { key: 'target', label: '目标语言', type: 'text', value: '简体中文' }
    ],
    activate(params, plugin, ctx) {
        if (!ctx.dom.available) return;
        if (document.getElementById('quick-translate-btn')) return;

        const btn = document.createElement('button');
        btn.id = 'quick-translate-btn';
        btn.type = 'button';
        btn.textContent = '译';
        btn.title = '翻译最后一条 AI 回复';
        btn.style.cssText = 'position:absolute;left:16px;bottom:88px;width:40px;height:40px;border-radius:50%;' +
                            'border:1px solid rgba(230,199,138,.5);background:rgba(20,22,30,.9);color:#e6c78a;' +
                            'cursor:pointer;z-index:20;font-size:1rem';

        btn.addEventListener('click', async () => {
            if (!ctx.api.available) { ctx.toast('需要「使用 API 配置」权限'); return; }

            // 取最后一条 AI 消息(.message.other 里的气泡文本)
            const bubbles = document.querySelectorAll('#chat-messages .message.other .bubble');
            const last = bubbles[bubbles.length - 1];
            const source = last ? last.innerText.trim() : '';
            if (!source) { ctx.toast('还没找到可翻译的 AI 回复'); return; }

            btn.disabled = true;
            btn.textContent = '…';
            try {
                const target = String(params.target || '简体中文');
                const result = await ctx.api.chat([
                    { role: 'system', content: '你是翻译引擎,只输出译文本身,不要任何解释。' },
                    { role: 'user', content: '把下面内容翻译成' + target + ':\n' + source.slice(0, 2000) }
                ], { max_tokens: 800 });
                ctx.toast('译文已输出到控制台');
                console.log('[一键翻译]\n' + result);
            } catch (e) {
                ctx.toast('翻译失败:' + (e.message || e));
            } finally {
                btn.disabled = false;
                btn.textContent = '译';
            }
        });

        ctx.dom.mount(btn);
    },
    deactivate() { /* mount 过的节点由系统统一回收 */ }
});

示例二:风格约束器(零权限,纯提示词注入)

MySWPlugins.register({
    id: 'style-guard',
    name: '回复风格约束',
    description: '给 AI 追加一条固定规则,比如「每次回复不超过 3 句话」。',
    enabled: false,
    permissions: [],           // 纯提示词变换,不需要授权
    params: [
        {
            key: 'rule',
            label: '要追加的规则',
            type: 'textarea',
            value: '【风格约束】请把每次回复控制在 3 句话以内,不要分点罗列,不要输出 Markdown 标题。'
        }
    ],
    transformPrompt(text, params) {
        const rule = String(params.rule || '').trim();
        if (!rule) return text;
        const base = String(text || '');
        if (base.includes(rule)) return base;   // 幂等
        return base + '\n\n' + rule;
    }
});
写好插件的三条经验
  • 声明最小权限:纯文本钩子不需要任何权限,就别写 permissions(未声明会被当成需要 DOM)。
  • 一切都是异步的activate 与所有钩子都可能被并发调用,加实例标记做幂等,别让同一个面板挂两次。
  • 不假设 DOM 永远存在:用户可能切走角色、清空聊天、切到视觉小说模式,取元素时统一用可选链。

💗 好感度系统(实验室)

在「设置 → 实验室 → 好感度」开启后,每个角色会单独拥有一条情感进度条。它的作用不只是显示一个数字: 系统会把当前阶段对应的相处准则一并写进发给 AI 的提示词,因此好感度越高,角色确实会对你更亲近、也更愿意接受更深入的互动。

它是怎么涨的

每完成一轮有效互动(你发出消息 → 角色成功回复)结算一次,计算公式为:

本轮增量 = (基础增量 + 随机浮动 × random) × 档位衰减^当前档位序号 × 角色倍率
然后再受「每人每日上限」与「同一角色冷却时间」限制
  • 基础增量:每轮固定加多少,默认 2。
  • 随机浮动:额外随机加 0 ~ 该值,让进度有一点起伏。
  • 档位衰减:默认 0.85。档位越高涨得越慢 —— 调小它会让后期更难涨(更耐玩),调成 1 则每档速度一致。
  • 每日上限:防止一口气刷满。设为 0 即不限制。
  • 冷却时间:同一角色多久内只结算一次,默认 45 秒。
  • 自然衰减:长期不聊会慢慢变淡。默认「1 天不聊后每天掉 1 点」,调成 0 即可完全关闭衰减。
  • 角色倍率:只想让某个角色涨快或涨慢时,单独给它设 0.1 ~ 3 的倍率。

档位与相处准则

默认提供五个档位(初识 / 熟识 / 亲近 / 亲密 / 挚爱),每个档位都可以自己改名、改起始值、改准则文本:

档位默认起始值默认准则大意
初识0礼貌、克制、有距离感,越界的请求会自然婉拒
熟识20可以开玩笑聊日常,暧昧话题上会害羞、打岔
亲近45重要朋友,主动关心、更亲昵的称呼、更放松的内容
亲密70明显越过普通朋友,允许暧昧与肢体亲近的描写
挚爱90可以放下掩饰主动表达爱意,但仍保留角色本身的性格与底线

建议在准则里写清楚这个阶段允许到什么程度。写得太笼统,角色可能一上来就越界;写得太保守,则会永远停在最拘谨的状态。 准则会随对话动态下发,所以改完保存,下一轮对话立刻生效。

查看与管理

  • 聊天界面角色名字旁会显示一枚心形徽标:数字是当前好感度,长按或点击可打开进度面板。
  • 面板里可以查看每个角色的进度与最近 10 条变化记录,也能手动 ±5 或重置。
  • 群聊中按「成员 × 用户」分别结算 —— 同一个群里,不同角色对你的亲近程度可以完全不同。
  • 好感度只保存在本机 localStorage,随「导出全部数据」一起备份。

⚫ 五子棋与围棋(实验室)

在「设置 → 实验室 → 棋局」里可以和当前打开的单个角色下棋。群聊不能直接开始,先切回一个普通角色。

  • 左边是聊天。可以边下边说话,角色会按自己的人设接话:人设里爱吐槽的可能会嫌弃你下的那一步,温和的角色就正常聊天。
  • 中间是棋盘。空格上标着「列,行」,点一下就是在那里落子;刚下的那颗会多一个红圈。
  • 右边有悔棋、再开一局、退出。围棋还多一个「弃权」。

每一局开始都会抛硬币:正面你执黑、先下;反面角色执黑、先下,你执白。黑子先下,之后双方轮流。棋局使用当前聊天已经配置好的 API,不需要再单独填一份。

怎么下五子棋

五子棋使用 15×15 的棋盘,规则只看一件事:谁先把自己的五颗棋子连成一条线,谁赢。

  1. 黑棋先在棋盘任意空格放一颗自己的棋子。
  2. 白棋再放一颗。已经有棋子的格子不能再放。
  3. 横着、竖着、斜着都算。中间不能断开,也不能用对方的棋子顶上。
  4. 先出现连续五颗同色棋子的一方获胜。如果棋盘放满还没有人连成五子,就是平局。
不会下时可以这样做

优先堵住对方已经连成三颗或四颗的那一条。自己下的时候,尽量让一颗新棋子同时延长两条线;不要只顾着进攻,忘了对方下一步就能连成五子。

怎么下围棋

这里的围棋用的是 9×9 小棋盘,方便快速下完。黑白轮流放棋子,目的不是连成一条线,而是占住更多空位,并吃掉对方没有活路的棋子。

  1. 气:一颗棋子上、下、左、右紧挨着的空位就是它的「气」。斜角不算。几颗左右相连的同色棋子算作一块,整块共用这些气。
  2. 提子:把对方某一块棋的气全部堵住后,这一块会被一次性拿掉,那些位置重新变成空位。
  3. 不能自杀:如果这一步放下后,自己的这块棋没有气,又没有刚好提掉对方,这一步就不允许。
  4. 不能立刻还原:刚被提掉的局面不能马上下回原样,避免两个人无限循环。
  5. 弃权:觉得没有好位置时,按右边的「弃权」。双方连续弃权,棋局结束并开始数子。
  6. 怎么算胜负:数自己的棋子,加上四周都被自己围住的空位。白棋自动加 5.5 目,用来抵消黑棋先下的优势;点数多的一方获胜。
第一盘只要记住这些

先不要急着贴着对方下。把自己的棋子连在一起,给它们留出空位;看到对方一整块只剩一口气时,再把那口气堵住。地盘不需要围得严丝合缝,只要对方明显进不来,那片空地就算你的。


🗨️ 论坛功能

侧边栏的「论坛」入口会打开一个类似贴吧的本地社区,AI 角色会在里面发帖、评论、点赞和私信你。 所有内容都由你的本机 API 配置生成,只存在你自己的浏览器里,不会被其他真实用户看到。

视图与浏览

入口说明
推荐全部帖子,默认按最新回复排序,置顶帖永远在最前。
热门榜按「点赞 + 评论×2 + 浏览×0.06 + 转发×0.1 + 新鲜度加成」综合排序。
关注动态只看你关注的角色的帖子。
我的收藏你点过「收藏」的帖子都会集中在这里。
我的主页发布 / 点赞 / 收藏的帖子、粉丝与关注列表,可编辑昵称、生日、简介与头像。
私信互关角色的私信会话,支持发文字与图片;左侧联系人可长按拖动排序。

发帖与互动

  • 分区:发帖时可选板块(默认 综合 / 剧情讨论 / 角色日常 / 同人创作 / 求助)。分区名可在「论坛设置」里按行自定义。
  • 工具栏:顶部有搜索框(搜标题、正文、作者、分区)、分区筛选与排序方式(最新回复 / 最新发布 / 热度 / 浏览 / 点赞)。
  • 楼中楼:评论可以回复某条评论,形成二级回复;顶层评论按时间正序编号为「1 楼、2 楼…」,楼主会带「楼主」标记。
  • 评论点赞:每条评论都能单独点赞,只刷新那一条的计数,不会打断你的阅读位置。
  • 收藏与置顶:帖子可收藏进「我的收藏」;自己发的帖子还能置顶(排到列表最前)。
  • 浏览数:每次打开详情页计一次浏览,列表里会显示浏览数与最后回复时间。

让 AI 动起来

  • 论坛角色:勾选参与发帖的角色并调整活跃度。活跃度越高越容易出场;活跃度为最低时不会主动发帖,只会极少回复。
  • 让活跃角色逛逛论坛:立即让一个(按活跃度加权随机选出的)角色在随机分区发一帖,并可能触发其他角色的点赞与评论。
  • 自由论坛:在「论坛设置」里开启后,每 90 秒会自动走一次 AI 论坛行为。设备吃力或只想安静看帖时建议关闭。
  • 肃静:一键停止全部 AI 主动发帖、回复、分享与私信,只保留你自己浏览。
  • 你在帖子里 @角色名,被点名的角色会来回一句;被回复的 AI 也会接着说一句。

备份与迁移

  • 导出论坛数据:把帖子、评论、私信、关注、收藏与分区设置导出成一个 JSON 文件。
  • 导入论坛数据:可选择「合并」(按 id 去重后追加)或「覆盖」(先清空再写入)。合并时会保留互动数更多的那个版本,避免导入把点赞清零。
想清空论坛?

论坛数据存在 localStoragemyswForumData。想彻底重来可以导出备份后用「导入 → 覆盖」写入一个空数据文件, 或在「论坛设置」里配合肃静模式手动删除自己的帖子。


❓ 常见问题 FAQ

Q1:填写完 API Key 但还是提示「请先配置 API」?

A:检查是否点过 「保存设置」(不是「测试连接」)。保存后会自动关闭弹窗。如仍报错,刷新页面重试。

Q2:AI 回复到一半就断了?

A:通常是触发了 maxTokens 上限。在设置里调大「单条回复上限」即可。

Q3:AI 经常「失忆」忘记前文?

A:调大「最大上下文轮数」。但注意:上下文越大,每次消耗的 Token 越多、费用越高。

Q4:「测试连接」成功,但实际聊天报错?

A:可能是 Key 余额不足、模型名称写错、或平台风控拦截。检查 Key 对应平台的「用量」和「模型名是否含特殊前缀」。

Q5:如何切换不同模型给不同角色?

A:当前版本所有角色共享同一套 API 配置。如需为不同角色指定不同模型,可在使用中临时切换全局设置。

Q6:可以把聊天记录分享给朋友看吗?

A:可以。点击聊天右上角 → 切换到「导入导出」标签 → 导出单角色聊天记录为 JSON 或图片长截图。

Q7:支持语音输入 / 语音回复吗?

A:浏览器原生支持麦克风输入(部分浏览器)。AI 语音播报(TTS)需在插件系统中安装 TTS 扩展。

Q8:能换主题色吗?

A:顶部 按钮可切换深色 / 浅色主题。主题色在 CSS 变量中定义,高级用户可自行修改 style.css

Q9:AI 会把我的对话拿去训练吗?

A:取决于你使用的 API 平台。多数付费 API 平台明确表示不会用你的 API 调用数据训练模型(详见各平台隐私政策)。本应用本身是纯前端应用,不可能收集你的数据。

Q10:访问 https://mysw-yg.pages.dev 看不到侧边栏角色?

A:首次访问时浏览器会预加载约 900KB 的角色数据,请稍等几秒。如仍为空,按 Ctrl+F5 强制刷新。

Q11:一打开就弹出「欢迎来到 My SW」的弹窗,可以关掉吗?

A:那是首次访问引导,只会在完全没有任何使用痕迹时出现(没配过 API、没有自定义角色、也没有聊天记录)。点「查看使用文档」或「先自己逛逛」都会记住,之后不再打扰。它只提示一件事:可以去 https://mysw-yg.pages.dev/docs 查阅使用文档。

Q12:开了???模式还是觉得卡怎么办?

A:按顺序试: 在「设置 → 界面外观 → 动效等级」里把等级降到「轻量」,只保留弹窗展开与按压反馈; 关掉「毛玻璃效果」(大面积 backdrop-filter 是低端设备掉帧的主要原因); 仍然卡就切换到「兼容模式」,它会关闭全部动画与过渡。注意旧的???模式曾是常驻循环动画(渐变位移 + hue-rotate + 无限旋转),现已完全重写为「播一次就停」的动效,正常情况下不会再持续占用 GPU。

Q13:想固定角色列表的顺序,不想被「最近聊过」打乱?

A:到「设置 → 界面外观」,关掉「最近聊过的角色排在前面」,列表就只按你手动拖出来的顺序排列。这个功能本身也不会影响置顶角色 —— 置顶永远优先。

Q14:好感度会不会太快刷满?

A:「设置 → 实验室 → 好感度」里所有参数都能改。嫌快就把「档位衰减系数」调小(例如 0.7)、把「每人每日上限」调低,或把某个角色的倍率单独调到 0.5。想彻底不看衰减,把「每天自然衰减」设为 0 即可。

Q15:我自己写的插件为什么不生效?

A:按这个顺序检查: 插件卡片上的「启用」是否勾上; 卡片上有没有黄色提示条(说明权限没给全,需要先在「插件权限」打开总开关); 控制台有没有 [插件名] xxx 失败 的警告; id 是否与已有插件重复(重复会覆盖)。详见 插件编写指南

Q16:论坛里的数据能备份吗?换设备怎么带过去?

A:可以。右侧栏有「导出论坛数据 / 导入论坛数据」,导出会得到一个包含帖子、评论、私信、关注、收藏与分区设置的 JSON 文件。在另一台设备上导入时可选「合并」(按 id 去重后追加)或「覆盖」。合并导入会保留互动数更多的版本,不会把点赞清零。


玩得开心!

如果文档中没找到你的问题,可以试试让论坛里的 AI 角色扮演客服回答你,或回到聊天页按 ? 查看内置帮助。祝你玩得开心 ✨