LiteMotto 是一个 Minecraft Spigot 插件,可以在玩家加入服务器时发送一句每日格言。格言由 Cloudflare AI 生成,支持自定义前缀、颜色代码以及提示词。
您大可在以下位置更细致的了解本插件:
以及对应的仓库:
- https://github.com/baicaizhale/doc/tree/main/docs/notes/LiteMotto
- https://github.com/baicaizhale/LiteMotto/tree/web
v3.0.0 版本后的风格模仿问题
- 问题描述: 为了防止AI生成重复内容,插件会将最近已生成的格言提供给AI作为参考。但这导致AI会模仿前几次格言的语气风格。
- 具体表现: 重启服务器后,如果第一条格言是文言文风格,后续生成的格言也会保持文言文风格。
- 影响范围: 主要影响格言风格一致性。
如果您有解决此问题的想法或方案,欢迎提交 Issue 或 Pull Request!
- 🎭 多 AI 平台支持:支持 Cloudflare AI 和 SiliconFlow (硅基流动),提供多种高性能大模型。
- 🎨 颜色代码支持:完美支持
&和§颜色代码,自动转换为 Minecraft 格式。 - ⚙ 高度可定制:自由配置前缀、提示词、模型选择及消息反馈。
- 🚀 异步非阻塞:格言获取过程全程异步,确保不影响服务器主线程性能。
- 🔄 实时热重载:配置文件修改后自动重载,无需重启服务器或执行命令。
- 🛠 配置自动迁移:版本更新时自动保留旧配置并迁移至新格式。
- ☁️ 智能适配:自动兼容不同模型的 API 返回格式。
点击前往Bilibili播放【LiteMotto | 使用指南】
- 方式一(推荐): 从 最新发布页面 下载最新的
LiteMotto.jar文件 - 方式二: 从 所有版本列表 查看并下载特定版本
- 方式三: 自行编译源代码(需要 Maven 环境)
git clone https://github.com/baicaizhale/LiteMotto.git cd LiteMotto mvn clean package
- 将下载或编译得到的
LiteMotto.jar文件复制到服务器的plugins/文件夹中 - 确保服务器有足够的权限读写插件目录
- 首次启动: 启动服务器,插件会自动生成默认的
config.yml配置文件 - 热加载: 如果使用 Plugman-X 等热加载工具,可以直接加载插件而无需重启服务器
打开 plugins/LiteMotto/config.yml 文件,根据您的需求进行配置:
# 配置文件版本 (请勿修改)
version: "x.x.x"
# API 提供商选择 (可选值: cloudflare, siliconflow)
api-provider: "cloudflare"
# Cloudflare API 配置
api-key: "你的 Cloudflare API Key"
model: "@cf/openai/gpt-oss-120b"
# 硅基流动 API 配置
siliconflow:
api-key: "你的 SiliconFlow API Key"
model: "Qwen/Qwen2.5-72B-Instruct"
api-url: "https://api.siliconflow.cn/v1/chat/completions"
# 发送给 AI 的提示词
prompt: "请直接返回一句有哲理的格言,不要思考,也不要包含任何前后缀、额外的文字或解释。"
# 玩家收到消息的前缀
prefix: "§bLiteMotto §7> §f"
# 更新检查设置
update-check:
enabled: true
on-startup: false
on-admin-join: false- api-provider: 选择使用的 AI 平台 (
cloudflare或siliconflow)。 - prompt: 发送给 AI 的指令,用于控制格言的风格和内容。
- prefix: 消息前缀,支持
&和§颜色代码。
- api-key: 您的 Cloudflare API 令牌。
- model: 使用的模型名称,默认为
@cf/openai/gpt-oss-120b。 - 注意: 插件会自动获取关联的
account-id,无需手动配置。
- api-key: 您的 SiliconFlow API Key。
- model: 使用的模型名称,推荐
Qwen/Qwen2.5-72B-Instruct。 - api-url: API 请求地址,通常保持默认即可。
- enabled: 是否启用更新检查功能。
- on-startup: 插件启动时是否在控制台提醒更新。
- on-admin-join: 拥有权限的管理员加入时是否发送更新提醒。
- 颜色代码参考:
&0/§0- 黑色&1/§1- 深蓝色&2/§2- 深绿色&3/§3- 湖蓝色&4/§4- 深红色&5/§5- 紫色&6/§6- 金色&7/§7- 灰色&8/§8- 深灰色&9/§9- 蓝色&a/§a- 绿色&b/§b- 天蓝色&c/§c- 红色&d/§d- 粉红色&e/§e- 黄色&f/§f- 白色&k/§k- 随机字符&l/§l- 粗体&m/§m- 删除线&n/§n- 下划线&o/§o- 斜体&r/§r- 重置
- 颜色代码参考:
-
Q: 支持哪些 Cloudflare AI 模型?
- A: 推荐
@cf/openai/gpt-oss-120b(效果最佳),也支持@cf/meta/llama-3-8b-instruct(响应更快)等。插件会自动适配不同模型的 API 返回格式。
- A: 推荐
-
Q: gpt-oss-120b 为什么不能用 chat/completions 格式?
- A: Cloudflare 的 gpt-oss-120b 模型使用新的
run/inputAPI 格式,插件已自动适配,无需手动切换。
- A: Cloudflare 的 gpt-oss-120b 模型使用新的
-
Q: 如何自定义格言风格?
- A: 修改
config.yml的prompt字段即可。例如:- 文言文风格:
"请用文言文生成一句哲理格言" - 鼓励学习:
"请生成一句鼓励学生学习的格言" - 幽默风格:
"请用幽默的方式说一句人生感悟"
- 文言文风格:
- A: 修改
-
Q: 格言内容重复怎么办?
- A: 插件会自动避免最近 10 条格言重复。如果发现重复,可以:
- 删除
plugins/LiteMotto/recent_mottos.json文件重置历史记录 - 修改
prompt字段增加随机性
- 删除
- A: 插件会自动避免最近 10 条格言重复。如果发现重复,可以:
-
Q: 插件不显示格言怎么办?
- A: 检查以下可能原因:
- 网络连接: 确保服务器能正常访问 Cloudflare API
- API 配置: 检查
account-id和api-key是否正确 - 权限问题: 确保插件有足够的文件读写权限
- 控制台日志: 查看服务器控制台是否有错误信息
- A: 检查以下可能原因:
-
Q: 颜色代码不生效怎么办?
- A: 确保:
- 使用正确的颜色代码格式(
&或§) - 玩家有权限查看格式化文本
- 服务器支持颜色代码显示
- 使用正确的颜色代码格式(
- A: 确保:
-
Q: 插件启动失败怎么办?
- A: 检查:
- 版本兼容性: 确保服务器版本与插件兼容
- 依赖冲突: 检查是否有其他插件冲突
- 日志分析: 查看详细的错误堆栈信息
- A: 检查:
-
Q: 如何调试插件问题?
- A: 建议步骤:
- 查看服务器控制台日志
- 检查配置文件是否正确
- 测试网络连接
- 联系开发者提供详细错误信息
- A: 建议步骤:
-
Q: 插件性能如何?
- A: 插件采用异步设计:
- AI 请求在后台线程执行,不影响主线程
- 缓存机制减少重复 API 调用
- 轻量级设计,内存占用低
- A: 插件采用异步设计:
LiteMotto 提供了简单的 API 接口,供其他插件调用 AI 格言生成功能。
- 包名:
org.baicaizhale.litemotto.api.LiteMottoAPI - 方法:
fetchMottoWithPrompt(String customPrompt) - 返回值: 生成的格言字符串,失败时返回
null
// 检查LiteMotto插件是否可用
Plugin liteMottoPlugin = Bukkit.getPluginManager().getPlugin("LiteMotto");
if (liteMottoPlugin != null && liteMottoPlugin.isEnabled()) {
try {
// 加载API类
Class<?> apiClass = Class.forName("org.baicaizhale.litemotto.api.LiteMottoAPI");
// 创建API实例
Object apiInstance = apiClass.newInstance();
// 获取方法
Method fetchMottoMethod = apiClass.getMethod("fetchMottoWithPrompt", String.class);
// 调用方法(异步执行)
Bukkit.getScheduler().runTaskAsynchronously(yourPlugin, () -> {
try {
String customPrompt = "请返回一句鼓励高考学生的格言,要简洁有力";
String motto = (String) fetchMottoMethod.invoke(apiInstance, customPrompt);
// 在主线程中处理结果
Bukkit.getScheduler().runTask(yourPlugin, () -> {
if (motto != null) {
player.sendMessage("今日格言: " + motto);
} else {
// 处理失败情况
player.sendMessage("格言生成失败,请稍后再试");
}
});
} catch (Exception e) {
// 处理异常
e.printStackTrace();
}
});
} catch (Exception e) {
// 处理API调用异常
e.printStackTrace();
}
}如果您的插件直接依赖 LiteMotto,可以直接导入 API 类:
import org.baicaizhale.litemotto.api.LiteMottoAPI;
// 创建API实例
LiteMottoAPI api = new LiteMottoAPI();
// 检查插件是否可用
if (api.isAvailable()) {
// 异步调用
Bukkit.getScheduler().runTaskAsynchronously(yourPlugin, () -> {
String motto = api.fetchMottoWithPrompt("自定义提示词");
// 在主线程中处理结果
Bukkit.getScheduler().runTask(yourPlugin, () -> {
// 处理格言结果
});
});
}- 多平台支持: 自动根据配置切换 Cloudflare 或 SiliconFlow。
- 自动配置: API 会自动读取插件配置文件,无需手动传入凭据。
- 重复避免: 自动过滤最近生成的格言,确保内容新鲜度。
- 智能适配: 自动处理不同 AI 模型的返回格式差异。
- 元数据获取: 支持获取当前使用的模型名称和提供商信息。
- 颜色处理: 返回的格言已自动处理颜色代码,可直接发送给玩家。
- 异步调用: API 调用涉及网络请求,务必使用异步方式执行
- 线程安全: 结果处理需要在主线程中进行
- 错误处理: 始终检查返回值是否为 null
- 依赖检查: 调用前检查 LiteMotto 插件是否可用
LiteMotto/
├── src/main/java/
│ ├── org/baicaizhale/litemotto/
│ │ ├── LiteMotto.java # 插件主类
│ │ ├── ConfigUpdater.java # 配置自动迁移
│ │ ├── ConfigWatcher.java # 配置实时重载
│ │ ├── DebugManager.java # 调试信息管理
│ │ ├── api/
│ │ │ ├── LiteMottoAPI.java # API 统一入口
│ │ │ ├── MottoGenerator.java # 生成器接口
│ │ │ ├── CloudflareMottoGenerator.java # Cloudflare 实现
│ │ │ └── SiliconFlowMottoGenerator.java # 硅基流动实现
│ │ ├── managers/
│ │ │ └── RecentMottoManager.java # 历史记录管理
│ │ └── utils/
│ │ └── ColorUtils.java # 颜色处理工具
│ └── listeners/
│ └── PlayerJoinListener.java # 玩家加入监听
├── src/main/resources/
│ ├── plugin.yml # 插件描述
│ └── config.yml # 默认配置
└── pom.xml # Maven 构建配置
-
克隆项目
git clone https://github.com/baicaizhale/LiteMotto.git cd LiteMotto -
安装依赖
mvn clean install
-
编译插件
mvn clean package
- Bug 报告: 提供详细的错误信息、复现步骤、环境信息
- 功能建议: 描述需求场景、预期效果、实现思路
- Fork 项目到个人仓库
- 创建功能分支:
git checkout -b feature/your-feature - 编写代码: 编写相关代码
- 提交 PR: 描述修改内容和目的
以下是当前工作流 (CI-Build-Release.yml) 的发布逻辑汇总表:
| 触发行为 (User Action) | 触发 Ref | 关键条件 | 结果 (Result) | 版本/Artifact 名称 |
|---|---|---|---|---|
推送 Tag (在 Main)git push origin v1.0.0 |
refs/tags/v* |
Commit 属于 main 分支 |
✅ 正式发布 (Latest Release) | Release: v1.0.0Artifact: (跳过快照上传) |
推送 Tag (不在 Main)git push origin v1.0.0 |
refs/tags/v* |
Commit 不属于 main 分支 |
❌ 仅构建 (Build Only) | 无 Release,无 Artifact 上传 |
| 合并/推送到 Main (带 Tag) Fast-forward 合并或合并前打 Tag |
refs/heads/main |
HEAD Commit 有 v* Tag |
✅ 正式发布 (Latest Release) | Release: v1.0.0Artifact: LiteMotto-main-#SHA (快照也会上传) |
| 合并/推送到 Main (无 Tag) 普通 PR 合并或提交 |
refs/heads/main |
HEAD Commit 无 v* Tag |
Release: Pre-Release {SHA}Tag: main-{SHA} |
|
推送到 Dev 分支git push origin dev |
refs/heads/dev |
- | 📦 仅快照 (Snapshot) | Artifact: LiteMotto-dev-#SHA |
| 提交 Pull Request | refs/pull/*/merge |
- | 📦 仅快照 (Snapshot) | Artifact: LiteMotto-{pr_ref}-#SHA |
欢迎贡献代码! 如果您有任何问题或建议,请通过以下方式联系:
- GitHub Issues: 提交问题
- Pull Requests: 贡献代码
- 文档仓库: LiteMotto 文档