Update reasoning messages to improve clarity and consistency across tools

- Changed the wording of elapsed time in reasoning messages from "min" to "minutes" for better readability.
- Updated the final reasoning message format to specify "Reasoned for" instead of "Total workflow time," enhancing user understanding of the output.

These changes contribute to a more user-friendly experience and maintain consistency in messaging across different tools.
This commit is contained in:
dal 2025-08-14 14:09:53 -06:00
parent 24e91b2ac7
commit 82516e4fbb
No known key found for this signature in database
GPG Key ID: 16F4B0E1E9F61122
4 changed files with 59 additions and 44 deletions

View File

@ -80,12 +80,12 @@ export function createDoneToolStart(doneToolState: DoneToolState, context: DoneT
timeString = `${elapsedSeconds} seconds`; timeString = `${elapsedSeconds} seconds`;
} else { } else {
const elapsedMinutes = Math.floor(elapsedSeconds / 60); const elapsedMinutes = Math.floor(elapsedSeconds / 60);
timeString = `${elapsedMinutes} min`; timeString = `${elapsedMinutes} minutes`;
} }
await updateMessage(context.messageId, { await updateMessage(context.messageId, {
isCompleted: true, isCompleted: true,
finalReasoningMessage: `Total workflow time: ${timeString}`, finalReasoningMessage: `Reasoned for ${timeString}`,
}); });
} }
} catch (error) { } catch (error) {

View File

@ -49,12 +49,12 @@ export function createMessageUserClarifyingQuestionStart(
timeString = `${elapsedSeconds} seconds`; timeString = `${elapsedSeconds} seconds`;
} else { } else {
const elapsedMinutes = Math.floor(elapsedSeconds / 60); const elapsedMinutes = Math.floor(elapsedSeconds / 60);
timeString = `${elapsedMinutes} min`; timeString = `${elapsedMinutes} minutes`;
} }
await updateMessage(messageId, { await updateMessage(messageId, {
isCompleted: true, isCompleted: true,
finalReasoningMessage: `Total workflow time: ${timeString}`, finalReasoningMessage: `Reasoned for ${timeString}`,
}); });
} catch (error) { } catch (error) {
console.error( console.error(

View File

@ -48,12 +48,12 @@ export function createRespondWithoutAssetCreationStart<
timeString = `${elapsedSeconds} seconds`; timeString = `${elapsedSeconds} seconds`;
} else { } else {
const elapsedMinutes = Math.floor(elapsedSeconds / 60); const elapsedMinutes = Math.floor(elapsedSeconds / 60);
timeString = `${elapsedMinutes} min`; timeString = `${elapsedMinutes} minutes`;
} }
await updateMessage(context.messageId, { await updateMessage(context.messageId, {
isCompleted: true, isCompleted: true,
finalReasoningMessage: `Total workflow time: ${timeString}`, finalReasoningMessage: `Reasoned for ${timeString}`,
}); });
} catch (error) { } catch (error) {
console.error('[respond-without-asset-creation] Failed to update initial entries:', error); console.error('[respond-without-asset-creation] Failed to update initial entries:', error);

View File

@ -30,23 +30,27 @@ export async function updateMessageEntries({
reasoningMessages, reasoningMessages,
}: UpdateMessageEntriesParams): Promise<{ success: boolean }> { }: UpdateMessageEntriesParams): Promise<{ success: boolean }> {
try { try {
const updates: Record<string, SQL | Date> = { updatedAt: new Date() }; const updates: Record<string, SQL | string> = { updatedAt: new Date().toISOString() };
// Optimized merge for response messages - upsert by 'id' // Optimized merge for response messages - upsert by 'id'
if (responseMessages?.length) { if (responseMessages?.length) {
const newData = JSON.stringify(responseMessages); const newData = JSON.stringify(responseMessages);
updates.responseMessages = sql` updates.responseMessages = sql`
COALESCE( COALESCE(
(SELECT jsonb_agg(value) (SELECT jsonb_agg(value ORDER BY ordinality)
FROM ( FROM (
SELECT DISTINCT ON (value->>'id') value -- Keep existing messages that aren't being updated
FROM ( SELECT value, ordinality
SELECT jsonb_array_elements(COALESCE(${messages.responseMessages}, '[]'::jsonb)) FROM jsonb_array_elements(COALESCE(${messages.responseMessages}, '[]'::jsonb)) WITH ORDINALITY AS t(value, ordinality)
WHERE NOT EXISTS (
SELECT 1 FROM jsonb_array_elements(${newData}::jsonb) AS new_msg
WHERE new_msg->>'id' = t.value->>'id'
)
UNION ALL UNION ALL
SELECT jsonb_array_elements(${newData}::jsonb) -- Add new/updated messages at the end
) combined(value) SELECT value, 1000000 + ordinality AS ordinality
ORDER BY value->>'id', value DESC FROM jsonb_array_elements(${newData}::jsonb) WITH ORDINALITY AS t(value, ordinality)
) deduplicated), ) combined),
'[]'::jsonb '[]'::jsonb
)`; )`;
} }
@ -56,16 +60,20 @@ export async function updateMessageEntries({
const newData = JSON.stringify(reasoningMessages); const newData = JSON.stringify(reasoningMessages);
updates.reasoning = sql` updates.reasoning = sql`
COALESCE( COALESCE(
(SELECT jsonb_agg(value) (SELECT jsonb_agg(value ORDER BY ordinality)
FROM ( FROM (
SELECT DISTINCT ON (value->>'id') value -- Keep existing messages that aren't being updated
FROM ( SELECT value, ordinality
SELECT jsonb_array_elements(COALESCE(${messages.reasoning}, '[]'::jsonb)) FROM jsonb_array_elements(COALESCE(${messages.reasoning}, '[]'::jsonb)) WITH ORDINALITY AS t(value, ordinality)
WHERE NOT EXISTS (
SELECT 1 FROM jsonb_array_elements(${newData}::jsonb) AS new_msg
WHERE new_msg->>'id' = t.value->>'id'
)
UNION ALL UNION ALL
SELECT jsonb_array_elements(${newData}::jsonb) -- Add new/updated messages at the end
) combined(value) SELECT value, 1000000 + ordinality AS ordinality
ORDER BY value->>'id', value DESC FROM jsonb_array_elements(${newData}::jsonb) WITH ORDINALITY AS t(value, ordinality)
) deduplicated), ) combined),
'[]'::jsonb '[]'::jsonb
)`; )`;
} }
@ -75,26 +83,33 @@ export async function updateMessageEntries({
const newData = JSON.stringify(rawLlmMessages); const newData = JSON.stringify(rawLlmMessages);
updates.rawLlmMessages = sql` updates.rawLlmMessages = sql`
COALESCE( COALESCE(
(SELECT jsonb_agg(value) (SELECT jsonb_agg(value ORDER BY ordinality)
FROM ( FROM (
SELECT DISTINCT ON ( -- Keep existing messages that aren't being updated
value->>'role', SELECT value, ordinality
FROM jsonb_array_elements(COALESCE(${messages.rawLlmMessages}, '[]'::jsonb)) WITH ORDINALITY AS t(value, ordinality)
WHERE NOT EXISTS (
SELECT 1 FROM jsonb_array_elements(${newData}::jsonb) AS new_msg
WHERE new_msg->>'role' = t.value->>'role'
AND (
-- Compare toolCallIds if they exist
(SELECT string_agg(content->>'toolCallId', ',' ORDER BY content->>'toolCallId') (SELECT string_agg(content->>'toolCallId', ',' ORDER BY content->>'toolCallId')
FROM jsonb_array_elements(value->'content') content FROM jsonb_array_elements(new_msg->'content') content
WHERE content->>'toolCallId' IS NOT NULL) =
(SELECT string_agg(content->>'toolCallId', ',' ORDER BY content->>'toolCallId')
FROM jsonb_array_elements(t.value->'content') content
WHERE content->>'toolCallId' IS NOT NULL) WHERE content->>'toolCallId' IS NOT NULL)
) value OR
FROM ( -- Both have no toolCallIds
SELECT jsonb_array_elements(COALESCE(${messages.rawLlmMessages}, '[]'::jsonb)) ((SELECT COUNT(*) FROM jsonb_array_elements(new_msg->'content') content WHERE content->>'toolCallId' IS NOT NULL) = 0
AND (SELECT COUNT(*) FROM jsonb_array_elements(t.value->'content') content WHERE content->>'toolCallId' IS NOT NULL) = 0)
)
)
UNION ALL UNION ALL
SELECT jsonb_array_elements(${newData}::jsonb) -- Add new/updated messages at the end
) combined(value) SELECT value, 1000000 + ordinality AS ordinality
ORDER BY FROM jsonb_array_elements(${newData}::jsonb) WITH ORDINALITY AS t(value, ordinality)
value->>'role', ) combined),
(SELECT string_agg(content->>'toolCallId', ',' ORDER BY content->>'toolCallId')
FROM jsonb_array_elements(value->'content') content
WHERE content->>'toolCallId' IS NOT NULL),
value DESC
) deduplicated),
'[]'::jsonb '[]'::jsonb
)`; )`;
} }