Functions/GenXdev.AI.Queries/Invoke-AIPowershellCommand.ps1
############################################################################### <# .SYNOPSIS Converts AI command suggestions to JSON format for processing. .DESCRIPTION This helper function takes a PowerShell command suggestion from an AI model and converts it to a standardized JSON format that can be consumed by other parts of the GenXdev AI system. The function validates the command and ensures proper formatting before conversion. .PARAMETER Command The PowerShell command to process and convert to JSON format. .EXAMPLE Set-AICommandSuggestion -Command "Get-Process | Where-Object CPU -gt 100" Returns a JSON object containing the command and success status. #> function Set-AICommandSuggestion { [CmdletBinding(SupportsShouldProcess = $true)] [OutputType([string])] param( ########################################################################### [Parameter( Position = 0, Mandatory = $true, HelpMessage = "The PowerShell command to process" )] [ValidateNotNullOrEmpty()] [string] $Command ########################################################################### ) begin { # validate that shouldprocess is enabled for command processing Microsoft.PowerShell.Utility\Write-Verbose ("Processing AI command " + "suggestion for JSON conversion") } process { # check if we should proceed with processing the command if ($PSCmdlet.ShouldProcess($Command, "Process AI command suggestion")) { # convert the command suggestion to json format return @{ command = $Command.Trim() success = $true } | Microsoft.PowerShell.Utility\ConvertTo-Json ` -WarningAction SilentlyContinue } } end { } } ############################################################################### <# .SYNOPSIS Generates and executes PowerShell commands using AI assistance. .DESCRIPTION Uses LM-Studio or other AI models to generate PowerShell commands based on natural language queries. The function can either send commands directly to the PowerShell window or copy them to the clipboard. It leverages AI models to interpret natural language and convert it into executable PowerShell commands with comprehensive parameter support for various AI backends. .PARAMETER Query The natural language description of what you want to accomplish. The AI will convert this into an appropriate PowerShell command. .PARAMETER Instructions Additional instructions for the AI model to customize command generation behavior and provide context-specific guidance. .PARAMETER Temperature Controls the randomness in the AI's response generation. Values range from 0.0 (more focused/deterministic) to 1.0 (more creative/random). .PARAMETER LLMQueryType The type of LLM query to perform. Determines the AI model's behavior and response style for different use cases. .PARAMETER Model The model identifier or pattern to use for AI operations. Can be a name or partial path with support for pattern matching. .PARAMETER HuggingFaceIdentifier The LM Studio specific model identifier for Hugging Face models. .PARAMETER MaxToken The maximum number of tokens to use in AI operations to control response length and processing time. .PARAMETER Cpu The number of CPU cores to dedicate to AI operations for performance optimization. .PARAMETER Gpu How much to offload to the GPU. If 'off', GPU offloading is disabled. If 'max', all layers are offloaded to GPU. If a number between 0 and 1, that fraction of layers will be offloaded to the GPU. -1 = LM Studio will decide how much to offload to the GPU. -2 = Auto .PARAMETER ApiEndpoint The API endpoint URL for AI operations when using external AI services. .PARAMETER ApiKey The API key for authenticated AI operations with external services. .PARAMETER TimeoutSeconds The timeout in seconds for AI operations to prevent hanging requests. .PARAMETER PreferencesDatabasePath Database path for preference data files to store AI configuration settings. .PARAMETER Clipboard When specified, copies the generated command to clipboard instead of executing it directly. .PARAMETER ShowWindow Show the LM Studio window during AI command generation for monitoring purposes. .PARAMETER Force Force stop LM Studio before initialization to ensure clean startup state. .PARAMETER SessionOnly Use alternative settings stored in session for AI preferences instead of persistent configuration. .PARAMETER ClearSession Clear alternative settings stored in session for AI preferences and reset to defaults. .PARAMETER SkipSession Store settings only in persistent preferences without affecting session state. .EXAMPLE Invoke-AIPowershellCommand -Query "list all running processes" -Model "qwen" Generates a PowerShell command to list running processes using the qwen model. .EXAMPLE hint "list files modified today" Uses the alias to generate a command for finding files modified today. .EXAMPLE Invoke-AIPowershellCommand -Query "stop service" -Clipboard Generates a command to stop a service and copies it to clipboard. #> function Invoke-AIPowershellCommand { [CmdletBinding(SupportsShouldProcess = $true)] [OutputType([void])] [Alias("hint")] param ( ########################################################################### [Parameter( Position = 0, Mandatory = $true, HelpMessage = "The natural language query to generate a command for" )] [ValidateNotNullOrEmpty()] [string] $Query, ########################################################################### [Parameter( Position = 1, Mandatory = $false, HelpMessage = "Additional instructions for the AI model" )] [string] $Instructions = "", ########################################################################### [Parameter( Mandatory = $false, HelpMessage = "Temperature for response randomness (0.0-1.0)" )] [ValidateRange(0.0, 1.0)] [double] $Temperature = 0.2, ########################################################################### [Parameter( Mandatory = $false, HelpMessage = "The type of LLM query" )] [ValidateSet( "SimpleIntelligence", "Knowledge", "Pictures", "TextTranslation", "Coding", "ToolUse" )] [string] $LLMQueryType = "Coding", ########################################################################### [Parameter( Mandatory = $false, HelpMessage = "The model identifier or pattern to use for AI operations" )] [string] $Model, ########################################################################### [Parameter( Mandatory = $false, HelpMessage = "The LM Studio specific model identifier" )] [Alias("ModelLMSGetIdentifier")] [string] $HuggingFaceIdentifier, ########################################################################### [Parameter( Mandatory = $false, HelpMessage = "The maximum number of tokens to use in AI operations" )] [int] $MaxToken, ########################################################################### [Parameter( Mandatory = $false, HelpMessage = "The number of CPU cores to dedicate to AI operations" )] [int] $Cpu, ########################################################################### [Parameter( Mandatory = $false, HelpMessage = ("How much to offload to the GPU. If 'off', GPU " + "offloading is disabled. If 'max', all layers are " + "offloaded to GPU. If a number between 0 and 1, " + "that fraction of layers will be offloaded to the " + "GPU. -1 = LM Studio will decide how much to " + "offload to the GPU. -2 = Auto") )] [ValidateRange(-2, 1)] [int] $Gpu = -1, ########################################################################### [Parameter( Mandatory = $false, HelpMessage = "The API endpoint URL for AI operations" )] [string] $ApiEndpoint, ########################################################################### [Parameter( Mandatory = $false, HelpMessage = "The API key for authenticated AI operations" )] [string] $ApiKey, ########################################################################### [Parameter( Mandatory = $false, HelpMessage = "The timeout in seconds for AI operations" )] [int] $TimeoutSeconds, ########################################################################### [Parameter( Mandatory = $false, HelpMessage = "Database path for preference data files" )] [string] $PreferencesDatabasePath, ########################################################################### [Parameter( Mandatory = $false, HelpMessage = "Copy command to clipboard" )] [switch] $Clipboard, ########################################################################### [Parameter( Mandatory = $false, HelpMessage = "Show the LM Studio window" )] [switch] $ShowWindow, ########################################################################### [Parameter( Mandatory = $false, HelpMessage = "Force stop LM Studio before initialization" )] [switch] $Force, ########################################################################### [Parameter( Mandatory = $false, HelpMessage = ("Use alternative settings stored in session for AI " + "preferences") )] [switch] $SessionOnly, ########################################################################### [Parameter( Mandatory = $false, HelpMessage = ("Clear alternative settings stored in session for AI " + "preferences") )] [switch] $ClearSession, ########################################################################### [Parameter( Mandatory = $false, HelpMessage = ("Store settings only in persistent preferences " + "without affecting session") )] [Alias("FromPreferences")] [switch] $SkipSession ########################################################################### ) begin { # initialize verbose logging for ai command generation Microsoft.PowerShell.Utility\Write-Verbose ("Initializing AI command " + "generation") # build comprehensive instruction template for the ai model $commandInstructions = @" You are a PowerShell expert. Although you only have access to a limited set of tool functions to execute in your suggested powershell commandline script, you are not limited and have access to everything Powershell has to offer. Analyze the user's request and suggest a PowerShell command that accomplishes their goal. First try basic powershell commands, if that does not solve it then try to use the Get-GenXDevCmdlets, Get-Help and the Get-Command cmdlets to find the right commands to use. Return only the suggested command without any explanation or commentary. $Instructions "@ } process { # log the query being processed for debugging purposes Microsoft.PowerShell.Utility\Write-Verbose ("Generating PowerShell " + "command for query: $Query") # copy matching parameters to invoke transformation function $invocationParams = GenXdev.Helpers\Copy-IdenticalParamValues ` -BoundParameters $PSBoundParameters ` -FunctionName "GenXdev.AI\Invoke-LLMTextTransformation" # set the text parameter to the user's query $invocationParams.Text = $Query # apply the instruction template to guide ai behavior $invocationParams.Instructions = $commandInstructions # configure clipboard setting for output handling $invocationParams.SetClipboard = $Clipboard # get the command from the ai using configured parameters $command = GenXdev.AI\Invoke-LLMTextTransformation @invocationParams # handle clipboard output mode if ($Clipboard) { # log successful clipboard operation Microsoft.PowerShell.Utility\Write-Verbose ("Command copied to " + "clipboard") } else { # handle direct execution mode with powershell window if ($PSCmdlet.ShouldProcess("PowerShell window", "Send command")) { # get the main powershell window for command injection $mainWindow = GenXdev.Windows\Get-PowershellMainWindow # bring the powershell window to foreground if found if ($null -ne $mainWindow) { $null = $mainWindow.SetForeground() } # preserve current clipboard contents $oldClipboard = Microsoft.PowerShell.Management\Get-Clipboard try { # prepare command for clipboard injection with newline handling ($command.Trim().Replace("`n", " ```n")) | Microsoft.PowerShell.Management\Set-Clipboard # send paste keyboard shortcut to active window GenXdev.Windows\Send-Key "^v" # wait for paste operation to complete Microsoft.PowerShell.Utility\Start-Sleep 2 } finally { # restore original clipboard contents $oldClipboard | Microsoft.PowerShell.Management\Set-Clipboard } } } } end { } } ############################################################################### |