Metadata-Version: 2.1
Name: nonebot-plugin-aitalk
Version: 3.11.33
Summary: 简单好用的AI聊天插件，支持多API，支持让AI理解图片，发送表情包，合成语音，艾特，戳一戳，禁言等；可配置关键词允许AI主动发言
Home-page: https://github.com/captain-wangrun-cn/nonebot-plugin-aitalk
License: GPL-3.0
Author: WR
Author-email: wangrun114514@foxmail.com
Requires-Python: >=3.9,<4.0
Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.9
Requires-Dist: aiofiles (>=24.1.0,<25.0.0)
Requires-Dist: fish_audio_sdk (>=2025.4.2,<2026.0.0)
Requires-Dist: nonebot-adapter-onebot (>=2.0.0,<3.0.0)
Requires-Dist: nonebot-plugin-localstore (>=0.7.3,<0.8.0)
Requires-Dist: nonebot2 (>=2.2.0,<3.0.0)
Requires-Dist: openai (>=1.0.0,<2.0.0)
Requires-Dist: silk-python (>=0.2.6,<0.3.0)
Project-URL: Repository, https://github.com/captain-wangrun-cn/nonebot-plugin-aitalk
Description-Content-Type: text/markdown

<div align="center">
  <a href="https://v2.nonebot.dev/store"><img src="https://github.com/A-kirami/nonebot-plugin-template/blob/resources/nbp_logo.png" width="180" height="180" alt="NoneBotPluginLogo"></a>
  <img src="https://github.com/WStudioGroup/hifumi-plugins/blob/main/remove.photos-removed-background.png" width="200">
  <br>
  <p><img src="https://github.com/A-kirami/nonebot-plugin-template/blob/resources/NoneBotPlugin.svg" width="240" alt="NoneBotPluginText"></p>
</div>

<div align="center">

# nonebot-plugin-aitalk

_✨ 简单好用的AI聊天插件 ✨_


<a href="./LICENSE">
    <img src="https://img.shields.io/github/license/captain-wangrun-cn/nonebot-plugin-aitalk.svg" alt="license">
</a>
<a href="https://pypi.python.org/pypi/nonebot-plugin-aitalk">
    <img src="https://img.shields.io/pypi/v/nonebot-plugin-aitalk.svg" alt="pypi">
</a>
<img src="https://img.shields.io/badge/python-3.9+-blue.svg" alt="python">

</div>

## 📖 介绍

简单好用的AI聊天插件，支持多API，支持让AI理解图片，发送表情包，合成语音，艾特，禁言，戳一戳等；可配置关键词允许AI主动发言

>[!IMPORTANT]
>写的比较史，欢迎提pr或issue！

## 🆕 特色

### AI可以发的

- 表情包
- 语音（非预设语录，AI想说什么就生成什么）
- 戳一戳
- 艾特
- 群内禁言

### 可以发给AI的 (AI可以理解的)

- 图片/表情包 (需模型支持)
<!--- 联网搜索 (需模型支持)-->

## 💿 安装

<details open>
<summary>使用 nb-cli 安装</summary>
在 nonebot2 项目的根目录下打开命令行, 输入以下指令即可安装

    nb plugin install nonebot-plugin-aitalk

</details>

<details>
<summary>使用包管理器安装</summary>
在 nonebot2 项目的插件目录下, 打开命令行, 根据你使用的包管理器, 输入相应的安装命令

<details>
<summary>pip</summary>

    pip install nonebot-plugin-aitalk
</details>


打开 nonebot2 项目根目录下的 `pyproject.toml` 文件, 在 `[tool.nonebot]` 部分追加写入

    plugins = ["nonebot_plugin_aitalk"]

</details>

## ⚙️ 配置

在 nonebot2 项目的`.env`文件中添加下表中的必填配置

### 必填项

|         配置项         | 类型  | 必填  | 默认值 |                说明                |
| :--------------------: | :---: | :---: | :----: | :--------------------------------: |
|    aitalk_api_list     | list  |  是   |  [ ]   | API列表，支持多个API，格式请往下看 |
| aitalk_available_memes | list  |  是   |  [ ]   |   AI可以发送的表情包，格式请往下   |

<details>
<summary>aitalk_api_list（api列表）格式</summary>
  
