Giter VIP home page Giter VIP logo

johniwasz / whetstone.chatgpt Goto Github PK

View Code? Open in Web Editor NEW
95.0 8.0 16.0 405.76 MB

A simple light-weight library that wraps the Open AI API.

Home Page: https://johniwasz.github.io/whetstone.chatgpt/

License: MIT License

HTML 2.91% CSS 40.98% JavaScript 17.26% Batchfile 0.01% C# 38.84%
chatgpt dotnet dotnet-standard2-1 openai gpt-3 gpt-35-turbo dotnet-standard2 gpt-4 whisper whisper-ai

whetstone.chatgpt's Introduction

CodeQL

Whetstone.ChatGPT

A simple light-weight library that wraps the Open AI API with support for dependency injection.

Supported features include:

  • GPT 4, GPT 3.5 Turbo and Chat Completions
  • Audio Transcription and Translation (Whisper API)
  • Chat Completions
  • Vision Completions
  • Files
  • Fine Tunes
  • Images
  • Embeddings
  • Moderations
  • Response streaming

For a video walkthrough of a Blazor web app built on this library, please see:

BlazorDemo_Twitter.mp4

This is deployed to github pages and available at: Open AI UI. Source for the Blazor web app is at Whetstone.ChatGPT.Blazor.App.

Examples include:

Dependency Injection Quickstart

services.Configure<ChatGPTCredentials>(options =>
{    
    options.ApiKey = "YOURAPIKEY";
    options.Organization = "YOURORGANIZATIONID";
});

Use:

services.AddHttpClient();

or:

services.AddHttpClient<IChatGPTClient, ChatGPTClient>();

Configure IChatGPTClient service:

services.AddScoped<IChatGPTClient, ChatGPTClient>();

Chat Completions

Chat completions are a special type of completion that are optimized for chat. They are designed to be used in a conversational context.

Chat Completion Quickstart

This shows a usage of the GPT-3.5 Turbo model.

using Whetstone.ChatGPT;
using Whetstone.ChatGPT.Models;

. . .

var gptRequest = new ChatGPTChatCompletionRequest
{
    Model = ChatGPT35Models.Turbo,
    Messages = new List<ChatGPTChatCompletionMessage>()
        {
            new ChatGPTChatCompletionMessage(ChatGPTMessageRoles.System, "You are a helpful assistant."),
            new ChatGPTChatCompletionMessage(ChatGPTMessageRoles.User, "Who won the world series in 2020?"),
            new ChatGPTChatCompletionMessage(ChatGPTMessageRoles.Assistant, "The Los Angeles Dodgers won the World Series in 2020."),
            new ChatGPTChatCompletionMessage(ChatGPTMessageRoles.User, "Where was it played?")
        },
    Temperature = 0.9f,
    MaxTokens = 100
};

using IChatGPTClient client = new ChatGPTClient("YOURAPIKEY");

var response = await client.CreateChatCompletionAsync(gptRequest);

Console.WriteLine(response?.GetCompletionText());

GPT-4 models can also be used provided your account has been granted access to the limited beta.

Completion

Completions use models to answer a wide variety of tasks, including but not limited to classification, sentiment analysis, answering questions, etc.

Completion Quickstart

This shows a direct useage of the gpt-3.5-turbo-instruct model without any prompts.

Please note, CreateCompletionAsync is obsolete. Use ChatGPTChatCompletionRequest, ChatGPTChatCompletionResponse, and the CreateChatCompletionAsync method instead.

using Whetstone.ChatGPT;
using Whetstone.ChatGPT.Models;

. . .

var gptRequest = new ChatGPTCompletionRequest
{
    Model =  ChatGPT35Models.Gpt35TurboInstruct,
    Prompt = "How is the weather?"
};

using IChatGPTClient client = new ChatGPTClient("YOURAPIKEY");

var response = await client.CreateCompletionAsync(gptRequest);

Console.WriteLine(response.GetCompletionText());

GPT-3.5 is not deterministic. One of the test runs of the sample above returned:

The weather can vary greatly depending on location. In general, you can expect temperatures to be moderate and climate to be comfortable, but it is always best to check the forecast for your specific area.

Completion Code Sample

A C# console application that uses completions is available at:

Whetstone.ChatGPT.CommandLineBot (chatgpt-marv)

This sample includes:

  • Authentication
  • Created a completion request using a prompt
  • Processing completion responses

File Quickstart

How to create a upload a new fine tuning file.

