From 98b6a2aeedd591058c1d81e401d24f3ded162926 Mon Sep 17 00:00:00 2001 From: tanaka takashi Date: Wed, 12 Aug 2026 00:21:23 +0900 Subject: fix: implement native Ollama thinking semantics Model Ollama chat thinking separately from final content, preserve it only across assistant tool-call continuation, and keep private reasoning out of user results, session context, and logs. Accept native boolean and low/medium/high/max think values, normalize YAML booleans, and serialize explicit overrides using the native top-level chat field. Stop forcing think=false for structured planning, skill selection, and context summaries; corrected retries now retain the configured thinking mode. Update the specification, design, audit report, and requirement traceability for OLL-14. Add request/response, configuration, observability, retry, and tool-continuation coverage. Verified with 92 passing Agent.Core tests and a deepseek-v4-flash:cloud think:true MCP operational run. --- src/Agent.App/Configuration/AgentConfiguration.cs | 2 +- src/Agent.App/Configuration/ConfigurationLoader.cs | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) (limited to 'src/Agent.App') diff --git a/src/Agent.App/Configuration/AgentConfiguration.cs b/src/Agent.App/Configuration/AgentConfiguration.cs index 362b889..c5f720b 100644 --- a/src/Agent.App/Configuration/AgentConfiguration.cs +++ b/src/Agent.App/Configuration/AgentConfiguration.cs @@ -35,7 +35,7 @@ public sealed class OllamaConfiguration { public string Endpoint { get; set; } = "http://127.0.0.1:11434"; public string Model { get; set; } = string.Empty; - public bool Think { get; set; } = true; + public object Think { get; set; } = true; public string KeepAlive { get; set; } = "5m"; public OllamaGenerationOptions Options { get; set; } = new(); public Dictionary ExtraOptions { get; set; } = new(StringComparer.Ordinal); diff --git a/src/Agent.App/Configuration/ConfigurationLoader.cs b/src/Agent.App/Configuration/ConfigurationLoader.cs index efb3db1..26c56e1 100644 --- a/src/Agent.App/Configuration/ConfigurationLoader.cs +++ b/src/Agent.App/Configuration/ConfigurationLoader.cs @@ -53,6 +53,11 @@ public static partial class ConfigurationLoader if (value.Agent.MaxIterations <= 0 || value.Agent.SameFailureLimit <= 0) Throw("agent iteration limits must be positive."); if (!Uri.TryCreate(value.Ollama.Endpoint, UriKind.Absolute, out Uri? endpoint) || endpoint.Scheme is not ("http" or "https")) Throw("ollama.endpoint must be an absolute HTTP(S) URI."); if (string.IsNullOrWhiteSpace(value.Ollama.Model)) Throw("ollama.model is required."); + if (value.Ollama.Think is string booleanText && bool.TryParse(booleanText, out bool booleanThink)) + value.Ollama.Think = booleanThink; + if (value.Ollama.Think is not bool && + (value.Ollama.Think is not string thinkLevel || thinkLevel is not ("low" or "medium" or "high" or "max"))) + Throw("ollama.think must be true, false, low, medium, high, or max."); if (value.Ollama.Options.NumCtx is <= 0) Throw("ollama.options.num_ctx must be positive."); if (value.Ollama.Options.Temperature is < 0 or > 2) Throw("ollama.options.temperature must be in 0..2."); if (value.Planner.MaxTasks is < 1 or > 32) Throw("planner.max_tasks must be in 1..32."); -- cgit v1.2.3