diff --git a/js/api/api.js b/js/api/api.js
index c41d4f7..1ec2b40 100644
--- a/js/api/api.js
+++ b/js/api/api.js
@@ -66,7 +66,7 @@ async function uploadToMistral(fileToProcess, mistralKey) {
// 使用统一配置获取代理地址
const proxyUrl = (typeof window !== 'undefined' && window.ProxyConfig)
? window.ProxyConfig.getMistralUrl('/v1/files')
- : 'http://localhost:3456/api/mistral/v1/files';
+ : (window.PBX_PROXY_BASE_URL || '/api') + '/mistral/v1/files';
const response = await fetch(proxyUrl, {
method: 'POST',
@@ -99,9 +99,7 @@ async function uploadFileToOssViaProxy(fileToProcess, fileName) {
// 使用统一配置获取代理地址
const proxyUrl = (typeof window !== 'undefined' && window.ProxyConfig)
? window.ProxyConfig.getOssUploadUrl()
- : (window.location.hostname === 'localhost' || window.location.hostname === '127.0.0.1'
- ? 'http://localhost:3456/api/upload/oss'
- : '/api/upload/oss');
+ : (window.PBX_PROXY_BASE_URL || '/api') + '/upload/oss';
const response = await fetch(proxyUrl, {
method: 'POST',
@@ -133,7 +131,7 @@ async function getMistralSignedUrl(fileId, mistralKey) {
// 使用统一配置获取代理地址
const proxyUrl = (typeof window !== 'undefined' && window.ProxyConfig)
? window.ProxyConfig.getMistralUrl(`/v1/files/${fileId}/url?expiry=24`)
- : `http://localhost:3456/api/mistral/v1/files/${fileId}/url?expiry=24`;
+ : (window.PBX_PROXY_BASE_URL || '/api') + `/mistral/v1/files/${fileId}/url?expiry=24`;
const response = await fetch(proxyUrl, {
method: 'GET',
@@ -162,7 +160,7 @@ async function callMistralOcr(signedUrl, mistralKey) {
// 使用统一配置获取代理地址
const proxyUrl = (typeof window !== 'undefined' && window.ProxyConfig)
? window.ProxyConfig.getMistralUrl('/v1/ocr')
- : 'http://localhost:3456/api/mistral/v1/ocr';
+ : (window.PBX_PROXY_BASE_URL || '/api') + '/mistral/v1/ocr';
const response = await fetch(proxyUrl, {
method: 'POST',
@@ -202,7 +200,7 @@ async function deleteMistralFile(fileId, apiKey) {
// 使用统一配置获取代理地址
const deleteUrl = (typeof window !== 'undefined' && window.ProxyConfig)
? window.ProxyConfig.getMistralUrl(`/v1/files/${fileId}`)
- : `http://localhost:3456/api/mistral/v1/files/${fileId}`;
+ : (window.PBX_PROXY_BASE_URL || '/api') + `/mistral/v1/files/${fileId}`;
try {
const response = await fetch(deleteUrl, {
diff --git a/js/chatbot/core/api-config-builder.js b/js/chatbot/core/api-config-builder.js
index 018e1dc..a531f29 100644
--- a/js/chatbot/core/api-config-builder.js
+++ b/js/chatbot/core/api-config-builder.js
@@ -162,7 +162,7 @@
const proxyBaseUrl = options.proxyBaseUrl ||
(typeof window !== 'undefined' && window.ProxyConfig ? window.ProxyConfig.getProxyUrl() : null) ||
(typeof window !== 'undefined' && window.PBX_PROXY_BASE_URL ? window.PBX_PROXY_BASE_URL : null) ||
- 'http://localhost:3456';
+ '/api';
const provider = options.provider || 'openai';
// 获取当前选择的模型ID(如果有模型检测模块)
diff --git a/js/chatbot/core/llm-caller.js b/js/chatbot/core/llm-caller.js
index e0a75b4..690ec0a 100644
--- a/js/chatbot/core/llm-caller.js
+++ b/js/chatbot/core/llm-caller.js
@@ -140,7 +140,7 @@
const useProxy = globalProxyMode === 'proxy';
const proxyBaseUrl = (typeof window !== 'undefined' && window.ProxyConfig)
? window.ProxyConfig.getProxyUrl()
- : (window.PBX_PROXY_BASE_URL || 'http://localhost:3456');
+ : (window.PBX_PROXY_BASE_URL || '/api');
// 确定提供商(从模型 ID 或配置推断)
let provider = 'openai';
diff --git a/js/chatbot/core/message-sender.js b/js/chatbot/core/message-sender.js
index 2fefbbf..2ebaecd 100644
--- a/js/chatbot/core/message-sender.js
+++ b/js/chatbot/core/message-sender.js
@@ -447,7 +447,7 @@ async function sendChatbotMessage(userInput, updateChatbotUI, externalConfig = n
const useProxy = globalProxyMode === 'proxy';
const proxyBaseUrl = (typeof window !== 'undefined' && window.ProxyConfig)
? window.ProxyConfig.getProxyUrl()
- : (window.PBX_PROXY_BASE_URL || 'http://localhost:3456');
+ : (window.PBX_PROXY_BASE_URL || '/api');
// 在使用代理服务器模式时,API Key 在后端配置,前端可以没有 API Key
// 否则,检查前端是否配置了有效的 API Key
@@ -1740,7 +1740,7 @@ async function singleChunkSummary(sysPrompt, userInput, config, apiKey) {
const useProxy = globalProxyMode === 'proxy';
const proxyBaseUrl = (typeof window !== 'undefined' && window.ProxyConfig)
? window.ProxyConfig.getProxyUrl()
- : (window.PBX_PROXY_BASE_URL || 'http://localhost:3456');
+ : (window.PBX_PROXY_BASE_URL || '/api');
// 只做单轮整理,不带历史
let apiConfig;
diff --git a/js/history/history_detail_scripts.js b/js/history/history_detail_scripts.js
index 220bd77..76aea71 100644
--- a/js/history/history_detail_scripts.js
+++ b/js/history/history_detail_scripts.js
@@ -808,7 +808,7 @@ async function executeMinerUStructuredTranslation() {
// 使用统一配置获取代理地址
const PROXY_BASE = (typeof window !== 'undefined' && window.ProxyConfig)
? window.ProxyConfig.getProxyUrl()
- : (window.PBX_PROXY_BASE_URL || 'http://localhost:3456');
+ : (window.PBX_PROXY_BASE_URL || '/api');
// 获取翻译配置
const settings = typeof loadSettings === 'function' ? loadSettings() : {};
diff --git a/js/process/main.js b/js/process/main.js
index b22f945..0a51581 100644
--- a/js/process/main.js
+++ b/js/process/main.js
@@ -800,7 +800,7 @@ const fileType = fileToProcess.name.split('.').pop().toLowerCase();
provider: selectedTranslationModelName,
proxyBase: (typeof window !== 'undefined' && window.ProxyConfig)
? window.ProxyConfig.getProxyUrl()
- : (window.PBX_PROXY_BASE_URL || 'http://localhost:3456'),
+ : (window.PBX_PROXY_BASE_URL || '/api'),
// 允许从设置自定义重试,若无则用默认
maxRetries: (typeof loadSettings === 'function' ? (loadSettings().structuredMaxRetries || undefined) : undefined),
retryDelay: (typeof loadSettings === 'function' ? (loadSettings().structuredRetryDelayMs || undefined) : undefined)
diff --git a/js/process/mineru-structured-translation.js b/js/process/mineru-structured-translation.js
index 73ba5f2..c0536f2 100644
--- a/js/process/mineru-structured-translation.js
+++ b/js/process/mineru-structured-translation.js
@@ -717,7 +717,7 @@ ${jsonContent}
const proxyBase = options.proxyBase ||
(typeof window !== 'undefined' && window.ProxyConfig ? window.ProxyConfig.getProxyUrl() : null) ||
(typeof window !== 'undefined' && window.PBX_PROXY_BASE_URL ? window.PBX_PROXY_BASE_URL : null) ||
- 'http://localhost:3456';
+ '/api';
const provider = options.provider || 'aliyun';
// 后端代理端点映射
@@ -836,7 +836,7 @@ ${jsonContent}
// 前端发出的请求源头
const proxyUrl = (typeof window !== 'undefined' && window.ProxyConfig)
? window.ProxyConfig.getProxyUrl()
- : (window.PBX_PROXY_BASE_URL || 'http://localhost:3456');
+ : (window.PBX_PROXY_BASE_URL || '/api');
const predefinedConfigs = {
'proxy': {
endpoint: `${proxyUrl}/api/llm/aliyun/v1/chat/completions`,
diff --git a/js/process/ocr-adapters/mistral-adapter.js b/js/process/ocr-adapters/mistral-adapter.js
index 8e4f711..8c40193 100644
--- a/js/process/ocr-adapters/mistral-adapter.js
+++ b/js/process/ocr-adapters/mistral-adapter.js
@@ -12,13 +12,13 @@ class MistralOcrAdapter extends OcrAdapter {
this.currentKeyIndex = 0;
// 使用统一配置获取代理地址
- // 优先级:config.baseUrl > window.ProxyConfig > 默认值
+ // 优先级:config.baseUrl > window.ProxyConfig > PBX_PROXY_BASE_URL > 默认相对路径
if (config.baseUrl && config.baseUrl !== 'https://api.mistral.ai') {
this.baseUrl = config.baseUrl.replace(/\/+$/, '');
} else if (typeof window !== 'undefined' && window.ProxyConfig) {
this.baseUrl = window.ProxyConfig.getMistralUrl();
} else {
- this.baseUrl = 'http://localhost:3456/api/mistral';
+ this.baseUrl = (window.PBX_PROXY_BASE_URL || '/api') + '/mistral';
}
}
diff --git a/js/process/ocr-manager.js b/js/process/ocr-manager.js
index a55453b..b7de13f 100644
--- a/js/process/ocr-manager.js
+++ b/js/process/ocr-manager.js
@@ -97,7 +97,7 @@ class OcrManager {
// 使用统一配置获取默认 workerUrl
const mineruDefaultUrl = (typeof window !== 'undefined' && window.ProxyConfig)
? window.ProxyConfig.getProxyUrl()
- : 'http://localhost:3456';
+ : (window.PBX_PROXY_BASE_URL || '/api');
return {
engine: 'mineru',
token: localStorage.getItem('ocrMinerUToken') || '',
@@ -113,7 +113,7 @@ class OcrManager {
// 使用统一配置获取默认 workerUrl
const doc2xDefaultUrl = (typeof window !== 'undefined' && window.ProxyConfig)
? window.ProxyConfig.getProxyUrl()
- : 'http://localhost:3456';
+ : (window.PBX_PROXY_BASE_URL || '/api');
return {
engine: 'doc2x',
token: localStorage.getItem('ocrDoc2XToken') || '',
diff --git a/js/process/translation.js b/js/process/translation.js
index af517ec..d767b4b 100644
--- a/js/process/translation.js
+++ b/js/process/translation.js
@@ -705,7 +705,7 @@ async function translateMarkdown(
// 所有翻译请求都指向后端代理,由后端决定使用哪个模型
endpoint: (typeof window !== 'undefined' && window.ProxyConfig)
? window.ProxyConfig.getLLMProxyUrl('tongyi', '/v1/chat/completions')
- : ((window.PBX_PROXY_BASE_URL || 'http://localhost:3456') + '/api/llm/tongyi/v1/chat/completions'),
+ : ((window.PBX_PROXY_BASE_URL || '/api') + '/llm/tongyi/v1/chat/completions'),
modelName: '通义百炼',
headers: { 'Content-Type': 'application/json' },
bodyBuilder: (sys, user) => {
diff --git a/js/ui/ocr-settings.js b/js/ui/ocr-settings.js
index 13de7e2..d5a1e2a 100644
--- a/js/ui/ocr-settings.js
+++ b/js/ui/ocr-settings.js
@@ -125,7 +125,8 @@ class OcrSettingsManager {
this.elements.mineruToken.value = localStorage.getItem(this.keys.mineruToken) || '';
}
if (this.elements.mineruWorkerUrl) {
- this.elements.mineruWorkerUrl.value = localStorage.getItem(this.keys.mineruWorkerUrl) || 'http://localhost:3456';
+ const defaultUrl = (typeof window !== 'undefined' && window.ProxyConfig) ? window.ProxyConfig.getProxyUrl() : '/api';
+ this.elements.mineruWorkerUrl.value = localStorage.getItem(this.keys.mineruWorkerUrl) || defaultUrl;
}
if (this.elements.mineruEnableOcr) {
this.elements.mineruEnableOcr.checked = localStorage.getItem(this.keys.mineruEnableOcr) !== 'false';
@@ -151,7 +152,8 @@ class OcrSettingsManager {
this.elements.doc2xToken.value = localStorage.getItem(this.keys.doc2xToken) || '';
}
if (this.elements.doc2xWorkerUrl) {
- this.elements.doc2xWorkerUrl.value = localStorage.getItem(this.keys.doc2xWorkerUrl) || 'http://localhost:3456';
+ const defaultUrl = (typeof window !== 'undefined' && window.ProxyConfig) ? window.ProxyConfig.getProxyUrl() : '/api';
+ this.elements.doc2xWorkerUrl.value = localStorage.getItem(this.keys.doc2xWorkerUrl) || defaultUrl;
}
if (this.elements.doc2xFormulaMode) {
this.elements.doc2xFormulaMode.value = localStorage.getItem(this.keys.doc2xFormulaMode) || 'dollar';
@@ -514,10 +516,11 @@ class OcrSettingsManager {
}
case 'mineru':
+ const mineruDefaultUrl = (typeof window !== 'undefined' && window.ProxyConfig) ? window.ProxyConfig.getProxyUrl() : '/api';
return {
engine: 'mineru',
token: localStorage.getItem(this.keys.mineruToken) || '',
- workerUrl: (localStorage.getItem(this.keys.mineruWorkerUrl) || 'http://localhost:3456').replace(/\/+$/, ''), // 去掉末尾斜杠
+ workerUrl: (localStorage.getItem(this.keys.mineruWorkerUrl) || mineruDefaultUrl).replace(/\/+$/, ''), // 去掉末尾斜杠
authKey: localStorage.getItem(this.keys.workerAuthKey) || '',
tokenMode: localStorage.getItem(this.keys.mineruTokenMode) || 'backend', // 默认后端转发模式
enableOcr: localStorage.getItem(this.keys.mineruEnableOcr) !== 'false',
@@ -527,10 +530,11 @@ class OcrSettingsManager {
};
case 'doc2x':
+ const doc2xDefaultUrl = (typeof window !== 'undefined' && window.ProxyConfig) ? window.ProxyConfig.getProxyUrl() : '/api';
return {
engine: 'doc2x',
token: localStorage.getItem(this.keys.doc2xToken) || '',
- workerUrl: (localStorage.getItem(this.keys.doc2xWorkerUrl) || 'http://localhost:3456').replace(/\/+$/, ''), // 去掉末尾斜杠
+ workerUrl: (localStorage.getItem(this.keys.doc2xWorkerUrl) || doc2xDefaultUrl).replace(/\/+$/, ''), // 去掉末尾斜杠
authKey: localStorage.getItem(this.keys.workerAuthKey) || '',
tokenMode: localStorage.getItem(this.keys.doc2xTokenMode) || 'backend', // 默认后端转发模式
formulaMode: localStorage.getItem(this.keys.doc2xFormulaMode) || 'dollar',
diff --git a/js/ui/ui_model_ocr_config.js b/js/ui/ui_model_ocr_config.js
index a9175b7..ee34cba 100644
--- a/js/ui/ui_model_ocr_config.js
+++ b/js/ui/ui_model_ocr_config.js
@@ -60,7 +60,8 @@
*/
function renderMinerUConfig(container) {
// 从 localStorage 加载配置
- const workerUrl = localStorage.getItem('ocrMinerUWorkerUrl') || 'http://localhost:3456';
+ const defaultUrl = (typeof window !== 'undefined' && window.ProxyConfig) ? window.ProxyConfig.getProxyUrl() : '/api';
+ const workerUrl = localStorage.getItem('ocrMinerUWorkerUrl') || defaultUrl;
const authKey = localStorage.getItem('ocrWorkerAuthKey') || '';
const tokenMode = localStorage.getItem('ocrMinerUTokenMode') || 'backend';
const token = localStorage.getItem('ocrMinerUToken') || '';
@@ -336,7 +337,8 @@
*/
function renderDoc2XConfig(container) {
// 从 localStorage 加载配置
- const workerUrl = localStorage.getItem('ocrDoc2XWorkerUrl') || 'http://localhost:3456';
+ const defaultUrl = (typeof window !== 'undefined' && window.ProxyConfig) ? window.ProxyConfig.getProxyUrl() : '/api';
+ const workerUrl = localStorage.getItem('ocrDoc2XWorkerUrl') || defaultUrl;
const authKey = localStorage.getItem('ocrWorkerAuthKey') || '';
const tokenMode = localStorage.getItem('ocrDoc2XTokenMode') || 'backend';
const token = localStorage.getItem('ocrDoc2XToken') || '';
diff --git a/views/history/history_detail.html b/views/history/history_detail.html
index d95096e..0ae78c6 100644
--- a/views/history/history_detail.html
+++ b/views/history/history_detail.html
@@ -864,10 +864,13 @@
+
-
+