feat: add quota

This commit is contained in:
eeee0717
2025-06-13 18:32:28 +08:00
parent bed0da6d31
commit 7f63201f67
4 changed files with 43 additions and 17 deletions
@@ -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<QuotaResponse> = 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 ?? ''
}
})
+3 -3
View File
@@ -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 }),
@@ -61,7 +61,7 @@ const KnowledgeContent: FC<KnowledgeContentProps> = ({ 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<KnowledgeContentProps> = ({ 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<KnowledgeContentProps> = ({ selectedBase }) => {
</Tag>
)}
{base.preprocessOrOcrProvider && base.preprocessOrOcrProvider.provider.quota && (
{preprocessProvider && preprocessProvider.quota && (
<Tag color="orange" style={{ borderRadius: 20, margin: 0 }}>
{t('knowledge.quota', {
name: base.preprocessOrOcrProvider.provider.name,
quota: base.preprocessOrOcrProvider.provider.quota
name: preprocessProvider.name,
quota: preprocessProvider.quota
})}
</Tag>
)}
+1 -1
View File
@@ -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
}