using Markdig;
using Markdig.Syntax;
namespace Dpz.Core.Service.Network.Models;
/// <summary>
/// Chat Completion API 响应
/// </summary>
public class ChatCompletionResponse
{
[JsonPropertyName("id")]
public string Id { get; set; } = string.Empty;
[JsonPropertyName("object")]
public string Object { get; set; } = string.Empty;
[JsonPropertyName("created")]
public long Created { get; set; }
[JsonPropertyName("model")]
public string Model { get; set; } = string.Empty;
[JsonPropertyName("provider")]
public string? Provider { get; set; }
[JsonPropertyName("choices")]
public List<CompletionChoice> Choices { get; set; } = [];
[JsonPropertyName("usage")]
public Usage? Usage { get; set; }
public ResponseResult<T?> Analyze<T>()
where T : new()
{
var result = new ResponseResult<T?>();
T? t = default;
var content = Choices.Count > 0 ? Choices[0].Message.Content ?? "" : "";
try
{
var pipeline = new MarkdownPipelineBuilder()
.UseAutoLinks()
.UsePipeTables()
.UseTaskLists()
.UseEmphasisExtras()
.UseAutoIdentifiers()
.Build();
var document = Markdown.Parse(content, pipeline);
var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true };
var codeBlocks = document.Descendants<CodeBlock>().ToList();
if (codeBlocks.Count == 0)
{
JsonSerializer.Deserialize<T>(content, options);
}
foreach (var json in codeBlocks.Select(codeBlock => codeBlock.Lines.ToString()))
{
t = JsonSerializer.Deserialize<T>(json, options);
break;
}
}
catch (Exception e)
{
result.Arguments = [content];
return result.FailResult(e.Message);
}
return result.SuccessResult(t);
}
}