using System.Text.Json; using Yi.Framework.AiHub.Domain.Shared.Dtos.OpenAi; using Yi.Framework.AiHub.Domain.Shared.Extensions; namespace Yi.Framework.AiHub.Domain.Shared.Dtos.Gemini; public static class GeminiGenerateContentAcquirer { public static ThorUsageResponse? GetUsage(JsonElement response) { var usage = response.GetPath("usageMetadata"); if (!usage.HasValue) { return null; } var inputTokens = usage.Value.GetPath("promptTokenCount").GetInt(); var outputTokens = usage.Value.GetPath("candidatesTokenCount").GetInt() + usage.Value.GetPath("cachedContentTokenCount").GetInt() + usage.Value.GetPath("thoughtsTokenCount").GetInt() + usage.Value.GetPath("toolUsePromptTokenCount").GetInt(); return new ThorUsageResponse { PromptTokens = inputTokens, InputTokens = inputTokens, OutputTokens = outputTokens, CompletionTokens = outputTokens, TotalTokens = inputTokens + outputTokens, }; } /// /// 获取图片url,包含前缀 /// /// /// public static string GetImagePrefixBase64(JsonElement response) { // 获取 candidates[0].content.parts[0].text var text = response.GetPath("candidates", 0, "content", "parts", 0, "text").GetString(); if (string.IsNullOrEmpty(text)) { return string.Empty; } // 解析 markdown 图片格式: ![image](data:image/png;base64,xxx) // 提取括号内的 data:image/xxx;base64,xxx 部分 var startMarker = "(data:image/"; var startIndex = text.IndexOf(startMarker); if (startIndex < 0) { return string.Empty; } // 从 "data:" 开始 startIndex += 1; // 跳过 "(" var endIndex = text.IndexOf(')', startIndex); if (endIndex < 0) { return string.Empty; } return text.Substring(startIndex, endIndex - startIndex); } }