From 1fbd727a7b098d11245e50146191276796059a33 Mon Sep 17 00:00:00 2001 From: kangfenmao Date: Tue, 7 Jan 2025 23:16:58 +0800 Subject: [PATCH] fix: @google/generative-ai local compilation issue #682 close #682 --- src/main/ipc.ts | 2 ++ src/main/services/GeminiService.ts | 10 ++++++++++ src/preload/index.d.ts | 5 +++-- src/preload/index.ts | 4 +++- src/renderer/src/pages/files/GeminiFiles.tsx | 11 ++++------- src/renderer/src/providers/GeminiProvider.ts | 11 ----------- 6 files changed, 22 insertions(+), 21 deletions(-) diff --git a/src/main/ipc.ts b/src/main/ipc.ts index 1d5600f3..75b78978 100644 --- a/src/main/ipc.ts +++ b/src/main/ipc.ts @@ -173,4 +173,6 @@ export function registerIpc(mainWindow: BrowserWindow, app: Electron.App) { ipcMain.handle('gemini:upload-file', GeminiService.uploadFile) ipcMain.handle('gemini:base64-file', GeminiService.base64File) ipcMain.handle('gemini:retrieve-file', GeminiService.retrieveFile) + ipcMain.handle('gemini:list-files', GeminiService.listFiles) + ipcMain.handle('gemini:delete-file', GeminiService.deleteFile) } diff --git a/src/main/services/GeminiService.ts b/src/main/services/GeminiService.ts index 698d6b5b..b79193ff 100644 --- a/src/main/services/GeminiService.ts +++ b/src/main/services/GeminiService.ts @@ -50,4 +50,14 @@ export class GeminiService { } return undefined } + + static async listFiles(_: Electron.IpcMainInvokeEvent, apiKey: string) { + const fileManager = new GoogleAIFileManager(apiKey) + return await fileManager.listFiles() + } + + static async deleteFile(_: Electron.IpcMainInvokeEvent, apiKey: string, fileId: string) { + const fileManager = new GoogleAIFileManager(apiKey) + await fileManager.deleteFile(fileId) + } } diff --git a/src/preload/index.d.ts b/src/preload/index.d.ts index ce635fee..26d31362 100644 --- a/src/preload/index.d.ts +++ b/src/preload/index.d.ts @@ -1,6 +1,5 @@ import { ElectronAPI } from '@electron-toolkit/preload' -import type { FileMetadataResponse } from '@google/generative-ai/server' -import { UploadFileResponse } from '@google/generative-ai/server' +import type { FileMetadataResponse, ListFilesResponse, UploadFileResponse } from '@google/generative-ai/server' import { AddLoaderReturn, ExtractChunkData } from '@llm-tools/embedjs-interfaces' import { FileType } from '@renderer/types' import { WebDavConfig } from '@renderer/types' @@ -86,6 +85,8 @@ declare global { uploadFile: (file: FileType, apiKey: string) => Promise retrieveFile: (file: FileType, apiKey: string) => Promise base64File: (file: FileType) => Promise<{ data: string; mimeType: string }> + listFiles: (apiKey: string) => Promise + deleteFile: (apiKey: string, fileId: string) => Promise } } } diff --git a/src/preload/index.ts b/src/preload/index.ts index 8b6017be..8d81918c 100644 --- a/src/preload/index.ts +++ b/src/preload/index.ts @@ -78,7 +78,9 @@ const api = { gemini: { uploadFile: (file: FileType, apiKey: string) => ipcRenderer.invoke('gemini:upload-file', file, apiKey), base64File: (file: FileType) => ipcRenderer.invoke('gemini:base64-file', file), - retrieveFile: (file: FileType, apiKey: string) => ipcRenderer.invoke('gemini:retrieve-file', file, apiKey) + retrieveFile: (file: FileType, apiKey: string) => ipcRenderer.invoke('gemini:retrieve-file', file, apiKey), + listFiles: (apiKey: string) => ipcRenderer.invoke('gemini:list-files', apiKey), + deleteFile: (apiKey: string, fileId: string) => ipcRenderer.invoke('gemini:delete-file', apiKey, fileId) } } diff --git a/src/renderer/src/pages/files/GeminiFiles.tsx b/src/renderer/src/pages/files/GeminiFiles.tsx index 1856d66c..ff60c875 100644 --- a/src/renderer/src/pages/files/GeminiFiles.tsx +++ b/src/renderer/src/pages/files/GeminiFiles.tsx @@ -1,7 +1,6 @@ import { DeleteOutlined } from '@ant-design/icons' -import { FileMetadataResponse, FileState } from '@google/generative-ai/server' +import type { FileMetadataResponse } from '@google/generative-ai/server' import { useProvider } from '@renderer/hooks/useProvider' -import GeminiProvider from '@renderer/providers/GeminiProvider' import { runAsyncFunction } from '@renderer/utils' import { Table } from 'antd' import type { ColumnsType } from 'antd/es/table' @@ -20,9 +19,8 @@ const GeminiFiles: FC = ({ id }) => { const [loading, setLoading] = useState(false) const fetchFiles = useCallback(async () => { - const geminiProvider = new GeminiProvider(provider) - const { files } = await geminiProvider.listFiles() - files && setFiles(files.filter((file) => file.state === FileState.ACTIVE)) + const { files } = await window.api.gemini.listFiles(provider.apiKey) + files && setFiles(files.filter((file) => file.state === 'ACTIVE')) }, [provider]) const columns: ColumnsType = [ @@ -54,13 +52,12 @@ const GeminiFiles: FC = ({ id }) => { key: 'actions', align: 'center', render: (_, record) => { - const geminiProvider = new GeminiProvider(provider) return ( { setFiles(files.filter((file) => file.name !== record.name)) - geminiProvider.deleteFile(record.name).catch((error) => { + window.api.gemini.deleteFile(provider.apiKey, record.name).catch((error) => { console.error('Failed to delete file:', error) setFiles((prev) => [...prev, record]) }) diff --git a/src/renderer/src/providers/GeminiProvider.ts b/src/renderer/src/providers/GeminiProvider.ts index e0baaa1b..6ca1c5c1 100644 --- a/src/renderer/src/providers/GeminiProvider.ts +++ b/src/renderer/src/providers/GeminiProvider.ts @@ -9,7 +9,6 @@ import { RequestOptions, TextPart } from '@google/generative-ai' -import { GoogleAIFileManager, ListFilesResponse } from '@google/generative-ai/server' import { isEmbeddingModel, isWebSearchModel } from '@renderer/config/models' import { getStoreSetting } from '@renderer/hooks/useSettings' import i18n from '@renderer/i18n' @@ -345,14 +344,4 @@ export default class GeminiProvider extends BaseProvider { const data = await this.sdk.getGenerativeModel({ model: model.id }, this.requestOptions).embedContent('hi') return data.embedding.values.length } - - public async listFiles(): Promise { - const fileManager = new GoogleAIFileManager(this.apiKey) - return await fileManager.listFiles() - } - - public async deleteFile(fileId: string): Promise { - const fileManager = new GoogleAIFileManager(this.apiKey) - await fileManager.deleteFile(fileId) - } }