From 262d32ac17ce456899f13ae9df88474c9523fba8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=A7=91=E5=9B=BF=E8=84=91=E8=A2=8B?=
<70054568+eeee0717@users.noreply.github.com>
Date: Wed, 14 Jan 2026 16:52:55 +0800
Subject: [PATCH] fix: remove mineru built-in api key (#12455)
---
.../preprocess/MineruPreprocessProvider.ts | 10 +++-
.../src/hooks/useKnowledgeBaseForm.ts | 2 +-
src/renderer/src/i18n/locales/en-us.json | 3 --
src/renderer/src/i18n/locales/zh-cn.json | 3 --
src/renderer/src/i18n/locales/zh-tw.json | 3 --
src/renderer/src/i18n/translate/de-de.json | 3 --
src/renderer/src/i18n/translate/el-gr.json | 3 --
src/renderer/src/i18n/translate/es-es.json | 3 --
src/renderer/src/i18n/translate/fr-fr.json | 3 --
src/renderer/src/i18n/translate/ja-jp.json | 3 --
src/renderer/src/i18n/translate/pt-pt.json | 3 --
src/renderer/src/i18n/translate/ro-ro.json | 3 --
src/renderer/src/i18n/translate/ru-ru.json | 3 --
.../pages/knowledge/components/QuotaTag.tsx | 52 ++++++++-----------
.../PreprocessProviderSettings.tsx | 4 +-
15 files changed, 33 insertions(+), 68 deletions(-)
diff --git a/src/main/knowledge/preprocess/MineruPreprocessProvider.ts b/src/main/knowledge/preprocess/MineruPreprocessProvider.ts
index 80aec40622..6def76f346 100644
--- a/src/main/knowledge/preprocess/MineruPreprocessProvider.ts
+++ b/src/main/knowledge/preprocess/MineruPreprocessProvider.ts
@@ -56,8 +56,6 @@ type QuotaResponse = {
export default class MineruPreprocessProvider extends BasePreprocessProvider {
constructor(provider: PreprocessProvider, userId?: string) {
super(provider, userId)
- // TODO: remove after free period ends
- this.provider.apiKey = this.provider.apiKey || import.meta.env.MAIN_VITE_MINERU_API_KEY
}
public async parseFile(
@@ -65,6 +63,10 @@ export default class MineruPreprocessProvider extends BasePreprocessProvider {
file: FileMetadata
): Promise<{ processedFile: FileMetadata; quota: number }> {
try {
+ if (!this.provider.apiKey) {
+ throw new Error('MinerU API key is required')
+ }
+
const filePath = fileStorage.getFilePathById(file)
logger.info(`MinerU preprocess processing started: ${filePath}`)
await this.validateFile(filePath)
@@ -96,6 +98,10 @@ export default class MineruPreprocessProvider extends BasePreprocessProvider {
public async checkQuota() {
try {
+ if (!this.provider.apiKey) {
+ throw new Error('MinerU API key is required')
+ }
+
const quota = await net.fetch(`${this.provider.apiHost}/api/v4/quota`, {
method: 'GET',
headers: {
diff --git a/src/renderer/src/hooks/useKnowledgeBaseForm.ts b/src/renderer/src/hooks/useKnowledgeBaseForm.ts
index a42fc90fa0..da7bf331f5 100644
--- a/src/renderer/src/hooks/useKnowledgeBaseForm.ts
+++ b/src/renderer/src/hooks/useKnowledgeBaseForm.ts
@@ -57,7 +57,7 @@ export const useKnowledgeBaseForm = (base?: KnowledgeBase) => {
label: t('settings.tool.preprocess.provider'),
title: t('settings.tool.preprocess.provider'),
options: preprocessProviders
- .filter((p) => p.apiKey !== '' || ['mineru', 'open-mineru'].includes(p.id))
+ .filter((p) => p.apiKey !== '' || ['open-mineru'].includes(p.id))
.map((p) => ({ value: p.id, label: p.name }))
}
return [preprocessOptions]
diff --git a/src/renderer/src/i18n/locales/en-us.json b/src/renderer/src/i18n/locales/en-us.json
index 45a2222930..bc4db909e2 100644
--- a/src/renderer/src/i18n/locales/en-us.json
+++ b/src/renderer/src/i18n/locales/en-us.json
@@ -4219,9 +4219,6 @@
"title": "Message Settings",
"use_serif_font": "Use serif font"
},
- "mineru": {
- "api_key": "Mineru now offers a daily free quota of 500 pages, and you do not need to enter a key."
- },
"miniapps": {
"cache_change_notice": "Changes will take effect when the number of open mini apps reaches the set value",
"cache_description": "Set the maximum number of active mini apps to keep in memory",
diff --git a/src/renderer/src/i18n/locales/zh-cn.json b/src/renderer/src/i18n/locales/zh-cn.json
index 220a109a74..affea9f135 100644
--- a/src/renderer/src/i18n/locales/zh-cn.json
+++ b/src/renderer/src/i18n/locales/zh-cn.json
@@ -4219,9 +4219,6 @@
"title": "消息设置",
"use_serif_font": "使用衬线字体"
},
- "mineru": {
- "api_key": "MinerU现在提供每日500页的免费额度,您不需要填写密钥。"
- },
"miniapps": {
"cache_change_notice": "更改将在打开的小程序增减至设定值后生效",
"cache_description": "设置同时保持活跃状态的小程序最大数量",
diff --git a/src/renderer/src/i18n/locales/zh-tw.json b/src/renderer/src/i18n/locales/zh-tw.json
index b6955adeca..1895012bf4 100644
--- a/src/renderer/src/i18n/locales/zh-tw.json
+++ b/src/renderer/src/i18n/locales/zh-tw.json
@@ -4219,9 +4219,6 @@
"title": "訊息設定",
"use_serif_font": "使用襯線字型"
},
- "mineru": {
- "api_key": "Mineru 現在每天提供 500 頁的免費配額,且無需輸入金鑰。"
- },
"miniapps": {
"cache_change_notice": "變更會在開啟的小程式數量調整至設定值後生效",
"cache_description": "設定同時保持活躍狀態的小程式最大數量",
diff --git a/src/renderer/src/i18n/translate/de-de.json b/src/renderer/src/i18n/translate/de-de.json
index 975d43835d..a83e77355d 100644
--- a/src/renderer/src/i18n/translate/de-de.json
+++ b/src/renderer/src/i18n/translate/de-de.json
@@ -4219,9 +4219,6 @@
"title": "Nachrichteneinstellungen",
"use_serif_font": "Serifenschrift verwenden"
},
- "mineru": {
- "api_key": "MinerU bietet täglich 500 Seiten kostenlos an, Sie müssen keinen Schlüssel eingeben."
- },
"miniapps": {
"cache_change_notice": "Änderung wird wirksam wenn Anzahl geöffneter Mini-Apps auf festgelegten Wert angepasst wird",
"cache_description": "Maximale Anzahl gleichzeitig aktiver Mini-Apps festlegen",
diff --git a/src/renderer/src/i18n/translate/el-gr.json b/src/renderer/src/i18n/translate/el-gr.json
index 1169482dde..59ffacaba5 100644
--- a/src/renderer/src/i18n/translate/el-gr.json
+++ b/src/renderer/src/i18n/translate/el-gr.json
@@ -4219,9 +4219,6 @@
"title": "Ρυθμίσεις μηνυμάτων",
"use_serif_font": "Χρήση μορφής Serif"
},
- "mineru": {
- "api_key": "Το MinerU παρέχει δωρεάν χρήση 500 σελίδων ημερησίως, δεν χρειάζεται να συμπληρώσετε κλειδί."
- },
"miniapps": {
"cache_change_notice": "Η αλλαγή θα τεθεί σε ισχύ αφού το πλήθος των ανοιχτών μικροπρογραμμάτων φτάσει τη ρυθμισμένη τιμή",
"cache_description": "Ορίστε τον μέγιστο αριθμό των μικροπρογραμμάτων που μπορούν να είναι ενεργά ταυτόχρονα",
diff --git a/src/renderer/src/i18n/translate/es-es.json b/src/renderer/src/i18n/translate/es-es.json
index 0e27518f33..5fb108dabe 100644
--- a/src/renderer/src/i18n/translate/es-es.json
+++ b/src/renderer/src/i18n/translate/es-es.json
@@ -4219,9 +4219,6 @@
"title": "Configuración de mensajes",
"use_serif_font": "Usar fuente serif"
},
- "mineru": {
- "api_key": "MinerU ahora ofrece un cupo gratuito de 500 páginas diarias, no es necesario que ingrese una clave."
- },
"miniapps": {
"cache_change_notice": "Los cambios surtirán efecto cuando el número de miniaplicaciones abiertas aumente o disminuya hasta alcanzar el valor configurado",
"cache_description": "Establece el número máximo de miniaplicaciones que pueden permanecer activas simultáneamente",
diff --git a/src/renderer/src/i18n/translate/fr-fr.json b/src/renderer/src/i18n/translate/fr-fr.json
index a1b708d0b1..edd84c795d 100644
--- a/src/renderer/src/i18n/translate/fr-fr.json
+++ b/src/renderer/src/i18n/translate/fr-fr.json
@@ -4219,9 +4219,6 @@
"title": "Paramètres des messages",
"use_serif_font": "Utiliser une police serif"
},
- "mineru": {
- "api_key": "MinerU propose désormais un quota gratuit de 500 pages par jour, vous n'avez donc pas besoin de saisir de clé."
- },
"miniapps": {
"cache_change_notice": "Les modifications prendront effet après l'ajout ou la suppression d'applications ouvertes jusqu'à atteindre la valeur définie",
"cache_description": "Définir le nombre maximum d'applications pouvant rester actives simultanément",
diff --git a/src/renderer/src/i18n/translate/ja-jp.json b/src/renderer/src/i18n/translate/ja-jp.json
index 423084f5c4..4bc41a9750 100644
--- a/src/renderer/src/i18n/translate/ja-jp.json
+++ b/src/renderer/src/i18n/translate/ja-jp.json
@@ -4219,9 +4219,6 @@
"title": "メッセージ設定",
"use_serif_font": "セリフフォントを使用"
},
- "mineru": {
- "api_key": "Mineruでは現在、1日500ページの無料クォータを提供しており、キーを入力する必要はありません。"
- },
"miniapps": {
"cache_change_notice": "設定値に達するまでミニアプリの開閉が行われた後に変更が適用されます",
"cache_description": "メモリに保持するアクティブなミニアプリの最大数を設定します",
diff --git a/src/renderer/src/i18n/translate/pt-pt.json b/src/renderer/src/i18n/translate/pt-pt.json
index 035bc92753..12a7585cb1 100644
--- a/src/renderer/src/i18n/translate/pt-pt.json
+++ b/src/renderer/src/i18n/translate/pt-pt.json
@@ -4219,9 +4219,6 @@
"title": "Configurações de mensagem",
"use_serif_font": "Usar fonte serif"
},
- "mineru": {
- "api_key": "O MinerU agora oferece uma cota diária gratuita de 500 páginas; você não precisa preencher uma chave."
- },
"miniapps": {
"cache_change_notice": "As alterações entrarão em vigor após a abertura ou remoção dos mini aplicativos até atingir o número definido",
"cache_description": "Defina o número máximo de mini aplicativos que permanecerão ativos simultaneamente",
diff --git a/src/renderer/src/i18n/translate/ro-ro.json b/src/renderer/src/i18n/translate/ro-ro.json
index 58f07d67c5..868017acd7 100644
--- a/src/renderer/src/i18n/translate/ro-ro.json
+++ b/src/renderer/src/i18n/translate/ro-ro.json
@@ -4219,9 +4219,6 @@
"title": "Setări mesaje",
"use_serif_font": "Folosește font serif"
},
- "mineru": {
- "api_key": "Mineru oferă acum o cotă zilnică gratuită de 500 de pagini și nu este nevoie să introduci o cheie."
- },
"miniapps": {
"cache_change_notice": "Modificările vor intra în vigoare când numărul de mini-aplicații deschise atinge valoarea setată",
"cache_description": "Setează numărul maxim de mini-aplicații active de păstrat în memorie",
diff --git a/src/renderer/src/i18n/translate/ru-ru.json b/src/renderer/src/i18n/translate/ru-ru.json
index e1c7135834..2797da9572 100644
--- a/src/renderer/src/i18n/translate/ru-ru.json
+++ b/src/renderer/src/i18n/translate/ru-ru.json
@@ -4219,9 +4219,6 @@
"title": "Настройки сообщений",
"use_serif_font": "Использовать serif шрифт"
},
- "mineru": {
- "api_key": "Mineru теперь предлагает ежедневную бесплатную квоту в 500 страниц, и вам не нужно вводить ключ."
- },
"miniapps": {
"cache_change_notice": "Изменения вступят в силу, когда количество открытых мини-приложений достигнет установленного значения",
"cache_description": "Установить максимальное количество активных мини-приложений в памяти",
diff --git a/src/renderer/src/pages/knowledge/components/QuotaTag.tsx b/src/renderer/src/pages/knowledge/components/QuotaTag.tsx
index e7f99a8037..0791c68539 100644
--- a/src/renderer/src/pages/knowledge/components/QuotaTag.tsx
+++ b/src/renderer/src/pages/knowledge/components/QuotaTag.tsx
@@ -10,8 +10,6 @@ import { useTranslation } from 'react-i18next'
const logger = loggerService.withContext('QuotaTag')
-const QUOTA_UNLIMITED = -9999
-
const QuotaTag: FC<{ base: KnowledgeBase; providerId: PreprocessProviderId; quota?: number }> = ({
base,
providerId,
@@ -23,44 +21,40 @@ const QuotaTag: FC<{ base: KnowledgeBase; providerId: PreprocessProviderId; quot
useEffect(() => {
const checkQuota = async () => {
- if (provider.id !== 'mineru') return
- // 使用用户的key时quota为无限
- if (provider.apiKey) {
- setQuota(QUOTA_UNLIMITED)
- updateProvider({ quota: QUOTA_UNLIMITED })
- return
+ const userId = getStoreSetting('userId')
+ const baseParams = getKnowledgeBaseParams(base)
+ try {
+ const response = await window.api.knowledgeBase.checkQuota({
+ base: baseParams,
+ userId: userId as string
+ })
+ setQuota(response)
+ updateProvider({ quota: response })
+ } catch (error) {
+ logger.error('[KnowledgeContent] Error checking quota:', error as Error)
}
- if (quota === undefined) {
- const userId = getStoreSetting('userId')
- const baseParams = getKnowledgeBaseParams(base)
- try {
- const response = await window.api.knowledgeBase.checkQuota({
- base: baseParams,
- userId: userId as string
- })
- setQuota(response)
- } catch (error) {
- logger.error('[KnowledgeContent] Error checking quota:', error as Error)
- }
+ }
+
+ if (provider.id !== 'mineru') return
+ if (!provider.apiKey) {
+ if (quota !== undefined) {
+ setQuota(undefined)
+ updateProvider({ quota: undefined })
}
+ return
}
if (_quota !== undefined) {
setQuota(_quota)
updateProvider({ quota: _quota })
return
}
- checkQuota()
- }, [_quota, base, provider.id, provider.apiKey, provider, quota, updateProvider])
+ if (quota === undefined) {
+ checkQuota()
+ }
+ }, [_quota, base, provider.id, provider.apiKey, quota, updateProvider])
const getQuotaDisplay = () => {
if (quota === undefined) return null
- if (quota === QUOTA_UNLIMITED) {
- return (
-
- {t('knowledge.quota_infinity', { name: provider.name })}
-
- )
- }
if (quota === 0) {
return (
diff --git a/src/renderer/src/pages/settings/DocProcessSettings/PreprocessProviderSettings.tsx b/src/renderer/src/pages/settings/DocProcessSettings/PreprocessProviderSettings.tsx
index 4d6df731f8..a568e9e0f8 100644
--- a/src/renderer/src/pages/settings/DocProcessSettings/PreprocessProviderSettings.tsx
+++ b/src/renderer/src/pages/settings/DocProcessSettings/PreprocessProviderSettings.tsx
@@ -99,9 +99,7 @@ const PreprocessProviderSettings: FC = ({ provider: _provider }) => {
setApiKey(formatApiKeys(e.target.value))}
onBlur={onUpdateApiKey}
spellCheck={false}