-
Notifications
You must be signed in to change notification settings - Fork 32
thread summary #597
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: v3.8.0
Are you sure you want to change the base?
thread summary #597
Changes from all commits
84a65ac
050a3fd
4ab6da2
02787e2
8abb7e3
2c07aa6
7eb9a2c
fe427c2
f29d833
7595c70
c3e27f0
3d2c2b9
66cc357
24edcc0
c6bf2ed
c261c1d
30a7de3
d601121
51c8141
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -1003,6 +1003,26 @@ | |
| "message": "Extract all relevant details required to generate a calendar event from the following text. The extracted information should include:\n- Event Title\n- Start Date and Time (including timezone, if specified)\n- End Date and Time (including timezone, if specified)\n- Full day (if mentioned)\n- Attendees\nEnsure the data is formatted clearly and consistently so that it can be directly used for creating a calendar event.\nIf there are relative time references, consider that the date and time of the email are \"{%mail_datetime%}\". Calculate the start date and time based on this reference. If the calculated start date and time are earlier than \"{%current_datetime%}\", recalculate the start date and time using \"{%current_datetime%}\" as the base.\nIf the duration is not specified, set it to one hour.\nThese are the attendees: {%author%}, {%recipients%}, {%cc_list%}. If present, exclude my address: {%account_email_address%}.\nIf you're not able to get one or more of the required information, please respond with an empty string.\nGenerate a response in JSON format only. Do not include any additional text or explanations; provide only the JSON. Here is the format to be used:\n{\n\"startDate\": \"YYYYMMDDTHHMMSS\",\n\"endDate\": \"YYYYMMDDTHHMMSS\",\n\"summary\": \"Calendar event summary here\",\n\"forceAllDay\": false,\n\"attendees\": [[email protected],[email protected],[email protected]]\n}\nHere's the text:\"{%selected_text%}\"", | ||
| "description": "" | ||
| }, | ||
| "Summarize_prompt_prefs_title": { | ||
| "message": "Add Summarization Options", | ||
| "description": "" | ||
| }, | ||
| "prompt_summarize": { | ||
| "message": "Summarize this email or these emails", | ||
| "description": "" | ||
| }, | ||
| "prompt_summarize_full_text": { | ||
| "message": "Summarize the following email or emails into a bullet point list. If there are multiple emails, consider the entire thread for the summary.", | ||
| "description": "" | ||
| }, | ||
| "prompt_summarize_email_template": { | ||
| "message": "From: {%author%}\nTo: {%recipients%}\nCC: {%cc_list%}\nSubject: {%mail_subject%}\nDate: {%mail_datetime%}\nAttachments:\n{%mail_attachments_info%}\nBody:\n{%mail_text_body%}", | ||
| "description": "" | ||
| }, | ||
| "prompt_summarize_email_separator": { | ||
| "message": "\n\n---------- NEXT EMAIL ----------\n\n", | ||
| "description": "" | ||
| }, | ||
| "prompt_get_task": { | ||
| "message": "Add a new task", | ||
| "description": "" | ||
|
|
@@ -1067,6 +1087,22 @@ | |
| "message": "You can change the prompt as you wish, but the response received from the AI must be in JSON format as specified in the default prompt!", | ||
| "description": "" | ||
| }, | ||
| "prefs_OptionText_Summarize_infoline2": { | ||
| "message": "You can change the prompt as you wish, the first field is the main prompt, the second field is the template for a single mail. The list of emails will be appended to the main prompt. Emails will be separated by the separator specified in the third field.", | ||
| "description": "" | ||
| }, | ||
| "prefs_OptionText_Summarize_main_prompt": { | ||
| "message": "The main prompt describing the task to be performed on all selected emails:", | ||
| "description": "" | ||
| }, | ||
| "prefs_OptionText_Summarize_email_template": { | ||
| "message": "The template for a single email:", | ||
| "description": "" | ||
| }, | ||
| "prefs_OptionText_Summarize_email_separator": { | ||
| "message": "The separator between emails:", | ||
| "description": "" | ||
| }, | ||
| "prefs_OptionText_get_calendar_event_Sparks_not_present": { | ||
| "message": "To use the calendar event and task features, please install the ThunderAI Sparks addon.", | ||
| "description": "" | ||
|
|
@@ -1195,6 +1231,22 @@ | |
| "message": "Manage spam filter settings", | ||
| "description": "" | ||
| }, | ||
| "prefs_OptionText_summarize": { | ||
| "message": "Summarize mail", | ||
| "description": "" | ||
| }, | ||
| "prefs_OptionText_summarize_use_specific_integration_Info": { | ||
| "message": "If checked, the Model and API specified below will be used for summarizing email(s), regardless the one choosen in the ThunderAI options page.", | ||
| "description": "" | ||
| }, | ||
| "prefs_OptionText_summarize_Info": { | ||
| "message": "If checked, adds an option to context menu to summarize mail.", | ||
| "description": "" | ||
| }, | ||
| "prefs_OptionText_btnManageSummarizeInfo": { | ||
| "message": "Manage summarize settings", | ||
| "description": "" | ||
| }, | ||
| "SpamFilter_PageTitle": { | ||
| "message": "Manage Spam Filter Settings", | ||
| "description": "" | ||
|
|
@@ -1219,6 +1271,18 @@ | |
| "message": "Spam Filter Options", | ||
| "description": "" | ||
| }, | ||
| "Summarize_PageTitle": { | ||
| "message": "Manage Summarize Settings", | ||
| "description": "" | ||
| }, | ||
| "Summarize_info_default": { | ||
| "message": "In this page you can modify the default prompt used to summarize emails.", | ||
| "description": "" | ||
| }, | ||
| "Summarize_prompt_text_title": { | ||
| "message": "Current prompt text", | ||
| "description": "" | ||
| }, | ||
| "prefs_OptionText_use_specific_integration": { | ||
| "message": "Use specific Model and API", | ||
| "description": "" | ||
|
|
@@ -1295,6 +1359,10 @@ | |
| "message": "Analyze for spam", | ||
| "description": "" | ||
| }, | ||
| "context_menu_mzta-summarize": { | ||
| "message": "Summarize", | ||
| "description": "" | ||
| }, | ||
| "prefs_OptionText_add_tags_context_menu": { | ||
| "message": "Show the \"Add tags\" context menu item", | ||
| "description": "" | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -45,6 +45,7 @@ import { | |
| extractJsonObject, | ||
| contextMenuID_AddTags, | ||
| contextMenuID_Spamfilter, | ||
| contextMenuID_Summarize, | ||
| contextMenuIconsPath, | ||
| sanitizeChatGPTModelData, | ||
| sanitizeChatGPTWebCustomData, | ||
|
|
@@ -57,7 +58,10 @@ import { | |
| } from './js/mzta-utils.js'; | ||
| import { taPromptUtils } from './js/mzta-utils-prompt.js'; | ||
| import { mzta_specialCommand } from './js/mzta-special-commands.js'; | ||
| import { getSpamFilterPrompt } from './js/mzta-prompts.js'; | ||
| import { | ||
| getSpamFilterPrompt, | ||
| getSpecialPrompts | ||
| } from './js/mzta-prompts.js'; | ||
| import { taSpamReport } from './js/mzta-spamreport.js'; | ||
| import { taWorkingStatus } from './js/mzta-working-status.js'; | ||
| import { addTags_getExclusionList, checkExcludedTag } from './js/mzta-addatags-exclusion-list.js'; | ||
|
|
@@ -802,10 +806,12 @@ async function reload_pref_init(){ | |
| add_tags_auto_force_existing: prefs_default.add_tags_auto_force_existing, | ||
| add_tags_auto_only_inbox: prefs_default.add_tags_auto_only_inbox, | ||
| spamfilter: prefs_default.spamfilter, | ||
| summarize: prefs_default.summarize, | ||
| spamfilter_threshold: prefs_default.spamfilter_threshold, | ||
| dynamic_menu_force_enter: prefs_default.dynamic_menu_force_enter, | ||
| add_tags_context_menu: prefs_default.add_tags_context_menu, | ||
| spamfilter_context_menu: prefs_default.spamfilter_context_menu, | ||
| summarize_context_menu: prefs_default.summarize_context_menu, | ||
| ...getDynamicSettingsDefaults(['use_specific_integration', 'connection_type']) | ||
| }); | ||
| _process_incoming = prefs_init.add_tags_auto || prefs_init.spamfilter; | ||
|
|
@@ -917,6 +923,15 @@ function setupStorageChangeListener() { | |
| removeContextMenu(contextMenuID_Spamfilter); | ||
| } | ||
| } | ||
| if (changes.summarize) { | ||
| if (changes.summarize.newValue){ | ||
| if (prefs_init.summarize_context_menu){ | ||
| addContextMenu(contextMenuID_Summarize); | ||
| } | ||
| } else { | ||
| removeContextMenu(contextMenuID_Summarize); | ||
| } | ||
| } | ||
| reload_pref_init(); | ||
| } | ||
| }); | ||
|
|
@@ -977,6 +992,12 @@ function addContextMenuItems() { | |
| if(prefs_init.spamfilter && prefs_init.spamfilter_context_menu && checkAPIIntegration(prefs_init.connection_type, prefs_init.spamfilter_use_specific_integration,prefs_init.spamfilter_connection_type)){ | ||
| addContextMenu(contextMenuID_Spamfilter); | ||
| } | ||
|
|
||
| // Add Context menu: Summarize | ||
| if(prefs_init.summarize && prefs_init.summarize_context_menu && checkAPIIntegration(prefs_init.connection_type && prefs_init.summarize_use_specific_integration, prefs_init.summarize_connection_type)) { | ||
| console.log("adding summarize to context menu") | ||
|
Owner
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. To be removed before merging. |
||
| addContextMenu(contextMenuID_Summarize); | ||
| } | ||
| } | ||
|
|
||
| addContextMenuItems(); | ||
|
|
@@ -985,17 +1006,93 @@ addContextMenuItems(); | |
| browser.menus.onClicked.addListener( (info, tab) => { | ||
| let _add_tags = false | ||
| let _spamfilter = false | ||
| let _summarize = false; | ||
| if(info.menuItemId === contextMenuID_AddTags){ | ||
| _add_tags = true; | ||
| } | ||
| if(info.menuItemId === contextMenuID_Spamfilter){ | ||
| _spamfilter = true; | ||
| } | ||
| if(info.menuItemId === contextMenuID_Summarize) { | ||
| _summarize = true; | ||
| } | ||
| if(_add_tags || _spamfilter){ | ||
| processEmails(getMessages(info.selectedMessages), _add_tags, _spamfilter); | ||
| } | ||
| if(_summarize) { | ||
| // info.selectedMessages is of type MessageList | ||
| summarizeEmails(getMessages(info.selectedMessages)); | ||
| } | ||
| }); | ||
|
|
||
| async function summarizeEmails(messages) { | ||
| taWorkingStatus.startWorking(); | ||
|
|
||
| // we have three prompts, the actual assignment for the LLM, the email | ||
| // template prompt, and the email separator prompt | ||
| const specialPrompts = await getSpecialPrompts(); | ||
| const prompt = specialPrompts.find((prompt) => prompt.id === 'prompt_summarize'); | ||
| const prompt_email = specialPrompts.find((prompt) => prompt.id === 'prompt_summarize_email_template'); | ||
| const prompt_email_separator = specialPrompts.find((prompt) => prompt.id === 'prompt_summarize_email_separator'); | ||
|
|
||
| const tabs = await browser.tabs.query({ active: true, currentWindow: true }); | ||
| const chatgpt_lang = await taPromptUtils.getDefaultLang(prompt); | ||
|
|
||
| // replace placeholders in the prompts the assignment prompt and email | ||
| // separator prompt do not have a message as context, so there is only | ||
| // limited things to replace | ||
| const prompt_string = await taPromptUtils.preparePrompt({ | ||
| curr_prompt: prompt, | ||
| chatgpt_lang: chatgpt_lang, | ||
| }); | ||
| const prompt_email_separator_string = await taPromptUtils.preparePrompt({ | ||
| curr_prompt: prompt_email_separator, | ||
| chatgpt_lang: chatgpt_lang, | ||
| }); | ||
|
|
||
|
|
||
| // assemble all email messages into one string and add the assignment prompt | ||
| const messages_list = []; | ||
| for await (let curr_message of messages) { | ||
|
|
||
| // extract body of current message as text | ||
| const curr_message_full = await browser.messages.getFull(curr_message.id); | ||
| const curr_body_full_html = getMailBody(curr_message_full); | ||
| const curr_body_full_text = htmlBodyToPlainText(curr_body_full_html.html); | ||
| if( curr_body_full_text.length === 0) { | ||
| taLog.log("No HTML found in the message body, using plain text..."); | ||
| curr_body_full_text = curr_message_full.text; | ||
| } | ||
|
|
||
| messages_list.push(await taPromptUtils.preparePrompt({ | ||
| curr_prompt: prompt_email, | ||
| curr_message: curr_message, | ||
| chatgpt_lang: chatgpt_lang, | ||
| body_text: curr_body_full_text, | ||
| subject_text: curr_message_full.headers.subject, | ||
| msg_text: curr_body_full_html, | ||
| })); | ||
| }; | ||
| const messages_string = messages_list.join(prompt_email_separator_string); | ||
|
|
||
| const full_prompt = prompt_string + prompt_email_separator_string + messages_string; | ||
|
|
||
| // console.log(full_prompt); | ||
|
|
||
| // send the prompt to the chat interface | ||
| openChatGPT( | ||
| full_prompt, | ||
| prompt.action, | ||
| tabs[0].id, | ||
| prompt.name, | ||
| prompt.need_custom_text, | ||
| prompt | ||
| ) | ||
|
|
||
| taWorkingStatus.stopWorking(); | ||
| return {ok : '1'}; | ||
| } | ||
|
|
||
|
|
||
| // Listening for new received emails | ||
| const newEmailListener = (folder, messagesList) => { | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -16,7 +16,7 @@ | |
| * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
| */ | ||
|
|
||
| const special_prompts_with_integration = ['add_tags', 'spamfilter']; | ||
| const special_prompts_with_integration = ['add_tags', 'spamfilter', 'summarize']; | ||
|
|
||
| export const integration_options_config = { | ||
| chatgpt: { | ||
|
|
@@ -133,5 +133,7 @@ export const prefs_default = { | |
| spamfilter_threshold: 70, | ||
| spamfilter_context_menu: true, | ||
| spamfilter_enabled_accounts: [], | ||
| summarize: false, | ||
| summarize_context_menu: true, | ||
|
Owner
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You have added this option that is used in the mzta-background script, but there is no way for the user to change it. I use a similar option for add_tags and spamfilter, but I'm thiking about removing it and always show the menuitem when the user has activated the feature. I think you could remove it and always show the context menu when the summurize feature is activated.
Owner
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I filed issue #609 |
||
| ...generated_prefs | ||
| } | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
no icon yet. If you have a good idea, go ahead and add one.