diff --git a/SqlDatabaseVectorSearch/Components/Pages/Ask.razor b/SqlDatabaseVectorSearch/Components/Pages/Ask.razor index c160568..b480a77 100644 --- a/SqlDatabaseVectorSearch/Components/Pages/Ask.razor +++ b/SqlDatabaseVectorSearch/Components/Pages/Ask.razor @@ -262,26 +262,29 @@ return string.Empty; } - var reformulation = tokenUsageResponse.Reformulation is not null - ? $"

Reformulation:
{FormatTokenUsageDetails(tokenUsageResponse.Reformulation)}

" - : string.Empty; + (string Label, UsageDetails? Usage)[] sections = + [ + ("Reformulation", tokenUsageResponse.Reformulation), + ("Question", tokenUsageResponse.Question) + ]; - var question = tokenUsageResponse.Question is not null - ? $"

Question:
{FormatTokenUsageDetails(tokenUsageResponse.Question)}

" - : string.Empty; + return string.Concat(sections + .Where(section => section.Usage is not null) + .Select(section => $"

{section.Label}:
{FormatTokenUsageDetails(section.Usage!)}

")); - return $"{reformulation}{question}"; - - static string FormatTokenUsageDetails(UsageDetails? tokenUsage) + static string FormatTokenUsageDetails(UsageDetails tokenUsage) { - if (tokenUsage is null) - { - return string.Empty; - } + // Reasoning tokens are part of the output tokens, so they're shown as a detail of that value. + var outputTokens = tokenUsage.ReasoningTokenCount is > 0 and var reasoningTokenCount + ? $"Output tokens: {tokenUsage.OutputTokenCount} (including {reasoningTokenCount} reasoning tokens)" + : $"Output tokens: {tokenUsage.OutputTokenCount}"; - return $"Input tokens: {tokenUsage.InputTokenCount}
" + - $"Output tokens: {tokenUsage.OutputTokenCount}
" + - $"Total tokens: {tokenUsage.TotalTokenCount}"; + return string.Join("
", + [ + $"Input tokens: {tokenUsage.InputTokenCount}", + outputTokens, + $"Total tokens: {tokenUsage.TotalTokenCount}" + ]); } }