List<ChatGPTTurboFineTuneLine> tuningInput = new() 
{
    new ChatGPTTurboFineTuneLine()
        { 
            Messages = new List<ChatGPTTurboFineTuneLineMessage>()
            { 
                 new(ChatGPTMessageRoles.System, "Marv is a factual chatbot that is also sarcastic."),
                 new(ChatGPTMessageRoles.User, "What's the capital of France?"),
                 new(ChatGPTMessageRoles.Assistant, "Paris, as if everyone doesn't know that already.")
            },
        },
    new ChatGPTTurboFineTuneLine()
        {
            Messages = new List<ChatGPTTurboFineTuneLineMessage>()
            {
                 new(ChatGPTMessageRoles.System, "Marv is a factual chatbot that is also sarcastic."),
                 new(ChatGPTMessageRoles.User, "Who wrote 'Romeo and Juliet'?"),
                 new(ChatGPTMessageRoles.Assistant, "Oh, just some guy named William Shakespeare. Ever heard of him?")
            },
        },
    . . .
};

byte[] tuningText = tuningInput.ToJsonLBinary();

string fileName = "marvin.jsonl";

ChatGPTUploadFileRequest? uploadRequest = new ChatGPTUploadFileRequest
{
    File = new ChatGPTFileContent
    {
        FileName = fileName,
        Content = tuningText
    }
};

ChatGPTFileInfo? newTurboTestFile;

using (IChatGPTClient client = new ChatGPTClient("YOURAPIKEY"))
{
    newTurboTestFile = await client.UploadFileAsync(uploadRequest);
}

Fine Tuning Quickstart

Once the file has been created, get the fileId, and reference it when creating a new fine tuning.

IChatGPTClient client = new ChatGPTClient("YOURAPIKEY");

uploadedFileInfo = await client.UploadFileAsync(uploadRequest);

var fileList = await client.ListFilesAsync();
var foundFile = fileList?.Data?.First(x => x.Filename.Equals("marvin.jsonl"));

ChatGPTCreateFineTuneRequest tuningRequest = new ChatGPTCreateFineTuneRequest
{
    TrainingFileId = foundFile?.Id,
    Model = "gpt-3.5-turbo-1106"
};

ChatGPTFineTuneJob? tuneResponse = await client.CreateFineTuneAsync(tuningRequest);

string? fineTuneId = tuneResponse?.Id;

Processing the fine tuning request will take some time. Once it finishes, the Status will report "succeeded" and it's ready to be used in a completion request.

using IChatGPTClient client = new ChatGPTClient("YOURAPIKEY");

ChatGPTFineTuneJob? tuneResponse = await client.RetrieveFineTuneAsync("FINETUNEID");

if (tuneResponse.Status.Equals("succeeded"))
{
    var gptRequest = new ChatGPTChatCompletionRequest
    {
        Model = "FINETUNEID",
        Messages = new List<ChatGPTChatCompletionMessage>()
        {
            new ChatGPTChatCompletionMessage(ChatGPTMessageRoles.System, "You are a helpful assistant."),
            new ChatGPTChatCompletionMessage(ChatGPTMessageRoles.User, "Who won the world series in 2020?"),
            new ChatGPTChatCompletionMessage(ChatGPTMessageRoles.Assistant, "The Los Angeles Dodgers won the World Series in 2020."),
            new ChatGPTChatCompletionMessage(ChatGPTMessageRoles.User, "Where was it played?")
        },
        Temperature = 0.9f,
        MaxTokens = 100
    };
    
    var response = await client.CreateChatCompletionAsync(gptRequest);

    Console.WriteLine(response?.GetCompletionText());

Image Quickstart

Here's an example that generates a 1024x1024 image.

ChatGPTCreateImageRequest imageRequest = new()
{
    Prompt = "A sail boat",
    Size = CreatedImageSize.Size1024,
    ResponseFormat = CreatedImageFormat.Base64
};

using IChatGPTClient client = new ChatGPTClient("YOURAPIKEY");

ChatGPTImageResponse? imageResponse = await client.CreateImageAsync(imageRequest);

var imageData = imageResponse?.Data?[0];

if (imageData != null)
{
    byte[]? imageBytes = await client.DownloadImageAsync(imageData);
}

Audio Transcription Quickstart

Her's an example that transcribes an audio file using the Whisper.

string audioFile = @"audiofiles\transcriptiontest.mp3";

byte[] fileContents = File.ReadAllBytes(audioFile);
ChatGPTFileContent gptFile = new ChatGPTFileContent
{
    FileName = audioFile,
    Content = fileContents
};

ChatGPTAudioTranscriptionRequest? transcriptionRequest = new ChatGPTAudioTranscriptionRequest
{
    File = gptFile
};

using IChatGPTClient client = new ChatGPTClient("YOURAPIKEY");

ChatGPTAudioResponse? audioResponse = await client.CreateTranscriptionAsync(transcriptionRequest, true);

Console.WriteLine(audioResponse?.Text);

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.