WIP, custom API Modes

This commit is contained in:
josc146
2024-08-07 19:53:00 +08:00
parent 3d89ddd5bf
commit 1d8bcceefd
7 changed files with 78 additions and 111 deletions
+58 -86
View File
@@ -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)
}
}
+7 -3
View File
@@ -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,
+1 -3
View File
@@ -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,
)
}
+9 -2
View File
@@ -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
+2 -9
View File
@@ -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)
}
-4
View File
@@ -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',
+1 -4
View File
@@ -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)