Overview

The Live Agent feature in jtel Portal makes call handling better by using AI to transcribe live calls, extract important information, analyze sentiment* and provide real-time help to agents. This feature helps supervisors and agents to deal with conversations more efficiently by using AI.

Features

Live Transcription

AI-Powered Assistance

A chain of AI modules can be attached to the transcription process, offering:

Supervisor Features

Data Storage & Retrieval

Configuration

Resource Activation

Ensure the following resources are allowed (Sysadmin - Resources)

portal.Acd.AcdSupervisor.LiveAgent

portal.Acd.AgentHome.LiveAgent

They Can be assigned per role (Client Admin / Client User).

AI Service Rendering Control

It is possible to control the rendering (visibility) of individual Live Agent AI services via dedicated resources.
Each AI feature (Transcription, Assistant, Sentiment, Suggestions, etc.) has a separate permission resource.

ResourceDescription

portal.Acd.AgentHome.LiveAgent.AI.Transcription

Renders the AI Transcription section.
portal.AgentHome.LiveAgent.AI.AssistantRenders the AI Assistant services (Suggestions, Summary, Sentiment).
portal.Acd.AgentHome.LiveAgent.AI.Assistant.CallerRenders the caller's sentiment analysis.
portal.Acd.AgentHome.LiveAgent.AI.Assistant.AgentRenders the agent's sentiment analysis.
portal.Acd.AgentHome.LiveAgent.AI.Assistant.SugesstionRenders the AI Suggestion section.
portal.Acd.AgentHome.LiveAgent.AI.Assistant.SummaryRenders the AI Summary section.
portal.Acd.AgentHome.LiveAgent.AI.Assistant.SatisfactionRenders the AI Satisfaction section.
portal.Acd.AgentHome.LiveAgent.AI.Assistant.TACRenders the AI Transaction Code section.

Client Master Data - Parameters

In Client Master Data - Parameters. set AI Pipeline Configuration, After Call Pipeline Configuration and Transcription Provider

NameValue
LiveAgent.AIPipeline.EndPointhttp://<server>:<port>/api/v1/aipipeline
LiveAgent.AIPipeline.Input{
    "endpoints": [
        {
            "type": "suggestions",
            "url": "http://<server>:<port>/webhooks/rest/webhook",
            "input": {
                "sender": "%Service.StatisticsPartAID_%",
                "message": "$ai_pipeline_input"
            }
        },
        {
            "type": "sentiment",
            "url": "http://<server>:<port>/api/v1/sentiment",
            "input": {
                "data": "$ai_pipeline_input"
            }
        }
    ]
}
LiveAgent.AfterCallPipeline.EndPointhttp://<server>:<port>/api/v1/aftercall
LiveAgent.AfterCallPipeline.Input{
    "endpoints" : [
        {
            "type" : "summary",
            "url" : "http://<server>:<port>/api/v1/summary",
            "input" : $ai_pipeline_input
        }
    ],
    
    "respondTo" : {
        "host" : "%SERVER_IP_UDP_ADDRESS%",
        "port" : %ACD.UDP.Webserver.Port%,
        "message" : "NONCALL;AI_AFTERCALL_PIPELINE_RESULT;%QueueCheck.AgentDataID%;%Service.StatisticsPartAID_%;AI_PIPELINE_OUTPUT=$ai_pipeline_output"
    }
}

LiveAgent.AfterCallPipeline.Prompts.SatisfactionBot

 # Instructions

Please give me the most likely score from 0 to 10 the caller would give to the net promoter score question regarding his satisfaction in the following conversation. 
Answer with a JSON structure like this:
{
  "score": score
  "reason":"your reason for selecting this score"
}

The score should be a number from 0 to 10 just like the caller might answer the net promoter question.
In the "reason" field please state clearly why you selected this score, including factors or statements in the conversation which led to this conclusion.

VERY IMPORTANT: Provide all answers in the German language.
VERY IMPORTANT: DO NOT RETURN TEXT. Only return a JSON structure as described above and DO NOT return any formatting or markup. Just the JSON structure as text.

