From 81043ad1a1265ca567778f95a5507cb5ae35734b Mon Sep 17 00:00:00 2001 From: Nick O'Ferrall Date: Wed, 18 Dec 2024 14:37:28 +0000 Subject: [PATCH] feat: update suggest group titles (#10568) --- .../ReflectionGroup/ReflectionGroupTitleEditor.tsx | 4 +++- packages/client/mutations/AutogroupMutation.ts | 1 + .../updateReflectionLocation/addReflectionToGroup.ts | 6 ++++++ packages/server/utils/OpenAIServerManager.ts | 8 +++++--- 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/packages/client/components/ReflectionGroup/ReflectionGroupTitleEditor.tsx b/packages/client/components/ReflectionGroup/ReflectionGroupTitleEditor.tsx index c2927fb7536..9ff333051ca 100644 --- a/packages/client/components/ReflectionGroup/ReflectionGroupTitleEditor.tsx +++ b/packages/client/components/ReflectionGroup/ReflectionGroupTitleEditor.tsx @@ -128,9 +128,11 @@ const ReflectionGroupTitleEditor = (props: Props) => { const {id: reflectionGroupId, title} = reflectionGroup const dirtyRef = useRef(false) const initialTitleRef = useRef(title) - const isLoading = title === '' + + const isLoading = title === '' && !dirtyRef.current const onChange = (e: React.ChangeEvent) => { + dirtyRef.current = true const title = e.target.value commitLocalUpdate(atmosphere, (store) => { const reflectionGroup = store.get(reflectionGroupId) diff --git a/packages/client/mutations/AutogroupMutation.ts b/packages/client/mutations/AutogroupMutation.ts index 8f05c4d042c..3a66969a2e1 100644 --- a/packages/client/mutations/AutogroupMutation.ts +++ b/packages/client/mutations/AutogroupMutation.ts @@ -13,6 +13,7 @@ graphql` reflectionGroups { id title + smartTitle reflections { id plaintextContent diff --git a/packages/server/graphql/mutations/helpers/updateReflectionLocation/addReflectionToGroup.ts b/packages/server/graphql/mutations/helpers/updateReflectionLocation/addReflectionToGroup.ts index 29f5df88c5c..222679d1677 100644 --- a/packages/server/graphql/mutations/helpers/updateReflectionLocation/addReflectionToGroup.ts +++ b/packages/server/graphql/mutations/helpers/updateReflectionLocation/addReflectionToGroup.ts @@ -2,6 +2,7 @@ import dndNoise from 'parabol-client/utils/dndNoise' import getKysely from '../../../../postgres/getKysely' import updateGroupTitle from '../updateGroupTitle' import {GQLContext} from './../../../graphql' +import updateSmartGroupTitle from './updateSmartGroupTitle' const addReflectionToGroup = async ( reflectionId: string, @@ -67,6 +68,11 @@ const addReflectionToGroup = async ( .set({title: oldReflectionGroup.title, smartTitle: smartTitle ?? ''}) .where('id', '=', reflectionGroupId) .execute() + } else if (smartTitle) { + // smartTitle exists when autogrouping or resetting groups + await updateSmartGroupTitle(reflectionGroupId, smartTitle) + reflectionGroup.smartTitle = smartTitle + reflectionGroup.title = smartTitle } else { const meeting = await dataLoader.get('newMeetings').loadNonNull(meetingId) await updateGroupTitle({ diff --git a/packages/server/utils/OpenAIServerManager.ts b/packages/server/utils/OpenAIServerManager.ts index 8b880bae1dd..29a7b315cad 100644 --- a/packages/server/utils/OpenAIServerManager.ts +++ b/packages/server/utils/OpenAIServerManager.ts @@ -420,11 +420,11 @@ class OpenAIServerManager { async generateGroupTitle(reflections: {plaintextContent: string}[]) { if (!this.openAIApi) return null - const prompt = `Given these related retrospective comments, generate a short (2-4 words) theme or title that captures their essence. The title should be clear and actionable: + const prompt = `Generate a short (2-4 words) theme or title that captures the essence of these related retrospective comments. The title should be clear and actionable. ${reflections.map((r) => r.plaintextContent).join('\n')} -Return only the title, nothing else. Do not include quote marks around the title.` +Important: Respond with ONLY the title itself. Do not include any prefixes like "Title:" or any quote marks. Do not provide any additional explanation.` try { const response = await this.openAIApi.chat.completions.create({ @@ -442,7 +442,9 @@ Return only the title, nothing else. Do not include quote marks around the title presence_penalty: 0 }) const title = - (response.choices[0]?.message?.content?.trim() as string)?.replaceAll(/['"]/g, '') ?? null + (response.choices[0]?.message?.content?.trim() as string) + ?.replace(/^[Tt]itle:*\s*/gi, '') // Remove "Title:" prefix + ?.replaceAll(/['"]/g, '') ?? null return title } catch (e) {