update streaming for Gemini and Mistral and update list gemini models and list mistral models commands
This commit is contained in:
+29
-25
@@ -2,7 +2,6 @@ import {ChatCommand} from "../base/chat-command";
|
|||||||
import {Message} from "typescript-telegram-bot-api";
|
import {Message} from "typescript-telegram-bot-api";
|
||||||
import {
|
import {
|
||||||
collectReplyChainText,
|
collectReplyChainText,
|
||||||
editMessageText,
|
|
||||||
escapeMarkdownV2Text,
|
escapeMarkdownV2Text,
|
||||||
extractText,
|
extractText,
|
||||||
logError,
|
logError,
|
||||||
@@ -56,7 +55,7 @@ export class GeminiChat extends ChatCommand {
|
|||||||
|
|
||||||
let waitMessage: Message;
|
let waitMessage: Message;
|
||||||
|
|
||||||
const startTime = new Date().getSeconds();
|
const startTime = Date.now();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
waitMessage = await bot.sendMessage({
|
waitMessage = await bot.sendMessage({
|
||||||
@@ -73,15 +72,27 @@ export class GeminiChat extends ChatCommand {
|
|||||||
contents: chatContent,
|
contents: chatContent,
|
||||||
});
|
});
|
||||||
|
|
||||||
let messageText = "";
|
let currentText = "";
|
||||||
let shouldBreak = false;
|
let shouldBreak = false;
|
||||||
let diff = 0;
|
|
||||||
|
|
||||||
const editor = startIntervalEditor({
|
const editor = startIntervalEditor({
|
||||||
intervalMs: 4500,
|
intervalMs: 4500,
|
||||||
getText: () => messageText,
|
getText: () => currentText,
|
||||||
editFn: async (text) => {
|
editFn: async (text) => {
|
||||||
await editMessageText(chatId, waitMessage.message_id, escapeMarkdownV2Text(text), "Markdown");
|
await bot.editMessageText(
|
||||||
|
{
|
||||||
|
chat_id: chatId,
|
||||||
|
message_id: waitMessage.message_id,
|
||||||
|
text: escapeMarkdownV2Text(text),
|
||||||
|
parse_mode: "Markdown"
|
||||||
|
}
|
||||||
|
).catch(logError);
|
||||||
|
|
||||||
|
console.log("editMessageText", text);
|
||||||
|
|
||||||
|
waitMessage.reply_to_message = msg;
|
||||||
|
waitMessage.text = text;
|
||||||
|
await MessageStore.put(waitMessage);
|
||||||
},
|
},
|
||||||
onStop: async () => {
|
onStop: async () => {
|
||||||
}
|
}
|
||||||
@@ -91,42 +102,35 @@ export class GeminiChat extends ChatCommand {
|
|||||||
try {
|
try {
|
||||||
for await (const chunk of stream) {
|
for await (const chunk of stream) {
|
||||||
const text = chunk.text;
|
const text = chunk.text;
|
||||||
|
currentText += text;
|
||||||
|
|
||||||
const length = (messageText + text).length;
|
if (currentText.length > 4096) {
|
||||||
if (length > 4096) {
|
currentText = currentText.slice(0, 4093) + "...";
|
||||||
messageText = messageText.slice(0, 4093) + "...";
|
|
||||||
shouldBreak = true;
|
shouldBreak = true;
|
||||||
} else {
|
|
||||||
messageText += text;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
console.log("messageText", currentText);
|
||||||
|
console.log("length", currentText.length);
|
||||||
|
|
||||||
if (shouldBreak) {
|
if (shouldBreak) {
|
||||||
console.log("messageText", messageText);
|
|
||||||
console.log("length", length);
|
|
||||||
console.log("break", true);
|
console.log("break", true);
|
||||||
|
|
||||||
diff = Math.abs(new Date().getSeconds() - startTime);
|
|
||||||
await editor.tick();
|
|
||||||
await editor.stop();
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log("messageText", messageText);
|
|
||||||
console.log("length", messageText.length);
|
|
||||||
|
|
||||||
diff = Math.abs(new Date().getSeconds() - startTime);
|
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
await editor.tick();
|
await editor.tick();
|
||||||
await editor.stop();
|
await editor.stop();
|
||||||
|
|
||||||
console.log("time", diff);
|
if (!shouldBreak) {
|
||||||
console.log("ended", true);
|
console.log("ended", true);
|
||||||
|
}
|
||||||
|
|
||||||
|
const diff = Math.abs(Date.now() - startTime) / 1000.0;
|
||||||
|
console.log("time", diff);
|
||||||
|
|
||||||
waitMessage.reply_to_message = msg;
|
waitMessage.reply_to_message = msg;
|
||||||
waitMessage.text = messageText;
|
waitMessage.text = currentText;
|
||||||
await MessageStore.put(waitMessage);
|
await MessageStore.put(waitMessage);
|
||||||
|
|
||||||
await oldReplyToMessage(waitMessage, `⏱️ ${diff}s`);
|
await oldReplyToMessage(waitMessage, `⏱️ ${diff}s`);
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|||||||
@@ -18,15 +18,15 @@ export class GeminiListModels extends ChatCommand {
|
|||||||
|
|
||||||
const modelsString = listResponse.page
|
const modelsString = listResponse.page
|
||||||
.sort((a, b) => a.name.localeCompare(b.name))
|
.sort((a, b) => a.name.localeCompare(b.name))
|
||||||
.map(e => `\`${e.name}\``)
|
.map(e => `${e.name}`)
|
||||||
.join("\n");
|
.join("\n");
|
||||||
|
|
||||||
const text = "Доступные модели:\n\n" + modelsString;
|
const text = "Доступные модели:\n\n" + "<blockquote expandable>" + modelsString + "</blockquote>";
|
||||||
|
|
||||||
await replyToMessage({
|
await replyToMessage({
|
||||||
message: msg,
|
message: msg,
|
||||||
text: text,
|
text: text,
|
||||||
parse_mode: "Markdown"
|
parse_mode: "HTML"
|
||||||
});
|
});
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error(e);
|
console.error(e);
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import {Requirement} from "../base/requirement";
|
|||||||
import {Message} from "typescript-telegram-bot-api";
|
import {Message} from "typescript-telegram-bot-api";
|
||||||
import {
|
import {
|
||||||
collectReplyChainText,
|
collectReplyChainText,
|
||||||
editMessageText,
|
|
||||||
escapeMarkdownV2Text,
|
escapeMarkdownV2Text,
|
||||||
extractText,
|
extractText,
|
||||||
logError,
|
logError,
|
||||||
@@ -63,7 +62,7 @@ export class MistralChat extends ChatCommand {
|
|||||||
|
|
||||||
let waitMessage: Message;
|
let waitMessage: Message;
|
||||||
|
|
||||||
const startTime = new Date().getSeconds();
|
const startTime = Date.now();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
waitMessage = await bot.sendMessage({
|
waitMessage = await bot.sendMessage({
|
||||||
@@ -80,15 +79,27 @@ export class MistralChat extends ChatCommand {
|
|||||||
messages: chatMessages as any
|
messages: chatMessages as any
|
||||||
});
|
});
|
||||||
|
|
||||||
let messageText = "";
|
let currentText = "";
|
||||||
let shouldBreak = false;
|
let shouldBreak = false;
|
||||||
let diff = 0;
|
|
||||||
|
|
||||||
const editor = startIntervalEditor({
|
const editor = startIntervalEditor({
|
||||||
intervalMs: 4500,
|
intervalMs: 4500,
|
||||||
getText: () => messageText,
|
getText: () => currentText,
|
||||||
editFn: async (text) => {
|
editFn: async (text) => {
|
||||||
await editMessageText(chatId, waitMessage.message_id, escapeMarkdownV2Text(text), "Markdown");
|
await bot.editMessageText(
|
||||||
|
{
|
||||||
|
chat_id: chatId,
|
||||||
|
message_id: waitMessage.message_id,
|
||||||
|
text: escapeMarkdownV2Text(text),
|
||||||
|
parse_mode: "Markdown"
|
||||||
|
}
|
||||||
|
).catch(logError);
|
||||||
|
|
||||||
|
console.log("editMessageText", text);
|
||||||
|
|
||||||
|
waitMessage.reply_to_message = msg;
|
||||||
|
waitMessage.text = text;
|
||||||
|
await MessageStore.put(waitMessage);
|
||||||
},
|
},
|
||||||
onStop: async () => {
|
onStop: async () => {
|
||||||
}
|
}
|
||||||
@@ -97,56 +108,42 @@ export class MistralChat extends ChatCommand {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
for await (const chunk of stream) {
|
for await (const chunk of stream) {
|
||||||
const text = chunk.data.choices[0].delta.content;
|
|
||||||
console.log("chunk", chunk);
|
console.log("chunk", chunk);
|
||||||
|
|
||||||
const length = (messageText + text).length;
|
const text = chunk.data.choices[0].delta.content;
|
||||||
if (length > 4096) {
|
currentText += text;
|
||||||
messageText = messageText.slice(0, 4093) + "...";
|
|
||||||
|
if (currentText.length > 4096) {
|
||||||
|
currentText = currentText.slice(0, 4093) + "...";
|
||||||
shouldBreak = true;
|
shouldBreak = true;
|
||||||
} else {
|
|
||||||
messageText += text;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
console.log("messageText", currentText);
|
||||||
|
console.log("length", currentText.length);
|
||||||
|
|
||||||
if (shouldBreak) {
|
if (shouldBreak) {
|
||||||
console.log("messageText", messageText);
|
|
||||||
console.log("length", length);
|
|
||||||
console.log("break", true);
|
console.log("break", true);
|
||||||
|
|
||||||
diff = Math.abs(new Date().getSeconds() - startTime);
|
|
||||||
await editor.tick();
|
|
||||||
await editor.stop();
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log("messageText", messageText);
|
|
||||||
console.log("length", messageText.length);
|
|
||||||
|
|
||||||
diff = Math.abs(new Date().getSeconds() - startTime);
|
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
await editor.tick();
|
await editor.tick();
|
||||||
await editor.stop();
|
await editor.stop();
|
||||||
|
|
||||||
console.log("time", diff);
|
if (!shouldBreak) {
|
||||||
console.log("ended", true);
|
console.log("ended", true);
|
||||||
|
}
|
||||||
|
|
||||||
|
const diff = Math.abs(Date.now() - startTime) / 1000.0;
|
||||||
|
console.log("time", diff);
|
||||||
|
|
||||||
waitMessage.reply_to_message = msg;
|
waitMessage.reply_to_message = msg;
|
||||||
waitMessage.text = messageText;
|
waitMessage.text = currentText;
|
||||||
MessageStore.put(waitMessage);
|
await MessageStore.put(waitMessage);
|
||||||
|
|
||||||
await oldReplyToMessage(waitMessage, `⏱️ ${diff}s`);
|
await oldReplyToMessage(waitMessage, `⏱️ ${diff}s`);
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(error);
|
console.error(error);
|
||||||
|
|
||||||
// if (error instanceof ApiError) {
|
|
||||||
// if (error.status === 429) {
|
|
||||||
// await replyToMessage(waitMessage, "На сегодня всё, лимиты закончились.").catch(logError);
|
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
await oldReplyToMessage(waitMessage, `Произошла ошибка!\n${error.toString()}`).catch(logError);
|
await oldReplyToMessage(waitMessage, `Произошла ошибка!\n${error.toString()}`).catch(logError);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,16 +18,15 @@ export class MistralListModels extends ChatCommand {
|
|||||||
|
|
||||||
const modelsString = listResponse.data
|
const modelsString = listResponse.data
|
||||||
.sort((a, b) => a.name.localeCompare(b.name))
|
.sort((a, b) => a.name.localeCompare(b.name))
|
||||||
.map(e => `\`${e.name}\``)
|
.map(e => `${e.id}`)
|
||||||
.join("\n");
|
.join("\n");
|
||||||
|
|
||||||
const text = "Доступные модели:\n\n" + modelsString;
|
const text = "Доступные модели:\n\n" + "<blockquote expandable>" + modelsString + "</blockquote>";
|
||||||
|
|
||||||
await replyToMessage({
|
await replyToMessage({
|
||||||
chat_id: msg.chat.id,
|
message: msg,
|
||||||
text: text,
|
text: text,
|
||||||
parse_mode: "Markdown",
|
parse_mode: "HTML"
|
||||||
message: msg
|
|
||||||
});
|
});
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error(e);
|
console.error(e);
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import {ChatCommand} from "../base/chat-command";
|
import {ChatCommand} from "../base/chat-command";
|
||||||
import {Message} from "typescript-telegram-bot-api";
|
import {Message} from "typescript-telegram-bot-api";
|
||||||
import {ollama} from "../index";
|
import {ollama} from "../index";
|
||||||
import {logError, oldReplyToMessage, sendMessage} from "../util/utils";
|
import {logError, oldReplyToMessage, replyToMessage} from "../util/utils";
|
||||||
import {Requirements} from "../base/requirements";
|
import {Requirements} from "../base/requirements";
|
||||||
import {Requirement} from "../base/requirement";
|
import {Requirement} from "../base/requirement";
|
||||||
|
|
||||||
@@ -14,18 +14,19 @@ export class OllamaListModels extends ChatCommand {
|
|||||||
async execute(msg: Message): Promise<void> {
|
async execute(msg: Message): Promise<void> {
|
||||||
try {
|
try {
|
||||||
const listResponse = await ollama.list();
|
const listResponse = await ollama.list();
|
||||||
|
console.log(listResponse);
|
||||||
|
|
||||||
const modelsString = listResponse.models
|
const modelsString = listResponse.models
|
||||||
.sort((a, b) => a.name.localeCompare(b.name))
|
.sort((a, b) => a.name.localeCompare(b.name))
|
||||||
.map(e => `\`${e.model}\``)
|
.map(e => `${e.model}`)
|
||||||
.join("\n");
|
.join("\n");
|
||||||
|
|
||||||
const message = "Доступные модели:\n\n" + modelsString;
|
const text = "Доступные модели:\n\n" + "<blockquote expandable>" + modelsString + "</blockquote>";
|
||||||
|
|
||||||
await sendMessage({
|
await replyToMessage({
|
||||||
chat_id: msg.chat.id,
|
message: msg,
|
||||||
text: message,
|
text: text,
|
||||||
parse_mode: "Markdown",
|
parse_mode: "HTML"
|
||||||
});
|
});
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error(e);
|
console.error(e);
|
||||||
|
|||||||
Reference in New Issue
Block a user