From 77b8d918def9866ab3fa2515b230b0d9c342da94 Mon Sep 17 00:00:00 2001
From: CalciumIon <1808837298@qq.com>
Date: Wed, 11 Dec 2024 20:36:44 +0800
Subject: [PATCH 1/7] refactor: Simplify PersonalSetting component layout
- Moved footer content from the Card component to a separate Descriptions component for better structure.
- Maintained the display of user quota, historical consumption, and request count while improving readability.
---
web/src/components/PersonalSetting.js | 40 ++++++++-------------------
1 file changed, 11 insertions(+), 29 deletions(-)
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}
+
+
Date: Wed, 11 Dec 2024 21:06:26 +0800
Subject: [PATCH 2/7] feat: Add renderModelPriceSimple function and update
LogsTable component
- Introduced a new helper function `renderModelPriceSimple` to simplify the rendering of model price information.
- Updated the `LogsTable` component to utilize `renderModelPriceSimple`, enhancing the display of model pricing and grouping information.
- Removed the previous implementation of `renderModelPrice` from the `LogsTable` for cleaner code.
---
web/src/components/LogsTable.js | 17 +++++++----------
web/src/helpers/render.js | 13 +++++++++++++
2 files changed, 20 insertions(+), 10 deletions(-)
diff --git a/web/src/components/LogsTable.js b/web/src/components/LogsTable.js
index 28e1a1ac..e13d9633 100644
--- a/web/src/components/LogsTable.js
+++ b/web/src/components/LogsTable.js
@@ -25,7 +25,7 @@ import {
import { ITEMS_PER_PAGE } from '../constants';
import {
renderAudioModelPrice,
- renderModelPrice,
+ renderModelPrice, renderModelPriceSimple,
renderNumber,
renderQuota,
stringToColor
@@ -386,14 +386,11 @@ const LogsTable = () => {
);
}
- // let content = renderModelPrice(
- // record.prompt_tokens,
- // record.completion_tokens,
- // other.model_ratio,
- // other.model_price,
- // other.completion_ratio,
- // other.group_ratio,
- // );
+ let content = renderModelPriceSimple(
+ other.model_ratio,
+ other.model_price,
+ other.group_ratio,
+ );
return (
{
}}
style={{ maxWidth: 240 }}
>
- 调用消费
+ {content}
);
},
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,
From afb7b661ee14a5ea0e77858db6ee447c42172c6a Mon Sep 17 00:00:00 2001
From: CalciumIon <1808837298@qq.com>
Date: Wed, 11 Dec 2024 21:17:46 +0800
Subject: [PATCH 3/7] feat: Implement chat page state management in layout and
sidebar
- Added `isChatPage` state to the Style context to manage chat page layout.
- Updated `PageLayout` component to adjust padding based on the chat page state.
- Enhanced `SiderBar` component to dispatch chat page state changes when chat-related items are selected.
---
web/src/components/PageLayout.js | 2 +-
web/src/components/SiderBar.js | 5 +++++
web/src/context/Style/index.js | 4 ++++
3 files changed, 10 insertions(+), 1 deletion(-)
diff --git a/web/src/components/PageLayout.js b/web/src/components/PageLayout.js
index 06f31f06..ac9dc990 100644
--- a/web/src/components/PageLayout.js
+++ b/web/src/components/PageLayout.js
@@ -23,7 +23,7 @@ const PageLayout = () => {
diff --git a/web/src/components/SiderBar.js b/web/src/components/SiderBar.js
index 58fea10d..26570a0d 100644
--- a/web/src/components/SiderBar.js
+++ b/web/src/components/SiderBar.js
@@ -279,6 +279,11 @@ const SiderBar = () => {
}}
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 }));
}
From 379b08f691859d4e7839a2957d61c821110e8a9d Mon Sep 17 00:00:00 2001
From: CalciumIon <1808837298@qq.com>
Date: Wed, 11 Dec 2024 21:25:50 +0800
Subject: [PATCH 4/7] feat: Update user group handling in Playground component
- Enhanced the Playground component to prioritize the user's group by moving it to the front of the local group options if it exists.
- Improved user experience by ensuring the default group selection reflects the user's current group, if available.
---
web/src/pages/Playground/Playground.js | 15 ++++++++++-----
1 file changed, 10 insertions(+), 5 deletions(-)
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: '用户分组',
From 5f0322b67240550ff86eeda97c2cd1d60540c0a5 Mon Sep 17 00:00:00 2001
From: CalciumIon <1808837298@qq.com>
Date: Wed, 11 Dec 2024 21:31:29 +0800
Subject: [PATCH 5/7] feat: Add custom model input functionality in
EditTagModal
- Introduced a new input field for adding custom model names in the EditTagModal component.
- Implemented logic to handle the addition of custom models, including validation to prevent duplicates.
- Enhanced user experience by providing feedback when attempting to add existing models.
- Updated state management to reflect changes in the model options dynamically.
---
web/src/pages/Channel/EditTagModal.js | 47 +++++++++++++++++++++++++++
1 file changed, 47 insertions(+)
diff --git a/web/src/pages/Channel/EditTagModal.js b/web/src/pages/Channel/EditTagModal.js
index 2182980d..b38a7dcb 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 (
{
autoComplete="new-password"
optionList={modelOptions}
/>
+
+ 填入
+
+ }
+ placeholder="输入自定义模型名称"
+ value={customModel}
+ onChange={(value) => {
+ setCustomModel(value.trim());
+ }}
+ />
分组,留空则不更改:
From 89136dfa9ecc42c8cc32f0775f0db35e32f916e0 Mon Sep 17 00:00:00 2001
From: CalciumIon <1808837298@qq.com>
Date: Wed, 11 Dec 2024 21:33:30 +0800
Subject: [PATCH 6/7] feat: Add filtering and search functionality to model
selection in EditChannel and EditTagModal
- Implemented filter and search position options in the model selection dropdowns for both EditChannel and EditTagModal components.
- Enhanced user experience by allowing users to easily find and select models from a potentially large list.
---
web/src/pages/Channel/EditChannel.js | 2 ++
web/src/pages/Channel/EditTagModal.js | 2 ++
2 files changed, 4 insertions(+)
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 b38a7dcb..3a6eae44 100644
--- a/web/src/pages/Channel/EditTagModal.js
+++ b/web/src/pages/Channel/EditTagModal.js
@@ -259,6 +259,8 @@ const EditTagModal = (props) => {
required
multiple
selection
+ filter
+ searchPosition='dropdown'
onChange={(value) => {
handleInputChange('models', value);
}}
From 024cdb08df37290eee2380e235951fc610258740 Mon Sep 17 00:00:00 2001
From: CalciumIon <1808837298@qq.com>
Date: Wed, 11 Dec 2024 21:39:41 +0800
Subject: [PATCH 7/7] feat: Update model lists and enhance model retrieval in
Adaptor
- Refactored ModelList in the gemini constant to include new models and remove outdated ones.
- Modified the GetModelList function in the Adaptor to consolidate model lists from multiple sources, ensuring a comprehensive and updated list is returned.
- Commented out deprecated models in the vertex constants for clarity and future reference.
---
relay/channel/gemini/constant.go | 6 +++---
relay/channel/vertex/adaptor.go | 15 ++++++++++++++-
relay/channel/vertex/constants.go | 10 +++++-----
3 files changed, 22 insertions(+), 9 deletions(-)
diff --git a/relay/channel/gemini/constant.go b/relay/channel/gemini/constant.go
index 5f189f3f..dd4ee71c 100644
--- a/relay/channel/gemini/constant.go
+++ b/relay/channel/gemini/constant.go
@@ -5,9 +5,9 @@ const (
)
var ModelList = []string{
- "gemini-1.0-pro-latest", "gemini-1.0-pro-001", "gemini-1.5-pro-latest", "gemini-1.5-flash-latest", "gemini-ultra",
- "gemini-1.0-pro-vision-latest", "gemini-1.0-pro-vision-001", "gemini-1.5-pro-exp-0827", "gemini-1.5-flash-exp-0827",
- "gemini-exp-1114",
+ "gemini-1.5-pro-latest", "gemini-1.5-flash-latest", "gemini-ultra",
+ "gemini-1.5-pro-exp-0827", "gemini-1.5-flash-exp-0827",
+ "gemini-exp-1114", "gemini-exp-1206",
}
var ChannelName = "google gemini"
diff --git a/relay/channel/vertex/adaptor.go b/relay/channel/vertex/adaptor.go
index c9c9a307..1b41730d 100644
--- a/relay/channel/vertex/adaptor.go
+++ b/relay/channel/vertex/adaptor.go
@@ -176,7 +176,20 @@ func (a *Adaptor) DoResponse(c *gin.Context, resp *http.Response, info *relaycom
}
func (a *Adaptor) GetModelList() []string {
- return ModelList
+ var modelList []string
+ for i, s := range ModelList {
+ modelList = append(modelList, s)
+ ModelList[i] = s
+ }
+ for i, s := range claude.ModelList {
+ modelList = append(modelList, s)
+ claude.ModelList[i] = s
+ }
+ for i, s := range gemini.ModelList {
+ modelList = append(modelList, s)
+ gemini.ModelList[i] = s
+ }
+ return modelList
}
func (a *Adaptor) GetChannelName() string {
diff --git a/relay/channel/vertex/constants.go b/relay/channel/vertex/constants.go
index 6a31a865..c39e23d1 100644
--- a/relay/channel/vertex/constants.go
+++ b/relay/channel/vertex/constants.go
@@ -1,13 +1,13 @@
package vertex
var ModelList = []string{
- "claude-3-sonnet-20240229",
- "claude-3-opus-20240229",
- "claude-3-haiku-20240307",
- "claude-3-5-sonnet-20240620",
+ //"claude-3-sonnet-20240229",
+ //"claude-3-opus-20240229",
+ //"claude-3-haiku-20240307",
+ //"claude-3-5-sonnet-20240620",
//"gemini-1.5-pro-latest", "gemini-1.5-flash-latest",
- "gemini-1.5-pro-001", "gemini-1.5-flash-001", "gemini-pro", "gemini-pro-vision",
+ //"gemini-1.5-pro-001", "gemini-1.5-flash-001", "gemini-pro", "gemini-pro-vision",
"meta/llama3-405b-instruct-maas",
}