@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 = result.output_text || result.output?.find(o => o.type === 'message')?.content?.[0]?.text || '';
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 (result.output_text?.trim()) {
275
+ if (extractedOutput?.trim()) {
276
+ result.output_text = extractedOutput;
236
277
  logger.info('[runConversation] Success', {
237
278
  attempt,
238
- outputLength: result.output_text.length,
279
+ outputLength: extractedOutput.length,
239
280
  toolsExecuted: result.tools_executed?.length || 0
240
281
  });
241
282
  return result;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@peopl-health/nexus",
3
- "version": "3.3.15",
3
+ "version": "3.3.16",
4
4
  "description": "Core messaging and assistant library for WhatsApp communication platforms",
5
5
  "keywords": [
6
6
  "whatsapp",