From b7ef7fa0c2421d866d17ccb5570fdf4fbcb181fa Mon Sep 17 00:00:00 2001 From: Wenjie Zhang Date: Fri, 14 Mar 2025 03:28:53 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E5=AE=89=E5=85=A8API=E7=9A=84=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/config/__init__.py | 32 ++++++++++++++++++++++++++++++++ src/models/chat_model.py | 2 +- src/routers/base_router.py | 15 +++++++-------- 3 files changed, 40 insertions(+), 9 deletions(-) diff --git a/src/config/__init__.py b/src/config/__init__.py index d0b516c5..0682393d 100644 --- a/src/config/__init__.py +++ b/src/config/__init__.py @@ -11,6 +11,7 @@ MODEL_NAMES = _models["MODEL_NAMES"] EMBED_MODEL_INFO = _models["EMBED_MODEL_INFO"] RERANKER_LIST = _models["RERANKER_LIST"] +DEFAULT_MOCK_API = 'this_is_mock_api_key_in_frontend' class SimpleConfig(dict): @@ -174,3 +175,34 @@ class Config(SimpleConfig): json.dump(self, f, indent=4) logger.info(f"Config file {self.filename} saved") + + def get_safe_config(self): + """ + 获取安全的配置,即过滤掉 api_key + """ + + config = json.loads(str(self)) + + # 过滤掉 api_key + for model in config.get("custom_models", []): + model["api_key"] = DEFAULT_MOCK_API if model.get("api_key") else "" + + return config + + def compare_custom_models(self, value): + """ + 比较 custom_models 中的 api_key,如果输入的 api_key 与当前的 api_key 相同,则不修改 + 如果输入的 api_key 为 DEFAULT_MOCK_API,则使用当前的 api_key + """ + current_models_dict = {model["custom_id"]: model.get("api_key") for model in self.custom_models} + + for i, model in enumerate(value): + input_custom_id = model.get("custom_id") + input_api_key = model.get("api_key") + + if input_custom_id in current_models_dict: + current_api_key = current_models_dict[input_custom_id] + if input_api_key == DEFAULT_MOCK_API or input_api_key == current_api_key: + value[i]["api_key"] = current_api_key + + return value diff --git a/src/models/chat_model.py b/src/models/chat_model.py index d62da34c..fe5c9c82 100644 --- a/src/models/chat_model.py +++ b/src/models/chat_model.py @@ -58,7 +58,7 @@ class OpenModel(OpenAIBase): class CustomModel(OpenAIBase): def __init__(self, model_info): model_name = model_info["name"] - api_key = model_info["api_key"] or "custom_model" + api_key = model_info.get("api_key", "custom_model") base_url = get_docker_safe_url(model_info["api_base"]) logger.info(f"> Custom model: {model_name}, base_url: {base_url}") diff --git a/src/routers/base_router.py b/src/routers/base_router.py index 0dcbbde7..16986210 100644 --- a/src/routers/base_router.py +++ b/src/routers/base_router.py @@ -1,14 +1,10 @@ +from fastapi import Request, Body from fastapi import APIRouter base = APIRouter() -from fastapi import FastAPI, HTTPException -from fastapi.responses import JSONResponse -from fastapi import Request, Body - -from src.core import HistoryManager from src.core.startup import startup -from src.utils import logger +from src.utils import hashstr, logger @base.get("/") @@ -17,13 +13,16 @@ async def route_index(): @base.get("/config") def get_config(): - return startup.config + return startup.config.get_safe_config() @base.post("/config") async def update_config(key = Body(...), value = Body(...)): + if key == "custom_models": + value = startup.config.compare_custom_models(value) + startup.config[key] = value startup.config.save() - return startup.config + return startup.config.get_safe_config() @base.post("/restart") async def restart(): From 89046fa31fbfec5a160c4a924589c24e40aee882 Mon Sep 17 00:00:00 2001 From: Wenjie Zhang Date: Fri, 14 Mar 2025 03:29:08 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E7=9A=84=E5=89=8D=E7=AB=AF=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/assets/providers/siliconflow.png | Bin 29089 -> 2179 bytes web/src/views/SettingView.vue | 203 ++++++++++++++++------- 2 files changed, 141 insertions(+), 62 deletions(-) diff --git a/web/src/assets/providers/siliconflow.png b/web/src/assets/providers/siliconflow.png index f32fc6ebf84f0a60fabd3e0a42f27bded426931f..d54921c67bc7a161d2ddef926cba4bd29e9a57df 100644 GIT binary patch literal 2179 zcmV-}2z>X6P)Px#19L)2R0s$N+u={(0000WV@Og>004R>004l5008;` z004mK004C`008P>0026e000+ooVrmw00042P)t-sgIM;Ka`&i-__dt+!K?bv!290P z{NUC6@9O^d^#1?<|MBhq=H30!!2GkB`H*V&iD34kg7~?i`qIPv>f-(V{Quz9{i%%k zg;`rgz0uaxyh+ z^6mcB#{83Q_p+Dyu95l6xclPR{qXAko_zSRmidcf_Q$jPjAi%r^8V=G{jHJt#;)hxwRw z_~hIDrib{biundD!9M^129QZaK~#90?Vame8b=g|p=yicjf+dST8NYs4AHJMqOB&T zctMn0wb7bhq^9X5ZPWJu|58vB5!vN8yJzQ&KJ$Le^Wbyd%50$mrPk1b27{@kBB;X?2I+Mfzi#J5EpRPo}2(Ih^xphC5hS zvbR!Kt|KpI;@lDUB==cf#-h#SZSJ72kRAA3)}l=z${qM+in9ej8ZGYVv?ke-)SYpe zyWG)VFc+r;Vu9PC#l+pf8bUZlZjDI7?_PD8ac++! z_%70qGOvdHC5?s@rZ1aYB;l5CXXDY zMs0yF!#GA}u{~4gT8$QQKW|x^shy=t;u5U!20m&&`B zIg@VQR3tP;bX|=$Rovq-|3QHV>#zsUS67rLu*XyGP`!DEdgyYv>Be)=V~RV_evD!s zdwSRWw7{MsPJ=tnek@`OqW6Z?rVe@RGrtZ3%t9i%?^rETh(}HT1&Qn-A~W1k0zef& zI=?Eu1G=)fg9KPXM3_r4Afkv!i91Sw1R}y%zyOm$MD+c3d%+SSqGigY3rK`JNCYFI z8>O2fGH66J!-z1l@@@Ua;3=gSndrgUKVCDD=y-Ly`!r`{^{{eqokYHyOC7m}`10j7 z5y^hP7QE{~G%yZA)0kg&UyD#Eq^C0U8Oe=%)U}qF%nv`3YRpTX3=-n(&}EN`hb*h{ zj&-Wip!x`>MhoW_g+`IKz}+ABgL@>nm*W&G@S6O@dUsrq57y*rLrG~Rj0Sn46rr57 zA_8=e+`hvdd?y9pj}yH-{4a@a9)7zO;^0BELVOhk+VoZWf$`O2b;uoc5B&5`!zCpu zS(W!_khif=uqW+dPjkoIlbEy!cI>a5Nm-95L53j=(y}6H?ucDTNqS&~F$^5bd4$j( zMMP6h1Uhx%;7INpi5+a9Oo;p}w;<9r`pS@OM5JxUAw;q>w88;)e76#aU5Tfich9-Ukpst%POg%o@Td$J80w#1c{K6&@opBzty=g{VrbU_hR zICje3(vDOI)rq$lm69TnHqMB zm6M?Qm-0c*W;oxWgW$;p-QMM_8 z-UoTelSsk#i&Si^d;I~ZS?n-;5vbnJ>n4HbQAuW~{IGz;@w@xyu@i}U_#)7MsO7#S z1IXw5?0Y0YO>6FzQxn*veg(~9(7h_eAH6@F#SXQ%!}o|pz@%Z%+ZCO*{6>Yy8!Q%a zc=hTkLf;OBqON>+l4^Rs>ytS+)u?0w<`x=_aF#o3);I9vw~A~~i+wmCVXeMiY$wnT znkAXi71>jNpFoeq4u)g0qTDG;0lRr%NL5SEc{@>FUkg2JP5ZIeqWUb z^{)tYqi{yeZkQf5mD2^nEIac`fRlqCh)UyeA`u4RHMl7rtF;x@#`UM_DNfi~pghVa zyTrpe{r^j~M@aX3jpK(*WnY336l8&}lBF*QoZ;|j?OZitk4>(*bAQwB!3Dkvlcc}s z!ZnKj6vE~ti{(at58c-FjMan8#A5$NMj8|5>*|c-;CokIkMWX~paspbx7-Tnybac| zTh?cydVI#ehIOpf#OS);0X3UEzYye3@s%G9XI87_IHUQGw8vvj=XY1+%HPvWKf(xL z*Wp#M)|%YWdea<34nqo4nqE|$#83K63d^Vd)$kVYN&LU6%lBYsdM9yREY2xrlGSua z&dAv=KOfk=21C?cC^j0o#BPK8XPOKKgTY`h7z~C!{13Ldm@(>K*<%0z002ovPDHLk FV1jZ9fg=C_ literal 29089 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配置文件也可以在 saves/config/base.yaml 中修改

