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;
- }
}
}
}