PsChat is a Powershell module that allows the user to use OpenAI Chat Completion in the shell. If you spend a lot of time in Powershell, this may be useful to you.
The module consists of two functions:
Invoke-PsChat
- Chat UI, similiar to OpenAI web interfaceGet-PsChatAnswer
- Pipeable function that allows more direct access to the API
I made it to use and explore ChatGPT the place, I mostly find myself: In the shell.
The module requires OpenAI API access. You can get an API key from: https://platform.openai.com/signup
- 2023-12-15 - Audio (TTS) support, see
SaveAudio
extension and example - 2023-11-14 - Example of using non-OpenAI API in examples
- 2023-10-22 - Better copy-paste support (press ALT-P + V)
- 2023-10-01 - Support for function calling, end-to-end tests
# install module from PSGallery
Install-Module PsChat -Force
# get an openai api key and put it in a env variable
$ENV:OPENAI_AUTH_TOKEN="my-secret-token"
# start a chat session
Invoke-PsChat
# start a chat session with a question
Invoke-PsChat "Lets talk Powershell"
# ask single question
Invoke-PsChat "How is Powershell compared to Zsh" -Single
# ask single question using functions, result as PSObject
Invoke-PsChat -Single -Question "Whats the uptime?" `
-Functions_Names @("Get-Uptime") `
-NonInteractive
# does the same using Get-PsChatAnswer
Get-PsChatAnswer "What is your name?
# pipe in question
"Hello OpenAI" | Get-PsChatAnswer
# post an entire dialog to the api
$dialog = @(
@{ "role"="user"; "content"="Hello OpenAI. Can we talk Powershell?" },
@{ "role"="assistant"; "content"="Hello! Of course, we can talk about PowerShell. What would you like to know or discuss?" },
@{ "role"="user"; "content"="How does piping work?" }
)
Get-PsChatAnswer -InputObject $dialog -NoEnumerate
# for parameters you can use Get-Help
Get-Help Invoke-PsChat
Get-Help Get-PsChatAnswer
Asking for help (available commands) in the chat:
- Dual Minded: Dual-minded makes OpenAI have both sides of a conversation. Now with audio-support!
- Bad Code Finder: Powershell script that traverses source codes and uses GPT to find sensitive data. Usage: Download the ps1-file, run it (with $ENV:OPENAI_AUTH_TOKEN set) in a directory containing source code.
- Save and Load: Simple examples of saving and preloading context for chats.
- Alternative API: Using another API, such as a local model using https://github.com/abetlen/llama-cpp-python/.
The following extensions are available:
AutoSave
- Saves the chat to json (which can later be loaded back in usingPreLoad
)WordCountWarning
- Informs the user when a certain word-count is reached (for cost-saving purposes)PreLoad
- Preloads messages from a file or string. Optionally "lock" the loaded messagesCommands
- In-chat commands, such as clipboard access and API settingsShortTerm
- ShortTerm(Memory) starts pruning early messages when a certain word threshold is reached - in order to avoid token limitFunctions
- Allows OpenAI chat to call Powershell functions during an answer/chat-completionApi
- Allows you to set chat-completion API parameters, such as base-url, model and temperatureSaveAudio
- NEW: Allows you generate audio using the TTS api. Requires ffmpeg (install it using homebrew, apt or choco)
Extensions can have multiple parameters, that can be set when calling Invoke-PsChat
, such as Invoke-PsChat -Api_Model "gpt-4"
.
With multiple parameters a Powershell alias can come in handy:
# setup function
function Invoke-PsChat-Yaml { Invoke-PsChat -Api_Model "gpt-4" -PreLoad_Prompt "Answer only with YAML" -PreLoad_Lock $true }
# define alias
New-Alias -Name q -Value Invoke-PsChat-Yaml -Force -Option AllScope -Description 'Usage: q "What is consciousness?"'
# usage
q "Describe the rules of tic-tac-toe?"
All extension parameters are optional.
Extension | Parameter | Type | Description |
---|---|---|---|
Api | Enabled | bool | Enable/disable extension. Defaults to $true . |
Api | Verbose | bool | If $true writes out parameters on startup |
Api | AuthToken | string | OpenAI auth token to use |
Api | Model | string | Model name, eg. gpt-4 |
Api | Temperature | decimal | Model temperature |
Api | Top_P | decimal | Model top_p |
Api | Baseurl | string | Base url for model API |
AutoSave | Enabled | bool | Enable/disable extension. Defaults to $false . |
AutoSave | Path | string | Specifies the path the chat will be saved to, eg. ~/my-chat.json . If not specified the path ./pschat-$(Get-Date -Format "yyyy-MM-dd-HHmmss").json will be used. |
Functions | Enabled | bool | Enable/disable extension. Defaults to $true . |
Functions | Names | string[] | Powershell functions to expose in the chat. Eg. @( "Get-Uptime" ) |
PreLoad | Prompt | string | Simple prompt to start chat with. |
PreLoad | Role | string | Role for Prompt , for OpenAI can be user , assistant or system . |
PreLoad | Path | string | Load chat from this path eg. ./my-chat.json . |
PreLoad | Objects | object[] | Allows preloading based on PsObjects, eg. @( @{ "Role"="system"; "Content"="Hi!"; "Locked"=$true } ) |
PreLoad | Verbose | bool | Makes the extension more talkative. |
PreLoad | Lock | bool | Locks the preloaded prompt/chat, so an extension like ShortTerm does not affect them. |
SaveAudio | Enabled | bool | Enable/disable extension. Defaults to $true . |
SaveAudio | Path | string | Output file path. Defaults to autogenerated based on timestamp. |
SaveAudio | Model | string | Optional TTS model to use |
SaveAudio | UserVoice | string | Maps to OpenAI voice parameter for users voice |
SaveAudio | AssistantVoice | string | Maps to OpenAI voice parameter for assistants voice |
SaveAudio | Response_Format | string | Maps to OpenAI Response_Format paramter |
SaveAudio | Speed | decimal | Maps to OpenAI speed parameter |
SaveAudio | ShowProgress | bool | Shows Powershell progress bar while processing. Defaults to $true |
SaveAudio | ConcatUsingFfmpeg | bool | FFmpeg: Merge audio clips using ffmpeg. Defaults to $true |
SaveAudio | TurnDelay | int | FFmpeg: Amount of time in ms between each audio clip. Defaults to 600 |
SaveAudio | FfmpegExecutablePath | string | FFmpeg: Executable to use |
SaveAudio | FfmpegQuality | int | FFmpeg: Audio quality from 1 (best) - 10 (worst). Defaults to 3 |
ShortTerm | Enabled | bool | Enable/disable extension. Defaults to $true . |
ShortTerm | Verbose | bool | Makes the extension more talkative. |
ShortTerm | Compress | bool | Compresses messages that are due to be removed. |
ShortTerm | CompressPrompt | string | Prompt to use when compressing messages to be "forgotten". |
ShortTerm | TokenCountThreshold | int | Number of (approx) tokens that triggers removal of the oldest messages. Defaults to model context size minus 1.000. |
ShortTerm | WordCountThreshold | int | Same as TokenCountThreshold, but based on words. Considered deprecated. |
Commands are extensions for the UI chat, such as changing the model on-the-fly. These are available when the user enters 'h'
in the chat.
For development this approach seems to work best:
# open chat ui (talkative, with debug)
pwsh -NoProfile -Command { Remove-Module PsChat -Force; $DebugPreference="Continue"; Import-Module ./src/PsChat/PsChat.psd1 -Verbose -Force && Invoke-PsChat }
# get anwer (quiet)
pwsh -NoProfile -Command { Remove-Module PsChat -ErrorAction SilentlyContinue; Import-Module ./src/PsChat/PsChat.psd1 -Force && Get-PsChatAnswer "hello" }