```json
[
{
    "name": "向用户展示的模型名称",
    "api_key": "你的api key",
    "model_name": "请求api用的模型名称",
    "api_url": "api接口地址",
    "image_input": 是否支持图片输入，适用于Qwen2.5-vl等多模态模型,默认为false
    "send_thinking": 当有思维链时是否发送,默认为false
    "description": "模型描述，用于展示给用户(非必填)"
},
{
    "name": "向用户展示的模型名称2",
    "api_key": "你的api key2",
    "model_name": "请求api用的模型名称2",
    "api_url": "api接口地址2"
}
]
```

</details>

<details>
<summary>aitalk_available_memes（AI可以发送的表情包）格式</summary>

```json
[
{
    "url": "图片地址，支持链接或本地路径。⚠️⚠️注意！如果是windows系统的本地路径，请将路径中的\换成/，可以看下面的配置示例⚠️⚠️",
    "desc": "图片描述，告诉AI这张表情包是什么内容，用于什么场景等等"
},
{
    "url": "图片地址2",
    "desc": "图片描述2"
}
]
```

</details>

### 选填项

#### 模型
|                   配置项                    |   类型    | 必填  |                                            默认值                                            |                                                                  说明                                                                   |
| :-----------------------------------------: | :-------: | :---: | :------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------: |
|           aitalk_default_model            |   str    |  否   |                                             ""                                             |                                                      默认选择的模型                                                       |


#### 提示词
|                   配置项                    |   类型    | 必填  |                                            默认值                                            |                                                                  说明                                                                   |
| :-----------------------------------------: | :-------: | :---: | :------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------: |
|            aitalk_default_prompt            |    str    |  否   | "你的回答应该尽量简洁、幽默、可以使用一些语气词、颜文字。你应该拒绝回答任何政治相关的问题。" |                                                               默认提示词                                                                |
|         aitalk_disable_busy_prompts         |   bool    |  否   |                                            False                                             |                                    是否关闭诸如“不要着急哦！”或“你的操作太频繁了哦！”之类的提示信息                                     |
|         aitalk_default_prompt_file          |    str    |  否   |                                              ""                                              |                         默认提示词文件路径，与提示词二选一，优先使用文件。请注意将windows系统路径中的\替换成\\                          |
|          aitalk_group_prompts_dir           |    str    |  否   |                               "./aitalk_config/group_prompts"                                | 分群提示词文件路径，在该路径下存放"群号.txt"文件，(例如: ./aitalk_config/group_prompts/12345.txt)。请注意将windows系统路径中的\替换成\\ |

#### 语音合成
|                   配置项                    |   类型    | 必填  |                                            默认值                                            |                                                                  说明                                                                   |
| :-----------------------------------------: | :-------: | :---: | :------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------: |
|             aitalk_tts_enabled              |   bool    |  否   |                                            false                                             |                                                            是否开启语音合成                                                             |
|              aitalk_tts_config              |   bool    |  否   |                                            false                                             |                                                       语音合成配置，详细请看下方                                                        |

<details>
<summary>aitalk_tts_config（语音合成配置）格式</summary>
  
