Files
NemesisAI/TelegramBot/Program.cs
2024-12-25 21:38:26 +01:00

54 lines
1.9 KiB
C#

using System.ClientModel;
using System.ClientModel.Primitives;
using Telegram.Bot;
using Telegram.Bot.Types;
using Telegram.Bot.Types.Enums;
using LMStudio;
using OpenAI;
using OpenAI.Chat;
string baseUrl = Environment.GetEnvironmentVariable("LMSTUDIO_BASE_URL") ?? "http://lmstudio:8001";
string model = Environment.GetEnvironmentVariable("LMSTUDIO_MODEL") ?? string.Empty;
string apiKey = Environment.GetEnvironmentVariable("LMSTUDIO_API_KEY") ?? string.Empty;
var lmsclient = new ModelConnection(baseUrl, model, apiKey);
Dictionary<long, LMStudio.Chat> lmsChats = new();
var options = new OpenAIClientOptions() {
Endpoint = new(baseUrl),
NetworkTimeout = new TimeSpan(0, 0, 30)
};
var openAiApiKey = new ApiKeyCredential(apiKey);
var openAiClient = new OpenAIClient(openAiApiKey, options);
string token = Environment.GetEnvironmentVariable("TELEGRAM_BOT_TOKEN") ?? string.Empty;
using var cts = new CancellationTokenSource();
var bot = new TelegramBotClient(token, cancellationToken:cts.Token);
var me = bot.GetMe();
bot.OnMessage += OnMessage;
Console.ReadLine();
cts.Cancel();
async Task OnMessage(Message msg, UpdateType type)
{
//Discard any message that is not a text message
if (msg.Type != MessageType.Text) return;
//Check if the message contains the bot's username or a reply to a message sent by the bot
if (msg.Text!.Contains(me.Result.Username!, StringComparison.OrdinalIgnoreCase) ||
msg.ReplyToMessage != null && msg.ReplyToMessage.From!.Id == me.Result.Id) {
//Check if the chat is already in the dictionary
if (!lmsChats.ContainsKey(msg.Chat.Id))
AddChatToDictionary(msg.Chat.Id);
lmsChats[msg.Chat.Id].CreateChatCompletion(msg.Text);
}
}
void AddChatToDictionary(long id) {
//Create a new chat object
var chat = new LMStudio.Chat(lmsclient);
//add the entry to the dictionary
lmsChats.Add(id, chat);
}