parameters

This commit is contained in:
Vitali sharp8n 2026-09-17 04:15:48 +03:00
parent 9d6f5dc22d
commit 7b05535089
4 changed files with 75 additions and 27 deletions

View file

@ -35,6 +35,21 @@ public class AgentLlmConfig
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public int? MaxOutputTokens { get; set; }
/// <summary>
/// Sampling temperature override for this agent. <c>null</c> (the default) inherits the
/// conversation state / provider settings, so an unset field never changes global behavior.
/// </summary>
[JsonPropertyName("temperature")]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public float? Temperature { get; set; }
/// <summary>
/// Nucleus sampling (top-p) override for this agent. <c>null</c> inherits the defaults.
/// </summary>
[JsonPropertyName("top_p")]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public float? TopP { get; set; }
/// <summary>
/// Reasoning effort level
/// </summary>

View file

@ -565,23 +565,33 @@ public class ChatCompletionProvider : IChatCompletion
var settingsService = _services.GetRequiredService<ILlmProviderService>();
var settings = settingsService.GetSetting(Provider, _model);
// Sampling: an explicit conversation state wins, then the agent's own override, then the
// model's configured reasoning defaults. Unset everywhere keeps the historical 0.0 fallback.
float? temperature = null;
if (state.ContainsState("temperature") && float.TryParse(state.GetState("temperature"), out var stateTemperature))
temperature = stateTemperature;
temperature ??= agent?.LlmConfig?.Temperature;
temperature ??= settings?.Reasoning?.Temperature;
temperature ??= 0.2f;
float? topP = null;
if (state.ContainsState("top_p") && float.TryParse(state.GetState("top_p"), out var stateTopP))
topP = stateTopP;
topP ??= agent?.LlmConfig?.TopP;
// Reasoning effort
ChatReasoningEffortLevel? reasoningEffortLevel = null;
float? temperature = float.Parse(state.GetState("temperature", "0.0"));
if (settings?.Reasoning != null)
{
temperature = settings.Reasoning.Temperature;
var level = state.GetState("reasoning_effort_level")
.IfNullOrEmptyAs(agent?.LlmConfig?.ReasoningEffortLevel)
.IfNullOrEmptyAs(settings?.Reasoning?.EffortLevel);
reasoningEffortLevel = ParseReasoningEffortLevel(level);
}
var level = state.GetState("reasoning_effort_level")
.IfNullOrEmptyAs(agent?.LlmConfig?.ReasoningEffortLevel)
.IfNullOrEmptyAs(settings?.Reasoning?.EffortLevel);
reasoningEffortLevel = ParseReasoningEffortLevel(level);
// Web search
ChatWebSearchOptions? webSearchOptions = null;
if (settings?.WebSearch != null)
{
temperature = null;
topP = null;
reasoningEffortLevel = null;
webSearchOptions = new();
}
@ -593,6 +603,7 @@ public class ChatCompletionProvider : IChatCompletion
return new ChatCompletionOptions()
{
Temperature = temperature,
TopP = topP,
MaxOutputTokenCount = maxTokens,
ReasoningEffortLevel = reasoningEffortLevel,
WebSearchOptions = webSearchOptions

View file

@ -691,23 +691,33 @@ public class ChatCompletionProvider : IChatCompletion
var settingsService = _services.GetRequiredService<ILlmProviderService>();
var settings = settingsService.GetSetting(Provider, _model);
// Sampling: an explicit conversation state wins, then the agent's own override, then the
// model's configured reasoning defaults. Unset everywhere keeps the historical 0.0 fallback.
float? temperature = null;
if (state.ContainsState("temperature") && float.TryParse(state.GetState("temperature"), out var stateTemperature))
temperature = stateTemperature;
temperature ??= agent?.LlmConfig?.Temperature;
temperature ??= settings?.Reasoning?.Temperature;
temperature ??= 0.2f;
float? topP = null;
if (state.ContainsState("top_p") && float.TryParse(state.GetState("top_p"), out var stateTopP))
topP = stateTopP;
topP ??= agent?.LlmConfig?.TopP;
// Reasoning effort
ChatReasoningEffortLevel? reasoningEffortLevel = null;
float? temperature = float.Parse(state.GetState("temperature", "0.0"));
if (settings?.Reasoning != null)
{
temperature = settings.Reasoning.Temperature;
var level = state.GetState("reasoning_effort_level")
.IfNullOrEmptyAs(agent?.LlmConfig?.ReasoningEffortLevel)
.IfNullOrEmptyAs(settings?.Reasoning?.EffortLevel);
reasoningEffortLevel = ParseReasoningEffortLevel(level);
}
var level = state.GetState("reasoning_effort_level")
.IfNullOrEmptyAs(agent?.LlmConfig?.ReasoningEffortLevel)
.IfNullOrEmptyAs(settings?.Reasoning?.EffortLevel);
reasoningEffortLevel = ParseReasoningEffortLevel(level);
// Web search
ChatWebSearchOptions? webSearchOptions = null;
if (settings?.WebSearch != null)
{
temperature = null;
topP = null;
reasoningEffortLevel = null;
webSearchOptions = new();
}
@ -719,6 +729,7 @@ public class ChatCompletionProvider : IChatCompletion
return new ChatCompletionOptions()
{
Temperature = temperature,
TopP = topP,
MaxOutputTokenCount = maxTokens,
ReasoningEffortLevel = reasoningEffortLevel,
WebSearchOptions = webSearchOptions

View file

@ -534,23 +534,33 @@ public class ChatCompletionProvider : IChatCompletion
var settingsService = _services.GetRequiredService<ILlmProviderService>();
var settings = settingsService.GetSetting(Provider, _model);
// Sampling: an explicit conversation state wins, then the agent's own override, then the
// model's configured reasoning defaults. Unset everywhere keeps the historical 0.0 fallback.
float? temperature = null;
if (state.ContainsState("temperature") && float.TryParse(state.GetState("temperature"), out var stateTemperature))
temperature = stateTemperature;
temperature ??= agent?.LlmConfig?.Temperature;
temperature ??= settings?.Reasoning?.Temperature;
temperature ??= 0.2f;
float? topP = null;
if (state.ContainsState("top_p") && float.TryParse(state.GetState("top_p"), out var stateTopP))
topP = stateTopP;
topP ??= agent?.LlmConfig?.TopP;
// Reasoning effort
ChatReasoningEffortLevel? reasoningEffortLevel = null;
float? temperature = float.Parse(state.GetState("temperature", "0.0"));
if (settings?.Reasoning != null)
{
temperature = settings.Reasoning.Temperature;
var level = state.GetState("reasoning_effort_level")
.IfNullOrEmptyAs(agent?.LlmConfig?.ReasoningEffortLevel)
.IfNullOrEmptyAs(settings?.Reasoning?.EffortLevel);
reasoningEffortLevel = ParseReasoningEffortLevel(level);
}
var level = state.GetState("reasoning_effort_level")
.IfNullOrEmptyAs(agent?.LlmConfig?.ReasoningEffortLevel)
.IfNullOrEmptyAs(settings?.Reasoning?.EffortLevel);
reasoningEffortLevel = ParseReasoningEffortLevel(level);
// Web search
ChatWebSearchOptions? webSearchOptions = null;
if (settings?.WebSearch != null)
{
temperature = null;
topP = null;
reasoningEffortLevel = null;
webSearchOptions = new();
}
@ -562,6 +572,7 @@ public class ChatCompletionProvider : IChatCompletion
return new ChatCompletionOptions()
{
Temperature = temperature,
TopP = topP,
MaxOutputTokenCount = maxTokens,
ReasoningEffortLevel = reasoningEffortLevel,
WebSearchOptions = webSearchOptions