PsChat
PsChat is a Powershell module that allows the user to use OpenAI Chat Completion in the shell.
Install / Use
/learn @boeegh/PsChatREADME
PsChat - OpenAIs ChatGPT for PowerShell
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
News
- 2023-12-15 - Audio (TTS) support, see
SaveAudioextension 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
Getting started
# 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
Usage
# 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
Screenshot(s)
Started using alias 'q':

Asking for help (available commands) in the chat:

Examples
- 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/.
Extensions
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?"
List of extension parameters
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
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.
Dev notes
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" }
Related Skills
node-connect
354.0kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
112.2kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
354.0kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
354.0kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
