update streaming for Gemini and Mistral and update list gemini models and list mistral models commands

This commit is contained in:
2026-01-28 12:29:52 +03:00
parent 854981cf6e
commit 458e56dcb4
5 changed files with 76 additions and 75 deletions
+29 -25
View File
@@ -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();
if (!shouldBreak) {
console.log("ended", true);
}
const diff = Math.abs(Date.now() - startTime) / 1000.0;
console.log("time", diff); console.log("time", diff);
console.log("ended", true);
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) {
+3 -3
View File
@@ -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);
+32 -35
View File
@@ -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();
if (!shouldBreak) {
console.log("ended", true);
}
const diff = Math.abs(Date.now() - startTime) / 1000.0;
console.log("time", diff); console.log("time", diff);
console.log("ended", true);
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);
} }
} }
+4 -5
View File
@@ -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);
+8 -7
View File
@@ -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);