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", }