🎲 AI骰娘4 - SealDice AI插件

  • 让你的骰娘活起来

License
Version

快速开始

  • 下载提示下载插件;
  • 在海豹webui点击上传,重载,刷新浏览器页面;
  • 可用AI大模型开放平台列表一节或自行找到准备使用的大模型,记下url地址、你的API和模型名;
  • 在海豹webui-js插件-插件设置里找到aiplugin4,点击展开,将刚才记下的url地址、API Key填到对应配置项,模型名填入body的model字段;
  • 在插件设置界面找到 非指令消息触发正则表达式 一项,修改为你希望的触发方式;找到 角色设定 一项,修改为你希望AI扮演的角色;
  • 对着你的骰娘输入你设定的 非指令消息触发正则表达式 的对应触发方式,你就可以看到骰娘的回复啦;
  • 如果没有回复,可以自行查看触发日志寻找可能问题,对照常见问题处理解决;
  • 更多详细设置可以修改插件设置界面的配置项,⚙️ 配置手册有详细说明;

🌟 核心特性

AI骰娘4是一款面向TRPG玩家(吗?)的智能对话插件,基于OpenAI兼容API开发。本插件深度整合了海豹骰子核心功能,提供以下核心能力:

  • 智能对话:支持上下文感知的AI对话
  • 多功能集成:内置20+实用功能(属性检定、牌堆抽取、记忆管理等),并且持续更新
  • 图像处理:支持图片识别、表情包管理和盗图功能
  • 权限系统:多维度权限控制体系

🛠️ 完整安装指南

环境要求

  • SealDice v1.4.6+

    • 1.4.6分离部署使用napcat和llonebot协议图片相关功能存在问题,SealDice v1.5.0+ 正常使用
  • 支持的AI API:

    • OpenAI API兼容

