La transferencia humana es un componente secreto de la automatización del servicio al cliente: asegura que cuando la IA alcanza sus límites, un humano versado puede hacerse cargo sin problemas. En este tutorial, implementaremos un sistema de transferencia humana para un agente de seguros con IA que usa Parlant. Aprenderá a crear una interfaz basada en rleucir que permita a un cirujano humano (Nivel 2) ver los mensajes de los clientes en vivo y contestar directamente internamente de la misma sesión, cerrando la brecha entre la automatización y la experiencia humana. Mira el Códigos completos aquí.
Configuración de las dependencias
Asegúrese de tener una tecla API OperaI válida antiguamente de comenzar. Una vez que lo haya generado desde su tablero de OpenAI, cree un archivo .env en el directorio raíz de su plan y guarde la secreto de forma segura allí:
OPENAI_API_KEY=your_api_key_here
Esto mantiene sus credenciales seguras y evita que se codifiquen en su almohadilla de código.
pip install parlant dotenv streamlit
Agente de seguros (agente.py)
Comenzaremos construyendo el asunto del agente, que define el comportamiento de la IA, los viajes de conversación, el lista y el mecanismo de transferencia humana. Esto formará la dialéctica central que impulsa a nuestro asistente de seguro en Parlant. Una vez que el agente esté inteligente y capaz de aumentar al modo manual, pasaremos a desarrollar la interfaz de transferencia humana basada en la transmisión, donde los operadores humanos pueden ver sesiones en curso, ojear mensajes de clientes y contestar en tiempo actual, creando una colaboración perfecta entre la automatización de la IA y la experiencia humana. Mira el Códigos completos aquí.
Cargando las bibliotecas requeridas
import asyncio
import os
from datetime import datetime
from dotenv import load_dotenv
import parlant.sdk as p
load_dotenv()
Definición de las herramientas del agente
@p.tool
async def get_open_claims(context: p.ToolContext) -> p.ToolResult:
return p.ToolResult(data=("Claim #123 - Pending", "Claim #456 - Approved"))
@p.tool
async def file_claim(context: p.ToolContext, claim_details: str) -> p.ToolResult:
return p.ToolResult(data=f"New claim filed: {claim_details}")
@p.tool
async def get_policy_details(context: p.ToolContext) -> p.ToolResult:
return p.ToolResult(data={
"policy_number": "POL-7788",
"coverage": "Covers accidental damage and theft up to $50,000"
})
El monolito de código presenta tres herramientas que simulan interacciones que un asistente de seguro podría precisar.
- El get_open_claims La aparejo representa una función asincrónica que recupera una relación de reclamos de seguro extenso, lo que permite al agente proporcionar a los usuarios información actualizada sobre reclamos pendientes o aprobados.
- El file_claim La aparejo acepta los detalles de la protesta como entrada y simula el proceso de presentación de un nuevo atractivo de seguro, devolviendo un mensaje de confirmación al usufructuario.
Finalmente, el get_policy_details La aparejo proporciona información de póliza esencial, como el número de póliza y los límites de cobertura, lo que permite al agente contestar con precisión a las preguntas sobre la cobertura del seguro. Mira el Códigos completos aquí.
@p.tool
async def initiate_human_handoff(context: p.ToolContext, reason: str) -> p.ToolResult:
"""
Initiate handoff to a human agent when the AI cannot adequately help the customer.
"""
print(f"🚨 Initiating human handoff: {reason}")
# Setting session to manual mode stops automatic AI responses
return p.ToolResult(
data=f"Human handoff initiated because: {reason}",
control={
"mode": "manual" # Switch session to manual mode
}
)
El iniciate_human_handoff La aparejo permite al agente de IA transferir con garbo una conversación a un cirujano humano cuando detecta que el problema requiere intervención humana. Al cambiar la sesión al modo manual, detiene todas las respuestas automatizadas, asegurando que el agente humano pueda tomar el control total. Esta aparejo ayuda a amparar una transición suave entre la IA y la socorro humana, asegurando que las consultas de clientes complejas o sensibles se manejen con el nivel apropiado de experiencia.
Definición del lista
Un lista define términos y frases secreto que el agente de IA debe confesar y contestar de modo consistente. Ayuda a amparar la precisión y la columna de la marca al dar al agente respuestas claras y predefinidas para consultas comunes específicas del dominio. Mira el Códigos completos aquí.
async def add_domain_glossary(agent: p.Agent):
await agent.create_term(
name="Customer Service Number",
description="You can reach us at +1-555-INSURE",
)
await agent.create_term(
name="Operating Hours",
description="We are available Mon-Fri, 9AM-6PM",
)
Definición de los viajes
# ---------------------------
# Claim Journey
# ---------------------------
async def create_claim_journey(agent: p.Agent) -> p.Journey:
journey = await agent.create_journey(
title="File an Insurance Claim",
description="Helps customers report and submit a new claim.",
conditions=("The customer wants to file a claim"),
)
s0 = await journey.initial_state.transition_to(chat_state="Ask for accident details")
s1 = await s0.target.transition_to(tool_state=file_claim, condition="Customer provides details")
s2 = await s1.target.transition_to(chat_state="Confirm claim was submitted", condition="Claim successfully created")
await s2.target.transition_to(state=p.END_JOURNEY, condition="Customer confirms submission")
return journey
# ---------------------------
# Policy Journey
# ---------------------------
async def create_policy_journey(agent: p.Agent) -> p.Journey:
journey = await agent.create_journey(
title="Explain Policy Coverage",
description="Retrieves and explains customer's insurance coverage.",
conditions=("The customer asks about their policy"),
)
s0 = await journey.initial_state.transition_to(tool_state=get_policy_details)
await s0.target.transition_to(
chat_state="Explain the policy coverage clearly",
condition="Policy info is available",
)
await agent.create_guideline(
condition="Customer presses for judicial interpretation of coverage",
action="Politely explain that judicial advice cannot be provided",
)
return journey
El Alucinación de protesta Prontuario a los clientes a través del proceso de presentar un nuevo atractivo de seguro. Recopila detalles del choque, desencadena la aparejo de presentación de reclamos, confirma la presentación exitosa y luego termina el delirio, automatizando todo el flujo de iniciación de reclamos.
El Alucinación político Ayuda a los clientes a comprender su cobertura de seguro al recuperar los detalles de la póliza y explicarlos claramente. Además incluye una orientador para avalar que la IA evite dar interpretaciones legales, amparar el cumplimiento y la profesionalidad. Mira el Códigos completos aquí.
Definición del corredor principal
async def main():
async with p.Server() as server:
agent = await server.create_agent(
name="Insurance Support Agent",
description=(
"Friendly Tier-1 AI assistant that helps with claims and policy questions. "
"Escalates complex or unresolved issues to human agents (Tier-2)."
),
)
# Add shared terms & definitions
await add_domain_glossary(agent)
# Journeys
claim_journey = await create_claim_journey(agent)
policy_journey = await create_policy_journey(agent)
# Disambiguation rule
status_obs = await agent.create_observation(
"Customer mentions an issue but doesn't specify if it's a claim or policy"
)
await status_obs.disambiguate((claim_journey, policy_journey))
# Integral Guidelines
await agent.create_guideline(
condition="Customer asks about unrelated topics",
action="Kindly redirect them to insurance-related support only",
)
# Human Handoff Guideline
await agent.create_guideline(
condition="Customer requests human assistance or AI is uncertain about the next step",
action="Initiate human handoff and notify Tier-2 support.",
tools=(initiate_human_handoff),
)
print("✅ Insurance Support Agent with Human Handoff is ready! Open the Parlant UI to chat.")
if __name__ == "__main__":
asyncio.run(main())
Ejecutando el agente
Esto iniciará el agente parlante localmente en http: // localhost: 8800 donde manejará toda la dialéctica de conversación y la gobierno de sesiones.
En el venidero paso, conectaremos a este agente en ejecución a nuestra interfaz de transferencia humana basada en simplificación, lo que permite a un cirujano humano unir y mandar las conversaciones en vivo sin problemas utilizando la ID de sesión de Parlant. Mira el Códigos completos aquí.
HomedOm Human (homeToff.py)
Importación de bibliotecas
import asyncio
import streamlit as st
from datetime import datetime
from parlant.client import AsyncParlantClient
Configuración del cliente Parlant
Una vez que el script del agente de IA se está ejecutando, Parlant alojará su servidor localmente (generalmente en http: // localhost: 8800).
Aquí, nos conectamos a esa instancia en ejecución creando un cliente asíncrono. Mira el Códigos completos aquí.
client = AsyncParlantClient(base_url="http://localhost:8800")
Cuando ejecute el agente y obtenga una ID de sesión, usaremos esa identificación en esta interfaz de usufructuario para conectar y mandar esa conversación específica.
Encargo estatal de sesión
Session_State de Streamlit se utiliza para persistir en los datos en las interacciones del usufructuario, como acumular mensajes recibidos y rastrear la última compensación de eventos para obtener otros nuevos de modo eficaz. Mira el Códigos completos aquí.
if "events" not in st.session_state:
st.session_state.events = ()
if "last_offset" not in st.session_state:
st.session_state.last_offset = 0
Función de renderizado de mensajes
Esta función controla cómo aparecen los mensajes en la interfaz jovial: diferenciar entre clientes, IA y agentes humanos para viejo claridad. Mira el Códigos completos aquí.
def render_message(message, source, participant_name, timestamp):
if source == "customer":
st.markdown(f"**🧍♂️ Customer ({timestamp}):** {message}")
elif source == "ai_agent":
st.markdown(f"**🤖 AI ({timestamp}):** {message}")
elif source == "human_agent":
st.markdown(f"**🙋 {participant_name} ({timestamp}):** {message}")
elif source == "human_agent_on_behalf_of_ai_agent":
st.markdown(f"**👤 (Human as AI) ({timestamp}):** {message}")
Obteniendo eventos de Parlant
Esta función asincrónica recupera nuevos mensajes (eventos) de Parlant para la sesión dada.
Cada evento representa un mensaje en la conversación, ya sea enviado por el cliente, IA o cirujano humano. Mira el Códigos completos aquí.
async def fetch_events(session_id):
try:
events = await client.sessions.list_events(
session_id=session_id,
kinds="message",
min_offset=st.session_state.last_offset,
wait_for_data=5
)
for event in events:
message = event.data.get("message")
source = event.source
participant_name = event.data.get("participant", {}).get("display_name", "Unknown")
timestamp = getattr(event, "created", None) or event.data.get("created", "Unknown Time")
event_id = getattr(event, "id", "Unknown ID")
st.session_state.events.append(
(message, source, participant_name, timestamp, event_id)
)
st.session_state.last_offset = max(st.session_state.last_offset, event.offset + 1)
except Exception as e:
st.error(f"Error fetching events: {e}")
Remitir mensajes como humanos o ai
Se definen dos funciones auxiliares para remitir mensajes:
- Uno como cirujano humano (fuente = «humano_agent»)
- Otro como si lo envíe el AI, pero se desencadena manualmente por un humano (fuente = ”humano_agent_on_behalf_of_ai_agent”)
- Mira el Códigos completos aquí.
async def send_human_message(session_id: str, message: str, operator_name: str = "Tier-2 Operator"):
event = await client.sessions.create_event(
session_id=session_id,
kind="message",
source="human_agent",
message=message,
participant={
"id": "operator-001",
"display_name": operator_name
}
)
return event
async def send_message_as_ai(session_id: str, message: str):
event = await client.sessions.create_event(
session_id=session_id,
kind="message",
source="human_agent_on_behalf_of_ai_agent",
message=message
)
return event
Interfaz de transmisión
Finalmente, construimos una interfaz de usufructuario de transmisión simple e interactiva:
- Ingrese una ID de sesión (desde la interfaz de usufructuario parlant)
- Ver Historia del chat
- Remitir mensajes como humanos o ai
- Refrescar para extraer mensajes nuevos
- Mira el Códigos completos aquí.
st.title("💼 Human Handoff Assistant")
session_id = st.text_input("Enter Parlant Session ID:")
if session_id:
st.subheader("Chat History")
if st.button("Refresh Messages"):
asyncio.run(fetch_events(session_id))
for msg, source, participant_name, timestamp, event_id in st.session_state.events:
render_message(msg, source, participant_name, timestamp)
st.subheader("Send a Message")
operator_msg = st.text_input("Type your message:")
if st.button("Send as Human"):
if operator_msg.strip():
asyncio.run(send_human_message(session_id, operator_msg))
st.success("Message sent as human agent ✅")
asyncio.run(fetch_events(session_id))
if st.button("Send as AI"):
if operator_msg.strip():
asyncio.run(send_message_as_ai(session_id, operator_msg))
st.success("Message sent as AI ✅")
asyncio.run(fetch_events(session_id))




Mira el Códigos completos aquí. No dude en ver nuestro Página de Github para tutoriales, códigos y cuadernos. Adicionalmente, siéntete evadido de seguirnos Gorjeo Y no olvides unirte a nuestro Subreddit de 100k+ ml y suscribirse a Nuestro boletín. ¡Esperar! ¿Estás en Telegram? Ahora además puedes unirte a nosotros en Telegram.
