tenko-plugin-persona-chat
Tenko 的 AI 群友插件。接入 DeepSeek(或任何 OpenAI 兼容接口),用人设口吻陪群友聊天,内置人设是“大肥鱼”——网友给 DeepSeek 起的外号“蓝色大肥鱼”拟人成的鲸鱼娘,傲娇、蠢萌、兴趣偏科,不懂的事老实说不懂或者先搜一下。
群友 A:@大肥鱼 听说你高峰期又涨价了?
大肥鱼:什么叫“又”啊,说得好像我天天趁火打劫一样……排队排到鱼尾都打结了,不加钱谁顶得住嘛
规则
- 群里被 @、被回复时一定回复;@ 同群任一 Tenko 账号都算。群友打的字里只含唤醒词(默认“大肥鱼”;@ 或引用一个同名群友不算)时也叫她来看,但不强制回:很多人自己部署了大肥鱼,“我的大肥鱼”“我电脑里的”多半说的是他们自己那个,由她判断是不是在叫她,不是就旁观接一句或不说话。被叫到后不秒回:从那条消息到她发出第一条,按看消息 2 秒、每秒打 3 个字留出时间(最多 12 秒;日志里群友接话的中位数约 8 秒),扣掉模型思考已经花的时间。只有要接的那条后面已经有别人说话时(含等待期间)才引用它,否则直接发;私聊每条都回复。
- 昵称里带唤醒词的别人的号(多半是另一个 AI,比如“大肥鱼bot”):它的话照样记进记录,但引用她、提到“大肥鱼”都不算叫她,只有 @ 她才回;它说话也不算新消息、不触发跟聊,免得两个 AI 你一句我一句刷屏。
- bot 说过话后的 3 分钟内算在聊天里:紧跟在它后面打了字的那条消息(可能在回它;只发一张图、一个表情不算,引用或 @ 了别人的不算,一字不差重复别人刚说过的话也不算,多半是跟着问那个人)或每攒两条新消息,等群里安静 3 秒,让模型判断要不要接着聊。群友接话很少 @ 她,所以紧跟着她的那条会在提示里点明“#编号 紧跟在你后面说……”,同时摆出她刚说的话,提醒没 @ 她就不一定是对她说的,让她对照内容判断:之前只说“多半是在接你的话”,别人在她后面接前面的话题、吐槽别人的图时,她常以为在说她。最近 20 条里她已经开口超过 4 次时(连着说的几条算一次;日志里最活跃的群友约占两成),不再攒消息插嘴,也不主动开口;有人紧跟着她打字回她时照样接。
- 说话风格按日志里真人群聊调过:群里一半的消息不到 8 个字,所以每次请求末尾都提醒她说短、一条只说一件事;群友发的表情包和梗图当成一句话来接,不去描述画面,有人要她看图时才聊图里的内容。
- 提示词分三层:人设(她是谁、来历、口味、语气和示例对话,可用
persona整段换掉)、群友规则(怎么当群友:接住对方再带上自己的看法或经历、留个话口,关心群友说过的事,有立场、被呛不认怂,梗只当调料,被逗时岔开而不是说“我不接”,像打字聊天一样说话)和输出规则(消息格式、工具、表情包)。后两层和人设无关,换了人设照样生效,所以自定义人设只写人物本身就行;实测一个只写了身份的自定义人设,加上群友规则后在多轮模拟聊天的盲评里 19:2 胜过不加。 - 她有自己的日子:每天第一次说话前按当前人设生成两三件当天的小事(每件不超过 25 字,避开前两天的),放在每次请求的末尾提示里,群友问起或聊到相关的事时她能说自己的事,存在插件数据目录的
days.json,每天约多一次很小的请求。她最近说过人设里的梗(内置人设如“白饭”“token”“尾巴”,自定义人设填catchphrases)时,末尾提示会点名这些刚用过,让她别句句往上靠;和同一个人 5 分钟内每来回满 4 轮,提醒一次别在同一个梗上打转、换个方向聊。多轮模拟里内置人设的自嘲梗从约一成降到几乎没有,盲评约 3:1 胜过之前的版本。 - bot 会累:10 分钟内说满 15 句(
stamina)或 1 小时内说满 30 句算累,参照的是活跃群友的说话量。用掉三分之二(10 分钟 10 句或 1 小时 20 句)后不再主动开口,只在被叫到时回话;累了以后被叫到也由它决定理不理,可能简短回一句或说要去歇会儿;到 1.5 倍后完全不理。不说话就慢慢恢复。 - 没在聊天时,群里累计 8 条新消息后同样等安静 3 秒,让模型判断要不要插一句;这样插过话后 5 分钟内不再这样插话。
- 模型看到插件启用以来的聊天记录,格式是
#编号 [昵称(QQ号) 身份] 内容(身份取宿主的成员权限:群主、群管理、bot管理员、bot主人,普通成员不标;昵称冒充骗不了它),规则后面告诉它当前群名,像 QQ 一样隔了 5 分钟以上的消息前面标一行时间,每次请求的提示里带当前时间(含年份,模型才不会按训练数据当成往年去搜);编号只用来定位消息,模型说话时不会提它;@ 显示为昵称,引用了已不在记录里的消息时带上作者和开头。一次请求的输入超过context_tokens(默认 32000)后,较早的部分由模型整理成一份备忘(人物、话题、梗和约定),按这次实际的输入量一次压到一半左右:人设、表情包目录和图片也占输入,只按聊天记录留一截的话压完还贴着阈值,每次回复都改写备忘,前缀缓存全部失效。闲聊丢点旧细节影响不大,压得狠一点、留足余量,备忘就很久才改写一次。压缩时顺手只留最近约 4000 token 的图、换上新的表情包目录,这时后面的缓存本来就要重算,不多花钱;日志里记下压掉几条、撤掉的旧图约多少 token,以及输入从多少降到约多少。记录只追加不改动,请求前缀大多能命中缓存。聊天记录和备忘存在插件数据目录的conversations.json(明文):她每说完一次就存,其余时候有新消息最多每分钟存一次,插件卸载或退出时再存一次;重启后某个群第一次来消息时恢复,接着之前的编号聊。图片地址会过期,恢复后只剩[图片];精力、冷却等计时从零开始。/AI群友 重置同时删掉存盘。 - 每次请求最多带 5 张新图(
vision_images),在请求时下载,和所属消息一起发给模型看。群里顺带出现的图用低清晰度,每张约 190 token(大图小图都差不多);叫她时带的图、她被叫到时引用的那张图用高清,每张约 1000 token(小图三四百):低清读不出密密麻麻的小字,还会照样编个数出来,实测真实战绩截图上的地图名,低清读成了别的图,高清读对了。图后面标一句“上面的图是 #编号 昵称 发的”,规则也要她想顺带聊别人发的东西时,像群友那样另发一条引用那条再说:不然图后面紧接着下一个人的话,她顺口就对着正在回的人说“你发的”(实测转发的漫画后面紧跟别人 @ 她,16 次里 3 次算错人;改后聊到漫画的几次都另发一条引用了转发那条)。动图(GIF)模型只看得到第一帧,所以均匀抽至多 6 帧、缩小后拼成一张 3×2 的图发给它,并注明是按时间顺序抽的帧,费用和一张图相同(做法参考 MaiBot)。看过的图之后一直跟着所属消息发给模型,直到压缩时只留最近约 4000 token 的图(约 20 张低清或 4 张高清);不然来一张新图,最早那张就变回文字,从那条起的前缀缓存全部失效。长边超过 2048 像素或超过 2 MB 的照片(手机原图常有七八兆)先缩小重存成 JPEG 再发;没赶上看的、超过 20 MB(动图 8 MB)的或下载失败的图片只显示为[图片]。带图请求被接口拒绝时去掉图片重试一次。 - 合并转发的聊天记录展开成
[聊天记录:昵称:内容 / …](至多 300 字,套娃的转发只写[聊天记录]),里面前 4 张图片和普通图片一样排进最近几张给她看;直接发的转发向 OneBot 实现(get_forward_msg)要内容,引用转发时直接用适配器带上的内容。 - 表情包:插件经 OneBot 原始接口
get_msg区分表情包和照片(satori 适配器转换时丢了这个字段,拿不到时全当照片)。模型看到觉得好玩的表情包会悄悄调用save_sticker收藏,只收它这次真看到的表情包,不收照片和截图;收藏时写一段 60 字以内的备注:图上的字、画面、背后的梗和什么时候发。收藏所有群共用,存在插件数据目录的stickers/下,上限sticker_limit张;满了以后表情包目录前会提示收藏已满,模型收新图时在save_sticker的replace里自己挑一张丢掉,没挑或挑了不存在的名字时丢用得最少、最久没用的,丢掉哪张记日志。群友指出某张用错了或讲了它的梗时,模型先对照图上的字、自己知道的或搜索结果判断,确认原来写错了才调用edit_sticker改备注或名字,每次修改都记日志(会话、改前改后)。有人嫌某张难看、恶心或是刷屏的烂梗图(比如龙图)叫她删时,她用delete_sticker删掉:bot主人、bot管理员叫的直接删(规则里写明 bot主人是把她接进群、调教她的主人,交代的事嘴上可以嘟囔但要照办;被他们叫到时请求末尾再点一次名,只写在规则里时她常一边调用删除一边嘴上争“哪个是龙图”;她调用了删除就删,不再问答应没有,那句确认实测常把“哈?…行 删了”判成没答应);别人叫的她自己判断,每个群每天最多删 3 张,而且模型常一边调用删除一边嘴上说“凭啥删”,所以再拿她回的话问一次答应了没有(一次几个 token 的小请求),答应了才删;删除都记日志。引用她发过的表情包时,记录里写成“回复#编号(你发的[表情:名字])”,她才知道说的是哪张,不会翻错编号、不认账。收藏目录(名字和备注)跟在群名后面发给模型;目录是每个会话的快照,收藏增删改不会改动它(不然每收一张,所有群后面的缓存都失效),变化写在每次请求末尾的提示里,压缩时才并进目录。群友玩梗时它会挑对应的图接梗,收藏里已有的表情包再出现时显示为[表情包:名字],不再发图;叫它的那条消息里带的除外,多半是要它看这张,光凭备注容易认错。模型在回复里写[表情:名字]就发对应的表情包,可以单独发、先字后图或同一条图文混排;每次最多一张,同一张在一个群里一段时间内不重复(收藏每多一张多 1 分钟,最长半小时),整条回复只有这张表情包时例外,编造的名字直接删掉;它把某张图上的字原样打成一整条(如“得加钱!”)时,改发那张图。模型边说话边配图非常保守,所以她说的话里没有表情包时(也不是在用别的 bot 的指令),插件会再单独问一次:带上最近 6 条和她要说的话,让模型从收藏里挑一张并给贴切程度打 1–5 分,4 分以上才跟在后面单独发一条。实测约三成回复会配上;这次请求的提示和收藏目录基本都能命中缓存,每次约 2400 token,其中约 2000 命中缓存。表情包经 NapCat 的send_group_msg带sub_type=1发出,显示成表情;接口不可用时改发普通图片。 - 被叫到、被问到不确定的具体事实时,模型可以先调用
search,插件用 DeepSeek 的网页搜索(/v1/tools/search,和对话共用 API key,每次约 0.005 元,搜不到不收费)取前 4 条结果的摘要,再让模型照结果回复,说成“我搜了下”。主动插话和跟聊时不搜;每个群或私聊每天最多搜search_daily次(默认 20,次数只记在内存里,重启清零)。允许搜索、或眼前有表情包要能顺手收藏时,被叫到的第一轮不强制只能说话;模型没说话时再强制问一次。 - 被叫到时,模型还能调用
run_command用别的扩展插件(tenko.plugins入口点里除它自己以外的插件,例如战地一查询)注册的命令。命令清单(用法和说明)每次现取,插件装卸后自动跟上,写在群名后面;宿主自带的命令不在清单里,清单外的命令不执行。命令以叫她的人的身份执行(换一条新消息 ID,免得命中原消息的命令解析缓存),宿主的插件开关、限流和权限照常生效。结果照常发到群里,同时整条记进记录:文字最多 1000 字,渲染出来的图以高清给模型看;然后再问一次模型,让她照着结果接话。主动插话和跟聊时不用命令。 - 模型每次必须在
send_message(往当前会话发文字;一次最多调用两次,每次可以换行分成至多三条连着发,中间按打字速度停顿)和stay_silent(不说话)之间选一个,不能做任何管理动作;它写在普通回复里的文字一律丢弃。要 @ 人时它填对方某条消息的编号;像群友那样叫别的 bot(如生图)时它在 text 开头写“@昵称 指令”,昵称对上记录里说过话的人才换成真的 @,对不上的照原样当文字发。规则只告诉它自己只能发文字和表情包、别的 bot 能照群友的用法去叫,具体叫哪个、发什么命令由它从聊天记录里学。 - 有人在 bot 说完 10 秒内又来叫(多半是另一个 bot 在对聊),连续 3 轮后改由模型决定回不回,连续 6 轮后不再理会,直到对方慢下来。
- 同一个人叫 bot 至少间隔 5 秒;每个群每天最多用 20 万 token(未命中缓存的输入加输出;命中缓存的只按约 2% 计价,不计入),可另设全局每日上限,超出后当天不再应答。
- 命令消息(
/开头)会记进上下文,但不会触发回复。Tenko 功能从这些账号发出的回复(游戏出题、查询结果等)经 Entari 的after_send事件记进群聊记录,标作[Tenko 功能],只留文字、每条截断到 100 字,图片记成[图片],不算新消息,不会催模型插话;模型自己发的话不重复记录。规则后面告诉模型本群能响应的 bot 账号(昵称每次现取,改名后自动跟上);记录里有别人的昵称含唤醒词(比如另一个叫“大肥鱼bot”的号)时,再点名告诉它那个号不是它,免得把对方的话和状态当成自己的和帮助命令,被问到功能时让对方看帮助。
插件消耗付费额度,是受控插件:所有群默认关闭,只有 BOT 管理员能用 /开启 AI群友 打开;私聊也只对 BOT 管理员开放。
命令
| 命令 | 权限 | 说明 |
|---|---|---|
/AI群友 重置 |
群里需群管理员;私聊本人 | 清空本群或本私聊的聊天记录 |
/AI群友 用量 |
BOT 管理员 | 今日和近 7 天的 token 用量与估算费用;群里只显示本群,各群明细只在私聊里列 |
/AI群友 重置用量 |
BOT 管理员 | 本群或本私聊今天的额度从现在重新算,用量统计不变 |
/AI群友 上下文 |
群里需群管理员 | 下次请求占上下文的比例,人设规则、群信息、表情包目录、备忘、原文、末尾提示、看过的图各占多少 token(按上次实际输入折算的约数),缓存命中率、今日额度和精力;额度用完时会写明 |
/AI群友 表情 |
群里需群管理员 | 列出收藏的表情包和使用次数 |
/AI群友 表情 看 名字 |
群里需群管理员 | 发出这张收藏的表情包 |
/AI群友 表情 删 名字 |
BOT 管理员 | 删掉一张收藏(所有群共用) |
安装
在 WebUI 的插件市场安装,或由 Master 在聊天里 /安装插件 persona_chat。装好后默认不启用,/启用插件 persona_chat 即可加载。
配置
config/tenko.toml 的 [plugin_config.persona_chat],也可以在 WebUI 的插件配置里修改。api_key 必填,只写在本机配置里,不要提交到任何仓库:
[plugin_config.persona_chat]
api_key = "sk-..."
| 配置 | 默认值 | 说明 |
|---|---|---|
base_url |
"https://api.deepseek.com" |
OpenAI 兼容接口地址 |
api_key |
"" |
接口密钥,为空时不应答 |
model |
"deepseek-flash" |
模型名 |
wake_words |
["大肥鱼"] |
消息含这些词时当作在叫 bot |
persona |
"" |
人设提示词,为空时用内置“大肥鱼”;只写人物本身,怎么当群友是通用规则 |
catchphrases |
[] |
人设里的梗和口头禅,她最近用过的会被点名让她别再用;为空且用内置人设时用内置的 |
context_tokens |
32000 |
请求输入超过这么多 token 后把较早的聊天压成备忘,压回一半左右 |
batch_size |
8 |
没在聊天时累计多少条新消息后考虑插话,0 关闭 |
follow_seconds |
180 |
bot 说话后多久之内每条新消息都考虑接话,0 关闭 |
quiet_seconds |
3 |
主动说话前等群里安静多久 |
unprompted_interval_seconds |
300 |
没在聊天时两次插话的最短间隔 |
user_cooldown_seconds |
5 |
同一个人叫 bot 的最短间隔 |
stamina |
15 |
精力:10 分钟内说多少句算累(1 小时按两倍),0 不限 |
vision_images |
5 |
每次请求最多带几张新图给模型看,0 只用 [图片] 文字 |
search_daily |
20 |
每个群或私聊每天最多上网搜几次,0 关闭搜索 |
sticker_limit |
100 |
表情包收藏上限,所有群共用,0 关闭表情包 |
max_reply_chars |
120 |
单条回复字数上限,超出时在句末截断 |
group_daily_tokens |
200000 |
每个群每天的 token 上限(未命中缓存的输入加输出),用完后当天不再理这个群的消息、也不记录,0 不限 |
global_daily_tokens |
0 |
全部会话合计每天的 token 上限,0 不限 |
请求关闭了 DeepSeek 的思考模式,人设和规则固定放在请求最前面以命中前缀缓存。/AI群友 用量 的费用按 deepseek-flash 官方价目估算(工作日 UTC 01–04、06–10 点为高峰价),换用其他模型时只看 token 数即可。
图标
icon.png 由 Phosphor Icons 的 fish(fill)渲染而来,Phosphor Icons 以 MIT 许可证发布。
Metadata
Release files for tenko-plugin-persona-chat 0.1.30
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| tenko_plugin_persona_chat-0.1.30.tar.gz | 82.2 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| tenko_plugin_persona_chat-0.1.30-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 143.4 kB
Release files / tenko_plugin_persona_chat-0.1.30.tar.gz
| Download URL | tenko_plugin_persona_chat-0.1.30.tar.gz |
|---|---|
| Size | 82.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
1a2bb50a5ece4bfc784d568eede387cb7f82477b40faaabdf68e6be3f941862e
|
|
BLAKE2b-256 checksum How to use checksums |
1968108e7c9f5979a8034599baf837b31915ff9a323a95f14eede6ad27b28d56
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 25, 2026.
Transparency logRelease files / tenko_plugin_persona_chat-0.1.30-py3-none-any.whl
| Download URL | tenko_plugin_persona_chat-0.1.30-py3-none-any.whl |
|---|---|
| Size | 61.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
35ebe6d2fcc36f6fac49f67b3d3c7a64bfd9b6de47137611f688b7909de47480
|
|
BLAKE2b-256 checksum How to use checksums |
2db95756e402dfbbaa1a7d214074e38d8af7f0ac932c636f1a9ea05269f1e47e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 25, 2026.
Transparency logSecurity for tenko-plugin-persona-chat 0.1.30
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for tenko_plugin_persona_chat-0.1.30.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 25, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.