diff --git a/Common/Protos/aia.proto b/Common/Protos/aia.proto index 7444119..c8e5d12 100644 --- a/Common/Protos/aia.proto +++ b/Common/Protos/aia.proto @@ -14,8 +14,6 @@ message aiaRequest { string question = 1; string prompts = 2; string model = 3; - string apitoken = 4; - string url = 5; } message aiaReply { diff --git a/Infrastructure/Infrastructure/Ai_Ass/OpenAI .cs b/Infrastructure/Infrastructure/Ai_Ass/OpenAI .cs index 4231c11..c8e1247 100644 --- a/Infrastructure/Infrastructure/Ai_Ass/OpenAI .cs +++ b/Infrastructure/Infrastructure/Ai_Ass/OpenAI .cs @@ -39,7 +39,7 @@ namespace Hushian.Infrastructure.Ai_Ass (new aiaRequest() { Prompts = Request.ToString(), Question = Request.question, - Model=model,Apitoken=_aiSettings.apitoken,Url=_aiSettings.url }); + Model=model}); if (response!=null) { diff --git a/Infrastructure/Infrastructure/Hushian.Infrastructure.csproj b/Infrastructure/Infrastructure/Hushian.Infrastructure.csproj index 402af4b..fe6fb8d 100644 --- a/Infrastructure/Infrastructure/Hushian.Infrastructure.csproj +++ b/Infrastructure/Infrastructure/Hushian.Infrastructure.csproj @@ -21,7 +21,7 @@ - + diff --git a/Infrastructure/Infrastructure/models/Aia.cs b/Infrastructure/Infrastructure/models/Aia.cs index cd3deb7..2ffb710 100644 --- a/Infrastructure/Infrastructure/models/Aia.cs +++ b/Infrastructure/Infrastructure/models/Aia.cs @@ -24,17 +24,16 @@ namespace AIAss.Protos { static AiaReflection() { byte[] descriptorData = global::System.Convert.FromBase64String( string.Concat( - "CglhaWEucHJvdG8SA2FpYSJdCgphaWFSZXF1ZXN0EhAKCHF1ZXN0aW9uGAEg", - "ASgJEg8KB3Byb21wdHMYAiABKAkSDQoFbW9kZWwYAyABKAkSEAoIYXBpdG9r", - "ZW4YBCABKAkSCwoDdXJsGAUgASgJIhsKCGFpYVJlcGx5Eg8KB21lc3NhZ2UY", - "ASABKAkybgoMYWlBc3Npc3RhbmNlEi4KDFNlbmRRdWVzdGlvbhIPLmFpYS5h", - "aWFSZXF1ZXN0Gg0uYWlhLmFpYVJlcGx5Ei4KDGltYWdlQW5hbGl6ZRIPLmFp", - "YS5haWFSZXF1ZXN0Gg0uYWlhLmFpYVJlcGx5Qg+qAgxBSUFzcy5Qcm90b3Ni", - "BnByb3RvMw==")); + "CglhaWEucHJvdG8SA2FpYSI+CgphaWFSZXF1ZXN0EhAKCHF1ZXN0aW9uGAEg", + "ASgJEg8KB3Byb21wdHMYAiABKAkSDQoFbW9kZWwYAyABKAkiGwoIYWlhUmVw", + "bHkSDwoHbWVzc2FnZRgBIAEoCTJuCgxhaUFzc2lzdGFuY2USLgoMU2VuZFF1", + "ZXN0aW9uEg8uYWlhLmFpYVJlcXVlc3QaDS5haWEuYWlhUmVwbHkSLgoMaW1h", + "Z2VBbmFsaXplEg8uYWlhLmFpYVJlcXVlc3QaDS5haWEuYWlhUmVwbHlCD6oC", + "DEFJQXNzLlByb3Rvc2IGcHJvdG8z")); descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, new pbr::FileDescriptor[] { }, new pbr::GeneratedClrTypeInfo(null, null, new pbr::GeneratedClrTypeInfo[] { - new pbr::GeneratedClrTypeInfo(typeof(global::AIAss.Protos.aiaRequest), global::AIAss.Protos.aiaRequest.Parser, new[]{ "Question", "Prompts", "Model", "Apitoken", "Url" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::AIAss.Protos.aiaRequest), global::AIAss.Protos.aiaRequest.Parser, new[]{ "Question", "Prompts", "Model" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::AIAss.Protos.aiaReply), global::AIAss.Protos.aiaReply.Parser, new[]{ "Message" }, null, null, null, null) })); } @@ -80,8 +79,6 @@ namespace AIAss.Protos { question_ = other.question_; prompts_ = other.prompts_; model_ = other.model_; - apitoken_ = other.apitoken_; - url_ = other.url_; _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); } @@ -127,30 +124,6 @@ namespace AIAss.Protos { } } - /// Field number for the "apitoken" field. - public const int ApitokenFieldNumber = 4; - private string apitoken_ = ""; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] - public string Apitoken { - get { return apitoken_; } - set { - apitoken_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); - } - } - - /// Field number for the "url" field. - public const int UrlFieldNumber = 5; - private string url_ = ""; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] - public string Url { - get { return url_; } - set { - url_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); - } - } - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public override bool Equals(object other) { @@ -169,8 +142,6 @@ namespace AIAss.Protos { if (Question != other.Question) return false; if (Prompts != other.Prompts) return false; if (Model != other.Model) return false; - if (Apitoken != other.Apitoken) return false; - if (Url != other.Url) return false; return Equals(_unknownFields, other._unknownFields); } @@ -181,8 +152,6 @@ namespace AIAss.Protos { if (Question.Length != 0) hash ^= Question.GetHashCode(); if (Prompts.Length != 0) hash ^= Prompts.GetHashCode(); if (Model.Length != 0) hash ^= Model.GetHashCode(); - if (Apitoken.Length != 0) hash ^= Apitoken.GetHashCode(); - if (Url.Length != 0) hash ^= Url.GetHashCode(); if (_unknownFields != null) { hash ^= _unknownFields.GetHashCode(); } @@ -213,14 +182,6 @@ namespace AIAss.Protos { output.WriteRawTag(26); output.WriteString(Model); } - if (Apitoken.Length != 0) { - output.WriteRawTag(34); - output.WriteString(Apitoken); - } - if (Url.Length != 0) { - output.WriteRawTag(42); - output.WriteString(Url); - } if (_unknownFields != null) { _unknownFields.WriteTo(output); } @@ -243,14 +204,6 @@ namespace AIAss.Protos { output.WriteRawTag(26); output.WriteString(Model); } - if (Apitoken.Length != 0) { - output.WriteRawTag(34); - output.WriteString(Apitoken); - } - if (Url.Length != 0) { - output.WriteRawTag(42); - output.WriteString(Url); - } if (_unknownFields != null) { _unknownFields.WriteTo(ref output); } @@ -270,12 +223,6 @@ namespace AIAss.Protos { if (Model.Length != 0) { size += 1 + pb::CodedOutputStream.ComputeStringSize(Model); } - if (Apitoken.Length != 0) { - size += 1 + pb::CodedOutputStream.ComputeStringSize(Apitoken); - } - if (Url.Length != 0) { - size += 1 + pb::CodedOutputStream.ComputeStringSize(Url); - } if (_unknownFields != null) { size += _unknownFields.CalculateSize(); } @@ -297,12 +244,6 @@ namespace AIAss.Protos { if (other.Model.Length != 0) { Model = other.Model; } - if (other.Apitoken.Length != 0) { - Apitoken = other.Apitoken; - } - if (other.Url.Length != 0) { - Url = other.Url; - } _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); } @@ -330,14 +271,6 @@ namespace AIAss.Protos { Model = input.ReadString(); break; } - case 34: { - Apitoken = input.ReadString(); - break; - } - case 42: { - Url = input.ReadString(); - break; - } } } #endif @@ -365,14 +298,6 @@ namespace AIAss.Protos { Model = input.ReadString(); break; } - case 34: { - Apitoken = input.ReadString(); - break; - } - case 42: { - Url = input.ReadString(); - break; - } } } } diff --git a/Presentation/AIAss/.dockerignore b/Presentation/AIAss/.dockerignore index 7399316..101fc63 100644 --- a/Presentation/AIAss/.dockerignore +++ b/Presentation/AIAss/.dockerignore @@ -371,3 +371,4 @@ Dockerfile *.suo *.userosscache *.sln.docstates + diff --git a/Presentation/AIAss/Docker Command.txt b/Presentation/AIAss/Docker Command.txt new file mode 100644 index 0000000..3b40853 --- /dev/null +++ b/Presentation/AIAss/Docker Command.txt @@ -0,0 +1,3 @@ + docker build -t ai_assistance:v1 . + + docker run --name openai_assistance -d -p 5042:5010 [IMAGEID] \ No newline at end of file diff --git a/Presentation/AIAss/Dockerfile b/Presentation/AIAss/Dockerfile index 31dad03..6ac9e02 100644 --- a/Presentation/AIAss/Dockerfile +++ b/Presentation/AIAss/Dockerfile @@ -37,3 +37,4 @@ USER appuser # Set the entry point ENTRYPOINT ["dotnet", "AIAss.dll"] + diff --git a/Presentation/AIAss/README-Docker.md b/Presentation/AIAss/README-Docker.md index e5ba192..073e9a8 100644 --- a/Presentation/AIAss/README-Docker.md +++ b/Presentation/AIAss/README-Docker.md @@ -107,3 +107,4 @@ docker system prune -a - The container runs as a non-root user (`appuser`) - Only necessary ports are exposed - Environment variables can be overridden for different deployment scenarios + diff --git a/Presentation/AIAss/Services/aiAssistanceService.cs b/Presentation/AIAss/Services/aiAssistanceService.cs index c112373..82de8c5 100644 --- a/Presentation/AIAss/Services/aiAssistanceService.cs +++ b/Presentation/AIAss/Services/aiAssistanceService.cs @@ -4,19 +4,29 @@ using AIAss.Protos; using System.Net.Http.Headers; using System.Text.Json; using System.Text; +using Microsoft.Extensions.Configuration; namespace AIAss.Services; - public class aiAssistanceService: aiAssistance.aiAssistanceBase +public class aiAssistanceService : aiAssistance.aiAssistanceBase { + private readonly string Apitoken; + private readonly string url; + public aiAssistanceService(IConfiguration configuration) + { + url = configuration["aiSettings:url"]; + Apitoken = configuration["aiSettings:apitoken"]; + + } + public async override Task SendQuestion(aiaRequest request, ServerCallContext context) { using var client = new HttpClient(); client.DefaultRequestHeaders.Authorization = - new AuthenticationHeaderValue("Bearer", request.Apitoken); + new AuthenticationHeaderValue("Bearer", Apitoken); var content = new { - model= request.Model, + model = request.Model, messages = new[] { new { role = "system", content = "شما یک دستیار پاسخگو به سوالات هستید." }, @@ -24,51 +34,7 @@ namespace AIAss.Services; new { role = "system", content = "به سوالات غیره متن بالا پاسخ نده و بگو در این زمینه اطلاعی ندارم" } } }; - var response = await client.PostAsync(request.Url, - new StringContent(JsonSerializer.Serialize(content), Encoding.UTF8, "application/json")); - string reponse = ""; - if (response.IsSuccessStatusCode) - { - var json = await response.Content.ReadAsStringAsync(); - using var doc = JsonDocument.Parse(json); - reponse = doc.RootElement.GetProperty("choices")[0].GetProperty("message").GetProperty("content").GetString(); - } - else - { - reponse="خطا در ارتباط سرور ai"; - } - - return new aiaReply - { - Message = $" {reponse}" - }; - } - public async override Task imageAnalize(aiaRequest request, ServerCallContext context) - { - using var client = new HttpClient(); - client.DefaultRequestHeaders.Authorization = - new AuthenticationHeaderValue("Bearer", request.Apitoken); - var content = new - { - model = request.Model, - messages = new object[] - { - new { - role = "user", - content = new object[] - { - new { type = "text", text =request.Prompts}, - new { - type = "image_url", - image_url = new { - url = $"data:image/jpeg;base64,{request.Question}" - } - } - } - } - } - }; - var response = await client.PostAsync(request.Url, + var response = await client.PostAsync(url, new StringContent(JsonSerializer.Serialize(content), Encoding.UTF8, "application/json")); string reponse = ""; if (response.IsSuccessStatusCode) @@ -82,6 +48,65 @@ namespace AIAss.Services; reponse = "خطا در ارتباط سرور ai"; } + return new aiaReply + { + Message = $" {reponse}" + }; + } + public async override Task imageAnalize(aiaRequest request, ServerCallContext context) + { + + + using var client = new HttpClient(); + client.DefaultRequestHeaders.Authorization = + new AuthenticationHeaderValue("Bearer", Apitoken); + var content = new + { + model = request.Model, + messages = new object[] + { + new { + role = "system", + content = "شما دستیار برای توصیف آزمایشات هستید." + }, + new { + role = "user", + content = new object[] + { + new { type = "text", text = "این تصویر اگر آزمایش انسان است توصیف کن در غیر اینصورت پاسخ نده" }, + new { + type = "image_url", + image_url = new { + url = $"data:image/jpeg;base64,{request.Question}" + } + } + } + } + } + }; + + var response = await client.PostAsync(url, + new StringContent(JsonSerializer.Serialize(content), Encoding.UTF8, "application/json")); + string reponse = ""; + if (response.IsSuccessStatusCode) + { + var json = await response.Content.ReadAsStringAsync(); + using var doc = JsonDocument.Parse(json); + reponse = doc.RootElement.GetProperty("choices")[0].GetProperty("message").GetProperty("content").GetString(); + context.Status = new Status(StatusCode.OK,"is Success"); + } + else + { + reponse = "خطا در ارتباط سرور ai"; + if (response.StatusCode==System.Net.HttpStatusCode.TooManyRequests) + { + throw new RpcException(new Status(StatusCode.Cancelled, "ترافیک بالای شبکه در زمان دیگری تلاش کنید")); + + } + else + throw new RpcException(new Status(StatusCode.Cancelled, "خطا در ارتباط سرور")); + } + return new aiaReply { Message = $" {reponse}" diff --git a/Presentation/AIAss/appsettings.json b/Presentation/AIAss/appsettings.json index 1aef507..71e8998 100644 --- a/Presentation/AIAss/appsettings.json +++ b/Presentation/AIAss/appsettings.json @@ -10,5 +10,11 @@ "EndpointDefaults": { "Protocols": "Http2" } + }, + "aiSettings": { + "url": "https://api.openai.com/v1/chat/completions", + "apitokenold": "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", + "apitoken": "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" + } } diff --git a/Presentation/AIAss/models/Aia.cs b/Presentation/AIAss/models/Aia.cs index cd3deb7..2ffb710 100644 --- a/Presentation/AIAss/models/Aia.cs +++ b/Presentation/AIAss/models/Aia.cs @@ -24,17 +24,16 @@ namespace AIAss.Protos { static AiaReflection() { byte[] descriptorData = global::System.Convert.FromBase64String( string.Concat( - "CglhaWEucHJvdG8SA2FpYSJdCgphaWFSZXF1ZXN0EhAKCHF1ZXN0aW9uGAEg", - "ASgJEg8KB3Byb21wdHMYAiABKAkSDQoFbW9kZWwYAyABKAkSEAoIYXBpdG9r", - "ZW4YBCABKAkSCwoDdXJsGAUgASgJIhsKCGFpYVJlcGx5Eg8KB21lc3NhZ2UY", - "ASABKAkybgoMYWlBc3Npc3RhbmNlEi4KDFNlbmRRdWVzdGlvbhIPLmFpYS5h", - "aWFSZXF1ZXN0Gg0uYWlhLmFpYVJlcGx5Ei4KDGltYWdlQW5hbGl6ZRIPLmFp", - "YS5haWFSZXF1ZXN0Gg0uYWlhLmFpYVJlcGx5Qg+qAgxBSUFzcy5Qcm90b3Ni", - "BnByb3RvMw==")); + "CglhaWEucHJvdG8SA2FpYSI+CgphaWFSZXF1ZXN0EhAKCHF1ZXN0aW9uGAEg", + "ASgJEg8KB3Byb21wdHMYAiABKAkSDQoFbW9kZWwYAyABKAkiGwoIYWlhUmVw", + "bHkSDwoHbWVzc2FnZRgBIAEoCTJuCgxhaUFzc2lzdGFuY2USLgoMU2VuZFF1", + "ZXN0aW9uEg8uYWlhLmFpYVJlcXVlc3QaDS5haWEuYWlhUmVwbHkSLgoMaW1h", + "Z2VBbmFsaXplEg8uYWlhLmFpYVJlcXVlc3QaDS5haWEuYWlhUmVwbHlCD6oC", + "DEFJQXNzLlByb3Rvc2IGcHJvdG8z")); descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, new pbr::FileDescriptor[] { }, new pbr::GeneratedClrTypeInfo(null, null, new pbr::GeneratedClrTypeInfo[] { - new pbr::GeneratedClrTypeInfo(typeof(global::AIAss.Protos.aiaRequest), global::AIAss.Protos.aiaRequest.Parser, new[]{ "Question", "Prompts", "Model", "Apitoken", "Url" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::AIAss.Protos.aiaRequest), global::AIAss.Protos.aiaRequest.Parser, new[]{ "Question", "Prompts", "Model" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::AIAss.Protos.aiaReply), global::AIAss.Protos.aiaReply.Parser, new[]{ "Message" }, null, null, null, null) })); } @@ -80,8 +79,6 @@ namespace AIAss.Protos { question_ = other.question_; prompts_ = other.prompts_; model_ = other.model_; - apitoken_ = other.apitoken_; - url_ = other.url_; _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); } @@ -127,30 +124,6 @@ namespace AIAss.Protos { } } - /// Field number for the "apitoken" field. - public const int ApitokenFieldNumber = 4; - private string apitoken_ = ""; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] - public string Apitoken { - get { return apitoken_; } - set { - apitoken_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); - } - } - - /// Field number for the "url" field. - public const int UrlFieldNumber = 5; - private string url_ = ""; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] - public string Url { - get { return url_; } - set { - url_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); - } - } - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public override bool Equals(object other) { @@ -169,8 +142,6 @@ namespace AIAss.Protos { if (Question != other.Question) return false; if (Prompts != other.Prompts) return false; if (Model != other.Model) return false; - if (Apitoken != other.Apitoken) return false; - if (Url != other.Url) return false; return Equals(_unknownFields, other._unknownFields); } @@ -181,8 +152,6 @@ namespace AIAss.Protos { if (Question.Length != 0) hash ^= Question.GetHashCode(); if (Prompts.Length != 0) hash ^= Prompts.GetHashCode(); if (Model.Length != 0) hash ^= Model.GetHashCode(); - if (Apitoken.Length != 0) hash ^= Apitoken.GetHashCode(); - if (Url.Length != 0) hash ^= Url.GetHashCode(); if (_unknownFields != null) { hash ^= _unknownFields.GetHashCode(); } @@ -213,14 +182,6 @@ namespace AIAss.Protos { output.WriteRawTag(26); output.WriteString(Model); } - if (Apitoken.Length != 0) { - output.WriteRawTag(34); - output.WriteString(Apitoken); - } - if (Url.Length != 0) { - output.WriteRawTag(42); - output.WriteString(Url); - } if (_unknownFields != null) { _unknownFields.WriteTo(output); } @@ -243,14 +204,6 @@ namespace AIAss.Protos { output.WriteRawTag(26); output.WriteString(Model); } - if (Apitoken.Length != 0) { - output.WriteRawTag(34); - output.WriteString(Apitoken); - } - if (Url.Length != 0) { - output.WriteRawTag(42); - output.WriteString(Url); - } if (_unknownFields != null) { _unknownFields.WriteTo(ref output); } @@ -270,12 +223,6 @@ namespace AIAss.Protos { if (Model.Length != 0) { size += 1 + pb::CodedOutputStream.ComputeStringSize(Model); } - if (Apitoken.Length != 0) { - size += 1 + pb::CodedOutputStream.ComputeStringSize(Apitoken); - } - if (Url.Length != 0) { - size += 1 + pb::CodedOutputStream.ComputeStringSize(Url); - } if (_unknownFields != null) { size += _unknownFields.CalculateSize(); } @@ -297,12 +244,6 @@ namespace AIAss.Protos { if (other.Model.Length != 0) { Model = other.Model; } - if (other.Apitoken.Length != 0) { - Apitoken = other.Apitoken; - } - if (other.Url.Length != 0) { - Url = other.Url; - } _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); } @@ -330,14 +271,6 @@ namespace AIAss.Protos { Model = input.ReadString(); break; } - case 34: { - Apitoken = input.ReadString(); - break; - } - case 42: { - Url = input.ReadString(); - break; - } } } #endif @@ -365,14 +298,6 @@ namespace AIAss.Protos { Model = input.ReadString(); break; } - case 34: { - Apitoken = input.ReadString(); - break; - } - case 42: { - Url = input.ReadString(); - break; - } } } }