@peopl-health/nexus 3.3.15 → 3.3.16
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.
|
@@ -155,6 +155,45 @@ class OpenAIResponsesProvider {
|
|
|
155
155
|
};
|
|
156
156
|
}
|
|
157
157
|
|
|
158
|
+
_contentPartToText(part) {
|
|
159
|
+
if (part == null || typeof part !== 'object') return '';
|
|
160
|
+
return typeof part.text === 'string' ? part.text : (typeof part.text?.value === 'string' ? part.text.value : '');
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
_extractMessageOutput(result) {
|
|
164
|
+
if (result == null || typeof result !== 'object') return '';
|
|
165
|
+
|
|
166
|
+
if (result.output && Array.isArray(result.output)) {
|
|
167
|
+
const messageItems = result.output.filter(item => item && item.type === 'message');
|
|
168
|
+
if (messageItems.length > 0) {
|
|
169
|
+
const lastMessage = messageItems[messageItems.length - 1];
|
|
170
|
+
let text = '';
|
|
171
|
+
if (lastMessage.content && Array.isArray(lastMessage.content)) {
|
|
172
|
+
text = lastMessage.content.map(c => this._contentPartToText(c)).filter(Boolean).join('');
|
|
173
|
+
} else if (typeof lastMessage.content === 'string') {
|
|
174
|
+
text = lastMessage.content;
|
|
175
|
+
}
|
|
176
|
+
if (text.trim()) return text.trim();
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
if (result.output_text) return this._extractMessageFromConcatenatedOutput(result.output_text);
|
|
180
|
+
return '';
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
_extractMessageFromConcatenatedOutput(outputText) {
|
|
184
|
+
if (!outputText || typeof outputText !== 'string') return '';
|
|
185
|
+
if (!/^\s*assistant\s*\n/i.test(outputText)) return outputText.trim();
|
|
186
|
+
|
|
187
|
+
const segments = outputText
|
|
188
|
+
.split(/\n\s*assistant\s*\n/i)
|
|
189
|
+
.map(s => s.replace(/^assistant\s*\n?/i, '').trim())
|
|
190
|
+
.filter(Boolean);
|
|
191
|
+
|
|
192
|
+
if (segments.length === 0) return '';
|
|
193
|
+
if (segments.length > 1) logger.debug('[OpenAIResponsesProvider] Concatenated transcript detected, using last segment', { segmentCount: segments.length });
|
|
194
|
+
return segments[segments.length - 1].trim();
|
|
195
|
+
}
|
|
196
|
+
|
|
158
197
|
async executeRun({ thread, assistant, message = null, tools = [], config = {} }) {
|
|
159
198
|
const { conversationId, assistantId } = this._normalizeThread(thread);
|
|
160
199
|
const promptVersion = thread?.version || null;
|
|
@@ -204,7 +243,7 @@ class OpenAIResponsesProvider {
|
|
|
204
243
|
await this.conversationManager.processResponse(result, thread, config);
|
|
205
244
|
|
|
206
245
|
const completed = result.status === 'completed';
|
|
207
|
-
const output =
|
|
246
|
+
const output = this._extractMessageOutput(result);
|
|
208
247
|
const toolsExecuted = result.tools_executed?.length || 0;
|
|
209
248
|
|
|
210
249
|
if (filter) await Thread.updateOne(filter, { $set: { run_id: null } });
|
|
@@ -231,11 +270,13 @@ class OpenAIResponsesProvider {
|
|
|
231
270
|
logger.info('[runConversation] Attempt', { attempt, maxRetries: MAX_CONVERSATION_RETRIES, threadId, assistantId });
|
|
232
271
|
|
|
233
272
|
const result = await this._executeConversation(config);
|
|
273
|
+
const extractedOutput = this._extractMessageOutput(result);
|
|
234
274
|
|
|
235
|
-
if (
|
|
275
|
+
if (extractedOutput?.trim()) {
|
|
276
|
+
result.output_text = extractedOutput;
|
|
236
277
|
logger.info('[runConversation] Success', {
|
|
237
278
|
attempt,
|
|
238
|
-
outputLength:
|
|
279
|
+
outputLength: extractedOutput.length,
|
|
239
280
|
toolsExecuted: result.tools_executed?.length || 0
|
|
240
281
|
});
|
|
241
282
|
return result;
|