@@ -121,12 +118,12 @@ > - +
{{ item.api_base }}
-
-

{{ modelNames[item].name }}

- +
+ 模型图标 +
+
+

{{ modelNames[item].name }}

+ + 更多模型 + +
- 需配置 {{ key }} + 需配置{{ key }}
@@ -212,6 +231,8 @@ import { DeleteOutlined, EditOutlined, InfoCircleOutlined, + DownOutlined, + UpOutlined, } from '@ant-design/icons-vue'; import HeaderComponent from '@/components/HeaderComponent.vue'; import TableConfigComponent from '@/components/TableConfigComponent.vue'; @@ -228,7 +249,7 @@ const isNeedRestart = ref(false) const customModel = reactive({ modelTitle: '添加自定义模型', visible: false, - custom_id: '', // Add this line + custom_id: '', name: '', api_key: '', api_base: '', @@ -249,6 +270,9 @@ const notModelKeys = computed(() => { return Object.keys(modelStatus.value || {}).filter(key => !modelStatus.value?.[key]) }) +// 模型展开状态管理 +const expandedModels = reactive({}) + const generateRandomHash = (length) => { let chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; let hash = ''; @@ -298,49 +322,35 @@ const handleChange = (key, e) => { configStore.setConfigValue(key, e) } -const handleAddCustomModel = async () => { +const handleAddOrEditCustomModel = async () => { if (!customModel.name || !customModel.api_base) { - message.error('请填写完整模型信息') + message.error('请填写完整的模型名称和API Base信息。') return } - if (!configStore.config.custom_models) { - configStore.config.custom_models = [] - } - + let custom_models = configStore.config.custom_models || []; const model_info = { - custom_id: customModel.custom_id, + custom_id: customModel.custom_id || `${customModel.name}-${generateRandomHash(4)}`, name: customModel.name, api_key: customModel.api_key, api_base: customModel.api_base, } - if (customModel.edit_type == 'add') { - if (configStore.config.custom_models.find(item => item.custom_id == customModel.custom_id)) { - message.error('模型ID已存在') + if (customModel.edit_type === 'add') { + if (custom_models.find(item => item.custom_id === customModel.custom_id)) { + message.error('模型ID已存在') return } - const modelHash = generateRandomHash(4) - model_info.custom_id = `${customModel.name}-${modelHash}` - configStore.config.custom_models.push(model_info) + custom_models.push(model_info) } else { - configStore.config.custom_models = configStore.config.custom_models.map(item => { - if (item.custom_id == customModel.custom_id) { - if (item.name != customModel.name) { - const modelHash = generateRandomHash(4) - model_info.custom_id = `${customModel.name}-${modelHash}` - configStore.setConfigValue('model_name', model_info.custom_id) - } - return model_info - } - return item - }) + // 如果 custom_id 相同,则更新 + custom_models = custom_models.map(item => item.custom_id === customModel.custom_id ? model_info : item); } - customModel.visible = false - await configStore.setConfigValue('custom_models', configStore.config.custom_models) - message.success('添加自定义模型成功') + customModel.visible = false; + await configStore.setConfigValue('custom_models', custom_models); + message.success(customModel.edit_type === 'add' ? '模型添加成功' : '模型修改成功'); } const handleDeleteCustomModel = (custom_id) => { @@ -348,21 +358,32 @@ const handleDeleteCustomModel = (custom_id) => { configStore.setConfigValue('custom_models', updatedModels); } -const handleEditCustomModel = (item) => { +const prepareToEditCustomModel = (item) => { customModel.modelTitle = '编辑自定义模型' customModel.custom_id = item.custom_id + customModel.visible = true + customModel.edit_type = 'edit' customModel.name = item.name customModel.api_key = item.api_key customModel.api_base = item.api_base - customModel.visible = true - customModel.edit_type = 'edit' } -const handleCancelCustomModel = () => { +const prepareToAddCustomModel = () => { + customModel.modelTitle = '添加自定义模型' + customModel.edit_type = 'add' + customModel.visible = true + clearCustomModel() +} + +const clearCustomModel = () => { customModel.custom_id = '' customModel.name = '' customModel.api_key = '' customModel.api_base = '' +} + +const handleCancelCustomModel = () => { + clearCustomModel() customModel.visible = false } @@ -496,17 +517,31 @@ const sendRestart = () => { padding: 12px; .card-header { display: flex; - align-items: center; + align-items: flex-start; gap: 10px; + .model-title-container { + display: flex; + flex-direction: column; + flex: 1; + } + + .model-url { + font-size: 12px; + width: fit-content; + color: var(--gray-500); + } + .model-icon { - width: 24px; - height: 24px; + width: 40px; + height: 40px; // 灰度 filter: grayscale(100%); img { width: 100%; height: 100%; + border-radius: 4px; + border: 1px solid var(--gray-300); } &.available { @@ -514,10 +549,9 @@ const sendRestart = () => { } } - h3 { margin: 0; - font-size: 1rem; + font-size: 0.9rem; font-weight: bold; } @@ -546,12 +580,53 @@ const sendRestart = () => { } .missing-keys { + margin-top: 4px; color: var(--gray-600); + font-size: 12px; & > span { - margin-left: 10px; + margin-left: 6px; user-select: all; + background-color: var(--gray-100); + padding: 2px 6px; + border-radius: 4px; + color: var(--gray-800); } } + + .expand-button { + margin-left: auto; + height: 32px; + width: 32px; + display: flex; + align-items: center; + justify-content: center; + padding: 0; + cursor: pointer; + color: var(--gray-500); + + &:hover { + background-color: var(--gray-100); + } + + .icon-wrapper { + display: inline-flex; + transition: transform 0.5s ease; + + &.rotated { + transform: rotate(180deg); + } + } + } + } + + .card-body-wrapper { + max-height: 0; + overflow: hidden; + transition: max-height 0.5s ease-in-out; + + &.expanded { + max-height: 500px; /* 设置一个足够大的值 */ + } } .card-body { @@ -606,7 +681,7 @@ const sendRestart = () => { gap: 10px; .card-models__header { width: 100%; - height: 32px; + height: 24px; display: flex; justify-content: flex-start; align-items: center; @@ -631,6 +706,10 @@ const sendRestart = () => { .api_base { font-size: 12px; color: var(--gray-600); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + width: 100%; } &:hover { From 294f4b99338d0448f68668ef9abebc579d34e8d0 Mon Sep 17 00:00:00 2001 From: Wenjie Zhang Date: Fri, 14 Mar 2025 03:50:33 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BA=86UI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/assets/providers/siliconflow.png | Bin 2179 -> 20847 bytes web/src/views/SettingView.vue | 28 ++++++++++++++--------- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/web/src/assets/providers/siliconflow.png b/web/src/assets/providers/siliconflow.png index d54921c67bc7a161d2ddef926cba4bd29e9a57df..bc8db4aaa477557cd0546dd9fcf53f1f411e97ed 100644 GIT binary patch literal 20847 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 FV1jZ9fg=C_ diff --git a/web/src/views/SettingView.vue b/web/src/views/SettingView.vue index f3c493e4..57171bf7 100644 --- a/web/src/views/SettingView.vue +++ b/web/src/views/SettingView.vue @@ -164,7 +164,7 @@

{{ modelNames[item].name }}

- 更多模型 +

{{ modelNames[item].name }}

- 更多模型 +
@@ -270,8 +270,11 @@ const notModelKeys = computed(() => { return Object.keys(modelStatus.value || {}).filter(key => !modelStatus.value?.[key]) }) -// 模型展开状态管理 -const expandedModels = reactive({}) +// 模型展开状态管理,默认展开 +const expandedModels = reactive(modelKeys.value.reduce((acc, key) => { + acc[key] = true + return acc +}, {})) const generateRandomHash = (length) => { let chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; @@ -517,12 +520,14 @@ const sendRestart = () => { padding: 12px; .card-header { display: flex; - align-items: flex-start; + align-items: center; gap: 10px; .model-title-container { display: flex; - flex-direction: column; + flex-direction: row; + align-items: center; + gap: 10px; flex: 1; } @@ -533,8 +538,9 @@ const sendRestart = () => { } .model-icon { - width: 40px; - height: 40px; + width: 28px; + height: 28px; + // 灰度 filter: grayscale(100%); img { @@ -610,7 +616,7 @@ const sendRestart = () => { .icon-wrapper { display: inline-flex; - transition: transform 0.5s ease; + transition: transform 0.2s ease; &.rotated { transform: rotate(180deg); @@ -622,10 +628,10 @@ const sendRestart = () => { .card-body-wrapper { max-height: 0; overflow: hidden; - transition: max-height 0.5s ease-in-out; + transition: max-height 0.2s ease-out; // 先快后慢 &.expanded { - max-height: 500px; /* 设置一个足够大的值 */ + max-height: 700px; /* 设置一个足够大的值 */ } }