From 799ab64a28fb1860cc1c3be2e85f6b67668cf1ab Mon Sep 17 00:00:00 2001 From: huangjianwu Date: Thu, 7 May 2026 17:18:28 +0800 Subject: [PATCH] =?UTF-8?q?feat(extension):=20NoteForm=20=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E5=AF=B9=E9=BD=90=20web=20=E7=AB=AF=EF=BC=88style=20?= =?UTF-8?q?=E9=A2=84=E8=AE=BE=20+=20format=20=E5=AE=8C=E6=95=B4=20+=20extr?= =?UTF-8?q?as=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 之前插件 popup / options 的笔记选项跟 web 端 NoteForm 不齐,存在三处差距: 1. style 字段实质 broken · backend prompt_builder.get_style_format 是 enum 映射(minimal/detailed/ academic/tutorial/xiaohongshu/life_journal/task_oriented/business/ meeting_minutes 共 9 个),不命中直接 return '' · 插件原来给的是自由文本框,用户填什么都对不上 enum,等于没传 · 改:popup + options 都换成 9 个预设的下拉框,与 backend 严格对齐 2. format 字段缺一半 · backend 支持 toc / link / screenshot / summary 四个 · 插件只暴露了 screenshot / link 两个 checkbox · 改:types.ts 新增 NOTE_FORMATS 常量,UI 渲染完整 4 个 checkbox。 生成请求时 format 数组、screenshot/link 单布尔由 settings.formats 派生,单一真相源 3. 缺 extras 字段 · backend VideoRequest.extras 直接拼到 prompt 末尾给 LLM · 改:popup 折叠的"高级"区 + options 默认生成选项区都加 textarea Settings 默认值:style='minimal'、formats=['toc','summary']、extras=''。 旧 settings 里若 style 是无效字符串,下拉会显示空白,用户重选一次即可。 logic/types.ts: - 新增 NoteStyle / NoteFormat type alias 与 NOTE_STYLES / NOTE_FORMATS 常量 - Settings 接口加 formats: NoteFormat[] / extras: string,style 改为 NoteStyle - 老的 screenshot / link 布尔保留(向后兼容旧 storage),但 UI 不再绑定,submit 时也由 formats 派生 popup / background / options 三处提交 generate_note 的逻辑同步收口。 Co-Authored-By: Claude Opus 4.7 (1M context) --- BillNote_extension/src/background/main.ts | 12 ++-- BillNote_extension/src/logic/constants.ts | 4 +- BillNote_extension/src/logic/types.ts | 33 +++++++++- .../src/options/pages/General.vue | 43 ++++++++++--- BillNote_extension/src/popup/Popup.vue | 60 +++++++++++++++---- 5 files changed, 123 insertions(+), 29 deletions(-) diff --git a/BillNote_extension/src/background/main.ts b/BillNote_extension/src/background/main.ts index 1615485..f1f4e28 100644 --- a/BillNote_extension/src/background/main.ts +++ b/BillNote_extension/src/background/main.ts @@ -70,6 +70,7 @@ async function startTask(url: string): Promise<{ ok: boolean, taskId?: string, e // B 站:先在浏览器里抓字幕(带本地登录态 cookie),随提交带过去 const prefetched = platform === 'bilibili' ? await fetchBilibiliSubtitle(url) : null + const formats = settings.formats || [] try { const res = await fetch(`${backend}/api/generate_note`, { method: 'POST', @@ -80,13 +81,12 @@ async function startTask(url: string): Promise<{ ok: boolean, taskId?: string, e quality: settings.quality, provider_id: settings.providerId, model_name: settings.modelName, - screenshot: settings.screenshot, - link: settings.link, + // backend 同时接受 format 数组与 screenshot/link 单独布尔;从 formats 派生保持单一真相源 + format: [...formats], + screenshot: formats.includes('screenshot'), + link: formats.includes('link'), style: settings.style || undefined, - format: [ - ...(settings.screenshot ? ['screenshot'] : []), - ...(settings.link ? ['link'] : []), - ], + extras: settings.extras || undefined, prefetched_transcript: prefetched ?? undefined, }), }) diff --git a/BillNote_extension/src/logic/constants.ts b/BillNote_extension/src/logic/constants.ts index 113ca47..f7418ce 100644 --- a/BillNote_extension/src/logic/constants.ts +++ b/BillNote_extension/src/logic/constants.ts @@ -7,9 +7,11 @@ export const DEFAULT_SETTINGS: Settings = { providerId: '', modelName: '', quality: 'medium', + formats: ['toc', 'summary'], screenshot: false, link: false, - style: '', + style: 'minimal', + extras: '', } export const MAX_TASKS = 30 diff --git a/BillNote_extension/src/logic/types.ts b/BillNote_extension/src/logic/types.ts index b556813..fd68072 100644 --- a/BillNote_extension/src/logic/types.ts +++ b/BillNote_extension/src/logic/types.ts @@ -78,14 +78,45 @@ export interface TaskRecord { result?: NoteResult } +// 与 backend/app/gpt/prompt_builder.py note_styles 一一对齐 +export type NoteStyle = + | 'minimal' | 'detailed' | 'academic' | 'tutorial' + | 'xiaohongshu' | 'life_journal' | 'task_oriented' + | 'business' | 'meeting_minutes' + +// 与 backend/app/gpt/prompt_builder.py note_formats 一一对齐 +export type NoteFormat = 'toc' | 'link' | 'screenshot' | 'summary' + +export const NOTE_STYLES: Array<{ value: NoteStyle, label: string }> = [ + { value: 'minimal', label: '精简' }, + { value: 'detailed', label: '详细' }, + { value: 'tutorial', label: '教程' }, + { value: 'academic', label: '学术' }, + { value: 'xiaohongshu', label: '小红书' }, + { value: 'life_journal', label: '生活向' }, + { value: 'task_oriented', label: '任务导向' }, + { value: 'business', label: '商业风格' }, + { value: 'meeting_minutes', label: '会议纪要' }, +] + +export const NOTE_FORMATS: Array<{ value: NoteFormat, label: string }> = [ + { value: 'toc', label: '目录' }, + { value: 'summary', label: 'AI 总结' }, + { value: 'screenshot', label: '原片截图' }, + { value: 'link', label: '原片跳转' }, +] + export interface Settings { backendUrl: string providerId: string modelName: string quality: Quality + // 输出 format 的 toggle 集合(screenshot / link 与下方两个布尔保持联动) + formats: NoteFormat[] screenshot: boolean link: boolean - style: string + style: NoteStyle + extras: string } export interface ProviderUpdatePayload { diff --git a/BillNote_extension/src/options/pages/General.vue b/BillNote_extension/src/options/pages/General.vue index 4e6959e..44eea22 100644 --- a/BillNote_extension/src/options/pages/General.vue +++ b/BillNote_extension/src/options/pages/General.vue @@ -3,9 +3,16 @@ import { onMounted, ref } from 'vue' import { getProviders, ping } from '~/logic/api' import { settings, settingsReady } from '~/logic/storage' import { getModelsByProvider } from '~/logic/api' -import type { Model, Provider } from '~/logic/types' +import { NOTE_FORMATS, NOTE_STYLES, type Model, type NoteFormat, type Provider } from '~/logic/types' import { watch } from 'vue' +function toggleFormat(value: NoteFormat, checked: boolean) { + const cur = settings.value.formats || [] + settings.value.formats = checked + ? Array.from(new Set([...cur, value])) + : cur.filter(v => v !== value) +} + const providers = ref([]) const models = ref([]) const status = ref<{ kind: 'idle' | 'ok' | 'err', text: string }>({ kind: 'idle', text: '' }) @@ -128,15 +135,35 @@ onMounted(async () => { - - + +
+ 输出形式(与 web 端 NoteForm 对齐) +
+ +
+
+ +