diff --git a/web/src/components/PersonalSetting.js b/web/src/components/PersonalSetting.js
index cb313337..38323360 100644
--- a/web/src/components/PersonalSetting.js
+++ b/web/src/components/PersonalSetting.js
@@ -363,36 +363,18 @@ const PersonalSetting = () => {
>
}
- footer={
-
-
- {renderQuota(userState?.user?.quota)}
-
-
- {renderQuota(userState?.user?.used_quota)}
-
-
- {userState.user?.request_count}
-
-
- }
>
- 可用模型
-
-
- {models.map((model) => (
- {
- copyText(model);
- }}
- >
- {model}
-
- ))}
-
-
+
+
+ {renderQuota(userState?.user?.quota)}
+
+
+ {renderQuota(userState?.user?.used_quota)}
+
+
+ {userState.user?.request_count}
+
+
{
}}
items={headerButtons}
onSelect={(key) => {
+ if (key.itemKey.toString().startsWith('chat')) {
+ styleDispatch({ type: 'SET_CHAT_PAGE', payload: true });
+ } else {
+ styleDispatch({ type: 'SET_CHAT_PAGE', payload: false });
+ }
setSelectedKeys([key.itemKey]);
}}
footer={
diff --git a/web/src/context/Style/index.js b/web/src/context/Style/index.js
index 341fa912..9b264717 100644
--- a/web/src/context/Style/index.js
+++ b/web/src/context/Style/index.js
@@ -11,6 +11,7 @@ export const StyleProvider = ({ children }) => {
const [state, setState] = useState({
isMobile: false,
showSider: false,
+ isChatPage: false,
});
const dispatch = (action) => {
@@ -25,6 +26,9 @@ export const StyleProvider = ({ children }) => {
case 'SET_MOBILE':
setState(prev => ({ ...prev, isMobile: action.payload }));
break;
+ case 'SET_CHAT_PAGE':
+ setState(prev => ({ ...prev, isChatPage: action.payload }));
+ break;
default:
setState(prev => ({ ...prev, ...action }));
}
diff --git a/web/src/helpers/render.js b/web/src/helpers/render.js
index 406d9e10..ef537eed 100644
--- a/web/src/helpers/render.js
+++ b/web/src/helpers/render.js
@@ -175,6 +175,19 @@ export function renderModelPrice(
}
}
+export function renderModelPriceSimple(
+ modelRatio,
+ modelPrice = -1,
+ groupRatio,
+) {
+ // 1 ratio = $0.002 / 1K tokens
+ if (modelPrice !== -1) {
+ return '价格:$' + modelPrice + ' * 分组:' + groupRatio;
+ } else {
+ return '模型: ' + modelRatio + ' * 分组: ' + groupRatio;
+ }
+}
+
export function renderAudioModelPrice(
inputTokens,
completionTokens,
diff --git a/web/src/pages/Channel/EditChannel.js b/web/src/pages/Channel/EditChannel.js
index 95debfd7..e6ebbd94 100644
--- a/web/src/pages/Channel/EditChannel.js
+++ b/web/src/pages/Channel/EditChannel.js
@@ -710,6 +710,8 @@ const EditChannel = (props) => {
required
multiple
selection
+ filter
+ searchPosition='dropdown'
onChange={(value) => {
handleInputChange('models', value);
}}
diff --git a/web/src/pages/Channel/EditTagModal.js b/web/src/pages/Channel/EditTagModal.js
index 2182980d..3a6eae44 100644
--- a/web/src/pages/Channel/EditTagModal.js
+++ b/web/src/pages/Channel/EditTagModal.js
@@ -16,6 +16,7 @@ const EditTagModal = (props) => {
const [groupOptions, setGroupOptions] = useState([]);
const [basicModels, setBasicModels] = useState([]);
const [fullModels, setFullModels] = useState([]);
+ const [customModel, setCustomModel] = useState('');
const originInputs = {
tag: '',
new_tag: null,
@@ -183,6 +184,40 @@ const EditTagModal = (props) => {
fetchGroups().then();
}, [visible]);
+ const addCustomModels = () => {
+ if (customModel.trim() === '') return;
+ // 使用逗号分隔字符串,然后去除每个模型名称前后的空格
+ const modelArray = customModel.split(',').map((model) => model.trim());
+
+ let localModels = [...inputs.models];
+ let localModelOptions = [...modelOptions];
+ let hasError = false;
+
+ modelArray.forEach((model) => {
+ // 检查模型是否已存在,且模型名称非空
+ if (model && !localModels.includes(model)) {
+ localModels.push(model); // 添加到模型列表
+ localModelOptions.push({
+ // 添加到下拉选项
+ key: model,
+ text: model,
+ value: model
+ });
+ } else if (model) {
+ showError('某些模型已存在!');
+ hasError = true;
+ }
+ });
+
+ if (hasError) return; // 如果有错误则终止操作
+
+ // 更新状态值
+ setModelOptions(localModelOptions);
+ setCustomModel('');
+ handleInputChange('models', localModels);
+ };
+
+
return (
{
required
multiple
selection
+ filter
+ searchPosition='dropdown'
onChange={(value) => {
handleInputChange('models', value);
}}
@@ -231,6 +268,18 @@ const EditTagModal = (props) => {
autoComplete="new-password"
optionList={modelOptions}
/>
+
+ 填入
+
+ }
+ placeholder="输入自定义模型名称"
+ value={customModel}
+ onChange={(value) => {
+ setCustomModel(value.trim());
+ }}
+ />
分组,留空则不更改:
diff --git a/web/src/pages/Playground/Playground.js b/web/src/pages/Playground/Playground.js
index 57bf11c1..00a2eded 100644
--- a/web/src/pages/Playground/Playground.js
+++ b/web/src/pages/Playground/Playground.js
@@ -103,11 +103,16 @@ const Playground = () => {
// handleInputChange('group', localGroupOptions[0].value);
if (localGroupOptions.length > 0) {
- // set default group at first
- localGroupOptions.unshift({
- label: '用户分组',
- value: '',
- });
+ // set user group at first
+ if (userState.user && userState.user.group) {
+ let userGroup = userState.user.group;
+ // Find and move user's group to the front
+ const userGroupIndex = localGroupOptions.findIndex(g => g.value === userGroup);
+ if (userGroupIndex > -1) {
+ const userGroupOption = localGroupOptions.splice(userGroupIndex, 1)[0];
+ localGroupOptions.unshift(userGroupOption);
+ }
+ }
} else {
localGroupOptions = [{
label: '用户分组',