Skip to content

Commit 509b1e5

Browse files
authored
🔄 refactor: Consolidate Ask/Edit Controllers (danny-avila#1365)
* refactor(Ask/Edit): consolidate ask/edit controllers between the main modules and openAI controllers to reduce repetition of code and increase reusability * fix(winston/logger): circular dependency issue * fix(config/scripts): fix script imports * refactor(indexSync): make not configured message an info log message * chore: create a rollup script for api/server/index.js to check circular dependencies * chore: bump @keyv/redis
1 parent 0958db3 commit 509b1e5

20 files changed

+297
-366
lines changed

api/app/clients/AnthropicClient.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,7 @@ class AnthropicClient extends BaseClient {
290290
top_p,
291291
top_k,
292292
};
293-
logger.debug('[AnthropicClient]', { requestOptions });
293+
logger.debug('[AnthropicClient]', { ...requestOptions });
294294
const response = await client.completions.create(requestOptions);
295295

296296
signal.addEventListener('abort', () => {

api/config/winston.js

+8-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ const path = require('path');
22
const winston = require('winston');
33
require('winston-daily-rotate-file');
44
const { redact, deepObjectFormat } = require('./parsers');
5-
const { isEnabled } = require('~/server/utils/handleText');
65

76
const logDir = path.join(__dirname, '..', 'logs');
87

@@ -67,7 +66,10 @@ const transports = [
6766
// );
6867
// }
6968

70-
if (isEnabled && isEnabled(DEBUG_LOGGING)) {
69+
if (
70+
(typeof DEBUG_LOGGING === 'string' && DEBUG_LOGGING?.toLowerCase() === 'true') ||
71+
DEBUG_LOGGING === true
72+
) {
7173
transports.push(
7274
new winston.transports.DailyRotateFile({
7375
level: 'debug',
@@ -88,7 +90,10 @@ const consoleFormat = winston.format.combine(
8890
winston.format.printf((info) => `${info.timestamp} ${info.level}: ${info.message}`),
8991
);
9092

91-
if (isEnabled && isEnabled(DEBUG_CONSOLE)) {
93+
if (
94+
(typeof DEBUG_CONSOLE === 'string' && DEBUG_CONSOLE?.toLowerCase() === 'true') ||
95+
DEBUG_CONSOLE === true
96+
) {
9297
transports.push(
9398
new winston.transports.Console({
9499
level: 'debug',

api/lib/db/indexSync.js

+2
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@ async function indexSync(req, res, next) {
6565
logger.error('[indexSync] Trouble creating indices, try restarting the server.', err);
6666
}
6767
}, 750);
68+
} else if (err.message.includes('Meilisearch not configured')) {
69+
logger.info('[indexSync] Meilisearch not configured, search will be disabled.');
6870
} else {
6971
logger.error('[indexSync] error', err);
7072
// res.status(500).json({ error: 'Server error' });

api/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
"@anthropic-ai/sdk": "^0.5.4",
3131
"@azure/search-documents": "^12.0.0",
3232
"@keyv/mongo": "^2.1.8",
33-
"@keyv/redis": "^2.8.0",
33+
"@keyv/redis": "^2.8.1",
3434
"@langchain/google-genai": "^0.0.2",
3535
"axios": "^1.3.4",
3636
"bcryptjs": "^2.4.3",

api/server/controllers/AskController.js

+43-27
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,17 @@ const { saveMessage, getConvoTitle, getConvo } = require('~/models');
44
const { createAbortController, handleAbortError } = require('~/server/middleware');
55
const { logger } = require('~/config');
66

7-
const AskController = async (req, res, next, initializeClient) => {
7+
const AskController = async (req, res, next, initializeClient, addTitle) => {
88
let {
99
text,
1010
endpointOption,
1111
conversationId,
1212
parentMessageId = null,
1313
overrideParentMessageId = null,
1414
} = req.body;
15+
1516
logger.debug('[AskController]', { text, conversationId, ...endpointOption });
17+
1618
let metadata;
1719
let userMessage;
1820
let promptTokens;
@@ -21,8 +23,11 @@ const AskController = async (req, res, next, initializeClient) => {
2123
let lastSavedTimestamp = 0;
2224
let saveDelay = 100;
2325
const sender = getResponseSender({ ...endpointOption, model: endpointOption.modelOptions.model });
26+
const newConvo = !conversationId;
2427
const user = req.user.id;
2528

29+
const addMetadata = (data) => (metadata = data);
30+
2631
const getReqData = (data = {}) => {
2732
for (let key in data) {
2833
if (key === 'userMessage') {
@@ -50,6 +55,7 @@ const AskController = async (req, res, next, initializeClient) => {
5055
conversationId,
5156
parentMessageId: overrideParentMessageId ?? userMessageId,
5257
text: partialText,
58+
model: endpointOption.modelOptions.model,
5359
unfinished: true,
5460
cancelled: false,
5561
error: false,
@@ -62,46 +68,50 @@ const AskController = async (req, res, next, initializeClient) => {
6268
}
6369
},
6470
});
65-
try {
66-
const addMetadata = (data) => (metadata = data);
67-
const getAbortData = () => ({
68-
conversationId,
69-
messageId: responseMessageId,
70-
sender,
71-
parentMessageId: overrideParentMessageId ?? userMessageId,
72-
text: getPartialText(),
73-
userMessage,
74-
promptTokens,
75-
});
7671

77-
const { abortController, onStart } = createAbortController(req, res, getAbortData);
72+
const getAbortData = () => ({
73+
sender,
74+
conversationId,
75+
messageId: responseMessageId,
76+
parentMessageId: overrideParentMessageId ?? userMessageId,
77+
text: getPartialText(),
78+
userMessage,
79+
promptTokens,
80+
});
7881

79-
const { client } = await initializeClient({ req, res, endpointOption });
82+
const { abortController, onStart } = createAbortController(req, res, getAbortData);
8083

81-
let response = await client.sendMessage(text, {
82-
// debug: true,
84+
try {
85+
const { client } = await initializeClient({ req, res, endpointOption });
86+
const messageOptions = {
8387
user,
84-
conversationId,
8588
parentMessageId,
89+
conversationId,
8690
overrideParentMessageId,
87-
...endpointOption,
91+
getReqData,
92+
onStart,
93+
addMetadata,
94+
abortController,
8895
onProgress: progressCallback.call(null, {
8996
res,
9097
text,
91-
parentMessageId: overrideParentMessageId ?? userMessageId,
98+
parentMessageId: overrideParentMessageId || userMessageId,
9299
}),
93-
onStart,
94-
getReqData,
95-
addMetadata,
96-
abortController,
97-
});
100+
};
101+
102+
let response = await client.sendMessage(text, messageOptions);
103+
104+
if (overrideParentMessageId) {
105+
response.parentMessageId = overrideParentMessageId;
106+
}
98107

99108
if (metadata) {
100109
response = { ...response, ...metadata };
101110
}
102111

103-
if (overrideParentMessageId) {
104-
response.parentMessageId = overrideParentMessageId;
112+
if (client.options.attachments) {
113+
userMessage.files = client.options.attachments;
114+
delete userMessage.image_urls;
105115
}
106116

107117
sendMessage(res, {
@@ -116,7 +126,13 @@ const AskController = async (req, res, next, initializeClient) => {
116126
await saveMessage({ ...response, user });
117127
await saveMessage(userMessage);
118128

119-
// TODO: add title service
129+
if (addTitle && parentMessageId === '00000000-0000-0000-0000-000000000000' && newConvo) {
130+
addTitle(req, {
131+
text,
132+
response,
133+
client,
134+
});
135+
}
120136
} catch (error) {
121137
const partialText = getPartialText();
122138
handleAbortError(res, req, error, {

api/server/controllers/EditController.js

+22-25
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,15 @@ const EditController = async (req, res, next, initializeClient) => {
1515
parentMessageId = null,
1616
overrideParentMessageId = null,
1717
} = req.body;
18+
1819
logger.debug('[EditController]', {
1920
text,
2021
generation,
2122
isContinued,
2223
conversationId,
2324
...endpointOption,
2425
});
26+
2527
let metadata;
2628
let userMessage;
2729
let promptTokens;
@@ -48,6 +50,7 @@ const EditController = async (req, res, next, initializeClient) => {
4850
generation,
4951
onProgress: ({ text: partialText }) => {
5052
const currentTimestamp = Date.now();
53+
5154
if (currentTimestamp - lastSavedTimestamp > saveDelay) {
5255
lastSavedTimestamp = currentTimestamp;
5356
saveMessage({
@@ -56,6 +59,7 @@ const EditController = async (req, res, next, initializeClient) => {
5659
conversationId,
5760
parentMessageId: overrideParentMessageId ?? userMessageId,
5861
text: partialText,
62+
model: endpointOption.modelOptions.model,
5963
unfinished: true,
6064
cancelled: false,
6165
isEdited: true,
@@ -69,19 +73,20 @@ const EditController = async (req, res, next, initializeClient) => {
6973
}
7074
},
7175
});
72-
try {
73-
const getAbortData = () => ({
74-
conversationId,
75-
messageId: responseMessageId,
76-
sender,
77-
parentMessageId: overrideParentMessageId ?? userMessageId,
78-
text: getPartialText(),
79-
userMessage,
80-
promptTokens,
81-
});
8276

83-
const { abortController, onStart } = createAbortController(req, res, getAbortData);
77+
const getAbortData = () => ({
78+
conversationId,
79+
messageId: responseMessageId,
80+
sender,
81+
parentMessageId: overrideParentMessageId ?? userMessageId,
82+
text: getPartialText(),
83+
userMessage,
84+
promptTokens,
85+
});
86+
87+
const { abortController, onStart } = createAbortController(req, res, getAbortData);
8488

89+
try {
8590
const { client } = await initializeClient({ req, res, endpointOption });
8691

8792
let response = await client.sendMessage(text, {
@@ -93,25 +98,22 @@ const EditController = async (req, res, next, initializeClient) => {
9398
parentMessageId,
9499
responseMessageId,
95100
overrideParentMessageId,
96-
...endpointOption,
97-
onProgress: progressCallback.call(null, {
98-
res,
99-
text,
100-
parentMessageId: overrideParentMessageId ?? userMessageId,
101-
}),
102101
getReqData,
103102
onStart,
104103
addMetadata,
105104
abortController,
105+
onProgress: progressCallback.call(null, {
106+
res,
107+
text,
108+
parentMessageId: overrideParentMessageId || userMessageId,
109+
}),
106110
});
107111

108112
if (metadata) {
109113
response = { ...response, ...metadata };
110114
}
111115

112-
if (overrideParentMessageId) {
113-
response.parentMessageId = overrideParentMessageId;
114-
}
116+
await saveMessage({ ...response, user });
115117

116118
sendMessage(res, {
117119
title: await getConvoTitle(user, conversationId),
@@ -121,11 +123,6 @@ const EditController = async (req, res, next, initializeClient) => {
121123
responseMessage: response,
122124
});
123125
res.end();
124-
125-
await saveMessage({ ...response, user });
126-
await saveMessage(userMessage);
127-
128-
// TODO: add title service
129126
} catch (error) {
130127
const partialText = getPartialText();
131128
handleAbortError(res, req, error, {

0 commit comments

Comments
 (0)