Skip to content

Commit

Permalink
perf: improve OpenAI error toast
Browse files Browse the repository at this point in the history
  • Loading branch information
tisfeng committed Mar 17, 2023
1 parent 4b6a81e commit e889757
Showing 1 changed file with 94 additions and 94 deletions.
188 changes: 94 additions & 94 deletions src/translation/openAI/openai.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
* @author: tisfeng
* @createTime: 2023-03-14 22:11
* @lastEditor: tisfeng
* @lastEditTime: 2023-03-17 10:27
* @lastEditTime: 2023-03-17 11:10
* @fileName: openai.ts
*
* Copyright (c) 2023 by ${git_name}, All Rights Reserved.
Expand All @@ -16,94 +16,6 @@ import { getTypeErrorInfo } from "../../utils";
import { AppKeyStore } from "./../../preferences";
import { fetchSSE } from "./utils";

// Use axios to request openai api.
export function requestOpenAITextTranslate(queryWordInfo: QueryWordInfo): Promise<QueryTypeResult> {
// console.warn(`---> start request OpenAI`);

const url = "https://api.openai.com/v1/chat/completions";
// const prompt = `translate from English to Chinese:\n\n"No level of alcohol consumption is safe for our health." =>`;
const prompt = `translate from ${queryWordInfo.fromLanguage} to ${queryWordInfo.toLanguage}:\n\n"${queryWordInfo.word}" =>`;
const message = [
{
role: "system",
content: "You are a faithful translation assistant that can only translate text and cannot interpret it.",
},
{
role: "user",
content: prompt,
},
];

const params = {
model: "gpt-3.5-turbo",
messages: message,
temperature: 0,
max_tokens: 2000,
top_p: 1.0,
frequency_penalty: 1,
presence_penalty: 1,
};

const openAIAPIKey = AppKeyStore.openAIAPIKey;
const headers = {
"Content-Type": "application/json",
Authorization: `Bearer ${openAIAPIKey}`,
};

const type = TranslationType.OpenAI;

return new Promise((resolve, reject) => {
// Post request is too slow, we need to use server-send-event to improve performance.
axios
.post(url, params, {
headers,
})
.then((response) => {
const { data } = response;
// console.warn(`---> openai response: ${JSON.stringify(data)}`);

const { choices } = data;
if (choices.length === 0) {
const error = new Error("No result.");
reject(error);
return;
}

let result = choices[0].message.content.trim() as string;
// remove prefix " and suffix "
result = result.replace(/^"(.*)"$/, "$1") as string;

console.warn(`---> openai result: ${result}`);
resolve({
type,
queryWordInfo,
translations: [result],
result: {
translatedText: result,
},
});
})
.catch((error: AxiosError) => {
if (error.message === "canceled") {
console.log(`---> openai canceled`);
return reject(undefined);
}

console.error(`---> OpenAI translate error: ${error}`);
console.error("OpenAI error response: ", error.response);
let errorInfo = getTypeErrorInfo(type, error);
if (openAIAPIKey.trim().length === 0) {
errorInfo = {
type: type,
code: `401`,
message: `No OpenAI API key.`,
};
}
reject(errorInfo);
});
});
}

export function requestOpenAIStreamTranslate(queryWordInfo: QueryWordInfo): Promise<QueryTypeResult> {
console.warn(`---> start request OpenAI`);

Expand Down Expand Up @@ -202,11 +114,100 @@ export function requestOpenAIStreamTranslate(queryWordInfo: QueryWordInfo): Prom

resolve(openAIResult);
},
onError: (error) => {
console.error(`---> OpenAI translate error: ${error}`);
onError: (err) => {
if (err.message === "canceled") {
console.log(`---> caiyun canceled`);
return reject(undefined);
}

console.error(`---> OpenAI error: ${JSON.stringify(err)}`);

let errorMessage = err.error.message ?? "Unknown error";
console.warn(`openAIAPIKey: ${openAIAPIKey}`);
if (openAIAPIKey.trim().length === 0) {
errorMessage = `No OpenAI API key.`;
}
const errorInfo = {
type: type,
code: `401`,
message: errorMessage,
};
reject(errorInfo);
},
});
});
}

// Use axios to request openai api.
export function requestOpenAITextTranslate(queryWordInfo: QueryWordInfo): Promise<QueryTypeResult> {
// console.warn(`---> start request OpenAI`);

const url = "https://api.openai.com/v1/chat/completions";
// const prompt = `translate from English to Chinese:\n\n"No level of alcohol consumption is safe for our health." =>`;
const prompt = `translate from ${queryWordInfo.fromLanguage} to ${queryWordInfo.toLanguage}:\n\n"${queryWordInfo.word}" =>`;
const message = [
{
role: "system",
content: "You are a faithful translation assistant that can only translate text and cannot interpret it.",
},
{
role: "user",
content: prompt,
},
];

const params = {
model: "gpt-3.5-turbo",
messages: message,
temperature: 0,
max_tokens: 2000,
top_p: 1.0,
frequency_penalty: 1,
presence_penalty: 1,
};

const openAIAPIKey = AppKeyStore.openAIAPIKey;
const headers = {
"Content-Type": "application/json",
Authorization: `Bearer ${openAIAPIKey}`,
};

const type = TranslationType.OpenAI;

return new Promise((resolve, reject) => {
// Post request is too slow, we need to use server-send-event to improve performance.
axios
.post(url, params, {
headers,
})
.then((response) => {
const { data } = response;
// console.warn(`---> openai response: ${JSON.stringify(data)}`);

const { choices } = data;
if (choices.length === 0) {
const error = new Error("No result.");
reject(error);
return;
}

let result = choices[0].message.content.trim() as string;
// remove prefix " and suffix "
result = result.replace(/^"(.*)"$/, "$1") as string;

console.warn(`---> openai result: ${result}`);
resolve({
type,
queryWordInfo,
translations: [result],
result: {
translatedText: result,
},
});
})
.catch((error: AxiosError) => {
if (error.message === "canceled") {
console.log(`---> caiyun canceled`);
console.log(`---> openai canceled`);
return reject(undefined);
}

Expand All @@ -221,7 +222,6 @@ export function requestOpenAIStreamTranslate(queryWordInfo: QueryWordInfo): Prom
};
}
reject(errorInfo);
},
});
});
});
}

0 comments on commit e889757

Please sign in to comment.