-
Notifications
You must be signed in to change notification settings - Fork 27
Expand file tree
/
Copy pathexport.js
More file actions
98 lines (91 loc) · 3.06 KB
/
Copy pathexport.js
File metadata and controls
98 lines (91 loc) · 3.06 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
/*
* ChatGPT Conversation Toolkit - Conversation export
*/
let exportInProgress = false;
const prepareConversationExportPayload = async (options = {}) => {
const updatePreparationStatus = options.updateStatus === false
? () => {}
: updateStatusByKey;
updatePreparationStatus("status.exportPreparing", "info");
const includeRaw = Boolean(options.includeRaw);
const conversationIdCandidates = getStrictConversationIdCandidates();
const conversationId = conversationIdCandidates[0] || null;
let apiError = null;
if (!conversationId) {
apiError = new ExportApiError("NO_CONVERSATION_ID", "No valid conversation id is available.", {
fallbackAllowed: true,
});
updatePreparationStatus("status.exportFallback", "warn");
} else {
try {
updatePreparationStatus("status.exportApiLoading", "info");
const response = await fetchConversationByIdCandidates(conversationIdCandidates, {
timeoutMs: options.timeoutMs,
retries: options.retries,
});
const payload = normalizeConversationApiResponse(response.data, {
conversationId: response.conversationId || conversationId,
url: window.location.href,
includeRaw,
});
if (response.captured) {
payload.apiDataSource = "captured-page-response";
}
return { payload, usedFallback: false };
} catch (error) {
apiError = normalizeExportApiError(error);
if (!apiError.fallbackAllowed) {
throw apiError;
}
updatePreparationStatus("status.exportFallback", "warn");
}
}
try {
const payload = collectMessagesFromDomFallback({
conversationId,
apiError,
});
return { payload, usedFallback: true };
} catch (fallbackError) {
throw normalizeExportApiError(
fallbackError,
"DOM fallback export failed.",
);
}
};
const exportMessages = async (options = {}) => {
if (exportInProgress) {
updateStatusByKey("status.exportAlreadyRunning", "warn");
return null;
}
exportInProgress = true;
try {
const preparedExport = options.preparedExport?.payload
? options.preparedExport
: await prepareConversationExportPayload(options);
const payload = applyExportSelection(preparedExport.payload, {
scope: options.scope,
selectedTurnIds: options.selectedTurnIds,
roleFilter: options.roleFilter || TOOLKIT_EXPORT_ROLE,
});
if (payload.messageCount === 0) {
updateStatusByKey("status.exportEmptySelection", "warn");
return null;
}
downloadConversationExport(payload, options.format || TOOLKIT_EXPORT_FORMAT);
updateStatusByKey(
preparedExport.usedFallback ? "status.exportFallbackDone" : "status.exportApiDone",
preparedExport.usedFallback ? "warn" : "success",
{ count: payload.messageCount },
);
return payload;
} catch (error) {
const normalizedError = normalizeExportApiError(error, "Export failed.");
updateStatusByKey("status.exportFailed", "warn", {
reason: normalizedError.message,
});
return null;
} finally {
exportInProgress = false;
}
};