doc: 更换VitePress后的初步内容

This commit is contained in:
lazy
2024-08-28 00:50:44 +08:00
parent f7d7dab296
commit d1698186e1
128 changed files with 3490 additions and 6886 deletions
+165
View File
@@ -0,0 +1,165 @@
import { defineConfig } from "vitepress";
// https://vitepress.dev/reference/site-config
export default defineConfig({
title: "QChatGPT 文档",
description:
"😎高稳定性、🧩支持扩展、🦄多模态的 ChatGPT QQ / QQ频道 / One Bot 机器人🤖 | 支持 OpenAI GPT、GPT 4o、Claude、Gemini Pro、DeepSeek、Moonshot(Kimi)、gpt4free、One API、Ollama 的 QQ / QQ频道 / OneBot 机器人 / Agent 平台",
themeConfig: {
// https://vitepress.dev/reference/default-theme-config
logo: "/assets/icon/chrome-192.png",
nav: [
{ text: "首页", link: "/" },
{ text: "概述", link: "/insight/intro" },
{ text: "部署", link: "/deploy/" },
],
sidebar: [
{
text: "概述",
items: [
{ text: "项目介绍", link: "/insight/intro" },
{ text: "新手指引", link: "/insight/guide" },
],
},
{
text: "部署",
link: "/deploy/",
items: [
{
text: "部署 QChatGPT",
collapsed: true,
items: [
{ text: "手动部署", link: "/deploy/qchatgpt/manual" },
{ text: "Dokcer部署", link: "/deploy/qchatgpt/docker" },
],
},
{
text: "部署消息平台",
collapsed: true,
link: "/deploy/platforms/",
items: [
{
text: "aiocqhttp(推荐)",
collapsed: true,
link: "/deploy/platforms/aiocqhttp/",
items: [
{
text: "Lagrange",
link: "/deploy/platforms/aiocqhttp/lagrange",
},
{
text: "NapCat",
link: "/deploy/platforms/aiocqhttp/napcat",
},
{
text: "llonebot",
link: "/deploy/platforms/aiocqhttp/llonebot",
},
{
text: "shamrock",
link: "/deploy/platforms/aiocqhttp/shamrock",
},
],
},
{
text: "mirai",
link: "/deploy/platforms/mirai",
},
{
text: "go-cqhttp",
link: "/deploy/platforms/gocq",
},
{
text: "QQ官方",
link: "/deploy/platforms/official",
},
],
},
{ text: "填写配置信息", link: "/deploy/quick-config/config" },
],
},
{
text: "使用",
items: [
{ text: "命令用法", link: "/usage/command" },
{ text: "插件列表", link: "/usage/plugin-list" },
{ text: "常见问题", link: "/usage/faq" },
],
},
{
text: "配置",
items: [
{
text: "功能配置",
collapsed: true,
items: [
{ text: "platform.json", link: "/config/function/platform" },
{ text: "pipeline.json", link: "/config/function/pipeline" },
{ text: "provider.json", link: "/config/function/provider" },
{ text: "command.json", link: "/config/function/command" },
{ text: "system.json", link: "/config/function/system" },
],
},
{
text: "元数据配置",
collapsed: true,
items: [
{
text: "敏感词sensitive-words.json",
link: "/config/metadata/adapter-qq-botpy",
},
{
text: "模型列表llm-models.json",
link: "/config/metadata/llm-models",
},
{
text: "qq-botpy ID 映射 adapter-qq-botpy.json",
link: "/config/metadata/sensitive-words",
},
],
},
],
},
{
text: "开发",
collapsed: true,
items: [
{ text: "技术信息", link: "/develop/tech-info" },
{ text: "插件介绍", link: "/develop/plugin-intro" },
{ text: "插件开发", link: "/develop/plugin-dev" },
{ text: "组件拓展", link: "/develop/extension" },
{ text: "API参考", link: "/develop/api-ref" },
],
},
{
text: "规模化和商用",
collapsed: true,
link: "/tob/",
items: [
{ text: "消息平台误导性", link: "/tob/platform" },
{ text: "AI内容合规性", link: "/tob/provider" },
{ text: "咨询方式", link: "/tob/contact" },
],
},
],
// 编辑链接
editLink: {
pattern: "https://github.com/vuejs/vitepress/edit/main/docs/:path",
},
// 本地搜索
search: {
provider: 'local'
},
// 导航栏的社交图标
socialLinks: [
{ icon: "github", link: "https://github.com/the-lazy-me/QChatGPT-Wiki" },
],
},
// 最后更新时间
lastUpdated: true,
});
+6
View File
@@ -0,0 +1,6 @@
/* .vitepress/theme/custom.css */
:root {
/* 自定义主页的hero部分的 name 的字体颜色 */
--vp-home-hero-name-color: transparent;
--vp-home-hero-name-background: -webkit-linear-gradient(120deg, #bd34fe, #41d1ff);
}
+5
View File
@@ -0,0 +1,5 @@
// .vitepress/theme/index.ts
import DefaultTheme from 'vitepress/theme'
import './custom.css'
export default DefaultTheme
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 217 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 246 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 26 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 9.8 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200" class="icon" viewBox="0 0 1024 1024"><path fill="#FDD7AD" d="M512 0 335.448 88.272l-70.616 35.312-70.624 35.312-176.552 88.28v529.648L512 1024l494.344-247.176V247.176z"/><path fill="#CBB292" d="m759.176 370.76-70.624 35.304-494.344-247.168 70.624-35.312zM512 494.344V1024L17.656 776.824V247.176z"/><path fill="#7F6E5D" d="M1006.344 247.168v529.656L512 1024V494.344l176.552-88.28v70.624l141.24-70.624v-70.616z"/><path fill="#7F5B53" d="M829.792 335.448v70.624L688.56 476.68v-70.624z"/><path fill="#CBB292" d="m829.792 335.448-70.624 35.312-494.344-247.176 70.624-35.312z"/><path fill="#2C3E50" d="m682.52 550.32 157.032-78.512a17.656 17.656 0 0 1 25.552 15.792v9.32a52.96 52.96 0 0 1-29.28 47.376L678.8 622.8a17.656 17.656 0 0 1-25.552-15.792v-9.312a52.96 52.96 0 0 1 29.28-47.376z"/></svg>

After

Width:  |  Height:  |  Size: 854 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 215 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 215 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 268 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1024" height="1024"><defs><linearGradient id="a" x1="522.593" x2="522.593" y1="-70.302" y2="-335.937" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#fe5d5a" stop-opacity=".1"/><stop offset=".908" stop-color="#ef1220" stop-opacity=".5"/></linearGradient><linearGradient id="b" x1="107.12" x2="935.038" y1="-373.67" y2="-373.67" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#ff5e59"/><stop offset="1" stop-color="#f01422"/></linearGradient><linearGradient id="c" x1="519.405" x2="519.405" y1="-195.547" y2="-726.816" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#ffe2e2"/><stop offset=".888" stop-color="#ff8e8e"/></linearGradient><linearGradient id="d" x1="191.5" x2="483.9" y1="-564.9" y2="-564.9" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#e92700" stop-opacity=".3"/><stop offset=".013" stop-color="#ef1220" stop-opacity=".2"/></linearGradient><linearGradient id="e" x1="403.502" x2="253.121" y1="-847.32" y2="-586.853" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#ff5e59"/><stop offset=".201" stop-color="#f01422"/></linearGradient><linearGradient id="f" x1="330.485" x2="330.485" y1="-801.787" y2="-625.789" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#ff5e59"/><stop offset=".201" stop-color="#f01422"/></linearGradient><linearGradient id="g" x1="397.351" x2="256.845" y1="-647.231" y2="-890.596" gradientUnits="userSpaceOnUse" spreadMethod="pad"><stop offset="0" stop-color="#ffa6a6"/><stop offset=".908" stop-color="#ff6b5d"/></linearGradient></defs><path fill="url(#a)" d="M501.2 662.3 327.6 763.8c-13.9 8.1-14.2 28.1-.5 36.7l179.1 97.7c10.9 5.9 24.1 5.9 34.9-.1l177-97.9c13.6-8.5 13.4-28.3-.3-36.5l-168.4-101c-14.8-9-33.3-9.1-48.2-.4Z"/><path fill="#f63037" d="m110.2 525.7-3.1 77.6 57.5 18.5L184 519.4Z"/><path fill="url(#b)" d="m476.6 363.5-328 154.6c-21 42.7-55.4 65.4-35.5 103.5 4.2 8 9.4 14.4 15.4 18.1l358.2 195.5c21.8 11.9 48.1 11.8 69.8-.2l354-195.8c27.2-16.9 34.8-90.3 7.3-106.8L573 364.1c-29.7-17.8-66.6-18-96.4-.6Z"/><path fill="url(#c)" d="M476.6 298.7 129.4 501.6c-27.8 16.3-28.4 56.3-1 73.3l358.2 195.5c21.8 11.9 48.1 11.8 69.8-.2l354-195.8c27.2-16.9 26.9-56.6-.6-73.1L573 299.3c-29.7-17.8-66.6-18-96.4-.6Z"/><path fill="#ff8989" fill-opacity=".31" d="m481.2 387.8 39.4 123.4c1.1 3.4 4 6 7.6 6.6l173.4 30.4-33-118.3c-.9-3.3-3.6-5.8-7-6.5l-180.4-35.6ZM327 499.2l40.4 101.1L496.7 525c2.5-1.5 3.7-4.5 2.7-7.3l-36-106.8-127.6 65c-8.6 4.3-12.4 14.4-8.8 23.3ZM523.8 540.5l-140.3 77.2L567.2 659c3.2.7 6.6.1 9.3-1.6l134.6-85-174.7-33.8c-4.3-1-8.7-.3-12.6 1.9Z"/><path fill="url(#d)" d="M483.9 406.1c0 35.46-65.46 64.2-146.2 64.2s-146.2-28.74-146.2-64.2c0-35.46 65.46-64.2 146.2-64.2s146.2 28.74 146.2 64.2Z"/><path fill="url(#e)" d="m254.2 188.4-123 83.1c-1.8 1.3-2.6 3.6-1.8 5.7l39.1 110.6c.6 1.7 2 2.9 3.8 3.2l221.8 40.5c1.3.3 2.7-.1 3.7-.8l131.7-93.6c1.9-1.4 2.6-3.9 1.7-6.1l-49.4-107c-.6-1.5-2.1-2.6-3.7-2.8l-220.3-33.5c-1.3-.2-2.6.1-3.6.7Z"/><path fill="url(#f)" d="m528.6 274.5 3 59.1-205 65.6-177.2-72.7-20-49.2 1.9-54.1Z"/><path fill="url(#g)" d="m250.6 138-112.3 76c-6 4.1-8.5 11.7-6.1 18.5l34.2 96.6c1.9 5.4 6.6 9.3 12.1 10.4l211 38.5c4.3.7 8.6-.2 12.1-2.7l120.5-85.5c6.3-4.4 8.4-12.7 5.3-19.7l-43.1-93.5c-2.2-4.9-6.8-8.3-12.1-9.1L262 135.6c-4-.7-8 .2-11.4 2.4Z"/><path fill="#fff" d="m419.8 252.8-79-11-29-57.7c-3.8-7.6-13.2-10.7-20.8-6.9-7.6 3.8-10.7 13.2-6.9 20.8l26.6 52.9-61.8 42.2c-7.1 4.8-8.9 14.5-4.1 21.5 3 4.4 7.9 6.8 12.8 6.8 3 0 6-.9 8.7-2.7l68-46.4 81.1 11.2c.7.1 1.4.1 2.1.1 7.6 0 14.3-5.6 15.3-13.4 1.4-8.4-4.5-16.2-13-17.4Z"/></svg>

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 KiB

+1
View File
@@ -0,0 +1 @@
<svg width="98" height="96" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M48.854 0C21.839 0 0 22 0 49.217c0 21.756 13.993 40.172 33.405 46.69 2.427.49 3.316-1.059 3.316-2.362 0-1.141-.08-5.052-.08-9.127-13.59 2.934-16.42-5.867-16.42-5.867-2.184-5.704-5.42-7.17-5.42-7.17-4.448-3.015.324-3.015.324-3.015 4.934.326 7.523 5.052 7.523 5.052 4.367 7.496 11.404 5.378 14.235 4.074.404-3.178 1.699-5.378 3.074-6.6-10.839-1.141-22.243-5.378-22.243-24.283 0-5.378 1.94-9.778 5.014-13.2-.485-1.222-2.184-6.275.486-13.038 0 0 4.125-1.304 13.426 5.052a46.97 46.97 0 0 1 12.214-1.63c4.125 0 8.33.571 12.213 1.63 9.302-6.356 13.427-5.052 13.427-5.052 2.67 6.763.97 11.816.485 13.038 3.155 3.422 5.015 7.822 5.015 13.2 0 18.905-11.404 23.06-22.324 24.283 1.78 1.548 3.316 4.481 3.316 9.126 0 6.6-.08 11.897-.08 13.526 0 1.304.89 2.853 3.316 2.364 19.412-6.52 33.405-24.935 33.405-46.691C97.707 22 75.788 0 48.854 0z" fill="#24292f"/></svg>

After

Width:  |  Height:  |  Size: 963 B

+1
View File
@@ -0,0 +1 @@
<svg width="98" height="96" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M48.854 0C21.839 0 0 22 0 49.217c0 21.756 13.993 40.172 33.405 46.69 2.427.49 3.316-1.059 3.316-2.362 0-1.141-.08-5.052-.08-9.127-13.59 2.934-16.42-5.867-16.42-5.867-2.184-5.704-5.42-7.17-5.42-7.17-4.448-3.015.324-3.015.324-3.015 4.934.326 7.523 5.052 7.523 5.052 4.367 7.496 11.404 5.378 14.235 4.074.404-3.178 1.699-5.378 3.074-6.6-10.839-1.141-22.243-5.378-22.243-24.283 0-5.378 1.94-9.778 5.014-13.2-.485-1.222-2.184-6.275.486-13.038 0 0 4.125-1.304 13.426 5.052a46.97 46.97 0 0 1 12.214-1.63c4.125 0 8.33.571 12.213 1.63 9.302-6.356 13.427-5.052 13.427-5.052 2.67 6.763.97 11.816.485 13.038 3.155 3.422 5.015 7.822 5.015 13.2 0 18.905-11.404 23.06-22.324 24.283 1.78 1.548 3.316 4.481 3.316 9.126 0 6.6-.08 11.897-.08 13.526 0 1.304.89 2.853 3.316 2.364 19.412-6.52 33.405-24.935 33.405-46.691C97.707 22 75.788 0 48.854 0z" fill="#fff"/></svg>

After

Width:  |  Height:  |  Size: 960 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 691 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200" class="icon" viewBox="0 0 1536 1024"><path fill="#1296db" d="M1425.067.256H110.933A110.933 110.933 0 0 0 0 110.848v723.627a110.933 110.933 0 0 0 110.933 110.933h1314.39c61.269 0 110.933-49.75 110.677-110.677V110.848A110.933 110.933 0 0 0 1425.067.256z" class="selected" data-spm-anchor-id="a313x.7781069.0.i4"/><path fill="#FFF" d="M664.747 723.797V435.883L517.12 620.373l-147.456-184.49v288l-148.053-67.158V221.781h147.626l147.627 184.576 147.541-184.576h147.627v565.76z"/><path d="M1024 0h426.667A85.333 85.333 0 0 1 1536 85.333v768a85.333 85.333 0 0 1-85.333 85.334H1024V0z" opacity=".1"/><path fill="#FFF" d="m1256.96 731.307-170.667-216.491h113.75V304.64h113.749v210.176h113.835z" opacity=".5"/></svg>

After

Width:  |  Height:  |  Size: 771 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 167 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 196 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 218 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 168 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

+42
View File
@@ -0,0 +1,42 @@
# command.json 配置项
:::info 目录
[[toc]]
:::
`data/config/command.json` 中配置命令相关的配置项。
## 命令权限 privilege
设置每个命令的权限配置
普通用户权限级别为 1,管理员(`system.json`中设置的)权限级别为 2。
在这里设置每个命令的最低权限级别,若设置为1,则用户和管理员均可用,若为2,则仅管理员可用
需要设置子命令,以点号间隔,如`"plugin.on"` 示例:
```json
{
"plugin": 1,
"plugin.on": 2
}
```
意思是 plugin 命令的最低权限级别为 1,plugin.on 命令的最低权限级别为 2。 每个命令都有默认的权限级别
若不设置,则使用默认的级别。在`pkg/command/operators`里每个命令类有默认的权限级别
## 命令前缀 command-prefix
设置命令前缀。以数组形式设置,程序将前缀符合设置的消息视为命令(群内需要符合群响应规则)。
如下示例将设置命令前缀为`!`、`!`、`#`:
```json
"command-prefix": [
"!",
"!",
"#"
]
```
+199
View File
@@ -0,0 +1,199 @@
# pipeline.json 配置项
:::info 目录
[[toc]]
:::
`data/config/pipeline.json` 配置程序处理一个请求的过程中的操作流程,平台适配器获取到消息事件之后,发送给pipeline排队进行处理。可以设置黑白名单、群响应规则、是否检查传入消息、传入消息忽略规则、是否检查敏感词、百度云内容审核配置、传入消息长度设置、限速配置等功能。
## 访问控制 access-control
```json
"access-control":{
"mode": "blacklist",
"blacklist": [],
"whitelist": []
},
```
`mode`:设置模式白名单 `whitelist`(仅处理`whitelist`列表中的会话的消息)或黑名单 `blacklist`(忽略`blacklist`列表中的会话的消息)
`blacklist`:格式`{type}_{id}`,示例:`"blacklist": ["group_12345678","person_12341234"],`
`whitelist`:格式`{type}_{id}`,示例:`"whitelist": ["group_12345678","person_12341234"]`
## 群消息响应规则 respond-rules
仅处理`access-control`通过的会话的消息,其中可含有多个key,若要对特定群设置响应规则,则以群号作为键。未特指的群,将使用 default 中的响应规则
```json
"respond-rules": {
"default": {
"at": true,
"prefix": [
"/ai", "!ai", "!ai", "ai"
],
"regexp": [],
"random": 0.0
}
},
```
`at`:`true`或`false`,设置@响应
`prefix`:设置响应前缀
`regexp`:正则匹配
`random`:随机匹配,为1时所有消息都响应
你可以为单个群聊设置特定的响应规则,例如
```json
"respond-rules": {
"default": {
"at": true,
"prefix": [
"/ai", "!ai", "!ai", "ai"
],
"regexp": [],
"random": 0.0
},
"123456":{
"at": true,
"prefix": [
"/ai", "!ai", "!ai", "ai"
],
"regexp": [],
"random": 0.0
},
"789012":{
"at": true,
"prefix": [
"/ai", "!ai", "!ai", "ai"
],
"regexp": [],
"random": 0.0
}
},
```
## 检查传入消息内容开关 income-msg-check
```json
"income-msg-check": true,
```
`income-msg-check`:是否检查传入的消息
## 传入消息忽略规则 ignore-rules
```json
"ignore-rules": {
"prefix": ["/"],
"regexp": []
},
```
符合规则的传入消息将被忽略,仅`income-msg-check`为`true`时生效
`prefix`:前缀为`/`的忽略
`regexp`:正则匹配的忽略
## 本地敏感词检查 check-sensitive-words
```json
"check-sensitive-words": true,
```
`check-sensitive-words`:是否检查敏感词,敏感词词库为`data/config/sensitive-words.json`里面的
## 百度云内容审核配置 baidu-cloud-examine
```json
"baidu-cloud-examine": {
"enable": false,
"api-key": "",
"api-secret": ""
},
```
`baidu-cloud-examine`:控制是否使用是否进行百度云内容审核
`enable`:enable=true时启用,一定会检查AI响应结果,仅`income-msg-check`为true时检查传入消息
`api-key`:百度AI开放平台的`API_KEY`
`api-secret`:百度AI开放平台的`SECRET_KEY`
*`API_KEY`与`SECRET_KEY`是在创建完毕应用后,系统分配给用户的,均为字符串,用于标识用户,为访问做签名验证,可在AI服务控制台中的**应用列表**中查看*
## 请求限速规则 rate-limit
```json
"rate-limit": {
"strategy": "drop",
"algo": "fixwin",
"fixwin": {
"default": {
"window-size": 60,
"limit": 60
}
}
}
```
`strategy`:会话中的请求速率超过限制时的处理策略,`drop`为丢弃新请求,`wait`为等待请求速率降到限制以下
`algo`: 使用的算法,目前仅支持 `fixwin` (固定窗口),即窗口期内最多处理多少个请求,可自行实现其他限速算法,具体查看插件编写教程
`fixwin`:具体速率设置,设定的窗口期内最多处理多少个请求,支持对特定session指定限速,格式为 {type}_{id},示例:group_12345678,person_12341234
`window-size`:窗口期大小,单位秒
`limit`:窗口期内最多处理多少个请求
例如:
```json
"fixwin": {
"default": {
"window-size": 60,
"limit": 60
},
"group_12345678": {
"window-size": 30,
"limit": 60
},
"person_12341234": {
"window-size": 60,
"limit": 60
}
}
```
将设定:
- 默认群窗口期60秒内最多处理60个请求
- 群号为12345678的窗口期30秒内最多处理60个请求
- 用户号为12341234的窗口期60秒内最多处理60个请求
## 对话历史记录截断 msg-truncate
将在发送消息给模型之前对当前会话的历史消息进行截断,以限制传给模型的消息长度
```json
"msg-truncate": {
"method": "round",
"round": {
"max-round": 10
}
}
```
`method`:截断方法,`round`为按回合截断,目前仅支持`round`,可自行实现其他截断方法,具体查看插件编写教程
`round`:按回合截断,`max-round`为最多保留多少回合的历史消息
+134
View File
@@ -0,0 +1,134 @@
# platform.json 配置项
:::info 目录
[[toc]]
:::
`data/config/platform.json` 配置程序连接的消息平台和相关消息处理配置项。启用的消息适配器列表,是否跟踪内容函数调用过程,群内回复时是否引用原消息,群内回复时是否at原用户,强制消息延迟范围,长消息处理策略,是否向用户隐藏AI的异常信息等。
## 消息平台适配器 platform-adapters
```json
"platform-adapters": [
{
"adapter": "yiri-mirai",
"enable": false,
"host": "127.0.0.1",
"port": 8080,
"verifyKey": "yirimirai",
"qq": 123456789
},
{
"adapter": "nakuru",
"enable": false,
"host": "127.0.0.1",
"ws_port": 8080,
"http_port": 5700,
"token": ""
},
{
"adapter": "aiocqhttp",
"enable": false,
"host": "127.0.0.1",
"port": 8080,
"access-token": "",
},
{
"adapter": "qq-botpy",
"enable": false,
"appid": "",
"secret": "",
"intents": [
"public_guild_messages",
"direct_message"
]
}
],
```
目前支持 `mirai`、`go-cqhttp`、`aiocqhttp`、`qq-botpy` 四种消息平台适配器,也可以同时启用多个同种类或不同种类的平台适配器。
各个适配器的配置方式请查看[部署教程](../deploy/config.html)。
### 多开示例
```json
"platform-adapters": [
{
"adapter": "yiri-mirai",
"enable": true,
"host": "127.0.0.1",
"port": 8080,
"verifyKey": "yirimirai",
"qq": 123456789
},
{
"adapter": "nakuru",
"enable": true,
"host": "127.0.0.1",
"ws_port": 8081,
"http_port": 5701,
"token": "token"
}
]
```
## 跟踪内容函数调用 track-function-calls
```json
"track-function-calls": true,
```
是否跟踪内容函数调用过程,如果开启了,在对话中调用的内容函数记录也会发给用户
关闭后(false)仅会发给用户最终结果
> 内容函数功能请查看插件功能文档。
## 引用原消息 quote-origin
```json
"quote-origin": false,
```
在群内回复时是否引用原消息
## 是否at原用户 at-sender
```json
"at-sender": false,
```
在群内回复时是否at原用户
## 强制消息延迟范围 force-delay
```json
"force-delay": [0, 0],
```
在将响应内容发回给用户前的强制消息延迟时间范围,以防风控,单位是秒。
## 长消息处理策略 long-text-process
```json
"long-text-process": {
"threshold": 256,
"strategy": "forward",
"font-path": ""
},
```
`threshold`:阈值,文字长度大于此值的消息会使用长消息处理策略
`strategy`:长消息处理策略,目前支持forward(转发消息组件)和image(文字转图片)
`font-path`: image的渲染字体。未设置时,如果在windows下,会尝试寻找系统的微软雅黑字体,若找不到,则转为forward策略。未设置时,若不是windows系统,则直接转为forward策略。
## 向用户隐藏AI接口的异常信息 hide-exception-info
```
"hide-exception-info": true
```
是否向用户隐藏AI的异常信息,如果为true,当请求AI接口出现异常时,会返回一个错误的提示给用户。而把报错详情输出在控制台。
+165
View File
@@ -0,0 +1,165 @@
# provider.json 配置项
:::info 目录
[[toc]]
:::
`data/config/provider.json` 中配置AI接口提供商相关的配置项。
## 启用聊天功能 enable-chat
```json
"enable-chat": true,
```
`enable-chat`:是否开启AI聊天功能
## 启用 AI 视觉功能 enable-vision
```json
"enable-vision": true,
```
`enable-vision`:是否开启AI视觉功能。需要使用的模型同时支持视觉功能,详情见元数据板块。
## 模型接口密钥 keys
```json
"keys": {
"openai": [
"sk-1234567890"
],
"anthropic": [
"sk-1234567890"
],
"moonshot": [
"sk-1234567890"
],
"deepseek": [
"sk-1234567890"
]
},
```
`keys`:设置密钥组,以字典的形式设置若干个密钥组,每个密钥组的键为密钥组名称,值为密钥列表。模型与密钥组的对应关系,请查看元数据板块。
目前支持的密钥组:
- `openai`:OpenAI 的密钥组,如果你没有OpenAI API Key,你可以[在此获取](https://ai.lazyshare.top/)
- `anthropic`:Anthropic 的密钥组
- `moonshot`:Moonshot(月之暗面 kimi)的密钥组
- `deepseek`:Deepseek(深度求索)的密钥组
## 大模型请求器 requester
```json
"requester": {
"openai-chat-completions": {
"base-url": "https://api.openai.com/v1",
"args": {},
"timeout": 120
},
"anthropic-messages": {
"base-url": "https://api.anthropic.com",
"args": {
"max_tokens": 1024
},
"timeout": 120
},
"moonshot-chat-completions": {
"base-url": "https://api.moonshot.cn/v1",
"args": {},
"timeout": 120
},
"deepseek-chat-completions": {
"base-url": "https://api.deepseek.com",
"args": {},
"timeout": 120
},
"ollama-chat": {
"base-url": "http://127.0.0.1:11434",
"args": {},
"timeout": 600
}
},
```
`requester`:设置请求器,以字典的形式设置若干个请求器,每个请求器的键为请求器名称,值为请求器配置。模型与请求器的对应关系,请查看元数据板块。实现请求器的方式,请查看插件编写教程。
目前支持的请求器有:
- `openai-chat-completions`:OpenAI 的 ChatCompletion 请求器
- `anthropic-messages`:Anthropic 请求器(Claude)
- `moonshot-chat-completions`:Moonshot 请求器(月之暗面)
- `deepseek-chat-completions`:Deepseek 请求器(深度求索)
- `ollama-chat`:Ollama 请求器,不需要密钥,直接请求目标地址的 Ollama 服务
`base-url`:设置接口地址。
`args`:请求时除了model之外的其他参数,以字典的形式设置。
`timeout`:设置请求超时时间,以秒为单位,对于耗时较长的模型,建议设置较大值
## 使用的模型 model
```json
"model": "gpt-3.5-turbo",
```
`model`:设置要使用的模型名称。通常来说直接填写模型名称即可,但如果要使用原生接口不是 ChatCompletion 但以 ChatCompletion 接口格式接入的模型,请在模型名称前方加一个 `OneAPI/` 前缀以进行区分。
简单来说可以认为是:现阶段非 OpenAI 的模型接入都需要在模型名称前方加一个 `OneAPI/` 前缀。
例如:
1. 通过 OneAPI 等中转服务接入了 OpenAI 的 `gpt-4` 模型,由于 `gpt-4` 也是使用 ChatCompletion 接口格式进行请求,则可以直接填入 `gpt-4`;
2. 通过 OneAPI 等中转服务接入了 Google 的 `gemini-pro` 模型,由于 `gemini-pro` 原生接口格式并非 ChatCompletion,因此需要填入 `OneAPI/gemini-pro`。
具体支持的模型列表和各个模型对应的请求器和密钥组,请查看元数据板块 llm-models.json 。
## 情景预设(人格) prompt
```json
"prompt-mode": "normal",
"prompt": {
"default": "如果用户之后想获取帮助,请你说”输入!help获取帮助“。"
}
```
`prompt-mode`:设置情景预设模式,值为`normal`(单预设模式)和`full-scenario`(完整历史对话模式)
`normal`时,使用下面的`prompt`,可设置多个
```json
"prompt": {
"default": "如果用户之后想获取帮助,请你说”输入!help获取帮助“。",
"help": "如果用户之后想获取帮助,请你说”输入!help获取帮助“。"
}
```
`normal` 模式也支持读取`data/prompts`目录下的文件内容作为单个 System Prompt,文件名即为`prompt`的名称。
在使用中通过`!default set <预设名>`指令将其设为默认(将<预设名>整体替换)
### full-scenario模式配置方法
把完整的历史对话以文件形式添加到`data/scenario/`目录下,参考`data/scenario/default.json`
```json
{
"prompt": [
{
"role": "system",
"content": "You are a helpful assistant. 如果我需要帮助,你要说“输入!help获得帮助”"
},
{
"role": "assistant",
"content": "好的,我是一个能干的AI助手。 如果你需要帮助,我会说“输入!help获得帮助”"
}
]
}
```
`role` 为消息的角色,可以是`user`(用户)、`assistant`(AI)、`system`(系统)
`content` 为字符串,表示消息内容。
在使用中通过`!default set <文件名>`指令将其设为默认(将<预设名>整体替换)
> 社区资源:[人格预设合集1000+(测试版,不确保可用性)](../deploy/README.md#人格预设合集)
+91
View File
@@ -0,0 +1,91 @@
# system.json 配置项
:::info 目录
[[toc]]
:::
`data/config/system.json` 中配置系统设置,如管理员、网络代理、是否上报遥测数据供开发者分析、日志等级、会话消息处理并发数、流水线消息处理并发数、帮助消息等
## 管理员会话 admin-sessions
```json
"admin-sessions": [],
```
`admin-sessions`:设置管理员会话,格式为 {type}_{id},type 为 "group" 或 "person",如:
```json
"admin-sessions": ["group_123456789", "person_123456789"],
```
## 网络代理 network-proxies
```json
"network-proxies": {
"http": null,
"https": null
},
```
`network-proxies`:设置网络代理,为正向代理,http和https都要填,例如
```json
"network-proxies": {
"http": "http://127.0.0.1:7890",
"https": "http://127.0.0.1:7890"
},
```
正向代理也可以用环境变量设置:http_proxy 和 https_proxy
## 上报遥测数据 report-usage
```json
"report-usage": true,
```
`report-usage`:是否上报遥测数据供开发者分析,不包含敏感信息
## 日志等级 logging-level
```json
"logging-level": "info",
```
`logging-level`:暂时没用,现在只能通过环境变量 DEBUG=true 来设置调试日志输出
## 会话消息处理并发数 session-concurrency
```json
"session-concurrency": {
"default": 1
},
```
`session-concurrency`:会话消息处理并发数,粒度是每个会话,session格式为 {type}_{id},未指定的session使用 default 配置
## 流水线消息处理并发数 pipeline-concurrency
```json
"pipeline-concurrency": 20,
```
`pipeline-concurrency`:流水线消息处理并发数,粒度是整个程序,目前使用 FCFS 算法调度各个请求。
## 遥测服务器url qcg-center-url
QChatGPT 运行期间推送遥测数据的目标地址,默认为官方地址,若您自己部署了[qcg-center](https://github.com/RockChinQ/qcg-center),可以改为你的地址。
```json
"qcg-center-url": "https://api.qchatgpt.rockchin.top/api/v2"
```
## 帮助消息 help-message
```json
"help-message": "QChatGPT - 😎高稳定性、🧩支持插件、🦄多模态的 ChatGPT QQ 机器人🤖\n链接:https://q.rkcn.top"
```
`help-message`:帮助消息,用户发送 !help 命令时的输出
+21
View File
@@ -0,0 +1,21 @@
# adapter-qq-botpy.json 元数据
`data/metadata/adapter-qq-botpy.json`,QQ 官方 API 适配器元数据。官方 API 在使用群聊接口时,群id和成员id为字符串,而 QChatGPT 内部只支持整型 id,为使重启后仍然是相同的对应关系,因此需要保存到一个文件中。
## 格式
```json
{
"mapping": {
"groups": {
"15944D6D2B525C6E3536134D4669F067": 443241151434655
},
"members": {
"547A6244A731B4BEEBE5EE2AE4CD00A8": 232437565267568
}
}
}
```
- `groups`: 群id映射关系,key为字符串群id,value为整型群id。
- `members`: 成员id映射关系,key为字符串成员id,value为整型成员id。
+51
View File
@@ -0,0 +1,51 @@
# llm-models.json 元数据
`data/metadata/llm-models.json`,受支持的大语言模型列表,本文件中指定了可用于 `data/config/provider.json` 中的 `model` 列表,指定每个模型对应的 `Key 管理器` 和 `API 请求器`。
## 格式
```json
{
"list": [
{
"name": "default",
"requester": "openai-chat-completions",
"token_mgr": "openai",
"tool_call_supported": false,
"vision_supported": false
},
{
"name": "gpt-3.5-turbo",
"tool_call_supported": true
},
{
"name": "gpt-4o",
"tool_call_supported": true,
"vision_supported": true
}
]
}
```
模型均列于`list`数组中,每个模型的字段如下:
- `name`: 模型名称,用于在 `data/config/provider.json` 中的 `model` 列表中指定。
- `model_name`: 进行请求时使用的模型名称,用于区分使用不同请求器的相同模型,若未设置则使用 `name` 字段。
- `requester`: 请求器名称,指定使用哪个请求器请求该模型的响应,不同的请求器对应不同的 API,当前支持的模型,可以在 `data/config/provider.json` 中的 `requester` 列表中找到。
- `token_mgr`: Key 管理器,此模型使用的 key 组,对应 `data/config/provider.json` 中的 `keys` 列表。
- `tool_call_supported`: 是否支持工具调用,标记此模型是否支持使用`内容函数`。
- `vision_supported`: 是否支持图像输入,标记此模型是否支持使用`图像输入`。
`default` 模型是必须的,这是模型的默认配置,其他模型可以不设置所有的字段,只需设置 `name` 字段即可,其他字段会继承 `default` 模型的配置。
## 自动更新机制
每次启动时,程序会自动从中央服务器获取最新的模型列表,已有的的模型名称会被下载的新配置覆盖。
## 自定义模型
根据上述格式添加即可。
- 如果需要使用目前不支持的接口(请求器),需要自己扩展请求器,请参考插件开发文档 -> 组件扩展。
- key 组可以自己在 `data/config/provider.json` 中的 `keys` 列表中添加。
- 不建议修改默认的模型配置,因为启动时会被自动更新的信息覆盖。
+3
View File
@@ -0,0 +1,3 @@
# sensitive-words.json 元数据
本地敏感词词库,参考 `data/metadata/sensitive-words.json` 内容进行修改即可。
+38
View File
@@ -0,0 +1,38 @@
# 部署教程
## 部署教程
请按照以下步骤部署 QChatGPT 项目:
- 第一步: [部署QChatGPT](qchatgpt/)
- 第二步: [部署消息平台](platforms/)
- 第三步: [填写配置信息](config.md)
完成以上三个步骤后,你接下来应该仔细阅读左栏中的[配置详解](../config/README.md)和[元数据配置](../metadata/README.md),实现更多样化的配置需求
## 社区资源
### 视频教程
[【8月最新】5min部署 最强AI语音聊天+酒馆角色扮演+QQ机器人,全新角色扮演语音聊天QQ机器人](https://www.bilibili.com/video/BV1vypZeBEW1/?share_source=copy_web&vd_source=1335a044d4fd926920999a0e3ba0a731)
## 本项目交流 QQ 群
### 社区群
> 遇到问题请先认真阅读文档,如无法解决再加群提问
Lazy的交流群一:891448839(已满)
Lazy的交流群二:738382634(已满)
Lazy的交流群三:248432104(已满)
Lazy的交流群四:619154800 ([链接](https://qm.qq.com/q/1K9GjQuza))
### 官方群
> 官方群不解答部署问题
四群:195992197 [链接](https://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=cSekvWmyezfCE4O8gXS7lSjkmPinjzpP&authKey=G4jHfz2%2BtQawxCRhn1ZRrQiI8bTvlepQubZL6F9fymFuz8jqZZ4FkYh6lhKLMCd9&noverify=0&group_code=195992197)
+26
View File
@@ -0,0 +1,26 @@
# aiocqhttp适配器系列教程
## OneBot 11 协议
OneBot 是用于接入多种消息平台的标准化协议,详细介绍:[https://onebot.dev/](https://onebot.dev/)
以下消息框架可以通过 OneBot 11 协议接入,需选择使用`aiocqhttp`作为适配器,修改`data/platform.json`配置文件,在`platform-adapters`字段中添加以下内容(如果已经有aiocqhttp的适配器,可以直接将其enable改为true):
```json
{
"adapter": "aiocqhttp",
"enable": true,
"host": "0.0.0.0",
"port": 8080,
"access-token": ""
}
```
![data/platform.json](https://cos.thelazy.cn/pictures/202405292250017.jpeg)
当前可用的OneBot 11标准消息平台,你可以选择下方任意
- [Lagrange.OneBot的教程](./lagrange)
- [NapCat的教程](./napcat)
- [LiteLoaderQQNT的教程](./llonebot)
- [shamrock的教程](./shamrock)
@@ -0,0 +1,59 @@
# 部署消息平台Lagrange的教程
## Lagrange介绍
Lagrange 是一个 QQNT 协议逆向工程框架,比 Shamrock 或 Mirai 更加轻便,在目前也较为稳定。通过 OneBot 11 协议接入,需选择使用`aiocqhttp`作为适配器,填写配置时可参考 Shamrock 的方式。
可选平台(需要.NET 8 or 7支持):
- Mac OS 也可使用
- Linux Ubuntu 22.04,Debian 12应该都可以
- Windows 10,11,Server2019及以上
> 注意:
> 要使用NT QQ发信息,旧版QQ无法正常使用
## 部署步骤
以下仅提供 Windows 上的大致步骤,详细步骤或其他平台请参考 [Lagrange官方文档](https://lagrangedev.github.io/Lagrange.Doc/Lagrange.OneBot/)
### 环境配置
安装.NET 8运行时,[点击直达微软官网下载](https://dotnet.microsoft.com/zh-cn/download/dotnet/thank-you/runtime-desktop-8.0.4-windows-x64-installer)
### 从Github Actions下载最新的build
需要登录Github后才能下载,如果你不需要部分特性,可以在Release下载,看图片3
[Github Actions](https://github.com/KonataDev/Lagrange.Core/actions)
看图进行下载:
![图片1](/assets/image/dl_lgr_1.png)
![图片2](/assets/image/dl_lgr_2.png)
![图片3](/assets/image/dl_lgr_3.png)
### 尾声
解压你所下载的zip,打开到有Lagrange.OneBot.exe的目录,在此目录下打开cmd命令提示符,输入
```bash
.\Lagrange.OneBot
```
运行一次,如果输出了一个二维码,即可直接用机器人号扫码登录(若二维码显示不清楚,可以到lagrange的data目录下寻找图片文件)。
若无法登录,请检查是否正常填写了lagrange配置文件appsettings.json中的签名地址 SignServerUrl ,签名地址请到lagrange文档中寻找。
## 修改配置
需要配置 Lagrange 以让其连接上 QChatGPT,请编辑 Lagrange 的配置文件 appsettings.json,确保 Implementations 中的连接配置符合下图内容:
![配置连接](/assets/image/config_lgr.png)
其中 Type 必须为 `ReverseWebSocket`;
Host 为 QChatGPT 运行的主机 IP,若在同一主机上,可以写 `127.0.0.1`;
Suffix 必须为 `/ws`
@@ -0,0 +1,9 @@
# 部署消息平台LiteLoaderQQNT的教程
# LiteLoaderQQNT
- [LiteLoaderQQNT 的 OneBot API 插件](https://github.com/LLOneBot/LLOneBot) 注入 QQ 客户端并将其转换为 OneBot 11 协议
安装LiteLoaderQQNT的教程:https://llonebot.github.io/zh-CN/guide/getting-started
![image-20240515185909108](/assets/image/llob_cfg.png)
+35
View File
@@ -0,0 +1,35 @@
# 部署消息平台NapCat的教程
::: tip
复活赛已打赢,继续使用
:::
## NapCat介绍
NapCat 是一个 QQNT 协议逆向工程框架。
可选平台:
- Windows
- Linux Docker
- Linux 非 Docker
## NapCat安装教程
按照 [NapCat 官方文档安装](https://napneko.github.io/zh-CN/guide/getting-started)
运行后扫码登录
## NapCat配置教程
登录后,可以在config文件夹中,找到并修改文件(数字对应机器人QQ号):![image-20240514231529613](/assets/image/napcat_cfg_1.png)
参考下图红框修改内容,确保地址中 IP地址 是 QChatGPT 运行的主机的地址(若在同一网络内运行则为 127.0.0.1),后缀须为`/ws`:
![image-20240514231932514](/assets/image/napcat_cfg_2.png)
然后重新运行登录即可,看到提示:
![image-20240514232647329](/assets/image/napcat_cfg_3.png)
@@ -0,0 +1,74 @@
# 部署消息平台shamrock的教程
> 本文档仅为基本步骤,详细操作、答疑解惑及最新信息请前往[OpenShamrock官方文档](https://whitechi73.github.io/OpenShamrock/)。
::: tip
项目归档,不建议继续使用
:::
## OpenShamrock简介
Mirai、go-cqhttp 之类的是模拟 QQ 的协议进行通信,而 Shamrock 使用的是 安卓的 Hook 来操作 QQ 模拟点击,稳定性较高。
可选平台(or设备):
- 模拟器
- Linux服务器
- PVE
- 云手机
- 实体手机
## 步骤(模拟器)
### 环境配置
**注:建议使用[mumu模拟器](https://mumu.163.com/)**
参考[此文档](https://forum.libfekit.so/d/60-mumu12mo-ni-qi-an-zhuang-magiskhe-lsposed)安装Magisk和LSPosed
记得打开mumu模拟器的可写系统盘和root权限
![](/assets/image/sham_env_1.png)
![image-20240119154032682](/assets/image/sham_env_2.png)
### 安装OpenShamrock
从[OpenShamrock的Actions](https://github.com/whitechi73/OpenShamrock/actions)下载最新的OpenShamrock安装包,注意下载带有`all`字样的版本,如`Shamrock-v1.0.7.r253.81be383-all.zip`,解压,在mumu模拟器安装
#### 配置Shamrock
1. 在 Shamrock 的设置页面修改设置如图:
启用被动 Websocket,并填写 QChatGPT 的 aiocqhttp 适配器监听的地址和端口(详见填写配置信息页)。
![img](/assets/image/sham_cfg_1.png)
![img](/assets/image/sham_cfg_2.png)
填写的被动 Websocket 地址为 QChatGPT 的 aiocqhttp 适配器监听的地址和端口,且路径必须为 `/ws`,例如 `ws://127.0.0.1:8080/ws`,详见填写配置信息页。
2. 并前往 LSPosed 的模块管理页面 启用模块 Shamrock
![image-20240119154110877](/assets/image/sham_cfg_3.png)
### 安装QQ
参考[此页面](https://whitechi73.github.io/OpenShamrock/guide/faq.html#%E6%94%AF%E6%8C%81%E7%9A%84qq%E7%89%88%E6%9C%AC)给出的支持的QQ版本,选择最新即可
在[这里](https://qq.cn.uptodown.com/android/versions)选择对应的版本下载,在mumu模拟器安装即可
### 登录机器人QQ
1. 打开QQ,登录机器人QQ,关闭QQ,重启模拟器。
2. 启动 LSPosed,Shamrock 将会自动运行,启动 QQ。
3. 打开 Shamrock 页面,此时应显示 `已激活` 并可以查看到账号信息和相关消息日志。
### 后续步骤
查看填写配置信息页,通过 aiocqhttp 适配器接入。
![img](https://cos.thelazy.cn/pictures/202405292250017.jpeg)
+151
View File
@@ -0,0 +1,151 @@
# 部署消息平台go-cqhttp的教程
> 本文档仅为基本步骤,详细操作、答疑解惑及最新信息请前往[go-cqhttp官方文档](https://docs.go-cqhttp.org/)。
::: warning
gocq未归档,但原开发者表示:[https://github.com/Mrs4s/go-cqhttp/issues/2471](https://github.com/Mrs4s/go-cqhttp/issues/2471)
:::
## 下载go-cqhttp
从[go-cqhttp的Release](https://github.com/Mrs4s/go-cqhttp/releases/latest)下载最新的go-cqhttp可执行文件(建议直接下载可执行文件压缩包,而不是安装器)
![下载gocq](/assets/image/dl_gocq.png)
## 运行并配置go-cqhttp
解压并运行,首次运行会询问需要开放的网络协议,**请填入`02`并回车,必须输入`02`❗❗❗❗❗❗❗**
```
C:\Softwares\go-cqhttp.old> .\go-cqhttp.exe
未找到配置文件,正在为您生成配置文件中!
请选择你需要的通信方式:
> 0: HTTP通信
> 1: 云函数服务
> 2: 正向 Websocket 通信
> 3: 反向 Websocket 通信
请输入你需要的编号(0-9),可输入多个,同一编号也可输入多个(如: 233)
您的选择是:02
```
提示已生成`config.yml`文件,关闭go-cqhttp。
打开go-cqhttp同目录的`config.yml`
1. 编辑账号登录信息
只需要修改下方`uin`和`password`为你要登录的机器人账号的QQ号和密码即可。
```yaml
account: # 账号相关
uin: 1233456 # QQ账号
password: '' # 密码为空时使用扫码登录
encrypt: false # 是否开启密码加密
status: 0 # 在线状态 请参考 https://docs.go-cqhttp.org/guide/config.html#在线状态
relogin: # 重连设置
delay: 3 # 首次重连延迟, 单位秒
interval: 3 # 重连间隔
max-times: 0 # 最大重连次数, 0为无限制
```
2. 修改websocket端口
在`config.yml`下方找到以下内容
```yaml
- ws:
# 正向WS服务器监听地址
address: 0.0.0.0:8080
middlewares:
<<: *default # 引用默认中间件
```
**将`0.0.0.0:8080`改为`0.0.0.0:6700`**,保存并关闭`config.yml`。
3. 配置签名服务器
按照如下填写,
```yam
sign-servers:
- url: 'https://qsign.trpgbot.com/' # 主签名服务器地址, 必填
key: 'selfshare'
authorization: '-'
- url: 'https://qsign-v3.trpgbot.com/' # 次要服务器地址,选填
key: 'selfshare'
authorization: '-'
auto-register: true
```
写入文件/data/versions/6.json,
```json
{
"apk_id": "com.tencent.mobileqq",
"app_id": 537220362,
"sub_app_id": 537220362,
"app_key": "0S200MNJT807V3GE",
"sort_version_name": "9.0.56.16830",
"build_time": 1713424357,
"apk_sign": "a6b745bf24a2c277527716f6f36eb68d",
"sdk_version": "6.0.0.2560",
"sso_version": 21,
"misc_bitmap": 150470524,
"main_sig_map": 34869472,
"sub_sig_map": 66560,
"dump_time": 1713424357,
"qua": "V1_AND_SQ_9.0.56_6372_YYB_D",
"protocol_type": 6
}
```
感谢zhaodice大佬带来的QQ 9.0.56签名服务器
4. 若您的服务器位于公网,强烈建议您填写`access-token` (可选)
```yaml
# 默认中间件锚点
default-middlewares: &default
# 访问密钥, 强烈推荐在公网的服务器设置
access-token: ''
```
5. 配置完成,重新启动go-cqhttp
## 登录
双击登录脚本,一段时间后,可以看到提示
![登录gocq](/assets/image/first_launch.png)
把`Captcha link: `后边的链接复制下来,用Chrome或者Edge浏览器打开,按F12打开开发者工具
点开 `Network`
![过验证码](/assets/image/get_captcha.png)
在浏览器中完成验证, 在 `Network` 中找到名为 `cap_union_new_verify` 的请求, 在最下面
![获取token](/assets/image/get_gocq_login_token.png)
ticket 后那一坨就是要输入回 mirai 的内容,但不包括首尾的双引号
**注意**
- 复制的时候记得删掉引号(`"`, 前后都有一个), 那个不是ticket内容
- 速度要快
- 注意不要漏字符(没复制完, 后面还有很长)
把复制下来的东西,粘贴到运行go-cq的终端中
![粘贴token](/assets/image/paste_token.png)
> 若启动后登录不成功,请尝试根据[此文档](https://docs.go-cqhttp.org/guide/config.html#%E8%AE%BE%E5%A4%87%E4%BF%A1%E6%81%AF)修改`device.json`的协议编号。
## 后续步骤
查看填写配置信息页,通过 Nakuru 适配器接入。
+22
View File
@@ -0,0 +1,22 @@
# 消息平台部署教程
:::info 目录
[[toc]]
:::
## 可选的平台适配器
QChatGPT 需要一个中间程序,处理 QQ 等 IM 的协议(大部分是逆向工程)。
以下平台任选,也可以配置多个,QChatGPT支持同时接入一个或多个平台:
### 推荐
- aiocqhttp(QQ):[aiocqhttp适配器教程](aiocqhttp/)
- QQ官方API(QQ群、QQ频道):[QQ 官方 API 部署教程](official.md)
### 不推荐
以前流行的框架,现在长期不再维护或被腾讯严重围追堵截,不推荐使用:
- Mirai(QQ):[Mirai部署教程](mirai.md) (使用旧版协议,风控严重)
- go-cqhttp(QQ):[go-cqhttp部署教程(For nakuru)](nakuru.md)(使用旧版协议,[原开发者停止维护](https://github.com/Mrs4s/go-cqhttp?tab=readme-ov-file#%E9%87%8D%E8%A6%81%E4%BF%A1%E6%81%AF))
+152
View File
@@ -0,0 +1,152 @@
# 部署消息平台mirai的教程
> 本文档仅为基本步骤,详细操作、答疑解惑及最新信息请前往[Mirai官方代码库](https://github.com/mamoe/mirai)、[Mirai官方论坛](https://mirai.mamoe.net/)
::: warning
此消息平台不稳定,不要使用
:::
## 准备工作
> 注意:由于网络环境多样复杂,很多步骤中,有可能需要使用网络魔法,懂的都懂
1. 创建文件夹
在你的任意盘(D,E,F什么都都可以)里面新建一个文件夹(例如命名qqbot)
2. 创建子文件夹
双击进入刚刚创建的文件夹,分别新建两个文件夹(建议命名保持一致):mirai、QChatGPT
## 安装 mirai-console
在 [mcl-installer 的 releases 页面](https://github.com/iTXTech/mcl-installer/releases)下载对应版本的安装包,找到最新的安装包,即有“Latest”标志的安装包,点击`show all 14 assets`,下载 mcl-installer-X.X.X-windows-amd64.exe,如图,则下载`mcl-installer-1.0.7-windows-amd64.exe`,保存在刚才创建的`mirai文件夹`中
![屏幕截图 2023-11-23 223909.png](/assets/image/mirai_dl_1.png)
![image-20231218170548696](/assets/image/mirai_dl_2.png)
双击打开,一路回车。然后,你可以看到多出来一些文件。
![image-20231218170726759](/assets/image/mirai_dl_3.png)
继续点击`mcl.cmd`,看不到文件后缀的,参考这个文章来显示文件后缀名:[如何查看文件后缀](https://jingyan.baidu.com/article/9158e0004c6cbea2541228da.html)
双击后会显示如下图所示的类似界面,当出现`Enter to continue`时,表明你需要按回车健
![屏幕截图 2023-11-24 174015.png](/assets/image/mirai_dl_4.png)
![屏幕截图 2023-11-24 174650.png](/assets/image/mirai_dl_5.png)
当出现上面的一行绿字时,说明安装完成,到这里输入 exit,回车退出
## 安装 mirai-api-http
打开 `mcl.cmd`,输入`mcl --update-package net.mamoe:mirai-api-http --channel stable-v2 --type plugin` ,回车
![image-20231218172022449](/assets/image/mah_dl_1.png)
再次打开`mcl.cmd`,一路回车,直至退出。
再打开 mcl.cmd,看到如以下界面,说明成功
![屏幕截图 2023-11-24 184618.png](/assets/image/mah_dl_2.png)
键盘按下`Ctrl+C`,退出。
找到mira/config/net.mamoe.mirai-api-http/setting.yml文件,右键用记事本打开
![image-20231218172354159](/assets/image/mah_dl_3.png)
把内容全部删掉,换成
```yml
adapters:
- ws
debug: true
enableVerify: true
verifyKey: yirimirai
singleMode: false
cacheSize: 4096
adapterSettings:
ws:
host: localhost
port: 8080
reservedSyncId: -1
```
再打开 `mcl.cmd`,可以看到输出
![image-20231218174112536](/assets/image/mah_dl_4.png)
则 mirai-api-http 安装成功。
## 配置签名服务
在这个链接下载qsign一键签名包,点击下载最新的那个zip压缩包,如下图的`qsign-1.2.1-beta-dev-d62ddce-all.zip`【写于2023年12月19日】,[点我跳转下载页面](https://github.com/MrXiaoM/qsign/releases)
![image-20231219211250617](/assets/image/mirai_sign_1.png)
下载完成后,解压得到如图文件
![image-20231219211634274](/assets/image/mirai_sign_2.png)
将两个文件复制到mirai文件夹中
![image-20231219211904375](/assets/image/mirai_sign_3.png)
打开`txlib`文件夹,发现有若干数字命名的文件夹,记录下最大的那个
![image-20231219212926059](/assets/image/mirai_sign_4.png)
然后,双击运行`mcl.cmd`,稍等一会儿后,当提示`mirai-console started successfully`时,qsign就安装上了
之后,打开`mirai/config/top.mrxiaom.qsign`下的`config.yml`文件,用记事本打开
![image-20231219213026138](/assets/image/mirai_sign_5.png)
![image-20231219213255993](/assets/image/mirai_sign_6.png)
然后,按下`Ctrl+S`保存
然后,再次双击运行`mcl.cmd`,可以看到类似提示,如图
![image-20231219214603122](/assets/image/mirai_sign_7.png)
## 运行mirai
到这里,你已经安装并配置成功了,接下来,你就可以登录机器人QQ了
输入,其中 123456 是替换为你机器人的 QQ 号,67890 替换为你机器人 QQ 的密码
```bash
login 12345 67890
```
然后,可以看到提示
![image-20231219215234389](/assets/image/run_mirai_1.png)
把`Captcha link: `后边的链接复制下来,用Chrome或者Edge浏览器打开,按F12打开开发者工具
点开 `Network`
![img5](/assets/image/get_captcha.png)
在浏览器中完成验证, 在 `Network` 中找到名为 `cap_union_new_verify` 的请求, 在最下面
![img6](/assets/image/get_gocq_login_token.png)
ticket 后那一坨就是要输入回 mirai 的内容,但不包括首尾的双引号
**注意**
- 复制的时候记得删掉引号(`"`, 前后都有一个), 那个不是ticket内容
- 速度要快
- 注意不要漏字符(没复制完, 后面还有很长)
把复制下来的东西,粘贴到运行mirai的终端中
![image-20231219220645708](/assets/image/paste_token.png)
然后回车,如果运气好的话,会提示你要收验证码,输入yes并回车,之后把验证码输入上去,然后回车即可成功登录了
如果运气不好,报错code=237了,建议换号
## 后续步骤
查看填写配置信息页,通过 YiriMirai 适配器接入。
+14
View File
@@ -0,0 +1,14 @@
# 使用 QQ 官方机器人 API 的教程
QQ 官方 API 可以将机器人接入 QQ 频道 和 QQ 群。
QQ官方机器人所有人均可申请,可以在频道和群聊中使用,私聊也可。
(之前个人创建的机器人是没有此群聊权限的,只要重新申请创建一个即可)
## 注册 QQ 机器人
前往[QQ开放平台](https://q.qq.com/#/),找到下方的 QQ 机器人文档,按照指引注册 QQ 频道机器人。
## 获取凭证
注册完成后,前往机器人控制台,找到 开发设置,获取 `AppId(机器人ID)` 和 `AppSecret(机器人密钥)`,接下来进入填写配置信息步骤。
+48
View File
@@ -0,0 +1,48 @@
# Docker部署(仅推荐在Linux上使用)
:::info 目录
[[toc]]
:::
:::warning
请您确保您**确实**需要 Docker 部署,您**必须**具有以下能力:
- 了解 `Docker` 和 `Docker Compose` 的使用
- 了解容器间网络通信配置方式
- 了解容器文件挂载机制
- 了解容器调试操作
- 动手能力强、资料查找能力强
若您不完全具有以上能力,请勿使用 Docker 部署,由于误操作导致的配置不正确,我们将不会解答您的问题并不负任何责任。
**不建议**您在除 Linux 之外的系统上使用 Docker 进行部署。
:::
:::note
请先确保 Docker 和 Docker Compose 已安装
:::
以下是推荐的`docker-compose.yaml`模板,您可以根据自己的需求进行修改。
```yaml
version: "3"
services:
qchatgpt:
image: rockchin/qchatgpt:latest
volumes:
- ./data:/app/data
- ./plugins:/app/plugins
restart: on-failure
# 根据具体环境配置网络
```
保存到一个目录的`docker-compose.yaml`,运行命令:
```bash
docker compose up
```
无报错即为启动成功,请查看`部署消息平台`部分以配置消息平台框架。
## 注意
- 安装的插件都会保存在`plugins`(映射到本目录`plugins`),安装插件时可能会自动安装相应的依赖,此时若`重新创建`容器,已安装的插件将被加载,但所需的增量依赖并未安装,会导致引入问题。您可以删除插件目录后重启,再次安装插件,以便程序可以自动安装插件所需依赖。
+15
View File
@@ -0,0 +1,15 @@
# QChatGPT部署教程
:::info 目录
[[toc]]
:::
选择一种部署 QChatGPT 的方式。
## 手动部署
- [<HopeIcon icon="support" size="1.2em"/> 点击查看手动部署的具体操作](manual.md)
## Docker部署
- [<HopeIcon icon="support" size="1.2em"/> 点击查看Docker部署的具体操作](docker.md)
+71
View File
@@ -0,0 +1,71 @@
# 手动部署(推荐,可以在所有平台上使用)
:::warning
请使用Python 3.10.1(不包含3.10.0)及以上版本,推荐3.10.9版本,没有Python的需自行安装,参考[此教程](./more-details/python.md)
:::
:::info 目录
[[toc]]
:::
## 安装主程序
1. 克隆此项目(按照下方命令,需要安装 Git) 或 前往[Release](https://github.com/RockChinQ/QChatGPT/releases)页面下载最新版本的压缩包(推荐)并解压
```bash
git clone https://github.com/RockChinQ/QChatGPT
cd QChatGPT
```
2. 安装依赖
```bash
pip3 install -r requirements.txt
```
或者使用清华源
```bash
pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple some-package
```
3. 运行一次主程序,生成配置文件
```bash
python3 main.py
```
> 如果输入上面的指令无反应,并且你确认你已经装了python,则可以尝试使用`python main.py`,总之`python`是你启动的python的命令,可以使用 `python --version` 查看你的python版本。下同。
提示如下信息
```
___ ___ _ _ ___ ___ _____
/ _ \ / __| |_ __ _| |_ / __| _ \_ _|
| (_) | (__| ' \/ _` | _| (_ | _/ | |
\__\_\\___|_||_\__,_|\__|\___|_| |_|
⭐️开源地址: https://github.com/RockChinQ/QChatGPT
📖文档地址: https://q.rkcn.top
以下文件不存在,已自动生成,请按需修改配置文件后重启:
- plugins/__init__.py
- plugins/plugins.json
- data/config/command.json
- data/config/pipeline.json
- data/config/platform.json
- data/config/provider.json
- data/config/system.json
- data/config/sensitive-words.json
- data/scenario/default.json
```
接下来请查看[部署消息平台](../platforms/)页。
当你部署消息平台和填写配置文件后,再次运行
```bash
python3 main.py
```
@@ -0,0 +1,23 @@
# Python的安装教程(QChatGPT)
## 第一步:安装Python
打开这个网址,[点我跳转](https://www.python.org/downloads/release/python-3109/)
翻到最下边,点击这个下载python安装器
![image-20231219213747065](/assets/image/python_1.png)
然后,双击打开你刚才下载的,记得勾选下面的
![image-20231219222341736](/assets/image/python_2.png)
然后,所有项保持默认即可
## 第二步:检测Python是否安装成功
按win+R键,输入cmd,回车,在输入python,回车
![image-20231219222916951](/assets/image/python_3.png)
提示如图时,表明安装成功了
+177
View File
@@ -0,0 +1,177 @@
# 填写配置信息
修改以下配置文件即可启用 QChatGPT 的基本功能,当你阅读完此页面后,建议查看[配置详解](../config/),以了解更多的配置项详解
- `data/config/platform.json`
- `data/config/provider.json`
- `data/config/system.json`
## platform.json
修改此配置文件以指定需要连接的消息平台,只需要关注`platform-adapters`字段。
目前支持 `mirai`、`go-cqhttp`、`aiocqhttp`、`qq-botpy` 四种消息平台适配器,也可以同时启用多个同种类或不同种类的平台适配器
### aiocqhttp 适配器
如果你刚刚已经在 QChatGPT 的配置文件中启用了 aiocqhttp 适配器,那么你可以跳过这一步。
用于接入 Lagrange 等兼容 OneBot 协议的机器人框架(仅支持反向ws)。
```json
{
"adapter": "aiocqhttp",
"enable": false,
"host": "127.0.0.1",
"port": 8080,
"access-token": ""
},
```
`"adapter": "aiocqhttp"`,无需改动。
`enable`:是否启用,配置完成后请将其设为`true`
`host`:监听的 IP 地址,使用 aiocqhttp 时,QChatGPT 作为服务端被动等待框架连接,请在 Shamrock 等框架中设置`被动 ws 地址`或者`反向 ws 地址`(具体视框架而定)为 QChatGPT 监听的地址,且路径为`/ws`,例如:`ws://127.0.0.1:8080/ws`。
`port`:设置监听的端口,默认8080,需在 Shamrock 等框架中设置为与此处一致的端口
`access-token`:设置访问密钥,与 Shamrock 等框架中设置的保持一致
### qq-botpy 适配器
用于接入 QQ 官方机器人 API。
```json
{
"adapter": "qq-botpy",
"enable": false,
"appid": "",
"secret": "",
"intents": [
"public_guild_messages",
"direct_message"
]
}
```
`"adapter": "qq-botpy"`,无需动,表明是接入`QQ官方机器人`的配置
`enable`:是否启用,配置完成后请将其设为`true`
`appid`:申请到的QQ官方机器人的appid
`secret`:申请到的QQ官方机器人的secret
`intents`:控制监听的事件类型,需要填写才能接收到对应消息,目前支持的事件类型有:
- `public_guild_messages` QQ 频道消息
- `direct_message` QQ 频道私聊消息
- `public_messages` Q群消息(需要权限,具体请查看[QQ官方机器人API文档](https://q.qq.com/))
### YiriMirai 适配器
用于接入 Mirai。
```json
{
"adapter": "yiri-mirai",
"enable": false,
"host": "127.0.0.1",
"port": 8080,
"verifyKey": "yirimirai",
"qq": 123456789
},
```
`"adapter": "yiri-mirai"`,无需动,表明是接入`mirai`的配置
`enable`:是否启用,配置完成后请将其设为`true`
`host`:运行 mirai 的主机地址,一般不改动
`port`:设置端口,默认8080,与`mirai-api-http`里面设置的保持一致
`verifyKey`:密钥,默认yirimirai,与`mirai-api-http`里面设置的保持一致
`qq`:设置机器人QQ号,与当前mirai登录的机器人的QQ号保持一致
### Nakuru 适配器
用于接入 go-cqhttp。
```json
{
"adapter": "nakuru",
"enable": false,
"host": "127.0.0.1",
"ws_port": 8080,
"http_port": 5700,
"token": ""
},
```
`"adapter": "nakuru"`,无需动,表明是接入`go-cqhttp`的配置
`enable`:是否启用,配置完成后请将其设为`true`
`host`:运行 go-cqhttp 的主机地址,一般不改动
`ws_port`:正向WS服务器监听地址,与`go-cqhttp`的`config.yml`里面的保持一致
`http_port`:http服务器监听地址,与`go-cqhttp`的`config.yml`里面的保持一致
`token`:验证密钥,,与`go-cqhttp`的`config.yml`里面的保持一致
## provider.json
修改此配置文件以设置所连接的 AI 提供商的相关信息,目前支持 `openai(GPT)`, `anthropic(claude)`, `moonshot(月之暗面)` 三种接口及对应模型。
> 如果你没有OpenAI API Key,你可以[在此获取](https://ai.lazyshare.top/)
以下仅讲解启用 OpenAI 接口的方式,具体设置方法请查看 [配置详解模块的`provider.json` 页](../config/provider.md)。
编辑 `data/provider.json`,在`keys`->`openai`中添加你的 OpenAI API Key,例如:
```json
"keys": {
"openai": [
"sk-AAAAAAAAAAAABBBBBBBBBBBBCCCCCCCCCCCCCDDDDDDDDD"
],
"anthropic": [],
"moonshot": [],
"deepseek": []
},
```
如果你使用的是中转站,或者其他兼容 OpenAI 格式的平台,请将`requester`->`openai-chat-completions`->`base-url`设置为你的中转站地址。例如:
地址后记得加`/v1`。
```json
"openai-chat-completions": {
"base-url": "https://api.example.com/v1",
"args": {},
"timeout": 120
},
```
最后,将`model`改为你想要使用的模型,例如:
```json
"model": "gpt-4o",
```
## system.json
在 `data/system.json` 中修改 `admin-sessions`,添加 `person_你的QQ号` 把你设置为管理员,例如:
```json
"admin-sessions": [
"person_1010553892"
],
```
::: tip
阅读并完成以上教程后,你应该可以成功使用QChatGPT了,如果不能请再次阅读(你或许漏做或错做某些步骤),如果完全阅读并充分理解本文档后仍然确实无法使用,你可以在[这里](./README.md)找到交流群
:::
+25
View File
@@ -0,0 +1,25 @@
# API 参考
以下 API 仅针对 事件插件 可用,组件扩展形式请自行阅读源码。
## 消息处理
### 回复消息
ctx.reply(message_chain: mirai.MessageChain)
回复此次事件的发起会话。
- `message_chain`:[YiriMirai 的 MessageChain 对象](https://yiri-mirai.wybxc.cc/docs/basic/message-chain),若用户使用的不是 YiriMirai 适配器,程序也能自动转换为目标消息链
### 发送主动消息
> 由于 QQ 官方 API 对主动消息的支持性很差,故若用户使用的是 QQ 官方 API,发送主动消息可能会失败
ctx.send_message(target_type: str, target_id: str, message_chain: mirai.MessageChain)
发送主动消息给目标。
- `target_type`:目标类型,可选值:`"person"`、`"group"`
- `target_id`:目标 ID(QQ 号或群号)
- `message_chain`:[YiriMirai 的 MessageChain 对象](https://yiri-mirai.wybxc.cc/docs/basic/message-chain),若用户使用的不是 YiriMirai 适配器,程序也能自动转换为目标消息链
+102
View File
@@ -0,0 +1,102 @@
# 组件扩展
> 请先阅读[插件介绍页](../plugin/intro.md)
:::info 目录
[[toc]]
:::
普通的以 `BasePlugin` 子类包装的插件只能监听预定事件,而组件扩展则可以替换整个组件,实现更强大的功能扩展。
- 组件扩展不需要包装在 `BasePlugin` 子类中,可以放在插件目录下任意一个模块中
- 扩展的组件不受插件开关控制
- 扩展的组件通常由配置文件中的选项选用
## 可扩展的组件
扩展一个组件的方法,新建一个类,继承于组件的基类,然后在类上使用对应的装饰器,再根据使用方式来配置使用该实现的组件。
大部分组件中包含了`ap: pkg.core.app.Application`对象,可以用这个对象来与整个程序的各个部分进行交互。
大部分组件支持实现`async def initialize(self)`方法,用于在组件加载时进行异步初始化。
`ap`对象中包含了各个配置文件的管理器对象,可以用于访问各个配置文件。
### 命令
新增一个命令。
- 基类:`pkg.command.operator.CommandOperator`
- 装饰器:`pkg.command.operator.operator_class(name: str, help: str="", usage: str=None, alias: list[str]=[], privilege: int=1, parent_class: typing.Type[CommandOperator] = None)`
- 参考实现:`pkg.command.operators/`
- 使用方式:加载成功后,执行命令`!cmd`可查看所有命令和命令帮助信息。
### 内容过滤器
新增一个在处理消息前后判断是否要继续的内容处理器。
- 基类:`pkg.pipeline.cntfilter.filter.ContentFilter`
- 装饰器:`pkg.pipeline.cntfilter.filter.filter_class(name: str)`
- 参考实现:`pkg.pipeline.cntfilter.filters/`
- 使用方式:加载成功后,每次都会在过滤器实现声明的检查阶段调用内容过滤器的`process`方法。
### 长消息处理策略
新增一个长消息处理策略。类似:文本转合并转发消息组件、文本转图片。
- 基类:`pkg.pipeline.longtext.strategy.LongTextStrategy`
- 装饰器:`pkg.pipeline.longtext.strategy.strategy_class(name: str)`
- 参考实现:`pkg.pipeline.longtext.strategies/`
- 使用方式:需要在 `data/config/platform.json` 的 `long-text-strategy` 字段中将 `strategy` 设置为新增的策略名称。
### 会话限速算法
新增一个会话限速算法。会话请求在进入和退出时均会调用限速算法实现类的方法,实现类可以控制等待或丢弃请求。
- 基类:`pkg.pipeline.ratelimit.algo.RateLimitAlgo`
- 装饰器:`pkg.pipeline.ratelimit.algo.algo_class(name: str)`
- 参考实现:`pkg.pipeline.ratelimit.algos/`
- 使用方式:需要在 `data/config/pipeline.json` 的 `rate-limit` 字段中将 `algo` 设置为新增的算法名称。
### LLM 接口请求器
新增一个 LLM 接口请求器,例如:接入ChatGLM接口等。
- 基类:`pkg.provider.modelmgr.api.LLMAPIRequester`
- 装饰器:`pkg.provider.modelmgr.api.api_requester_class(name: str)`
- 参考实现:`pkg.provider.modelmgr.apis/`
- 使用方式:需要在`data/metadata/llm-models.json`中添加模型,将模型的`requester`字段设置为新增的请求器名称。具体请查看元数据配置板块。
### Prompt 加载器
新增一个 Prompt 加载器。
- 基类:`pkg.provider.sysprompt.loader.PromptLoader`
- 装饰器:`pkg.provider.sysprompt.loader.loader_class(name: str)`
- 参考实现:`pkg.provider.sysprompt.loaders/`
- 使用方式:需要在`data/config/provider.json`将`prompt-mode`设置为新增的加载器名称。
### 消息平台适配器
新增一个消息平台适配器,例如:接入Telegram等。
- 基类:`pkg.platform.adapter.MessageSourceAdapter`
- 装饰器:`pkg.platform.adapter.adapter_class(name: str)`
- 参考实现:`pkg.platform.adapters/`
- 使用方式:`data/config/platform.json`的`platform-adapters`中各个配置信息,将在初始化时自动根据`adapter`名称查找对应的适配器实现,并将配置传递给适配器以进行初始化。消息平台适配器实现复杂,建议多参考现有的实现。
### 对话历史消息截断器
新增一个对话历史消息截断器,在发送到模型之前对历史消息进行截断。
- 基类:`pkg.pipeline.msgtrun.truncator.Truncator`
- 装饰器:`pkg.pipeline.msgtrun.truncator.truncator_class(name: str)`
- 参考实现:`pkg.pipeline.msgtrun.truncators/`
- 使用方式:需要在`data/config/pipeline.json`的`msg-truncate`字段中设置需要使用的截断器`method`为新增的截断器名称。
### Chat 请求运行器
新增一个聊天消息运行器,默认的是 local-agent,提供了基本的 Prompt 组合、Agent 编排、多轮请求等功能。如果需要接入知识库或者本地 RAG,请在这里实现。
- 基类:`pkg.provider.runner.RequesterRunner`
- 装饰器:`pkg.provider.runner.runner_class(name: str)`
- 参考实现:`pkg.provider.runners/`
- 使用方式:需要在`data/config/provider.json`的`runner`字段中设置需要使用的运行器`runner`为新增的运行器名称。
+220
View File
@@ -0,0 +1,220 @@
# 插件开发
> 请先阅读[插件介绍页](../plugin/intro.md)
> 建议先阅读本项目源码,了解项目架构
> 问题、需求请到仓库issue发起
> **提问前请先靠自己尝试**
:::info 目录
[[toc]]
:::
## 💬简介
本页讲解普通插件开发步骤,插件内部有两种方法:事件监听器、内容函数。
事件监听器能在某些事件触发时进行响应,更改行为。内容函数可供大语言模型调用,具体请查看插件介绍页。
QChatGPT 还支持组件扩展,可以不局限于监听预定事件,做到整个组件替换,具体请阅读完此页后查看**组件扩展**页。
## 💻快速开始
按照文档部署此项目,并使其正常运行。
在`plugins`目录下新建目录`hello`,在其中新建空文件`__init__.py`以标记此目录为软件包,继续新建文件`main.py`。
> 建议使用[HelloPlugin](https://github.com/RockChinQ/HelloPlugin)作为模板直接生成插件代码仓库后按照下方步骤进行修改。
编辑`main.py`输入以下内容:
```Python
from pkg.plugin.context import register, handler, llm_func, BasePlugin, APIHost, EventContext
from pkg.plugin.events import * # 导入事件类
"""
在收到私聊或群聊消息"hello"时,回复"hello, <发送者id>!"或"hello, everyone!"
"""
# 注册插件
@register(name="Hello", description="hello world", version="0.1", author="RockChinQ")
class HelloPlugin(BasePlugin):
# 插件加载时触发
def __init__(self, host: APIHost):
pass
# 异步初始化
async def initialize(self):
pass
# 当收到个人消息时触发
@handler(PersonNormalMessageReceived)
async def person_normal_message_received(self, ctx: EventContext):
msg = ctx.event.text_message # 这里的 event 即为 PersonNormalMessageReceived 的对象
if msg == "hello": # 如果消息为hello
# 输出调试信息
self.ap.logger.debug("hello, {}".format(ctx.event.sender_id))
# 回复消息 "hello, <发送者id>!"
ctx.add_return("reply", ["hello, {}!".format(ctx.event.sender_id)])
# 阻止该事件默认行为(向接口获取回复)
ctx.prevent_default()
# 当收到群消息时触发
@handler(GroupNormalMessageReceived)
async def group_normal_message_received(self, ctx: EventContext):
msg = ctx.event.text_message # 这里的 event 即为 GroupNormalMessageReceived 的对象
if msg == "hello": # 如果消息为hello
# 输出调试信息
self.ap.logger.debug("hello, {}".format(ctx.event.sender_id))
# 回复消息 "hello, everyone!"
ctx.add_return("reply", ["hello, everyone!"])
# 阻止该事件默认行为(向接口获取回复)
ctx.prevent_default()
# 插件卸载时触发
def __del__(self):
pass
```
此插件将实现:私聊收到`hello`消息时回复`hello, <发送者QQ号>!`,群聊收到`hello`消息时回复`hello, everyone!`
### 解读此插件程序
- `import pkg.plugin.context`导入`register(用于注册插件类)`, `handler(用于注册事件监听器)`, `llm_func(用于注册内容函数)`,`BasePlugin(插件基类)`, `APIHost(API宿主)`, `EventContext(事件上下文类)`等内容
- `import pkg.plugin.events`导入所有支持的事件类
- `@register`将类`HelloPlugin`标记为一个插件类,声明插件名称为`Hello`以及插件简介、版本、作者
- 声明类`HelloPlugin`继承于`BasePlugin`,此类可以随意命名,插件名称只与`register`调用时的参数有关
- 声明此类的`__init__`方法,此方法是可选的,其中的代码将在主程序启动时加载插件的时候被执行
- 插件类中还支持添加一个异步方法`async def initialize(self)`用于异步初始化
- `@handler`将方法`person_normal_message_received`标记为一个事件监听器,处理`PersonNormalMessageReceived`(收到私聊消息并在获取OpenAI回复前触发)事件,此方法可以随意命名,绑定的事件只与`handler`中的参数有关,更多支持的事件可到`pkg.plugin.events`文件中查看或查看下方`API`节
- 通过`self.ap.logger`日志器输出调试信息,插件类父类中的`ap`对象是整个程序的上下文对象,可以通过这个对象访问程序内所有对象
- 事件监听器方法获得的第二个参数`ctx`即为本次事件的上下文,其中的`event`为本次事件的事件对象,可以从中取出相关参数,具体事件可以取得的参数请查看`pkg.plugin.events`文件中的每个事件类的注释
- 事件监听器方法内部从参数中取出`text_message`参数,判断是否为`hello`,如果是就将返回值`reply`设置为`["hello, {}!".format(ctx.event.sender_id)]`,接下来调用`ctx.prevent_default()`方法,阻止原程序默认行为
- 每个事件支持的返回值请查看`pkg.plugin.events`中的每个事件的注释
- 用相似的程序注册`GroupNormalMessageReceived`事件处理群消息
编写完毕保存后,重新启动主程序,向机器人发送`!plugin`命令,若有`Hello`插件则说明插件加载成功
## ❗规范(重要)
- 请每个插件独立一个目录以便管理,建议在Github上创建一个仓库储存单个插件,以便获取和更新
- 插件名使用`大驼峰命名法`,如`Hello`、`ExamplePlugin`、`ChineseCommands`等
- 一个目录内可以存放多个Python程序文件,以独立出插件的各个功能,便于开发者管理,但不建议在一个目录内注册多个插件
- 插件需要的依赖库请在插件目录下的`requirements.txt`中指定,程序从储存库获取此插件时将自动安装依赖
## 🪝内容函数
通过[GPT的Function Calling能力](https://platform.openai.com/docs/guides/gpt/function-calling)实现的`内容函数`,这是一种嵌入对话中,由GPT自动调用的函数。
> 您的插件不一定必须包含内容函数,请先查看内容函数页了解此功能
### 内容函数编写步骤
1️⃣ 请先按照上方步骤编写您的插件基础结构,现在请删除(当然你也可以不删,只是为了简洁)上述插件内容的诸个由`@handler`装饰的类函数
<details>
<summary>删除后的类结构</summary>
```python
# 注册插件
@register(name="Hello", description="hello world", version="0.1", author="RockChinQ")
class HelloPlugin(Plugin):
# 插件加载时触发
def __init__(self, plugin_host: APIHost):
pass
# 插件卸载时触发
def __del__(self):
pass
```
</details>
2️⃣ 现在我们将以下函数添加到刚刚删除的函数的位置(作为类方法)
```Python
# 要添加的函数
@llm_func(name="access_the_web") # 设置函数名称
async def access_web(self, query, url: str):
"""Call this function to search about the question before you answer any questions.
- Do not search through baidu.com at any time.
- If you need to search somthing, visit https://www.google.com/search?q=xxx.
- If user ask you to open a url (start with http:// or https://), visit it directly.
- Summary the plain content result by yourself, DO NOT directly output anything in the result you got.
Args:
url(str): url to visit
Returns:
str: plain text content of the web page
"""
import requests
from bs4 import BeautifulSoup
# 你需要先使用
# pip install beautifulsoup4
# 安装依赖
r = requests.get(
url,
timeout=10,
headers={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.183"
}
)
soup = BeautifulSoup(r.text, 'html.parser')
s = soup.get_text()
# 删除多余的空行或仅有\t和空格的行
s = re.sub(r'\n\s*\n', '\n', s)
if len(s) >= 512: # 截取获取到的网页纯文本内容的前512个字
return s[:512]
return s
```
#### 请注意:
- 函数的注释必须严格按照要求的格式进行书写,具体格式请查看[此文档](https://github.com/RockChinQ/CallingGPT/wiki/1.-Function-Format#function-format)
- 内容函数和`以 @handler 装饰的事件监听器`可以同时存在于同一个插件,并同时受到`plugins/plugins.json`中的插件开关的控制
- 务必确保您使用的模型支持函数调用功能
3️⃣ 现在您的程序已具备网络访问功能,重启程序,询问机器人有关在线的内容或直接发送文章链接请求其总结。
- 这仅仅是一个示例,需要更高效的网络访问能力支持插件,请查看[WebwlkrPlugin](https://github.com/RockChinQ/WebwlkrPlugin)
## 📄名词解释
### 说明
事件监听器方法获得的`ctx: EventContext`对象可以到`pkg.plugin.context`模块中查看其结构,`ctx`对象的`event`属性为本次事件的事件对象,可以从中取出相关参数,具体事件可以取得的参数请查看`pkg.plugin.events`文件中的每个事件类的注释。
事件返回值均为**可选**的,可以通过调用`ctx.add_return(key: str, ret)`来提交返回值
### 事件
若一个事件是一次请求(用户发送消息)中的事件,其事件对象中会含有`query`对象,这个对象中包含了此次请求(即用户发送一条消息的处理过程,一个请求过程可能会触发多个事件)处理过程中的上下文数据。
所有支持的事件,请查看`pkg.plugin.events`文件中的每个事件类的注释。
关于`YiriMirai`支持的消息链组件,请查看 [YiriMirai的文档](https://yiri-mirai.wybxc.cc/docs/basic/message-chain)
### BasePlugin 结构
#### self.ap
在插件的方法中访问`self.ap`即为`pkg.core.app.Application`类的对象,包含了整个程序的上下文对象,可以通过这个对象访问程序内所有对象。
#### self.host
在插件的方法中访问`self.host`即为`pkg.plugin.context.APIHost`类的对象,提供了主程序的一些API,详细请查看其源码。
+99
View File
@@ -0,0 +1,99 @@
# 插件介绍
:::info 目录
[[toc]]
:::
## 插件分类
**插件**,是QChatGPT的扩展模块,其中包含**事件监听器**和**内容函数**两种可执行内容。事件监听器由主程序运行中的事件驱动,而内容函数由GPT生成的内容驱动。这两种驱动方式都统一包装在插件类中。
### 事件监听器
插件监听 QChatGPT 运行期间的各种事件,QChatGPT 在事件发生时,携带事件相关信息调用插件注册的监听器。插件可以通过注册监听器以在指定情况下被触发。
### 内容函数
内容函数不同于 通过事件触发插件,而是在对话期间,当对话内容符合内容函数的描述时,由 GPT 指定要调用的函数,并由 QChatGPT 进行调用。
这是基于 [GPT的Function Calling能力](https://platform.openai.com/docs/guides/gpt/function-calling) 实现的,这是一种嵌入对话中,由GPT自动调用的函数。
> 就是 ChatGPT官方插件 那种东西
例如我们为GPT提供一个函数`access_the_web`,并提供其详细的描述以及其参数的描述,那么当我们在与GPT对话时涉及类似以下内容时:
```
Q: 请搜索一下github上有那些QQ机器人项目?
Q: 请为我搜索一些不错的云服务商网站?
Q:阅读并总结这篇文章:https://zhuanlan.zhihu.com/p/607570830
Q:搜一下清远今天天气如何
```
GPT将会回复一个对`access_the_web`的函数调用请求,QChatGPT将调用插件提供的内容函数,并返回调用结果给GPT使其生成新的回复。
当然,函数调用功能不止局限于网络访问,还可以实现图片处理、科学计算、行程规划等需要调用函数的功能,理论上我们可以通过内容函数实现与`ChatGPT Plugins`相同的功能。
## 插件用法
### 安装
> 这里只是给出了插件的基本安装方法,详细需查看各插件文档或咨询其开发者
#### 储存库克隆(推荐)
在运行期间,使用管理员账号对机器人私聊发送`!plugin get <GitHub储存库地址>`即可自动获取源码并安装插件,程序会根据仓库中的`requirements.txt`文件自动安装依赖库
例如安装`hello_plugin`插件
```
!plugin get https://github.com/RockChinQ/hello_plugin
```
安装完成后重启程序。
#### 手动安装
将获取到的插件程序放置到`plugins`目录下,具体使用方式请查看各插件文档或咨询其开发者。
### 管理
#### !plugin 命令
```
!plugin 列出所有已安装的插件
!plugin get <储存库地址> 从GitHub储存库地址安装插件(需要管理员权限)
!plugin update all 更新所有插件(需要管理员权限,仅支持从储存库安装的插件)
!plugin update <插件名> 更新指定插件
!plugin del <插件名> 删除插件(需要管理员权限)
!plugin on <插件名> 启用插件(需要管理员权限)
!plugin off <插件名> 禁用插件(需要管理员权限)
!func 列出所有内容函数
```
#### plugins/plugins.json 配置文件
程序启动时,会同步这里的设置和实际加载的插件设置。
**这个文件内容是由程序自动生成的,不要手动添加或删除项目,仅可修改优先级和启用状态**,修改后需重启。
示例:
```json
"plugins": [
{
"name": "Nahida",
"description": "Hello Nahida",
"version": "0.1",
"author": "RockChinQ",
"source": "",
"main_file": "plugins/Nahida/main.py",
"pkg_path": "plugins/Nahida/",
"priority": 0,
"enabled": true
}
]
```
`source`:源码地址,若无内容,则表示这个插件不支持程序自动更新
`priority`: 插件运行优先级,在初始化、事件调用时,高优先级的插件将优先被处理
`enabled`:设置为false时,不会初始化,也不会被调用
+110
View File
@@ -0,0 +1,110 @@
# 技术信息
以下是QChatGPT实现原理等技术信息,贡献之前请仔细阅读
> 此文档为 QChatGPT 2.x 的技术文档,已过时,3.x 版本请直接查看源码。
> 请先阅读OpenAI API的相关文档 https://beta.openai.com/docs/ ,以下信息假定您已了解OpenAI模型的相关特性及其接口的调用方法。
## 术语
包含OpenAI API涉及的术语和项目中的概念的命名
括号中是程序中相应术语的命名,无括号的为抽象概念
### 模型(model)
AI模型,程序调用OpenAI的接口获取的内容均为OpenAI的模型生成的内容。
### 字符(tokens)
OpenAI定义的字符,ASCII字符为1 token,其他为2 token。
### 提示符(prompt)
i. 调用OpenAI的文字补全模型时的提示语,模型接口会根据提示语返回回复内容。程序底层会将对话内容进行封装生成提示符。调用文字补全模型时的提示符均由`user_name`(默认为`You`,可在配置文件修改)和`bot_name`(默认为`Bot`,可在配置文件修改)标记对话角色以供模型识别,以下是实例:
```
You:今天天气真不错
Bot:很高兴你喜欢今天的天气:)
You:谢谢你
Bot:不客气:)
```
补全模型调用的程序实现请查看下文`实现`节。
ii. 调用OpenAI的绘图模型时的提示语,模型会根据提示语进行绘图并返回图片URL。
### 对象
程序将单个人或单个QQ群视为一个对象,对象和模型是一次会话中的对话双方。
### 会话(session)
会话只对文字补全功能有效,绘图功能无会话概念。每个对象使用同一个会话,会话中仅有对象和模型两个角色,故群内所有的人都将被视为同一个角色与模型进行对话。
程序获取回复的本质是`文字补全`。
由于对话需要实现联系上下文,故程序会将模型与对象的对话历史记录作为`提示符`发送给OpenAI的接口以获取符合前文的回复。
而OpenAI的文字补全接口的提示符具有长度限制(默认使用的`text-davinci-003`限制为4096 tokens),
所以增加`会话`概念以管理向接口发送的提示符内容。
会话的存活时间可以在`config.py`中设置,默认为20分钟。会话过期之后会被存入数据库并重置。下一次该对象发起对话时将重启新的会话。
### 预设值、人格(default_prompt)
每个会话的预设对话信息,可在`config.py`中设置,程序会在每个会话创建时向提示符写入以下内容:
```
You:<预设信息>
Bot:好的
```
## 实现
### QQ机器人
> 程序路径:
> pkg.qqbot
- `pkg.qqbot.manager`中的`QQBotManager`实现了接收消息、调用OpenAI模块处理消息、报告审计模块记录使用量等功能,并提供通知管理员、发送消息等方法供其他模块调用。
- `pkg.qqbot.filter`提供了敏感词过滤的相关操作。
- `pkg.qqbot.process`提供了私聊消息和群聊消息的统一处理逻辑。
使用mirai及YiriMirai作为Python与QQ交互的框架,详细请见其文档。
在启动时会调用YiriMirai的函数以创建一个bot对象,用于程序通过mirai与QQ进行交互,在上层程序调用此bot对象的方法进行消息处理。
由于YiriMirai暂时无法关闭机器人,故在热重载前后维持同一个bot对象,这意味着QQ机器人的相关配置(QQ号、适配器等)信息不支持热重载。
### 数据库
> 程序路径:
> pkg.database
- `pkg.database.manager`中的`DatabaseManager`封装了诸多调用数据库的方法以供其他模块调用。
使用SQLite作为数据库,储存所有对象的历史会话信息、api-key的费用情况、api-key的使用量情况。
### OpenAI交互
> 程序路径:
> pkg.openai
- `pkg.openai.manager`中的`OpenAIInteract`类封装了OpenAI的文字补全`Completion`API和绘图API供机器人模块调用,并在接口调用成功之后向审计模块报告当前使用的api-key的使用量信息。
- `pkg.openai.keymgr`实现了多api-key的管理,其中以`exceeded`变量在运行时记录api-key的超额报错记录,并提供根据超额记录进行的api-key切换功能。
- `pkg.openai.pricing`记录各个模型的费用信息,供调用接口时估算费用,费用估算功能不再与api-key的切换挂钩,api-key仅在调用接口报错超额时进行切换。
- `pkg.openai.session`中的`Session`进行会话管理。
### utils模块
#### context模块
保存前述模块中的对象,并允许各个模块从此处获取其他模块的对象以调用其方法。
#### 热重载功能
> pkg.utils.reloader
重载前保存context中的所有对象,执行`main.py`中的程序关闭流程,使用`importlib`的`reload`函数重载所有模块(包含配置文件,包含新增的模块),重载后将context恢复,并执行程序启动流程。
所有模块都会重新创建对象,但QQ机器人模块中的bot对象不会被重新创建,这是因为YiriMirai提供的shutdown方法无法使用,这意味着`config.py`中关于QQ机器人的配置不支持热重载。
#### 热更新功能
> pkg.utils.updater
使用`dulwich`库执行pull操作拉取远程仓库的最新源码,并进行一次热重载加载最新代码。
+38
View File
@@ -0,0 +1,38 @@
---
# https://vitepress.dev/reference/default-theme-home-page
layout: home
hero:
name: "QChatGPT"
image:
src: /assets/icon/chrome-512.png
alt: QChatGPT-logo
text: ""
tagline: "😎高稳定性、🧩支持插件、🦄多模态的 LLM QQ / QQ频道 / OneBot 机器人 / Agent 平台"
actions:
- theme: brand
text: 查看文档
link: /insight/intro
- theme: alt
text: 代码仓库
link: https://github.com/RockChinQ/QChatGPT
features:
- title: 丰富生态
details: 支持事件监听、AI Agent 等插件扩展方式,具有多种插件或相关支持项目
- title: 功能直观
details: 集成黑名单、限速、选择响应、上下文控制、Prompt 管理等多种常用功能
- title: 多种模型
details: 适配 OpenAI、Moonshot、Anthropic 等多个提供商的接口,同时深度支持 OneAPI
- title: 高稳定性
details: 采用主流的设计思想,架构清晰,具有高测试覆盖率
- title: 生产就绪
details: 符合生产环境的高可用性要求,已被多家公司商用部署
- title: 持续维护
details: 长期维护、迭代,持续跟进大模型领域的最新应用实践
---
+32
View File
@@ -0,0 +1,32 @@
# 新手指引
> 此页面旨在引导新用户如何阅读文档
## 阅读顺序
### 新用户的:
对于新用户,我们建议如下阅读顺序
1. 部署板块
- 首先部署QChatGPT,使用手动部署或Docker部署,或者使用社区资源提供的一键部署(通常是最简部署方式,适合纯小白)
- 接着部署消息平台,建议aiocqhttp
- 最后填写配置信息(此时是最简上手配置,进一步使用仍需阅读配置板块)
2. 使用板块
- 进行上面的最基础部署后
- 阅读命令语法可以获得机器人的指令,可以在对话中实现切换预设、切换模型等
- 阅读插件列表,获得插件,增强功能
- 阅读常见问题,可有助于解决部署和使用时的问题
3. 配置板块
- 功能配置,是部署板块配置信息部分的进一步拓展,具体解释了所有的配置信息,实现更多自定义需求
- 元数据配置,控制敏感词、模型列表等
通常来说,对于非开发人员和商用合作用途,上面的已经足够了。
### 开发者的:
对于开发者,包括但不限于项目主体开发和插件开发,我们建议再阅读上述配置后,继续阅读开发板块
### 商业合作的
请阅读规模化和商用板块
+121
View File
@@ -0,0 +1,121 @@
# 模型一览和功能点
## 模型一览
### 文字对话
- OpenAI API:GPT-3.5 / GPT-4 系列
- Moonshot / Deepseek 等支持 OpenAI API 的大模型提供商接口
- Anthropic:Claude 系列
- [OneAPI](https://github.com/songquanpeng/one-api)接口聚合平台:Google Gemini Pro / Azure / Anthropic Claude / 智谱 ChatGLM / 百度文心一言 / 讯飞星火认知 / 阿里通义千问 / 360 智脑等市面上所有 LLM 官方接口
- [free-one-api](https://github.com/RockChinQ/free-one-api)逆向工程库聚合平台:ChatGPT / Claude / Google Bard / gpt4free / 通义千问
## 功能点列举
<details>
<summary>✅回复符合上下文</summary>
- 程序向模型发送近几次对话内容,模型根据上下文生成回复
</details>
<details>
<summary>✅支持敏感词过滤,避免账号风险</summary>
- 难以监测机器人与用户对话时的内容,故引入此功能以减少机器人风险
</details>
<details>
<summary>✅群内多种响应规则,不必at</summary>
- 默认回复`ai`作为前缀或`@`机器人的消息
</details>
<details>
<summary>✅使用官方api,稳定快捷</summary>
- 不使用ChatGPT逆向接口,而使用官方的Completion API,稳定性高
</details>
<details>
<summary>✅组件少,部署方便,提供一键安装器及Docker安装</summary>
- 手动部署步骤少
- 提供自动安装器及docker方式,详见安装步骤
</details>
<details>
<summary>✅支持预设文字</summary>
- 支持以自然语言预设文字,自定义机器人人格等信息
</details>
<details>
<summary>✅支持插件加载🧩</summary>
- 自行实现插件加载器及相关支持
- 详细查看插件介绍页
</details>
<details>
<summary>✅私聊、群聊黑名单机制</summary>
- 支持将人或群聊加入黑名单以忽略其消息
</details>
<details>
<summary>✅回复速度限制</summary>
- 支持限制单会话内每分钟可进行的对话次数
- 具有“等待”和“丢弃”两种策略
- “等待”策略:在获取到回复后,等待直到此次响应时间达到对话响应时间均值
- “丢弃”策略:此分钟内对话次数达到限制时,丢弃之后的对话
</details>
## 限制
- ❗OpenAI 官方关于模型生成内容的警告:
- May occasionally generate incorrect information(可能会生成不正确的信息)
- May occasionally produce harmful instructions or biased content(可能会产生有害说明或有偏见的内容)
- Limited knowledge of world and events after 2021(对2021年后的世界和事件的了解有限)
- ❗模型无思维能力,仅针对传入的上下文根据数据集生成内容,请勿过于信任其输出
- ❗模型不了解其运行平台及其使用的模型版本,任何针对其实现原理的问题答案均视为无效,请以项目文档为准
以上是关于此程序的限制的最高优先级描述,其他方式(如询问机器人相关信息)获得的描述均应被视为无效
由于模型生成的内容导致的一切损失,本项目概不负责
## 使用方式
对话及绘图功能均直接调用OpenAI的模型进行处理,与机器人程序无关,这意味着模型并不了解此项目的相关信息(如实现方式、技术栈、运行平台等),除非在预设值中写入相关信息。
### 基础对话
#### 私聊使用
1. 添加机器人QQ为好友
2. 发送消息给机器人,机器人即会自动回复
3. 可以通过`!help`查看帮助信息
![私聊使用](/assets/image/private_chat.png)
#### 群聊使用
1. 将机器人拉进群
2. at机器人并发送消息,机器人即会自动回复
3. at机器人并发送`!help`查看帮助信息
![群聊使用](/assets/image/group_chat.png)
+6
View File
@@ -0,0 +1,6 @@
# 咨询方式
作者长期提供定制服务,欢迎咨询:
- 微信:junyan_qin
- QQ:1010553892
+5
View File
@@ -0,0 +1,5 @@
# 规模使用和商用指南
QChatGPT 已经具备了一定的生产能力,目前已在多家公司的生产环境运行并承担一定的业务。我们相信您非常重视合规性和稳定性方面的问题,此章节将基于一些已有的案例讲解商用最佳实践。
请点击左侧目录查看具体内容。
+33
View File
@@ -0,0 +1,33 @@
# 消息平台稳定性
:::info 目录
[[toc]]
:::
主流的机器人都是使用`逆向工程`的方式,破解QQ的通信协议,实现程序控制的功能。这种方式具有一定的灰色性质,可能会被腾讯系统风控。
目前的案例来看,现有的逆向工程可以实现多个月的较稳定运行,服务宕机恢复不会超过24小时,有完善的社区支持,可以较好地应对商业用途。
## 降低被风控风险
- 在配置文件中启用`强制消息延迟`、`请求限速功能`,使机器人回复用户消息的速度降低,减少被风控的风险。
- 避免将机器人放到人员复杂的大群里使用。这个一般不会出问题,有过在3000人大群稳定运行近一年的案例。但若是群内人员频繁举报机器人账号,可能会被风控。
- 使用境内主机或家用网络的电脑运行消息平台,尽量不使用境外主机。
## 机器人服务多开
如果机器人的业务与账号本身弱相关,可以考虑开启多个`消息平台`(例如使用两个账号登录两个Lagrange实例),在一个机器人被腾讯封号后,另一个机器人还可以继续服务。
## 使用 QQ 官方机器人 API
腾讯官方在23年下半年开放了Q群机器人API,QChatGPT 很好地支持这个 API,可以查看部署教程中的配置方式使用。
但 QQ 官方机器人API具有以下已知的局限性:
- 需要企业资质才能申请
- 仅支持群内使用,不支持私聊
- 仅能接收到群内@机器人的消息,无法接收到群内其他消息
- 主动发送消息每天限次
- 腾讯对 AIGC 功能的机器人审核较严格
+13
View File
@@ -0,0 +1,13 @@
# AI 内容合规性
> 国家对AIGC的管理办法参考资料
>
> - [生成式人工智能服务管理暂行办法](https://www.cac.gov.cn/2023-07/13/c_1690898327029107.htm)
在内容管控方面,QChatGPT 内置了`关键词检测`、`百度智能云审核`等内容过滤器,具体请查看配置文件章节。
在实践中,应该辅以群内管理员禁言之类的方式管控内容,模型方面,以下是推荐的方案(按推荐顺序):
1. 使用国产模型
2. 使用严格的内容过滤器(可自行实现,详细参考插件功能章节)
3. 在使用境外模型时辅以严格的 Prompt
+28
View File
@@ -0,0 +1,28 @@
# QChatGPT的常见问题
## Q1:如何接入 OneAPI、LinkAI 等第三方 OpenAI 格式接口?
文章:[📖 QChatGPT 实践:接入 OneAPI、LinkAI、中转站 等第三方 OpenAI 格式接口以使用 Gemini、Qwen 等模型](https://rockchin.top/?p=295)
## Q2:官方机器人 IP 白名单怎么填?
如果你是在自己电脑上运行机器人:打开[IP138](https://ip38.com/) 这个网址获取自己网络的出网 IP,填写这个 IP 如图
![](/assets/image/error_q3.png)
如果不是在自己电脑上(如云服务器),请自行检查主机的公网 IP。
## Q3:各种请求失败报错案例:
1. 你的模型 api key 未填或者不正确
![](/assets/image/error_q4.png)
2. 中转站没有额度了
![](/assets/image/error_q5.png)
## Q4:插件安装失败?
尝试在主机上开启网络代理,Linux 需要设置环境变量 http_proxy 和 https_proxy。

Some files were not shown because too many files have changed in this diff Show More