❇️ make runs last longer, cancel for terminated runs + refactor

This commit is contained in:
John Mavrick 2023-11-26 16:14:47 -08:00
parent 96ac84eb5c
commit ba0836e706
1 changed files with 57 additions and 51 deletions

View File

@ -190,6 +190,53 @@ const PluginView = () => {
fetchMessages(); fetchMessages();
}, [activeThread]); }, [activeThread]);
const addAnnotatedFilesToThread = async (
messages: OpenAI.Beta.Threads.ThreadMessage[],
) => {
const files: ThreadAnnotationFile[] = [];
//for each message in messages, if it has content.type = text, then access content.annotations.file_citation.file_id and get the file name from the active files list
messages.forEach((message) => {
if (message.content) {
message.content.forEach((content) => {
if (content.type === 'text') {
content.text.annotations.forEach((annotation) => {
// @ts-ignore
if (annotation.file_citation) {
const fileId: string =
// @ts-ignore
annotation.file_citation.file_id;
const file = activeAssistantFiles?.find(
(file) => file.id === fileId,
);
if (file) {
files.push({
fileId: fileId,
fileName: file.filename,
});
}
}
});
}
});
}
});
if (files.length > 0 && activeThread) {
const newThread: IThread = {
...activeThread,
metadata: {
...activeThread.metadata,
annotationFiles: files,
},
};
const newThreads = threads.map((t) =>
t.id === activeThread.id ? newThread : t,
);
updateThreads(newThreads);
updateActiveThread(newThread);
}
};
const onMessageSend = useCallback( const onMessageSend = useCallback(
async (message: string) => { async (message: string) => {
if (openaiInstance && activeThread && activeAssistant) { if (openaiInstance && activeThread && activeAssistant) {
@ -218,12 +265,19 @@ const PluginView = () => {
// Initialize a counter and max attempts for the polling logic, and how long to wait each try // Initialize a counter and max attempts for the polling logic, and how long to wait each try
let attempts = 0; let attempts = 0;
const maxAttempts = 20; const maxAttempts = 30;
const timoutWaitTimeMs = 2000; const timoutWaitTimeMs = 2000;
setIsResponding(true); setIsResponding(true);
const terminatedRunStatuses: string[] = [
'cancelling',
'cancelled',
'failed',
'completed',
'expired',
];
while ( while (
runStatus.status !== 'completed' && !terminatedRunStatuses.includes(runStatus.status) &&
attempts < maxAttempts attempts < maxAttempts
) { ) {
await new Promise((resolve) => await new Promise((resolve) =>
@ -241,55 +295,7 @@ const PluginView = () => {
.list(activeThread.id, listQueryOptions) .list(activeThread.id, listQueryOptions)
.then((res) => { .then((res) => {
setMessages(res.data); setMessages(res.data);
const files: ThreadAnnotationFile[] = []; addAnnotatedFilesToThread(res.data);
//for each message in messages, if it has content.type = text, then access content.annotations.file_citation.file_id and get the file name from the active files list
res.data.forEach((message) => {
if (message.content) {
message.content.forEach((content) => {
if (content.type === 'text') {
content.text.annotations.forEach(
(annotation) => {
// @ts-ignore
if (annotation.file_citation) {
const fileId: string =
// @ts-ignore
annotation.file_citation
.file_id;
const file =
activeAssistantFiles?.find(
(file) =>
file.id ===
fileId,
);
if (file) {
files.push({
fileId: fileId,
fileName:
file.filename,
});
}
}
},
);
}
});
}
});
if (files.length > 0) {
const newThread: IThread = {
...activeThread,
metadata: {
...activeThread.metadata,
annotationFiles: files,
},
};
const newThreads = threads.map((t) =>
t.id === activeThread.id ? newThread : t,
);
updateThreads(newThreads);
updateActiveThread(newThread);
}
setIsResponding(false); setIsResponding(false);
}); });
} }