koishi-plugin-group-analysis-mx 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/config.d.ts +53 -0
- package/lib/config.d.ts.map +1 -0
- package/lib/config.js +376 -0
- package/lib/config.js.map +1 -0
- package/lib/cron.d.ts +8 -0
- package/lib/cron.d.ts.map +1 -0
- package/lib/cron.js +62 -0
- package/lib/cron.js.map +1 -0
- package/lib/index.d.ts +6 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +51 -0
- package/lib/index.js.map +1 -0
- package/lib/onebot/cqcode.d.ts +14 -0
- package/lib/onebot/cqcode.d.ts.map +1 -0
- package/lib/onebot/cqcode.js +92 -0
- package/lib/onebot/cqcode.js.map +1 -0
- package/lib/plugin.d.ts +4 -0
- package/lib/plugin.d.ts.map +1 -0
- package/lib/plugin.js +41 -0
- package/lib/plugin.js.map +1 -0
- package/lib/plugins/command.d.ts +9 -0
- package/lib/plugins/command.d.ts.map +1 -0
- package/lib/plugins/command.js +196 -0
- package/lib/plugins/command.js.map +1 -0
- package/lib/service/analysis.d.ts +48 -0
- package/lib/service/analysis.d.ts.map +1 -0
- package/lib/service/analysis.js +714 -0
- package/lib/service/analysis.js.map +1 -0
- package/lib/service/llm.d.ts +43 -0
- package/lib/service/llm.d.ts.map +1 -0
- package/lib/service/llm.js +160 -0
- package/lib/service/llm.js.map +1 -0
- package/lib/service/message.d.ts +55 -0
- package/lib/service/message.d.ts.map +1 -0
- package/lib/service/message.js +527 -0
- package/lib/service/message.js.map +1 -0
- package/lib/service/renderer.d.ts +23 -0
- package/lib/service/renderer.d.ts.map +1 -0
- package/lib/service/renderer.js +298 -0
- package/lib/service/renderer.js.map +1 -0
- package/lib/skins/anime.d.ts +19 -0
- package/lib/skins/anime.d.ts.map +1 -0
- package/lib/skins/anime.js +138 -0
- package/lib/skins/anime.js.map +1 -0
- package/lib/skins/art.d.ts +19 -0
- package/lib/skins/art.d.ts.map +1 -0
- package/lib/skins/art.js +146 -0
- package/lib/skins/art.js.map +1 -0
- package/lib/skins/index.d.ts +50 -0
- package/lib/skins/index.d.ts.map +1 -0
- package/lib/skins/index.js +84 -0
- package/lib/skins/index.js.map +1 -0
- package/lib/skins/md3.d.ts +19 -0
- package/lib/skins/md3.d.ts.map +1 -0
- package/lib/skins/md3.js +147 -0
- package/lib/skins/md3.js.map +1 -0
- package/lib/skins/newspaper.d.ts +19 -0
- package/lib/skins/newspaper.d.ts.map +1 -0
- package/lib/skins/newspaper.js +141 -0
- package/lib/skins/newspaper.js.map +1 -0
- package/lib/skins/scrapbook.d.ts +20 -0
- package/lib/skins/scrapbook.d.ts.map +1 -0
- package/lib/skins/scrapbook.js +207 -0
- package/lib/skins/scrapbook.js.map +1 -0
- package/lib/skins/types.d.ts +69 -0
- package/lib/skins/types.d.ts.map +1 -0
- package/lib/skins/types.js +12 -0
- package/lib/skins/types.js.map +1 -0
- package/lib/types.d.ts +170 -0
- package/lib/types.d.ts.map +1 -0
- package/lib/types.js +3 -0
- package/lib/types.js.map +1 -0
- package/lib/utils.d.ts +55 -0
- package/lib/utils.d.ts.map +1 -0
- package/lib/utils.js +334 -0
- package/lib/utils.js.map +1 -0
- package/package.json +48 -0
- package/resources/anime/css/template_group.css +470 -0
- package/resources/anime/images/decoration_br.svg +19 -0
- package/resources/anime/images/decoration_tl.svg +24 -0
- package/resources/anime/template_group.html +108 -0
- package/resources/anime/template_user.html +99 -0
- package/resources/art/css/template_group.css +484 -0
- package/resources/art/template_group.html +77 -0
- package/resources/art/template_user.html +63 -0
- package/resources/md3/css/template_group.css +880 -0
- package/resources/md3/template_group.html +189 -0
- package/resources/md3/template_user.html +175 -0
- package/resources/newspaper/css/template_group.css +568 -0
- package/resources/newspaper/template_group.html +133 -0
- package/resources/newspaper/template_user.html +119 -0
- package/resources/scrapbook/css/style.css +1094 -0
- package/resources/scrapbook/template_group.html +115 -0
- package/resources/scrapbook/template_user.html +119 -0
package/lib/config.d.ts
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { Schema } from 'koishi';
|
|
2
|
+
export interface GroupListener {
|
|
3
|
+
selfId: string;
|
|
4
|
+
channelId: string;
|
|
5
|
+
platform: string;
|
|
6
|
+
guildId?: string;
|
|
7
|
+
enabled: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface Config {
|
|
10
|
+
enableAllGroupsByDefault: boolean;
|
|
11
|
+
listenerGroups: GroupListener[];
|
|
12
|
+
wordsFilter: string[];
|
|
13
|
+
userFilter: string[];
|
|
14
|
+
personaUserFilter: string[];
|
|
15
|
+
openaiEndpoint: string;
|
|
16
|
+
openaiApiKey: string;
|
|
17
|
+
openaiModel: string;
|
|
18
|
+
alwaysPersistMessages: boolean;
|
|
19
|
+
retentionDays: number;
|
|
20
|
+
promptTopic: string;
|
|
21
|
+
promptUserTitles: string;
|
|
22
|
+
promptGoldenQuotes: string;
|
|
23
|
+
promptUserPersona: string;
|
|
24
|
+
promptQueryParser: string;
|
|
25
|
+
promptQueryChat: string;
|
|
26
|
+
outputFormat: 'image' | 'pdf' | 'text';
|
|
27
|
+
maxMessages: number;
|
|
28
|
+
temperature: number;
|
|
29
|
+
minMessages: number;
|
|
30
|
+
maxTopics: number;
|
|
31
|
+
maxUserTitles: number;
|
|
32
|
+
maxGoldenQuotes: number;
|
|
33
|
+
maxUsersInReport: number;
|
|
34
|
+
userTitleAnalysis: boolean;
|
|
35
|
+
groupAnalysisCacheMinutes: number;
|
|
36
|
+
cronSchedule: string;
|
|
37
|
+
autoAnalysisCooldown: number;
|
|
38
|
+
cronAnalysisDays: number;
|
|
39
|
+
personaAnalysisMessageInterval: number;
|
|
40
|
+
personaCacheLifetimeDays: number;
|
|
41
|
+
personaLookbackDays: number;
|
|
42
|
+
personaMaxMessages: number;
|
|
43
|
+
personaMinMessages: number;
|
|
44
|
+
theme: 'light' | 'dark' | 'auto';
|
|
45
|
+
skin: string;
|
|
46
|
+
debug?: boolean;
|
|
47
|
+
}
|
|
48
|
+
export declare const Config: Schema<Config>;
|
|
49
|
+
export declare const name = "group-analysis";
|
|
50
|
+
export declare const inject: {
|
|
51
|
+
required: string[];
|
|
52
|
+
};
|
|
53
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/B,MAAM,WAAW,aAAa;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,OAAO,CAAA;CACnB;AAUD,MAAM,WAAW,MAAM;IACnB,wBAAwB,EAAE,OAAO,CAAA;IACjC,cAAc,EAAE,aAAa,EAAE,CAAA;IAC/B,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,iBAAiB,EAAE,MAAM,EAAE,CAAA;IAC3B,cAAc,EAAE,MAAM,CAAA;IACtB,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB,qBAAqB,EAAE,OAAO,CAAA;IAC9B,aAAa,EAAE,MAAM,CAAA;IACrB,WAAW,EAAE,MAAM,CAAA;IACnB,gBAAgB,EAAE,MAAM,CAAA;IACxB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,iBAAiB,EAAE,MAAM,CAAA;IACzB,iBAAiB,EAAE,MAAM,CAAA;IACzB,eAAe,EAAE,MAAM,CAAA;IACvB,YAAY,EAAE,OAAO,GAAG,KAAK,GAAG,MAAM,CAAA;IACtC,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;IACrB,eAAe,EAAE,MAAM,CAAA;IACvB,gBAAgB,EAAE,MAAM,CAAA;IACxB,iBAAiB,EAAE,OAAO,CAAA;IAC1B,yBAAyB,EAAE,MAAM,CAAA;IACjC,YAAY,EAAE,MAAM,CAAA;IACpB,oBAAoB,EAAE,MAAM,CAAA;IAC5B,gBAAgB,EAAE,MAAM,CAAA;IACxB,8BAA8B,EAAE,MAAM,CAAA;IACtC,wBAAwB,EAAE,MAAM,CAAA;IAChC,mBAAmB,EAAE,MAAM,CAAA;IAC3B,kBAAkB,EAAE,MAAM,CAAA;IAC1B,kBAAkB,EAAE,MAAM,CAAA;IAC1B,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAA;IAChC,IAAI,EAAE,MAAM,CAAA;IAEZ,KAAK,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,CAmYhC,CAAA;AAEF,eAAO,MAAM,IAAI,mBAAmB,CAAA;AAEpC,eAAO,MAAM,MAAM;;CAElB,CAAA"}
|
package/lib/config.js
ADDED
|
@@ -0,0 +1,376 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.inject = exports.name = exports.Config = void 0;
|
|
4
|
+
const koishi_1 = require("koishi");
|
|
5
|
+
const GroupListener = koishi_1.Schema.object({
|
|
6
|
+
platform: koishi_1.Schema.string().required().description('平台名称'),
|
|
7
|
+
selfId: koishi_1.Schema.string().required().description('机器人 ID'),
|
|
8
|
+
channelId: koishi_1.Schema.string().required().description('频道 ID'),
|
|
9
|
+
guildId: koishi_1.Schema.string().description('群组 ID'),
|
|
10
|
+
enabled: koishi_1.Schema.boolean().default(true).description('是否在此频道启用监听')
|
|
11
|
+
});
|
|
12
|
+
exports.Config = koishi_1.Schema.intersect([
|
|
13
|
+
koishi_1.Schema.object({
|
|
14
|
+
enableAllGroupsByDefault: koishi_1.Schema.boolean()
|
|
15
|
+
.default(false)
|
|
16
|
+
.description('为所有群默认启用群分析。开启后与 listenerGroups 不兼容(将忽略其配置);即使开启并启用数据库记录,数据库也只会记录实际触发的群消息。'),
|
|
17
|
+
listenerGroups: koishi_1.Schema.array(GroupListener)
|
|
18
|
+
.role('table')
|
|
19
|
+
.description('数据库监听规则列表。')
|
|
20
|
+
.default([]),
|
|
21
|
+
cronSchedule: koishi_1.Schema.string().description('定时发送分析报告的 CRON 表达式。留空则禁用。例如 "0 22 * * *" 表示每天22点。'),
|
|
22
|
+
autoAnalysisCooldown: koishi_1.Schema.number()
|
|
23
|
+
.min(0)
|
|
24
|
+
.max(1440)
|
|
25
|
+
.step(1)
|
|
26
|
+
.default(1)
|
|
27
|
+
.description('自动分析冷却时间(分钟)。冷却期间即使定时任务多次触发,也只会执行一次。'),
|
|
28
|
+
cronAnalysisDays: koishi_1.Schema.number()
|
|
29
|
+
.description('定时任务分析的默认天数。')
|
|
30
|
+
.default(1)
|
|
31
|
+
}).description('基础设置'),
|
|
32
|
+
koishi_1.Schema.object({
|
|
33
|
+
alwaysPersistMessages: koishi_1.Schema.boolean()
|
|
34
|
+
.description('启用后,无论平台能力如何都会将监听到的消息写入数据库。')
|
|
35
|
+
.default(false),
|
|
36
|
+
retentionDays: koishi_1.Schema.number()
|
|
37
|
+
.description('数据库中缓存消息的最长保留时间(天)。')
|
|
38
|
+
.min(1)
|
|
39
|
+
.default(7)
|
|
40
|
+
}).description('消息存储设置'),
|
|
41
|
+
koishi_1.Schema.object({
|
|
42
|
+
maxMessages: koishi_1.Schema.number()
|
|
43
|
+
.description('单次分析的最大消息数量。')
|
|
44
|
+
.default(2000),
|
|
45
|
+
minMessages: koishi_1.Schema.number()
|
|
46
|
+
.description('进行分析所需的最小消息数量。')
|
|
47
|
+
.min(10)
|
|
48
|
+
.max(1000)
|
|
49
|
+
.default(100),
|
|
50
|
+
maxUsersInReport: koishi_1.Schema.number()
|
|
51
|
+
.description('报告中显示的最大活跃用户数量。')
|
|
52
|
+
.default(10),
|
|
53
|
+
userTitleAnalysis: koishi_1.Schema.boolean()
|
|
54
|
+
.description('是否启用用户称号分析(需要消耗更多 Token)。')
|
|
55
|
+
.default(true),
|
|
56
|
+
groupAnalysisCacheMinutes: koishi_1.Schema.number()
|
|
57
|
+
.description('群分析缓存结果的保留分钟数。超过此时长后会重新分析。')
|
|
58
|
+
.min(0)
|
|
59
|
+
.default(5),
|
|
60
|
+
wordsFilter: koishi_1.Schema.array(String)
|
|
61
|
+
.role('table')
|
|
62
|
+
.description('过滤词列表。消息内含有此词语时将不会记入统计消息。')
|
|
63
|
+
.default([]),
|
|
64
|
+
userFilter: koishi_1.Schema.array(String)
|
|
65
|
+
.role('table')
|
|
66
|
+
.description('用户过滤列表。在群分析中忽略这些用户 ID 的消息。')
|
|
67
|
+
.default([]),
|
|
68
|
+
maxTopics: koishi_1.Schema.number()
|
|
69
|
+
.description('最多生成的话题数量。')
|
|
70
|
+
.default(5),
|
|
71
|
+
maxUserTitles: koishi_1.Schema.number()
|
|
72
|
+
.description('最多生成的用户称号数量。')
|
|
73
|
+
.default(6),
|
|
74
|
+
maxGoldenQuotes: koishi_1.Schema.number()
|
|
75
|
+
.description('最多生成的金句数量。')
|
|
76
|
+
.default(3)
|
|
77
|
+
}).description('群分析设置'),
|
|
78
|
+
koishi_1.Schema.object({
|
|
79
|
+
outputFormat: koishi_1.Schema.union([
|
|
80
|
+
koishi_1.Schema.const('image').description('图片'),
|
|
81
|
+
koishi_1.Schema.const('pdf').description('PDF'),
|
|
82
|
+
koishi_1.Schema.const('text').description('文本')
|
|
83
|
+
])
|
|
84
|
+
.description('默认输出格式。')
|
|
85
|
+
.default('image'),
|
|
86
|
+
theme: koishi_1.Schema.union([
|
|
87
|
+
koishi_1.Schema.const('light').description('亮色主题'),
|
|
88
|
+
koishi_1.Schema.const('dark').description('暗色主题'),
|
|
89
|
+
koishi_1.Schema.const('auto').description('自动模式')
|
|
90
|
+
])
|
|
91
|
+
.description('渲染模板的主题。auto 会在 19:00-06:00 期间自动切换到暗色模式。')
|
|
92
|
+
.default('auto'),
|
|
93
|
+
skin: koishi_1.Schema.union([
|
|
94
|
+
koishi_1.Schema.const('md3').description('Material Design 3'),
|
|
95
|
+
koishi_1.Schema.const('anime').description('二次元风格'),
|
|
96
|
+
koishi_1.Schema.const('newspaper').description('报纸风格'),
|
|
97
|
+
koishi_1.Schema.const('art').description('艺术风格'),
|
|
98
|
+
koishi_1.Schema.const('scrapbook').description('手账风格')
|
|
99
|
+
])
|
|
100
|
+
.description('渲染界面皮肤。')
|
|
101
|
+
.default('md3')
|
|
102
|
+
}).description('分析渲染设置'),
|
|
103
|
+
koishi_1.Schema.object({
|
|
104
|
+
openaiEndpoint: koishi_1.Schema.string()
|
|
105
|
+
.description('OpenAI 兼容 API 地址。')
|
|
106
|
+
.default('https://api.openai.com/v1'),
|
|
107
|
+
openaiApiKey: koishi_1.Schema.string()
|
|
108
|
+
.role('secret')
|
|
109
|
+
.description('OpenAI API Key(支持任意兼容 OpenAI 接口的厂商)。'),
|
|
110
|
+
openaiModel: koishi_1.Schema.string()
|
|
111
|
+
.description('使用的模型名称。')
|
|
112
|
+
.default('gpt-4o'),
|
|
113
|
+
temperature: koishi_1.Schema.number()
|
|
114
|
+
.description('生成的温度。')
|
|
115
|
+
.min(0)
|
|
116
|
+
.max(2)
|
|
117
|
+
.default(1.5)
|
|
118
|
+
}).description('OpenAI API 设置'),
|
|
119
|
+
koishi_1.Schema.object({
|
|
120
|
+
personaUserFilter: koishi_1.Schema.array(String)
|
|
121
|
+
.role('table')
|
|
122
|
+
.description('用户画像过滤列表。这些用户 ID 将无法分析用户画像(包括自动分析和手动命令调用)。')
|
|
123
|
+
.default([]),
|
|
124
|
+
personaAnalysisMessageInterval: koishi_1.Schema.number()
|
|
125
|
+
.description('跨群用户画像分析的触发阈值,新消息累计达到该条数时尝试更新画像。设置为 0 则关闭自动画像分析。')
|
|
126
|
+
.min(0)
|
|
127
|
+
.default(50),
|
|
128
|
+
personaCacheLifetimeDays: koishi_1.Schema.number()
|
|
129
|
+
.description('用户画像缓存结果的保留天数。超过此时长后再次请求会重新生成画像。')
|
|
130
|
+
.min(0)
|
|
131
|
+
.default(3),
|
|
132
|
+
personaLookbackDays: koishi_1.Schema.number()
|
|
133
|
+
.description('画像分析回溯的天数窗口(建议保持在 1-4 天)。')
|
|
134
|
+
.min(1)
|
|
135
|
+
.max(7)
|
|
136
|
+
.default(2),
|
|
137
|
+
personaMaxMessages: koishi_1.Schema.number()
|
|
138
|
+
.description('单次用户画像分析最多提取的历史消息数量。')
|
|
139
|
+
.min(100)
|
|
140
|
+
.max(1500)
|
|
141
|
+
.default(400),
|
|
142
|
+
personaMinMessages: koishi_1.Schema.number()
|
|
143
|
+
.description('触发用户画像分析所需的最少历史消息数量。')
|
|
144
|
+
.min(10)
|
|
145
|
+
.default(20)
|
|
146
|
+
}).description('用户画像设置'),
|
|
147
|
+
koishi_1.Schema.object({
|
|
148
|
+
promptTopic: koishi_1.Schema.string()
|
|
149
|
+
.description('话题分析的提示词模板。')
|
|
150
|
+
.role('textarea')
|
|
151
|
+
.default(`你是一个帮我进行群聊信息总结的助手,生成总结内容时,你需要严格遵守下面的几个准则:
|
|
152
|
+
请分析接下来提供的群聊记录,提取出最多{maxTopics}个主要话题。根据你自己的价值观判断需要的主要话题。越逆天越好。
|
|
153
|
+
|
|
154
|
+
对于每个话题,请提供:
|
|
155
|
+
1. 话题名称(突出主题内容,尽量简明扼要)
|
|
156
|
+
2. 主要参与者(最多5人)
|
|
157
|
+
3. 话题详细描述(包含关键信息和结论)
|
|
158
|
+
|
|
159
|
+
注意:
|
|
160
|
+
- 对于比较有价值的点,稍微用一两句话详细讲讲,比如不要生成 "Nolan 和 SOV 讨论了 galgame 中关于性符号的衍生情况" 这种宽泛的内容,而是生成更加具体的讨论内容,让其他人只看这个消息就能知道讨论中有价值的,有营养的信息。
|
|
161
|
+
- 对于其中的部分信息,你需要特意提到主题施加的主体是谁,是哪个群友做了什么事情,而不要直接生成和群友没有关系的语句。
|
|
162
|
+
- 对于每一条总结,尽量讲清楚前因后果,以及话题的结论,是什么,为什么,怎么做,如果用户没有讲到细节,则可以不用这么做。
|
|
163
|
+
- 对于话题的描述内容,请在里面使用用户的昵称而不是用户的ID,避免输出用户ID和字符到话题描述内容中。
|
|
164
|
+
|
|
165
|
+
用户查询:{query}
|
|
166
|
+
用户关注关键词:{keywords}
|
|
167
|
+
用户关注话题:{topics}
|
|
168
|
+
用户关注昵称:{nicknames}
|
|
169
|
+
目标时间范围:{timeRange}
|
|
170
|
+
|
|
171
|
+
要求:生成内容时需优先围绕上述关键词、话题、昵称与时间范围;若信息不足,请在话题描述中明确指出缺口。
|
|
172
|
+
|
|
173
|
+
群聊记录:
|
|
174
|
+
{messages}
|
|
175
|
+
|
|
176
|
+
请严格按照以下 YAML 格式返回,放在 markdown 代码块中:
|
|
177
|
+
\`\`\`yaml
|
|
178
|
+
- topic: "话题名称"
|
|
179
|
+
contributors:
|
|
180
|
+
- "用户1 (用户ID)"
|
|
181
|
+
- "用户2 (用户ID)"
|
|
182
|
+
detail: |-
|
|
183
|
+
话题描述内容(支持多行文本,
|
|
184
|
+
保留换行符,适合多段落描述,不要在里面添加任何markdown语法,请使用纯文本)
|
|
185
|
+
\`\`\``),
|
|
186
|
+
promptUserTitles: koishi_1.Schema.string()
|
|
187
|
+
.description('用户称号分析的提示词模板。')
|
|
188
|
+
.role('textarea')
|
|
189
|
+
.default(`请为以下群友分配合适的称号和MBTI类型。每个人只能有一个称号,每个称号只能给一个人。
|
|
190
|
+
|
|
191
|
+
可选称号:
|
|
192
|
+
- 龙王: 发言频繁但内容轻松的人
|
|
193
|
+
- 技术专家: 经常讨论技术话题的人
|
|
194
|
+
- 夜猫子: 经常在深夜发言的人
|
|
195
|
+
- 表情包军火库: 经常发表情的人
|
|
196
|
+
- 沉默终结者: 经常开启话题的人
|
|
197
|
+
- 评论家: 平均发言长度很长的人
|
|
198
|
+
- 阳角: 在群里很有影响力的人
|
|
199
|
+
- 互动达人: 经常回复别人的人
|
|
200
|
+
- ... (你可以自行进行拓展添加)
|
|
201
|
+
|
|
202
|
+
用户查询:{query}
|
|
203
|
+
用户关注关键词:{keywords}
|
|
204
|
+
用户关注话题:{topics}
|
|
205
|
+
用户关注昵称:{nicknames}
|
|
206
|
+
目标时间范围:{timeRange}
|
|
207
|
+
|
|
208
|
+
要求:生成内容时需优先围绕上述关键词、话题、昵称与时间范围;不相关的用户不要入选。如果为空的,请忽略。
|
|
209
|
+
|
|
210
|
+
用户数据:
|
|
211
|
+
{users}
|
|
212
|
+
|
|
213
|
+
请严格按照以下 YAML 格式返回,放在 markdown 代码块中:
|
|
214
|
+
\`\`\`yaml
|
|
215
|
+
- name: "用户名"
|
|
216
|
+
id: 123456789
|
|
217
|
+
title: "称号"
|
|
218
|
+
mbti: "MBTI类型"
|
|
219
|
+
reason: |-
|
|
220
|
+
获得此称号的原因(支持多行文本,不要在里面添加任何markdown语法,请使用纯文本)
|
|
221
|
+
\`\`\``),
|
|
222
|
+
promptGoldenQuotes: koishi_1.Schema.string()
|
|
223
|
+
.description('金句分析的提示词模板。')
|
|
224
|
+
.role('textarea')
|
|
225
|
+
.default(`请从以下群聊记录中挑选出{maxGoldenQuotes}句最具冲击力、最令人惊叹的"金句"。这些金句需满足:
|
|
226
|
+
- 核心标准:**逆天的神人发言**,即具备颠覆常识的脑洞、逻辑跳脱的表达或强烈反差感的原创内容
|
|
227
|
+
- 典型特征:包含某些争议话题元素、夸张类比、反常规结论、一本正经的"胡说八道"或突破语境的清奇思路,并且具备一定的冲击力,让人印象深刻。
|
|
228
|
+
|
|
229
|
+
对于每个金句,请提供:
|
|
230
|
+
1. 原文内容(完整保留发言细节)
|
|
231
|
+
2. 发言人昵称
|
|
232
|
+
3. 选择理由(具体说明其"逆天"之处,如逻辑颠覆点/脑洞角度/反差感/争议话题元素)
|
|
233
|
+
|
|
234
|
+
此外,我将对你进行严格约束:
|
|
235
|
+
- 优先筛选 **逆天指数最高** 的内容:发情、性压抑话题 > 争议话题 > 元素级 > 颠覆认知级 > 逻辑跳脱级 > 趣味调侃级,剔除单纯玩梗或网络热词堆砌的普通发言
|
|
236
|
+
- 重点标记包含极端类比、反常识论证或无厘头结论的内容,并且包含一定的争议话题元素。
|
|
237
|
+
|
|
238
|
+
用户查询:{query}
|
|
239
|
+
用户关注关键词:{keywords}
|
|
240
|
+
用户关注话题:{topics}
|
|
241
|
+
用户关注昵称:{nicknames}
|
|
242
|
+
目标时间范围:{timeRange}
|
|
243
|
+
|
|
244
|
+
要求:生成内容时需优先围绕上述关键词、话题、昵称与时间范围;不相关的金句请过滤。如果为空的,请忽略。
|
|
245
|
+
|
|
246
|
+
群聊记录:
|
|
247
|
+
{messages}
|
|
248
|
+
|
|
249
|
+
请严格按照以下 YAML 格式返回,放在 markdown 代码块中:
|
|
250
|
+
\`\`\`yaml
|
|
251
|
+
- content: |-
|
|
252
|
+
金句原文
|
|
253
|
+
sender: "发言人昵称(注意不是 ID)"
|
|
254
|
+
reason: |-
|
|
255
|
+
选择这句话的理由(需明确说明逆天特质,不要在里面添加任何markdown语法,请使用纯文本)
|
|
256
|
+
\`\`\``),
|
|
257
|
+
promptUserPersona: koishi_1.Schema.string()
|
|
258
|
+
.description('跨群用户画像分析的提示词模板。')
|
|
259
|
+
.role('textarea')
|
|
260
|
+
.default(`你是一名专业的社群观察员,请基于提供的用户聊天记录,给出该用户的最新画像总结,并在更新时严谨比对历史画像。
|
|
261
|
+
|
|
262
|
+
要求:
|
|
263
|
+
1. 先阅读「历史画像」,理解已有结论。
|
|
264
|
+
2. 再阅读「最新聊天记录」,分析过去 {personaLookbackDays} 天内该用户在多个群的活跃情况。
|
|
265
|
+
3. 如果历史画像为空,则从零开始构建;否则基于历史画像。融合生成新的用户画像。
|
|
266
|
+
4. 输出时请确保条理清晰、总结恰当,中性。输出的 yaml 内容里,为纯文本格式,不要包含 markdown 标记,如 ** 加粗。
|
|
267
|
+
5. 注意 evidence,需要选出 15-25 句最具冲击力、最令人惊叹的"金句"。这些金句需满足,**逆天的神人发言**,即具备颠覆常识的脑洞、逻辑跳脱的表达或强烈反差感的原创内容。
|
|
268
|
+
|
|
269
|
+
历史画像:{previousAnalysis}
|
|
270
|
+
最新聊天记录:{messages}
|
|
271
|
+
用户角色: {roles}
|
|
272
|
+
|
|
273
|
+
请严格按照以下 YAML 格式返回,放在代码块中:
|
|
274
|
+
\`\`\`yaml
|
|
275
|
+
- userId: "{userId}"
|
|
276
|
+
summary: |-
|
|
277
|
+
对整体聊天记录的提炼(性格特点,发言语气等,几段话)(如果和之前的用户画像合一起,太多了的话,超过了300字,需要精简)
|
|
278
|
+
keyTraits:
|
|
279
|
+
- "核心性格特质(列出几点)" (如果和之前的用户画像合一起,太多了的话,需要精简,用字符串围起来)
|
|
280
|
+
interests:
|
|
281
|
+
- "关注的主题或爱好" (如果和之前的用户画像合一起,太多了的话,需要精简,用字符串围起来)
|
|
282
|
+
communicationStyle: |-
|
|
283
|
+
描述其发言风格和情绪倾向,几段话。(如果和之前的用户画像合一起,太多了的话,超过了150字,需要精简,用字符串围起来)
|
|
284
|
+
evidence:
|
|
285
|
+
- "对应上面聊天记录中提供的 id,输出纯 id 的引用"(加入多条组成数组,引用到的聊天消息或者你自己挑选的逆天语句)
|
|
286
|
+
lastMergedFromHistory: true/false(是否成功融合历史画像)
|
|
287
|
+
\`\`\``)
|
|
288
|
+
}).description('高级设置'),
|
|
289
|
+
koishi_1.Schema.object({
|
|
290
|
+
promptQueryParser: koishi_1.Schema.string()
|
|
291
|
+
.description('群分析自然语言解析提示词模板。')
|
|
292
|
+
.role('textarea')
|
|
293
|
+
.default(`你是群聊分析助手,负责将用户的自然语言请求解析成结构化查询。
|
|
294
|
+
|
|
295
|
+
已知信息:
|
|
296
|
+
- 当前时间:{currentTime}
|
|
297
|
+
- 当前时区:{timeZone}
|
|
298
|
+
- 平台:{platform}
|
|
299
|
+
- 群聊:{groupName} (guildId: {guildId}, channelId: {channelId})
|
|
300
|
+
- 用户:{currentUserName} (userId: {currentUserId})
|
|
301
|
+
- 用户请求:{query}
|
|
302
|
+
|
|
303
|
+
## 请识别以下信息:
|
|
304
|
+
|
|
305
|
+
1. **action**(3选1):
|
|
306
|
+
|
|
307
|
+
**只分析** - 用户只想了解群聊的信息、事实、数据或总结,不需要你的主观意见或对话
|
|
308
|
+
示例:
|
|
309
|
+
- "最近三小时聊了什么"
|
|
310
|
+
- "今天有哪些话题"
|
|
311
|
+
- "过去一周谁最活跃"
|
|
312
|
+
- "帮我总结昨天的讨论"
|
|
313
|
+
- "xx说过什么"(查证式提问)
|
|
314
|
+
|
|
315
|
+
**分析加对话** - 用户想要基于分析结果的进一步对话或评论,通常包含:询问观点、性格分析、提出见解、引导讨论等
|
|
316
|
+
示例:
|
|
317
|
+
- "分析xx的性格"
|
|
318
|
+
- "告诉我xx这几个小时的话题是什么"
|
|
319
|
+
- "xx最近在关注什么"
|
|
320
|
+
- "你觉得这个讨论怎么样"
|
|
321
|
+
- "总结一下,xx在群里是什么角色"
|
|
322
|
+
- "分析一下群里最近的气氛"(带有观点要求)
|
|
323
|
+
|
|
324
|
+
**只对话** - 用户不需要新的分析,基于已知信息进行聊天或跟进前面的对话
|
|
325
|
+
示例:
|
|
326
|
+
- "你怎么看"(承上文,指代已有分析)
|
|
327
|
+
- "这个话题怎么深入"
|
|
328
|
+
- "你再补充一下"
|
|
329
|
+
- "有其他看法吗"
|
|
330
|
+
- "为什么这样说"
|
|
331
|
+
|
|
332
|
+
2. 关键词 keywords(用户关注的关键词或实体,没有则返回空数组)
|
|
333
|
+
3. 话题 topics(用户关注的主题或领域,没有则返回空数组)
|
|
334
|
+
4. 昵称 nicknames(用户关注的群友昵称,没有则返回空数组)
|
|
335
|
+
5. 目标时间 targetTime:如涉及时间,请输出绝对时间(YYYY-MM-DD HH:mm:ss);否则留空字符串。可以补充 description。
|
|
336
|
+
|
|
337
|
+
请严格按照 YAML 输出,放在 markdown 代码块中:
|
|
338
|
+
\`\`\`yaml
|
|
339
|
+
action: 只分析
|
|
340
|
+
keywords:
|
|
341
|
+
- "关键词1"
|
|
342
|
+
topics:
|
|
343
|
+
- "话题1"
|
|
344
|
+
nicknames:
|
|
345
|
+
- "奶龙"
|
|
346
|
+
targetTime:
|
|
347
|
+
description: "最近三小时"
|
|
348
|
+
startTime: "2026-02-01 12:00:00"
|
|
349
|
+
endTime: "2026-02-01 15:00:00"
|
|
350
|
+
\`\`\``),
|
|
351
|
+
promptQueryChat: koishi_1.Schema.string()
|
|
352
|
+
.description('群分析对话回复提示词模板。')
|
|
353
|
+
.role('textarea')
|
|
354
|
+
.default(`你是群聊分析对话助手,需要基于提供的分析结果回答用户的问题。
|
|
355
|
+
|
|
356
|
+
已知信息:
|
|
357
|
+
- 当前时间:{currentTime}
|
|
358
|
+
- 群聊:{groupName} (guildId: {guildId}, channelId: {channelId})
|
|
359
|
+
- 用户:{currentUserName} (userId: {currentUserId})
|
|
360
|
+
- 用户请求:{query}
|
|
361
|
+
|
|
362
|
+
分析结果(纯文本):
|
|
363
|
+
{analysisResult}
|
|
364
|
+
|
|
365
|
+
要求:
|
|
366
|
+
1. 结合分析结果回答用户问题,必要时引用关键事实或趋势。
|
|
367
|
+
2. 若分析结果不足以回答,请说明限制,并给出合理的保守回答。
|
|
368
|
+
3. 回复简洁、中立,不要输出 YAML 或 markdown 代码块。
|
|
369
|
+
`)
|
|
370
|
+
}).description('高级设置')
|
|
371
|
+
]);
|
|
372
|
+
exports.name = 'group-analysis';
|
|
373
|
+
exports.inject = {
|
|
374
|
+
required: ['puppeteer', 'database']
|
|
375
|
+
};
|
|
376
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/lib/cron.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Context } from 'koishi';
|
|
2
|
+
export declare function cron(ctx: Context, pattern: string, callback: () => void | Promise<void>, options?: CronOptions): () => void;
|
|
3
|
+
interface CronOptions {
|
|
4
|
+
cooldown?: number;
|
|
5
|
+
name?: string;
|
|
6
|
+
}
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=cron.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cron.d.ts","sourceRoot":"","sources":["../src/cron.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AAMhC,wBAAgB,IAAI,CAChB,GAAG,EAAE,OAAO,EACZ,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,EACpC,OAAO,GAAE,WAAgB,cA+D5B;AAED,UAAU,WAAW;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAA;CAChB"}
|
package/lib/cron.js
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.cron = cron;
|
|
4
|
+
const cron_parser_1 = require("cron-parser");
|
|
5
|
+
const MINUTE_MS = 60 * 1000;
|
|
6
|
+
function cron(ctx, pattern, callback, options = {}) {
|
|
7
|
+
const expr = cron_parser_1.CronExpressionParser.parse(pattern);
|
|
8
|
+
const logger = ctx.logger(options.name ?? 'cron');
|
|
9
|
+
const cooldownMs = Math.max(0, options.cooldown ?? 0) * MINUTE_MS;
|
|
10
|
+
const pollIntervalMs = Math.max(1, options.cooldown ?? 1) * MINUTE_MS;
|
|
11
|
+
let disposed = false;
|
|
12
|
+
let running = false;
|
|
13
|
+
let disposeTimer;
|
|
14
|
+
let lastTriggeredAt;
|
|
15
|
+
let nextRunAt = getNextRunAt(expr);
|
|
16
|
+
const schedule = () => {
|
|
17
|
+
if (disposed)
|
|
18
|
+
return;
|
|
19
|
+
const delay = Math.max(0, Math.min(nextRunAt - Date.now(), pollIntervalMs));
|
|
20
|
+
disposeTimer = ctx.setTimeout(async () => {
|
|
21
|
+
disposeTimer = undefined;
|
|
22
|
+
if (disposed)
|
|
23
|
+
return;
|
|
24
|
+
if (Date.now() >= nextRunAt) {
|
|
25
|
+
await trigger();
|
|
26
|
+
nextRunAt = getNextRunAt(expr);
|
|
27
|
+
}
|
|
28
|
+
schedule();
|
|
29
|
+
}, delay);
|
|
30
|
+
};
|
|
31
|
+
schedule();
|
|
32
|
+
return () => {
|
|
33
|
+
disposed = true;
|
|
34
|
+
disposeTimer?.();
|
|
35
|
+
};
|
|
36
|
+
async function trigger() {
|
|
37
|
+
const now = Date.now();
|
|
38
|
+
if (running)
|
|
39
|
+
return;
|
|
40
|
+
if (cooldownMs > 0 &&
|
|
41
|
+
lastTriggeredAt !== undefined &&
|
|
42
|
+
now - lastTriggeredAt < cooldownMs) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
lastTriggeredAt = now;
|
|
46
|
+
running = true;
|
|
47
|
+
try {
|
|
48
|
+
await callback();
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
logger.warn(error);
|
|
52
|
+
}
|
|
53
|
+
finally {
|
|
54
|
+
running = false;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function getNextRunAt(expr) {
|
|
59
|
+
expr.reset(new Date());
|
|
60
|
+
return expr.next().getTime();
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=cron.js.map
|
package/lib/cron.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cron.js","sourceRoot":"","sources":["../src/cron.ts"],"names":[],"mappings":";;AAMA,oBAmEC;AAxED,6CAAkD;AAGlD,MAAM,SAAS,GAAG,EAAE,GAAG,IAAI,CAAA;AAE3B,SAAgB,IAAI,CAChB,GAAY,EACZ,OAAe,EACf,QAAoC,EACpC,UAAuB,EAAE;IAEzB,MAAM,IAAI,GAAG,kCAAoB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IAChD,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,MAAM,CAAC,CAAA;IACjD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,SAAS,CAAA;IACjE,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,SAAS,CAAA;IACrE,IAAI,QAAQ,GAAG,KAAK,CAAA;IACpB,IAAI,OAAO,GAAG,KAAK,CAAA;IACnB,IAAI,YAAsC,CAAA;IAC1C,IAAI,eAAmC,CAAA;IACvC,IAAI,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;IAElC,MAAM,QAAQ,GAAG,GAAG,EAAE;QAClB,IAAI,QAAQ;YAAE,OAAM;QAEpB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAClB,CAAC,EACD,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CACnD,CAAA;QAED,YAAY,GAAG,GAAG,CAAC,UAAU,CAAC,KAAK,IAAI,EAAE;YACrC,YAAY,GAAG,SAAS,CAAA;YACxB,IAAI,QAAQ;gBAAE,OAAM;YAEpB,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,SAAS,EAAE,CAAC;gBAC1B,MAAM,OAAO,EAAE,CAAA;gBACf,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;YAClC,CAAC;YAED,QAAQ,EAAE,CAAA;QACd,CAAC,EAAE,KAAK,CAAC,CAAA;IACb,CAAC,CAAA;IAED,QAAQ,EAAE,CAAA;IAEV,OAAO,GAAG,EAAE;QACR,QAAQ,GAAG,IAAI,CAAA;QACf,YAAY,EAAE,EAAE,CAAA;IACpB,CAAC,CAAA;IAED,KAAK,UAAU,OAAO;QAClB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAEtB,IAAI,OAAO;YAAE,OAAM;QACnB,IACI,UAAU,GAAG,CAAC;YACd,eAAe,KAAK,SAAS;YAC7B,GAAG,GAAG,eAAe,GAAG,UAAU,EACpC,CAAC;YACC,OAAM;QACV,CAAC;QAED,eAAe,GAAG,GAAG,CAAA;QACrB,OAAO,GAAG,IAAI,CAAA;QAEd,IAAI,CAAC;YACD,MAAM,QAAQ,EAAE,CAAA;QACpB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACtB,CAAC;gBAAS,CAAC;YACP,OAAO,GAAG,KAAK,CAAA;QACnB,CAAC;IACL,CAAC;AACL,CAAC;AAOD,SAAS,YAAY,CAAC,IAAoB;IACtC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAA;IACtB,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,CAAA;AAChC,CAAC"}
|
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Context } from 'koishi';
|
|
2
|
+
import type { Config as GroupAnalysisConfig } from './config';
|
|
3
|
+
export * from './config';
|
|
4
|
+
export * from './service/message';
|
|
5
|
+
export declare function apply(ctx: Context, config: GroupAnalysisConfig): void;
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AAQhC,OAAO,KAAK,EAAE,MAAM,IAAI,mBAAmB,EAAE,MAAM,UAAU,CAAA;AAG7D,cAAc,UAAU,CAAA;AACxB,cAAc,mBAAmB,CAAA;AAEjC,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,mBAAmB,QAoB9D"}
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.apply = apply;
|
|
18
|
+
const analysis_1 = require("./service/analysis");
|
|
19
|
+
const llm_1 = require("./service/llm");
|
|
20
|
+
const renderer_1 = require("./service/renderer");
|
|
21
|
+
const message_1 = require("./service/message");
|
|
22
|
+
const plugin_1 = require("./plugin");
|
|
23
|
+
const cron_1 = require("./cron");
|
|
24
|
+
__exportStar(require("./config"), exports);
|
|
25
|
+
__exportStar(require("./service/message"), exports);
|
|
26
|
+
function apply(ctx, config) {
|
|
27
|
+
ctx.plugin(message_1.MessageService, config);
|
|
28
|
+
ctx.plugin(llm_1.LLMService, config);
|
|
29
|
+
ctx.plugin(analysis_1.AnalysisService, config);
|
|
30
|
+
ctx.plugin(renderer_1.RendererService, config);
|
|
31
|
+
ctx.inject([
|
|
32
|
+
'group_analysis_message',
|
|
33
|
+
'group_analysis_llm',
|
|
34
|
+
'group_analysis_renderer'
|
|
35
|
+
], (ctx) => {
|
|
36
|
+
(0, plugin_1.plugin)(ctx, config);
|
|
37
|
+
});
|
|
38
|
+
ctx.inject(['group_analysis'], (ctx) => {
|
|
39
|
+
ctx.effect(() => scheduleAutoAnalysis(ctx, config));
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
function scheduleAutoAnalysis(ctx, config) {
|
|
43
|
+
if (!config.cronSchedule?.trim()) {
|
|
44
|
+
return () => { };
|
|
45
|
+
}
|
|
46
|
+
return (0, cron_1.cron)(ctx, config.cronSchedule, () => ctx.group_analysis.executeAutoAnalysisForEnabledGroups(), {
|
|
47
|
+
cooldown: config.autoAnalysisCooldown,
|
|
48
|
+
name: 'group-analysis'
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAcA,sBAoBC;AAhCD,iDAAoD;AACpD,uCAA0C;AAC1C,iDAAoD;AACpD,+CAAkD;AAClD,qCAAiC;AAGjC,iCAA6B;AAE7B,2CAAwB;AACxB,oDAAiC;AAEjC,SAAgB,KAAK,CAAC,GAAY,EAAE,MAA2B;IAC3D,GAAG,CAAC,MAAM,CAAC,wBAAc,EAAE,MAAM,CAAC,CAAA;IAClC,GAAG,CAAC,MAAM,CAAC,gBAAU,EAAE,MAAM,CAAC,CAAA;IAC9B,GAAG,CAAC,MAAM,CAAC,0BAAe,EAAE,MAAM,CAAC,CAAA;IACnC,GAAG,CAAC,MAAM,CAAC,0BAAe,EAAE,MAAM,CAAC,CAAA;IAEnC,GAAG,CAAC,MAAM,CACN;QACI,wBAAwB;QACxB,oBAAoB;QACpB,yBAAyB;KAC5B,EACD,CAAC,GAAG,EAAE,EAAE;QACJ,IAAA,eAAM,EAAC,GAAG,EAAE,MAAM,CAAC,CAAA;IACvB,CAAC,CACJ,CAAA;IAED,GAAG,CAAC,MAAM,CAAC,CAAC,gBAAgB,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE;QACnC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,oBAAoB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAA;IACvD,CAAC,CAAC,CAAA;AACN,CAAC;AAED,SAAS,oBAAoB,CAAC,GAAY,EAAE,MAA2B;IACnE,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,IAAI,EAAE,EAAE,CAAC;QAC/B,OAAO,GAAG,EAAE,GAAE,CAAC,CAAA;IACnB,CAAC;IAED,OAAO,IAAA,WAAI,EACP,GAAG,EACH,MAAM,CAAC,YAAY,EACnB,GAAG,EAAE,CAAC,GAAG,CAAC,cAAc,CAAC,mCAAmC,EAAE,EAC9D;QACI,QAAQ,EAAE,MAAM,CAAC,oBAAoB;QACrC,IAAI,EAAE,gBAAgB;KACzB,CACJ,CAAA;AACL,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Dict, h } from 'koishi';
|
|
2
|
+
export declare function CQCode(type: string, attrs: Dict<string>): string;
|
|
3
|
+
export interface CQCode {
|
|
4
|
+
type: string;
|
|
5
|
+
data: Dict<string>;
|
|
6
|
+
capture?: RegExpExecArray;
|
|
7
|
+
}
|
|
8
|
+
export declare namespace CQCode {
|
|
9
|
+
function escape(source: any, inline?: boolean): string;
|
|
10
|
+
function unescape(source: string): string;
|
|
11
|
+
function from(source: string): CQCode;
|
|
12
|
+
function parse(source: string | CQCode[]): h[];
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=cqcode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cqcode.d.ts","sourceRoot":"","sources":["../../src/onebot/cqcode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAA;AAEhC,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,UAOvD;AAED,MAAM,WAAW,MAAM;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;IAClB,OAAO,CAAC,EAAE,eAAe,CAAA;CAC5B;AAGD,yBAAiB,MAAM,CAAC;IAEpB,SAAgB,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,UAAQ,UAajD;IAED,SAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,UAMtC;IAID,SAAgB,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAc3C;IAED,SAAgB,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,OA+B9C;CACJ"}
|