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
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.
🎣 Hooks & Headlines Generator
Generates 20, 30 headline variations across 10 proven formulas, with psychological reasoning and platform-specific best practices.
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.