-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgemini.plugin.ts
93 lines (83 loc) · 2.94 KB
/
gemini.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
/*
* Copyright © 2024 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 GeminiLlmHelper from '@/contrib/extensions/helpers/hexabot-helper-gemini/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 GEMINI_PLUGIN_SETTINGS from './settings';
@Injectable()
export class GeminiPlugin extends BaseBlockPlugin<
typeof GEMINI_PLUGIN_SETTINGS
> {
template: PluginBlockTemplate = { name: 'Gemini RAG Block' };
constructor(
pluginService: PluginService,
private logger: LoggerService,
private contentService: ContentService,
private messageService: MessageService,
private helperService: HelperService,
) {
super('gemini-plugin', pluginService);
}
getPath(): string {
return __dirname;
}
async process(block: Block, ctx: Context, _convId: string) {
const ragContent = ctx.text
? await this.contentService.textSearch(ctx.text)
: [];
const { model, instructions, context, max_messages_ctx, ...options } =
this.getArguments(block);
const geminiHelper = this.helperService.use(
HelperType.LLM,
GeminiLlmHelper,
);
const systemInstruction = [
`CONTEXT: ${context}`,
`DOCUMENTS:`,
...ragContent.map(
(curr, index) =>
`\tDOCUMENT ${index + 1} \n\t\tTitle: ${curr.title} \n\t\tData: ${curr.rag}`,
),
`INSTRUCTIONS:`,
instructions,
].join('\n');
const history = await this.messageService.findLastMessages(
ctx.user,
max_messages_ctx,
);
const text = ctx?.text
? await geminiHelper.generateChatCompletion(
ctx.text,
model,
systemInstruction,
history,
options,
)
: "";
const envelope: StdOutgoingTextEnvelope = {
format: OutgoingMessageFormat.text,
message: {
text,
},
};
return envelope;
}
}