diff --git a/src/background/index.mjs b/src/background/index.mjs index 9affc6c..00bab8c 100644 --- a/src/background/index.mjs +++ b/src/background/index.mjs @@ -16,24 +16,23 @@ import { generateAnswersWithClaudeApi } from '../services/apis/claude-api.mjs' import { generateAnswersWithChatGLMApi } from '../services/apis/chatglm-api.mjs' import { generateAnswersWithWaylaidwandererApi } from '../services/apis/waylaidwanderer-api.mjs' import { - azureOpenAiApiModelKeys, - claudeApiModelKeys, - chatglmApiModelKeys, - bardWebModelKeys, - bingWebModelKeys, - chatgptApiModelKeys, - chatgptWebModelKeys, - claudeWebModelKeys, - moonshotWebModelKeys, - customApiModelKeys, - ollamaApiModelKeys, defaultConfig, getUserConfig, - githubThirdPartyApiModelKeys, - gptApiModelKeys, - poeWebModelKeys, setUserConfig, - moonshotApiModelKeys, + isUsingChatgptWebModel, + isUsingBingWebModel, + isUsingGptCompletionApiModel, + isUsingChatgptApiModel, + isUsingCustomModel, + isUsingOllamaApiModel, + isUsingAzureOpenAiApiModel, + isUsingClaudeApiModel, + isUsingChatGLMApiModel, + isUsingGithubThirdPartyApiModel, + isUsingGeminiWebModel, + isUsingClaudeWebModel, + isUsingMoonshotApiModel, + isUsingMoonshotWebModel, } from '../config/index.mjs' import '../_locales/i18n' import { openUrl } from '../utils/open-url' @@ -50,6 +49,7 @@ import { generateAnswersWithBardWebApi } from '../services/apis/bard-web.mjs' import { generateAnswersWithClaudeWebApi } from '../services/apis/claude-web.mjs' import { generateAnswersWithMoonshotCompletionApi } from '../services/apis/moonshot-api.mjs' import { generateAnswersWithMoonshotWebApi } from '../services/apis/moonshot-web.mjs' +import { isUsingModelName } from '../utils/model-name-convert.mjs' function setPortProxy(port, proxyTabId) { port.proxy = Browser.tabs.connect(proxyTabId) @@ -77,7 +77,26 @@ function setPortProxy(port, proxyTabId) { async function executeApi(session, port, config) { console.debug('modelName', session.modelName) console.debug('apiMode', session.apiMode) - if (chatgptWebModelKeys.includes(session.modelName)) { + if (isUsingCustomModel(session)) { + if (!session.apiMode) + await generateAnswersWithCustomApi( + port, + session.question, + session, + config.customModelApiUrl, + config.customApiKey, + config.customModelName, + ) + else + await generateAnswersWithCustomApi( + port, + session.question, + session, + session.apiMode.customUrl, + session.apiMode.apiKey, + session.apiMode.customName, + ) + } else if (isUsingChatgptWebModel(session)) { let tabId if ( config.chatgptTabId && @@ -95,87 +114,40 @@ async function executeApi(session, port, config) { const accessToken = await getChatGptAccessToken() await generateAnswersWithChatgptWebApi(port, session.question, session, accessToken) } - } else if ( - // `.some` for multi mode models. e.g. bingFree4-balanced - bingWebModelKeys.some((n) => session.modelName.includes(n)) - ) { + } else if (isUsingClaudeWebModel(session)) { + const sessionKey = await getClaudeSessionKey() + await generateAnswersWithClaudeWebApi(port, session.question, session, sessionKey) + } else if (isUsingMoonshotWebModel(session)) { + await generateAnswersWithMoonshotWebApi(port, session.question, session, config) + } else if (isUsingBingWebModel(session)) { const accessToken = await getBingAccessToken() - if (session.modelName.includes('bingFreeSydney')) + if (isUsingModelName('bingFreeSydney', session)) await generateAnswersWithBingWebApi(port, session.question, session, accessToken, true) else await generateAnswersWithBingWebApi(port, session.question, session, accessToken) - } else if (gptApiModelKeys.includes(session.modelName)) { - await generateAnswersWithGptCompletionApi( - port, - session.question, - session, - config.apiKey, - session.modelName, - ) - } else if (chatgptApiModelKeys.includes(session.modelName)) { - await generateAnswersWithChatgptApi( - port, - session.question, - session, - config.apiKey, - session.modelName, - ) - } else if (customApiModelKeys.includes(session.modelName)) { - await generateAnswersWithCustomApi( - port, - session.question, - session, - config.customApiKey, - config.customModelName, - ) - } else if (ollamaApiModelKeys.includes(session.modelName)) { - await generateAnswersWithOllamaApi(port, session.question, session) - } else if (azureOpenAiApiModelKeys.includes(session.modelName)) { - await generateAnswersWithAzureOpenaiApi(port, session.question, session) - } else if (claudeApiModelKeys.includes(session.modelName)) { - await generateAnswersWithClaudeApi(port, session.question, session) - } else if (chatglmApiModelKeys.includes(session.modelName)) { - await generateAnswersWithChatGLMApi(port, session.question, session, session.modelName) - } else if (githubThirdPartyApiModelKeys.includes(session.modelName)) { - await generateAnswersWithWaylaidwandererApi(port, session.question, session) - } else if (poeWebModelKeys.includes(session.modelName)) { - throw new Error('Due to the new verification, Poe Web API is currently not supported.') - // if (session.modelName === 'poeAiWebCustom') - // await generateAnswersWithPoeWebApi(port, session.question, session, config.poeCustomBotName) - // else - // await generateAnswersWithPoeWebApi( - // port, - // session.question, - // session, - // Models[session.modelName].value, - // ) - } else if (bardWebModelKeys.includes(session.modelName)) { + } else if (isUsingGeminiWebModel(session)) { const cookies = await getBardCookies() await generateAnswersWithBardWebApi(port, session.question, session, cookies) - } else if (claudeWebModelKeys.includes(session.modelName)) { - const sessionKey = await getClaudeSessionKey() - await generateAnswersWithClaudeWebApi( - port, - session.question, - session, - sessionKey, - session.modelName, - ) - } else if (moonshotApiModelKeys.includes(session.modelName)) { + } else if (isUsingChatgptApiModel(session)) { + await generateAnswersWithChatgptApi(port, session.question, session, config.apiKey) + } else if (isUsingClaudeApiModel(session)) { + await generateAnswersWithClaudeApi(port, session.question, session) + } else if (isUsingMoonshotApiModel(session)) { await generateAnswersWithMoonshotCompletionApi( port, session.question, session, config.moonshotApiKey, - session.modelName, - ) - } else if (moonshotWebModelKeys.includes(session.modelName)) { - await generateAnswersWithMoonshotWebApi( - port, - session.question, - session, - config, - session.modelName, ) + } else if (isUsingChatGLMApiModel(session)) { + await generateAnswersWithChatGLMApi(port, session.question, session) + } else if (isUsingOllamaApiModel(session)) { + await generateAnswersWithOllamaApi(port, session.question, session) + } else if (isUsingAzureOpenAiApiModel(session)) { + await generateAnswersWithAzureOpenaiApi(port, session.question, session) + } else if (isUsingGptCompletionApiModel(session)) { + await generateAnswersWithGptCompletionApi(port, session.question, session, config.apiKey) + } else if (isUsingGithubThirdPartyApiModel(session)) { + await generateAnswersWithWaylaidwandererApi(port, session.question, session) } } diff --git a/src/services/apis/azure-openai-api.mjs b/src/services/apis/azure-openai-api.mjs index e7255dd..9ed2716 100644 --- a/src/services/apis/azure-openai-api.mjs +++ b/src/services/apis/azure-openai-api.mjs @@ -3,6 +3,7 @@ import { getChatSystemPromptBase, pushRecord, setAbortController } from './share import { getConversationPairs } from '../../utils/get-conversation-pairs.mjs' import { fetchSSE } from '../../utils/fetch-sse.mjs' import { isEmpty } from 'lodash-es' +import { getModelValue } from '../../utils/model-name-convert.mjs' /** * @param {Runtime.Port} port @@ -12,6 +13,8 @@ import { isEmpty } from 'lodash-es' export async function generateAnswersWithAzureOpenaiApi(port, question, session) { const { controller, messageListener, disconnectListener } = setAbortController(port) const config = await getUserConfig() + let model = getModelValue(session) + if (!model) model = config.azureDeploymentName const prompt = getConversationPairs( session.conversationRecords.slice(-config.maxConversationContextLength), @@ -22,9 +25,10 @@ export async function generateAnswersWithAzureOpenaiApi(port, question, session) let answer = '' await fetchSSE( - `${config.azureEndpoint.replace(/\/$/, '')}/openai/deployments/${ - config.azureDeploymentName - }/chat/completions?api-version=2024-02-01`, + `${config.azureEndpoint.replace( + /\/$/, + '', + )}/openai/deployments/${model}/chat/completions?api-version=2024-02-01`, { method: 'POST', signal: controller.signal, diff --git a/src/services/apis/chatglm-api.mjs b/src/services/apis/chatglm-api.mjs index e3540f4..cc6671d 100644 --- a/src/services/apis/chatglm-api.mjs +++ b/src/services/apis/chatglm-api.mjs @@ -6,9 +6,8 @@ import { generateAnswersWithChatgptApiCompat } from './openai-api.mjs' * @param {Runtime.Port} port * @param {string} question * @param {Session} session - * @param {string} modelName */ -export async function generateAnswersWithChatGLMApi(port, question, session, modelName) { +export async function generateAnswersWithChatGLMApi(port, question, session) { const baseUrl = 'https://open.bigmodel.cn/api/paas/v4' const config = await getUserConfig() return generateAnswersWithChatgptApiCompat( @@ -17,6 +16,5 @@ export async function generateAnswersWithChatGLMApi(port, question, session, mod question, session, getToken(config.chatglmApiKey), - modelName, ) } diff --git a/src/services/apis/custom-api.mjs b/src/services/apis/custom-api.mjs index 4a6b8a4..32b4577 100644 --- a/src/services/apis/custom-api.mjs +++ b/src/services/apis/custom-api.mjs @@ -15,10 +15,18 @@ import { pushRecord, setAbortController } from './shared.mjs' * @param {Browser.Runtime.Port} port * @param {string} question * @param {Session} session + * @param {string} apiUrl * @param {string} apiKey * @param {string} modelName */ -export async function generateAnswersWithCustomApi(port, question, session, apiKey, modelName) { +export async function generateAnswersWithCustomApi( + port, + question, + session, + apiUrl, + apiKey, + modelName, +) { const { controller, messageListener, disconnectListener } = setAbortController(port) const config = await getUserConfig() @@ -28,7 +36,6 @@ export async function generateAnswersWithCustomApi(port, question, session, apiK ) // prompt.unshift({ role: 'system', content: await getCustomApiPromptBase() }) prompt.push({ role: 'user', content: question }) - const apiUrl = config.customModelApiUrl let answer = '' let finished = false diff --git a/src/services/apis/moonshot-api.mjs b/src/services/apis/moonshot-api.mjs index 07fe4f7..c3cc187 100644 --- a/src/services/apis/moonshot-api.mjs +++ b/src/services/apis/moonshot-api.mjs @@ -5,15 +5,8 @@ import { generateAnswersWithChatgptApiCompat } from './openai-api.mjs' * @param {string} question * @param {Session} session * @param {string} apiKey - * @param {string} modelName */ -export async function generateAnswersWithMoonshotCompletionApi( - port, - question, - session, - apiKey, - modelName, -) { +export async function generateAnswersWithMoonshotCompletionApi(port, question, session, apiKey) { const baseUrl = 'https://api.moonshot.cn/v1' - return generateAnswersWithChatgptApiCompat(baseUrl, port, question, session, apiKey, modelName) + return generateAnswersWithChatgptApiCompat(baseUrl, port, question, session, apiKey) } diff --git a/src/services/apis/ollama-api.mjs b/src/services/apis/ollama-api.mjs index 3659505..a59bf18 100644 --- a/src/services/apis/ollama-api.mjs +++ b/src/services/apis/ollama-api.mjs @@ -14,10 +14,6 @@ export async function generateAnswersWithOllamaApi(port, question, session) { question, session, config.ollamaApiKey, - 'ollamaModel', - { - model: config.ollamaModelName, - }, ).then(() => fetch(config.ollamaEndpoint + '/api/generate', { method: 'POST', diff --git a/src/services/apis/openai-api.mjs b/src/services/apis/openai-api.mjs index 4a5efb5..1bda6f8 100644 --- a/src/services/apis/openai-api.mjs +++ b/src/services/apis/openai-api.mjs @@ -99,9 +99,8 @@ export async function generateAnswersWithGptCompletionApi(port, question, sessio * @param {string} question * @param {Session} session * @param {string} apiKey - * @param {string} modelName */ -export async function generateAnswersWithChatgptApi(port, question, session, apiKey, modelName) { +export async function generateAnswersWithChatgptApi(port, question, session, apiKey) { const config = await getUserConfig() return generateAnswersWithChatgptApiCompat( config.customOpenAiApiUrl + '/v1', @@ -109,7 +108,6 @@ export async function generateAnswersWithChatgptApi(port, question, session, api question, session, apiKey, - modelName, ) } @@ -119,7 +117,6 @@ export async function generateAnswersWithChatgptApiCompat( question, session, apiKey, - modelName, extraBody = {}, ) { const { controller, messageListener, disconnectListener } = setAbortController(port)