From 7ffe89c41f9e1464b111d7fc7f40f9f561c575ec Mon Sep 17 00:00:00 2001 From: geekgeekrun Date: Sat, 19 Apr 2025 02:30:56 +0800 Subject: [PATCH] add check llm config logic before run read no reply reminder --- .../flow/OPEN_SETTING_WINDOW/ipc/index.ts | 16 ++- .../page/MainLayout/ReadNoReplyReminder.vue | 128 ++++++++++++------ 2 files changed, 98 insertions(+), 46 deletions(-) diff --git a/packages/ui/src/main/flow/OPEN_SETTING_WINDOW/ipc/index.ts b/packages/ui/src/main/flow/OPEN_SETTING_WINDOW/ipc/index.ts index 944bbd0..295de2b 100644 --- a/packages/ui/src/main/flow/OPEN_SETTING_WINDOW/ipc/index.ts +++ b/packages/ui/src/main/flow/OPEN_SETTING_WINDOW/ipc/index.ts @@ -517,7 +517,21 @@ export default function initIpc() { ipcMain.handle('overwrite-auto-remind-prompt-with-default', async () => { await writeDefaultAutoRemindPrompt() }) - + ipcMain.handle('check-if-llm-config-list-valid', async () => { + const llmConfigList = await readConfigFile('llm.json') + if (!Array.isArray(llmConfigList) || !llmConfigList?.length) { + throw new Error('CANNOT_FIND_VALID_CONFIG') + } + if (llmConfigList.some((it) => !/^http(s)?:\/\//.test(it.providerCompleteApiUrl))) { + throw new Error('CANNOT_FIND_VALID_CONFIG') + } + if (llmConfigList.length > 1) { + const firstEnabledModel = llmConfigList.find((it) => it.enabled) + if (!firstEnabledModel) { + throw new Error('CANNOT_FIND_VALID_CONFIG') + } + } + }) ipcMain.handle('exit-app-immediately', () => { app.exit(0) }) diff --git a/packages/ui/src/renderer/src/page/MainLayout/ReadNoReplyReminder.vue b/packages/ui/src/renderer/src/page/MainLayout/ReadNoReplyReminder.vue index 07b7546..7b31489 100644 --- a/packages/ui/src/renderer/src/page/MainLayout/ReadNoReplyReminder.vue +++ b/packages/ui/src/renderer/src/page/MainLayout/ReadNoReplyReminder.vue @@ -261,57 +261,95 @@ const handleSubmit = async () => { await formRef.value!.validate() await electron.ipcRenderer.invoke('save-config-file-from-ui', JSON.stringify(formContent.value)) gtagRenderer('config_saved') - try { - await electron.ipcRenderer.invoke('check-if-auto-remind-prompt-valid') - } catch (err) { - if (err?.message?.includes(`RESUME_PLACEHOLDER_NOT_EXIST`)) { - gtagRenderer('cannot_launch_due_to_resume_placeholder_not_exist') - console.log(`提示词模板无效`, err) - ElMessageBox.confirm( - '提示词模板缺少简历内容占位符:
__REPLACE_REAL_RESUME_HERE__

您是否希望还原默认的提示词模板?', - '', - { - confirmButtonText: '是', - cancelButtonText: '否', - type: 'warning', - closeOnClickModal: false, - dangerouslyUseHTMLString: true - } - ) - .then(async () => { - gtagRenderer('reset_template_clicked_in_invalid_tip_dialog') - await restoreDefaultTemplate() - }) - .catch(() => { - gtagRenderer('close_invalid_tip_dialog') - }) - } else { - gtagRenderer('cannot_launch_due_to_unknown_error', { err }) - ElMessage({ - type: 'error', - message: '用于生成自动提醒消息的提示词检查未通过,请重试' - }) - } - return - } if ( formContent.value.autoReminder?.rechatContentSource === - RECHAT_CONTENT_SOURCE.GEMINI_WITH_CHAT_CONTEXT && - !(await electron.ipcRenderer.invoke('resume-content-enough-detect')) + RECHAT_CONTENT_SOURCE.GEMINI_WITH_CHAT_CONTEXT ) { - gtagRenderer('resume_content_not_enough_dialog_show') try { - await ElMessageBox.confirm( - `简历内容可能不够充足(各个部分内容长度相加 <800 字)
后续大模型根据简历生成的内容将可能不符合预期(例如相同内容重复生成、生成预期之外的内容)

要继续运行吗?`, - { - cancelButtonText: '不,我再看看', - confirmButtonText: '是的,继续运行', - dangerouslyUseHTMLString: true - } - ) - } catch { + await electron.ipcRenderer.invoke('check-if-llm-config-list-valid') + } catch (err) { + if (err?.message?.includes(`CANNOT_FIND_VALID_CONFIG`)) { + gtagRenderer('cannot_launch_due_to_invalid_llm_config') + console.log(`大模型配置无效`, err) + ElMessageBox.confirm( + '大模型配置不存在或者包含无效配置
您是否希望查看并修正当前大模型配置?', + '', + { + confirmButtonText: '是', + cancelButtonText: '否', + type: 'warning', + closeOnClickModal: false, + dangerouslyUseHTMLString: true + } + ) + .then(async () => { + gtagRenderer('view_llm_config_clicked_in_invalid_tip_dialog') + try { + await electron.ipcRenderer.invoke('llm-config') + } catch (err) { + console.log(err) + } + }) + .catch(() => { + gtagRenderer('close_invalid_llm_config_tip_dialog') + }) + } else { + gtagRenderer('cannot_launch_due_to_unknown_error_when_check_llm_config', { err }) + ElMessage({ + type: 'error', + message: '大模型配置检查未通过,请重试' + }) + } return } + try { + await electron.ipcRenderer.invoke('check-if-auto-remind-prompt-valid') + } catch (err) { + if (err?.message?.includes(`RESUME_PLACEHOLDER_NOT_EXIST`)) { + gtagRenderer('cannot_launch_due_to_resume_placeholder_not_exist') + console.log(`提示词模板无效`, err) + ElMessageBox.confirm( + '提示词模板缺少简历内容占位符:
__REPLACE_REAL_RESUME_HERE__

您是否希望还原默认的提示词模板?', + '', + { + confirmButtonText: '是', + cancelButtonText: '否', + type: 'warning', + closeOnClickModal: false, + dangerouslyUseHTMLString: true + } + ) + .then(async () => { + gtagRenderer('reset_template_clicked_in_invalid_tip_dialog') + await restoreDefaultTemplate() + }) + .catch(() => { + gtagRenderer('close_invalid_resume_template_tip_dialog') + }) + } else { + gtagRenderer('cannot_launch_due_to_unknown_error_when_check_prompt', { err }) + ElMessage({ + type: 'error', + message: '用于生成自动提醒消息的提示词检查未通过,请重试' + }) + } + return + } + if (!(await electron.ipcRenderer.invoke('resume-content-enough-detect'))) { + gtagRenderer('resume_content_not_enough_dialog_show') + try { + await ElMessageBox.confirm( + `简历内容可能不够充足(各个部分内容长度相加 <800 字)
后续大模型根据简历生成的内容将可能不符合预期(例如相同内容重复生成、生成预期之外的内容)

要继续运行吗?`, + { + cancelButtonText: '不,我再看看', + confirmButtonText: '是的,继续运行', + dangerouslyUseHTMLString: true + } + ) + } catch { + return + } + } } gtagRenderer('reminder_launched') router.replace({