From 3a67c0ce65655997716546474c9c8e40d89c46bd Mon Sep 17 00:00:00 2001 From: xzeldon Date: Mon, 27 Nov 2023 16:31:44 +0300 Subject: [PATCH] introduce prompt translation (yandex translate) --- package-lock.json | 3 ++- package.json | 2 +- src/bot.ts | 14 ++++++++++- src/translate.ts | 59 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 75 insertions(+), 3 deletions(-) create mode 100644 src/translate.ts diff --git a/package-lock.json b/package-lock.json index 24b1cce..f58ab19 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,9 +1,10 @@ { - "name": "fooocos3", + "name": "fooocos-telegram-bot", "lockfileVersion": 3, "requires": true, "packages": { "": { + "name": "fooocos-telegram-bot", "dependencies": { "@grammyjs/runner": "^2.0.3", "@grammyjs/transformer-throttler": "^1.2.1", diff --git a/package.json b/package.json index a64245b..71b1b1f 100644 --- a/package.json +++ b/package.json @@ -30,4 +30,4 @@ "pino": "^8.16.2", "pino-pretty": "^10.2.3" } -} \ No newline at end of file +} diff --git a/src/bot.ts b/src/bot.ts index f256ae5..1412066 100644 --- a/src/bot.ts +++ b/src/bot.ts @@ -1,5 +1,6 @@ import { logger } from "#root/logger.js"; import { predict } from "#root/predict.js"; +import { Language, translate } from "#root/translate.js"; import { downloadImage, isFooocosAlive, uploadPhoto } from "#root/utils.js"; import { apiThrottler } from "@grammyjs/transformer-throttler"; import { Bot, Context, InlineKeyboard, InlineQueryResultBuilder, InputMediaBuilder } from "grammy"; @@ -56,7 +57,18 @@ async function handleChosenInlineResult(ctx: Context) { activeTasks.set(userId, true); - const gen = predict(prompt); + let translatedPrompt; + + try { + translatedPrompt = await translate(prompt, Language.en, Language.auto); + } catch (err) { + logger.warn(err, "prompt translation error"); + translatedPrompt = prompt; + } + + logger.trace({ prompt, translatedPrompt }); + + const gen = predict(translatedPrompt); for await (const state of gen) { if (state.status === "RUNNING") { diff --git a/src/translate.ts b/src/translate.ts new file mode 100644 index 0000000..93e1e43 --- /dev/null +++ b/src/translate.ts @@ -0,0 +1,59 @@ +import { randomUUID } from 'crypto'; + +// https://yandex.com/dev/translate/doc/en/concepts/api-overview +export enum Language { + auto = '', + zh_cn = 'zh', + zh_tw = 'zh', + en = 'en', + ja = 'ja', + ko = 'ko', + fr = 'fr', + es = 'es', + ru = 'ru', + de = 'de', + it = 'it', + tr = 'tr', + pt_pt = 'pt', + pt_br = 'pt', + vi = 'vi', + id = 'id', + th = 'th', + ms = 'ms', + ar = 'ar', + hi = 'hi', + nb_no = 'no', + nn_no = 'no', + fa = 'fa', +} + +export async function translate(text: string, to: Language, from: Language) { + const url = 'https://translate.yandex.net/api/v1/tr.json/translate'; + const query = new URLSearchParams({ + id: randomUUID().replaceAll('-', '') + '-0-0', + srv: 'android', + }); + + const res = await fetch(`${url}?${query}`, { + method: 'POST', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + }, + body: new URLSearchParams({ + source_lang: from, + target_lang: to, + text + }), + }); + + if (res.ok) { + const result = await res.json(); + if (result.text) { + return result.text[0]; + } else { + throw JSON.stringify(result); + } + } else { + throw `Http Request Error\nHttp Status: ${res.status}\n${await res.text()}`; + } +} \ No newline at end of file