增加api、token获取链接

This commit is contained in:
xunbu
2025-05-21 11:42:10 +08:00
parent 21c12d3b45
commit 5e62fc1107
3 changed files with 41 additions and 18 deletions

7
.idea/workspace.xml generated
View File

@@ -6,9 +6,8 @@
<component name="ChangeListManager"> <component name="ChangeListManager">
<list default="true" id="6b18b44a-df57-4212-a857-9e291ebe5dd2" name="更改" comment=""> <list default="true" id="6b18b44a-df57-4212-a857-9e291ebe5dd2" name="更改" comment="">
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/docutranslate/agents/agent.py" beforeDir="false" afterPath="$PROJECT_DIR$/docutranslate/agents/agent.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/docutranslate/static/index.html" beforeDir="false" afterPath="$PROJECT_DIR$/docutranslate/static/index.html" afterDir="false" /> <change beforePath="$PROJECT_DIR$/docutranslate/static/index.html" beforeDir="false" afterPath="$PROJECT_DIR$/docutranslate/static/index.html" afterDir="false" />
<change beforePath="$PROJECT_DIR$/docutranslate/utils/markdown_splitter.py" beforeDir="false" afterPath="$PROJECT_DIR$/docutranslate/utils/markdown_splitter.py" afterDir="false" /> <change beforePath="$PROJECT_DIR$/pyproject.toml" beforeDir="false" afterPath="$PROJECT_DIR$/pyproject.toml" afterDir="false" />
</list> </list>
<option name="SHOW_DIALOG" value="false" /> <option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" /> <option name="HIGHLIGHT_CONFLICTS" value="true" />
@@ -603,7 +602,7 @@
<workItem from="1747739438735" duration="826000" /> <workItem from="1747739438735" duration="826000" />
<workItem from="1747740341909" duration="145000" /> <workItem from="1747740341909" duration="145000" />
<workItem from="1747752718385" duration="81000" /> <workItem from="1747752718385" duration="81000" />
<workItem from="1747754618316" duration="12015000" /> <workItem from="1747754618316" duration="14549000" />
</task> </task>
<servers /> <servers />
</component> </component>
@@ -622,7 +621,7 @@
</option> </option>
</component> </component>
<component name="com.intellij.coverage.CoverageDataManagerImpl"> <component name="com.intellij.coverage.CoverageDataManagerImpl">
<SUITE FILE_PATH="coverage/filetranslate$app_test__1_.coverage" NAME="app_test (1) 覆盖结果" MODIFIED="1747796284047" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/tests" /> <SUITE FILE_PATH="coverage/filetranslate$app_test__1_.coverage" NAME="app_test (1) 覆盖结果" MODIFIED="1747798850500" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/tests" />
<SUITE FILE_PATH="coverage/filetranslate$test.coverage" NAME="test 覆盖结果" MODIFIED="1747472297913" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/tests" /> <SUITE FILE_PATH="coverage/filetranslate$test.coverage" NAME="test 覆盖结果" MODIFIED="1747472297913" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/tests" />
<SUITE FILE_PATH="coverage/filetranslate$convert.coverage" NAME="convert 覆盖结果" MODIFIED="1746963490689" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/docutranslate/utils" /> <SUITE FILE_PATH="coverage/filetranslate$convert.coverage" NAME="convert 覆盖结果" MODIFIED="1746963490689" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/docutranslate/utils" />
<SUITE FILE_PATH="coverage/PDFtranslate$PDFtranslater__1_.coverage" NAME="PDFtranslater (1) 覆盖结果" MODIFIED="1746633258205" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/pdftranslate_packages" /> <SUITE FILE_PATH="coverage/PDFtranslate$PDFtranslater__1_.coverage" NAME="PDFtranslater (1) 覆盖结果" MODIFIED="1746633258205" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/pdftranslate_packages" />

View File

