< Summary

Information
Class: UIBlazor.Models.ConversationSession
Assembly: UIBlazor
File(s): /home/runner/work/InvAit/InvAit/UIBlazor/Models/ConversationSession.cs
Tag: 71_26091983037
Line coverage
32%
Covered lines: 18
Uncovered lines: 38
Coverable lines: 56
Total lines: 143
Line coverage: 32.1%
Branch coverage
27%
Covered branches: 6
Total branches: 22
Branch coverage: 27.2%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
get_Id()100%11100%
get_Messages()100%11100%
get_CreatedAt()100%11100%
get_LastUpdated()100%11100%
get_TotalTokens()100%11100%
get_Mode()100%11100%
AddMessage(...)100%11100%
RemoveMessage(...)0%620%
UpdateMessage(...)0%620%
GetFormattedMessages(...)50%141275%
GetFormattedMessagesForCompress(...)0%4260%

File(s)

/home/runner/work/InvAit/InvAit/UIBlazor/Models/ConversationSession.cs

#LineLine coverage
 1using static System.Collections.Specialized.BitVector32;
 2
 3namespace UIBlazor.Models;
 4
 5public class ConversationSession : BaseOptions
 6{
 7    /// <summary>
 8    /// Gets or sets the unique identifier for the conversation session.
 9    /// </summary>
 10    [JsonIgnore]
 19811    public string Id { get; set; } = string.Empty;
 12
 13    /// <summary>
 14    /// Gets or sets the list of messages in the conversation.
 15    /// </summary>
 19916    public List<VisualChatMessage> Messages { get; set; } = [];
 17
 18    /// <summary>
 19    /// Gets or sets the timestamp when the conversation was created.
 20    /// </summary>
 10721    public DateTime CreatedAt { get; set; } = DateTime.Now;
 22
 23    /// <summary>
 24    /// Gets or sets the timestamp when the conversation was last updated.
 25    /// </summary>
 10926    public DateTime LastUpdated { get; set; } = DateTime.Now;
 27
 28    /// <summary>
 29    /// Gets or sets the total tokens used in the conversation.
 30    /// </summary>
 28531    public int TotalTokens { get; set; }
 32
 33    /// <summary>
 34    /// Gets or sets the current application mode for this session.
 35    /// </summary>
 70836    public AppMode Mode { get; set => SetIfChanged(ref field, value); } = AppMode.Chat;
 37
 38    /// <summary>
 39    /// Adds a message object to the conversation and manages memory limits.
 40    /// </summary>
 41    public void AddMessage(VisualChatMessage message)
 42    {
 243        Messages.Add(message);
 244        LastUpdated = DateTime.Now;
 245    }
 46
 47    /// <summary>
 48    /// Removes a message from the conversation.
 49    /// </summary>
 50    public void RemoveMessage(string id)
 51    {
 052        var message = Messages.FirstOrDefault(m => m.Id == id);
 053        if (message != null)
 54        {
 055            Messages.Remove(message);
 056            LastUpdated = DateTime.Now;
 57        }
 058    }
 59
 60    /// <summary>
 61    /// Updates the content of a message.
 62    /// </summary>
 63    public void UpdateMessage(string id, string content)
 64    {
 065        var message = Messages.FirstOrDefault(m => m.Id == id);
 066        if (message != null)
 67        {
 068            message.Content = content;
 069            LastUpdated = DateTime.Now;
 70        }
 071    }
 72
 73    /// <summary>
 74    /// Gets the conversation messages formatted for the AI API.
 75    /// </summary>
 76    /// <param name="systemPrompt">The system prompt to include.</param>
 77    /// <returns>A list of message objects for the AI API.</returns>
 78    public IEnumerable<object> GetFormattedMessages(string systemPrompt)
 79    {
 580        var messages = new List<object>
 581        {
 582            // Add system message
 583            new { role = ChatMessageRole.System, content = systemPrompt }
 584        };
 85
 86        // Add conversation messages, flattening nested tool messages
 1087        foreach (var message in Messages)
 88        {
 089            messages.Add(new { role = message.Role, content = message.Content });
 90
 91            // Tool results stored nested must be sent as separate messages to the LLM
 092            foreach (var toolMessage in message.ToolResults)
 93            {
 094                messages.Add(new { role = ChatMessageRole.User, content = toolMessage.Content });
 95            }
 96        }
 97
 598        return Messages is [.., { IsStreaming: true }] // не отправлять последнее сообщение, если оно стримится
 599            ? messages.SkipLast(1)
 5100            : messages;
 101    }
 102
 103    public (IEnumerable<object> Messages, VisualChatMessage? LastUserMessage) GetFormattedMessagesForCompress(string sys
 104    {
 0105        var messages = new List<object>
 0106        {
 0107            // Add system message
 0108            new { role = ChatMessageRole.System, content = systemPrompt }
 0109        };
 110
 0111        var lastUserMessage = Messages.TakeLast(2).FirstOrDefault(m => m.Role == ChatMessageRole.User);
 0112        var compressedMessages = Messages.SkipLast(lastUserMessage is null ? 1 : 2);
 113
 114        // Add conversation messages, flattening nested tool messages
 0115        foreach (var message in compressedMessages)
 116        {
 0117            messages.Add(new { role = message.Role, content = message.Content });
 118
 119            // Tool results stored nested must be sent as separate messages to the LLM
 0120            foreach (var toolMessage in message.ToolResults)
 121            {
 0122                messages.Add(new { role = ChatMessageRole.User, content = toolMessage.Content });
 123            }
 124        }
 125
 0126        messages.Add(new
 0127        {
 0128            role = ChatMessageRole.User,
 0129            content = """
 0130                Act as a Context Compressor.
 0131                Summarize the following tool calls and assistant responses.
 0132                Preserve:
 0133                    1. Final results of searches
 0134                    2. Key variable names/file paths
 0135                    3. Errors encountered. Remove: redundant JSON structures and intermediate steps.
 0136                Format: 'Previous actions: [Concise Summary]'
 0137                """
 0138        });
 139
 0140        return (messages, lastUserMessage);
 141    }
 142}
 143