functions/invoke-adoazureopenai.ps1


<#
    .SYNOPSIS
        Performs a code review of a Microsoft Dynamics 365 Business Central AL codebase using Azure OpenAI.
         
    .DESCRIPTION
        This function indexes a codebase, searches for relevant files, and queries Azure OpenAI to perform a detailed code review.
        It generates a report based on the provided user query and context extracted from the codebase.
         
    .PARAMETER OpenAIEndpoint
        The Azure OpenAI endpoint URL.
         
    .PARAMETER OpenAIApiKey
        The API key for authenticating with Azure OpenAI.
         
    .PARAMETER Messages
        The messages to be sent to Azure OpenAI.
         
    .EXAMPLE
        # Define the required parameters
        $openaiEndpoint = "https://YourAzureOpenApiEndpoint"
        $openaiApiKey = "your-api-key"
        $prompt = "Who are you?"
        $messages = @(
            @{ role = "system"; content = "You are a helpful assistant." },
            @{ role = "user"; content = $prompt }
        )
         
         
        # Call the function
        Invoke-ADOAzureOpenAI -OpenAIEndpoint $openaiEndpoint `
            -OpenAIApiKey $openaiApiKey `
            -CodebasePath $codebasePath `
            -Messages $messages
         
    .OUTPUTS
        Returns a hashtable containing the response from Azure OpenAI.
        The hashtable includes the following keys:
            - id
            - object
            - created
            - model
            - usage
            - choices
         
         
        #Example response
        @"
        {
            "model": "o1-2024-12-17",
            "created": 1745923901,
            "object": "chat.completion",
            "id": "chatcmpl-BRcqr2gTdJH2EeL63R3jEM5ZVOpUD",
            "choices": [
            {
                "content_filter_results": {
                    "hate": {
                        "filtered": false,
                        "severity": "safe"
                    },
                    "self_harm": {
                        "filtered": false,
                        "severity": "safe"
                    },
                    "sexual": {
                        "filtered": false,
                        "severity": "safe"
                    },
                    "violence": {
                        "filtered": false,
                        "severity": "safe"
                    }
                },
                "finish_reason": "stop",
                "index": 0,
                "logprobs": null,
                "message": {
                    "content": "I’m ChatGPT, a large language model trained by OpenAI. I’m here to help you with your questions, provide information, and engage in conversation. How can I assist you today?",
                    "refusal": null,
                    "role": "assistant"
                }
            }
            ],
            "usage": {
                "completion_tokens": 178,
                "completion_tokens_details": {
                    "accepted_prediction_tokens": 0,
                    "audio_tokens": 0,
                    "reasoning_tokens": 128,
                    "rejected_prediction_tokens": 0
                },
                "prompt_tokens": 20,
                "prompt_tokens_details": {
                    "audio_tokens": 0,
                    "cached_tokens": 0
                },
                "total_tokens": 198
            }
        }
        "@
         
         
    .NOTES
        This function uses PSFramework for logging and exception handling.
         
        Author: Oleksandr Nikolaiev (@onikolaiev)
#>


function Invoke-ADOAzureOpenAI {
    param (
        [Parameter(Mandatory = $true)]
        [string]$OpenAIEndpoint,
        [Parameter(Mandatory = $true)]
        [string]$OpenAIApiKey,
        [Array]$Messages
    )
    begin{       
        $ErrorActionPreference = "Stop"
        Invoke-TimeSignal -Start
        Write-PSFMessage -Level Verbose -Message "Starting Azure OpenAI request."
        
        # Validate messages array
        if (-not $Messages -or $Messages.Count -eq 0) {
            throw "The Messages parameter cannot be null or empty."
        }

        $body = @{
            messages = $Messages
        } | ConvertTo-Json -Depth 10

        $headers = @{
            "Content-Type" = "application/json"
            "api-key" = $OpenAIApiKey
        }
    }
    process{
        if (Test-PSFFunctionInterrupt) { return }

        try {
            $response = Invoke-RestMethod -Uri $OpenAIEndpoint -Method Post -Headers $headers -Body $body
            Write-PSFMessage -Level Verbose -Message "Azure OpenAI response received."
    
            # Output the response
            return $response | Select-PSFObject *

        } catch {
            Write-PSFMessage -Level Error -Message "An error occurred: $($_.Exception.Message)"
            throw
        }
    }
    end{
        # Log the end of the operation
        Write-PSFMessage -Level Verbose -Message "Request completed."
        Invoke-TimeSignal -End
    }
}