Private/Initialize-OpenAIAPIRequestParam.ps1

using namespace System.Collections

function Initialize-OpenAIAPIRequestParam {
    [CmdletBinding()]
    [OutputType([hashtable])]
    param (
        [Parameter()]
        [string]$Method = 'Post',

        [Parameter(Mandatory)]
        [System.Uri]$Uri,

        [Parameter()]
        [string]$ContentType = 'application/json',

        [Parameter()]
        [IDictionary]$AdditionalQuery,

        [Parameter()]
        [object]$Body,

        [Parameter()]
        [object]$AdditionalBody,

        [Parameter()]
        [IDictionary]$Headers,

        [Parameter()]
        [IDictionary]$AdditionalHeaders,

        [Parameter()]
        [string]$AuthType = 'openai',

        [Parameter(ValueFromRemainingArguments)]$ArgList
    )

    $InternalParams = @{
        ServiceName = ''
        Method      = $Method
        ContentType = $ContentType
        Uri         = $Uri
        Body        = $null
        Headers     = $null
        UserAgent   = $null
        IsDebug     = $false
    }

    # Set service name based on AuthType
    $InternalParams.ServiceName = switch -Wildcard ($AuthType) {
        'openai*' { 'OpenAI' }
        'azure*' { 'Azure OpenAI' }
    }

    # Assert selected model is discontinued
    if ($null -ne $Body -and $null -ne $Body.model) {
        Assert-DeprecationModel -Model $Body.model
    }

    # Construct URI with Query Parameters
    if ($PSBoundParameters.ContainsKey('AdditionalQuery') -and $null -ne $AdditionalQuery) {
        $UriBuilder = [System.UriBuilder]::new($Uri)
        $QueryParam = [System.Web.HttpUtility]::ParseQueryString($UriBuilder.Query)
        foreach ($s in $AdditionalQuery.GetEnumerator()) {
            $QueryParam.Add($s.Key, $s.Value)
        }
        $UriBuilder.Query = $QueryParam.ToString()
        $Uri = $UriBuilder.Uri
    }
    $InternalParams.Uri = $Uri

    # Construct Headers
    $RequestHeaders = @{}
    if ($PSBoundParameters.ContainsKey('Headers') -and $null -ne $Headers) {
        $RequestHeaders = Merge-Dictionary $Headers $RequestHeaders
    }
    if ($PSBoundParameters.ContainsKey('AdditionalHeaders') -and $null -ne $AdditionalHeaders) {
        $RequestHeaders = Merge-Dictionary $RequestHeaders $AdditionalHeaders
    }
    $InternalParams.Headers = $RequestHeaders

    # Set UserAgent
    if (-not $script:UserAgent) {
        $script:UserAgent = Get-UserAgent
    }
    $InternalParams.UserAgent = $script:UserAgent

    # Set debug flag
    $InternalParams.IsDebug = Test-Debug
    if ($InternalParams.IsDebug) {
        $InternalParams.Headers['OpenAI-Debug'] = 'true'
    }


    # Construct Body
    if ($null -ne $Body) {
        if ($ContentType -match 'multipart/form-data') {
            $Boundary = New-MultipartFormBoundary
            $Body = New-MultipartFormContent -FormData $Body -Boundary $Boundary
            $ContentType = ('multipart/form-data; boundary="{0}"' -f $Boundary)
        }
        elseif ($ContentType -match 'application/json') {
            if ($Body -is [pscustomobject]) {
                $Body = ObjectToHashTable $Body
            }
            if ($PSBoundParameters.ContainsKey('AdditionalBody') -and $null -ne $AdditionalBody) {
                if ($AdditionalBody -is [string]) {
                    try {
                        $AdditionalBody = ConvertFrom-Json $AdditionalBody -Depth 100
                    }
                    catch {
                        Write-Error -Exception ([System.InvalidOperationException]::new('Failed to parse AdditionalBody as JSON.'))
                    }
                }
                if ($AdditionalBody -is [pscustomobject]) {
                    $AdditionalBody = ObjectToHashTable $AdditionalBody
                }
                $Body = Merge-Dictionary $Body $AdditionalBody
            }
        }
    }
    $InternalParams.Body = $Body

    return $InternalParams
}