using System.Collections.Generic; using System.Text.Json; using System.Text.Json.Serialization; namespace Gott.Models; public class ChatMessage { [JsonPropertyName("role")] public string Role { get; set; } = ""; [JsonPropertyName("content")] public JsonElement Content { get; set; } /// /// Extrahiert den reinen Text aus Content (egal ob string oder content-block array). /// public string GetTextContent() { if (Content.ValueKind == JsonValueKind.String) return Content.GetString() ?? ""; if (Content.ValueKind == JsonValueKind.Array) { var parts = new List(); foreach (var block in Content.EnumerateArray()) { if (block.TryGetProperty("type", out var t) && t.GetString() == "text" && block.TryGetProperty("text", out var txt)) parts.Add(txt.GetString() ?? ""); } return string.Join("\n", parts); } return Content.ToString(); } /// /// Prüft ob Datei-Attachments (image/document) enthalten sind. /// public bool HasAttachments() { if (Content.ValueKind != JsonValueKind.Array) return false; foreach (var block in Content.EnumerateArray()) { if (block.TryGetProperty("type", out var t)) { var type = t.GetString(); if (type == "image" || type == "document") return true; } } return false; } /// /// Gibt Attachment-Infos zurück (type + media_type). /// public List GetAttachments() { var result = new List(); if (Content.ValueKind != JsonValueKind.Array) return result; foreach (var block in Content.EnumerateArray()) { if (block.TryGetProperty("type", out var t)) { var type = t.GetString(); if (type == "image" || type == "document") { var mediaType = ""; if (block.TryGetProperty("source", out var src) && src.TryGetProperty("media_type", out var mt)) mediaType = mt.GetString() ?? ""; result.Add(new AttachmentInfo { Type = type, MediaType = mediaType }); } } } return result; } /// /// Gibt vollständige Attachment-Blöcke zurück (inkl. Base64-Daten). /// public List GetAttachmentBlocks() { var result = new List(); if (Content.ValueKind != JsonValueKind.Array) return result; foreach (var block in Content.EnumerateArray()) { if (block.TryGetProperty("type", out var t)) { var type = t.GetString(); if (type == "image" || type == "document") { var mediaType = ""; var data = ""; var fileName = ""; if (block.TryGetProperty("source", out var src)) { if (src.TryGetProperty("media_type", out var mt)) mediaType = mt.GetString() ?? ""; if (src.TryGetProperty("data", out var d)) data = d.GetString() ?? ""; } if (block.TryGetProperty("_file_name", out var fn)) fileName = fn.GetString() ?? ""; result.Add(new AttachmentBlock { Type = type, MediaType = mediaType, Data = data, FileName = fileName }); } } } return result; } } public class AttachmentBlock { public string Type { get; set; } = ""; public string MediaType { get; set; } = ""; public string Data { get; set; } = ""; public string FileName { get; set; } = ""; } public class AttachmentInfo { public string Type { get; set; } = ""; public string MediaType { get; set; } = ""; } public class ChatRequest { [JsonPropertyName("content")] public JsonElement Content { get; set; } [JsonPropertyName("sessionId")] public string SessionId { get; set; } = ""; /// /// Wenn gesetzt: Dies ist eine Antwort auf ein ask_user_choice Tool. /// Enthält die tool_use_id des offenen ask_user_choice-Calls. /// [JsonPropertyName("choiceToolCallId")] public string ChoiceToolCallId { get; set; } /// /// Der gewählte Text aus den Auswahloptionen. /// [JsonPropertyName("choiceResult")] public string ChoiceResult { get; set; } }