@peopl-health/nexus 2.5.2 → 2.5.3
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.
|
@@ -3,8 +3,8 @@ const { Config_ID } = require('../config/airtableConfig');
|
|
|
3
3
|
const { Thread } = require('../models/threadModel');
|
|
4
4
|
|
|
5
5
|
const { getRecordByFilter } = require('../services/airtableService');
|
|
6
|
-
const { createAssistant, addMsgAssistant, addInsAssistant } = require('../services/assistantService');
|
|
7
|
-
const { getThreadInfo
|
|
6
|
+
const { createAssistant, addMsgAssistant, addInsAssistant, switchAssistant } = require('../services/assistantService');
|
|
7
|
+
const { getThreadInfo } = require('../helpers/threadHelper');
|
|
8
8
|
const { sendMessage } = require('../core/NexusMessaging');
|
|
9
9
|
const { logger } = require('../utils/logger');
|
|
10
10
|
|
|
@@ -16,7 +16,7 @@ const activeAssistantController = async (req, res) => {
|
|
|
16
16
|
await Thread.updateOne({ code }, { $set: { active: !!active } });
|
|
17
17
|
return res.status(200).send({ message: 'Active assistant' });
|
|
18
18
|
} catch (error) {
|
|
19
|
-
logger.error(error);
|
|
19
|
+
logger.error('[activeAssistantController] Error', { error: error.message, code });
|
|
20
20
|
return res.status(500).send({ message: 'Failed to active assistant', error });
|
|
21
21
|
}
|
|
22
22
|
};
|
|
@@ -32,7 +32,7 @@ const addInsAssistantController = async (req, res) => {
|
|
|
32
32
|
if (ans) await sendMessage({code, body: ans, fileType: 'text', origin: 'assistant'});
|
|
33
33
|
return res.status(200).send({ message: 'Add instruction to the assistant' });
|
|
34
34
|
} catch (error) {
|
|
35
|
-
logger.error(error);
|
|
35
|
+
logger.error('[addInsAssistantController] Error', { error: error.message, code });
|
|
36
36
|
res.status(500).send({ message: 'Failed to add instruction to assistant', error });
|
|
37
37
|
}
|
|
38
38
|
};
|
|
@@ -45,7 +45,7 @@ const addMsgAssistantController = async (req, res) => {
|
|
|
45
45
|
if (ans) await sendMessage({code, body: ans, fileType: 'text', origin: 'assistant'});
|
|
46
46
|
return res.status(200).send({ message: 'Add message to the assistant' });
|
|
47
47
|
} catch (error) {
|
|
48
|
-
logger.error(error);
|
|
48
|
+
logger.error('[addMsgAssistantController] Error', { error: error.message, code, role });
|
|
49
49
|
res.status(500).send({ message: 'Failed to add message assistant', error });
|
|
50
50
|
}
|
|
51
51
|
};
|
|
@@ -59,18 +59,18 @@ const createAssistantController = async (req, res) => {
|
|
|
59
59
|
messages = Array.isArray(messages) ? messages : [];
|
|
60
60
|
|
|
61
61
|
try {
|
|
62
|
-
logger.info('[createAssistantController] codes', codes);
|
|
62
|
+
logger.info('[createAssistantController] codes', { codes });
|
|
63
63
|
for (const code of codes) {
|
|
64
64
|
await createAssistant(code, assistant_id, [...instrucciones, ...messages], force);
|
|
65
|
-
logger.info('[createAssistantController] messages', messages);
|
|
65
|
+
logger.info('[createAssistantController] messages', { messages });
|
|
66
66
|
for (const message of messages) {
|
|
67
|
-
logger.info('[createAssistantController] message', message);
|
|
67
|
+
logger.info('[createAssistantController] message', { message });
|
|
68
68
|
await sendMessage({code, body: message, fileType: 'text'});
|
|
69
69
|
}
|
|
70
70
|
}
|
|
71
71
|
res.status(200).send({ message: 'Create the assistant' });
|
|
72
72
|
} catch (error) {
|
|
73
|
-
logger.error(error);
|
|
73
|
+
logger.error('[createAssistantController] Error creating assistant', { error: error.message, stack: error.stack });
|
|
74
74
|
res.status(500).send({ message: 'Failed to create assistant', error });
|
|
75
75
|
}
|
|
76
76
|
};
|
|
@@ -82,7 +82,7 @@ const getInfoAssistantController = async (req, res) => {
|
|
|
82
82
|
let threadInfo = await getThreadInfo(code);
|
|
83
83
|
return res.status(200).send({ message: 'Send assistant info' , threadInfo});
|
|
84
84
|
} catch (error) {
|
|
85
|
-
logger.error(error);
|
|
85
|
+
logger.error('[getInfoAssistantController] Error', { error: error.message, code });
|
|
86
86
|
res.status(500).send({ message: 'Failed to receive assistant info', error });
|
|
87
87
|
}
|
|
88
88
|
};
|
|
@@ -97,7 +97,7 @@ const listAssistantController = async (req, res) => {
|
|
|
97
97
|
const assistants = await getRecordByFilter(Config_ID, tableName, `status="${airtableStatus}"`);
|
|
98
98
|
return res.status(200).send({ message: 'List assistants' , assistants});
|
|
99
99
|
} catch (error) {
|
|
100
|
-
logger.error(error);
|
|
100
|
+
logger.error('[listAssistantController] Error', { error: error.message });
|
|
101
101
|
res.status(500).send({ message: 'Failed to list assistants', error });
|
|
102
102
|
}
|
|
103
103
|
};
|
|
@@ -109,7 +109,7 @@ const switchAssistantController = async (req, res) => {
|
|
|
109
109
|
await switchAssistant(code, assistant_id);
|
|
110
110
|
return res.status(200).send({ message: 'Switch assistant' });
|
|
111
111
|
} catch (error) {
|
|
112
|
-
logger.error(error);
|
|
112
|
+
logger.error('[switchAssistantController] Error', { error: error.message, code, assistant_id });
|
|
113
113
|
res.status(500).send({ message: 'Failed to switch assistant', error });
|
|
114
114
|
}
|
|
115
115
|
};
|
|
@@ -121,7 +121,7 @@ const stopAssistantController = async (req, res) => {
|
|
|
121
121
|
await Thread.updateOne({ code }, { $set: { stopped: !!stop } });
|
|
122
122
|
return res.status(200).send({ message: 'Stop assistant' });
|
|
123
123
|
} catch (error) {
|
|
124
|
-
logger.error(error);
|
|
124
|
+
logger.error('[stopAssistantController] Error', { error: error.message, code, stop });
|
|
125
125
|
return res.status(500).send({ message: 'Failed to stop assistant', error });
|
|
126
126
|
}
|
|
127
127
|
};
|
|
@@ -354,18 +354,6 @@ class NexusMessaging {
|
|
|
354
354
|
|
|
355
355
|
const chatId = messageData.from || messageData.From;
|
|
356
356
|
|
|
357
|
-
// Send initial typing indicator with delay
|
|
358
|
-
if (chatId && this.provider && typeof this.provider.sendTypingIndicator === 'function') {
|
|
359
|
-
const messageId = messageData.id || messageData.MessageSid || messageData.message_id;
|
|
360
|
-
if (messageId) {
|
|
361
|
-
setTimeout(() => {
|
|
362
|
-
this.provider.sendTypingIndicator(messageId).catch(err =>
|
|
363
|
-
logger.debug('[processIncomingMessage] Typing indicator failed', { error: err.message })
|
|
364
|
-
);
|
|
365
|
-
}, 3000);
|
|
366
|
-
}
|
|
367
|
-
}
|
|
368
|
-
|
|
369
357
|
if (chatId && hasPreprocessingHandler()) {
|
|
370
358
|
const stop = await invokePreprocessingHandler({
|
|
371
359
|
code: chatId,
|
|
@@ -5,6 +5,7 @@ const { createProvider } = require('../providers/createProvider');
|
|
|
5
5
|
const { Thread } = require('../models/threadModel.js');
|
|
6
6
|
const { PredictionMetrics } = require('../models/predictionMetricsModel');
|
|
7
7
|
const { insertMessage } = require('../models/messageModel');
|
|
8
|
+
const { Historial_Clinico_ID } = require('../config/airtableConfig');
|
|
8
9
|
|
|
9
10
|
const { getCurRow, runAssistantWithRetries } = require('../helpers/assistantHelper.js');
|
|
10
11
|
const { getThread } = require('../helpers/threadHelper.js');
|
|
@@ -19,14 +20,14 @@ const createAssistantCore = async (code, assistant_id, getAssistantById) => {
|
|
|
19
20
|
if (!thread) return null;
|
|
20
21
|
|
|
21
22
|
const assistant = getAssistantById(assistant_id, thread);
|
|
22
|
-
const curRow = await getCurRow(code);
|
|
23
|
+
const curRow = await getCurRow(Historial_Clinico_ID, code);
|
|
23
24
|
const context = { curRow };
|
|
24
25
|
|
|
25
26
|
try {
|
|
26
27
|
await assistant.create(code, context);
|
|
27
28
|
return { success: true, assistant_id };
|
|
28
29
|
} catch (error) {
|
|
29
|
-
logger.error('[createAssistantCore] Error
|
|
30
|
+
logger.error('[createAssistantCore] Error creating assistant', { error: error.message, assistant_id, code });
|
|
30
31
|
return { success: false, error: error.message };
|
|
31
32
|
}
|
|
32
33
|
};
|
|
@@ -43,7 +44,7 @@ const addMsgAssistantCore = async (code, message, role = 'user') => {
|
|
|
43
44
|
await insertMessage({ code, message, role });
|
|
44
45
|
return { success: true };
|
|
45
46
|
} catch (error) {
|
|
46
|
-
logger.error('[addMsgAssistantCore] Error
|
|
47
|
+
logger.error('[addMsgAssistantCore] Error adding message', { error: error.message, code, role });
|
|
47
48
|
return { success: false, error: error.message };
|
|
48
49
|
}
|
|
49
50
|
};
|
|
@@ -59,7 +60,7 @@ const addInstructionCore = async (code, instruction, role = 'user') => {
|
|
|
59
60
|
await provider.addMessage({ threadId, messages: [{ role, content: instruction }] });
|
|
60
61
|
return { success: true };
|
|
61
62
|
} catch (error) {
|
|
62
|
-
logger.error('[addInstructionCore] Error
|
|
63
|
+
logger.error('[addInstructionCore] Error adding instruction', { error: error.message, code, role });
|
|
63
64
|
return { success: false, error: error.message };
|
|
64
65
|
}
|
|
65
66
|
};
|
|
@@ -175,12 +176,18 @@ const replyAssistantCore = async (code, message_ = null, thread_ = null, runOpti
|
|
|
175
176
|
retry_count: retries,
|
|
176
177
|
completed: completed,
|
|
177
178
|
timing_breakdown: timings
|
|
178
|
-
}).catch(err => logger.error('[replyAssistantCore] Failed to store metrics
|
|
179
|
+
}).catch(err => logger.error('[replyAssistantCore] Failed to store metrics', { error: err.message }));
|
|
179
180
|
}
|
|
180
181
|
|
|
181
182
|
return { output, tools_executed };
|
|
182
183
|
} catch (error) {
|
|
183
|
-
logger.error('[replyAssistantCore] Error
|
|
184
|
+
logger.error('[replyAssistantCore] Error in reply', {
|
|
185
|
+
error: error.message,
|
|
186
|
+
stack: error.stack,
|
|
187
|
+
code: code ? `${code.substring(0, 3)}***${code.slice(-4)}` : 'unknown',
|
|
188
|
+
hasCustomThread: !!thread_,
|
|
189
|
+
hasMessage: !!message_
|
|
190
|
+
});
|
|
184
191
|
throw error;
|
|
185
192
|
}
|
|
186
193
|
};
|
|
@@ -189,7 +196,8 @@ const switchAssistantCore = async (code, assistant_id) => {
|
|
|
189
196
|
try {
|
|
190
197
|
const thread = await Thread.findOne({ code });
|
|
191
198
|
if (!thread) {
|
|
192
|
-
|
|
199
|
+
logger.warn('[switchAssistantCore] Thread not found', { code, assistant_id });
|
|
200
|
+
return { success: false, error: 'Thread not found' };
|
|
193
201
|
}
|
|
194
202
|
|
|
195
203
|
const updateFields = {
|
|
@@ -199,10 +207,16 @@ const switchAssistantCore = async (code, assistant_id) => {
|
|
|
199
207
|
};
|
|
200
208
|
|
|
201
209
|
await Thread.updateOne({ code }, { $set: updateFields });
|
|
210
|
+
logger.info('[switchAssistantCore] Assistant switched', { code, assistant_id });
|
|
202
211
|
return { success: true, assistant_id };
|
|
203
212
|
} catch (error) {
|
|
204
|
-
logger.
|
|
205
|
-
|
|
213
|
+
logger.error('[switchAssistantCore] Error switching assistant', {
|
|
214
|
+
error: error.message,
|
|
215
|
+
stack: error.stack,
|
|
216
|
+
code,
|
|
217
|
+
assistant_id
|
|
218
|
+
});
|
|
219
|
+
return { success: false, error: error.message };
|
|
206
220
|
}
|
|
207
221
|
};
|
|
208
222
|
|