Skip to content

Instantly share code, notes, and snippets.

@AlexanderHolmeset
Last active May 26, 2024 16:25
Show Gist options
  • Save AlexanderHolmeset/628dde955b8b5d76bff326d3cea16431 to your computer and use it in GitHub Desktop.
Save AlexanderHolmeset/628dde955b8b5d76bff326d3cea16431 to your computer and use it in GitHub Desktop.
# This function takes a path to a file as a parameter and returns the base64 string of that file.
function Get-Photo {
param (
[Parameter(Mandatory=$true)]
[string]$path
)
[convert]::ToBase64String((get-content $path -Raw -AsByteStream))
}
function Get-AzureOpenAIToken{
<# .SYNOPSIS
Get an azure token for user or managed identity thats required to authenticate to Azure OpenAI with Rest API.
Also construct the header if you are using an Azure OpenAI API key instead of Azure AD authentication.
.PARAMETER ManagedIdentity
Use this parameter if you want to use a managed identity to authenticate to Azure OpenAI.
.PARAMETER User
Use this parameter if you want to use a user to authenticate to Azure OpenAI.
.PARAMETER APIKey
Use this parameter if you want to use an API key to authenticate to Azure OpenAI.
.EXAMPLE
# Manually specify username and password to acquire an authentication token:
Get-AzureOpenAIToken -APIKey "ghgkfhgfgfgkhgh"
Get-AzureOpenAIToken -ManagedIdentity $true
Get-AzureOpenAIToken -User $true
.NOTES
Author: Alexander Holmeset
Twitter: @AlexHolmeset
Website: https://www.alexholmeset.blog
Created: 09-02-2023
Updated:
Version history:
1.0.0 - (09-02-2023) Function created
#>
[CmdletBinding()]
param (
[Parameter(Mandatory=$false)]
[string]$APIKey,
[Parameter(Mandatory=$false)]
[string]$ManagedIdentity,
[Parameter(Mandatory=$false)]
[string]$User
)
Process {
$ErrorActionPreference = "Stop"
if (Get-Module -ListAvailable -Name Az.Accounts) {
# Write-Host "You have the Az.Accounts module installed"
}
else {
Write-Host "You need to install the Az.Accounts module";
break
}
If(!$MyHeader){
If($ManagedIdentity -eq $true){
"managed"
try {
Connect-AzAccount -Identity
$MyTokenRequest = Get-AzAccessToken -ResourceUrl "https://cognitiveservices.azure.com"
$MyToken = $MyTokenRequest.token
If(!$MyToken){
Write-Warning "Failed to get API access token!"
Exit 1
}
$Global:MyHeader = @{"Authorization" = "Bearer $MyToken" }
}
catch [System.Exception] {
Write-Warning "Failed to get Access Token, Error message: $($_.Exception.Message)"; break
}
}
If($User -eq $true){
"USER"
try {
Connect-AzAccount
$MyTokenRequest = Get-AzAccessToken -ResourceUrl "https://cognitiveservices.azure.com"
$MyToken = $MyTokenRequest.token
If(!$MyToken){
Write-Warning "Failed to get API access token!"
Exit 1
}
$Global:MyHeader = @{"Authorization" = "Bearer $MyToken" }
}
catch [System.Exception] {
Write-Warning "Failed to get Access Token, Error message: $($_.Exception.Message)"; break
}
}
If($APIkey){
"APIKEY"
$Global:MyHeader = @{"api-key" = $apikey }
}
}
}
}
function Get-Chat {
<# .SYNOPSIS
Get a resposne from the chat endpoint in Azure OpenAI.
.PARAMETER DeploymentName
A deployment name should be provided.
.PARAMETER ResourceName
A Resource name should be provided.
.PARAMETER Prompt
A prompt name should be provided.
.PARAMETER Token
A token name should be provided.
.EXAMPLE
Get-Chat -DeploymentName $DeploymentName -ResourceName $ResourceName -maxtokens 1000 -prompt "What is the meaning of life?" -AssitantInstruction $AssitantInstruction
.NOTES
Author: Alexander Holmeset
Twitter: @AlexHolmeset
Website: https://www.alexholmeset.blog
Created: 09-02-2023
Updated:
Version history:
1.0.0 - (09-02-2023) Function created
#>[CmdletBinding()]
param (
[parameter(Mandatory = $false, HelpMessage = "Your azure openai deployment name")]
[ValidateNotNullOrEmpty()]
[string]$DeploymentName,
[parameter(Mandatory = $false, HelpMessage = "your azure openai resource name")]
[ValidateNotNullOrEmpty()]
[string]$ResourceName,
[parameter(Mandatory = $false, HelpMessage = "Your Azure OpenAI prompt")]
[ValidateNotNullOrEmpty()]
[string]$Prompt,
[parameter(Mandatory = $false, HelpMessage = "Your Azure OpenAI service instructions")]
[ValidateNotNullOrEmpty()]
[string]$AssitantInstruction,
[parameter(Mandatory = $true, HelpMessage = "Use photo?")]
[ValidateNotNullOrEmpty()]
[string]$ReadImage,
[parameter(Mandatory = $true, HelpMessage = "Set number of max tokens")]
[ValidateNotNullOrEmpty()]
[string]$Maxtokens,
[parameter(Mandatory = $true, HelpMessage = "Is image local or online?")]
[ValidateNotNullOrEmpty()]
[string]$ImageLocalOrOnline
)
Process {
$ErrorActionPreference = "Stop"
$APIVersion = "2024-04-01-preview"
# Construct URI
$uri = "https://$ResourceName.openai.azure.com/openai/deployments/$DeploymentName/chat/completions?api-version=$ApiVersion"
# Construct Body
if ($ReadImage -eq $true) {
If($ImageLocalOrOnline -like "online"){
$script:conversation += @"
{"role": "user", "content": [{"type": "text", "text": "$Prompt"},{"type": "image_url","image_url": {"url": "$url"}}]},
"@
}
else{ $script:conversation += @"
{"role": "user", "content": [{"type": "text", "text": "$Prompt"},{"type": "image_url","image_url": {"url": "data:image/jpeg;base64,$photo"}}]},
"@
}
}
else {
$script:conversation += @"
{"role": "user", "content": [{"type": "text", "text": "$Prompt"}]},
"@
}
$body = @"
{
"messages": [
$script:conversation
{"role": "system", "content": "$assitantInstruction"}
],
"max_tokens": $maxtokens,
"stream": false
}
"@
try {
$Global:Request = invoke-restmethod -Method POST -Uri $uri -ContentType "application/json" -Body $body -Headers $Global:MyHeader
$script:conversation += @"
{"role": "assistant", "content": "$($Request.choices.message.content)"},
"@
}
catch [System.Exception] {
$_
Write-Warning "Failed to to POST request: $($_.Exception.Message)"; break
}
"User: $Prompt"
"Assistant: $($Request.choices.message.content)"
}
}
Get-AzureOpenAIToken -APIKey "Enter API key here."
$DeploymentName = "Enter deployment name here."
$ResourceName = "Enter resource name here."
$AssitantInstruction = "You are a helpfull assistant."
#Path to the image to upload.
$path = "Enter path to image here."
$photo = Get-Photo -path $path
#URL to image to upload.
$url = "Enter URL to image here."
$Prompt = "Please describe this photo."
#If doing a request with an image, set ReadImage to true, and ImageLocalOrOnline to either local or online.
Get-Chat -DeploymentName $DeploymentName -ResourceName $ResourceName -AssitantInstruction $AssitantInstruction -Prompt $Prompt -ReadImage $true -ImageLocalOrOnline local -maxtokens 4000
@RBNoronha
Copy link

If it used to work, it doesn't work anymore!

@AlexanderHolmeset
Copy link
Author

If it used to work, it doesn't work anymore!

Try now, i had forgot to change the API version in the script back to 2024-04-01-preview after testing something.
Let me know if its ok.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment