From 08ab0e8891b96ba7221f10f72387d4472449083c Mon Sep 17 00:00:00 2001 From: josc146 Date: Wed, 7 Aug 2024 13:58:01 +0800 Subject: [PATCH] WIP, custom API Modes --- src/components/ConversationCard/index.jsx | 11 +-- src/config/index.mjs | 96 ++++++++++++++--------- src/popup/sections/ApiModes.jsx | 8 +- src/popup/sections/GeneralPart.jsx | 55 ++++++------- src/services/init-session.mjs | 7 +- src/services/wrappers.mjs | 9 ++- src/utils/crop-text.mjs | 6 +- src/utils/model-name-convert.mjs | 28 ++++++- 8 files changed, 132 insertions(+), 88 deletions(-) diff --git a/src/components/ConversationCard/index.jsx b/src/components/ConversationCard/index.jsx index 0661859..138824f 100644 --- a/src/components/ConversationCard/index.jsx +++ b/src/components/ConversationCard/index.jsx @@ -382,7 +382,7 @@ function ConversationCard(props) { onChange={(e) => { let apiMode = null let modelName = 'customModel' - if (e.target.value !== -1) { + if (e.target.value !== '-1') { apiMode = apiModes[e.target.value] modelName = apiModeToModelName(apiMode) } @@ -390,7 +390,7 @@ function ConversationCard(props) { ...session, modelName, apiMode, - aiName: modelNameToDesc(modelName, t), + aiName: modelNameToDesc(apiMode ? apiModeToModelName(apiMode) : modelName, t), } if (config.autoRegenAfterSwitchModel && conversationItemData.length > 0) getRetryFn(newSession)() @@ -401,17 +401,14 @@ function ConversationCard(props) { const modelName = apiModeToModelName(apiMode) const desc = modelNameToDesc(modelName, t) if (desc) { - let selected - if (isApiModeSelected(apiMode, session)) selected = true - else selected = session.modelName === modelName return ( - ) } })} - diff --git a/src/config/index.mjs b/src/config/index.mjs index 174fcaf..50f0af9 100644 --- a/src/config/index.mjs +++ b/src/config/index.mjs @@ -1,7 +1,7 @@ import { defaults } from 'lodash-es' import Browser from 'webextension-polyfill' import { isMobile } from '../utils/is-mobile.mjs' -import { modelNameToDesc } from '../utils/model-name-convert.mjs' +import { isInApiModeGroup, modelNameToDesc } from '../utils/model-name-convert.mjs' import { t } from 'i18next' export const TriggerMode = { @@ -458,53 +458,77 @@ export function getNavigatorLanguage() { return navigator.language.substring(0, 2) } -export function isUsingOpenAiApiKey(configOrSession) { - return ( - gptApiModelKeys.includes(configOrSession.modelName) || - chatgptApiModelKeys.includes(configOrSession.modelName) - ) +export function isUsingChatgptWebModel(configOrSession) { + return isInApiModeGroup(chatgptWebModelKeys, configOrSession) +} + +export function isUsingClaudeWebModel(configOrSession) { + return isInApiModeGroup(claudeWebModelKeys, configOrSession) +} + +export function isUsingMoonshotWebModel(configOrSession) { + return isInApiModeGroup(moonshotWebModelKeys, configOrSession) +} + +export function isUsingBingWebModel(configOrSession) { + return isInApiModeGroup(bingWebModelKeys, configOrSession) } export function isUsingMultiModeModel(configOrSession) { - return bingWebModelKeys.includes(configOrSession.modelName) + return isInApiModeGroup(bingWebModelKeys, configOrSession) +} + +export function isUsingGeminiWebModel(configOrSession) { + return isInApiModeGroup(bardWebModelKeys, configOrSession) +} + +export function isUsingChatgptApiModel(configOrSession) { + return isInApiModeGroup(chatgptApiModelKeys, configOrSession) +} + +export function isUsingGptCompletionApiModel(configOrSession) { + return isInApiModeGroup(gptApiModelKeys, configOrSession) +} + +export function isUsingOpenAiApiModel(configOrSession) { + return isUsingChatgptApiModel(configOrSession) || isUsingGptCompletionApiModel(configOrSession) +} + +export function isUsingClaudeApiModel(configOrSession) { + return isInApiModeGroup(claudeApiModelKeys, configOrSession) +} + +export function isUsingMoonshotApiModel(configOrSession) { + return isInApiModeGroup(moonshotApiModelKeys, configOrSession) +} + +export function isUsingChatGLMApiModel(configOrSession) { + return isInApiModeGroup(chatglmApiModelKeys, configOrSession) +} + +export function isUsingOllamaApiModel(configOrSession) { + return isInApiModeGroup(ollamaApiModelKeys, configOrSession) +} + +export function isUsingAzureOpenAiApiModel(configOrSession) { + return isInApiModeGroup(azureOpenAiApiModelKeys, configOrSession) +} + +export function isUsingGithubThirdPartyApiModel(configOrSession) { + return isInApiModeGroup(githubThirdPartyApiModelKeys, configOrSession) } export function isUsingCustomModel(configOrSession) { - return customApiModelKeys.includes(configOrSession.modelName) -} - -export function isUsingOllamaModel(configOrSession) { - return ollamaApiModelKeys.includes(configOrSession.modelName) -} - -export function isUsingChatGLMApi(configOrSession) { - return chatglmApiModelKeys.includes(configOrSession.modelName) -} - -export function isUsingMoonshotApi(configOrSession) { - return moonshotApiModelKeys.includes(configOrSession.modelName) + return isInApiModeGroup(customApiModelKeys, configOrSession) } +/** + * @deprecated + */ export function isUsingCustomNameOnlyModel(configOrSession) { return configOrSession.modelName === 'poeAiWebCustom' } -export function isUsingAzureOpenAi(configOrSession) { - return azureOpenAiApiModelKeys.includes(configOrSession.modelName) -} - -export function isUsingClaudeApi(configOrSession) { - return claudeApiModelKeys.includes(configOrSession.modelName) -} - -export function isUsingMoonshotWeb(configOrSession) { - return moonshotWebModelKeys.includes(configOrSession.modelName) -} - -export function isUsingGithubThirdPartyApi(configOrSession) { - return githubThirdPartyApiModelKeys.includes(configOrSession.modelName) -} - export async function getPreferredLanguageKey() { const config = await getUserConfig() if (config.preferredLanguage === 'auto') return config.userLanguage diff --git a/src/popup/sections/ApiModes.jsx b/src/popup/sections/ApiModes.jsx index 7178d82..9020aa1 100644 --- a/src/popup/sections/ApiModes.jsx +++ b/src/popup/sections/ApiModes.jsx @@ -50,7 +50,7 @@ export function ApiModes({ config, updateConfig }) { ]) const updateWhenApiModeDisabled = (apiMode) => { - if (isApiModeSelected(apiMode, config) || config.modelName === apiModeToModelName(apiMode)) + if (isApiModeSelected(apiMode, config)) updateConfig({ modelName: apiModeStringArray.includes(config.modelName) && @@ -82,11 +82,7 @@ export function ApiModes({ config, updateConfig }) { }) } else { const apiMode = apiModes[editingIndex] - if ( - isApiModeSelected(apiMode, config) || - config.modelName === apiModeToModelName(apiMode) // there is a minor bug here, but it's not a big issue - ) - updateConfig({ apiMode: editingApiMode }) + if (isApiModeSelected(apiMode, config)) updateConfig({ apiMode: editingApiMode }) const customApiModes = [...apiModes] customApiModes[editingIndex] = editingApiMode updateConfig({ activeApiModes: [], customApiModes }) diff --git a/src/popup/sections/GeneralPart.jsx b/src/popup/sections/GeneralPart.jsx index cfd8ef8..3859970 100644 --- a/src/popup/sections/GeneralPart.jsx +++ b/src/popup/sections/GeneralPart.jsx @@ -9,19 +9,19 @@ import { apiModeToModelName, } from '../../utils/index.mjs' import { - isUsingOpenAiApiKey, - isUsingAzureOpenAi, - isUsingChatGLMApi, - isUsingClaudeApi, + isUsingOpenAiApiModel, + isUsingAzureOpenAiApiModel, + isUsingChatGLMApiModel, + isUsingClaudeApiModel, isUsingCustomModel, isUsingCustomNameOnlyModel, - isUsingOllamaModel, - isUsingGithubThirdPartyApi, + isUsingOllamaApiModel, + isUsingGithubThirdPartyApiModel, isUsingMultiModeModel, ModelMode, ThemeMode, TriggerMode, - isUsingMoonshotApi, + isUsingMoonshotApiModel, Models, } from '../../config/index.mjs' import Browser from 'webextension-polyfill' @@ -172,20 +172,20 @@ export function GeneralPart({ config, updateConfig, setTabIndex }) { )} - {isUsingOpenAiApiKey(config) && ( + {isUsingOpenAiApiModel(config) && ( )} - {isUsingOllamaModel(config) && ( + {isUsingOllamaApiModel(config) && ( )} - {isUsingAzureOpenAi(config) && ( + {isUsingAzureOpenAiApiModel(config) && ( )} - {isUsingClaudeApi(config) && ( + {isUsingClaudeApiModel(config) && ( )} - {isUsingChatGLMApi(config) && ( + {isUsingChatGLMApiModel(config) && ( )} - {isUsingMoonshotApi(config) && ( + {isUsingMoonshotApiModel(config) && ( )} - {isUsingOllamaModel(config) && ( + {isUsingOllamaApiModel(config) && (
{t('Keep-Alive Time') + ':'}
)} - {isUsingOllamaModel(config) && ( + {isUsingOllamaApiModel(config) && ( )} - {isUsingOllamaModel(config) && ( + {isUsingOllamaApiModel(config) && ( )} - {isUsingAzureOpenAi(config) && ( + {isUsingAzureOpenAiApiModel(config) && ( )} - {isUsingAzureOpenAi(config) && ( + {isUsingAzureOpenAiApiModel(config) && ( )} - {isUsingGithubThirdPartyApi(config) && ( + {isUsingGithubThirdPartyApiModel(config) && ( { return Math.min(Math.max(v, min), max) @@ -36,7 +36,9 @@ export async function cropText( tiktoken = true, ) { const userConfig = await getUserConfig() - const k = modelNameToDesc(userConfig.modelName).match(/[- (]*([0-9]+)k/)?.[1] + const k = modelNameToDesc( + userConfig.apiMode ? apiModeToModelName(userConfig.apiMode) : userConfig.modelName, + ).match(/[- (]*([0-9]+)k/)?.[1] if (k) { maxLength = Number(k) * 1000 maxLength -= 100 + clamp(userConfig.maxResponseTokenLength, 1, maxLength - 1000) diff --git a/src/utils/model-name-convert.mjs b/src/utils/model-name-convert.mjs index 50d0aff..a5e2f60 100644 --- a/src/utils/model-name-convert.mjs +++ b/src/utils/model-name-convert.mjs @@ -47,9 +47,7 @@ export function isCustomModelName(modelName) { export function modelNameToApiMode(modelName) { const presetPart = modelNameToPresetPart(modelName) - const found = - Object.entries(ModelGroups).find(([k]) => presetPart === k) || - Object.entries(ModelGroups).find(([, g]) => g.value.includes(presetPart)) + const found = getModelNameGroup(presetPart) if (found) { const [groupName] = found const isCustom = isCustomModelName(modelName) @@ -107,7 +105,29 @@ export function getApiModesStringArrayFromConfig(config, onlyActive) { } export function isApiModeSelected(apiMode, configOrSession) { + return configOrSession.apiMode + ? JSON.stringify(configOrSession.apiMode) === JSON.stringify(apiMode) + : configOrSession.modelName === apiModeToModelName(apiMode) +} + +export function getModelNameGroup(modelName) { + const presetPart = modelNameToPresetPart(modelName) return ( - configOrSession.apiMode && JSON.stringify(configOrSession.apiMode) === JSON.stringify(apiMode) + Object.entries(ModelGroups).find(([k]) => presetPart === k) || + Object.entries(ModelGroups).find(([, g]) => g.value.includes(presetPart)) ) } + +export function getApiModeGroup(apiMode) { + return getModelNameGroup(apiModeToModelName(apiMode)) +} + +export function isInApiModeGroup(apiModeGroup, configOrSession) { + let foundGroup + if (configOrSession.apiMode) foundGroup = getApiModeGroup(configOrSession.apiMode) + else foundGroup = getModelNameGroup(configOrSession.modelName) + + if (!foundGroup) return false + const [, groupValue] = foundGroup + return groupValue === apiModeGroup +}