Skip to content

ChatSession - restarting

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
using LLama.Common;

namespace LLama.Examples.Examples;

// This example shows how to restart the chat session
public class ChatSessionWithRestart
{
    public static async Task Run()
    {
        string modelPath = UserSettings.GetModelPath();

        var parameters = new ModelParams(modelPath)
        {
            ContextSize = 1024,
            Seed = 1337,
            GpuLayerCount = 5
        };
        using var model = LLamaWeights.LoadFromFile(parameters);
        using var context = model.CreateContext(parameters);
        var executor = new InteractiveExecutor(context);

        var chatHistoryJson = File.ReadAllText("Assets/chat-with-bob.json");
        ChatHistory chatHistory = ChatHistory.FromJson(chatHistoryJson) ?? new ChatHistory();
        ChatSession prototypeSession = 
            await ChatSession.InitializeSessionFromHistoryAsync(executor, chatHistory);
        prototypeSession.WithOutputTransform(new LLamaTransforms.KeywordTextOutputStreamTransform(
            new string[] { "User:", "Assistant:" },
            redundancyLength: 8));
        var resetState = prototypeSession.GetSessionState();

        ChatSession session = new ChatSession(executor);
        session.LoadSession(resetState);

        InferenceParams inferenceParams = new InferenceParams()
        {
            Temperature = 0.9f,
            AntiPrompts = new List<string> { "User:" }
        };

        Console.ForegroundColor = ConsoleColor.Yellow;
        Console.WriteLine("The chat session has started. Starting point saved.");
        Console.WriteLine("Type 'exit' to end the chat session.");
        Console.WriteLine("Type 'save' to save chat session state in memory.");
        Console.WriteLine("Type 'reset' to reset the chat session to its saved state.");
        Console.WriteLine("Type 'answer for assistant' to add and process provided user and assistant messages.");

        // show the prompt
        Console.ForegroundColor = ConsoleColor.Green;
        string userInput = Console.ReadLine() ?? "";

        while (userInput != "exit")
        {
            // Load the session state from the reset state
            if(userInput == "reset")
            {
                session.LoadSession(resetState);
                Console.WriteLine($"Reset to history:\n{session.HistoryTransform.HistoryToText(session.History)}");
                Console.ForegroundColor = ConsoleColor.Yellow;
                Console.WriteLine("Session reset.");
            }
            // Assign new reset state.
            else if (userInput == "save")
            {
                resetState = session.GetSessionState();
                Console.ForegroundColor = ConsoleColor.Yellow;
                Console.WriteLine("Session saved.");
            }
            // Provide user and override assistant answer with your own.
            else if (userInput == "answer for assistant")
            {
                Console.ForegroundColor = ConsoleColor.Yellow;
                Console.WriteLine("Provide user input: ");

                Console.ForegroundColor = ConsoleColor.Green;
                string userInputOverride = Console.ReadLine() ?? "";

                Console.ForegroundColor = ConsoleColor.Yellow;
                Console.WriteLine("Provide assistant input: ");

                Console.ForegroundColor = ConsoleColor.Green;
                string assistantInputOverride = Console.ReadLine() ?? "";

                await session.AddAndProcessUserMessage(userInputOverride);
                await session.AddAndProcessAssistantMessage(assistantInputOverride);

                Console.ForegroundColor = ConsoleColor.Yellow;
                Console.WriteLine("User and assistant messages processed. Provide next user message:");
            }
            else
            {
                await foreach (
                    var text
                    in session.ChatAsync(
                        new ChatHistory.Message(AuthorRole.User, userInput),
                        inferenceParams))
                {
                    Console.ForegroundColor = ConsoleColor.White;
                    Console.Write(text);
                }
            }

            Console.ForegroundColor = ConsoleColor.Green;
            userInput = Console.ReadLine() ?? "";

            Console.ForegroundColor = ConsoleColor.White;
        }
    }
}