hopto-dot.llama_cs 0.0.2

dotnet add package hopto-dot.llama_cs --version 0.0.2
                    
NuGet\Install-Package hopto-dot.llama_cs -Version 0.0.2
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="hopto-dot.llama_cs" Version="0.0.2" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="hopto-dot.llama_cs" Version="0.0.2" />
                    
Directory.Packages.props
<PackageReference Include="hopto-dot.llama_cs" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add hopto-dot.llama_cs --version 0.0.2
                    
#r "nuget: hopto-dot.llama_cs, 0.0.2"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package hopto-dot.llama_cs@0.0.2
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=hopto-dot.llama_cs&version=0.0.2
                    
Install as a Cake Addin
#tool nuget:?package=hopto-dot.llama_cs&version=0.0.2
                    
Install as a Cake Tool

llama-cs

A sillytaven-like c# library for interfacing with llama.cpp's inference server.

If you are on Windows, you can find a build for the server by going to llama.cpp's latest releases then downloading the file containing bin-win-cuda, and depending on your version of cuda: cu11.7.1, or cu12.2.0. Avoid any file starting with cudart. You should run llama-server.exe -m "gguf path here" (along with any other arguments you want) to start the server.

See simple example app here.

How to use

Use llama_cs

using llama_cs;

Simple method

var client = new LlmClient(new InstructSequence()); // Default InstructSequence uses Alpaca instruct formatting
client.AddAssistantMessage("Hello, how can I help?"); // Manually add a message from the assistant

string response = client.GetResponse("What is the meaning of life?").Result;

Console.Writeline(response); // print llm response

(Note: calling GetResponse() adds the message you pass into it to the chat history for you)

Change instruct mode

The default instruct mode is Alpaca.

If you want to change it to Gemma instruct formatting:

var instructSequence = new InstructSequence("gemma"); // Also supports "command-r"

var client = new LlmClient(instructSequence)

Change llm api parameters

// LlmParameters supports most of llama.cpp's inference parameters
var llmParameters = new LlmParameters();
llmParameters.temperature = 1;
llmParameters.n_predict = 50; // max tokens to generate (default 500)
llmParameters.grammar = File.ReadAllText(@"C:\Users\user\Documents\Git\llama.cpp\grammars\japanese.gbnf"); // specify grammar the llm follows

var client = new LlmClient(instructSequence, llmParameters, port: 1234); // specify the port the server is running

Roleplay as a person with a character

var instructSequence = new InstructSequence("command-r");

var character = new Character(@"C:\Users\user\Downloads\Philomena Cunk.json"); // Make assistant roleplay as a character exported from SillyTavern
var user = new User("Gavin", "Gavin is a 20 year old guy that wants to learn about Britain."); // Set user's name and description

var llmParameters = new LlmParameters();
llmParameters.AddLogitBias(12309, -100); // ban token with ID 12309

var client = new LlmClient(instructSequence, llmParameters, character, user);

Advanced

The library doesn't support an instruct pattern?

No problem!

Specify it yourself

var newInstructSequence = new InstructSequence("### Instruction:\n", // UserMessagePrefix
                                               "\n\n",               // UserMessageSuffix
                                               "### Response:\n",    // AssistantMessagePrefix
                                               "\n\n",               // AssistantMessageSuffix
                                               false,                // IncludeNames
                                               false,                // UseUserMessageAsSystem
                                               // system message:
                                               "You are an expert actor that can fully immerse yourself into any role given. You do not break character for any reason and always talk in first person. Currently your role is {{char}}, which is described in detail below. As {{char}}, continue the exchange with {{user}}.\n{{char_prompt}}\n{{user_prompt}}"
                                               );

In the system prompt, write {{user}} where you want to be replaced with the user's name and {{char}} for the assistant's name.

If you want to specify a character and username, you should include {{char_prompt}} and {{user_prompt}} towards the end of the system prompt like the above example.

Sometimes enabling IncludeNames makes it easier for the llm to understand who is who, however can confuse it just as much. Experiment with it.

Currently, UseUserMessageAsSystem does nothing.

See what text the llm is passed

GetInstructString() returns the whole context of the conversation (what the llm sees) as a string.

client.GetInstructString(); // print with Console.WriteLine(), at the moment this does nothing

Example simple chat app

var instructSequence = new InstructSequence();

var character = new Character(@"C:\Users\user\Downloads\Philomena Cunk.json"); // Make assistant roleplay as a character exported from SillyTavern
var user = new User("Gavin", "Gavin is a 20 year old guy that wants to learn about Britain."); // Set user's name and description

var llmParameters = new LlmParameters();
llmParameters.temperature = 1;

var client = new LlmClient(instructSequence, llmParameters, character, user); // assumes server is running on port 8000

string userMessage = "";
while (true)
{
    Console.Write("User: ");
    userMessage = Console.ReadLine();

    string response = client.GetResponse(userMessage).Result;

    Console.WriteLine($"\nAssistant: {response}\n");
}
Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
0.0.2 143 7/18/2024
0.0.1.2 106 7/16/2024
0.0.1.1 109 7/16/2024
0.0.1 122 7/16/2024