下载

  • 通过GitHub下载最新稳定版:下载链接
  • 通过GitHub下载后自编译最新开发版:

    • 安装Node.js和npm
    • git clone https://github.com/error2913/aiplugin4 # 克隆仓库
      npm install # 安装依赖
    - 在dist文件夹中可找到编译好的aiplugin4.js文件
  • 在QQ群中获取

    依赖下载

  • 通过GitHub下载最新版:aitts依赖插件
  • 通过GitHub下载最新版:http依赖插件
  • 通过GitHub下载最新版:AIDrawing依赖插件
  • 在QQ群中获取

    安装

  • 参考海豹手册进行插件上传安装


    ⚙️ 配置手册

    基础

    设置项类型默认值说明
    日志打印方式选项简短是否打印日志,反馈问题建议开启详细
    url地址字符串https://api.deepseek.com/v1/chat/completions大语言模型的请求地址,一般在大模型平台的文档中会写出,或者参考下面列出的场景大模型请求地址
    API Key字符串你的API Key在ai的开放平台中获取,请注意个别开放平台会有多个API Key用于不同情况,请注意选择HTTP调用的API Key,未说明可能没做区分,直接完整复制入
    body模板见下表请求体设置,注意在书写字符串时,使用英文半角双引号。具体参数还请查看自己使用的模型的接口文档
    流式输出后端url字符串http://localhost:3010自行搭建或使用他人提供的后端
    body默认值说明
    "model":"deepseek-chat"模型名,查看接口文档获取
    "max_tokens":70最大token,值越大回复越长
    "stop":null一个 string 或最多包含 16 个 string 的 list,在遇到这些词时,API 将停止生成更多的 token。例如"stop":["\n"],此时AI将会在遇到换行时停止输出
    "stream":false是否流式输出,为true时请配置后端进行中转
    "frequency_penalty":0如果该值为正,那么新 token 会根据其在已有文本中的出现频率受到相应的惩罚,降低模型重复相同内容的可能性
    "presence_penalty":0如果该值为正,那么新 token 会根据其是否已在已有文本中出现受到相应的惩罚,从而增加模型谈论新主题的可能性
    "temperature":1更高的值,如 0.8,会使输出更随机,而更低的值,如 0.2,会使其更加集中和确定。 我们通常建议可以更改这个值或者更改 top_p,但不建议同时对两者进行修改
    "top_p":1作为调节采样温度的替代方案,模型会考虑前 top_p 概率的 token 的结果。所以 0.1 就意味着只有包括在最高 10% 概率中的 token 会被考虑。 我们通常建议修改这个值或者更改 temperature,但不建议同时对两者进行修改

    对话

    设置项类型默认值说明
    角色设定模板太长了不粘贴ai的扮演设定,按照豹语变量$g人工智能插件专用角色设定序号进行选择,序号从0开始,可自行设置自定义回复切换角色设定
    示例对话模板请写点什么,或者删掉这句话顺序为用户和AI回复轮流出现,可用于提供扮演示例,位于上下文最前面,不会被上下文机制删除
    是否在消息内添加前缀布尔true添加消息来源,如 from:土豆
    是否给AI展示数字号码布尔false添加消息来源的数字ID,如 from:土豆(114514)
    是否合并user content布尔false在不支持连续多个role为user的情况下开启,比如 deepseek-reasoner 模型
    存储上下文对话限制轮数整数10出现一次user视作一轮,超过轮数会遗忘除了示例对话之外最早的对话,越长消耗的token越多

    函数调用

    设置项类型默认值说明
    是否开启调用函数功能布尔值true开启后AI可使用函数来进行除了文本对话之外的功能
    是否切换为提示词工程布尔值false当API不支持function calling时开启,将函数调用介绍加入到prompt中
    不允许调用的函数模板填写不允许调用的函数名称,例如:get_time修改后保存并重载js,设置后将不被允许开启,函数名参考上表或对骰娘发送.ai tool 查看
    默认关闭的函数模板ban、renameAI默认关闭对该函数调用,在开启后才能调用的函数,函数名参考上表或对骰娘发送.ai tool 查看
    长期记忆上限整数5AI通过指令记忆信息的条数上限,超过上限会遗忘最早的记忆,越长消耗的token越多
    提供给AI的牌堆名称模板没有的话建议把draw_deck这个函数加入不允许调用提供给AI可用于函数调用的牌堆名称
    ai语音使用的音色选项小新该功能在选择预设音色时,需要安装http依赖插件,且需要可以调用ai语音api版本的napcat/lagrange等。选择自定义音色时,则需要aitts依赖插件和ffmpeg
    本地语音路径模板data/records/钢管落地.mp3如不需要可以不填写,修改完需要重载js。发送语音需要配置ffmpeg到环境变量中

    消息接收与触发

    设置项类型默认值说明
    是否录入指令消息布尔false是否将指令消息写入上下文,指令消息包括指令前缀开头的所有消息,例如指令前缀为.则所有.开头的消息在改选项关闭状态下都不会被AI看到
    是否录入所有骰子发送的消息布尔false若开启,则除了AI返回的文本外,骰点之类的所有骰子发送的消息都会被录入上下文
    非指令触发需要满足的条件字符串1保持原样为可无限制非指令触发,即只要符合你的触发条件,AI就会回复,若需要限制只可在指定群或指定用户非指令触发,使用豹语表达式,例如:\$t群号_RAW=='114514'表示允许群号为114514的群触发AI回复
    非指令消息触发正则表达式模板\\[CQ:at,qq=748569109\\],^正确正确确用于匹配符合特定正则表达式的消息用于强制触发AI回复,示例中第一个为@骰娘,数字部分可改为你骰娘的QQ号,第二个为以"正确正确确"开头的句子触发,正则表达式教程

    回复

    设置项类型默认值说明
    回复是否引用布尔falseAI在回复时是否引用触发的消息
    回复最大字数整数1000防止最大tokens限制不起效导致回复过长
    禁止AI复读布尔false开启后检测到AI返回文本和前一次相似度太高时,尝试再次请求以获得相似度较低的文本
    视作复读的最低相似度浮点数0.8在禁止AI复读开关打开后,高于该相似度时,尝试再次请求以获得相似度较低的文本
    过滤上下文正则表达式模板`<[\\|]from.*?[\\|]?>,^[\s\S]*?`回复加入上下文时,将符合正则表达式的内容删掉,默认为删除AI模仿的消息来源和以包裹的内容删掉
    过滤回复正则表达式模板`<[\\|].*?[\\|]?>,^[\s\S]?,<function_call>[\s\S]?</function_call>`回复输出时,将符合正则表达式的内容删掉,默认为删除AI模仿的消息来源、以包裹的内容和<function_call></function_call>包裹的内容删掉

    图片

    设置项类型默认值说明
    本地图片路径模板data/images/sealdice.png如不需要可以不填写,修改完需要重载js
    图片识别需要满足的条件字符串1保持原样为在所有群中,AI调用识别图片指令可正常使用,若需要限制只可在指定群或指定用户发出的图片可被AI通过图片识别指令识别,使用豹语表达式,例如:\$t群号_RAW=='114514'表示允许在群号为114514的群触发图片识别
    发送图片的概率/%整数100在AI触发回复后随机抽取一张本地或偷取的图片发送的概率
    图片大模型URL字符串https://open.bigmodel.cn/api/paas/v4/chat/completions视觉大模型的请求URL,填写后可使用image_to_text或check_avatar识别图片内容
    图片API key字符串yours视觉大模型的API key
    图片body模板见下表视觉大模型请求体设置
    识别图片时将url转换为base64选项永不解决大模型无法正常获取QQ图床图片的问题,当请求图片报错错误码400图片格式错误,但图片可在浏览器正常访问时,时可尝试修改
    图片最大回复字符数字符串100超过该字符数会自动截断,防止max_tokens不起效
    偷取图片存储上限整数30偷取图片存储上限,每个群聊或私聊单独储存
    body默认值说明
    "model":"glm-4v"模型名,查看接口文档获取
    "max_tokens":20最大token,值越大回复越长
    "stop":null一个 string 或最多包含 16 个 string 的 list,在遇到这些词时,API 将停止生成更多的 token。例如"stop":["\n"],此时AI将会在遇到换行时停止输出
    "stream":false是否流式输出,暂不支持

    💻 完整命令手册

    基础控制命令

    命令使用示例说明
    .ai on --<参数>=<数字>.ai on --c=10 --t=60每收到十条消息触发一次或每60s触发一次开启AI,参数有计数器模式(c),计时器模式(t)和概率模式(p),可同时开启多个模式
    .ai off-关闭AI(仍可通过关键词触发)
    .ai sb-待机模式(仅录入上下文,但不主动发言,只有非指令关键词触发才发言)
    .ai f [assistant/user]-遗忘当前上下文,不加参数为遗忘全部上下文,assistant为遗忘AI调用函数和发言,user为遗忘用户发言和函数返回
    .ai ctxn-查看上下文中的名字
    .ai pr-查看当前群聊权限和触发设定

    工具管理命令

    命令使用示例说明
    .ai tool-列出所有可用工具
    .ai tool help <name>.ai tool help get_time查看指定工具的详细说明和参数需求
    .ai tool [on/off]-开启/关闭全部工具函数
    .ai tool <name> [on/off].ai tool jrrp on开启/关闭指定工具函数
    .ai tool <name>.ai tool jrrp --name=错误 调用一次查看错误今日人品,输出会包括今日人品函数的输出和调用函数返回结果输出试用指定工具函数,会输出调用函数返回信息,多个参数用空格或换行隔开,可使用上下文中名字或QQ号,数字需要引号包裹

    记忆管理命令

    命令使用示例说明
    .ai memo st.ai memo st 西瓜 将自己的设定记忆设定为西瓜修改AI的设定记忆,不能超过20字
    .ai memo clr-清除当前个人所有记忆,骰主可通过@其他人替他人删除
    .ai memo clr group-清除当前群聊记忆,骰主可通过@其他人替他人删除
    .ai memo show-展示当前个人所有记忆,骰主可通过@其他人查看他人记忆
    .ai memo show group-展示当前群聊记忆
    注:个人记忆是跨群的,群聊记忆是群内的,在刚初始化的时候每个人会等概率随机或者“好人”或“坏人”一个设定记忆,可以清除或覆盖,记忆会写入prompt

    图片相关命令

    命令使用示例说明
    .img stl [on/off]-开启/关闭图片盗取功能,开启后会随机偷取群内发送的图片,然后按照配置项设置的概率在触发ai回复后随机抽取一张发送。不带on/off参数为查看当前偷取图片状态和数量
    .img draw [stl/lcl/all].img itt stl 随机抽取一张偷取的图片随机抽取图片(偷取/本地/全部)
    .img f-遗忘图片
    .img itt [图片/ran] [提示词].img itt ran 看看这图里人物是什么 抽取一张盗取的图片,并询问AI是什么人物使用视觉大模型进行一次图片转文字,图片为一张发送的图片,ran为抽取的随机图片(可带提示词)

    管理员命令

    命令使用示例说明
    .ai st.ai st QQ-Group:1234 60设置群1234的权限限制是群主或群主以上,即群主、骰娘白名单、骰主可使用基础控制命令设置群组操作基础控制命令需要的权限等级
    .ai ck.ai ck QQ-Group:1234 查看群1234的权限设置检查指定群或私聊的权限等级需求和触发设定
    .ai prompt-检查当前prompt,需要注意如果打开了将AI命令写入提示词开关,这条输出会很长

    token计数(管理员命令)

    命令使用示例说明
    .ai tk lst-查看有使用记录的模型
    .ai tk sum-查看所有模型的token使用记录总和
    .ai tk all-查看所有模型的token使用记录,分别列出
    .ai tk [y/m] (chart)-查看所有模型今年/这个月的token使用记录,chart为使用图表表示
    .ai tk <模型名称>.ai tk deepseek-v3 查看deepseek-v3的token使用量查看模型的token总使用记录
    .ai tk <模型名称> [y/m] (chart)-查看模型今年/这个月的token使用记录,chart为使用图表表示
    .ai tk clr-清除token使用记录
    .ai tk clr <模型名称>-清除指定模型的token使用记录

    可用工具函数示例

    以下是一些常用的工具函数,可通过.ai tool help <name>查看详细用法:

    函数名描述特殊说明
    add_memory添加记忆
    show_memory查看记忆
    draw_deck抽取牌堆
    face发送表情包
    jrrp查看今日人品
    modu_roll随机抽取COC模组
    modu_search搜索COC模组
    roll_check技能/属性检定
    rename设置群名片
    attr_show展示用户全部属性
    attr_get获取用户指定属性
    attr_set修改用户属性
    ban禁言用户需要http依赖
    whole_ban全员禁言需要http依赖
    get_ban_list查看群内被禁言的用户需要http依赖
    text_to_soundAI文本转语音预设音色需要http依赖,自定义音色需要AITTS依赖和ffmpeg
    poke发送戳一戳需要http依赖
    get_time获取当前时间
    set_timer设置定时器用于触发对话
    show_timer_list查看当前聊天定时器列表
    cancel_timer取消当前聊天指定定时器
    web_search搜索引擎搜索
    image_to_text图片内容识别,可指定特别关注的内容需要设置视觉大模型相关配置项,需要支持QQ图床的视觉大模型或使用中转插件
    text_to_image生成图片需要AIDrawing依赖
    check_avatar查看指定用户头像或群聊头像,可指定特别关注的内容需要设置视觉大模型相关配置项
    san_checkSan值检定
    group_sign发送群打卡需要http依赖
    get_person_info获取用户信息需要http依赖
    record发送本地语音需要配置ffmpeg
    send_msg向指定私聊或群聊发送消息或调用函数
    get_context查看指定私聊或群聊的上下文
    get_list查看当前好友列表或群聊列表需要http依赖
    get_group_member_list查看群聊成员列表需要http依赖
    search_chat搜索好友或群聊需要http依赖
    search_common_group搜索共同群聊需要http依赖
    music_play搜索并播放音乐需要协议端配置音卡签名
    注:部分工具函数需要额外依赖或权限,请在依赖下载一节中获取。

    可用AI大模型开放平台列表

    大模型平台调用url文档地址支持语言大模型支持视觉大模型
    deepseekhttps://api.deepseek.com/chat/completionsdeepseek API文档deepseek-chat,deepseek-reasoner×▲-
    kimihttps://api.moonshot.cn/v1/chat/completionsMoonshot AI 使用手册moonshot-v1-8k,moonshot-v1-32k,moonshot-v1-128k,moonshot-v1-auto-
    百炼大模型https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions大模型服务平台百炼产品文档qwen-max,qwen-plus,qwen-turbo,qwen-long,deepseek-r1×▲,deepseek-v3×qwen-vl-max,qwen-vl-plus
    智谱AIhttps://open.bigmodel.cn/api/paas/v4/chat/completionsBigModel 接口文档glm-4-plus,glm-4-air,glm-4-air-0111,glm-4-airx,glm-4-long,glm-4-flashx,glm-4-flash,glm-zero-preview×,charglm-4×glm-4v-plus-0111,glm-4v-plus,glm-4v,glm-4v-flash
    百度千帆大模型平台https://qianfan.baidubce.com/v2/chat/completions千帆大模型服务与开发平台ModelBuilder文档ernie-4.0-8k▲,ernie-4.0-turbo-8k▲,ernie-3.5-8k▲,deepseek-v3×▲,deepseek-r1×▲deepseek-vl2
    讯飞星火大模型https://spark-api-open.xf-yun.com/v1/chat/completions讯飞开放平台文档中心lite×,generalv3×,pro-128k×,generalv3.5×,max-32k,4.0Ultra
    google AIhttps://generativelanguage.googleapis.com/v1beta/openai/chat/completionsgemini API 文档gemini-2.0-flash,gemini-1.5-flash,gemini-1.5-pro
    openAIhttps://api.openai.com/v1/chat/completionsopenAI API 文档gpt-4o,gpt-4o-mini,o1,o3-mini,gpt-4-turbo,gpt-3.5-turbogpt-4-turbo,gpt-4o,o1,gpt-4o-mini

    注:×为不支持function call。▲为需要开启合并user消息开关。

    视觉模型不一定支持QQ图床识别,可使用中转插件。

    仅列出部分官方的我知道的该插件支持的模型,部分大模型平台同一模型有多个版本并未在上表写出,且更新不及时,存在过期可能,未列出的不一定不能使用,最好到文档自己查看。

    国外大模型网络问题请自行解决。


    📜 开发文档

    项目结构

    aiplugin4/
    ├── src/
    │   ├── config/        # 配置项相关
    │   │   ├── config.ts  # 配置总管理
    │   │   └── config_...  # 各种配置的相应管理
    │   ├── tools/         # 调用函数扩展
    │   │   ├── tool.ts     # 工具总管理
    │   │   └── tool_...     # 各种工具的实现
    │   ├── AI/            # 核心逻辑
    │   │   ├── AI.ts       # 核心AI逻辑
    │   │   ├── context.ts  # 上下文管理
    │   │   ├── memory.ts   # 记忆管理
    │   │   ├── image.ts    # 图片管理
    │   │   └── service.ts  # 服务管理,包括API调用
    │   └── utils/         # 各种工具函数
    └── package.json       # 项目依赖

    添加新功能

  • src/tools/目录下创建新文件,文件命名格式为tool_xxx.ts(也可直接在有关文件内添加新功能,避免文件过多导致难以管理)
  • 实现工具接口,示例:

    import { Tool, ToolInfo, ToolManager } from "./tool";
    
    export function registerSayHi() {
        // 用JSON Schema标准填写tool info,以提供给AI
        const info: ToolInfo = {
            type: "function",
            function: {
                name: "say_hi",
                description: `打招呼`,
                parameters: {
                    type: "object",
                    properties: {
                        arg1: {
                            type: 'string',
                            description: '说点什么'
                        }
                    },
                    required: ['arg1'] // 必需参数
                }
            }
        }
    
        const tool = new Tool(info); // 创建一个新tool
        tool.solve = async (ctx, msg, ai, args) => { // 实现方法,返回字符串提供给AI
            const { arg1 } = args; // 解构获取AI提供的参数
    
            return `你好,${arg1}`;
        }
    
        // 注册到toolMap中
        ToolManager.toolMap[info.function.name] = tool;
    }
  • 注册到工具管理系统,示例:

    // 打开src/tool/tool.ts,导入你写的注册函数
    import { registerSayHi } from "./tool_say_hi"
    
    export class ToolManager {
        // ...
        static registerTool() {
            // ...
            registerSayHi(); // 添加到registerTool函数中
        }
    }

    添加新配置

  • src/config/目录创建文件,文件命名格式为config_xxx.ts(也可直接在有关文件内添加新功能)
  • 定义一个类,实现register静态方法和get静态方法,示例:

    import { ConfigManager } from "./config";
    
    export class NewConfig {
        static ext: seal.ExtInfo; // 配置项对应的扩展信息
    
        static register() {
            NewConfig.ext = ConfigManager.getExt('aiplugin4_999:新的配置'); // 初始化扩展信息
    
            seal.ext.registerBoolConfig(ConfigManager.ext, "对吗?", true, "对的对的");
        }
    
        static get() {
            return {
                isLog: seal.ext.getBoolConfig(ConfigManager.ext, "对吗?")
            }
        }
    }
  • 注册到配置管理系统,示例:

    // 打开src/config/config.ts,导入你写的类
    import { NewConfig } from "./config_new";
    
    export class ConfigManager {
        // ...
        static registerConfig() {
            // ...
            NewConfig.register(); // 添加你的注册函数
        }
        // ..
        static get yourNewConfig() { return this.getCache('yourNewConfig', newConfig.get) } // 添加你的get方法
    }

    版权信息

    本项目采用MIT开源协议,欢迎二次开发。原创作者保留署名权。

    Copyright 2024 错误、白鱼

Permission is hereby granted...


## 致谢

- 海豹骰子开发团队
- 开源社区贡献者

## 📞 技术支持

- GitHub Issues: [问题提交](https://github.com/error2913/aiplugin4/issues)
- QQ交流群: 940049120

> "才、才不是专门给你写的文档呢!只是...只是顺便而已!(///ω///)" —— 正确·改