Back to Blog
5 min read

Power Virtual Agents Updates: Low-Code Conversational AI

Power Virtual Agents continues to democratize conversational AI development. With recent updates, non-developers can now build sophisticated chatbots that integrate with enterprise systems and leverage AI capabilities.

What’s New in Power Virtual Agents

GPT-Powered Responses

Power Virtual Agents now can generate responses using GPT models:

# Topic: General Knowledge Query
trigger_phrases:
  - "Tell me about"
  - "What is"
  - "Explain"

nodes:
  - type: Question
    variable: topic
    prompt: "What would you like to know about?"

  - type: Action
    connection: Azure OpenAI
    inputs:
      prompt: "Explain {topic} in simple terms for a business user."
      max_tokens: 200
    output_variable: gpt_response

  - type: Message
    text: "{gpt_response}"

Enhanced Topic Design

Topics now support more complex logic:

# Topic: Order Management
trigger_phrases:
  - "Check my order"
  - "Order status"
  - "Where is my package"

nodes:
  - type: Question
    variable: order_number
    prompt: "What's your order number?"
    validation:
      type: regex
      pattern: "^[A-Z]{2}[0-9]{6}$"
      error_message: "Please enter a valid order number (e.g., AB123456)"

  - type: Action
    connection: Dataverse
    operation: GetOrder
    inputs:
      order_id: "{order_number}"
    output_variable: order_data

  - type: Condition
    conditions:
      - expression: "{order_data.status} == 'shipped'"
        nodes:
          - type: Message
            text: "Your order {order_number} has shipped! Tracking: {order_data.tracking_number}"
          - type: AdaptiveCard
            template: order_tracking_card
            data: order_data

      - expression: "{order_data.status} == 'processing'"
        nodes:
          - type: Message
            text: "Your order is being processed. Expected ship date: {order_data.estimated_ship_date}"

      - expression: "default"
        nodes:
          - type: Message
            text: "I couldn't find order {order_number}. Would you like to speak with an agent?"
          - type: TransferToAgent
            skill_name: "Order Support"

Integration with Power Automate

Create complex workflows triggered by chatbot interactions:

{
  "definition": {
    "triggers": {
      "When_PVA_calls_flow": {
        "type": "Request",
        "kind": "PowerVirtualAgents"
      }
    },
    "actions": {
      "Get_Customer_Data": {
        "type": "OpenApiConnection",
        "inputs": {
          "host": {
            "connectionName": "shared_commondataservice"
          },
          "method": "get",
          "path": "/v2/datasets/@{encodeURIComponent('org')}/tables/@{encodeURIComponent('contacts')}/items",
          "queries": {
            "$filter": "emailaddress1 eq '@{triggerBody()?['email']}'"
          }
        }
      },
      "Check_Loyalty_Status": {
        "type": "OpenApiConnection",
        "inputs": {
          "host": {
            "connectionName": "shared_sql"
          },
          "method": "get",
          "path": "/datasets/@{encodeURIComponent('server.database.windows.net')}/tables/@{encodeURIComponent('LoyaltyMembers')}/items",
          "queries": {
            "$filter": "CustomerId eq '@{body('Get_Customer_Data')?['value'][0]['contactid']}'"
          }
        }
      },
      "Return_to_PVA": {
        "type": "Response",
        "kind": "PowerVirtualAgents",
        "inputs": {
          "statusCode": 200,
          "body": {
            "customer_name": "@{body('Get_Customer_Data')?['value'][0]['fullname']}",
            "loyalty_tier": "@{body('Check_Loyalty_Status')?['value'][0]['Tier']}",
            "points_balance": "@{body('Check_Loyalty_Status')?['value'][0]['Points']}"
          }
        }
      }
    }
  }
}

Adaptive Cards in PVA

Create rich interactive experiences:

{
  "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
  "type": "AdaptiveCard",
  "version": "1.4",
  "body": [
    {
      "type": "Container",
      "items": [
        {
          "type": "TextBlock",
          "text": "Order Status: ${order_number}",
          "weight": "Bolder",
          "size": "Large"
        },
        {
          "type": "FactSet",
          "facts": [
            {
              "title": "Status",
              "value": "${status}"
            },
            {
              "title": "Shipping",
              "value": "${shipping_method}"
            },
            {
              "title": "Estimated Delivery",
              "value": "${estimated_delivery}"
            }
          ]
        },
        {
          "type": "ColumnSet",
          "columns": [
            {
              "type": "Column",
              "width": "stretch",
              "items": [
                {
                  "type": "Image",
                  "url": "${tracking_map_url}",
                  "altText": "Package location map"
                }
              ]
            }
          ]
        }
      ]
    }
  ],
  "actions": [
    {
      "type": "Action.Submit",
      "title": "Track Package",
      "data": {
        "action": "track",
        "tracking_number": "${tracking_number}"
      }
    },
    {
      "type": "Action.OpenUrl",
      "title": "View Order Details",
      "url": "${order_details_url}"
    }
  ]
}

