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
2 changes: 1 addition & 1 deletion Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@
<PackageVersion Include="Whisper.net.Runtime" Version="1.8.1" />
<PackageVersion Include="NCrontab" Version="3.3.3" />
<PackageVersion Include="Azure.AI.OpenAI" Version="2.2.0-beta.5" />
<PackageVersion Include="OpenAI" Version="2.2.0-beta.4" />
<PackageVersion Include="OpenAI" Version="2.3.0" />
<PackageVersion Include="MailKit" Version="4.11.0" />
<PackageVersion Include="Microsoft.Data.Sqlite" Version="8.0.8" />
<PackageVersion Include="MySql.Data" Version="9.0.0" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,18 +47,32 @@ public class LlmModelSetting
/// </summary>
public int Dimension { get; set; }

public LlmCost Cost { get; set; } = new();
/// <summary>
/// Settings for reasoning model
/// </summary>
public ReasoningSetting? Reasoning { get; set; }

/// <summary>
/// Settings for llm cost
/// </summary>
public LlmCostSetting Cost { get; set; } = new();

public override string ToString()
{
return $"[{Type}] {Name} {Endpoint}";
}
}

public class ReasoningSetting
{
public float Temperature { get; set; } = 1.0f;
public string? EffortLevel { get; set; }
}

/// <summary>
/// Cost per 1K tokens
/// </summary>
public class LlmCost
public class LlmCostSetting
{
// Input
public float TextInputCost { get; set; } = 0f;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
#pragma warning disable OPENAI001
using BotSharp.Abstraction.Hooks;
using BotSharp.Abstraction.MessageHub.Models;
using BotSharp.Core.Infrastructures.Streams;
Expand All @@ -15,16 +16,6 @@ public class ChatCompletionProvider : IChatCompletion
protected string _model;
private List<string> renderedInstructions = [];

private readonly Dictionary<string, float> _defaultTemperature = new()
{
{ "o3", 1.0f },
{ "o3-mini", 1.0f },
{ "o4-mini", 1.0f },
{ "gpt-5", 1.0f },
{ "gpt-5-mini", 1.0f },
{ "gpt-5-nano", 1.0f }
};

public virtual string Provider => "openai";
public string Model => _model;

Expand Down Expand Up @@ -493,22 +484,24 @@ private string GetPrompt(IEnumerable<ChatMessage> messages, ChatCompletionOption
private ChatCompletionOptions InitChatCompletionOption(Agent agent)
{
var state = _services.GetRequiredService<IConversationStateService>();
var settingsService = _services.GetRequiredService<ILlmProviderService>();
var settings = settingsService.GetSetting(Provider, _model);

ChatReasoningEffortLevel? reasoningEffortLevel = null;
var temperature = float.Parse(state.GetState("temperature", "0.0"));
if (_defaultTemperature.ContainsKey(_model))
if (settings?.Reasoning != null)
{
temperature = _defaultTemperature[_model];
temperature = settings.Reasoning.Temperature;
var level = state.GetState("reasoning_effort_level")
.IfNullOrEmptyAs(agent?.LlmConfig?.ReasoningEffortLevel ?? string.Empty)
.IfNullOrEmptyAs(settings?.Reasoning?.EffortLevel ?? string.Empty);
reasoningEffortLevel = ParseReasoningEffortLevel(level);
}

var maxTokens = int.TryParse(state.GetState("max_tokens"), out var tokens)
? tokens
: agent.LlmConfig?.MaxOutputTokens ?? LlmConstant.DEFAULT_MAX_OUTPUT_TOKEN;

var level = state.GetState("reasoning_effort_level")
.IfNullOrEmptyAs(agent?.LlmConfig?.ReasoningEffortLevel ?? string.Empty)
.IfNullOrEmptyAs(LlmConstant.DEFAULT_REASONING_EFFORT_LEVEL);
var reasoningEffortLevel = ParseReasoningEffortLevel(level);

return new ChatCompletionOptions()
{
Temperature = temperature,
Expand All @@ -519,14 +512,17 @@ private ChatCompletionOptions InitChatCompletionOption(Agent agent)

private ChatReasoningEffortLevel? ParseReasoningEffortLevel(string? level)
{
if (string.IsNullOrWhiteSpace(level) || !_defaultTemperature.ContainsKey(_model))
if (string.IsNullOrWhiteSpace(level))
{
return null;
}

var effortLevel = ChatReasoningEffortLevel.Low;
var effortLevel = new ChatReasoningEffortLevel("minimal");
switch (level.ToLower())
{
case "low":
effortLevel = ChatReasoningEffortLevel.Low;
break;
case "medium":
effortLevel = ChatReasoningEffortLevel.Medium;
break;
Expand Down
Loading