diff --git a/src/services/apis/azure-openai-api.mjs b/src/services/apis/azure-openai-api.mjs index 13f78c9..f532831 100644 --- a/src/services/apis/azure-openai-api.mjs +++ b/src/services/apis/azure-openai-api.mjs @@ -10,7 +10,7 @@ import { isEmpty } from 'lodash-es' * @param {Session} session */ export async function generateAnswersWithAzureOpenaiApi(port, question, session) { - const { controller, messageListener } = setAbortController(port) + const { controller, messageListener, disconnectListener } = setAbortController(port) const config = await getUserConfig() const prompt = getConversationPairs( @@ -60,9 +60,11 @@ export async function generateAnswersWithAzureOpenaiApi(port, question, session) async onStart() {}, async onEnd() { port.onMessage.removeListener(messageListener) + port.onDisconnect.removeListener(disconnectListener) }, async onError(resp) { port.onMessage.removeListener(messageListener) + port.onDisconnect.removeListener(disconnectListener) if (resp instanceof Error) throw resp const error = await resp.json().catch(() => ({})) throw new Error( diff --git a/src/services/apis/bard-web.mjs b/src/services/apis/bard-web.mjs index 1ca79d7..95445ff 100644 --- a/src/services/apis/bard-web.mjs +++ b/src/services/apis/bard-web.mjs @@ -8,7 +8,7 @@ import Bard from '../clients/bard' * @param {string} cookies */ export async function generateAnswersWithBardWebApi(port, question, session, cookies) { - // const { controller, messageListener } = setAbortController(port) + // const { controller, messageListener, disconnectListener } = setAbortController(port) const bot = new Bard(cookies) // eslint-disable-next-line @@ -18,9 +18,11 @@ export async function generateAnswersWithBardWebApi(port, question, session, coo pushRecord(session, question, answer) console.debug('conversation history', { content: session.conversationRecords }) // port.onMessage.removeListener(messageListener) + // port.onDisconnect.removeListener(disconnectListener) port.postMessage({ answer: answer, done: true, session: session }) } catch (err) { // port.onMessage.removeListener(messageListener) + // port.onDisconnect.removeListener(disconnectListener) throw err } } diff --git a/src/services/apis/bing-web.mjs b/src/services/apis/bing-web.mjs index 00695c7..46cba5e 100644 --- a/src/services/apis/bing-web.mjs +++ b/src/services/apis/bing-web.mjs @@ -16,7 +16,7 @@ export async function generateAnswersWithBingWebApi( accessToken, sydneyMode = false, ) { - const { controller, messageListener } = setAbortController(port) + const { controller, messageListener, disconnectListener } = setAbortController(port) const config = await getUserConfig() let modelMode if (session.modelName.includes('-')) modelMode = session.modelName.split('-')[1] @@ -59,6 +59,7 @@ export async function generateAnswersWithBingWebApi( }) .catch((err) => { port.onMessage.removeListener(messageListener) + port.onDisconnect.removeListener(disconnectListener) throw err }) @@ -87,5 +88,6 @@ export async function generateAnswersWithBingWebApi( pushRecord(session, question, answer) console.debug('conversation history', { content: session.conversationRecords }) port.onMessage.removeListener(messageListener) + port.onDisconnect.removeListener(disconnectListener) port.postMessage({ answer: answer, done: true, session: session }) } diff --git a/src/services/apis/chatgpt-web.mjs b/src/services/apis/chatgpt-web.mjs index 6324454..67ee05e 100644 --- a/src/services/apis/chatgpt-web.mjs +++ b/src/services/apis/chatgpt-web.mjs @@ -60,12 +60,13 @@ export async function generateAnswersWithChatgptWebApi(port, question, session, session.parentMessageId = uuidv4() } - const { controller, messageListener } = setAbortController(port, null, () => { + const { controller, messageListener, disconnectListener } = setAbortController(port, null, () => { if (session.autoClean) deleteConversation(accessToken, session.conversationId) }) const models = await getModels(accessToken).catch(() => { port.onMessage.removeListener(messageListener) + port.onDisconnect.removeListener(disconnectListener) }) console.debug('models', models) const config = await getUserConfig() @@ -141,9 +142,11 @@ export async function generateAnswersWithChatgptWebApi(port, question, session, }, async onEnd() { port.onMessage.removeListener(messageListener) + port.onDisconnect.removeListener(disconnectListener) }, async onError(resp) { port.onMessage.removeListener(messageListener) + port.onDisconnect.removeListener(disconnectListener) if (resp instanceof Error) throw resp if (resp.status === 403) { throw new Error('CLOUDFLARE') diff --git a/src/services/apis/custom-api.mjs b/src/services/apis/custom-api.mjs index d85dd25..fbbf1a6 100644 --- a/src/services/apis/custom-api.mjs +++ b/src/services/apis/custom-api.mjs @@ -19,7 +19,7 @@ import { getCustomApiPromptBase, pushRecord, setAbortController } from './shared * @param {string} modelName */ export async function generateAnswersWithCustomApi(port, question, session, apiKey, modelName) { - const { controller, messageListener } = setAbortController(port) + const { controller, messageListener, disconnectListener } = setAbortController(port) const config = await getUserConfig() const prompt = getConversationPairs( @@ -73,9 +73,11 @@ export async function generateAnswersWithCustomApi(port, question, session, apiK async onStart() {}, async onEnd() { port.onMessage.removeListener(messageListener) + port.onDisconnect.removeListener(disconnectListener) }, async onError(resp) { port.onMessage.removeListener(messageListener) + port.onDisconnect.removeListener(disconnectListener) if (resp instanceof Error) throw resp const error = await resp.json().catch(() => ({})) throw new Error(!isEmpty(error) ? JSON.stringify(error) : `${resp.status} ${resp.statusText}`) diff --git a/src/services/apis/openai-api.mjs b/src/services/apis/openai-api.mjs index e721de6..b486981 100644 --- a/src/services/apis/openai-api.mjs +++ b/src/services/apis/openai-api.mjs @@ -25,7 +25,7 @@ export async function generateAnswersWithGptCompletionApi( apiKey, modelName, ) { - const { controller, messageListener } = setAbortController(port) + const { controller, messageListener, disconnectListener } = setAbortController(port) const config = await getUserConfig() const prompt = @@ -74,9 +74,11 @@ export async function generateAnswersWithGptCompletionApi( async onStart() {}, async onEnd() { port.onMessage.removeListener(messageListener) + port.onDisconnect.removeListener(disconnectListener) }, async onError(resp) { port.onMessage.removeListener(messageListener) + port.onDisconnect.removeListener(disconnectListener) if (resp instanceof Error) throw resp const error = await resp.json().catch(() => ({})) throw new Error(!isEmpty(error) ? JSON.stringify(error) : `${resp.status} ${resp.statusText}`) @@ -92,7 +94,7 @@ export async function generateAnswersWithGptCompletionApi( * @param {string} modelName */ export async function generateAnswersWithChatgptApi(port, question, session, apiKey, modelName) { - const { controller, messageListener } = setAbortController(port) + const { controller, messageListener, disconnectListener } = setAbortController(port) const config = await getUserConfig() const prompt = getConversationPairs( @@ -143,9 +145,11 @@ export async function generateAnswersWithChatgptApi(port, question, session, api async onStart() {}, async onEnd() { port.onMessage.removeListener(messageListener) + port.onDisconnect.removeListener(disconnectListener) }, async onError(resp) { port.onMessage.removeListener(messageListener) + port.onDisconnect.removeListener(disconnectListener) if (resp instanceof Error) throw resp const error = await resp.json().catch(() => ({})) throw new Error(!isEmpty(error) ? JSON.stringify(error) : `${resp.status} ${resp.statusText}`) diff --git a/src/services/apis/poe-web.mjs b/src/services/apis/poe-web.mjs index eb88fa8..db7fbfa 100644 --- a/src/services/apis/poe-web.mjs +++ b/src/services/apis/poe-web.mjs @@ -9,10 +9,16 @@ import PoeAiClient from '../clients/poe/index.mjs' */ export async function generateAnswersWithPoeWebApi(port, question, session, modelName) { const bot = new PoeAiClient(session.poe_chatId) - const { messageListener } = setAbortController(port, () => { - bot.breakMsg() - bot.close() - }) + const { messageListener, disconnectListener } = setAbortController( + port, + () => { + bot.close() + }, + () => { + bot.breakMsg() + bot.close() + }, + ) let answer = '' await bot @@ -29,12 +35,15 @@ export async function generateAnswersWithPoeWebApi(port, question, session, mode pushRecord(session, question, answer) console.debug('conversation history', { content: session.conversationRecords }) port.onMessage.removeListener(messageListener) + if (session.conversationRecords.length > 1) + port.onDisconnect.removeListener(disconnectListener) port.postMessage({ answer: answer, done: true, session: session }) bot.close() }, ) .catch((err) => { port.onMessage.removeListener(messageListener) + port.onDisconnect.removeListener(disconnectListener) bot.close() throw err }) diff --git a/src/services/apis/shared.mjs b/src/services/apis/shared.mjs index 7380915..8a915f4 100644 --- a/src/services/apis/shared.mjs +++ b/src/services/apis/shared.mjs @@ -36,7 +36,7 @@ export function setAbortController(port, onStop, onDisconnect) { } port.onDisconnect.addListener(disconnectListener) - return { controller, messageListener } + return { controller, messageListener, disconnectListener } } export function pushRecord(session, question, answer) { diff --git a/src/services/apis/waylaidwanderer-api.mjs b/src/services/apis/waylaidwanderer-api.mjs index 4813b37..a5797e2 100644 --- a/src/services/apis/waylaidwanderer-api.mjs +++ b/src/services/apis/waylaidwanderer-api.mjs @@ -9,7 +9,7 @@ import { isEmpty } from 'lodash-es' * @param {Session} session */ export async function generateAnswersWithWaylaidwandererApi(port, question, session) { - const { controller, messageListener } = setAbortController(port) + const { controller, messageListener, disconnectListener } = setAbortController(port) const config = await getUserConfig() @@ -65,9 +65,11 @@ export async function generateAnswersWithWaylaidwandererApi(port, question, sess async onStart() {}, async onEnd() { port.onMessage.removeListener(messageListener) + port.onDisconnect.removeListener(disconnectListener) }, async onError(resp) { port.onMessage.removeListener(messageListener) + port.onDisconnect.removeListener(disconnectListener) if (resp instanceof Error) throw resp const error = await resp.json().catch(() => ({})) throw new Error(!isEmpty(error) ? JSON.stringify(error) : `${resp.status} ${resp.statusText}`)