Skip to content
HarukiTakehataPublic

About

蓝 (Ai) Misskey Bot — OpenAI compatible API fork. Forked from ybw2016v/ai, replacing Gemini/PLaMo with OpenAI-compatible /v1/chat/completions endpoint.

Topics

Resources

Stars

2 stars

Watchers

0 watching

Forks

Repository files navigation

藍

An Ai for Misskey — OpenAI 兼容 API 版 使用说明 开发文档

这是什么?

这是方便 Misskey 使用的日语 Bot(本 fork 为中文优化 + OpenAI 兼容 API 改造)。

主要改动:

  • 🆕 OpenAI 兼容 API 对话模块 — 替换上游 Gemini/PLaMo,支持 OpenAI / Azure / Ollama / vLLM / LM Studio 等任意 /v1/chat/completions 兼容端点
  • 🇨🇳 jieba 中文分词 — 将 MeCab 替换为 nodejieba,更适合中文环境

基于 ybw2016v/ai (v1.5.0),上游原版 syuilo/ai

安装

本地运行建议使用 Node.js 22;Docker 镜像固定为 Node.js 22.23.1。

git clone https://github.com/HarukiTakehata/ai-openai.git
cd ai-openai

创建 config.json(完整示例见下方),然后:

npm ci --legacy-peer-deps
npm run build
npm start

Docker

docker-compose build
docker-compose up

配置 (config.json)

{
  "host": "https:// + 您的实例 URL(末尾不加 /)",
  "i": "Bot 账号的 Access Token",
  "master": "管理员用户名(可选)",
  "notingEnabled": true,
  "notingPostIntervalMinutes": 15,
  "notingPostProbability": 0.02,
  "mazePostHour": 22,
  "mazePostTimezone": "Asia/Shanghai",
  "keywordEnabled": false,
  "chartEnabled": false,
  "reversiEnabled": true,
  "serverMonitoring": false,
  "memoryDir": "data",

  "openaiEnabled": true,
  "openaiApiKey": "sk-your-api-key",
  "openaiBaseUrl": "https://api.openai.com/v1",
  "openaiModel": "gpt-4o-mini",
  "openaiSystemPrompt": "你是一个名为「蓝」的 Misskey 看板娘 AI 女孩...",
  "openaiMaxTokens": 2800,
  "openaiTemperature": 0.7,
  "openaiRequestTimeoutMs": 60000,
  "openaiFileDownloadTimeoutMs": 10000,
  "openaiMaxAttachmentBytes": 5242880,
  "openaiMaxAttachments": 2,
  "openaiMaxInputChars": 12000,
  "openaiRateLimitPerMinute": 3,
  "openaiMaxConcurrentRequests": 2,
  "openaiDailyRequestLimit": 100
}

noting / maze 配置项说明

字段 类型 默认值 说明
notingEnabled boolean false 启用随机固定台词模块
notingPostIntervalMinutes number 10 noting 检查间隔(分钟)
notingPostProbability number 0.04 每次检查触发发帖的概率(0~1)
mazePostHour number 22 迷宫每日自动发送的小时(固定时区)
mazePostTimezone string Asia/Shanghai 迷宫发送判断所用 IANA 时区

noting 会按 notingPostIntervalMinutes 间隔、以 notingPostProbability 概率随机发送一条固定台词(示例配置约为 2 条/天);maze 会在 mazePostTimezone 时区的 mazePostHour 点自动发布当日迷宫。

两者均无补发机制:错过发送时刻或发送失败,当天即跳过,不会延迟或重发。

OpenAI 配置项说明

字段 类型 默认值 说明
openaiEnabled boolean false 启用 OpenAI 对话功能;只有显式设为 true 才会加载模块
openaiApiKey string — API 密钥(启用模块时必填)
openaiBaseUrl string https://api.openai.com/v1 API 端点。Ollama 用户填 http://localhost:11434/v1
openaiModel string gpt-4o-mini 模型名称
openaiSystemPrompt string 内置中文 prompt 系统提示词
openaiMaxTokens number 2800 最大输出 token
openaiTemperature number 0.7 生成温度 (0-2)
openaiRequestTimeoutMs number 60000 模型 API 请求超时(毫秒)
openaiFileDownloadTimeoutMs number 10000 附件下载超时(毫秒)
openaiMaxAttachmentBytes number 5242880 单个图片附件的最大字节数
openaiMaxAttachments number 2 单次请求最多处理的图片数
openaiMaxInputChars number 12000 当前提示词与文本历史的最大总字符数
openaiRateLimitPerMinute number 3 每用户每分钟最多调用次数
openaiMaxConcurrentRequests number 2 全局并发模型请求上限
openaiDailyRequestLimit number 100 按 UTC 日期持久化的全局每日请求上限
openaiAllowedUserIds string[] 未设置 可选的 Misskey 用户 ID 白名单;未设置时允许所有非 Bot 用户

OpenAI 对话只接受独立命令 openai、ai 或 chat,例如 @ai openai 你好。普通的占卜、骰子、计时器等消息不会因为 Bot 用户名中含有 ai 而被该模块拦截。回复 Bot 的模型答案可继续多轮对话;会话 30 分钟后自动清理。

图片附件仅允许 HTTP(S),默认最多 2 个、每个 5 MiB。下载会拒绝重定向、私网/保留地址和不受支持的图片 MIME 类型。

使用 Ollama 等本地模型

{
  "openaiBaseUrl": "http://localhost:11434/v1",
  "openaiModel": "qwen2.5:7b",
  "openaiApiKey": "ollama"
}

获取 API Key

字体

部分功能需要字体。将字体文件放置在安装目录下,命名为 font.ttf。

记忆

藍使用 LokiJS 内存数据库保存记忆,以 memory.json 持久化到 memoryDir 目录。

测试

npm test                        # 全部测试
npx jest test/openai.ts         # 仅 OpenAI 模块测试
npx jest test/scheduled-posting.ts  # noting / maze 自动发送测试
npx jest test/fixed-time.ts     # 时区工具测试

开源许可证

MIT

Awards

Works on my machine

About

蓝 (Ai) Misskey Bot — OpenAI compatible API fork. Forked from ybw2016v/ai, replacing Gemini/PLaMo with OpenAI-compatible /v1/chat/completions endpoint.

Topics

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages