Fix: Hunyuan cannot work properly (#12843)

### What problem does this PR solve?

Hunyuan cannot work properly

### Type of change

- [x] Bug Fix (non-breaking change which fixes an issue)
This commit is contained in:
Yongteng Lei
2026-01-27 17:04:53 +08:00
committed by GitHub
parent e77168feba
commit 2a758402ad
17 changed files with 51 additions and 290 deletions

View File

@ -146,10 +146,6 @@ async def add_llm():
# Assemble ark_api_key endpoint_id into api_key # Assemble ark_api_key endpoint_id into api_key
api_key = apikey_json(["ark_api_key", "endpoint_id"]) api_key = apikey_json(["ark_api_key", "endpoint_id"])
elif factory == "Tencent Hunyuan":
req["api_key"] = apikey_json(["hunyuan_sid", "hunyuan_sk"])
return await set_api_key()
elif factory == "Tencent Cloud": elif factory == "Tencent Cloud":
req["api_key"] = apikey_json(["tencent_cloud_sid", "tencent_cloud_sk"]) req["api_key"] = apikey_json(["tencent_cloud_sid", "tencent_cloud_sk"])
return await set_api_key() return await set_api_key()

View File

@ -57,6 +57,7 @@ class SupportedLiteLLMProvider(StrEnum):
OpenAI = "OpenAI" OpenAI = "OpenAI"
Azure_OpenAI = "Azure-OpenAI" Azure_OpenAI = "Azure-OpenAI"
n1n = "n1n" n1n = "n1n"
HunYuan = "Tencent Hunyuan"
FACTORY_DEFAULT_BASE_URL = { FACTORY_DEFAULT_BASE_URL = {
@ -83,6 +84,7 @@ FACTORY_DEFAULT_BASE_URL = {
SupportedLiteLLMProvider.DeerAPI: "https://api.deerapi.com/v1", SupportedLiteLLMProvider.DeerAPI: "https://api.deerapi.com/v1",
SupportedLiteLLMProvider.OpenAI: "https://api.openai.com/v1", SupportedLiteLLMProvider.OpenAI: "https://api.openai.com/v1",
SupportedLiteLLMProvider.n1n: "https://api.n1n.ai/v1", SupportedLiteLLMProvider.n1n: "https://api.n1n.ai/v1",
SupportedLiteLLMProvider.HunYuan: "https://api.hunyuan.cloud.tencent.com/v1",
} }
@ -121,6 +123,7 @@ LITELLM_PROVIDER_PREFIX = {
SupportedLiteLLMProvider.OpenAI: "openai/", SupportedLiteLLMProvider.OpenAI: "openai/",
SupportedLiteLLMProvider.Azure_OpenAI: "azure/", SupportedLiteLLMProvider.Azure_OpenAI: "azure/",
SupportedLiteLLMProvider.n1n: "openai/", SupportedLiteLLMProvider.n1n: "openai/",
SupportedLiteLLMProvider.HunYuan: "openai/",
} }
ChatModel = globals().get("ChatModel", {}) ChatModel = globals().get("ChatModel", {})

View File

@ -34,8 +34,6 @@ from common.token_utils import num_tokens_from_string, total_token_count_from_re
from rag.llm import FACTORY_DEFAULT_BASE_URL, LITELLM_PROVIDER_PREFIX, SupportedLiteLLMProvider from rag.llm import FACTORY_DEFAULT_BASE_URL, LITELLM_PROVIDER_PREFIX, SupportedLiteLLMProvider
from rag.nlp import is_chinese, is_english from rag.nlp import is_chinese, is_english
# Error message constants
from common.misc_utils import thread_pool_exec from common.misc_utils import thread_pool_exec
class LLMErrorCode(StrEnum): class LLMErrorCode(StrEnum):
ERROR_RATE_LIMIT = "RATE_LIMIT_EXCEEDED" ERROR_RATE_LIMIT = "RATE_LIMIT_EXCEEDED"
@ -793,84 +791,6 @@ class ReplicateChat(Base):
yield num_tokens_from_string(ans) yield num_tokens_from_string(ans)
class HunyuanChat(Base):
_FACTORY_NAME = "Tencent Hunyuan"
def __init__(self, key, model_name, base_url=None, **kwargs):
super().__init__(key, model_name, base_url=base_url, **kwargs)
from tencentcloud.common import credential
from tencentcloud.hunyuan.v20230901 import hunyuan_client
key = json.loads(key)
sid = key.get("hunyuan_sid", "")
sk = key.get("hunyuan_sk", "")
cred = credential.Credential(sid, sk)
self.model_name = model_name
self.client = hunyuan_client.HunyuanClient(cred, "")
def _clean_conf(self, gen_conf):
_gen_conf = {}
if "temperature" in gen_conf:
_gen_conf["Temperature"] = gen_conf["temperature"]
if "top_p" in gen_conf:
_gen_conf["TopP"] = gen_conf["top_p"]
return _gen_conf
def _chat(self, history, gen_conf={}, **kwargs):
from tencentcloud.hunyuan.v20230901 import models
hist = [{k.capitalize(): v for k, v in item.items()} for item in history]
req = models.ChatCompletionsRequest()
params = {"Model": self.model_name, "Messages": hist, **gen_conf}
req.from_json_string(json.dumps(params))
response = self.client.ChatCompletions(req)
ans = response.Choices[0].Message.Content
return ans, response.Usage.TotalTokens
def chat_streamly(self, system, history, gen_conf={}, **kwargs):
from tencentcloud.common.exception.tencent_cloud_sdk_exception import (
TencentCloudSDKException,
)
from tencentcloud.hunyuan.v20230901 import models
_gen_conf = {}
_history = [{k.capitalize(): v for k, v in item.items()} for item in history]
if system and history and history[0].get("role") != "system":
_history.insert(0, {"Role": "system", "Content": system})
if "max_tokens" in gen_conf:
del gen_conf["max_tokens"]
if "temperature" in gen_conf:
_gen_conf["Temperature"] = gen_conf["temperature"]
if "top_p" in gen_conf:
_gen_conf["TopP"] = gen_conf["top_p"]
req = models.ChatCompletionsRequest()
params = {
"Model": self.model_name,
"Messages": _history,
"Stream": True,
**_gen_conf,
}
req.from_json_string(json.dumps(params))
ans = ""
total_tokens = 0
try:
response = self.client.ChatCompletions(req)
for resp in response:
resp = json.loads(resp["data"])
if not resp["Choices"] or not resp["Choices"][0]["Delta"]["Content"]:
continue
ans = resp["Choices"][0]["Delta"]["Content"]
total_tokens += 1
yield ans
except TencentCloudSDKException as e:
yield ans + "\n**ERROR**: " + str(e)
yield total_tokens
class SparkChat(Base): class SparkChat(Base):
_FACTORY_NAME = "XunFei Spark" _FACTORY_NAME = "XunFei Spark"
@ -1209,6 +1129,7 @@ class LiteLLMBase(ABC):
"GPUStack", "GPUStack",
"OpenAI", "OpenAI",
"Azure-OpenAI", "Azure-OpenAI",
"Tencent Hunyuan",
] ]
def __init__(self, key, model_name, base_url=None, **kwargs): def __init__(self, key, model_name, base_url=None, **kwargs):
@ -1259,6 +1180,11 @@ class LiteLLMBase(ABC):
return LLMErrorCode.ERROR_GENERIC return LLMErrorCode.ERROR_GENERIC
def _clean_conf(self, gen_conf): def _clean_conf(self, gen_conf):
if self.provider == SupportedLiteLLMProvider.HunYuan:
unsupported = ["presence_penalty", "frequency_penalty"]
for key in unsupported:
gen_conf.pop(key, None)
if "max_tokens" in gen_conf: if "max_tokens" in gen_conf:
del gen_conf["max_tokens"] del gen_conf["max_tokens"]
return gen_conf return gen_conf
@ -1704,3 +1630,4 @@ class LiteLLMBase(ABC):
if extra_headers: if extra_headers:
completion_args["extra_headers"] = extra_headers completion_args["extra_headers"] = extra_headers
return completion_args return completion_args

View File

@ -1226,10 +1226,6 @@ Beispiel: Virtual Hosted Style`,
'sa-east-1': 'Südamerika (São Paulo)', 'sa-east-1': 'Südamerika (São Paulo)',
'us-gov-east-1': 'AWS GovCloud (US-Ost)', 'us-gov-east-1': 'AWS GovCloud (US-Ost)',
'us-gov-west-1': 'AWS GovCloud (US-West)', 'us-gov-west-1': 'AWS GovCloud (US-West)',
addHunyuanSID: 'Hunyuan Secret ID',
HunyuanSIDMessage: 'Bitte geben Sie Ihre Secret ID ein',
addHunyuanSK: 'Hunyuan Secret Key',
HunyuanSKMessage: 'Bitte geben Sie Ihren Secret Key ein',
addTencentCloudSID: 'TencentCloud Secret ID', addTencentCloudSID: 'TencentCloud Secret ID',
TencentCloudSIDMessage: 'Bitte geben Sie Ihre Secret ID ein', TencentCloudSIDMessage: 'Bitte geben Sie Ihre Secret ID ein',
addTencentCloudSK: 'TencentCloud Secret Key', addTencentCloudSK: 'TencentCloud Secret Key',

View File

@ -1178,10 +1178,6 @@ Example: Virtual Hosted Style`,
'sa-east-1': 'South America (São Paulo)', 'sa-east-1': 'South America (São Paulo)',
'us-gov-east-1': 'AWS GovCloud (US-East)', 'us-gov-east-1': 'AWS GovCloud (US-East)',
'us-gov-west-1': 'AWS GovCloud (US-West)', 'us-gov-west-1': 'AWS GovCloud (US-West)',
addHunyuanSID: 'Hunyuan Secret ID',
HunyuanSIDMessage: 'Please input your Secret ID',
addHunyuanSK: 'Hunyuan Secret Key',
HunyuanSKMessage: 'Please input your Secret Key',
addTencentCloudSID: 'TencentCloud Secret ID', addTencentCloudSID: 'TencentCloud Secret ID',
TencentCloudSIDMessage: 'Please input your Secret ID', TencentCloudSIDMessage: 'Please input your Secret ID',
addTencentCloudSK: 'TencentCloud Secret Key', addTencentCloudSK: 'TencentCloud Secret Key',

View File

@ -162,13 +162,16 @@ export default {
knowledgeConfiguration: { knowledgeConfiguration: {
paddleocrOptions: 'Opciones de PaddleOCR', paddleocrOptions: 'Opciones de PaddleOCR',
paddleocrApiUrl: 'URL de API de PaddleOCR', paddleocrApiUrl: 'URL de API de PaddleOCR',
paddleocrApiUrlTip: 'La URL del endpoint de la API para el servicio PaddleOCR', paddleocrApiUrlTip:
'La URL del endpoint de la API para el servicio PaddleOCR',
paddleocrApiUrlPlaceholder: 'ej: https://servidor-paddleocr.com/api', paddleocrApiUrlPlaceholder: 'ej: https://servidor-paddleocr.com/api',
paddleocrAccessToken: 'Token de acceso de AI Studio', paddleocrAccessToken: 'Token de acceso de AI Studio',
paddleocrAccessTokenTip: 'Token de acceso para la API de PaddleOCR (opcional)', paddleocrAccessTokenTip:
'Token de acceso para la API de PaddleOCR (opcional)',
paddleocrAccessTokenPlaceholder: 'Su token de AI Studio (opcional)', paddleocrAccessTokenPlaceholder: 'Su token de AI Studio (opcional)',
paddleocrAlgorithm: 'Algoritmo de PaddleOCR', paddleocrAlgorithm: 'Algoritmo de PaddleOCR',
paddleocrAlgorithmTip: 'Algoritmo a utilizar para el análisis de PaddleOCR', paddleocrAlgorithmTip:
'Algoritmo a utilizar para el análisis de PaddleOCR',
paddleocrSelectAlgorithm: 'Seleccionar algoritmo', paddleocrSelectAlgorithm: 'Seleccionar algoritmo',
paddleocrModelNamePlaceholder: 'ej: paddleocr-desde-env-1', paddleocrModelNamePlaceholder: 'ej: paddleocr-desde-env-1',
}, },
@ -395,14 +398,15 @@ export default {
baseUrlNameMessage: '¡Por favor ingresa tu URL base!', baseUrlNameMessage: '¡Por favor ingresa tu URL base!',
paddleocr: { paddleocr: {
apiUrl: 'URL de la API de PaddleOCR', apiUrl: 'URL de la API de PaddleOCR',
apiUrlPlaceholder: 'Por ejemplo: https://paddleocr-server.com/layout-parsing', apiUrlPlaceholder:
'Por ejemplo: https://paddleocr-server.com/layout-parsing',
accessToken: 'Token de acceso de AI Studio', accessToken: 'Token de acceso de AI Studio',
accessTokenPlaceholder: 'Su token de AI Studio (opcional)', accessTokenPlaceholder: 'Su token de AI Studio (opcional)',
algorithm: 'Algoritmo de PaddleOCR', algorithm: 'Algoritmo de PaddleOCR',
selectAlgorithm: 'Seleccionar algoritmo', selectAlgorithm: 'Seleccionar algoritmo',
modelNamePlaceholder: 'Por ejemplo: paddleocr-from-env-1', modelNamePlaceholder: 'Por ejemplo: paddleocr-from-env-1',
modelNameRequired: 'El nombre del modelo es obligatorio', modelNameRequired: 'El nombre del modelo es obligatorio',
apiUrlRequired: 'La URL de la API de PaddleOCR es obligatoria' apiUrlRequired: 'La URL de la API de PaddleOCR es obligatoria',
}, },
vision: '¿Soporta visión?', vision: '¿Soporta visión?',
ollamaLink: 'Cómo integrar {{name}}', ollamaLink: 'Cómo integrar {{name}}',
@ -427,10 +431,6 @@ export default {
'eu-central-1': 'Europa (Frankfurt)', 'eu-central-1': 'Europa (Frankfurt)',
'us-gov-west-1': 'AWS GovCloud (EE. UU. Oeste)', 'us-gov-west-1': 'AWS GovCloud (EE. UU. Oeste)',
'ap-southeast-2': 'Asia Pacífico (Sídney)', 'ap-southeast-2': 'Asia Pacífico (Sídney)',
addHunyuanSID: 'ID Secreto de Hunyuan',
HunyuanSIDMessage: '¡Por favor ingresa tu ID Secreto!',
addHunyuanSK: 'Clave Secreta de Hunyuan',
HunyuanSKMessage: '¡Por favor ingresa tu Clave Secreta!',
addTencentCloudSID: 'ID Secreto de TencentCloud', addTencentCloudSID: 'ID Secreto de TencentCloud',
TencentCloudSIDMessage: '¡Por favor ingresa tu ID Secreto!', TencentCloudSIDMessage: '¡Por favor ingresa tu ID Secreto!',
addTencentCloudSK: 'Clave Secreta de TencentCloud', addTencentCloudSK: 'Clave Secreta de TencentCloud',

View File

@ -295,8 +295,10 @@ export default {
'Le document en cours danalyse ne peut pas être supprimé', 'Le document en cours danalyse ne peut pas être supprimé',
paddleocrOptions: 'Options PaddleOCR', paddleocrOptions: 'Options PaddleOCR',
paddleocrApiUrl: 'URL de lAPI PaddleOCR', paddleocrApiUrl: 'URL de lAPI PaddleOCR',
paddleocrApiUrlTip: 'URL du point de terminaison de lAPI du service PaddleOCR', paddleocrApiUrlTip:
paddleocrApiUrlPlaceholder: 'Par exemple : https://paddleocr-server.com/layout-parsing', 'URL du point de terminaison de lAPI du service PaddleOCR',
paddleocrApiUrlPlaceholder:
'Par exemple : https://paddleocr-server.com/layout-parsing',
paddleocrAccessToken: 'Jeton daccès AI Studio', paddleocrAccessToken: 'Jeton daccès AI Studio',
paddleocrAccessTokenTip: 'Jeton daccès à lAPI PaddleOCR (optionnel)', paddleocrAccessTokenTip: 'Jeton daccès à lAPI PaddleOCR (optionnel)',
paddleocrAccessTokenPlaceholder: 'Votre jeton AI Studio (optionnel)', paddleocrAccessTokenPlaceholder: 'Votre jeton AI Studio (optionnel)',
@ -579,14 +581,15 @@ export default {
baseUrlNameMessage: 'Veuillez saisir votre URL de base !', baseUrlNameMessage: 'Veuillez saisir votre URL de base !',
paddleocr: { paddleocr: {
apiUrl: 'URL de lAPI PaddleOCR', apiUrl: 'URL de lAPI PaddleOCR',
apiUrlPlaceholder: 'Par exemple : https://paddleocr-server.com/layout-parsing', apiUrlPlaceholder:
'Par exemple : https://paddleocr-server.com/layout-parsing',
accessToken: 'Jeton daccès AI Studio', accessToken: 'Jeton daccès AI Studio',
accessTokenPlaceholder: 'Votre jeton AI Studio (optionnel)', accessTokenPlaceholder: 'Votre jeton AI Studio (optionnel)',
algorithm: 'Algorithme PaddleOCR', algorithm: 'Algorithme PaddleOCR',
selectAlgorithm: 'Sélectionner un algorithme', selectAlgorithm: 'Sélectionner un algorithme',
modelNamePlaceholder: 'Par exemple : paddleocr-from-env-1', modelNamePlaceholder: 'Par exemple : paddleocr-from-env-1',
modelNameRequired: 'Le nom du modèle est obligatoire', modelNameRequired: 'Le nom du modèle est obligatoire',
apiUrlRequired: 'LURL de lAPI PaddleOCR est obligatoire' apiUrlRequired: 'LURL de lAPI PaddleOCR est obligatoire',
}, },
vision: 'Supporte-t-il la vision ?', vision: 'Supporte-t-il la vision ?',
ollamaLink: 'Comment intégrer {{name}}', ollamaLink: 'Comment intégrer {{name}}',
@ -611,10 +614,6 @@ export default {
'eu-central-1': 'Europe (Francfort)', 'eu-central-1': 'Europe (Francfort)',
'us-gov-west-1': 'AWS GovCloud (US-Ouest)', 'us-gov-west-1': 'AWS GovCloud (US-Ouest)',
'ap-southeast-2': 'Asie Pacifique (Sydney)', 'ap-southeast-2': 'Asie Pacifique (Sydney)',
addHunyuanSID: 'ID secret Hunyuan',
HunyuanSIDMessage: 'Veuillez saisir votre ID secret',
addHunyuanSK: 'Clé secrète Hunyuan',
HunyuanSKMessage: 'Veuillez saisir votre clé secrète',
addTencentCloudSID: 'ID secret TencentCloud', addTencentCloudSID: 'ID secret TencentCloud',
TencentCloudSIDMessage: 'Veuillez saisir votre ID secret', TencentCloudSIDMessage: 'Veuillez saisir votre ID secret',
addTencentCloudSK: 'Clé secrète TencentCloud', addTencentCloudSK: 'Clé secrète TencentCloud',

View File

@ -319,12 +319,14 @@ export default {
paddleocrOptions: 'Opsi PaddleOCR', paddleocrOptions: 'Opsi PaddleOCR',
paddleocrApiUrl: 'URL API PaddleOCR', paddleocrApiUrl: 'URL API PaddleOCR',
paddleocrApiUrlTip: 'URL endpoint API layanan PaddleOCR', paddleocrApiUrlTip: 'URL endpoint API layanan PaddleOCR',
paddleocrApiUrlPlaceholder: 'Contoh: https://paddleocr-server.com/layout-parsing', paddleocrApiUrlPlaceholder:
'Contoh: https://paddleocr-server.com/layout-parsing',
paddleocrAccessToken: 'Token Akses AI Studio', paddleocrAccessToken: 'Token Akses AI Studio',
paddleocrAccessTokenTip: 'Token akses untuk API PaddleOCR (opsional)', paddleocrAccessTokenTip: 'Token akses untuk API PaddleOCR (opsional)',
paddleocrAccessTokenPlaceholder: 'Token AI Studio Anda (opsional)', paddleocrAccessTokenPlaceholder: 'Token AI Studio Anda (opsional)',
paddleocrAlgorithm: 'Algoritma PaddleOCR', paddleocrAlgorithm: 'Algoritma PaddleOCR',
paddleocrAlgorithmTip: 'Algoritma yang digunakan untuk pemrosesan PaddleOCR', paddleocrAlgorithmTip:
'Algoritma yang digunakan untuk pemrosesan PaddleOCR',
paddleocrSelectAlgorithm: 'Pilih algoritma', paddleocrSelectAlgorithm: 'Pilih algoritma',
paddleocrModelNamePlaceholder: 'Contoh: paddleocr-lingkungan-1', paddleocrModelNamePlaceholder: 'Contoh: paddleocr-lingkungan-1',
}, },
@ -566,14 +568,15 @@ export default {
baseUrlNameMessage: 'Silakan masukkan base url Anda!', baseUrlNameMessage: 'Silakan masukkan base url Anda!',
paddleocr: { paddleocr: {
apiUrl: 'URL API PaddleOCR', apiUrl: 'URL API PaddleOCR',
apiUrlPlaceholder: 'Contoh: https://paddleocr-server.com/layout-parsing', apiUrlPlaceholder:
'Contoh: https://paddleocr-server.com/layout-parsing',
accessToken: 'Token Akses AI Studio', accessToken: 'Token Akses AI Studio',
accessTokenPlaceholder: 'Token AI Studio Anda (opsional)', accessTokenPlaceholder: 'Token AI Studio Anda (opsional)',
algorithm: 'Algoritma PaddleOCR', algorithm: 'Algoritma PaddleOCR',
selectAlgorithm: 'Pilih algoritma', selectAlgorithm: 'Pilih algoritma',
modelNamePlaceholder: 'Contoh: paddleocr-from-env-1', modelNamePlaceholder: 'Contoh: paddleocr-from-env-1',
modelNameRequired: 'Nama model wajib diisi', modelNameRequired: 'Nama model wajib diisi',
apiUrlRequired: 'URL API PaddleOCR wajib diisi' apiUrlRequired: 'URL API PaddleOCR wajib diisi',
}, },
vision: 'Apakah mendukung Vision?', vision: 'Apakah mendukung Vision?',
ollamaLink: 'Cara mengintegrasikan {{name}}', ollamaLink: 'Cara mengintegrasikan {{name}}',
@ -626,10 +629,6 @@ export default {
'sa-east-1': 'South America (São Paulo)', 'sa-east-1': 'South America (São Paulo)',
'us-gov-east-1': 'AWS GovCloud (US-East)', 'us-gov-east-1': 'AWS GovCloud (US-East)',
'us-gov-west-1': 'AWS GovCloud (US-West)', 'us-gov-west-1': 'AWS GovCloud (US-West)',
addHunyuanSID: 'Hunyuan Secret ID',
HunyuanSIDMessage: 'Silakan masukkan Secret ID Anda',
addHunyuanSK: 'Hunyuan Secret Key',
HunyuanSKMessage: 'Silakan masukkan Secret Key Anda',
addTencentCloudSID: 'TencentCloud Secret ID', addTencentCloudSID: 'TencentCloud Secret ID',
TencentCloudSIDMessage: 'Silakan masukkan Secret ID Anda', TencentCloudSIDMessage: 'Silakan masukkan Secret ID Anda',
addTencentCloudSK: 'TencentCloud Secret Key', addTencentCloudSK: 'TencentCloud Secret Key',

View File

@ -616,7 +616,7 @@ export default {
selectAlgorithm: 'アルゴリズムを選択', selectAlgorithm: 'アルゴリズムを選択',
modelNamePlaceholder: '例paddleocr-from-env-1', modelNamePlaceholder: '例paddleocr-from-env-1',
modelNameRequired: 'モデル名は必須です', modelNameRequired: 'モデル名は必須です',
apiUrlRequired: 'PaddleOCR API URL は必須です' apiUrlRequired: 'PaddleOCR API URL は必須です',
}, },
vision: 'ビジョンをサポートしていますか?', vision: 'ビジョンをサポートしていますか?',
ollamaLink: '{{name}}を統合する方法', ollamaLink: '{{name}}を統合する方法',
@ -641,10 +641,6 @@ export default {
'eu-central-1': 'ヨーロッパ(フランクフルト)', 'eu-central-1': 'ヨーロッパ(フランクフルト)',
'us-gov-west-1': 'AWS GovCloud米国西部', 'us-gov-west-1': 'AWS GovCloud米国西部',
'ap-southeast-2': 'アジア太平洋(シドニー)', 'ap-southeast-2': 'アジア太平洋(シドニー)',
addHunyuanSID: 'HunyuanシークレットID',
HunyuanSIDMessage: 'シークレットIDを入力してください',
addHunyuanSK: 'Hunyuanシークレットキー',
HunyuanSKMessage: 'シークレットキーを入力してください',
addTencentCloudSID: 'TencentCloudシークレットID', addTencentCloudSID: 'TencentCloudシークレットID',
TencentCloudSIDMessage: 'シークレットIDを入力してください', TencentCloudSIDMessage: 'シークレットIDを入力してください',
addTencentCloudSK: 'TencentCloudシークレットキー', addTencentCloudSK: 'TencentCloudシークレットキー',

View File

@ -315,10 +315,12 @@ export default {
paddleocrApiUrlTip: 'A URL do endpoint da API para o serviço PaddleOCR', paddleocrApiUrlTip: 'A URL do endpoint da API para o serviço PaddleOCR',
paddleocrApiUrlPlaceholder: 'ex: https://servidor-paddleocr.com/api', paddleocrApiUrlPlaceholder: 'ex: https://servidor-paddleocr.com/api',
paddleocrAccessToken: 'Token de Acesso do AI Studio', paddleocrAccessToken: 'Token de Acesso do AI Studio',
paddleocrAccessTokenTip: 'Token de acesso para a API do PaddleOCR (opcional)', paddleocrAccessTokenTip:
'Token de acesso para a API do PaddleOCR (opcional)',
paddleocrAccessTokenPlaceholder: 'Seu token do AI Studio (opcional)', paddleocrAccessTokenPlaceholder: 'Seu token do AI Studio (opcional)',
paddleocrAlgorithm: 'Algoritmo do PaddleOCR', paddleocrAlgorithm: 'Algoritmo do PaddleOCR',
paddleocrAlgorithmTip: 'Algoritmo a ser usado para a análise do PaddleOCR', paddleocrAlgorithmTip:
'Algoritmo a ser usado para a análise do PaddleOCR',
paddleocrSelectAlgorithm: 'Selecionar algoritmo', paddleocrSelectAlgorithm: 'Selecionar algoritmo',
paddleocrModelNamePlaceholder: 'ex: paddleocr-do-ambiente-1', paddleocrModelNamePlaceholder: 'ex: paddleocr-do-ambiente-1',
}, },
@ -559,14 +561,15 @@ export default {
baseUrlNameMessage: 'Por favor, insira sua URL base!', baseUrlNameMessage: 'Por favor, insira sua URL base!',
paddleocr: { paddleocr: {
apiUrl: 'URL da API do PaddleOCR', apiUrl: 'URL da API do PaddleOCR',
apiUrlPlaceholder: 'Por exemplo: https://paddleocr-server.com/layout-parsing', apiUrlPlaceholder:
'Por exemplo: https://paddleocr-server.com/layout-parsing',
accessToken: 'Token de acesso do AI Studio', accessToken: 'Token de acesso do AI Studio',
accessTokenPlaceholder: 'Seu token do AI Studio (opcional)', accessTokenPlaceholder: 'Seu token do AI Studio (opcional)',
algorithm: 'Algoritmo do PaddleOCR', algorithm: 'Algoritmo do PaddleOCR',
selectAlgorithm: 'Selecionar algoritmo', selectAlgorithm: 'Selecionar algoritmo',
modelNamePlaceholder: 'Por exemplo: paddleocr-from-env-1', modelNamePlaceholder: 'Por exemplo: paddleocr-from-env-1',
modelNameRequired: 'O nome do modelo é obrigatório', modelNameRequired: 'O nome do modelo é obrigatório',
apiUrlRequired: 'A URL da API do PaddleOCR é obrigatória' apiUrlRequired: 'A URL da API do PaddleOCR é obrigatória',
}, },
vision: 'Suporta visão?', vision: 'Suporta visão?',
ollamaLink: 'Como integrar {{name}}', ollamaLink: 'Como integrar {{name}}',
@ -591,10 +594,6 @@ export default {
'eu-central-1': 'Europa (Frankfurt)', 'eu-central-1': 'Europa (Frankfurt)',
'us-gov-west-1': 'AWS GovCloud (EUA-Oeste)', 'us-gov-west-1': 'AWS GovCloud (EUA-Oeste)',
'ap-southeast-2': 'Ásia-Pacífico (Sydney)', 'ap-southeast-2': 'Ásia-Pacífico (Sydney)',
addHunyuanSID: 'Hunyuan Secret ID',
HunyuanSIDMessage: 'Por favor, insira seu Secret ID',
addHunyuanSK: 'Hunyuan Secret Key',
HunyuanSKMessage: 'Por favor, insira sua Secret Key',
addTencentCloudSID: 'TencentCloud Secret ID', addTencentCloudSID: 'TencentCloud Secret ID',
TencentCloudSIDMessage: 'Por favor, insira seu Secret ID', TencentCloudSIDMessage: 'Por favor, insira seu Secret ID',
addTencentCloudSK: 'TencentCloud Secret Key', addTencentCloudSK: 'TencentCloud Secret Key',

View File

@ -513,7 +513,8 @@ export default {
paddleocrOptions: 'Параметры PaddleOCR', paddleocrOptions: 'Параметры PaddleOCR',
paddleocrApiUrl: 'URL API PaddleOCR', paddleocrApiUrl: 'URL API PaddleOCR',
paddleocrApiUrlTip: 'URL конечной точки API сервиса PaddleOCR', paddleocrApiUrlTip: 'URL конечной точки API сервиса PaddleOCR',
paddleocrApiUrlPlaceholder: 'Например: https://paddleocr-server.com/layout-parsing', paddleocrApiUrlPlaceholder:
'Например: https://paddleocr-server.com/layout-parsing',
paddleocrAccessToken: 'Токен доступа AI Studio', paddleocrAccessToken: 'Токен доступа AI Studio',
paddleocrAccessTokenTip: 'Токен доступа к API PaddleOCR (необязательно)', paddleocrAccessTokenTip: 'Токен доступа к API PaddleOCR (необязательно)',
paddleocrAccessTokenPlaceholder: 'Ваш токен AI Studio (необязательно)', paddleocrAccessTokenPlaceholder: 'Ваш токен AI Studio (необязательно)',
@ -979,10 +980,6 @@ export default {
'sa-east-1': 'Южная Америка (Сан-Паулу)', 'sa-east-1': 'Южная Америка (Сан-Паулу)',
'us-gov-east-1': 'AWS GovCloud (US-East)', 'us-gov-east-1': 'AWS GovCloud (US-East)',
'us-gov-west-1': 'AWS GovCloud (US-West)', 'us-gov-west-1': 'AWS GovCloud (US-West)',
addHunyuanSID: 'Hunyuan Secret ID',
HunyuanSIDMessage: 'Пожалуйста, введите ваш Secret ID',
addHunyuanSK: 'Hunyuan Secret Key',
HunyuanSKMessage: 'Пожалуйста, введите ваш Secret Key',
addTencentCloudSID: 'TencentCloud Secret ID', addTencentCloudSID: 'TencentCloud Secret ID',
TencentCloudSIDMessage: 'Пожалуйста, введите ваш Secret ID', TencentCloudSIDMessage: 'Пожалуйста, введите ваш Secret ID',
addTencentCloudSK: 'TencentCloud Secret Key', addTencentCloudSK: 'TencentCloud Secret Key',
@ -1047,14 +1044,15 @@ export default {
mcp: 'MCP', mcp: 'MCP',
paddleocr: { paddleocr: {
apiUrl: 'URL API PaddleOCR', apiUrl: 'URL API PaddleOCR',
apiUrlPlaceholder: 'Например: https://paddleocr-server.com/layout-parsing', apiUrlPlaceholder:
'Например: https://paddleocr-server.com/layout-parsing',
accessToken: 'Токен доступа AI Studio', accessToken: 'Токен доступа AI Studio',
accessTokenPlaceholder: 'Ваш токен AI Studio (необязательно)', accessTokenPlaceholder: 'Ваш токен AI Studio (необязательно)',
algorithm: 'Алгоритм PaddleOCR', algorithm: 'Алгоритм PaddleOCR',
selectAlgorithm: 'Выбрать алгоритм', selectAlgorithm: 'Выбрать алгоритм',
modelNamePlaceholder: 'Например: paddleocr-from-env-1', modelNamePlaceholder: 'Например: paddleocr-from-env-1',
modelNameRequired: 'Имя модели является обязательным', modelNameRequired: 'Имя модели является обязательным',
apiUrlRequired: 'URL API PaddleOCR является обязательным' apiUrlRequired: 'URL API PaddleOCR является обязательным',
}, },
}, },
message: { message: {

View File

@ -357,7 +357,8 @@ export default {
paddleocrOptions: 'Tùy chọn PaddleOCR', paddleocrOptions: 'Tùy chọn PaddleOCR',
paddleocrApiUrl: 'URL API PaddleOCR', paddleocrApiUrl: 'URL API PaddleOCR',
paddleocrApiUrlTip: 'URL điểm cuối API của dịch vụ PaddleOCR', paddleocrApiUrlTip: 'URL điểm cuối API của dịch vụ PaddleOCR',
paddleocrApiUrlPlaceholder: 'Ví dụ: https://paddleocr-server.com/layout-parsing', paddleocrApiUrlPlaceholder:
'Ví dụ: https://paddleocr-server.com/layout-parsing',
paddleocrAccessToken: 'Token truy cập AI Studio', paddleocrAccessToken: 'Token truy cập AI Studio',
paddleocrAccessTokenTip: 'Token truy cập cho API PaddleOCR (tùy chọn)', paddleocrAccessTokenTip: 'Token truy cập cho API PaddleOCR (tùy chọn)',
paddleocrAccessTokenPlaceholder: 'Token AI Studio của bạn (tùy chọn)', paddleocrAccessTokenPlaceholder: 'Token AI Studio của bạn (tùy chọn)',
@ -615,7 +616,7 @@ export default {
selectAlgorithm: 'Chọn thuật toán', selectAlgorithm: 'Chọn thuật toán',
modelNamePlaceholder: 'Ví dụ: paddleocr-from-env-1', modelNamePlaceholder: 'Ví dụ: paddleocr-from-env-1',
modelNameRequired: 'Tên mô hình là bắt buộc', modelNameRequired: 'Tên mô hình là bắt buộc',
apiUrlRequired: 'URL API PaddleOCR là bắt buộc' apiUrlRequired: 'URL API PaddleOCR là bắt buộc',
}, },
vision: 'Có hỗ trợ Tầm nhìn không?', vision: 'Có hỗ trợ Tầm nhìn không?',
ollamaLink: 'Cách tích hợp {{name}}', ollamaLink: 'Cách tích hợp {{name}}',
@ -667,10 +668,6 @@ export default {
'sa-east-1': 'South America (São Paulo)', 'sa-east-1': 'South America (São Paulo)',
'us-gov-east-1': 'AWS GovCloud (US-East)', 'us-gov-east-1': 'AWS GovCloud (US-East)',
'us-gov-west-1': 'AWS GovCloud (US-West)', 'us-gov-west-1': 'AWS GovCloud (US-West)',
addHunyuanSID: 'Hunyuan Secret ID',
HunyuanSIDMessage: 'Vui lòng nhập ID bí mật của bạn',
addHunyuanSK: 'Hunyuan Secret Key',
HunyuanSKMessage: 'Vui lòng nhập Khóa bí mật của bạn',
addTencentCloudSID: 'TencentCloud Secret ID', addTencentCloudSID: 'TencentCloud Secret ID',
TencentCloudSIDMessage: 'Vui lòng nhập ID bí mật của bạn', TencentCloudSIDMessage: 'Vui lòng nhập ID bí mật của bạn',
addTencentCloudSK: 'TencentCloud Secret Key', addTencentCloudSK: 'TencentCloud Secret Key',

View File

@ -692,10 +692,6 @@ export default {
'eu-central-1': '歐洲 (法蘭克福)', 'eu-central-1': '歐洲 (法蘭克福)',
'us-gov-west-1': 'AWS GovCloud (US-West)', 'us-gov-west-1': 'AWS GovCloud (US-West)',
'ap-southeast-2': '亞太地區 (雪梨)', 'ap-southeast-2': '亞太地區 (雪梨)',
addHunyuanSID: '混元 Secret ID',
HunyuanSIDMessage: '請輸入 Secret ID',
addHunyuanSK: '混元 Secret Key',
HunyuanSKMessage: '請輸入 Secret Key',
addTencentCloudSID: '騰訊雲 Secret ID', addTencentCloudSID: '騰訊雲 Secret ID',
TencentCloudSIDMessage: '請輸入 Secret ID', TencentCloudSIDMessage: '請輸入 Secret ID',
addTencentCloudSK: '騰訊雲 Secret Key', addTencentCloudSK: '騰訊雲 Secret Key',

View File

@ -1051,10 +1051,6 @@ General实体和关系提取提示来自 GitHub - microsoft/graphrag基于
'eu-central-1': '欧洲 (法兰克福)', 'eu-central-1': '欧洲 (法兰克福)',
'us-gov-west-1': 'AWS GovCloud (US-West)', 'us-gov-west-1': 'AWS GovCloud (US-West)',
'ap-southeast-2': '亚太地区 (悉尼)', 'ap-southeast-2': '亚太地区 (悉尼)',
addHunyuanSID: '混元 Secret ID',
HunyuanSIDMessage: '请输入 Secret ID',
addHunyuanSK: '混元 Secret Key',
HunyuanSKMessage: '请输入 Secret Key',
addTencentCloudSID: '腾讯云 Secret ID', addTencentCloudSID: '腾讯云 Secret ID',
TencentCloudSIDMessage: '请输入 Secret ID', TencentCloudSIDMessage: '请输入 Secret ID',
addTencentCloudSK: '腾讯云 Secret Key', addTencentCloudSK: '腾讯云 Secret Key',

View File

@ -206,33 +206,6 @@ export const useSubmitVolcEngine = () => {
}; };
}; };
export const useSubmitHunyuan = () => {
const { addLlm, loading } = useAddLlm();
const {
visible: HunyuanAddingVisible,
hideModal: hideHunyuanAddingModal,
showModal: showHunyuanAddingModal,
} = useSetModalState();
const onHunyuanAddingOk = useCallback(
async (payload: IAddLlmRequestBody) => {
const ret = await addLlm(payload);
if (ret === 0) {
hideHunyuanAddingModal();
}
},
[hideHunyuanAddingModal, addLlm],
);
return {
HunyuanAddingLoading: loading,
onHunyuanAddingOk,
HunyuanAddingVisible,
hideHunyuanAddingModal,
showHunyuanAddingModal,
};
};
export const useSubmitTencentCloud = () => { export const useSubmitTencentCloud = () => {
const { addLlm, loading } = useAddLlm(); const { addLlm, loading } = useAddLlm();
const { const {

View File

@ -12,7 +12,6 @@ import {
useSubmitBedrock, useSubmitBedrock,
useSubmitFishAudio, useSubmitFishAudio,
useSubmitGoogle, useSubmitGoogle,
useSubmitHunyuan,
useSubmitMinerU, useSubmitMinerU,
useSubmitOllama, useSubmitOllama,
useSubmitPaddleOCR, useSubmitPaddleOCR,
@ -27,11 +26,10 @@ import AzureOpenAIModal from './modal/azure-openai-modal';
import BedrockModal from './modal/bedrock-modal'; import BedrockModal from './modal/bedrock-modal';
import FishAudioModal from './modal/fish-audio-modal'; import FishAudioModal from './modal/fish-audio-modal';
import GoogleModal from './modal/google-modal'; import GoogleModal from './modal/google-modal';
import HunyuanModal from './modal/hunyuan-modal';
import MinerUModal from './modal/mineru-modal'; import MinerUModal from './modal/mineru-modal';
import PaddleOCRModal from './modal/paddleocr-modal';
import TencentCloudModal from './modal/next-tencent-modal'; import TencentCloudModal from './modal/next-tencent-modal';
import OllamaModal from './modal/ollama-modal'; import OllamaModal from './modal/ollama-modal';
import PaddleOCRModal from './modal/paddleocr-modal';
import SparkModal from './modal/spark-modal'; import SparkModal from './modal/spark-modal';
import VolcEngineModal from './modal/volcengine-modal'; import VolcEngineModal from './modal/volcengine-modal';
import YiyanModal from './modal/yiyan-modal'; import YiyanModal from './modal/yiyan-modal';
@ -68,14 +66,6 @@ const ModelProviders = () => {
volcAddingLoading, volcAddingLoading,
} = useSubmitVolcEngine(); } = useSubmitVolcEngine();
const {
HunyuanAddingVisible,
hideHunyuanAddingModal,
showHunyuanAddingModal,
onHunyuanAddingOk,
HunyuanAddingLoading,
} = useSubmitHunyuan();
const { const {
GoogleAddingVisible, GoogleAddingVisible,
hideGoogleAddingModal, hideGoogleAddingModal,
@ -152,7 +142,6 @@ const ModelProviders = () => {
() => ({ () => ({
[LLMFactory.Bedrock]: showBedrockAddingModal, [LLMFactory.Bedrock]: showBedrockAddingModal,
[LLMFactory.VolcEngine]: showVolcAddingModal, [LLMFactory.VolcEngine]: showVolcAddingModal,
[LLMFactory.TencentHunYuan]: showHunyuanAddingModal,
[LLMFactory.XunFeiSpark]: showSparkAddingModal, [LLMFactory.XunFeiSpark]: showSparkAddingModal,
[LLMFactory.BaiduYiYan]: showyiyanAddingModal, [LLMFactory.BaiduYiYan]: showyiyanAddingModal,
[LLMFactory.FishAudio]: showFishAudioAddingModal, [LLMFactory.FishAudio]: showFishAudioAddingModal,
@ -165,7 +154,6 @@ const ModelProviders = () => {
[ [
showBedrockAddingModal, showBedrockAddingModal,
showVolcAddingModal, showVolcAddingModal,
showHunyuanAddingModal,
showSparkAddingModal, showSparkAddingModal,
showyiyanAddingModal, showyiyanAddingModal,
showFishAudioAddingModal, showFishAudioAddingModal,
@ -259,13 +247,6 @@ const ModelProviders = () => {
loading={volcAddingLoading} loading={volcAddingLoading}
llmFactory={LLMFactory.VolcEngine} llmFactory={LLMFactory.VolcEngine}
></VolcEngineModal> ></VolcEngineModal>
<HunyuanModal
visible={HunyuanAddingVisible}
hideModal={hideHunyuanAddingModal}
onOk={onHunyuanAddingOk}
loading={HunyuanAddingLoading}
llmFactory={LLMFactory.TencentHunYuan}
></HunyuanModal>
<GoogleModal <GoogleModal
visible={GoogleAddingVisible} visible={GoogleAddingVisible}
hideModal={hideGoogleAddingModal} hideModal={hideGoogleAddingModal}

View File

@ -1,91 +0,0 @@
import {
DynamicForm,
FormFieldConfig,
FormFieldType,
} from '@/components/dynamic-form';
import { Modal } from '@/components/ui/modal/modal';
import { useCommonTranslation, useTranslate } from '@/hooks/common-hooks';
import { IModalProps } from '@/interfaces/common';
import { IAddLlmRequestBody } from '@/interfaces/request/llm';
import { FieldValues } from 'react-hook-form';
import { LLMHeader } from '../../components/llm-header';
const HunyuanModal = ({
visible,
hideModal,
onOk,
loading,
llmFactory,
}: IModalProps<IAddLlmRequestBody> & { llmFactory: string }) => {
const { t } = useTranslate('setting');
const { t: tc } = useCommonTranslation();
const fields: FormFieldConfig[] = [
{
name: 'hunyuan_sid',
label: t('addHunyuanSID'),
type: FormFieldType.Text,
required: true,
placeholder: t('HunyuanSIDMessage'),
validation: {
message: t('HunyuanSIDMessage'),
},
},
{
name: 'hunyuan_sk',
label: t('addHunyuanSK'),
type: FormFieldType.Text,
required: true,
placeholder: t('HunyuanSKMessage'),
validation: {
message: t('HunyuanSKMessage'),
},
},
];
const handleOk = async (values?: FieldValues) => {
if (!values) return;
const data = {
hunyuan_sid: values.hunyuan_sid as string,
hunyuan_sk: values.hunyuan_sk as string,
llm_factory: llmFactory,
} as unknown as IAddLlmRequestBody;
await onOk?.(data);
};
return (
<Modal
title={<LLMHeader name={llmFactory} />}
open={visible || false}
onOpenChange={(open) => !open && hideModal?.()}
maskClosable={false}
footer={<div className="p-4"></div>}
className="max-w-[600px]"
>
<DynamicForm.Root
fields={fields}
onSubmit={() => {}}
labelClassName="font-normal"
>
<div className="absolute bottom-0 right-0 left-0 flex items-center justify-end w-full gap-2 py-6 px-6">
<DynamicForm.CancelButton
handleCancel={() => {
hideModal?.();
}}
/>
<DynamicForm.SavingButton
submitLoading={loading || false}
buttonText={tc('ok')}
submitFunc={(values: FieldValues) => {
handleOk(values);
}}
/>
</div>
</DynamicForm.Root>
</Modal>
);
};
export default HunyuanModal;