#
# This workflow demonstrates providing input arguments to an agent.
#
# Example input: 
# I'd like to go on vacation.
#
kind: Workflow
trigger:

  kind: OnConversationStart
  id: workflow_demo
  actions:

    # Capture the original user message for input to the location-aware agent
    - kind: SetVariable
      id: set_count_increment
      variable: Local.InputMessage
      value: =System.LastMessage

    # Invoke the triage agent to determine location requirements
    - kind: InvokeAzureAgent
      id: solicit_input
      conversationId: =System.ConversationId
      agent:
        name: LocationTriageAgent
      input:
        messages: =Local.ActionMessage
      output:
        messages: Local.TriageResponse

    # Request input from the user based on the triage response
    - kind: RequestExternalInput
      id: request_requirements
      variable: Local.NextInput

    # Capture the most recent interaction for evaluation
    - kind: SetTextVariable
      id: set_status_message
      variable: Local.LocationStatusInput
      value: |-
          AGENT - {MessageText(Local.TriageResponse)}

          USER - {MessageText(Local.NextInput)}

    # Evaluate the status of the location triage
    - kind: InvokeAzureAgent
      id: evaluate_location
      agent:
        name: LocationCaptureAgent
      input:
        messages: =UserMessage(Local.LocationStatusInput)
      output:
        responseObject: Local.LocationResponse

    # Determine if the location information is complete
    - kind: ConditionGroup
      id: check_completion
      conditions:

        - condition: |-
            =Local.LocationResponse.is_location_defined = false Or
             Local.LocationResponse.is_location_confirmed = false
          id: check_done
          actions:

            # Capture the action message for input to the triage agent
            - kind: SetVariable
              id: set_next_message
              variable: Local.ActionMessage
              value: =AgentMessage(Local.LocationResponse.action)

            - kind: GotoAction
              id: goto_solicit_input
              actionId: solicit_input

      elseActions:

    # Create a new conversation so the prior context does not interfere
    - kind: CreateConversation
      id: conversation_location
      conversationId: Local.LocationConversationId

    # Invoke the location-aware agent with the location argument
    # and loop until the user types "EXIT"
    - kind: InvokeAzureAgent
      id: location_response
      conversationId: =Local.LocationConversationId
      agent:
        name: LocationAwareAgent
      input:
        messages: =Local.InputMessage
        arguments:
          location: =Local.LocationResponse.place
        externalLoop:
          when: =Upper(System.LastMessage.Text) <> "EXIT"
      output:
        autoSend: true
