-
Notifications
You must be signed in to change notification settings - Fork 0
/
openai.ts
83 lines (77 loc) · 2.82 KB
/
openai.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
import {CalculateChatRequest} from "../data/CalculateChatRequest";
import {
factory,
OpenAiAssistantConfig,
OpenAiChatState,
ToolsDispatcher
} from "@motorro/firebase-ai-chat-openai";
import {PostCalculateRequest} from "../data/PostCalculateRequest";
import {CalculateChatData} from "../data/CalculateChatData";
import {firestore} from "firebase-admin";
import CollectionReference = firestore.CollectionReference;
import {NAME, openAiApiKey, openAiAssistantId, region} from "../env";
import {getFunctions} from "firebase-admin/functions";
import {CalculateChatResponse} from "../data/CalculateChatResponse";
import DocumentReference = firestore.DocumentReference;
import {ChatWorker} from "@motorro/firebase-ai-chat-core";
import OpenAI from "openai";
import {calculateDispatcher} from "../common/calculator";
import {CloseCalculateRequest} from "../data/CloseCalculateRequest";
import {OPENAI_CHATS} from "../data/Collections";
const db = firestore();
const chats = db.collection(OPENAI_CHATS) as CollectionReference<OpenAiChatState<CalculateChatData>>;
const chatFactory = factory(db, getFunctions(), region);
const assistantChat = chatFactory.chat<CalculateChatData>("calculator");
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const dispatchers: Record<string, ToolsDispatcher<any>> = {
[NAME]: calculateDispatcher
};
export const calculate = async (uid: string, data: CalculateChatRequest): Promise<CalculateChatResponse> => {
const chat = chats.doc();
const config: OpenAiAssistantConfig = {
engine: "openai",
assistantId: openAiAssistantId.value(),
dispatcherId: NAME
};
const result = await assistantChat.create(
chat,
uid,
{sum: 0},
config,
[data.message]
);
return {
chatDocument: chat.path,
status: result.status,
data: result.data
};
};
export const postToCalculate = async (uid: string, data: PostCalculateRequest): Promise<CalculateChatResponse> => {
const result = await assistantChat.postMessage(
db.doc(data.chatDocument) as DocumentReference<OpenAiChatState<CalculateChatData>>,
uid,
[data.message]
);
return {
chatDocument: data.chatDocument,
status: result.status,
data: result.data
};
};
export const closeCalculate = async (uid: string, data: CloseCalculateRequest): Promise<CalculateChatResponse> => {
const result = await assistantChat.closeChat(
db.doc(data.chatDocument) as DocumentReference<OpenAiChatState<CalculateChatData>>,
uid,
);
return {
chatDocument: data.chatDocument,
status: result.status,
data: result.data
};
};
export const getWorker = (): ChatWorker => {
return chatFactory.worker(
new OpenAI({apiKey: openAiApiKey.value()}),
dispatchers
);
};