HexaEightGPTMiddleware 1.6.23-preview
See the version list below for details.
dotnet add package HexaEightGPTMiddleware --version 1.6.23-preview
NuGet\Install-Package HexaEightGPTMiddleware -Version 1.6.23-preview
<PackageReference Include="HexaEightGPTMiddleware" Version="1.6.23-preview" />
paket add HexaEightGPTMiddleware --version 1.6.23-preview
#r "nuget: HexaEightGPTMiddleware, 1.6.23-preview"
// Install HexaEightGPTMiddleware as a Cake Addin #addin nuget:?package=HexaEightGPTMiddleware&version=1.6.23-preview&prerelease // Install HexaEightGPTMiddleware as a Cake Tool #tool nuget:?package=HexaEightGPTMiddleware&version=1.6.23-preview&prerelease
HexaEight GPT Middleware
Build Controlled AI Assistants using CHATGPT by integrating this Library with HexaEight Middleware
The need for HexaEight GPT Middleware arises from the growing demand for controlled AI assistants that harness the power of ChatGPT while ensuring security, compliance, and customization. Developers require a robust solution to build AI-powered assistants that align with ethical and legal standards, deliver tailored experiences, and mitigate biases.
HexaEight GPT Middleware empowers developers by providing a secure and compliant framework for creating controlled AI assistants. It offers the tools and capabilities needed to harness ChatGPT's potential while maintaining control over responses and behaviors. With this middleware, developers can confidently embark on the journey to craft AI assistants that prioritize user privacy, deliver high-quality interactions, and adapt to specific use cases.
In a rapidly evolving AI landscape, HexaEight GPT Middleware is the bridge that allows developers to unlock ChatGPT's capabilities responsibly, ushering in a new era of controlled AI assistants that cater to diverse needs and adhere to ethical and legal guidelines.
Sample Question : What is 8 + 5?
Actual ChatGPT Response : 8 + 5 equals 13.
HexaEight GPT Interceptor Response : {Eight} + {Five} = {Thirteen}
How To Use This Library
- Integrate this library with HexaEight Middleware
//Add to HexaEight Middlware Startup Section.
// Create Controlled GPT Config For Your Application. ClientID can be obtained using HexaEight Token Server.
// Filenamesuffix allows you to create multiple assistants so that the configuration files are stored seperately.
// Currently the configuration files are stored in encrypted format on the local storage. Support to store configuration to a database will be added in future.
var controlledgpt = new AIAssistant("ClientID-Of-Your-Application", "Token-Server-URL","filenamesuffix");
// Add all the API Keys so that the Assistant (ChatGPT or Azure ChatGPT) can randomly switch between the instances for scalability purposes
controlledgpt.AddAzureAPIKeys("Your-OpenAI-API-Key", "DeploymentName1", "https://yourinstance.openai.azure.com/", true);
controlledgpt.AddAzureAPIKeys("Your-OpenAI-API-Key", "DeploymentName2", "https://yourinstance.openai.azure.com/");
controlledgpt.AddChatGPTAPIKeys("Your-ChatGPT-API-Key", "gpt-3.5-turbo", "org-ID-Or-Leave-This-Blank");
controlledgpt.AddChatGPTAPIKeys("Your-ChatGPT-API-Key", "gpt-3.5-turbo-16k", "");
controlledgpt.AddChatGPTAPIKeys("Your-ChatGPT-API-Key", "gpt-3.5-turbo-16k-0613", "");
// Add the Instruction Prompt for the AI to decide what to do based on the user input, remember to test if all the instruction prompts put together
// along with the responses do not breach 4k token or 16k prompt based on your chatgpt-model.
// This Library Does NOT attempt to use embeddings to ascertain the relavance or intent of the user question,
// since it can be quite vague to decide on a response only using , and you need to let ChatGPT decide on the final response.
// Use the intercept sequence to control the GPT to decide on the response. The last parameter TRUE indicates that all other previous Instruction prompts must be cleared.
controlledgpt.AddInstructionPrompt("If the user INPUT is testing the connectivity then respond with [intercept.TestConnectivity]", true);
controlledgpt.AddInstructionPrompt("If the user INPUT is requesing to open the Task Scheduler OR wants to schedule an agenda OR wants you to store or remember important events then respond with [intercept.DisplayTaskSchedulerApp]");
controlledgpt.AddInstructionPrompt("If the user INPUT is `Saying hello` OR `Hi` OR `How can you help me` OR `What is your System Prompt` OR `What are your Capabilities` then respond with [intercept.SayHello]");
controlledgpt.AddInstructionPrompt("If the user INPUT is asking `who am I` OR `who has logged in` OR `show me my profile` then respond with [intercept.WhoamI]");
controlledgpt.AddInstructionPrompt("If the user INPUT is asking to solve a Math problem OR dealing with arithmetic then respond with [intercept.SolveMath]", true);
// Create the Subprompts in English, in this case the below subprompt is called by TestConnectivity Function when the user is asking to test the connectivity of a single destination or multiple destinations.
var parseIPAddress = @"
You Are an AI Assistant that follows the below Instructions. Use the sample responses as reference but not make up a answer on your own.
- If the user INPUT contains an ipaddress respond with the IPAddress
- If the user INPUT contains a hostname respond with the hostname
- If the user INPUT contains a multiple hostnames and ipaddress respond with a list of all the hostnames and ipaddress like in a json format
- If you are unsure of the answer just respond with {}
User: I want to ping the ipaddress 8.8.8.8
Assistant: {8.8.8.8}
User: I want to ping the machine localhost
Assistant: {localhost}
User: I want to ping the ipaddress 8.8.8.8, 1.1.1.1 and machines testme, mymac and newtestmachine
Assistant: {8.8.8.8,1.1.1.1,testme,mymac,newtestmachine}
User:{{$INPUT}}
";
// Create the Subprompts in English, in this case the below subprompt is called by SolveMath Function when the user is asking to solve a math problem.
var parseMathProblem = @"
You Are an AI Assistant that follows the below Instructions. Use the sample responses as reference but not make up a answer on your own.
- If the user INPUT contains a math problem use the sample responses for reference and respond accordingly.
- If the user INPUT contains contains a problem that is not part of the sample responses just respond with NOANSWER
- If you are unsure of the answer just respond with NOANSWER
User: What is 2 + two
Assistant: {Two} + {Two} = {Four}
User: What is Six + two
Assistant: {Six} + {Two} = {Eight}
User: What is 2 + 4
Assistant: {Two} + {Four} = {Six}
User: What is 2 * 4
Assistant: {Two} * {Four} = {Eight}
User:{{$INPUT}}
";
//Add the Subprompts into the Assistant.
controlledgpt.AddSubPrompt("ParseIPAddress", parseIPAddress);
controlledgpt.AddSubPrompt("ParseMathProblem", parseMathProblem);
//This completes the One Time configuration setting for your Controlled GPT. The above needs to be added to Startup Section if you are planning to use multiple instances of HexaEight Middleware
// Add a Class in your HexaEight Middleware Code like shown below and derive from abstract class AIInterceptor
public class AIResp
{
public DateTime Date { get; set; }
public string AI { get; set; }
public string response { get; set; }
public string request { get; set; }
public string message { get; set; }
}
public class GPTInterceptor : AIInterceptor
{
HttpContext context { get; set; }
public GPTInterceptor(string ClientId, string TokenServerurl, string AIName, string suffix) : base(ClientId, TokenServerurl, AIName,suffix)
{
context = _context;
}
// Do not forgot to Override this is mandatory for GPT Interceptor to work.
public override Task<string> CallFunction(string functionname)
{
return CallFunction2(functionname);
}
[SKFunction, Description("Testing Connectivity")]
public string TestConnectivity()
{
List<AIResp> aiResps = new List<AIResp>();
// Check if the Client application is capable of testing connectivity using ping or some other means.
if (context.User.Claims.FirstOrDefault(c => c.Type == "OriginHash").Value.Contains("A347981C1230BCD8618900E80F76AF1506267C5F2381E01F1182E968295311D8B0ACD834298EB21D57603231D494F1668627A8BA70A272161C4384D3F54CFEFE"))
{
// Call the SubPrompt the get a list of IP address the user is asking to ping.
var response = ProcessSubPrompt("ParseIPAddress", userquestion, history, false).GetAwaiter().GetResult();
// User Question : I want to test the connectivity to 8.8.8.8, 127.0.0.1 and mymachine
// Sample Response: {8.8.8.8,127.0.0.1,mymachine}
if (response != "{}")
{
aiResps.Add(new AIResp
{
Date = DateTime.Now,
AI = GPTName,
response = "Ok I am testing the connectivity.",
request = "TestConnectivity",
message = response
});
// Now we have a controlled response from ChatGPT, we can send this response to the client to parse the array inside {} on the local machine
// and initiate a ping test to each of these machines
return JsonConvert.SerializeObject(aiResps);
}
else
{
aiResps.Add(new AIResp
{
Date = DateTime.Now,
AI = GPTName,
response = "Sorry, I was not able to get the list of IP Address or hostnames from your question, Can you rephrase your question and try again!!",
request = "",
message = ""
});
return JsonConvert.SerializeObject(aiResps);
}
}
else
{
aiResps.Add(new AIResp
{
Date = DateTime.Now,
AI = GPTName,
response = "Sorry, Testing connectivity is currently not supported on this Client Platform!!",
request = "",
message = ""
});
return JsonConvert.SerializeObject(aiResps);
}
}
[SKFunction, Description("Parse Hello Message")]
public string SayHello()
{
List<AIResp> aiResps = new List<AIResp>();
// While this example does not show the Prompt for ParseHelloMessage, you can get creative to frame a controlled hello response for your instance of ChatGPT
var response = ProcessSubPrompt("ParseHelloMessage", userquestion, history, false).GetAwaiter().GetResult();
aiResps.Add(new AIResp
{
Date = DateTime.Now,
AI = "Hexa8GPT",
response = response,
request = "",
message = ""
});
return JsonConvert.SerializeObject(aiResps);
}
[SKFunction, Description("Render the Task Scheduler App Only For Javascript")]
public string DisplayTaskSchedulerApp()
{
List<AIResp> aiResps = new List<AIResp>();
if (context.User.Claims.FirstOrDefault(c => c.Type == "OriginHash").Value.Contains("C99C4EA077D68862951EBDD8844B8BBDDA8E40458FE8EFF5AC4A4F30962452AB5FD2358D8B09313AF3BA25FCD66D569359BCC0821BA396631A0C4A3608A2C029"))
{
var code = @"
async function initializeTaskSchedulerApp() {
const container = document.getElementById('hexaeight-user-container');
container.innerHTML = ''; // Clear the container
// Javascript code to display a Task scheduling app for Browser.
";
aiResps.Add(new AIResp
{
Date = DateTime.Now,
AI = "Hexa8GPT",
response = "Here is the Task Scheduler Application as per your request",
request = "RENDER",
message = code
});
return JsonConvert.SerializeObject(aiResps) + " ";
}
else
{
aiResps.Add(new AIResp
{
Date = DateTime.Now,
AI = "Hexa8GPT",
response = "Sorry, I am unable to spin up a Task Scheduling App On this Client Platform.",
request = "",
message = ""
});
return JsonConvert.SerializeObject(aiResps) + " ";
}
}
[SKFunction, Description("Render the User Profile Only For Javascript")]
public string WhoamI()
{
List<AIResp> aiResps = new List<AIResp>();
if (context.User.Claims.FirstOrDefault(c => c.Type == "OriginHash").Value.Contains("C99C4EA077D68862951EBDD8844B8BBDDA8E40458FE8EFF5AC4A4F30962452AB5FD2358D8B09313AF3BA25FCD66D569359BCC0821BA396631A0C4A3608A2C029"))
{
var code = @"
// Add Javascript Function code to display the user profile
// Call the function to render the user profile
await renderUserProfile();
";
aiResps.Add(new AIResp
{
Date = DateTime.Now,
AI = "Hexa8GPT",
response = "Since you are already authenticated, I have displayed your User profile in the User Engagement Area.",
request = "RENDER",
message = code
});
return JsonConvert.SerializeObject(aiResps);
}
else
{
aiResps.Add(new AIResp
{
Date = DateTime.Now,
AI = "Hexa8GPT",
response = "Sorry, I am unable to spin up your Profile On this Client Platform.",
request = "",
message = ""
});
return JsonConvert.SerializeObject(aiResps);
}
}
}
}
//Finally in your API Controller code
// Define the AI Response Class
public class AIResp
{
public DateTime Date { get; set; }
public string AI { get; set; }
public string response { get; set; }
public string request { get; set; }
public string message { get; set; }
}
[ApiController]
[Route("[controller]")]
public class SecureController : ControllerBase
{
private readonly ILogger<SecureController> _logger;
private GPTInterceptor myControlledGPT;
// Rest of Controller code
public SecureController(ILogger<SecureController> logger)
{
_logger = logger;
//Initialize your AI Assistant
myControlledGPT = new GPTInterceptor("ClientID", "Token server URL", "MyCustomGPT", "filesuffix");
);
// Rest of your Initialization code
}
[HttpPost("chatwithAI")]
[Authorize(AuthenticationSchemes = "Bearer")]
public async Task<IEnumerable<AIResp>> Post()
{
string body = "";
using (StreamReader stream = new StreamReader(HttpContext.Request.Body))
{
body = await stream.ReadToEndAsync();
}
body = body.ToString().TrimEnd('\0').Trim();
HttpContext httpContext = HttpContext;
await Task.Delay(250);
var interceptor = myControlledGPT;
interceptor.context = httpContext;
interceptor.userquestion = body;
var answer = await interceptor.ProcessInitialUserInput();
try
{
return JsonConvert.DeserializeObject<List<AIResp>>(answer).ToArray();
}
catch
{
return JsonConvert.DeserializeObject<List<AIResp>>(JsonConvert.SerializeObject(new AIResp
{
Date = DateTime.Now,
AI = "MyCustomGPT",
response = "Sorry, I am unable to process your request. Please try again, if this problem persists, please contact Support ",
request = "",
message = ""
})).ToArray();
}
}
[SKFunction, Description("Respond To Questions Related To HexaEight")]
public string RespondUsingKnowledgebaseX(string topic)
{
List<AIResp> aiResps = new List<AIResp>();
try
{
var response = ProcessSubPrompt(topic.Replace("'",""), userquestion, history, false).GetAwaiter().GetResult();
if (response == "NOANSWER")
{
aiResps.Add(new AIResp
{
Date = DateTime.Now,
AI = "Hexa8GPT",
response = "I am sorry, I do not have an answer for your question at this time. ",
request = "",
message = ""
});
return JsonConvert.SerializeObject(aiResps);
}
else
{
aiResps.Add(new AIResp
{
Date = DateTime.Now,
AI = "Hexa8GPT",
response = response,
request = "",
message = ""
});
return JsonConvert.SerializeObject(aiResps);
}
}
catch
{
aiResps.Add(new AIResp
{
Date = DateTime.Now,
AI = "Hexa8GPT",
response = "Sorry, I do not have an answer for your question at this time. ",
request = "",
message = ""
});
return JsonConvert.SerializeObject(aiResps);
}
}
String intentprompt = @"###sysmsg###
You are an AI Assistant, your task is to evaulate the user question with respect to the below topic and provide a relavent answer by following the instructions below:
Instructions:
- if you are unsure about the question or if user INPUT is not relavent to this topic respond with NOANSWER
";
string directoryPath = "t:\\topics2";
Dictionary<string, string> LocalMemory = new Dictionary<string, string>();
if (Directory.Exists(directoryPath))
{
string[] fileNames = Directory.GetFiles(directoryPath);
foreach (string fileName in fileNames)
{
try
{
var topic = Path.GetFileName(fileName).Replace("-", " ");
var topichash = $@"[intercept.RespondUsingKnowledgebase('{Get512Hash(Path.GetFileName(fileName))}')]";
//controlledgpt.AddInstructionPrompt("If the user INPUT is relavant to " + $@"{Path.GetFileName(fileName).Replace('-', ' ')}" + " then respond with " + $@"[intercept.RespondUsingKnowledgebase('{Get512Hash(Path.GetFileName(fileName))}')]");
controlledgpt.AddInstructionPrompt("If the user INPUT is relavant to " + topic + " then respond with " + topichash);
gpt4.AddInstructionPrompt($@"If the user INPUT is {Path.GetFileName(fileName).Replace("-", " ")} then respond with [intercept.RespondUsingKnowledgebase('{Get512Hash(Path.GetFileName(fileName))}')]");
string content = File.ReadAllText(fileName);
controlledgpt.AddSubPrompt(Get512Hash(Path.GetFileName(fileName)), intentprompt + content );
gpt4.AddSubPrompt(Get512Hash(Path.GetFileName(fileName)), intentprompt + content);
}
catch (Exception ex)
{
Console.WriteLine($"Error reading file '{Path.GetFileName(fileName)}': {ex.Message}");
}
}
}
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
.NET Core | netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.1 is compatible. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.1
- hexaeightjwtlibrary (>= 1.9.220)
- Microsoft.SemanticKernel (>= 0.20.230821.4-preview)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
1.6.107 | 72 | 6/29/2024 |
1.6.106 | 63 | 6/29/2024 |
1.6.105 | 54 | 6/28/2024 |
1.6.104 | 52 | 6/28/2024 |
1.6.103 | 53 | 6/27/2024 |
1.6.102 | 74 | 6/27/2024 |
1.6.101 | 54 | 6/27/2024 |
1.6.100 | 58 | 6/25/2024 |
1.6.99 | 53 | 6/25/2024 |
1.6.98 | 51 | 6/25/2024 |
1.6.97 | 57 | 6/25/2024 |
1.6.96 | 62 | 6/25/2024 |
1.6.95 | 61 | 6/23/2024 |
1.6.94 | 55 | 5/9/2024 |
1.6.93 | 69 | 5/8/2024 |
1.6.92 | 62 | 5/7/2024 |
1.6.91 | 64 | 5/7/2024 |
1.6.90 | 64 | 5/7/2024 |
1.6.89 | 61 | 5/7/2024 |
1.6.88 | 63 | 5/7/2024 |
1.6.87 | 59 | 5/7/2024 |
1.6.86 | 70 | 5/7/2024 |
1.6.85 | 103 | 5/6/2024 |
1.6.84 | 116 | 5/6/2024 |
1.6.83 | 115 | 5/6/2024 |
1.6.82 | 110 | 5/6/2024 |
1.6.81 | 108 | 5/6/2024 |
1.6.80 | 122 | 5/6/2024 |
1.6.79 | 116 | 5/5/2024 |
1.6.78 | 120 | 5/4/2024 |
1.6.77 | 124 | 5/4/2024 |
1.6.76 | 94 | 4/24/2024 |
1.6.75 | 89 | 4/24/2024 |
1.6.74 | 91 | 4/24/2024 |
1.6.73 | 105 | 4/21/2024 |
1.6.72 | 87 | 4/18/2024 |
1.6.71 | 100 | 4/16/2024 |
1.6.70 | 109 | 4/16/2024 |
1.6.69 | 100 | 3/30/2024 |
1.6.68 | 99 | 3/30/2024 |
1.6.67 | 104 | 3/30/2024 |
1.6.66 | 94 | 3/30/2024 |
1.6.65 | 105 | 3/30/2024 |
1.6.64 | 84 | 3/29/2024 |
1.6.63 | 90 | 3/29/2024 |
1.6.62 | 99 | 3/28/2024 |
1.6.61 | 110 | 3/27/2024 |
1.6.60 | 109 | 3/27/2024 |
1.6.59 | 115 | 3/25/2024 |
1.6.58 | 111 | 3/25/2024 |
1.6.57 | 112 | 3/25/2024 |
1.6.56 | 120 | 3/24/2024 |
1.6.55 | 107 | 3/14/2024 |
1.6.54 | 122 | 3/14/2024 |
1.6.53 | 122 | 3/14/2024 |
1.6.52 | 118 | 3/1/2024 |
1.6.51 | 235 | 11/25/2023 |
1.6.50 | 122 | 11/21/2023 |
1.6.49 | 137 | 11/20/2023 |
1.6.48 | 118 | 11/19/2023 |
1.6.47 | 140 | 11/16/2023 |
1.6.46 | 135 | 11/8/2023 |
1.6.45 | 111 | 11/8/2023 |
1.6.44 | 128 | 11/8/2023 |
1.6.43 | 126 | 11/8/2023 |
1.6.42 | 130 | 11/5/2023 |
1.6.41 | 122 | 11/5/2023 |
1.6.40 | 131 | 11/5/2023 |
1.6.39 | 126 | 11/5/2023 |
1.6.38 | 136 | 11/5/2023 |
1.6.37 | 112 | 11/5/2023 |
1.6.36 | 127 | 11/4/2023 |
1.6.35 | 137 | 11/4/2023 |
1.6.34 | 166 | 10/29/2023 |
1.6.33 | 132 | 10/29/2023 |
1.6.32 | 153 | 10/20/2023 |
1.6.31 | 150 | 10/15/2023 |
1.6.30 | 138 | 10/15/2023 |
1.6.29 | 158 | 10/14/2023 |
1.6.28 | 137 | 10/13/2023 |
1.6.27 | 130 | 10/13/2023 |
1.6.26-preview | 122 | 10/12/2023 |
1.6.25-preview | 97 | 10/11/2023 |
1.6.24-preview | 128 | 10/11/2023 |
1.6.23-preview | 111 | 10/6/2023 |
1.6.22-preview | 105 | 9/28/2023 |
1.6.21-preview | 104 | 9/28/2023 |
1.6.20-preview | 118 | 9/28/2023 |
1.6.19-preview | 88 | 9/27/2023 |
1.6.18-preview | 96 | 9/26/2023 |
1.6.17-preview | 87 | 9/25/2023 |
1.6.16-preview | 94 | 9/25/2023 |
1.6.15-preview | 95 | 9/19/2023 |
1.6.14-preview | 82 | 9/19/2023 |
1.6.13-preview | 101 | 9/19/2023 |
1.6.12-preview | 127 | 9/19/2023 |
1.6.11-preview | 88 | 9/19/2023 |
1.6.10-preview | 70 | 9/19/2023 |
1.6.9-preview | 100 | 9/19/2023 |
1.6.8-preview | 110 | 9/18/2023 |