This commit is contained in:
2026-08-15 10:49:08 +03:30
parent 561542ea0a
commit a4bcde5994
14 changed files with 285 additions and 11 deletions
+7
View File
@@ -0,0 +1,7 @@
namespace xAiApi.Constants
{
public partial struct ConfigurationNodeNames
{
public const string AI_API_NODE = "AiAPiConfiguration";
}
}
+1
View File
@@ -8,6 +8,7 @@ namespace xAiApi.Constants
public const string XAiApiMigrationsAssemblyIdentifier = "xAiApi";
//
public const string XDILogTag = "XAiApi";
public const string XAiApiIntroductionPromptName = "Introduction";
}
}
+27
View File
@@ -0,0 +1,27 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using xAiApi.Interfaces;
using xCommons.Configurations;
using xCommons.Providers;
namespace xAiApi.Controllers
{
[Authorize]
[Route ("[controller]")]
public class DefaultAiController : XAiServiceControllerBase<IXDefaultAiService>
{
public DefaultAiController(
ILogger<DefaultAiController> logger,
IXDefaultAiService aiService,
XAppConfiguration appConfiguration,
XValidationProvider validationProvider
) : base(
logger,
aiService,
appConfiguration,
validationProvider
)
{ }
}
}
+72
View File
@@ -0,0 +1,72 @@
using System;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using xAiApi.Interfaces;
using xCommons.Configurations;
using xCommons.Controllers;
using xCommons.Providers;
namespace xAiApi.Controllers
{
[Authorize]
[Route ("[controller]")]
public abstract class XAiServiceControllerBase<TAiService> : XBaseController, IXAiServiceControllerBase
where TAiService : IXAiServiceBase
{
private readonly TAiService aiService;
protected XAiServiceControllerBase(
ILogger logger,
TAiService aiService,
XAppConfiguration appConfiguration,
XValidationProvider validationProvider
) : base(
logger,
appConfiguration,
validationProvider
)
{
this.aiService = aiService;
}
/// <summary>
/// Ask Question and Get Response ...
/// </summary>
/// <param name="question"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
[AllowAnonymous]
[HttpGet("Ask")]
public virtual async Task<ActionResult<string>> Ask(
[FromQuery] string question,
CancellationToken cancellationToken = default
)
{
//
try
{
//
// Validate ...
ValidationProvider.NotEmpty(question);
//
var result = await aiService.AskAsync(
prompt: question,
cancellationToken: cancellationToken
);
//
return Ok(result);
}
catch (Exception ex)
{
//
var result = GetExceptionActionResult(ex);
return result;
}
}
}
}
+87
View File
@@ -0,0 +1,87 @@
using System;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using xAiApi.Configurations;
using xAiApi.Constants;
using xAiApi.Extensions;
using xCommons.Extensions;
using xExceptions.Constants;
namespace xAiApi.DI
{
public static partial class XDIHelperExtension
{
/// <summary>
/// Extract AI Configuration ...
/// </summary>
/// <param name="source"></param>
/// <returns></returns>
public static XAiApiConfiguration GetXAiApiConfiguration(this IConfiguration source)
{
//
XAiApiConfiguration result = null;
//
var section = source.GetSection(ConfigurationNodeNames.AI_API_NODE);
if (!section.IsNull())
{
result = section.Get<XAiApiConfiguration>();
}
//
return result;
}
/// <summary>
/// Register AiApi Configuration ...
/// </summary>
/// <param name="source"></param>
/// <param name="configuration"></param>
public static void AddXAiApiConfiguration(
this IServiceCollection source,
IConfiguration configuration
)
{
//
var apiConfig = configuration.GetXAiApiConfiguration();
source.AddXAiApiConfiguration(apiConfig);
}
/// <summary>
/// Register AiApi Configuration ...
/// </summary>
/// <param name="source"></param>
/// <param name="configuration"></param>
public static void AddXAiApiConfiguration(
this IServiceCollection source,
XAiApiConfiguration configuration
)
{
//
if (!configuration.IsValid())
{
XException.InvalidConfiguration.Throw();
}
//
source.AddSingleton(configuration);
}
//
#region Private ...
/// <summary>
/// a LogTag for Service ...
/// </summary>
private static string XLogTag = XAiApiConstants.XDILogTag;
/// <summary>
/// print a log in Console ...
/// </summary>
/// <param name="message"></param>
private static void Log(string message)
{
Console.WriteLine($"{XLogTag} => {message}");
}
#endregion
}
}
+1 -1
View File
@@ -186,7 +186,7 @@ namespace xAiApi.Extensions
/// <returns></returns>
public static string GetPrompt(
this XAiApiConfiguration source,
string name,
string name = null,
IDictionary<string, string> @params = null
)
{
@@ -10,7 +10,7 @@ namespace xAiApi.Interfaces
/// <summary>
/// Describe a Base Service Actions of any Ai Based Services ...
/// </summary>
public interface IXAIServiceBase : IDisposable
public interface IXAiServiceBase : IDisposable
{
/// <summary>
/// Base Method for Communicate with LLM ...
+21
View File
@@ -0,0 +1,21 @@
using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
namespace xAiApi.Interfaces
{
public interface IXAiServiceControllerBase
{
/// <summary>
/// Ask Question and Get Response ...
/// </summary>
/// <param name="question"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
[HttpGet("Ask")]
Task<ActionResult<string>> Ask(
[FromQuery] string question,
CancellationToken cancellationToken = default
);
}
}
+5
View File
@@ -0,0 +1,5 @@
namespace xAiApi.Interfaces
{
public interface IXDefaultAiService : IXAiServiceBase
{ }
}
-6
View File
@@ -1,11 +1,5 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
namespace xAiApi
{
+3 -3
View File
@@ -17,7 +17,7 @@ using OllamaSharp;
namespace xAiApi.Providers
{
public abstract class XAIServiceBase : IXAIServiceBase
public abstract class XAIServiceBase : IXAiServiceBase
{
private readonly IXAiDataProvider dataProvider;
private readonly ILogger<XAIServiceBase> logger;
@@ -273,7 +273,7 @@ namespace xAiApi.Providers
// Preparing Introduction Prompt ...
var introductionPrompt = new ChatMessage(
ChatRole.System,
PromptHelper.GetIntroductionPrompt().Prompt
configuration.GetPrompt()
);
//
@@ -307,7 +307,7 @@ namespace xAiApi.Providers
// Preparing Introduction Prompt ...
var introductionPrompt = new ChatMessage(
ChatRole.System,
PromptHelper.GetIntroductionPrompt().Prompt
configuration.GetPrompt()
);
//
+21
View File
@@ -0,0 +1,21 @@
using Microsoft.Extensions.Logging;
using xAiApi.Configurations;
using xAiApi.Interfaces;
using xAiModels.Interfaces;
namespace xAiApi.Providers
{
public class XDefaultAiService : XAIServiceBase, IXDefaultAiService
{
public XDefaultAiService(
IXAiDataProvider dataProvider,
ILogger<XAIServiceBase> logger,
XAiApiConfiguration configuration
) : base(
dataProvider,
logger,
configuration
)
{ }
}
}
+20
View File
@@ -26,6 +26,11 @@ using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using IdentityModel.AspNetCore.OAuth2Introspection;
using xPushService.Helpers;
using xAiApi.DI;
using xExceptions.Constants;
using xAiApi.Interfaces;
using xAiApi.Providers;
using xAiModels.DI;
namespace xAiApi
{
@@ -169,6 +174,21 @@ namespace xAiApi
lifeTime: lifeTime,
repositoryType: repositoryType
);
//
// Register AiApi Data Service ...
services.AddXAiDataService<XAiApiDbContext>(
lifeTime: lifeTime,
repositoryType: repositoryType
);
//
// Register XAiApi Configuration ...
services.AddXAiApiConfiguration(Configuration);
//
// Register Default Ai Service ...
services.AddScoped<IXDefaultAiService, XDefaultAiService>();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
+19
View File
@@ -35,6 +35,25 @@
"ThumbQuality": 72,
"MaxFileSize": 41943040
},
"AiAPiConfiguration": {
"Models": [
{
"ApiKey": "",
"Name": "Gemma",
"LLM": "gemma3:1b",
"Provider": "Ollama",
"Url": "http://localhost:11434"
}
],
"Prompts": [
{
"Name": "Introduction",
"Template": "your name is xSaherElmAi, you are a professional ai assistant which develped by SaherElm IT Center",
"Description": "",
"Params": []
}
]
},
"Logging": {
"LogLevel": {
"Default": "Information",