# Conversation
{% for entry in conversationData.conversationEntries %}
  {% if entry.source == 'agent' %}
Agent: {{ entry.transcription }}
  {% else %}
Caller: {{ entry.transcription }}
  {% endif %}
{% endfor %}

LiveAgent.AfterCallPipeline.Prompts.SummaryBot.DetectLanguage

 # Instructions

Tell me what language this conversation was held in.
Please provide the answer as one word only - just the language name.

# Conversation
{% for entry in conversationData.conversationEntries %}
  {# Use up to 4 conversation entries for the language detection #}
  {% if loop.index <= 4 %}
    {% if entry.source == 'agent' %}
Agent: {{ entry.transcription }}
    {% else %}
Caller: {{ entry.transcription }}
    {% endif %}
  {% endif %}
{% endfor %}

LiveAgent.AfterCallPipeline.Prompts.SummaryBot.Summarize

 # Instructions

Please summarize only the most important information from this conversation using bullet points in {{ detected_language }}.
Use as much space as you need but only up to 512 characters.
If you need to leave anything out, make sure the most important information is included.
The most important information includes:
- customer numbers
- ticket numbers
- problems and resolutions

# Conversation
{% for entry in conversationData.conversationEntries %}
  {% if entry.source == 'agent' %}
Agent: {{ entry.transcription }}
  {% else %}
Caller: {{ entry.transcription }}
  {% endif %}
{% endfor %}

LiveAgent.AfterCallPipeline.Prompts.TACBot

 # Instructions

Please find the transaction codes (reasons for conversation) which apply to the following conversation.
Please only report transaction codes which actually happened, if nothing applies, then simply report an empty result.
Answer as a JSON array of objects with this structure:
{
   "ID":ID,
   "ExportKey":ExportKey,
   "reason":"your reason for selecting this transaction code"
}

In the "reason" field please state clearly why you selected this transaction code, including the questions or statements in the conversation which led to this conclusion.

VERY IMPORTANT: Provide the reason in German.
VERY IMPORTANT: DO NOT RETURN TEXT. Only return a JSON array as described above and DO NOT return any formatting or markup. Just the JSON as text.

{% if transactionCodes %}
# Transaction Codes
{% for entry in transactionCodes %}

## Transaction Code
ID: {{ entry.ID }}
ExportKey: {{ entry.ExportKey }}
Instructions: {{ entry.LLMPrompt }}
{% endfor %}
{% endif %}

# Conversation
{% for entry in conversationData.conversationEntries %}
  {% if entry.source == 'agent' %}
Agent: {{ entry.transcription }}
  {% else %}
Caller: {{ entry.transcription }}
  {% endif %}
{% endfor %}

LiveAgent.Transcribe.ProviderEnderTuring.v2 (or Azure...)

User Settings

Activate Live Agent functionality per user role:

Licensing & Activation

Example Interface

Agent Home View

Refer to the screenshot below for a visual representation of Live Agent in Agent Home.

Supervisor Detail View

Supervisors can see the agent’s current call, live transcription, and send direct messages to guide the agent during the call.




*Please note: Sentiment Analysis

Emotional states derived from conversation analysis (sentiment analysis) are considered ‘health-related data’. The use of artificial intelligence (AI) for sentiment (mood) analysis in telephone conversations in Germany is subject to one of the strictest and most complex legal frameworks in the world. The biggest legal hurdle arises from the actual purpose of the technology, determining the emotional tenor of a conversation. When an AI system recognizes and classifies emotions such as joy, frustration, fear or stress, it draws conclusions about the mental and psychological state of the speaker. This means that the processing falls into the most heavily protected data category of all. The path to lawful speech analysis is achieved through strategic planning and documented implementation in all areas, enabling a company to move from a position of high legal risk to one of reasonable compliance, thus enabling the innovative use of technology while preserving the fundamental rights to privacy and co-determination that are firmly anchored in German legislation.