Private/Invoke-ChatCompletionFunction.ps1

function Invoke-ChatCompletionFunction {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory)]
        [string]$Name,

        [Parameter()]
        [object]$Arguments,

        [Parameter()]
        [ValidateSet('None', 'Auto', 'Confirm')]
        [string]$InvokeFunctionOnCallMode = 'Confirm'
    )

    if ($InvokeFunctionOnCallMode -eq 'None') {
        return
    }

    $fCommandResult = $null
    $fCommandInfo = Get-Command -Name $Name
    $fArguments = ConvertFrom-Json $Arguments | ObjectToHashTable

    # Ignore null parameter
    foreach ($key in $fArguments.Keys) {
        if ($null -eq $fArguments.$key) {
            $fArguments.Remove($key)
        }
    }

    $CommandQueryMessage = "Function: $Name / Arguments: $($Arguments -replace '[\r\n]', '')"
    if ($fCommandInfo.CommandType -in ('Cmdlet', 'Function', 'Alias')) {
        $canInvoke =
        if ($InvokeFunctionOnCallMode -eq 'Confirm') {
            $PSCmdlet.ShouldContinue($CommandQueryMessage, 'This command will be executed. Do you want to grant it?')
        }
        else {
            $InvokeFunctionOnCallMode -eq 'Auto'
        }

        if (-not $canInvoke) {
            return
        }
        else {
            Write-Verbose "Execute command: $CommandQueryMessage"
            $fCommandResult = & $fCommandInfo.Name @fArguments
        }
    }
    else {
        $ex = [System.NotSupportedException]::new(('The type of {0} command is {1}. Can not execute it.' -f $fCall.name, $fCommandInfo.CommandType))
        $er = [System.Management.Automation.ErrorRecord]::new($ex, 'UnsupportedCommandType', [System.Management.Automation.ErrorCategory]::InvalidOperation, $null)
        $PSCmdlet.ThrowTerminatingError($er)
        return
    }

    if ($null -eq $fCommandResult -or $fCommandResult.Count -eq 0) {
        $fCommandResult = if ($?) { '[SUCCEEDED]' }else { '[FAILED]' }
    }

    ObjectToContent -InputObject $fCommandResult
}