@@ -35,6 +35,11 @@
color: #2e7d32; /* Pico valid color */ color: #2e7d32; /* Pico valid color */
} }
a.no-style {
text-decoration: none;
color: inherit;
}
.form-group { .form-group {
margin-bottom: 1rem; margin-bottom: 1rem;
} }
@@ -176,7 +181,7 @@
<body> <body>
<main class="container"> <main class="container">
<h1> <h1>
<a href="https://github.com/xunbu/docutranslate" target="_blank">DocuTranslate</a> <a href="https://github.com/xunbu/docutranslate" target="_blank">DocuTranslate🔗</a>
</h1> </h1>
<form id="translateForm"> <form id="translateForm">
@@ -229,7 +234,9 @@
</select> </select>
</div> </div>
<div class="form-group hidden" id="mineruTokenGroup"> <div class="form-group hidden" id="mineruTokenGroup">
<label for="mineru_token">Mineru Token</label> <label for="mineru_token">Mineru Token<a class="no-style" href="https://mineru.net/apiManage/token"
target="_blank"
title="获取令牌">🔗</a></label>
<input type="password" id="mineru_token" name="mineru_token" placeholder="使用 Mineru 引擎时必须填写"> <input type="password" id="mineru_token" name="mineru_token" placeholder="使用 Mineru 引擎时必须填写">
</div> </div>
</details> </details>
@@ -239,7 +246,9 @@
<summary>翻译API配置</summary> <summary>翻译API配置</summary>
<div class="form-grid"> <div class="form-grid">
<div class="form-group"> <div class="form-group">
<label for="platform_select">AI 平台</label> <label for="platform_select">AI 平台 <a id="api_href" class="no-style" href="/"
target="_blank"
title="获取API-KEY">🔗</a></label>
<select id="platform_select" name="platform_select_ui"> <select id="platform_select" name="platform_select_ui">
<option value="custom">自定义接口</option> <option value="custom">自定义接口</option>
<option value="https://api.openai.com/v1">OpenAI</option> <option value="https://api.openai.com/v1">OpenAI</option>
@@ -296,6 +305,7 @@
<iframe id="printFrame" style="display:none;"></iframe> <iframe id="printFrame" style="display:none;"></iframe>
<script> <script>
const platformSelect = document.getElementById('platform_select'); const platformSelect = document.getElementById('platform_select');
const apiHref = document.getElementById('api_href')
const baseUrlGroup = document.getElementById('baseUrlGroup'); const baseUrlGroup = document.getElementById('baseUrlGroup');
const baseUrlInput = document.getElementById('base_url'); const baseUrlInput = document.getElementById('base_url');
const apikeyInput = document.getElementById('apikey'); const apikeyInput = document.getElementById('apikey');
@@ -306,7 +316,6 @@
const refineCheckbox = document.getElementById('refine_markdown'); const refineCheckbox = document.getElementById('refine_markdown');
const convertEnginSelect = document.getElementById('convert_engin'); const convertEnginSelect = document.getElementById('convert_engin');
const doclingOption = document.getElementById('docling')
const mineruTokenGroup = document.getElementById('mineruTokenGroup'); const mineruTokenGroup = document.getElementById('mineruTokenGroup');
const mineruTokenInput = document.getElementById('mineru_token'); const mineruTokenInput = document.getElementById('mineru_token');
@@ -351,6 +360,17 @@
return defaultValue; return defaultValue;
} }
} }
//api访问地址到获取地址的映射
const apiHrefMap = {
"https://openrouter.ai/api/v1": "https://openrouter.ai/settings/keys",
"https://api.openai.com/v1": "https://platform.openai.com/api-keys",
"https://api.deepseek.com/v1": "https://platform.deepseek.com/api_keys",
"https://open.bigmodel.cn/api/paas/v4": "https://open.bigmodel.cn/usercenter/apikeys",
"https://dashscope.aliyuncs.com/compatible-mode/v1": "https://bailian.console.aliyun.com/?tab=model#/api-key",
"https://ark.cn-beijing.volces.com/api/v3": "https://console.volcengine.com/ark/region:ark+cn-beijing/apiKey?apikey=%7B%7D",
"https://api.siliconflow.cn/v1": "https://cloud.siliconflow.cn/account/ak",
"https://www.dmxapi.cn/v1": "https://www.dmxapi.cn/token"
}
function updatePlatformUI() { function updatePlatformUI() {
const selectedPlatformValue = platformSelect.value; const selectedPlatformValue = platformSelect.value;
@@ -360,11 +380,15 @@
baseUrlGroup.classList.remove('hidden'); baseUrlGroup.classList.remove('hidden');
baseUrlInput.required = true; baseUrlInput.required = true;
baseUrlInput.value = getFromStorage('translator_platform_custom_base_url'); baseUrlInput.value = getFromStorage('translator_platform_custom_base_url');
apiHref.classList.add('hidden')
} else { } else {
baseUrlGroup.classList.add('hidden'); baseUrlGroup.classList.add('hidden');
baseUrlInput.required = false; baseUrlInput.required = false;
baseUrlInput.value = selectedPlatformValue; baseUrlInput.value = selectedPlatformValue;
apiHref.classList.remove('hidden')
apiHref.href = apiHrefMap[baseUrlInput.value]
} }
saveToStorage('translator_last_platform', selectedPlatformValue); saveToStorage('translator_last_platform', selectedPlatformValue);
} }
@@ -491,16 +515,16 @@
} }
const status = await response.json(); const status = await response.json();
statusMsg.textContent = '正在初始化'; statusMsg.textContent = '正在初始化';
if (!status.includes("docling")) { status.forEach((engin) => {
// docling不存在时禁用docling let option = convertEnginSelect.querySelector(`option[value="${engin}"]`);
doclingOption.disabled = true; option.disabled = true;
doclingOption.textContent = "docling未检测到" option.textContent += "(不可用)"
if (convertEnginSelect.value === "docling") { })
if (status.includes(convertEnginSelect.value)) {
convertEnginSelect.value = "mineru"; convertEnginSelect.value = "mineru";
updateConvertEnginUI() updateConvertEnginUI()
statusMsg.textContent = '初始化完成'; statusMsg.textContent = '初始化完成';
} }
}
} catch (error) { } catch (error) {
console.warn("Error get engin-list", error); console.warn("Error get engin-list", error);
} }

View File

@@ -1,6 +1,6 @@
[project] [project]
name = "docutranslate" name = "docutranslate"
version = "0.2.21" version = "0.2.22"
description = "文件翻译工具" description = "文件翻译工具"
readme = "README.md" readme = "README.md"
requires-python = ">=3.10" requires-python = ">=3.10"