Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 9 additions & 4 deletions src/Cellm/AddIn/CellmAddIn.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
using Cellm.Models.Providers.Anthropic;
using Cellm.Models.Providers.Aws;
using Cellm.Models.Providers.Azure;
using Cellm.Models.Providers.Behaviors;
using Cellm.Models.Providers.Cellm;
using Cellm.Models.Providers.DeepSeek;
using Cellm.Models.Providers.Google;
Expand Down Expand Up @@ -112,15 +113,19 @@ private static ServiceCollection ConfigureServices(ServiceCollection services)
});
});

// Internals
// Mediatr
services
.AddMediatR(cfg =>
{
cfg.RegisterServicesFromAssembly(Assembly.GetExecutingAssembly());
cfg.AddBehavior(typeof(SentryBehavior<ProviderRequest, ProviderResponse>), ServiceLifetime.Singleton);
cfg.AddBehavior(typeof(ToolBehavior<ProviderRequest, ProviderResponse>), ServiceLifetime.Singleton);
cfg.AddBehavior(typeof(CacheBehavior<ProviderRequest, ProviderResponse>), ServiceLifetime.Singleton);
cfg.AddBehavior<SentryBehavior<ProviderRequest, ProviderResponse>>(ServiceLifetime.Singleton);
cfg.AddBehavior<ToolBehavior<ProviderRequest, ProviderResponse>>(ServiceLifetime.Singleton);
cfg.AddBehavior<CacheBehavior<ProviderRequest, ProviderResponse>>(ServiceLifetime.Singleton);
})
.AddSingleton<IProviderBehavior, GeminiTemperatureBehavior>();

// Internals
services
.AddSingleton(configuration)
.AddTransient<ArgumentParser>()
.AddSingleton<Account>()
Expand Down
32 changes: 32 additions & 0 deletions src/Cellm/Models/Behaviors/ProviderBehavior.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
using Cellm.Models.Prompts;
using Cellm.Models.Providers;
using Cellm.Models.Providers.Behaviors;
using MediatR;

namespace Cellm.Models.Behaviors;

internal class ProviderBehavior<TRequest, TResponse>(IEnumerable<IProviderBehavior> providerBehaviors) : IPipelineBehavior<TRequest, TResponse>
where TRequest : IPrompt, IProvider
where TResponse : IPrompt, IProvider
{
public async Task<TResponse> Handle(TRequest request, RequestHandlerDelegate<TResponse> next, CancellationToken cancellationToken)
{
var enabledProviderBehaviors = providerBehaviors
.Where(a => a.IsEnabled(request.Provider))
.OrderBy(a => a.Order);

foreach (var providerBehavior in enabledProviderBehaviors)
{
providerBehavior.Before(request.Prompt);
}

var response = await next();

foreach (var providerBehavior in enabledProviderBehaviors)
{
providerBehavior.After(response.Prompt);
}

return response;
}
}
31 changes: 31 additions & 0 deletions src/Cellm/Models/Providers/Behaviors/GeminiTemperatureBehavior.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
using Cellm.AddIn;
using Cellm.Models.Behaviors;
using Cellm.Models.Prompts;
using Microsoft.Extensions.Options;

namespace Cellm.Models.Providers.Behaviors;

internal class GeminiTemperatureBehavior(IOptionsMonitor<CellmAddInConfiguration> cellmAddinConfiguration) : IProviderBehavior
{
private const float DefaultMaxTemp = 1.0f;
private const float GeminiMaxTemperature = 2.0f;

public bool IsEnabled(Provider provider)
{
return provider == Provider.Gemini;
}

public void Before(Prompt prompt)
{
var temperature = prompt.Options.Temperature ?? (float)cellmAddinConfiguration.CurrentValue.DefaultTemperature;

// Scale temperature from [0;1] to [0;2]
temperature = (temperature / DefaultMaxTemp) * GeminiMaxTemperature;
prompt.Options.Temperature = Math.Clamp(temperature, 0.0f, GeminiMaxTemperature);
}

// No-op
public void After(Prompt prompt) { }

public UInt32 Order => 10;
}
6 changes: 6 additions & 0 deletions src/Cellm/Models/Providers/Behaviors/IProvider.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace Cellm.Models.Providers;

internal interface IProvider
{
public Provider Provider { get; }
}
14 changes: 14 additions & 0 deletions src/Cellm/Models/Providers/Behaviors/IProviderBehavior.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
using Cellm.Models.Prompts;

namespace Cellm.Models.Providers.Behaviors;

internal interface IProviderBehavior
{
internal bool IsEnabled(Provider Provider);

internal void Before(Prompt prompt);

internal void After(Prompt prompt);

internal UInt32 Order { get; }
}
Loading