Skip to content

Instantly share code, notes, and snippets.

@akirco
Last active August 16, 2023 12:57
Show Gist options
  • Save akirco/7e478a8ea549519276329bbde2e155f8 to your computer and use it in GitHub Desktop.
Save akirco/7e478a8ea549519276329bbde2e155f8 to your computer and use it in GitHub Desktop.
how to write a chatbot with powershell
tags categories cover
PowerShell
development
function chat() {
    $prompts = @()
    while ($true) {
        $sessionResponse = ""
        Write-Host "Q: " -BackgroundColor DarkCyan -NoNewline
        $prompt = Read-Host
        if ($prompt -eq "q") {
            break
        }
        if ($prompt -eq "cls") {
            Clear-Host
            continue
        }
        if ($prompt -eq "" -or $prompt -eq "help") {
            Write-Host "
            _________ .__            __                 __
            \_   ___ \|  |__ _____ _/  |_  ____ _______/  |_
            /    \  \/|  |  \\__  \\   __\/ ___\\____ \   __\
            \     \___|   Y  \/ __ \|  | / /_/  >  |_> >  |
             \______  /___|  (____  /__| \___  /|   __/|__|
                    \/     \/     \/    /_____/ |__|
            " -ForegroundColor DarkRed
            Write-Host "`t Special Prompt: " -ForegroundColor Red
            Write-Host "`t ● q  = quit prompt`n`t ● cls = clear host`n`t ● n = new conversation" -ForegroundColor DarkBlue
        }
        elseif ($prompt -eq "n") {
            $prompts = @()
        }
        else {
            $prompts += @{
                role    = "user";
                content = $prompt
            }
            if ($prompts -ne @()) {
                $API_URL = "https://openai.extrameta.cn/v1/chat/completions"
                $API_KEY = ""
                Write-Host "A: " -NoNewline -BackgroundColor DarkYellow
                $request = [System.Net.WebRequest]::Create($API_URL)
                $request.Method = "POST"
                $request.ContentType = "application/json"
                $request.Headers.Add("Authorization", "Bearer $API_KEY")
                $data = @{
                    model       = "gpt-3.5-turbo";
                    messages    = $prompts;
                    temperature = 0;
                    max_tokens  = 3000;
                    stream      = $true;
                }
                $body = ConvertTo-Json $data
                $requestStream = $request.GetRequestStream()
                $writer = New-Object System.IO.StreamWriter($requestStream)
                $writer.Write($body)
                $writer.Flush()
                $response = $request.GetResponse()
                $stream = $response.GetResponseStream()
                $reader = New-Object System.IO.StreamReader($stream)
                while (!$reader.EndOfStream) {
                    $line = $reader.ReadLine()
                    if (![string]::IsNullOrWhiteSpace($line)) {
                        if ($line -match '^data: (.+)$') {
                            $eventData = $Matches[1]
                            if ($eventData -ne "[DONE]") {
                                $content = ConvertFrom-Json $eventData
                                $sessionResponse += $content.choices[0].delta.content
                                Write-Host $content.choices[0].delta.content -NoNewline -ForegroundColor Magenta
                            }
                        }
                    }
                }
                $prompts += @{
                    role    = "assistant";
                    content = $sessionResponse
                }
                $reader.Close()
                $stream.Close()
                Write-Host "`n"
            }
        }
    }
}
chat
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment