Public/Invoke-OAIChat.ps1

<#
.SYNOPSIS
Invokes an AI chat assistant to answer user questions.
 
.DESCRIPTION
The Invoke-OAIChat function is used to interact with an AI chat assistant. It takes user input as a parameter and returns the assistant's response.
 
.PARAMETER UserInput
Specifies the user input to be processed by the AI chat assistant.
 
.PARAMETER Model
Specifies the model to be used by the AI chat assistant. Valid values are 'gpt-4', 'gpt-3.5-turbo', 'gpt-3.5-turbo-16k', 'gpt-4-1106-preview', 'gpt-4-turbo-preview', and 'gpt-3.5-turbo-1106'. The default value is 'gpt-3.5-turbo'.
 
.EXAMPLE
Invoke-OAIChat -UserInput "What is the weather today?"
Invokes the AI chat assistant with the specified user input and returns the assistant's response.
 
.EXAMPLE
'show even numbers' | ai -Instructions 'use powershell, just code, no explanation'
 
.EXAMPLE
git status | ai 'write a detailed commit message'
 
.INPUTS
System.String
 
.OUTPUTS
System.String
 
.NOTES
This function requires the New-OAIAssistant, New-OAIThreadQuery, Wait-OAIOnRun, and Get-OAIMessage functions to be available in the current session.
#>

function Invoke-OAIChat {
    [CmdletBinding()]
    param(
        $Instructions,
        [Parameter(ValueFromPipeline)]
        $UserInput,        
        [ValidateSet('gpt-4', 'gpt-3.5-turbo', 'gpt-3.5-turbo-16k', 'gpt-4-1106-preview', 'gpt-4-turbo-preview', 'gpt-3.5-turbo-1106')]
        $model = 'gpt-3.5-turbo'
    )

    Begin {
        $assistantParams = @{}

        $ts = Get-Date -Format "yyyyMMddHHmmss"

        $assistantParams["name"] = "PowerShellAIAssistant-$ts"

        if (!$Instructions) {
            $Instructions = 'You are a helpful assistant. Please answer questions concisely.'
        }
        $assistantParams["instructions"] = $Instructions
        $assistantParams["model"] = $model

        $assistant = New-OAIAssistant @assistantParams

        [System.Collections.ArrayList]$lines = @()
    }

    Process {
        $lines += $UserInput                
    }
    
    End {
        $prompt = ($lines | Out-String).Trim()

        $queryResult = New-OAIThreadQuery -UserInput $prompt -Assistant $assistant 
        $null = Wait-OAIOnRun -Run $queryResult.Run -Thread $queryResult.Thread
        $messages = Get-OAIMessage -ThreadId $queryResult.Thread.Id
        $messages.data[0].content.text.value
        $null = Remove-OAIAssistant -Id $assistant.Id
    }
}