-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathchatgpt.plugin.ts
101 lines (89 loc) · 3.13 KB
/
chatgpt.plugin.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
/*
* Copyright © 2025 Hexastack. All rights reserved.
*
* Licensed under the GNU Affero General Public License v3.0 (AGPLv3) with the following additional terms:
* 1. The name "Hexabot" is a trademark of Hexastack. You may not use this name in derivative works without express written permission.
* 2. All derivative works must include clear attribution to the original creator and software, Hexastack and Hexabot, in a prominent location (e.g., in the software's "About" section, documentation, and README file).
*/
import { Injectable } from '@nestjs/common';
import { Block } from '@/chat/schemas/block.schema';
import { Context } from '@/chat/schemas/types/context';
import {
OutgoingMessageFormat,
StdOutgoingTextEnvelope,
} from '@/chat/schemas/types/message';
import { MessageService } from '@/chat/services/message.service';
import { ContentService } from '@/cms/services/content.service';
import ChatGptLlmHelper from '@/contrib/extensions/helpers/hexabot-helper-chatgpt/index.helper';
import { HelperService } from '@/helper/helper.service';
import { HelperType } from '@/helper/types';
import { LoggerService } from '@/logger/logger.service';
import { BaseBlockPlugin } from '@/plugins/base-block-plugin';
import { PluginService } from '@/plugins/plugins.service';
import { PluginBlockTemplate } from '@/plugins/types';
import CHATGPT_PLUGIN_SETTINGS from './settings';
@Injectable()
export class ChatgptPlugin extends BaseBlockPlugin<
typeof CHATGPT_PLUGIN_SETTINGS
> {
template: PluginBlockTemplate = { name: 'ChatGPT RAG Plugin' };
constructor(
pluginService: PluginService,
private helperService: HelperService,
private logger: LoggerService,
private contentService: ContentService,
private readonly messageService: MessageService,
) {
super('chatgpt-plugin', pluginService);
}
getPath(): string {
return __dirname;
}
async process(block: Block, ctx: Context, _convId: string) {
const RAG = ctx.text
? await this.contentService.textSearch(ctx.text)
: [];
const {
model,
context,
max_messages_ctx,
instructions,
...options
} = this.getArguments(block);
const chatGptHelper = this.helperService.use(
HelperType.LLM,
ChatGptLlmHelper,
);
const history = await this.messageService.findLastMessages(
ctx.user,
max_messages_ctx,
);
const systemPrompt = `CONTEXT: ${context}
DOCUMENTS: \n${RAG.reduce(
(prev, curr, index) =>
`${prev}\n\tDOCUMENT ${index} \n\t\tTitle:${curr.title}\n\t\tData:${curr.rag}`,
'',
)}\nINSTRUCTIONS:
${instructions}
`;
const text = ctx?.text
? await chatGptHelper.generateChatCompletion(
ctx.text,
model,
systemPrompt,
history,
{ ...options,
logit_bias: JSON.parse(options.logit_bias) as Record<string, number> || {},
user: ctx.user.id,
},
)
: "";
const envelope: StdOutgoingTextEnvelope = {
format: OutgoingMessageFormat.text,
message: {
text,
},
};
return envelope;
}
}