fix: title generation queue management for assistants

- Introduced a queueListeners mechanism to notify changes in the title generation queue, improving responsiveness for non-resumable streams.
- Updated the useTitleGeneration hook to track queue changes with a queueVersion state, ensuring accurate updates when jobs complete.
- Refactored the queueTitleGeneration function to trigger listeners upon adding new conversation IDs, enhancing the overall title generation flow.
This commit is contained in:
Danny Avila 2025-12-18 11:31:57 -05:00
parent 4b598808be
commit 460f60665f
No known key found for this signature in database
GPG key ID: BF31EEB2C5CA0956

View file

@ -38,15 +38,19 @@ export interface ActiveJobsResponse {
activeJobIds: string[];
}
// Module-level queue for title generation (survives re-renders)
// Stores conversationIds that need title generation once their job completes
/** Module-level queue for title generation (survives re-renders).
* Stores conversationIds that need title generation once their job completes */
const titleQueue = new Set<string>();
const processedTitles = new Set<string>();
/** Listeners to notify when queue changes (for non-resumable streams like assistants) */
const queueListeners = new Set<() => void>();
/** Queue a conversation for title generation (call when starting new conversation) */
export function queueTitleGeneration(conversationId: string) {
if (!processedTitles.has(conversationId)) {
titleQueue.add(conversationId);
queueListeners.forEach((listener) => listener());
}
}
@ -57,6 +61,7 @@ export function queueTitleGeneration(conversationId: string) {
*/
export function useTitleGeneration(enabled = true) {
const queryClient = useQueryClient();
const [queueVersion, setQueueVersion] = useState(0);
const [readyToFetch, setReadyToFetch] = useState<string[]>([]);
const { data: activeJobsData } = useActiveJobs(enabled);
@ -65,7 +70,14 @@ export function useTitleGeneration(enabled = true) {
[activeJobsData?.activeJobIds],
);
// Check queue for completed jobs and fetch titles immediately
useEffect(() => {
const listener = () => setQueueVersion((v) => v + 1);
queueListeners.add(listener);
return () => {
queueListeners.delete(listener);
};
}, []);
useEffect(() => {
const activeSet = new Set(activeJobIds);
const completedJobs: string[] = [];
@ -79,7 +91,7 @@ export function useTitleGeneration(enabled = true) {
if (completedJobs.length > 0) {
setReadyToFetch((prev) => [...new Set([...prev, ...completedJobs])]);
}
}, [activeJobIds]);
}, [activeJobIds, queueVersion]);
// Fetch titles for ready conversations
const titleQueries = useQueries({