using System.Text.Json; using Agent.Core.Ollama; namespace Agent.App.Configuration; public static class OllamaSettingsFactory { public static OllamaSettings Create(OllamaConfiguration configuration) { var options = configuration.ExtraOptions.ToDictionary( static pair => pair.Key, static pair => JsonSerializer.SerializeToElement(pair.Value, pair.Value?.GetType() ?? typeof(object)), StringComparer.Ordinal); Set(options, "num_ctx", configuration.Options.NumCtx); Set(options, "num_keep", configuration.Options.NumKeep); Set(options, "num_predict", configuration.Options.NumPredict); Set(options, "temperature", configuration.Options.Temperature); Set(options, "seed", configuration.Options.Seed); Set(options, "top_k", configuration.Options.TopK); Set(options, "top_p", configuration.Options.TopP); Set(options, "min_p", configuration.Options.MinP); Set(options, "typical_p", configuration.Options.TypicalP); Set(options, "tfs_z", configuration.Options.TfsZ); Set(options, "repeat_last_n", configuration.Options.RepeatLastN); Set(options, "repeat_penalty", configuration.Options.RepeatPenalty); Set(options, "presence_penalty", configuration.Options.PresencePenalty); Set(options, "frequency_penalty", configuration.Options.FrequencyPenalty); Set(options, "mirostat", configuration.Options.Mirostat); Set(options, "mirostat_tau", configuration.Options.MirostatTau); Set(options, "mirostat_eta", configuration.Options.MirostatEta); if (configuration.Options.Stop.Count > 0) options["stop"] = JsonSerializer.SerializeToElement(configuration.Options.Stop); return new OllamaSettings(new Uri(configuration.Endpoint, UriKind.Absolute), configuration.Model, configuration.Think, configuration.KeepAlive, options); } private static void Set(Dictionary options, string key, T? value) where T : struct { if (value is not null) options[key] = JsonSerializer.SerializeToElement(value.Value); } }