Migración a Tool Use - Nova Sonic UDEP
Replaces fragile JSON-in-text data capture with AWS Nova Sonic native tool use for a lead-generation voice bot.
What this file does
Replaces fragile JSON-in-text data capture with AWS Nova Sonic native tool use for a lead-generation voice bot.
When to use it
- Migrating a voice assistant from manual JSON parsing to tool use
- Fixing data loss or malformed fields in a Nova Sonic conversational flow
- Adopting schema-validated tool calls for structured data capture
- Refactoring a processor to separate tool execution from prompt logic
Assumes this stack
Migración a Tool Use - Nova Sonic UDEP
Cambios Implementados (31 Oct 2025)
✅ Problema Resuelto
Anterior: Captura de datos mediante JSON silencioso embebido en texto del asistente
- ❌ DNI y modalidad se perdían frecuentemente
- ❌ Teléfono mal parseado (9537301899 en lugar de 953730189)
- ❌ Nombre contaminado con muletillas ("Eh Llamo André Alata")
- ❌ Email con texto del asistente ("perfectotomtucorreocomoanedre12345@gmail.com")
- ❌ Modelo combinaba confirmación + nueva pregunta
Nuevo: Captura mediante Tool Use nativo de AWS Nova Sonic
- ✅ Nova Sonic llama automáticamente herramienta
guardar_leadcuando tiene datos completos - ✅ Validación de esquema en el lado del modelo (8 dígitos DNI, 9 dígitos teléfono, email válido)
- ✅ Processor limpio que solo maneja tool execution, sin parsing complejo
- ✅ Prompt simplificado y conversacional (sin instrucciones de formato JSON)
Archivos Nuevos
-
processors/tool_use_processor.py- Reemplaza PERulesV1
- Maneja
handle_tool_use()para ejecutar herramienta guardar_lead - Valida y normaliza datos capturados
- Exporta JSON al final de sesión
-
context/prompts/udep_system_prompt_v6_tool_use.txt- Prompt conversacional y natural
- Sin instrucciones de JSON manual
- Enfoque en UX: "conversación natural, no formulario robótico"
- Reglas claras: una pregunta por turno, escuchar activamente
Archivos Modificados
-
nova_sonic_es_sd.py- Añadido
GUARDAR_LEAD_TOOLcon schema JSON completo - Cambiado
START_PROMPT_EVENT→START_PROMPT_EVENT_TEMPLATEpara inyectar tools - Añadidos templates:
TOOL_RESULT_CONTENT_START,TOOL_RESULT_EVENT - Método
_execute_and_send_tool_result()para manejar tool use/result - Eventos
toolUseycontentEnd(type=TOOL)en_process_responses() - Cambio de processor por defecto:
PERulesV1()→ToolUseProcessor()
- Añadido
-
nova_sonic_web_adapter_v3.py- Import cambiado:
PERulesV1→ToolUseProcessor - Añadido
handle_tool_use()en_WebAdapterProcessor - Delegate usa
ToolUseProcessoren_bootstrap()
- Import cambiado:
-
config/context.yaml- Prompt actualizado:
udep_system_prompt_v5_speech.txt→udep_system_prompt_v6_tool_use.txt
- Prompt actualizado:
Archivos Deprecados (movidos a _archive/)
processors/per_rules_v1.py→per_rules_v1.py.OLDcontext/prompts/udep_system_prompt.txtcontext/prompts/udep_system_prompt_v5_speech.txtudep_prompt.txtbackup.txtnova_sonic_gui.py- Sesiones JSON antiguas (excepto última)
Cómo Funciona Ahora
Flujo de Tool Use
1. Usuario habla → Nova Sonic transcribe
2. Nova Sonic hace preguntas naturales (sin leer lista de campos)
3. Cuando tiene los 8 datos requeridos, Nova Sonic LLAMA guardar_lead tool
4. ToolUseProcessor valida datos y retorna success/error
5. Nova Sonic recibe confirmación y continúa conversación
6. Al final de sesión, lead se exporta a JSON
Definición de Herramienta
{
"toolSpec": {
"name": "guardar_lead",
"description": "Guarda los datos del prospecto cuando tienes toda la información...",
"inputSchema": {
"json": {
"type": "object",
"properties": {
"nombre_completo": {"type": "string"},
"dni": {"type": "string", "pattern": "^[0-9]{8}$"},
"telefono": {"type": "string", "pattern": "^[0-9]{9}$"},
"email": {"type": "string", "format": "email"},
"programa_interes": {"type": "string", "enum": ["MBA", ...]},
"modalidad_preferida": {"type": "string", "enum": ["presencial", "hibrida", "online"]},
"horario_preferido": {"type": "string", "enum": ["entre_semana", "fin_de_semana", ...]},
"consentimiento": {"type": "string", "enum": ["si", "no"]}
},
"required": ["nombre_completo", "dni", "telefono", "email", ...]
}
}
}
}
Ejemplo de Conversación Mejorada
Anterior (v5):
Zhenia: Nombre: André Alata. ¿Es correcto?
Usuario: Sí
Zhenia: DNI: 70 49 89 78. ¿Es correcto? Ahora tu teléfono... [❌ Dos preguntas]
Nuevo (v6):
Zhenia: ¿Cuál es tu nombre completo?
Usuario: André Alata
Zhenia: ¿Y tu número de contacto?
Usuario: nueve cinco tres, siete tres cero, uno ocho nueve
Zhenia: ¿Tu correo electrónico?
...
[Cuando tiene todo, tool use automático]
Zhenia: Perfecto, André. Un asesor se comunicará contigo pronto.
Testing
Probar Localmente
cd e:\TRABAJO\NOVASONIC\UDEP
python app.py
Abrir http://localhost:5000 y:
- Iniciar llamada
- Proporcionar los 8 datos naturalmente
- Verificar que JSON exportado tiene todos los campos correctos
- Confirmar que NO hay campos null (excepto casos válidos)
Validar Tool Use
En logs deberías ver:
🔧 Tool use: guardar_lead (ID: abc123...)
✅ Tool result: {"status": "success", ...}
✅ Lead exportado: leads_session_YYYYMMDD-HHMMSS_xxxxx.json
Próximos Pasos
- Probar sesión completa end-to-end
- Validar que DNI y modalidad ya no se pierdan
- Confirmar que teléfono tiene exactamente 9 dígitos
- Verificar que nombre está limpio (sin "Eh", "Llamo", etc.)
- Asegurar que email no tiene prefijos del asistente
Rollback (si es necesario)
Si tool use no funciona, revertir a v5:
# Restaurar processor antiguo
Move-Item processors\per_rules_v1.py.OLD processors\per_rules_v1.py
# Restaurar prompt antiguo en config
# Editar config/context.yaml:
# path: context/prompts/udep_system_prompt_v5_speech.txt
# Restaurar imports en nova_sonic_web_adapter_v3.py
# Cambiar: ToolUseProcessor → PERulesV1
Referencias
- AWS Nova Sonic Tool Use: https://docs.aws.amazon.com/bedrock/latest/userguide/tool-use.html
- Amazon Nova Samples: https://github.com/aws-samples/amazon-nova-samples
- Conversation best practices: Prompt v6 comments
What's inside
Migration changelog, 2 new files, 3 modified files, 5 deprecated files, tool schema, conversation example, testing steps, rollback instructions
Change this for your project
- Replace
e:\TRABAJO\NOVASONIC\UDEPwith your project path - Replace
udep_system_prompt_v6_tool_use.txtwith your own prompt filename - Replace
guardar_leadtool name and schema fields with your own data model - Replace
ToolUseProcessorclass references with your own processor class
Where it goes
A prompt collection. Copy the individual prompts you need rather than the whole file.
Worth borrowing
- Archiving old files to
_archive/with.OLDextension for clean rollback - Including a concrete before/after conversation example to illustrate the improvement
- Providing a one-command rollback script for each changed component
Related Documents
You must use artifacts for
Defines when to use artifacts and provides detailed instructions for creating code, documents, HTML, SVG, Mermaid diagrams, and React components.
starProject
Lists 120+ starred open-source projects across AI, DevOps, Flutter, and web development for discovery and inspiration.
midjourney-expert
Serves as a reference for Midjourney V7/Niji 7 prompting, covering parameters, reference systems, editing tools, and moderation workarounds.
Daily Agent Tasks Framework
Gives you a daily structure for assigning strategic work to Claude and development work to Codex, organized by project priority and current sprint.