Protocoles de transfert vers un humain
Détecter les déclencheurs de transfert et passer facilement le relais à des agents humains.
Protocoles de transfert vers un humain est une leçon AI Agents gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage AI Agents, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours AI Agents comprend 4 leçons au total.
Quand un agent doit-il transférer la conversation ?
Toutes les conversations ne doivent pas être traitées de bout en bout par un agent IA. Savoir quand effectuer un transfert est aussi important que savoir répondre. Déclencheurs courants :
- Le client demande explicitement à parler à un humain
- Colère ou détresse détectée
- Situation complexe ou ambiguë hors du champ d'action de l'agent
- Enjeu juridique, de sécurité ou de conformité
Détection des déclencheurs de transfert
Utilisez un classifieur LLM pour détecter les déclencheurs de transfert en temps réel. Vérifiez-les à chaque tour de l'agent, et pas seulement dans le premier message.
import openai, json
client = openai.OpenAI(api_key='YOUR_OPENAI_KEY')
def should_handoff(message: str, history: list[dict]) -> dict:
context = '\n'.join(f"{m['role']}: {m['content']}" for m in history[-4:])
prompt = (
f'Conversation context:\n{context}\n'
f'Latest message: "{message}"\n'
f'Should this be handed to a human agent? Reasons: '
f'angry_customer, explicit_human_request, complex_issue, legal_risk, other.\n'
f'JSON: {{"handoff": true/false, "reason": "..."}}'
)
resp = client.chat.completions.create(
model='gpt-4o-mini',
messages=[{'role': 'user', 'content': prompt}],
response_format={'type': 'json_object'}
)
return json.loads(resp.choices[0].message.content)Transfert accompagné ou transfert à froid
Il existe deux styles de transfert :
- Transfert accompagné : l'agent met le client et l'agent humain en relation, résume la conversation et attend la confirmation de l'humain avant de quitter l'échange.
- Transfert à froid : la conversation est transférée avec un résumé de la transcription, puis l'agent se déconnecte immédiatement.
Les transferts accompagnés réduisent la frustration des clients, mais nécessitent qu'un agent humain soit disponible en temps réel.
Génération du résumé de la conversation
Avant le transfert, l'agent génère un résumé structuré de la conversation. Ce résumé est présenté à l'agent humain comme contexte, ce qui évite au client de devoir se répéter.
def generate_handoff_summary(history: list[dict]) -> str:
transcript = '\n'.join(
f"{m['role'].upper()}: {m['content']}" for m in history
)
prompt = (
f'Summarize this support conversation for a human agent.\n'
f'Include: customer issue, what was tried, current status, and urgency level.\n'
f'Be brief (3-5 sentences).\n\n'
f'TRANSCRIPT:\n{transcript}'
)
resp = client.chat.completions.create(
model='gpt-4o-mini',
messages=[{'role': 'user', 'content': prompt}]
)
return resp.choices[0].message.content
summary = generate_handoff_summary([
{'role': 'user', 'content': 'My account was charged twice for January'},
{'role': 'assistant', 'content': 'I can look into that for you...'}
])
print(summary)Création d'une demande Zendesk lors d'un transfert
Lors d'un transfert, créez une demande Zendesk contenant le résumé et la transcription complète. L'agent humain ouvre la demande et dispose immédiatement du contexte nécessaire.
import requests
ZENDESK_DOMAIN = 'yourcompany.zendesk.com'
ZENDESK_TOKEN = 'YOUR_ZENDESK_API_TOKEN'
ZENDESK_EMAIL = 'agent@yourcompany.com'
def create_zendesk_ticket(customer_email: str, subject: str,
summary: str, transcript: str) -> str:
payload = {
'ticket': {
'subject': subject,
'comment': {'body': f'AI Agent Summary:\n{summary}\n\nFull Transcript:\n{transcript}'},
'requester': {'email': customer_email},
'tags': ['ai_handoff'],
'priority': 'high'
}
}
resp = requests.post(
f'https://{ZENDESK_DOMAIN}/api/v2/tickets.json',
json=payload,
auth=(f'{ZENDESK_EMAIL}/token', ZENDESK_TOKEN)
)
resp.raise_for_status()
return str(resp.json()['ticket']['id'])Transfert d'une conversation Intercom
Avec Intercom, effectuez le transfert en attribuant la conversation à une équipe ou à un agent précis à l'aide de l'API Intercom. L'agent humain reçoit une notification et peut poursuivre immédiatement la conversation.
import requests
INTERCOM_TOKEN = 'YOUR_INTERCOM_ACCESS_TOKEN'
def handoff_to_intercom_team(conversation_id: str, team_id: str,
note: str) -> bool:
headers = {
'Authorization': f'Bearer {INTERCOM_TOKEN}',
'Content-Type': 'application/json'
}
# Add a note with the AI summary
requests.post(
f'https://api.intercom.io/conversations/{conversation_id}/parts',
headers=headers,
json={'type': 'note', 'body': note}
)
# Assign to human team
resp = requests.put(
f'https://api.intercom.io/conversations/{conversation_id}/parts',
headers=headers,
json={'type': 'assignment', 'assignee_id': team_id,
'message_type': 'assignment'}
)
return resp.status_code == 200Le message de transfert destiné au client
Le message que reçoit le client lors du transfert est important. Il doit confirmer le transfert, préciser le délai d'attente prévu et montrer que le problème est pris au sérieux.
def generate_handoff_message(reason: str, wait_minutes: int = 5) -> str:
messages = {
'explicit_human_request':
f'Of course! I am connecting you with a human agent right now. '
f'Estimated wait: {wait_minutes} minutes. Your conversation history '
f'has been shared so you will not need to repeat anything.',
'angry_customer':
f'I completely understand your frustration. Let me get a senior '
f'team member on the line immediately. Wait: ~{wait_minutes} min.',
'complex_issue':
f'This situation needs specialist attention. I am escalating now '
f'and sharing all the context we have discussed. Wait: ~{wait_minutes} min.',
'legal_risk':
f'This matter requires our compliance team. Connecting you now.'
}
return messages.get(reason, f'Connecting you with a human agent. ~{wait_minutes} min wait.')
if __name__ == '__main__':
print(generate_handoff_message('angry_customer', wait_minutes=3))
print(generate_handoff_message('explicit_human_request'))
Mise en file d'attente lorsqu'aucun humain n'est disponible
En dehors des heures ouvrées ou pendant les périodes de forte activité, aucun agent humain n'est forcément disponible immédiatement. Mettez le transfert en file d'attente, envoyez au client une confirmation avec un numéro de référence et avertissez le personnel d'astreinte via Slack ou PagerDuty.
import requests
SLACK_WEBHOOK = 'https://hooks.slack.com/services/YOUR/WEBHOOK/URL'
def notify_on_call(ticket_id: str, summary: str, priority: str):
payload = {
'text': f'*New AI Handoff* [{priority.upper()}]',
'attachments': [{
'color': '#ff0000' if priority == 'high' else '#ffcc00',
'fields': [
{'title': 'Ticket ID', 'value': ticket_id, 'short': True},
{'title': 'Summary', 'value': summary[:500]}
]
}]
}
requests.post(SLACK_WEBHOOK, json=payload)Comportement de l'agent après un transfert
Après avoir déclenché un transfert, l'agent doit cesser d'essayer de résoudre le problème. Il peut encore répondre à des questions factuelles (statut de commande, liens vers les politiques), mais ne doit prendre aucun engagement ni aucune décision.
def agent_post_handoff_response(message: str, handoff_complete: bool) -> str:
if not handoff_complete:
return 'Connecting you now...'
# Still answer simple factual questions
simple_keywords = ['status', 'where', 'when', 'policy', 'link']
if any(kw in message.lower() for kw in simple_keywords):
return 'I can help with that while you wait for the agent.'
# Defer everything else
return (
'Your case has been assigned to a specialist. '
'They will respond shortly. I will step back to avoid confusion.'
)
if __name__ == '__main__':
print(agent_post_handoff_response('Where is my order?', handoff_complete=True))
print(agent_post_handoff_response('I want a refund now', handoff_complete=True))
Suivi des indicateurs de transfert
Mesurez le taux de transfert, la répartition des motifs et le délai de résolution après transfert. Des taux de transfert élevés pour une intention donnée indiquent que l'agent doit mieux couvrir ce sujet.
from collections import Counter
import json
handoff_log = [] # In production: a database table
def record_handoff(session_id: str, reason: str, turn_number: int):
handoff_log.append({
'session_id': session_id,
'reason': reason,
'turns_before_handoff': turn_number
})
def handoff_analytics() -> dict:
reasons = Counter(h['reason'] for h in handoff_log)
avg_turns = sum(h['turns_before_handoff'] for h in handoff_log) / max(len(handoff_log), 1)
return {
'total_handoffs': len(handoff_log),
'reason_breakdown': dict(reasons),
'avg_turns_before_handoff': round(avg_turns, 1)
}
if __name__ == '__main__':
record_handoff('s1', 'angry_customer', 4)
record_handoff('s2', 'complex_issue', 7)
record_handoff('s3', 'angry_customer', 2)
stats = handoff_analytics()
print(f"Total handoffs: {stats['total_handoffs']}")
print(f"Reasons: {stats['reason_breakdown']}")
print(f"Avg turns before handoff: {stats['avg_turns_before_handoff']}")
Orchestration complète du transfert
Combinez toutes les étapes dans une fonction execute_handoff() que l'agent appelle dès qu'un déclencheur est détecté.
def execute_handoff(session: dict, reason: str) -> str:
# 1. Generate summary
summary = generate_handoff_summary(session['history'])
transcript = '\n'.join(
f"{m['role']}: {m['content']}" for m in session['history']
)
# 2. Create ticket
ticket_id = create_zendesk_ticket(
session['customer_email'],
f'AI Handoff: {reason}',
summary,
transcript
)
# 3. Notify on-call team
notify_on_call(ticket_id, summary, priority='high')
# 4. Record metrics
record_handoff(session['id'], reason, len(session['history']))
# 5. Return customer-facing message
wait = 5 # fetch from queue depth in production
return generate_handoff_message(reason, wait)Quelle est la différence essentielle entre un transfert accompagné et un transfert à froid ?
Le choix du style de transfert approprié influe sur l'expérience client et la complexité opérationnelle. Comprendre cette distinction vous aide à mettre en œuvre le protocole adapté.
Récapitulatif des protocoles de transfert à un humain
Un transfert efficace nécessite : la détection des déclencheurs (colère, demande explicite, complexité), la génération d'un résumé pour l'agent humain, la création d'une demande dans Zendesk/Intercom avec la transcription complète, la notification du personnel d'astreinte et l'envoi au client d'un message clair sur la suite des événements.
Après le transfert, l'agent se met en retrait et laisse toutes les décisions à l'humain.
Questions Fréquemment Posées
La leçon « Protocoles de transfert vers un humain » est-elle gratuite ?
Oui — le texte complet de « Protocoles de transfert vers un humain » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours AI Agents, passe à CoddyKit PRO. Le cours AI Agents comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Protocoles de transfert vers un humain » ?
Détecter les déclencheurs de transfert et passer facilement le relais à des agents humains. Tu pratiques AI Agents avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer AI Agents ?
Aucune expérience préalable n'est requise. AI Agents sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.
Combien de temps prend la leçon « Protocoles de transfert vers un humain » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon AI Agents ?
Oui. Chaque leçon AI Agents inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Routage des tickets et logique d’escalade
- Intégration CRM : Salesforce et HubSpot
- Protocoles de transfert vers un humain
- Gestion du contexte et de l’historique client