From 7f63201f67089a563c0723a07f7b826034c1b5c0 Mon Sep 17 00:00:00 2001 From: eeee0717 Date: Fri, 13 Jun 2025 18:32:28 +0800 Subject: [PATCH] feat: add quota --- .../preprocess/MineruPreprocessProvider.ts | 43 +++++++++++++++---- src/preload/index.ts | 6 +-- .../src/pages/knowledge/KnowledgeContent.tsx | 9 ++-- src/renderer/src/queue/KnowledgeQueue.ts | 2 +- 4 files changed, 43 insertions(+), 17 deletions(-) diff --git a/src/main/preprocess/MineruPreprocessProvider.ts b/src/main/preprocess/MineruPreprocessProvider.ts index 8deac95c7..ecbc28abf 100644 --- a/src/main/preprocess/MineruPreprocessProvider.ts +++ b/src/main/preprocess/MineruPreprocessProvider.ts @@ -42,7 +42,8 @@ type ExtractResultResponse = { type QuotaResponse = { code: number data: { - left_quota: number + user_left_quota: number + total_left_quota: number } msg?: string trace_id?: string @@ -101,9 +102,8 @@ export default class MineruPreprocessProvider extends BasePreprocessProvider { if (!quota.ok) { throw new Error(`HTTP ${quota.status}: ${quota.statusText}`) } - const { data }: ApiResponse = await quota.json() - console.log('MinerU left quota:', data.data.left_quota) - return data.data.left_quota + const response: QuotaResponse = await quota.json() + return response.data.user_left_quota } catch (error) { console.error('Error checking quota:', error) throw error @@ -243,7 +243,9 @@ export default class MineruPreprocessProvider extends BasePreprocessProvider { method: 'POST', headers: { 'Content-Type': 'application/json', - Authorization: `Bearer ${this.provider.apiKey}` + Authorization: `Bearer ${this.provider.apiKey}`, + token: this.userId ?? '', + Accept: '*/*' }, body: JSON.stringify(payload) }) @@ -276,17 +278,39 @@ export default class MineruPreprocessProvider extends BasePreprocessProvider { method: 'PUT', body: fileBuffer, headers: { - 'Content-Length': fileBuffer.length.toString() + 'Content-Type': 'application/pdf' } + // headers: { + // 'Content-Length': fileBuffer.length.toString() + // } }) if (!response.ok) { - throw new Error(`Upload failed with status ${response.status}: ${response.statusText}`) + // 克隆 response 以避免消费 body stream + const responseClone = response.clone() + + try { + const responseBody = await responseClone.text() + const errorInfo = { + status: response.status, + statusText: response.statusText, + url: response.url, + type: response.type, + redirected: response.redirected, + headers: Object.fromEntries(response.headers.entries()), + body: responseBody + } + + console.error('Response details:', errorInfo) + throw new Error(`Upload failed with status ${response.status}: ${responseBody}`) + } catch (parseError) { + throw new Error(`Upload failed with status ${response.status}. Could not parse response body.`) + } } Logger.info(`File uploaded successfully to: ${uploadUrl}`) } catch (error: any) { - Logger.error(`Failed to upload file to URL ${uploadUrl}: ${error.message}`) + Logger.error(`Failed to upload file to URL ${uploadUrl}: ${error}`) throw new Error(error.message) } } @@ -299,7 +323,8 @@ export default class MineruPreprocessProvider extends BasePreprocessProvider { method: 'GET', headers: { 'Content-Type': 'application/json', - Authorization: `Bearer ${this.provider.apiKey}` + Authorization: `Bearer ${this.provider.apiKey}`, + token: this.userId ?? '' } }) diff --git a/src/preload/index.ts b/src/preload/index.ts index b35f83a6d..f78a03e34 100644 --- a/src/preload/index.ts +++ b/src/preload/index.ts @@ -125,13 +125,13 @@ const api = { add: ({ base, item, - forceReload = false, - userId + userId, + forceReload = false }: { base: KnowledgeBaseParams item: KnowledgeItem - forceReload?: boolean userId?: string + forceReload?: boolean }) => ipcRenderer.invoke(IpcChannel.KnowledgeBase_Add, { base, item, forceReload, userId }), remove: ({ uniqueId, uniqueIds, base }: { uniqueId: string; uniqueIds: string[]; base: KnowledgeBaseParams }) => ipcRenderer.invoke(IpcChannel.KnowledgeBase_Remove, { uniqueId, uniqueIds, base }), diff --git a/src/renderer/src/pages/knowledge/KnowledgeContent.tsx b/src/renderer/src/pages/knowledge/KnowledgeContent.tsx index 8df8ff54d..7764deceb 100644 --- a/src/renderer/src/pages/knowledge/KnowledgeContent.tsx +++ b/src/renderer/src/pages/knowledge/KnowledgeContent.tsx @@ -61,7 +61,7 @@ const KnowledgeContent: FC = ({ selectedBase }) => { updateItem } = useKnowledge(selectedBase.id || '') - const { updatePreprocessProvider } = usePreprocessProvider( + const { provider: preprocessProvider, updatePreprocessProvider } = usePreprocessProvider( selectedBase.preprocessOrOcrProvider?.provider.id || 'mineru' ) @@ -72,6 +72,7 @@ const KnowledgeContent: FC = ({ selectedBase }) => { window.electron.ipcRenderer.on('file-preprocess-finished', (_, { itemId, quota }) => { setPreprocessMap((prev) => new Map(prev).set(itemId, true)) if (base?.preprocessOrOcrProvider && quota) { + console.log('[KnowledgeContent] Update preprocess provider quota:', quota) updatePreprocessProvider({ ...base.preprocessOrOcrProvider.provider, quota: quota @@ -304,11 +305,11 @@ const KnowledgeContent: FC = ({ selectedBase }) => { )} - {base.preprocessOrOcrProvider && base.preprocessOrOcrProvider.provider.quota && ( + {preprocessProvider && preprocessProvider.quota && ( {t('knowledge.quota', { - name: base.preprocessOrOcrProvider.provider.name, - quota: base.preprocessOrOcrProvider.provider.quota + name: preprocessProvider.name, + quota: preprocessProvider.quota })} )} diff --git a/src/renderer/src/queue/KnowledgeQueue.ts b/src/renderer/src/queue/KnowledgeQueue.ts index 5cc42c66f..0f60760f6 100644 --- a/src/renderer/src/queue/KnowledgeQueue.ts +++ b/src/renderer/src/queue/KnowledgeQueue.ts @@ -139,7 +139,7 @@ class KnowledgeQueue { } break default: - result = await window.api.knowledgeBase.add({ base: baseParams, item: sourceItem }) + result = await window.api.knowledgeBase.add({ base: baseParams, item: sourceItem, userId: userId as string }) break }