using LLama.Abstractions; using LLama.Web.Common; using LLama.Web.Models; using System.Collections.Concurrent; namespace LLama.Web.Services { public class ModelSessionService : IModelSessionService { private readonly ILogger _logger; private readonly ConcurrentDictionary _modelSessions; public ModelSessionService(ILogger logger) { _logger = logger; _modelSessions = new ConcurrentDictionary(); } public Task GetAsync(string connectionId) { _modelSessions.TryGetValue(connectionId, out var modelSession); return Task.FromResult(modelSession); } public Task CreateAsync(string connectionId, ILLamaExecutor executor, ModelOptions modelOption, PromptOptions promptOption, ParameterOptions parameterOption) { //TODO: Max instance etc var modelSession = new ModelSession(executor, modelOption, promptOption, parameterOption); if (!_modelSessions.TryAdd(connectionId, modelSession)) { _logger.Log(LogLevel.Error, "[CreateAsync] - Failed to create model session, Connection: {0}", connectionId); return Task.FromResult(default); } return Task.FromResult(modelSession); } public Task RemoveAsync(string connectionId) { if (_modelSessions.TryRemove(connectionId, out var modelSession)) { _logger.Log(LogLevel.Information, "[RemoveAsync] - Removed model session, Connection: {0}", connectionId); modelSession.Dispose(); } return Task.CompletedTask; } public Task CancelAsync(string connectionId) { if (_modelSessions.TryGetValue(connectionId, out var modelSession)) { _logger.Log(LogLevel.Information, "[CancelAsync] - Canceled model session, Connection: {0}", connectionId); modelSession.CancelInfer(); } return Task.CompletedTask; } } }