BotSharp/Platforms/BotSharp.Platform.OpenAi/GPT-4.ExtractGptResponse.cs
2023-05-20 16:31:31 -05:00

85 lines
2.8 KiB
C#

using Abstraction.Enums;
using Microsoft.Extensions.DependencyInjection;
using OpenQA.Selenium;
using OpenQA.Selenium.Support.UI;
using StackExchange.Redis;
using System;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
namespace ChatGPT;
public partial class GPT4
{
private async Task ExtractResponseAsync(string sessionId, LlmResponseExtractType format)
{
var redis = _serviceProvider.GetRequiredService<IConnectionMultiplexer>();
var db = redis.GetDatabase();
var tokenSource = new CancellationTokenSource();
tokenSource.CancelAfter(TimeSpan.FromSeconds(60));
var token = tokenSource.Token;
Console.WriteLine();
await Task.Run(async () =>
{
while (!token.IsCancellationRequested )
{
Thread.Sleep(100);
var regenerateResponse = _driver.FindElements(By.XPath("//div[text()='Regenerate response']"));
var end = regenerateResponse.Count > 0 ? "1" : "0";
var element = _driver.FindElements(By.CssSelector("main div.text-base")).Last();
var content = element.GetAttribute("innerText").Trim();
if (string.IsNullOrEmpty(content))
{
continue;
}
await db.StreamAddAsync(sessionId, new[]
{
new NameValueEntry("content", content),
new NameValueEntry("end", end)
});
if(end == "1")
{
tokenSource.Cancel();
}
}
});
}
private string ExtractGptResponse(LlmResponseExtractType format)
{
new WebDriverWait(_driver, TimeSpan.FromSeconds(180))
.Until(drv => drv.FindElement(By.XPath("//div[text()='Regenerate response']")));
var element = _driver.FindElements(By.CssSelector("main div.text-base")).Last();
if (string.IsNullOrEmpty(element.GetAttribute("innerText")))
{
return string.Empty;
}
var content = element.GetAttribute("innerText");
if (format == LlmResponseExtractType.Json)
{
content = content.Replace("\r", "").Replace("\n", "");
content = content.Replace("Explanation:", "\nExplanation:");
var json = Regex.Match(content, "{[ ]{0,}(\").*}").Value;
return json;
}
else
{
var responses = _driver.FindElements(By.CssSelector("div.markdown"));
if (format == LlmResponseExtractType.Html)
return responses.Last().GetAttribute("innerHTML");
else
return responses.Last().Text;
}
}
}