Verificar por Teléfono
Utilice este skill cuando un agente deba establecer si la información almacenada sobre una organización sigue siendo cierta y una llamada telefónica al número público de la organización es la forma de averiguarlo.
verify-by-phone es un skill de flujo de trabajo de verificación. Realiza exactamente una llamada CALL-E divulgada por registro, extrae la respuesta de la transcripción con un intervalo textual de soporte literal, la concilia con el registro almacenado mediante una aritmética transparente de pesos de coincidencia y devuelve un nivel de confianza calibrado o una abstención explícita. El objetivo de diseño es un agente que nunca convierta una respuesta telefónica incierta en una escritura de base de datos segura.
Cuándo Usarlo
Utilice este skill para:
- verificar una entrada de un directorio de proveedores: si este consultorio es real, está accesible, acepta pacientes nuevos y acepta un plan de seguro específico
- comprobar si un registro comercial almacenado (horarios, servicios, disponibilidad) sigue coincidiendo con la realidad
- actualizar cualquier conjunto de datos donde el teléfono sea la fuente de verdad y el registro se sospeche obsoleto
- flujos de trabajo en los que un resultado "desconocido" deba registrarse honestamente en lugar de adivinarse
- un registro a la vez, con una lista de destinatarios autorizados por humanos
Cuándo No Usarlo
No utilice este skill para:
- realizar llamadas no divulgadas o engañosas; cada llamada anuncia que es un asistente automatizado y el motivo de la llamada al mismo tiempo
- llamar a números inalámbricos o personales; los objetivos de verificación son líneas organizacionales publicadas
- realizar marketing, ventas, generación de clientes potenciales o cualquier difusión promocional
- marcar en lote una lista sin autorización humana por registro
- sobrescribir directamente un registro almacenado a partir del resultado de una llamada; el resultado es un veredicto con evidencia y la decisión de escritura queda en manos del operador
- adivinar una respuesta que el encuestado no dio; si la llamada no arroja una respuesta útil, el resultado es una abstención, y esa es la salida correcta
Reglas de Consentimiento y Divulgación
Estas son fundamentales, no un mero relleno:
- La llamada comienza indicando la identidad de IA y el propósito juntos, antes que cualquier otra cosa, y anuncia que la llamada puede ser grabada.
- Si el encuestado se opone a hablar con un llamante automatizado, la llamada agradece y finaliza de inmediato. El resultado registra la negativa como un resultado no verificable.
- El tiempo de espera está limitado. Si el encuestado pide al llamante que espere, espera brevemente y luego informa en lugar de esperar indefinidamente.
- El agente nunca inventa información que no se le haya proporcionado, ni en la llamada ni en el resultado. Concretamente: una clínica a menudo pedirá al llamante un nombre, una fecha de nacimiento, un número de miembro o tarjeta de seguro, o un motivo de la visita. El agente dice claramente que no tiene esa información, porque se trata de una llamada de verificación de directorio y no de una solicitud de cita, y luego repite la pregunta que hizo para responder. Un marcador de posición es una invención.
- El buzón de voz no es una respuesta. Al llegar al buzón de voz o a un contestador automático, la llamada finaliza de inmediato sin dejar mensaje: no se puede establecer un hecho del directorio a partir de una grabación y nadie debería encontrar un mensaje de robot en su línea.
- Las llamadas son para verificación informativa, nunca promocional. Trate cada llamada como grabada teniendo en cuenta los requisitos de consentimiento de todas las partes.
Flujo de Trabajo de Verificación
- Calibre primero el umbral de abstención, con
scripts/calibrate.pysobre datos de escenarios etiquetados, de modo que "confianza" signifique algo medible: en el nivel predeterminado, la respuesta verdadera cae dentro del conjunto de predicción al menos el 90 por ciento de las veces en datos no vistos. Imprime unqhatque el paso 6 consume. Esto se ejecuta sin credenciales y sin llamadas, por lo que se puede hacer una vez, antes de cualquier marcado. - Recoja el registro a verificar: nombre de la organización, número de teléfono publicado en E.164 y las afirmaciones que verificar (por ejemplo, si acepta pacientes nuevos, si acepta un plan nombrado).
- Confirme que el operador autoriza esta llamada específica a este número específico.
- Construya la tarea de llamada con
scripts/place_verify_call.py. El script por defecto realiza una ejecución de prueba que imprime la tarea exacta y el destinatario sin marcar; pase--livesolo después de que la ejecución de prueba se vea correcta. - Consulte el resultado final con
scripts/poll_result.py, que guarda la carga útil completa en un archivo local. - Extraiga la respuesta con
scripts/extract_answer.py --qhatdel paso 1. Cada campo extraído contiene el intervalo textual literal de la transcripción y los desplazamientos de caracteres que lo respaldan. Las respuestas evasivas ("Creo que sí") mantienen su polaridad con una puntuación de confianza atenuada. Los turnos sin respuesta (número equivocado, negativa, "llame más tarde") nunca cuentan como respuestas. La respuesta se entrega solo cuando el conjunto de predicción calibrado es un solo valor y ese valor no es "desconocido"; de lo contrario, el resultado es una abstención. Omitir--qhathace que todo se abstenga y etiqueta la salida comosin_calibrar, porque un umbral sin calibración no garantiza nada. - Concilie con el registro almacenado usando
scripts/reconcile_record.py: cada campo de acuerdo añade bits documentados de evidencia, cada campo en desacuerdo los resta, y el veredicto es verificado, contradicho o no verificable.
Nota de Mantenimiento
Los scripts en este skill son copias autocontenidas de la implementación de referencia en el backend de Attest (backend/app en el repositorio fuente). Se mantienen pequeños a propósito para que el skill se instale sin dependencias de ese repositorio.
Esa copia se hace cumplir, no se promete. tests/test_skill_parity.py en el repositorio fuente ejecuta el extractor de este skill y el del backend sobre las mismas transcripciones y falla si discrepan en la respuesta, en los desplazamientos de caracteres del intervalo citado o en los propios léxicos de indicio. Una versión anterior de esta nota pedía a un humano que volviera a sincronizar manualmente, y la copia se desvió de todos modos: el backend aprendió a confiar en el último indicio de un turno y a leer "no hay problema" como acuerdo, mientras que este script todavía confiaba en el primero, por lo que un simple "No, no lo estamos" se abstenía aquí y respondía allí.
Inicio Rápido
pip install calle-ai
# 1. Calibre la puerta primero. Imprime el qhat que necesita el paso 5.
python3 scripts/calibrate.py --data references/sample-scenarios.jsonl --alpha 0.1
# 2. Ejecución de prueba: imprime la tarea y el destinatario enmascarado, no marca nada.
python3 scripts/place_verify_call.py \
--org "Centro de Consejería Ejemplo" \
--phone "+15550101234" \
--claim-accepting-new-patients yes \
--claim-plan "Example Health PPO"
# 3. Realice la llamada real (requiere CALLE_API_KEY).
python3 scripts/place_verify_call.py ... --live
# 4. Espere la carga útil final.
python3 scripts/poll_result.py --call-id call_abc123 --out result.json
# 5. Extraiga la respuesta con soporte textual, limitada por el umbral calibrado.
python3 scripts/extract_answer.py --payload result.json --qhat 0.750
# 6. Concilie con el registro almacenado.
python3 scripts/reconcile_record.py --payload result.json \
--claim-accepting-new-patients yes --claim-plan-accepted yes
Todos los números de ejemplo en este skill son números ficticios reservados. La ruta de ejecución de prueba y los datos de escenarios incluidos significan que todo, excepto el paso 3, se ejecuta sin credenciales y sin llamadas reales.
Aspecto de la Salida
extract_answer.py emite un objeto JSON por cada afirmación:
{
"claim": "accepting_new_patients",
"answer": "yes",
"trust_score": 0.9,
"hedged": false,
"span": {"turn": 6, "text": "Sí.", "char_start": 0, "char_end": 3},
"abstain": false,
"gate": "conformal(qhat=0.750)"
}
Una abstención mantiene la misma forma con "abstain": true, ya sea porque el conjunto de predicción calibrado contenía más de una etiqueta o porque el extractor no encontró ninguna respuesta ("answer": "unknown"). El campo gate nombra el umbral que tomó la decisión y aparece como uncalibrated cuando no se proporcionó --qhat, que es el único caso en que toda afirmación se abstiene independientemente de lo que se dijo. reconcile_record.py añade la aritmética de pesos de coincidencia y un veredicto. Ningún campo aparece nunca sin un intervalo de soporte o una abstención explícita.
Efectos Secundarios y Cancelación
- Efecto secundario: exactamente una llamada telefónica saliente por invocación con
--live, al número que el operador proporcionó. No hay repeticiones; no hay programador en este skill. - Coste: una llamada CALL-E facturable por ejecución real. Las ejecuciones de prueba son gratuitas.
- Cancelación: CALL-E no expone la cancelación de llamadas, por lo que el momento de detenerse es antes de
--live. La opción de ejecución de prueba predeterminada existe exactamente por esa razón. - Datos: las cargas útiles se escriben en archivos locales que nombra el operador. Los números de teléfono se enmascaran en la salida de la consola. Nada en este skill transmite resultados a ningún lugar excepto a la propia API de CALL-E.
Referencias
references/api-notes.md: la forma de la carga útil CALL-E observada empíricamente y los comportamientos de la API en los que se basa este skill, incluidos los hechos descubiertos mediante pruebas y no mediante documentación.references/verification-protocol.md: el guion de divulgación completo, la postura legal para las llamadas de verificación salientes y por qué la abstención es la decisión de diseño central.references/sample-scenarios.jsonl: datos de escenarios ficticios etiquetados utilizados porscripts/calibrate.py, para que la calibración se ejecute sin credenciales y sin llamadas.