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 对齐) +
+ +
+
+ +