Did you know you can create an Azure OpenAI Teams chatbot based on Azure Logic Apps? You can even have it reply based on your own documents if you follow my previous blog post here, and combine it with this blogpost. I will walk you through all the steps of creating a chatbot that users can ask questions in Microsoft Teams, and get replies back from GPT-4 in Azure Open AI.
To start you will need a user account with a Teams license, to act as the chatbot.
Then you need to follow this guide and look under the header API Key, to get the key you need for doing all the requests.
Go to Logic Apps in the Azure portal and click Add.
Put in the options you want and click Create.
Open the Logic App and go to the Identity menu. Turn on system managed identity, and copy the object id.
Run the following script in PowerShell with the Microsoft Graph PowerShell SDK to give the Logic App the Chat.Read.All right in Microsoft Graph.
$TenantID = "xxxxxx" | |
$LogicAppSeObjectID = "xxxxxxx" | |
$ServicePrincipalId = $LogicAppSeObjectID | |
$GraphResource = Get-MgServicePrincipal -Filter "AppId eq '00000003-0000-0000-c000-000000000000'" | |
$application_role_to_assign_name = "Chat.Read.All" | |
$Permission = $GraphResource.AppRoles | Where-Object {$_.value -in $application_role_to_assign_name} | |
New-MgServicePrincipalAppRoleAssignment -ServicePrincipalId $ServicePrincipalId -PrincipalId $ServicePrincipalId -AppRoleId $Permission.Id -ResourceId $GraphResource.Id |
Confirm this by opening the Enterprise Applications in Azure, and search for the object id.
Open the application and go to the Permission menu. Here you should see the Chat.Read.All right.
Open the Logic App and click Edit.
Add “When a new chat message is added” action and create the following variables.
Add a “Get message details action”, this will create a “For each loop”.
{ | |
"properties": { | |
"@@odata.context": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"attachments": { | |
"type": "array" | |
}, | |
"body": { | |
"properties": { | |
"content": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"contentType": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"plainTextContent": { | |
"type": [ | |
"string", | |
"null" | |
] | |
} | |
}, | |
"type": [ | |
"object", | |
"null" | |
] | |
}, | |
"channelIdentity": {}, | |
"chatId": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"conversationId": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"createdDateTime": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"deletedDateTime": {}, | |
"etag": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"eventDetail": {}, | |
"from": { | |
"properties": { | |
"application": {}, | |
"device": {}, | |
"user": { | |
"properties": { | |
"@@odata.type": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"displayName": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"id": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"tenantId": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"userIdentityType": { | |
"type": [ | |
"string", | |
"null" | |
] | |
} | |
}, | |
"type": [ | |
"object", | |
"null" | |
] | |
} | |
}, | |
"type": [ | |
"object", | |
"null" | |
] | |
}, | |
"id": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"importance": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"lastEditedDateTime": {}, | |
"lastModifiedDateTime": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"locale": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"mentions": { | |
"type": "array" | |
}, | |
"messageLink": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"messageType": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"policyViolation": {}, | |
"reactions": { | |
"type": "array" | |
}, | |
"replyToId": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"subject": {}, | |
"summary": {}, | |
"threadType": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"webUrl": {} | |
}, | |
"type": [ | |
"object", | |
"null" | |
] | |
} |
{ | |
"properties": { | |
"@@odata.type": { | |
"type": "string" | |
}, | |
"displayName": { | |
"type": "string" | |
}, | |
"id": { | |
"type": "string" | |
}, | |
"tenantId": { | |
"type": "string" | |
}, | |
"userIdentityType": { | |
"type": "string" | |
} | |
}, | |
"type": "object" | |
} |
Enter the Bot users Azure AD Object ID to the right in the condtion.
Add the Bot users UPN in the URI.
{ | |
"properties": { | |
"@@odata.context": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"@@odata.count": { | |
"type": "integer" | |
}, | |
"@@odata.nextLink": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"value": { | |
"items": { | |
"properties": { | |
"attachments": { | |
"type": "array" | |
}, | |
"body": { | |
"properties": { | |
"content": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"contentType": { | |
"type": [ | |
"string", | |
"null" | |
] | |
} | |
}, | |
"type": [ | |
"object", | |
"null" | |
] | |
}, | |
"channelIdentity": {}, | |
"chatId": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"createdDateTime": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"deletedDateTime": {}, | |
"etag": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"eventDetail": {}, | |
"from": { | |
"properties": { | |
"application": {}, | |
"device": {}, | |
"user": { | |
"properties": { | |
"@@odata.type": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"displayName": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"id": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"tenantId": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"userIdentityType": { | |
"type": [ | |
"string", | |
"null" | |
] | |
} | |
}, | |
"type": [ | |
"object", | |
"null" | |
] | |
} | |
}, | |
"type": [ | |
"object", | |
"null" | |
] | |
}, | |
"id": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"importance": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"lastEditedDateTime": {}, | |
"lastModifiedDateTime": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"locale": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"mentions": { | |
"type": "array" | |
}, | |
"messageType": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"policyViolation": {}, | |
"reactions": { | |
"type": "array" | |
}, | |
"replyToId": {}, | |
"subject": {}, | |
"summary": {}, | |
"webUrl": {} | |
}, | |
"required": [ | |
"id", | |
"replyToId", | |
"etag", | |
"messageType", | |
"createdDateTime", | |
"lastModifiedDateTime", | |
"lastEditedDateTime", | |
"deletedDateTime", | |
"subject", | |
"summary", | |
"chatId", | |
"importance", | |
"locale", | |
"webUrl", | |
"channelIdentity", | |
"policyViolation", | |
"eventDetail", | |
"from", | |
"body", | |
"attachments", | |
"mentions", | |
"reactions" | |
], | |
"type": [ | |
"object", | |
"null" | |
] | |
}, | |
"type": "array" | |
} | |
}, | |
"type": [ | |
"object", | |
"null" | |
] | |
} |
Enter the Bot users Azure AD Object ID to the right in the condition.
{ | |
"properties": { | |
"@@odata.context": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"@@odata.count": { | |
"type": "integer" | |
}, | |
"@@odata.nextLink": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"value": { | |
"items": { | |
"properties": { | |
"attachments": { | |
"type": "array" | |
}, | |
"body": { | |
"properties": { | |
"content": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"contentType": { | |
"type": [ | |
"string", | |
"null" | |
] | |
} | |
}, | |
"type": [ | |
"object", | |
"null" | |
] | |
}, | |
"channelIdentity": {}, | |
"chatId": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"createdDateTime": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"deletedDateTime": {}, | |
"etag": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"eventDetail": {}, | |
"from": { | |
"properties": { | |
"application": {}, | |
"device": {}, | |
"user": { | |
"properties": { | |
"@@odata.type": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"displayName": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"id": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"tenantId": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"userIdentityType": { | |
"type": [ | |
"string", | |
"null" | |
] | |
} | |
}, | |
"type": [ | |
"object", | |
"null" | |
] | |
} | |
}, | |
"type": [ | |
"object", | |
"null" | |
] | |
}, | |
"id": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"importance": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"lastEditedDateTime": {}, | |
"lastModifiedDateTime": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"locale": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"mentions": { | |
"type": "array" | |
}, | |
"messageType": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"policyViolation": {}, | |
"reactions": { | |
"type": "array" | |
}, | |
"replyToId": {}, | |
"subject": {}, | |
"summary": {}, | |
"webUrl": {} | |
}, | |
"required": [ | |
"id", | |
"replyToId", | |
"etag", | |
"messageType", | |
"createdDateTime", | |
"lastModifiedDateTime", | |
"lastEditedDateTime", | |
"deletedDateTime", | |
"subject", | |
"summary", | |
"chatId", | |
"importance", | |
"locale", | |
"webUrl", | |
"channelIdentity", | |
"policyViolation", | |
"eventDetail", | |
"from", | |
"body", | |
"attachments", | |
"mentions", | |
"reactions" | |
], | |
"type": [ | |
"object", | |
"null" | |
] | |
}, | |
"type": "array" | |
} | |
}, | |
"type": [ | |
"object", | |
"null" | |
] | |
} |
Enter the Bot users Azure AD Object ID to the right in the condtion.
reverse(variables('ArrayMessages')) |
replace(variables('ConversationHistoryReversed'), '</p>', '') |
replace(variables('ConversationHistoryReversed'), '<p>', '') |
substring(variables('ConversationHistoryReversed'), 1, sub(length(variables('ConversationHistoryReversed')),2)) |
substring(variables('ConversationHistoryReversed'), 1, sub(length(variables('ConversationHistoryReversed')),2)) |
[ | |
{ | |
@{outputs('Compose_ConversationHistoryReversed_2')} | |
}, | |
{ | |
"role": "system", "content": "You are a helpful assistant. Format all your replies in HTML code, but dont mention HTML in the response." | |
} | |
] |
{ | |
"items": { | |
"properties": { | |
"content": { | |
"type": "string" | |
}, | |
"role": { | |
"type": "string" | |
} | |
}, | |
"required": [ | |
"content", | |
"role" | |
], | |
"type": "object" | |
}, | |
"type": "array" | |
} |
Enter your Azure Open AI URI and API key. Read more here, on how to get this information.
{ | |
"properties": { | |
"choices": { | |
"items": { | |
"properties": { | |
"content_filter_results": { | |
"properties": { | |
"hate": { | |
"properties": { | |
"filtered": { | |
"type": "boolean" | |
}, | |
"severity": { | |
"type": "string" | |
} | |
}, | |
"type": "object" | |
}, | |
"self_harm": { | |
"properties": { | |
"filtered": { | |
"type": "boolean" | |
}, | |
"severity": { | |
"type": "string" | |
} | |
}, | |
"type": "object" | |
}, | |
"sexual": { | |
"properties": { | |
"filtered": { | |
"type": "boolean" | |
}, | |
"severity": { | |
"type": "string" | |
} | |
}, | |
"type": "object" | |
}, | |
"violence": { | |
"properties": { | |
"filtered": { | |
"type": "boolean" | |
}, | |
"severity": { | |
"type": "string" | |
} | |
}, | |
"type": "object" | |
} | |
}, | |
"type": "object" | |
}, | |
"finish_reason": { | |
"type": "string" | |
}, | |
"index": { | |
"type": "integer" | |
}, | |
"message": { | |
"properties": { | |
"content": { | |
"type": "string" | |
}, | |
"role": { | |
"type": "string" | |
} | |
}, | |
"type": "object" | |
} | |
}, | |
"required": [ | |
"index", | |
"finish_reason", | |
"message", | |
"content_filter_results" | |
], | |
"type": "object" | |
}, | |
"type": "array" | |
}, | |
"created": { | |
"type": "integer" | |
}, | |
"id": { | |
"type": "string" | |
}, | |
"model": { | |
"type": "string" | |
}, | |
"object": { | |
"type": "string" | |
}, | |
"prompt_annotations": { | |
"items": { | |
"properties": { | |
"content_filter_results": { | |
"properties": { | |
"hate": { | |
"properties": { | |
"filtered": { | |
"type": "boolean" | |
}, | |
"severity": { | |
"type": "string" | |
} | |
}, | |
"type": "object" | |
}, | |
"self_harm": { | |
"properties": { | |
"filtered": { | |
"type": "boolean" | |
}, | |
"severity": { | |
"type": "string" | |
} | |
}, | |
"type": "object" | |
}, | |
"sexual": { | |
"properties": { | |
"filtered": { | |
"type": "boolean" | |
}, | |
"severity": { | |
"type": "string" | |
} | |
}, | |
"type": "object" | |
}, | |
"violence": { | |
"properties": { | |
"filtered": { | |
"type": "boolean" | |
}, | |
"severity": { | |
"type": "string" | |
} | |
}, | |
"type": "object" | |
} | |
}, | |
"type": "object" | |
}, | |
"prompt_index": { | |
"type": "integer" | |
} | |
}, | |
"required": [ | |
"prompt_index", | |
"content_filter_results" | |
], | |
"type": "object" | |
}, | |
"type": "array" | |
}, | |
"usage": { | |
"properties": { | |
"completion_tokens": { | |
"type": "integer" | |
}, | |
"prompt_tokens": { | |
"type": "integer" | |
}, | |
"total_tokens": { | |
"type": "integer" | |
} | |
}, | |
"type": "object" | |
} | |
}, | |
"type": "object" | |
} |
Now you can have a conversation in Microsoft Teams with your chatbot that keeps context. You might also notice that the replies is formated with header size, bulletpoints etc… This is because i asked the Chatbot to reply in HTML formating, as Teams understands it. Take a look at the examples below.
If it is hard to follow the above step, you can copy the following code and paste it into Logic App when you are in developer mode. You just need to add/replace the Teams connectors.
{ | |
"definition": { | |
"$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#", | |
"actions": { | |
"Bot_User": { | |
"inputs": { | |
"variables": [ | |
{ | |
"name": "BotUserID", | |
"type": "string" | |
} | |
] | |
}, | |
"runAfter": { | |
"NewMessageFromChat": [ | |
"Succeeded" | |
] | |
}, | |
"type": "InitializeVariable" | |
}, | |
"Condition": { | |
"actions": { | |
"Append_ConversationHistoryReversed": { | |
"inputs": { | |
"name": "ConversationHistoryReversed", | |
"value": "@outputs('Compose_ArrayMessages_Reversed')" | |
}, | |
"runAfter": { | |
"Compose_ArrayMessages_Reversed": [ | |
"Succeeded" | |
] | |
}, | |
"type": "AppendToStringVariable" | |
}, | |
"Compose_ArrayMessages": { | |
"inputs": "@variables('ArrayMessages')", | |
"runAfter": { | |
"For_each_2": [ | |
"Succeeded" | |
] | |
}, | |
"type": "Compose" | |
}, | |
"Compose_ArrayMessages_Reversed": { | |
"inputs": "@reverse(variables('ArrayMessages'))", | |
"runAfter": { | |
"Compose_ArrayMessages": [ | |
"Succeeded" | |
] | |
}, | |
"type": "Compose" | |
}, | |
"Compose_ConversationHistoryReversed": { | |
"inputs": { | |
"name": "ConversationHistoryReversed", | |
"value": "@{outputs('Compose_ConversationHistoryReversed_Replace')}" | |
}, | |
"runAfter": { | |
"Compose_ConversationHistoryReversed_Replace": [ | |
"Succeeded" | |
] | |
}, | |
"type": "SetVariable" | |
}, | |
"Compose_ConversationHistoryReversed_": { | |
"inputs": "@replace(variables('ConversationHistoryReversed'), '</p>', '')", | |
"runAfter": { | |
"Append_ConversationHistoryReversed": [ | |
"Succeeded" | |
] | |
}, | |
"type": "Compose" | |
}, | |
"Compose_ConversationHistoryReversed_2": { | |
"inputs": "@substring(variables('ConversationHistoryReversed'), 1, sub(length(variables('ConversationHistoryReversed')),2))", | |
"runAfter": { | |
"Set_ConversationHistoryReversed_2": [ | |
"Succeeded" | |
] | |
}, | |
"type": "Compose" | |
}, | |
"Compose_ConversationHistoryReversed_Replace": { | |
"inputs": "@replace(variables('ConversationHistoryReversed'), '<p>', '')", | |
"runAfter": { | |
"Set_ConversationHistoryReversed": [ | |
"Succeeded" | |
] | |
}, | |
"type": "Compose" | |
}, | |
"Compose_ConversationHistoryReversed_SubString": { | |
"inputs": "@substring(variables('ConversationHistoryReversed'), 1, sub(length(variables('ConversationHistoryReversed')),2))", | |
"runAfter": { | |
"Compose_ConversationHistoryReversed": [ | |
"Succeeded" | |
] | |
}, | |
"type": "Compose" | |
}, | |
"Compose_RequestBody": { | |
"inputs": "[\n{\n@{outputs('Compose_ConversationHistoryReversed_2')}\n}, \n {\n \"role\": \"system\", \"content\": \"You are a helpful assistant. Format all your replies in HTML code, but dont mention HTML in the response.\"\n }\n]", | |
"runAfter": { | |
"Compose_ConversationHistoryReversed_2": [ | |
"Succeeded" | |
] | |
}, | |
"runtimeConfiguration": { | |
"secureData": { | |
"properties": [ | |
"inputs" | |
] | |
} | |
}, | |
"type": "Compose" | |
}, | |
"For_each_2": { | |
"actions": { | |
"Append_MessagesNextLink": { | |
"inputs": { | |
"name": "MessagesNextLink", | |
"value": "@body('Parse_JSON_-_Messages')?['@odata.nextLink']" | |
}, | |
"runAfter": { | |
"Parse_JSON_-_Messages": [ | |
"Succeeded" | |
] | |
}, | |
"type": "AppendToStringVariable" | |
}, | |
"For_each_5": { | |
"actions": { | |
"Condition_4": { | |
"actions": { | |
"Append_ArrayMessages": { | |
"inputs": { | |
"name": "ArrayMessages", | |
"value": { | |
"content": "@{items('for_each_5')?['body']?['content']}", | |
"role": "user" | |
} | |
}, | |
"runAfter": {}, | |
"type": "AppendToArrayVariable" | |
} | |
}, | |
"else": { | |
"actions": { | |
"Append_ArrayMessages_2": { | |
"inputs": { | |
"name": "ArrayMessages", | |
"value": { | |
"content": " @{items('for_each_5')?['body']?['content']}", | |
"role": "assistant" | |
} | |
}, | |
"runAfter": {}, | |
"type": "AppendToArrayVariable" | |
} | |
} | |
}, | |
"expression": { | |
"and": [ | |
{ | |
"not": { | |
"equals": [ | |
"@items('For_each_5')?['from']?['id']", | |
"18c4a91b-4fa9-4fbd-ab1c-b39465d81baf" | |
] | |
} | |
} | |
] | |
}, | |
"runAfter": {}, | |
"type": "If" | |
} | |
}, | |
"foreach": "@body('Parse_JSON_-_Messages')?['value']", | |
"runAfter": { | |
"Append_MessagesNextLink": [ | |
"Succeeded" | |
] | |
}, | |
"type": "Foreach" | |
}, | |
"Parse_JSON_-_Messages": { | |
"inputs": { | |
"content": "@body('_HTTP_Get_Messages')", | |
"schema": { | |
"properties": { | |
"@@odata.context": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"@@odata.count": { | |
"type": "integer" | |
}, | |
"@@odata.nextLink": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"value": { | |
"items": { | |
"properties": { | |
"attachments": { | |
"type": "array" | |
}, | |
"body": { | |
"properties": { | |
"content": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"contentType": { | |
"type": [ | |
"string", | |
"null" | |
] | |
} | |
}, | |
"type": [ | |
"object", | |
"null" | |
] | |
}, | |
"channelIdentity": {}, | |
"chatId": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"createdDateTime": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"deletedDateTime": {}, | |
"etag": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"eventDetail": {}, | |
"from": { | |
"properties": { | |
"application": {}, | |
"device": {}, | |
"user": { | |
"properties": { | |
"@@odata.type": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"displayName": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"id": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"tenantId": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"userIdentityType": { | |
"type": [ | |
"string", | |
"null" | |
] | |
} | |
}, | |
"type": [ | |
"object", | |
"null" | |
] | |
} | |
}, | |
"type": [ | |
"object", | |
"null" | |
] | |
}, | |
"id": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"importance": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"lastEditedDateTime": {}, | |
"lastModifiedDateTime": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"locale": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"mentions": { | |
"type": "array" | |
}, | |
"messageType": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"policyViolation": {}, | |
"reactions": { | |
"type": "array" | |
}, | |
"replyToId": {}, | |
"subject": {}, | |
"summary": {}, | |
"webUrl": {} | |
}, | |
"required": [ | |
"id", | |
"replyToId", | |
"etag", | |
"messageType", | |
"createdDateTime", | |
"lastModifiedDateTime", | |
"lastEditedDateTime", | |
"deletedDateTime", | |
"subject", | |
"summary", | |
"chatId", | |
"importance", | |
"locale", | |
"webUrl", | |
"channelIdentity", | |
"policyViolation", | |
"eventDetail", | |
"from", | |
"body", | |
"attachments", | |
"mentions", | |
"reactions" | |
], | |
"type": [ | |
"object", | |
"null" | |
] | |
}, | |
"type": "array" | |
} | |
}, | |
"type": [ | |
"object", | |
"null" | |
] | |
} | |
}, | |
"runAfter": { | |
"_HTTP_Get_Messages": [ | |
"Succeeded" | |
] | |
}, | |
"type": "ParseJson" | |
}, | |
"Set_ConversationID": { | |
"inputs": { | |
"name": "ConversationID", | |
"value": "@items('For_each_2')?['conversationId']" | |
}, | |
"runAfter": {}, | |
"type": "SetVariable" | |
}, | |
"Until_2": { | |
"actions": { | |
"Condition_2": { | |
"actions": { | |
"For_each_6": { | |
"actions": { | |
"Condition_5": { | |
"actions": { | |
"Append_ArrayMessages_3": { | |
"inputs": { | |
"name": "ArrayMessages", | |
"value": { | |
"content": "@{items('for_each_6')?['body']?['content']}", | |
"role": "user" | |
} | |
}, | |
"runAfter": {}, | |
"type": "AppendToArrayVariable" | |
} | |
}, | |
"else": { | |
"actions": { | |
"Append_ArrayMessages_4": { | |
"inputs": { | |
"name": "ArrayMessages", | |
"value": { | |
"content": "@{items('for_each_6')?['body']?['content']}", | |
"role": "assistant" | |
} | |
}, | |
"runAfter": {}, | |
"type": "AppendToArrayVariable" | |
} | |
} | |
}, | |
"expression": { | |
"and": [ | |
{ | |
"not": { | |
"equals": [ | |
"@items('For_each_6')?['from']?['id']", | |
"18c4a91b-4fa9-4fbd-ab1c-b39465d81baf" | |
] | |
} | |
} | |
] | |
}, | |
"runAfter": {}, | |
"type": "If" | |
} | |
}, | |
"foreach": "@body('Parse_MessagesNextLink')?['value']", | |
"runAfter": { | |
"Set_MessagesNextLink": [ | |
"Succeeded" | |
] | |
}, | |
"type": "Foreach" | |
}, | |
"HTTP_MessageNextLink": { | |
"inputs": { | |
"authentication": { | |
"audience": "https://graph.microsoft.com", | |
"type": "ManagedServiceIdentity" | |
}, | |
"method": "GET", | |
"uri": "@variables('MessagesNextLink')" | |
}, | |
"runAfter": {}, | |
"type": "Http" | |
}, | |
"Parse_MessagesNextLink": { | |
"inputs": { | |
"content": "@body('HTTP_MessageNextLink')", | |
"schema": { | |
"properties": { | |
"@@odata.context": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"@@odata.count": { | |
"type": "integer" | |
}, | |
"@@odata.nextLink": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"value": { | |
"items": { | |
"properties": { | |
"attachments": { | |
"type": "array" | |
}, | |
"body": { | |
"properties": { | |
"content": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"contentType": { | |
"type": [ | |
"string", | |
"null" | |
] | |
} | |
}, | |
"type": [ | |
"object", | |
"null" | |
] | |
}, | |
"channelIdentity": {}, | |
"chatId": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"createdDateTime": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"deletedDateTime": {}, | |
"etag": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"eventDetail": {}, | |
"from": { | |
"properties": { | |
"application": {}, | |
"device": {}, | |
"user": { | |
"properties": { | |
"@@odata.type": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"displayName": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"id": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"tenantId": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"userIdentityType": { | |
"type": [ | |
"string", | |
"null" | |
] | |
} | |
}, | |
"type": [ | |
"object", | |
"null" | |
] | |
} | |
}, | |
"type": [ | |
"object", | |
"null" | |
] | |
}, | |
"id": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"importance": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"lastEditedDateTime": {}, | |
"lastModifiedDateTime": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"locale": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"mentions": { | |
"type": "array" | |
}, | |
"messageType": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"policyViolation": {}, | |
"reactions": { | |
"type": "array" | |
}, | |
"replyToId": {}, | |
"subject": {}, | |
"summary": {}, | |
"webUrl": {} | |
}, | |
"required": [ | |
"id", | |
"replyToId", | |
"etag", | |
"messageType", | |
"createdDateTime", | |
"lastModifiedDateTime", | |
"lastEditedDateTime", | |
"deletedDateTime", | |
"subject", | |
"summary", | |
"chatId", | |
"importance", | |
"locale", | |
"webUrl", | |
"channelIdentity", | |
"policyViolation", | |
"eventDetail", | |
"from", | |
"body", | |
"attachments", | |
"mentions", | |
"reactions" | |
], | |
"type": [ | |
"object", | |
"null" | |
] | |
}, | |
"type": "array" | |
} | |
}, | |
"type": [ | |
"object", | |
"null" | |
] | |
} | |
}, | |
"runAfter": { | |
"HTTP_MessageNextLink": [ | |
"Succeeded" | |
] | |
}, | |
"type": "ParseJson" | |
}, | |
"Set_MessagesNextLink": { | |
"inputs": { | |
"name": "MessagesNextLink", | |
"value": "@{body('Parse_MessagesNextLink')?['@odata.nextLink']}" | |
}, | |
"runAfter": { | |
"Parse_MessagesNextLink": [ | |
"Succeeded" | |
] | |
}, | |
"type": "SetVariable" | |
} | |
}, | |
"expression": { | |
"and": [ | |
{ | |
"not": { | |
"equals": [ | |
"@variables('MessagesNextLink')", | |
"" | |
] | |
} | |
} | |
] | |
}, | |
"runAfter": {}, | |
"type": "If" | |
} | |
}, | |
"expression": "@equals(variables('MessagesNextLink'), '')", | |
"limit": { | |
"count": 60, | |
"timeout": "PT1H" | |
}, | |
"runAfter": { | |
"For_each_5": [ | |
"Succeeded" | |
] | |
}, | |
"type": "Until" | |
}, | |
"_HTTP_Get_Messages": { | |
"inputs": { | |
"authentication": { | |
"audience": "https://graph.microsoft.com", | |
"type": "ManagedServiceIdentity" | |
}, | |
"method": "GET", | |
"uri": "https://graph.microsoft.com/v1.0/users/[email protected]/chats/@{variables('ConversationID')}/messages/" | |
}, | |
"runAfter": { | |
"Set_ConversationID": [ | |
"Succeeded" | |
] | |
}, | |
"type": "Http" | |
} | |
}, | |
"foreach": "@triggerBody()?['value']", | |
"runAfter": {}, | |
"type": "Foreach" | |
}, | |
"For_each_4": { | |
"actions": { | |
"Post_ChatBot_Response_in_Teams_chat": { | |
"inputs": { | |
"body": { | |
"messageBody": "<p>@{items('For_each_4')?['message']?['content']}</p>", | |
"recipient": "@variables('ConversationID')" | |
}, | |
"host": { | |
"connection": { | |
"name": "@parameters('$connections')['teams']['connectionId']" | |
} | |
}, | |
"method": "post", | |
"path": "/beta/teams/conversation/message/poster/@{encodeURIComponent('User')}/location/@{encodeURIComponent('Group chat')}" | |
}, | |
"runAfter": {}, | |
"runtimeConfiguration": { | |
"secureData": { | |
"properties": [ | |
"inputs", | |
"outputs" | |
] | |
} | |
}, | |
"type": "ApiConnection" | |
} | |
}, | |
"foreach": "@body('Parse_JSON_Azure_OpenAI_Response')?['choices']", | |
"runAfter": { | |
"Parse_JSON_Azure_OpenAI_Response": [ | |
"Succeeded" | |
] | |
}, | |
"type": "Foreach" | |
}, | |
"HTTP_Azure_OpenAI": { | |
"inputs": { | |
"authentication": { | |
"audience": "https://graph.microsoft.com", | |
"type": "ManagedServiceIdentity" | |
}, | |
"body": { | |
"messages": "@body('Parse_JSON_RequestBody')" | |
}, | |
"headers": { | |
"api-key": "ff58585670df431cafab8e85fc523d13", | |
"content-type": "application/json" | |
}, | |
"method": "POST", | |
"uri": "https://sharepointdocumentschat.openai.azure.com/openai/deployments/chatgpt4/chat/completions?api-version=2023-06-01-preview" | |
}, | |
"runAfter": { | |
"Parse_JSON_RequestBody": [ | |
"Succeeded" | |
] | |
}, | |
"type": "Http" | |
}, | |
"Parse_JSON_Azure_OpenAI_Response": { | |
"inputs": { | |
"content": "@body('HTTP_Azure_OpenAI')", | |
"schema": { | |
"properties": { | |
"choices": { | |
"items": { | |
"properties": { | |
"content_filter_results": { | |
"properties": { | |
"hate": { | |
"properties": { | |
"filtered": { | |
"type": "boolean" | |
}, | |
"severity": { | |
"type": "string" | |
} | |
}, | |
"type": "object" | |
}, | |
"self_harm": { | |
"properties": { | |
"filtered": { | |
"type": "boolean" | |
}, | |
"severity": { | |
"type": "string" | |
} | |
}, | |
"type": "object" | |
}, | |
"sexual": { | |
"properties": { | |
"filtered": { | |
"type": "boolean" | |
}, | |
"severity": { | |
"type": "string" | |
} | |
}, | |
"type": "object" | |
}, | |
"violence": { | |
"properties": { | |
"filtered": { | |
"type": "boolean" | |
}, | |
"severity": { | |
"type": "string" | |
} | |
}, | |
"type": "object" | |
} | |
}, | |
"type": "object" | |
}, | |
"finish_reason": { | |
"type": "string" | |
}, | |
"index": { | |
"type": "integer" | |
}, | |
"message": { | |
"properties": { | |
"content": { | |
"type": "string" | |
}, | |
"role": { | |
"type": "string" | |
} | |
}, | |
"type": "object" | |
} | |
}, | |
"required": [ | |
"index", | |
"finish_reason", | |
"message", | |
"content_filter_results" | |
], | |
"type": "object" | |
}, | |
"type": "array" | |
}, | |
"created": { | |
"type": "integer" | |
}, | |
"id": { | |
"type": "string" | |
}, | |
"model": { | |
"type": "string" | |
}, | |
"object": { | |
"type": "string" | |
}, | |
"prompt_annotations": { | |
"items": { | |
"properties": { | |
"content_filter_results": { | |
"properties": { | |
"hate": { | |
"properties": { | |
"filtered": { | |
"type": "boolean" | |
}, | |
"severity": { | |
"type": "string" | |
} | |
}, | |
"type": "object" | |
}, | |
"self_harm": { | |
"properties": { | |
"filtered": { | |
"type": "boolean" | |
}, | |
"severity": { | |
"type": "string" | |
} | |
}, | |
"type": "object" | |
}, | |
"sexual": { | |
"properties": { | |
"filtered": { | |
"type": "boolean" | |
}, | |
"severity": { | |
"type": "string" | |
} | |
}, | |
"type": "object" | |
}, | |
"violence": { | |
"properties": { | |
"filtered": { | |
"type": "boolean" | |
}, | |
"severity": { | |
"type": "string" | |
} | |
}, | |
"type": "object" | |
} | |
}, | |
"type": "object" | |
}, | |
"prompt_index": { | |
"type": "integer" | |
} | |
}, | |
"required": [ | |
"prompt_index", | |
"content_filter_results" | |
], | |
"type": "object" | |
}, | |
"type": "array" | |
}, | |
"usage": { | |
"properties": { | |
"completion_tokens": { | |
"type": "integer" | |
}, | |
"prompt_tokens": { | |
"type": "integer" | |
}, | |
"total_tokens": { | |
"type": "integer" | |
} | |
}, | |
"type": "object" | |
} | |
}, | |
"type": "object" | |
} | |
}, | |
"runAfter": { | |
"HTTP_Azure_OpenAI": [ | |
"Succeeded" | |
] | |
}, | |
"type": "ParseJson" | |
}, | |
"Parse_JSON_RequestBody": { | |
"inputs": { | |
"content": "@outputs('Compose_RequestBody')", | |
"schema": { | |
"items": { | |
"properties": { | |
"content": { | |
"type": "string" | |
}, | |
"role": { | |
"type": "string" | |
} | |
}, | |
"required": [ | |
"content", | |
"role" | |
], | |
"type": "object" | |
}, | |
"type": "array" | |
} | |
}, | |
"runAfter": { | |
"Compose_RequestBody": [ | |
"Succeeded" | |
] | |
}, | |
"type": "ParseJson" | |
}, | |
"Set_ConversationHistoryReversed": { | |
"inputs": { | |
"name": "ConversationHistoryReversed", | |
"value": "@{outputs('Compose_ConversationHistoryReversed_')}" | |
}, | |
"runAfter": { | |
"Compose_ConversationHistoryReversed_": [ | |
"Succeeded" | |
] | |
}, | |
"type": "SetVariable" | |
}, | |
"Set_ConversationHistoryReversed_2": { | |
"inputs": { | |
"name": "ConversationHistoryReversed", | |
"value": "@{outputs('Compose_ConversationHistoryReversed_SubString')}" | |
}, | |
"runAfter": { | |
"Compose_ConversationHistoryReversed_SubString": [ | |
"Succeeded" | |
] | |
}, | |
"type": "SetVariable" | |
} | |
}, | |
"expression": { | |
"and": [ | |
{ | |
"not": { | |
"equals": [ | |
"@variables('BotUserID')", | |
"18c4a91b-4fa9-4fbd-ab1c-b39465d81baf" | |
] | |
} | |
} | |
] | |
}, | |
"runAfter": { | |
"For_each": [ | |
"Succeeded" | |
] | |
}, | |
"type": "If" | |
}, | |
"ConversationHistory": { | |
"inputs": { | |
"variables": [ | |
{ | |
"name": "ConversationHistory", | |
"type": "string" | |
} | |
] | |
}, | |
"runAfter": { | |
"ConversationID": [ | |
"Succeeded" | |
] | |
}, | |
"type": "InitializeVariable" | |
}, | |
"ConversationHistoryArray": { | |
"inputs": { | |
"variables": [ | |
{ | |
"name": "ConversationHistoryArray", | |
"type": "array" | |
} | |
] | |
}, | |
"runAfter": { | |
"ConversationHistoryReversed": [ | |
"Succeeded" | |
] | |
}, | |
"type": "InitializeVariable" | |
}, | |
"ConversationHistoryReversed": { | |
"inputs": { | |
"variables": [ | |
{ | |
"name": "ConversationHistoryReversed", | |
"type": "string" | |
} | |
] | |
}, | |
"runAfter": { | |
"ConversationHistoryString": [ | |
"Succeeded" | |
] | |
}, | |
"type": "InitializeVariable" | |
}, | |
"ConversationHistoryString": { | |
"inputs": { | |
"variables": [ | |
{ | |
"name": "ConversationHistoryString", | |
"type": "string" | |
} | |
] | |
}, | |
"runAfter": { | |
"ConversationHistory": [ | |
"Succeeded" | |
] | |
}, | |
"type": "InitializeVariable" | |
}, | |
"ConversationID": { | |
"inputs": { | |
"variables": [ | |
{ | |
"name": "ConversationID", | |
"type": "string" | |
} | |
] | |
}, | |
"runAfter": { | |
"Bot_User": [ | |
"Succeeded" | |
] | |
}, | |
"type": "InitializeVariable" | |
}, | |
"For_each": { | |
"actions": { | |
"Get_message_details": { | |
"inputs": { | |
"body": { | |
"recipient": "@items('For_each')?['conversationId']" | |
}, | |
"host": { | |
"connection": { | |
"name": "@parameters('$connections')['teams']['connectionId']" | |
} | |
}, | |
"method": "post", | |
"path": "/beta/teams/messages/@{encodeURIComponent(items('For_each')?['messageId'])}/messageType/@{encodeURIComponent('groupchat')}" | |
}, | |
"runAfter": {}, | |
"type": "ApiConnection" | |
}, | |
"Parse_JSON_-_Bot_User": { | |
"inputs": { | |
"content": "@body('Get_message_details')?['from']?['user']", | |
"schema": { | |
"properties": { | |
"@@odata.type": { | |
"type": "string" | |
}, | |
"displayName": { | |
"type": "string" | |
}, | |
"id": { | |
"type": "string" | |
}, | |
"tenantId": { | |
"type": "string" | |
}, | |
"userIdentityType": { | |
"type": "string" | |
} | |
}, | |
"type": "object" | |
} | |
}, | |
"runAfter": { | |
"Parse_JSON_-_New_Message": [ | |
"Succeeded" | |
] | |
}, | |
"type": "ParseJson" | |
}, | |
"Parse_JSON_-_New_Message": { | |
"inputs": { | |
"content": "@body('Get_message_details')", | |
"schema": { | |
"properties": { | |
"@@odata.context": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"attachments": { | |
"type": "array" | |
}, | |
"body": { | |
"properties": { | |
"content": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"contentType": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"plainTextContent": { | |
"type": [ | |
"string", | |
"null" | |
] | |
} | |
}, | |
"type": [ | |
"object", | |
"null" | |
] | |
}, | |
"channelIdentity": {}, | |
"chatId": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"conversationId": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"createdDateTime": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"deletedDateTime": {}, | |
"etag": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"eventDetail": {}, | |
"from": { | |
"properties": { | |
"application": {}, | |
"device": {}, | |
"user": { | |
"properties": { | |
"@@odata.type": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"displayName": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"id": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"tenantId": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"userIdentityType": { | |
"type": [ | |
"string", | |
"null" | |
] | |
} | |
}, | |
"type": [ | |
"object", | |
"null" | |
] | |
} | |
}, | |
"type": [ | |
"object", | |
"null" | |
] | |
}, | |
"id": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"importance": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"lastEditedDateTime": {}, | |
"lastModifiedDateTime": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"locale": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"mentions": { | |
"type": "array" | |
}, | |
"messageLink": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"messageType": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"policyViolation": {}, | |
"reactions": { | |
"type": "array" | |
}, | |
"replyToId": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"subject": {}, | |
"summary": {}, | |
"threadType": { | |
"type": [ | |
"string", | |
"null" | |
] | |
}, | |
"webUrl": {} | |
}, | |
"type": [ | |
"object", | |
"null" | |
] | |
} | |
}, | |
"runAfter": { | |
"Get_message_details": [ | |
"Succeeded" | |
] | |
}, | |
"type": "ParseJson" | |
}, | |
"Set_Bot_User": { | |
"inputs": { | |
"name": "BotUserID", | |
"value": "@body('Parse_JSON_-_Bot_User')?['id']" | |
}, | |
"runAfter": { | |
"Set_NewMessageFromChat": [ | |
"Succeeded" | |
] | |
}, | |
"type": "SetVariable" | |
}, | |
"Set_NewMessageFromChat": { | |
"inputs": { | |
"name": "NewMessgeFromChat", | |
"value": "@{body('Parse_JSON_-_New_Message')?['body']?['plainTextContent']}" | |
}, | |
"runAfter": { | |
"Parse_JSON_-_Bot_User": [ | |
"Succeeded" | |
] | |
}, | |
"type": "SetVariable" | |
} | |
}, | |
"foreach": "@triggerBody()?['value']", | |
"runAfter": { | |
"Initialize_MessagesNextLink": [ | |
"Succeeded" | |
] | |
}, | |
"type": "Foreach" | |
}, | |
"Initialize_ArrayMessages": { | |
"inputs": { | |
"variables": [ | |
{ | |
"name": "ArrayMessages", | |
"type": "array" | |
} | |
] | |
}, | |
"runAfter": { | |
"Initialize_ConversationHistoryObject": [ | |
"Succeeded" | |
] | |
}, | |
"type": "InitializeVariable" | |
}, | |
"Initialize_ConversationHistoryObject": { | |
"inputs": { | |
"variables": [ | |
{ | |
"name": "ConversationHistoryObject", | |
"type": "object" | |
} | |
] | |
}, | |
"runAfter": { | |
"ConversationHistoryArray": [ | |
"Succeeded" | |
] | |
}, | |
"type": "InitializeVariable" | |
}, | |
"Initialize_MessagesNextLink": { | |
"inputs": { | |
"variables": [ | |
{ | |
"name": "MessagesNextLink", | |
"type": "string" | |
} | |
] | |
}, | |
"runAfter": { | |
"Initialize_ArrayMessages": [ | |
"Succeeded" | |
] | |
}, | |
"type": "InitializeVariable" | |
}, | |
"NewMessageFromChat": { | |
"inputs": { | |
"variables": [ | |
{ | |
"name": "NewMessgeFromChat", | |
"type": "string" | |
} | |
] | |
}, | |
"runAfter": {}, | |
"type": "InitializeVariable" | |
} | |
}, | |
"contentVersion": "1.0.0.0", | |
"outputs": {}, | |
"parameters": { | |
"$connections": { | |
"defaultValue": {}, | |
"type": "Object" | |
} | |
}, | |
"triggers": { | |
"When_a_new_chat_message_is_added": { | |
"inputs": { | |
"body": { | |
"notificationUrl": "@{listCallbackUrl()}" | |
}, | |
"host": { | |
"connection": { | |
"name": "@parameters('$connections')['teams']['connectionId']" | |
} | |
}, | |
"path": "/beta/subscriptions/chatmessagetrigger" | |
}, | |
"type": "ApiConnectionWebhook" | |
} | |
} | |
}, | |
"parameters": { | |
"$connections": { | |
"value": { | |
"teams": { | |
"connectionId": "", | |
"connectionName": "", | |
"id": "" | |
} | |
} | |
} | |
} | |
} |