From a4b5ef9bdeeffc991aea8989cb13ce78f643cd98 Mon Sep 17 00:00:00 2001 From: kangfenmao Date: Thu, 6 Mar 2025 22:31:04 +0800 Subject: [PATCH] feat: Upgrade database schema and migrate web search metadata - Add database version 5 with schema updates - Create `upgradeToV5` function to migrate Tavily web search metadata to new format - Update types to support new web search metadata structure - Minor code cleanup and formatting improvements --- src/renderer/src/databases/index.ts | 12 ++++++++ src/renderer/src/databases/upgrades.ts | 30 ++++++++++++++++++++ src/renderer/src/providers/OpenAIProvider.ts | 1 + src/renderer/src/store/index.ts | 2 +- src/renderer/src/store/migrate.ts | 1 + src/renderer/src/types/index.ts | 1 + 6 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 src/renderer/src/databases/upgrades.ts diff --git a/src/renderer/src/databases/index.ts b/src/renderer/src/databases/index.ts index 8d54c840..3fc1ae95 100644 --- a/src/renderer/src/databases/index.ts +++ b/src/renderer/src/databases/index.ts @@ -1,6 +1,8 @@ import { FileType, KnowledgeItem, Topic, TranslateHistory } from '@renderer/types' import { Dexie, type EntityTable } from 'dexie' +import { upgradeToV5 } from './upgrades' + // Database declaration (move this to its own module also) export const db = new Dexie('CherryStudio') as Dexie & { files: EntityTable @@ -35,4 +37,14 @@ db.version(4).stores({ translate_history: '&id, sourceText, targetText, sourceLanguage, targetLanguage, createdAt' }) +db.version(5) + .stores({ + files: 'id, name, origin_name, path, size, ext, type, created_at, count', + topics: '&id, messages', + settings: '&id, value', + knowledge_notes: '&id, baseId, type, content, created_at, updated_at', + translate_history: '&id, sourceText, targetText, sourceLanguage, targetLanguage, createdAt' + }) + .upgrade((tx) => upgradeToV5(tx)) + export default db diff --git a/src/renderer/src/databases/upgrades.ts b/src/renderer/src/databases/upgrades.ts new file mode 100644 index 00000000..e6607d5f --- /dev/null +++ b/src/renderer/src/databases/upgrades.ts @@ -0,0 +1,30 @@ +import { Transaction } from 'dexie' + +export async function upgradeToV5(tx: Transaction): Promise { + const topics = await tx.table('topics').toArray() + + for (const topic of topics) { + let hasChanges = false + + for (const message of topic.messages) { + if (message?.metadata?.tavily) { + hasChanges = true + const tavily = message.metadata.tavily + delete message.metadata.tavily + message.metadata.webSearch = { + query: tavily.query, + results: + tavily.results?.map((i) => ({ + title: i.title, + url: i.url, + content: i.content + })) || [] + } + } + } + + if (hasChanges) { + await tx.table('topics').put(topic) + } + } +} diff --git a/src/renderer/src/providers/OpenAIProvider.ts b/src/renderer/src/providers/OpenAIProvider.ts index e365923d..c57ff5a2 100644 --- a/src/renderer/src/providers/OpenAIProvider.ts +++ b/src/renderer/src/providers/OpenAIProvider.ts @@ -415,6 +415,7 @@ export default class OpenAIProvider extends BaseProvider { }) } } + const stream = await this.sdk.chat.completions // @ts-ignore key is not typed .create( diff --git a/src/renderer/src/store/index.ts b/src/renderer/src/store/index.ts index 6dad2693..98bbf6a4 100644 --- a/src/renderer/src/store/index.ts +++ b/src/renderer/src/store/index.ts @@ -34,7 +34,7 @@ const persistedReducer = persistReducer( { key: 'cherry-studio', storage, - version: 76, + version: 77, blacklist: ['runtime'], migrate }, diff --git a/src/renderer/src/store/migrate.ts b/src/renderer/src/store/migrate.ts index acbf6046..49a854bb 100644 --- a/src/renderer/src/store/migrate.ts +++ b/src/renderer/src/store/migrate.ts @@ -1230,6 +1230,7 @@ const migrateConfig = { delete p.enabled }) } + return state } } diff --git a/src/renderer/src/types/index.ts b/src/renderer/src/types/index.ts index 7b39fd46..d2319d8a 100644 --- a/src/renderer/src/types/index.ts +++ b/src/renderer/src/types/index.ts @@ -299,6 +299,7 @@ export type WebSearchResponse = { query?: string results: WebSearchResult[] } + export type WebSearchResult = { title: string content: string