Multi-language Support

Configure bot for multiple languages:

# Settings
languages:
  primary: en-us
  secondary:
    - es-mx
    - fr-ca
    - de-de

localization:
  greeting:
    en-us: "Hello! How can I help you today?"
    es-mx: "¡Hola! ¿Cómo puedo ayudarte hoy?"
    fr-ca: "Bonjour! Comment puis-je vous aider aujourd'hui?"
    de-de: "Hallo! Wie kann ich Ihnen heute helfen?"

  order_prompt:
    en-us: "Please enter your order number"
    es-mx: "Por favor ingrese su número de pedido"
    fr-ca: "Veuillez entrer votre numéro de commande"
    de-de: "Bitte geben Sie Ihre Bestellnummer ein"

Analytics and Insights

Track bot performance with built-in analytics:

# Analytics Configuration
analytics:
  track_topics: true
  track_sessions: true
  custom_events:
    - name: order_lookup
      properties:
        - order_found
        - order_status
    - name: agent_transfer
      properties:
        - reason
        - wait_time

  kpis:
    - resolution_rate
    - avg_session_length
    - user_satisfaction
    - escalation_rate

Security and Governance

# Governance Settings
security:
  authentication:
    required: true
    providers:
      - azure_ad
    scopes:
      - User.Read
      - profile

  data_handling:
    pii_detection: true
    log_retention_days: 30
    mask_sensitive_data: true

  dlp_policies:
    - name: "Block External Sharing"
      connectors:
        blocked:
          - Twitter
          - Facebook
        allowed:
          - SharePoint
          - Dataverse
          - Azure OpenAI

Custom Entities

Define domain-specific entities:

entities:
  product_category:
    type: closed_list
    values:
      - name: electronics
        synonyms: ["tech", "gadgets", "devices"]
      - name: clothing
        synonyms: ["apparel", "fashion", "wear"]
      - name: home
        synonyms: ["furniture", "decor", "household"]

  order_status:
    type: closed_list
    values:
      - processing
      - shipped
      - delivered
      - cancelled
      - returned

  date_reference:
    type: prebuilt
    prebuilt_type: datetimeV2

Integration with Teams

Deploy bot to Microsoft Teams:

# Teams Configuration
teams_settings:
  app_name: "Contoso Support Bot"
  description: "Get help with orders, returns, and general questions"

  scopes:
    - personal
    - team
    - groupchat

  commands:
    - command: "order"
      description: "Check order status"
    - command: "return"
      description: "Start a return"
    - command: "help"
      description: "Get help"

  message_extension:
    enabled: true
    type: search
    search_commands:
      - id: "productSearch"
        title: "Search Products"
        description: "Search our product catalog"

Best Practices

  1. Start with common scenarios: Build topics for the most frequent questions first
  2. Use fallback topics: Always have a graceful fallback when the bot doesn’t understand
  3. Test with real users: Get feedback from actual users early
  4. Monitor and improve: Use analytics to identify gaps and improve topics
  5. Integrate thoughtfully: Only add integrations that provide real value

Publishing and Deployment

# Deployment Configuration
deployment:
  environments:
    - name: development
      url: "https://dev-bot.contoso.com"
      auto_deploy: true

    - name: staging
      url: "https://staging-bot.contoso.com"
      approval_required: true
      approvers:
        - bot-admins@contoso.com

    - name: production
      url: "https://bot.contoso.com"
      approval_required: true
      approvers:
        - it-leadership@contoso.com

  channels:
    - teams
    - web
    - facebook_messenger

  versioning:
    strategy: semantic
    current: "2.1.0"

Conclusion

Power Virtual Agents makes conversational AI accessible to citizen developers while providing the depth needed for enterprise scenarios. The combination of low-code design, powerful integrations, and AI capabilities enables organizations to quickly deploy intelligent chatbots that improve customer and employee experiences.

Resources

Michael John Peña

Michael John Peña

Senior Data Engineer based in Sydney. Writing about data, cloud, and technology.