```json
{
    "api_url": "API地址，若默认地址无法访问可以自己搭建一个反向代理",
    "api_key": "API密钥",
    "reference_id": "音色id"
}
```
- 前往[FishAudio](https://fish.audio/zh-CN/go-api/billing/)注册登录，并充值（建议先一美元）
- 创建一个API key并填入配置项![api_key](imgs/QQ20250507-133925.png)
- 点击上面的`发现`，寻找你想要的音色（或者有能力的自己合成），点进去
- 复制图片中地址的红圈部分，该部分就是id，填入配置即可![id](imgs/QQ20250507-134145.png)

</details>

#### 消息相关
|                   配置项                    |   类型    | 必填  |                                            默认值                                            |                                                                  说明                                                                   |
| :-----------------------------------------: | :-------: | :---: | :------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------: |
|           aitalk_reply_when_meme            |   bool    |  否   |                                             true                                             |                                                      当只有表情包时，是否回复消息                                                       |
|                aitalk_reply                 |   bool    |  否   |                                             true                                             |                                                              是否回复消息                                                               |
|        aitalk_message_send_delay_min        |   float   |  否   |                                             0.2                                              |                                         发送多条消息时，每条之间的最小延迟（秒），设为0则不延迟                                         |
|        aitalk_message_send_delay_max        |   float   |  否   |                                             1.2                                              |                                         发送多条消息时，每条之间的最大延迟（秒），设为0则不延迟                                         |
|     aitalk_active_reply_context_timeout     |    int    |  否   |                                             300                                              |                                                机器人主动回复后，上下文的有效时间（秒）                                                 |
| aitalk_active_reply_max_unrelated_followups |    int    |  否   |                                              3                                               |                      在主动回复上下文中，AI连续判断N次与追问无关后，关闭本次主动回复会话 (0表示不启用此功能)（秒）                      |
|      aitalk_group_active_reply_configs      |   Dict    |  否   |                                              {}                                              |                                分群独立主动回复配置。键为群号字符串，值为该群的特定配置,详见下方配置示例                                |
|         aitalk_active_reply_enabled         |   bool    |  否   |                                            False                                             |                                                          是否启用主动回复功能                                                           |


#### 其他
|                   配置项                    |   类型    | 必填  |                                            默认值                                            |                                                                  说明                                                                   |
| :-----------------------------------------: | :-------: | :---: | :------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------: |
|            aitalk_command_start             |    str    |  否   |                                              ""                                              |                                    对话触发前缀，例如“/对话”，类似on_command，为空时直接艾特即可触发                                    |
|          aitalk_completion_config           |   list    |  否   |                                             [ ]                                              |                                                         生成配置，格式请往下看                                                          |
|           aitalk_max_split_length           |    int    |  否   |                                              5                                               |                             最大分割长度，将会在prompt中告诉ai，回复的消息数量不要大于这个值，可能不起作用                              |
|          aitalk_max_context_length          |    int    |  否   |                                              20                                              |                          最长上下文消息数量，超过这个数量时，将会逐个抛弃最早的一条消息。这个数值包括设定消息                           |
|           aitalk_save_user_config           |   bool    |  否   |                                             true                                             |                               是否保存用户配置，关闭nonebot时将会保存用户所选模型，对话内容等，启动时读取                               |
|          aitalk_default_available           |   bool    |  否   |                                             true                                             |                                           是否默认允许群聊使用，为false时需要手动使用指令开启                                           |
|      aitalk_default_available_private       |   bool    |  否   |                                             true                                             |                                           是否默认允许私聊使用，为false时需要手动使用指令开启                                           |
|               aitalk_chat_cd                |    int    |  否   |                                              5                                               |                                                             聊天cd，单位秒                                                              |
|        aitalk_active_reply_keywords         | list[str] |  否   |                                              []                                              |                                        主动回复的触发关键字列表, 例如 '["问题", "请问", "大佬"]'                                        |
|       aitalk_active_reply_probability       |   float   |  否   |                                             0.3                                              |                                              满足关键字后，触发主动回复的概率 (0.0 到 1.0)                                              |
| aitalk_active_reply_no_keyword_probability  |   float   |  否   |                                             0.05                                             |                                    未满足关键字时，触发主动回复的概率 (0.0 到 1.0)，建议设置较低的值                                    |

<details>
<summary>aitalk_completion_config（生成配置）格式</summary>

```json
{
    "max_token": 1024,
    "temperature": 0.7
    "top_p": 0.9
}
```

</details>

## ⚙️ 配置示例

<details>
<summary>env配置示例</summary>

```
aitalk_default_model = "deepseekr1"
aitalk_api_list = '
[
{
    "name": "deepseekr1",
    "api_key": "sk-1145141919810",
    "model_name": "deepseek-ai/DeepSeek-R1",
    "api_url": "https://api.siliconflow.cn/v1",
    "send_thinking": true
},
{
    "name": "gemma-27b",
    "api_key": "sk-1145141919810",
    "model_name": "google/gemma-2-27b-it",
    "api_url": "https://api.siliconflow.cn/v1"
}
]
'
aitalk_available_memes = '
[
{
    "url": "D:/bots/imgs/1.png",
    "desc": "很抱歉伤害到你"
},
{
    "url": "D:/bots/imgs/3.png",
    "desc": "啊哈哈...（感到尴尬）"
}
]
'

aitalk_default_prompt_file = "D:\\prompt\\日富美.txt"
aitalk_group_prompts_dir = "./aitalk_config/group_prompts"

aitalk_tts_enabled = true
aitalk_tts_config = '
{
    "api_url": "https://api.fish.audio",
    "api_key": "114514919810",
    "reference_id": "fee77b5adcb840178e9596514d713a3b"
}
'

aitalk_message_send_delay_min = 0.3
aitalk_message_send_delay_max = 1.2

aitalk_active_reply_enabled = true
aitalk_active_reply_keywords = '["问题","请问","大佬","咋弄","咋搞","怎么","解压密码"]'
aitalk_active_reply_probability = 1.0
aitalk_active_reply_no_keyword_probability = 0.05
aitalk_group_active_reply_configs = '
{
    "123456": {
        "keywords": ["临时触发词temp"],
        "probability": 1.0,
        "no_keyword_probability": 0.05
    },
    "654321": {
        "keywords": ["问题","请问","大佬","咋弄","咋搞","怎么"],
        "probability": 1.0,
        "no_keyword_probability": 0.05
    }
}'

aitalk_disable_busy_prompts = Ture
```

#### 多群自定义提示词参考配置
<img src="imgs/Snipaste_2025-05-06_23-17-39.png">

</details>


## 🎉 使用
### 指令表
|     指令     |  权限   | 需要@ | 范围  |        说明        |
| :----------: | :-----: | :---: | :---: | :----------------: |
|   @机器人    |  群聊   |  是   | 群聊  | 艾特机器人即可聊天 |
|   模型选择   |  群聊   |  否   | 群聊  |      选择模型      |
| ai对话 开启  | 管理员+ |  否   | 群聊  |   开启本群ai对话   |
| ai对话 关闭  | 管理员+ |  否   | 群聊  |   关闭本群ai对话   |
| 清空聊天记录 |  群聊   |  否   | 群聊  |    清空对话记录    |
### 效果图
<img src="imgs/QQ20250222-232704.png">
<img src="imgs/QQ20250222-232730.png">
<img src="imgs/QQ20250222-232813.png">
<img src="imgs/QQ20250507-134732.png">
她不肯说qwq


### 🍟参考
[nonebot-plugin-llmchat](https://github.com/FuQuan233/nonebot-plugin-llmchat) 参考了部分代码以及prompt


## 贡献者
<a href="https://github.com/captain-wangrun-cn/nonebot-plugin-aitalk/graphs/contributors">
  <img src="https://contrib.rocks/image?repo=captain-wangrun-cn/nonebot-plugin-aitalk" />
</a>


## 📃 更新日志
### 3.11.33（2025.08.15）
- 🐛移除无用依赖
### 3.11.32（2025.06.17）
- 🐛修复了语音配置报错问题
### 3.11.31（2025.06.11）
- 🐛修复了起始符配置项不生效的问题[#20](https://github.com/captain-wangrun-cn/nonebot-plugin-aitalk/issues/20)
### 3.11.30（2025.06.10）
- 🐛删除无用依赖
- 🐛修复某些API下的多模态模型出现Error Code 400[#19](https://github.com/captain-wangrun-cn/nonebot-plugin-aitalk/issues/19)
### 3.11.29（2025.06.10）
- 🐛修复某些API下的多模态模型出现Error Code 400[#19](https://github.com/captain-wangrun-cn/nonebot-plugin-aitalk/issues/19)
### 3.11.28（2025.05.25）
- 🆕新增默认模型配置项


<details>
<summary>之前更新</summary>

### 3.10.28（2025.05.21）
- 🐛修复“无需回复”BUG[PR#16](https://github.com/captain-wangrun-cn/nonebot-plugin-aitalk/pull/16)
- 🆕允许关闭提示[PR#16](https://github.com/captain-wangrun-cn/nonebot-plugin-aitalk/pull/16)
- 🐛修复某些情况下QQ图片因SSL无法下载的问题
### 3.9.26（2025.05.12）
- 🆕更新多群配置主动触发关键词
- 🔧增加对AI返回的JSON字符串的解析的鲁棒性
- [PR#15](https://github.com/captain-wangrun-cn/nonebot-plugin-aitalk/pull/15)
### 3.8.25（2025.05.11）
- 🆕支持读取引用消息中的文本
- 🆕增加配置，允许AI在回复多条消息时增加随机延迟
- 🆕增加配置，允许在检测到关键词时询问AI，由AI自主决定是否需要主动发言回复用户。
- 🆕增加独立的JSON修复功能，用于在主聊天AI返回的JSON格式错误后，尝试使用独立对话AI自动修复该JSON格式。
- 🔧更新README.md中的配置项
- [PR#14](https://github.com/captain-wangrun-cn/nonebot-plugin-aitalk/pull/14)
### 3.4.24（2025.05.08）
- 🐛修复戳一戳失败的问题[PR#13](https://github.com/captain-wangrun-cn/nonebot-plugin-aitalk/pull/13)
### 3.5.23（2025.05.07）
- 🆕图片输入支持引用带有图片的消息[PR#12](https://github.com/captain-wangrun-cn/nonebot-plugin-aitalk/pull/12)
- 🆕支持多图输入[PR#12](https://github.com/captain-wangrun-cn/nonebot-plugin-aitalk/pull/12)
- 🔧添加了一些请求时的异常处理
- 🐛修复README中配置不完全
### 3.4.22（2025.05.07）
- 🆕新增语音合成功能
- 🔧优化README
### 2.4.21（2025.05.07）
- 🆕新增分群不同提示词功能
- 🐛其他中量代码优化[PR#11]
- (https://github.com/captain-wangrun-cn/nonebot-plugin-aitalk/pull/11)
### 2.3.20（2025.04.01）
- 🐛尝试修复思维链问题(#10)(https://github.com/captain-wangrun-cn/nonebot-plugin-aitalk/issues/10)
- 🆕添加了模型描述，选择模型时发送给用户
### 2.3.19（2025.03.11）
- 🐛修复Q群管家检测BUG
### 2.3.18（2025.03.07）
- 🐛修复思维链输出
### 2.3.17（2025.03.07）
- 🐛修复超出最长上下文数量时的BUG
- 🆕增加禁言用户的功能[PR#8](https://github.com/captain-wangrun-cn/nonebot-plugin-aitalk/pull/8)
### 2.2.16（2025.03.06）
- 🐛修复私聊开关BUG
### 2.2.15（2025.03.05）
- 🆕支持输出思维链(不推荐开启，思维可能错乱)
- 🔧优化prompt
- 🐛再次修复读取“是否回复”配置项的BUG，并测试通过[PR#5](https://github.com/captain-wangrun-cn/nonebot-plugin-aitalk/pull/5)
### 2.1.14（2025.03.04）
- 🐛修复生成失败后队列未移除BUG
### 2.1.13（2025.03.04）
- 🐛修复路径BUG和配置读取BUG[PR#4](https://github.com/captain-wangrun-cn/nonebot-plugin-aitalk/pull/4)
### 2.1.12（2025.03.04）
- 🆕支持让AI理解图片（图片输入）
- 🐛优化代码
- 🆕更改群聊聊天,支持管理员设置群内模型[#1](https://github.com/captain-wangrun-cn/nonebot-plugin-aitalk/issues/1)
- 🐛修复连续对话问题[#2](https://github.com/captain-wangrun-cn/nonebot-plugin-aitalk/issues/2)
### 1.0.10（2025.03.02）
- 🐛修复了设置输入状态的问题
### 1.0.9（2025.02.28）
- 🐛修复了私聊聊天的一些问题
### 1.0.8（2025.02.28）
- 🆕添加了私聊聊天支持
### 1.0.7（2025.02.25）
- 🐛更改data.py
### 1.0.6（2025.02.23）
- 😡排除Q群管家
### 1.0.5（2025.02.23）
- 🐛修复了表情包链接问题
### 1.0.4（2025.02.23）
- 🐛修复一些问题,更改README
### 1.0.3（2025.02.23）
- ⬇️修复依赖问题
### 1.0.2（2025.02.23）
- 🐛修复表情包本地路径问题
### 1.0.1（2025.02.22）
- 📝更新README
### 1.0.0（2025.02.22）
- 🎉发布

</details>

