| 1 | namespace CascadeIDE.Models; |
| 2 | |
| 3 | /// <summary>Детали модели Ollama из API (POST /api/show и GET /api/tags).</summary> |
| 4 | public sealed class OllamaModelDetails |
| 5 | { |
| 6 | public string? ParameterSize { get; init; } |
| 7 | public string? QuantizationLevel { get; init; } |
| 8 | public string? Family { get; init; } |
| 9 | public IReadOnlyList<string> Capabilities { get; init; } = []; |
| 10 | public long? ContextLength { get; init; } |
| 11 | public string? License { get; init; } |
| 12 | public long? SizeBytes { get; init; } |
| 13 | public string? Format { get; init; } |
| 14 | public string? ModifiedAt { get; init; } |
| 15 | |
| 16 | /// <summary>Краткая строка для отображения (размер, квантизация, контекст, возможности).</summary> |
| 17 | public string ToShortString() |
| 18 | { |
| 19 | var parts = new List<string>(); |
| 20 | if (!string.IsNullOrEmpty(ParameterSize)) |
| 21 | parts.Add(ParameterSize); |
| 22 | if (!string.IsNullOrEmpty(QuantizationLevel)) |
| 23 | parts.Add(QuantizationLevel); |
| 24 | if (ContextLength is > 0) |
| 25 | parts.Add($"контекст {ContextLength:N0}"); |
| 26 | if (Capabilities.Count > 0) |
| 27 | parts.Add(string.Join(", ", Capabilities)); |
| 28 | return parts.Count == 0 ? "" : string.Join(" · ", parts); |
| 29 | } |
| 30 | |
| 31 | /// <summary>Размер в человекочитаемом виде.</summary> |
| 32 | public string? SizeFormatted => |
| 33 | SizeBytes is null or <= 0 ? null |
| 34 | : SizeBytes < 1024 ? $"{SizeBytes} B" |
| 35 | : SizeBytes < 1024 * 1024 ? $"{SizeBytes / 1024.0:F1} KB" |
| 36 | : SizeBytes < 1024 * 1024 * 1024 ? $"{SizeBytes / (1024.0 * 1024):F1} MB" |
| 37 | : $"{SizeBytes / (1024.0 * 1024 * 1024):F1} GB"; |
| 38 | } |
| 39 | |