Enrutamiento OAuth de OpenClaw Codex, Voz en Tiempo Real, Actualizaciones de Imágenes del SDK de OpenAI y Estabilización del Servicio de vLLM — Episode 46 cover art
Episode 46·7 de mayo de 2026·42:49

Enrutamiento OAuth de OpenClaw Codex, Voz en Tiempo Real, Actualizaciones de Imágenes del SDK de OpenAI y Estabilización del Servicio de vLLM

OpenClaw Daily examina OpenClaw v2026.5.4 a v2026.5.6, centrándose en el habla en tiempo real de Google Meet y llamadas de voz, la retropresión de audio de Twilio, pistas de migración de plugins, instantáneas de metadatos con alcance de espacio de trabajo, resolución de contratos SecretRef, inspección de autenticación de modelos, diagnóstico de la fase de inicio, borradores de progreso enriquecidos en Slack y salida compacta de progreso de herramientas. El episodio luego desglosa los tiempos de espera de nodos de LangGraph v1.2 alpha, la verificación de puntos de control de DeltaChannel, los manejadores de errores y la API de streaming, antes de cerrar con v. Show notes: https://tobyonfitnesstech.com/es/podcasts/episode-46/

🎧 Listen to Episode

[00:00] OpenClaw v2026.5.4, v2026.5.5 y v2026.5.6 lideran hoy porque cambian las partes de un sistema de agentes que los usuarios realmente sienten: capacidad de respuesta de voz en tiempo real, progreso de canales, metadatos de plugins, contratos SecretRef, visibilidad de auth de modelos, rendimiento de inicio y diagnósticos de recuperación. El lanzamiento es especialmente interesante porque el titular no es solo "la voz funciona". Es que una ruta de marcación telefónica, una sala de Google Meet, un puente de voz Gemini en tiempo real, un websocket de Twilio y los controles de cola y voz de OpenClaw ahora se comportan más como un sistema de tiempo real unificado.

[02:30] HISTORIA 1 — OpenClaw v2026.5.4 a v2026.5.6 Hace que la Voz en Tiempo Real, los Metadatos de Plugins, SecretRefs, el Inicio, el Progreso y los Diagnósticos Sean Más Operables

Empecemos con Google Meet y Llamadas de Voz. Las conexiones de marcación entrante de Twilio ahora transmiten a través del puente de voz Gemini en tiempo real con transmisión de audio controlada, buffering con control de contrapresión, limpieza de cola de interrupción y sin fallback a TwiML durante el habla en tiempo real. Este es un cambio arquitectónico significativo. Un agente de voz no puede sentirse responsivo si la pierna telefónica está enviando audio más rápido que el puente del modelo, si el habla generada se acumula detrás de un websocket, o si la interrupción deja audio antiguo en la cola después de que un participante interrumpe.

La transmisión de audio controlada es el mecanismo central. La voz en tiempo real tiene al menos tres relojes: el habla del usuario, el audio generado por el proveedor y la capacidad del transporte para enviar tramas. Si el audio generado supera al websocket, el sistema necesita buffering, pero el buffering sin límites crea el modo de falla incorrecto. El usuario interrumpe, el modelo cambia de dirección y el audio antiguo todavía está en cola. v2026.5.4 limita la cola de audio Twilio controlada y cierra transmisiones en tiempo real sobrecargadas antes de que el audio del proveedor pueda acumularse detrás de la protección de contrapresión del websocket. Ese es el compromiso correcto: fallar visiblemente y recuperarse en lugar de seguir hablando con contenido obsoleto.

La limpieza de cola de interrupción es igual de importante. Un asistente de voz debe dejar de hablar cuando un participante interrumpe. Esto suena simple, pero requiere limpiar el audio generado pendiente, coordinar el turno activo y asegurarse de que el siguiente segmento de habla refleje el nuevo estado conversacional. Si el puente solo pausa la reproducción pero deja el audio en cola intacto, el agente puede reanudar con una respuesta a la pregunta antigua. El lanzamiento convierte la interrupción en un problema de gestión de cola y gestión de estado en lugar de un simple botón de silenciar superficial.

El detalle de sin fallback a TwiML importa porque el fallback puede ocultar problemas arquitectónicos. TwiML es útil para flujos telefónicos convencionales, pero un puente de modelo en tiempo real necesita transmisión de baja latencia y consciencia de contrapresión. Si el habla cae silenciosamente a TwiML durante una sesión en tiempo real, los participantes pueden escuchar audio retrasado o desincronizado mientras el operador cree que el puente en tiempo real está funcionando. v2026.5.4 mantiene el habla en tiempo real en la ruta en tiempo real, lo que hace que los fallos sean más honestos y el rendimiento más fácil de razonar.

La síntesis telefónica también mejora. Las anulaciones de voz del proveedor y del modelo se honran en los proveedores de síntesis telefónica, por lo que los registros de habla del agente de Google Meet coinciden con el backend que realmente produjo el audio. Esto suena como una corrección menor de logging, pero importa para la depuración. Si una ejecución de voz dice que un backend produjo el habla mientras otro backend realmente lo hizo, el análisis de latencia, la comparación de calidad, la atribución de costos y la revisión de incidentes se ven contaminados.

La corrección del Gateway de Windows es otro detalle concreto para operadores. El oyente de loopback por defecto se vincula solo a 127.0.0.1 en Windows para que el comportamiento de doble pila ::1 de libuv no pueda bloquear las solicitudes HTTP localhost. Los errores de localhost son dolorosos porque todo parece local y seguro, sin embargo los clientes discrepan sobre el comportamiento de loopback IPv4 versus IPv6. Vincular estrictamente a loopback IPv4 hace que la ruta de Gateway por defecto sea más predecible para usuarios de Windows y evita una clase de fallos HTTP locales difíciles de depurar.

Las pistas de migración de plugins mejoran el comportamiento de actualización. Cuando plugins.entries o plugins.allow hace referencia a un plugin externo oficial que no está instalado, OpenClaw ahora emite sugerencias de instalación respaldadas por el catálogo. La decisión importante del producto es que la configuración válida de plugins no debe tratarse como basura simplemente porque el paquete falta después de una actualización. El operador debe ver una ruta como instalar la especificación del plugin, no una instrucción engañosa para eliminar la configuración. Así es como los plugins externalizados se vuelven mantenibles en lugar de frágiles.

La resolución de contratos SecretRef obtiene una corrección de alto valor. Los plugins de canales externalizados cuyos artefactos compilados viven bajo dist/ ahora pueden contribuir su sidecar secret-contract-api a la instantánea del runtime. Sin esa búsqueda, un SecretRef de token de Discord respaldado por env podría fallar al resolverse en el inicio del Gateway y dejar el canal marcado como no configurado aunque el cargador de contratos externos genéricos existía. Este es un problema clásico de límites de empaquetado: el contrato existe, pero el runtime busca en la ruta compilada incorrecta. El lanzamiento cierra esa brecha.

La aplicación de secretos también preserva los campos keyRef y tokenRef del perfil de auth al limpiar secretos del proveedor objetivo. Esa es la forma correcta para la gestión de secretos. La limpieza debe eliminar valores de texto plano sin destruir metadatos canónicos que dicen dónde vive la referencia del secreto. Si una herramienta de limpieza elimina los metadatos de referencia, una configuración segura se vuelve inutilizable. Si mantiene el texto plano, no es seguro. Preservar los metadatos de SecretRef mientras se elimina el material secreto es el camino intermedio que los operadores necesitan.

Active Memory obtiene un guardián de canal con ámbito. Las entradas de canal de la tienda de sesiones que contienen dos puntos se omiten al resolver el canal del subagente de recuperación, por lo que los IDs de agente QQ c2c y otros IDs de conversación con ámbito no llegan a la validación del nombre del directorio de plugins incluidos y bloquean la recuperación. El detalle de implementación importa porque muchos ecosistemas de chat codifican el ámbito en los identificadores. Un dos puntos puede ser perfectamente válido en un ID de canal o conversación mientras es inválido como nombre de directorio de plugin. El código del runtime no debe confundir esos espacios de nombres.

El trabajo de rendimiento continúa en torno a las instantáneas de metadatos de plugins con ámbito de workspace. BTW, la compactación, la generación de modelos con ejecución incorporada, la configuración de modelos PDF, los lectores de catálogo de modelos sin ámbito y los lectores de contratos de manifiesto pueden reutilizar la instantánea de metadatos de plugins compatible con el workspace actual en lugar de recurrir a escaneos de metadatos de plugins en frío. El mecanismo no es glamoroso, pero es importante: usar una instantánea verificada de compatibilidad cuando el entorno, la configuración y el workspace coinciden; no reescanear metadatos de plugins en cada ruta de plano de control activa. Eso reduce la latencia y la presión de memoria sin sacrificar la corrección.

La autenticación de modelos obtiene una superficie de inspección más segura a través de openclaw models auth list, con filtrado de proveedores y salida JSON. Los operadores necesitan saber qué perfiles de auth por agente existen sin volcar secretos. Un comando de lista que muestra los metadatos de perfil de auth guardados es una mejor herramienta de depuración que abrir archivos de configuración, activar llamadas de proveedor o imprimir tokens accidentalmente. Esto es parte de un tema más amplio en herramientas de operador: inspeccionar el estado sin exponer valores sensibles.

El trabajo de UI de control y chat mejora la usabilidad práctica. Las migas de pan del dashboard muestran el nombre del agente activo sin saturar las vistas que no son de chat con la clave de sesión. La barra lateral del cron de Nuevo Trabajo puede colapsar para que la lista de trabajos pueda reclamar espacio. El chat obtiene un selector de sesión con el agente primero, filas de compositor y control responsivas en anchos de teléfono, tableta y escritorio, evitación de actualización de avatar duplicado, ocultación consciente del scroll y colapso de mensajes de texto duplicados para reconocimientos de latido de corazón repetidos sin operación. Estos no son características del modelo, pero afectan si las operaciones de agentes de larga duración siguen siendo legibles.

Los borradores de progreso también se vuelven más disciplinados. Slack puede renderizar borradores de progreso rich Block Kit a partir de datos estructurados de líneas de progreso, mantener las líneas de progreso ricas más nuevas cuando Block Kit recorta borradores largos y limitar las líneas de herramientas de borrador de progreso por defecto para evitar reflujo irregular de líneas largas envueltas. OpenClaw también usa resúmenes de herramientas en modo de explicación compacto para /verbose y borradores de progreso por defecto, con salida sin procesar disponible a través de agents.defaults.toolProgressDetail o anulaciones por agente. El punto es que la salida de progreso debe ser informativa, no un muro de logs sin procesar que rompe la superficie del chat.

El fallback de finalización de subagente es más seguro. OpenClaw preserva cada resultado hijo agrupado cuando el fallback de finalización directa evita el turno de anuncio del agente solicitante. En trabajo multi-agente, perder un resultado hijo porque una ruta de fallback omitió el paso normal de anuncio es exactamente el tipo de error sutil de confiabilidad que hace que los usuarios desconfíen de la delegación. El conjunto de resultados debe sobrevivir a la ruta de enrutamiento.

Los diagnósticos obtienen mejor atribución. El inicio del Gateway añade spans de fase, etiquetas de trabajo activo, marcadores de puente de terminal obsoleto y trazado de E/S de sincronización por defecto en modo watch. También difiere los sidecars no preparados hasta después de la señal ready, evita importaciones de barril de plugins de canal en la ruta activa, optimiza la ruta de metadatos de plugins incluidos confiables y evita importar jiti en rutas de inicio de plugins cargables nativos. La lección es simple: si el inicio es lento, el sistema necesita etiquetas de fase y límites de importación, no suposiciones. Si las superficies de plugins compilados pueden cargar de forma nativa, no deben pagar un costo de cargador de transformación de fuente a menos que realmente se necesite la carga de fallback.

El veredicto del lanzamiento es que v2026.5.4 hace que los bordes del runtime sean más explícitos. La voz en tiempo real obtiene colas limitadas y contrapresión honesta. Los plugins obtienen mejores sugerencias de instalación y búsqueda de contratos compilados. Los secretos mantienen referencias sin texto plano. La auth de modelos puede inspeccionarse de forma segura. Las superficies de progreso se vuelven estructuradas y compactas. El inicio obtiene atribución. Estos son los cambios que hacen que una plataforma de agentes sea más fácil de operar después de que la demo termina.

[28:00] HISTORIA 2 — LangGraph v1.2 Alpha Convierte Gráficos de Agentes de Larga Duración en Problemas de Tiempo de Espera, Recuperación, Punto de Control y Transmisión

LangGraph v1.2 alpha es un lanzamiento de runtime de workflow. La parte importante no es que los gráficos puedan llamar a modelos; es que los gráficos de larga duración necesitan límites de ejecución, rutas de recuperación, eficiencia de punto de control y proyección de transmisión. Cuando un workflow de agente tiene múltiples nodos, herramientas lentas, APIs externas, reintentos, interrupciones humanas e historial de mensajes extenso, el runtime necesita más que un bucle y un objeto de estado.

Los tiempos de espera por nodo son el ejemplo más claro. LangGraph añade timeout= en add_node, con una TimeoutPolicy que puede establecer run_timeout, idle_timeout o ambos. Un tiempo de espera de ejecución difícil aborta después de un límite de reloj de pared independientemente del progreso. Un tiempo de espera inactivo se reinicia cuando se produce progreso y aborta cuando un nodo de transmisión deja de producir salida. Esa distinción importa para las herramientas de agentes. Una llamada de modelo, una ejecución de navegador o una transmisión de API externa pueden tomar tiempo legítimamente, pero un bloqueo silencioso no debe mantener el gráfico para siempre.

Los timeouts se aplican solo a nodos asíncronos, y los nodos síncronos con timeout se rechazan en tiempo de compilación. Esta es una buena restricción porque Python no puede interrumpir de forma segura un trabajo síncrono arbitrario de la misma manera en que puede gestionar el progreso asíncrono. El lanzamiento también soporta rendimientos estilo heartbeat: un nodo asíncrono puede generar una actualización vacía para reiniciar el reloj de inactividad sin escribir estado significativo. Eso le da a los desarrolladores una forma de decir, "esta herramienta aún está viva", mientras mantienen el estado del grafo limpio.

Cuando se dispara un timeout, LangGraph lanza NodeTimeoutError, borra cualquier escritura de ese intento y transfiere a la política de reintento. Borrar las escrituras es la parte sutil pero importante. Si un nodo hace timeout a mitad de una operación, las escrituras parciales pueden corromper el estado del grafo. El runtime debería confirmar un resultado coherente o tratar el intento como fallido. Entonces los handlers de reintento y recuperación pueden decidir qué hacer a continuación.

Los handlers de errores a nivel de nodo añaden la ruta de recuperación después de que se agotan los reintentos. Un error_handler recibe un NodeError tipado con el nombre del nodo que falla y la excepción, y puede retornar un Command que actualiza el estado y enruta a otro nodo. Esto es útil para patrones de compensación estilo Saga: si la captura de pago falla después de los reintentos, actualizar el estado a compensado y enrutar a finalizar; si el parsing de documento falla, registrar el error de parseo y enrutar a un sumador alternativo; si una acción de navegador falla, marcar el estado de la página y cambiar a una ruta de auditoría de captura de pantalla.

El diseño del runtime aquí es explícito. Retry gestiona fallas transitorias. Error handler gestiona fallas agotadas. Command gestiona actualización de estado y selección de ruta. Los interrupts evitan el handler, lo cual importa porque una interrupción humana o del sistema no debería disfrazarse como una falla ordinaria de herramienta. Esa separación mantiene la semántica operativa comprensible.

DeltaChannel aborda la sobrecarga de checkpoint. En hilos de larga ejecución, canales como listas de mensajes crecen con el tiempo. Sin un mecanismo de delta, cada checkpoint puede re-serializar el valor completo acumulado. DeltaChannel almacena solo el delta incremental en cada paso y escribe un snapshot completo cada cierto número de pasos configurado a través de snapshot_frequency. Eso cambia el modelo de costos. Las escrituras se vuelven más baratas para canales que crecen, mientras que las lecturas pueden necesitar reconstruir desde deltas hasta el siguiente snapshot. La pregunta de afinación es cada cuánto hacer snapshot para que la latencia de replay permanezca acotada sin volver al bloat del checkpoint de valor completo.

Esto es directamente relevante para sistemas de agentes porque los historiales de mensajes, trazas de herramientas, listas de eventos y observaciones pueden crecer rápidamente. Si cada checkpoint escribe el historial completo, la ejecución duradera se vuelve más cara mientras más corre la conversación. El checkpoint basado en delta hace los hilos largos más prácticos, pero requiere reductores que combinen correctamente lotes de escrituras. Un reductor malo puede perder orden o duplicar mensajes. El episodio debería explicar que DeltaChannel es un contrato de almacenamiento, no solo una marca de rendimiento.

La API de streaming también se mueve hacia bloques de contenido y proyecciones tipadas por canal. Eso importa porque las UIs de agentes modernos no solo transmiten texto. Transmiten llamadas a herramientas, resúmenes de razonamiento intermedio, eventos de progreso, artefactos generados, actualizaciones de estado y mensajes finales. Una API de streaming que puede proyectar contenido tipado por canal le da a los clientes una forma más limpia de renderizar lo correcto en el lugar correcto. También ayuda a evitar mezclar actualizaciones de estado internas con texto de respuesta visible para el usuario.

El shutdown elegante pertenece a la misma discusión. Los runtimes de grafos de larga ejecución necesitan detenerse sin corromper checkpoints o dejar herramientas en estados desconocidos. El shutdown interactúa con timeouts, reintentos, checkpoints y streaming. Si un proceso recibe una señal de shutdown mientras un nodo está a mitad de intento, el runtime tiene que decidir qué se confirma, qué se reintenta después y qué se presenta al usuario. LangGraph v1.2 alpha es interesante porque trata estos como preocupaciones de runtime de primera clase.

La calificación práctica para constructores es alta si ejecutan workflows duraderos, agentes multinodo o streams de grafo orientados a UI. Los timeouts previenen hangs invisibles. Los handlers de error hacen el fallback explícito. DeltaChannel reduce la presión de checkpoint. El streaming tipado mejora el rendering de frontend. El tradeoff es que cada nueva superficie de control necesita política: valores por defecto de timeout, límites de reintento, frecuencia de snapshot, rutas de compensación y reglas de visibilidad de stream.

[39:00] HISTORIA 3 — vLLM v0.20.1 Hace de DeepSeek V4 Serving una Historia de Kernel, Comunicación, Cache y Confiabilidad de Tool-Calls vLLM v0.20.1 es un lanzamiento de parche, pero es exactamente el tipo de lanzamiento de parche que los operadores de inferencia deberían considerar. Se enfoca en estabilización de DeepSeek V4 y mejoras de rendimiento después de que el soporte inicial aterrizó en v0.20.0. Esa distinción importa. Soporte inicial significa que la ruta del modelo existe. Serving de producción significa kernels, rutas de comunicación, comportamiento de cache, salida estructurada, tool calls, grafos CUDA, y verificaciones de memoria son estables bajo carga.

El trabajo en DeepSeek V4 comienza con soporte del modelo base y GEMM de pre-attention multi-stream. GEMM es el trabajo pesado de multiplicación de matrices en inferencia, y la computación de pre-attention puede convertirse en un cuello de botella dependiendo de la forma del batch y la arquitectura del modelo. La ejecución multi-stream intenta superponer o programar partes de ese trabajo de manera más efectiva. vLLM agrega una perilla configurable de GEMM de pre-attention y tunea el valor por defecto de VLLM_MULTI_STREAM_GEMM_TOKEN_THRESHOLD, lo cual les dice a los operadores que la optimización es sensible a la carga de trabajo. Los thresholds importan porque la configuración correcta para batches pequeños puede no ser correcta para grandes cargas de tokens.

El soporte de comunicación all-to-all para BF16 y MXFP8 a través de comunicación unilateral de FlashInfer apunta al problema de MoE distribuido. Los modelos estilo expert necesitan tokens enrutados a través de dispositivos. La comunicación all-to-all es costosa, y los formatos de baja precisión reducen la presión de ancho de banda y memoria, pero introducen preocupaciones de compatibilidad y numéricas. Soportar BF16 y MXFP8 significa que el stack de serving está intentando mantener la ruta de comunicación alineada con la precisión y perfil de rendimiento del modelo.

La optimización de conversión de FP32 a FP4 es otro detalle a nivel de serving. La inferencia de baja precisión puede ahorrar memoria y ancho de banda, pero el overhead de conversión puede borrar parte de la ganancia si es demasiado lenta. Una instrucción PTX cvt para conversión más rápida de FP32 a FP4 mueve ese costo más cerca de la ruta de hardware. Este es el tipo de trabajo de kernel que los usuarios no ven directamente, pero cambia el throughput y la latencia a escala.

Los kernels de tiles integrados para computación optimizada de heads continúan el mismo patrón. La atención y la computación de heads no son matemática abstracta en producción; se convierten en tamaños de tile, layouts de memoria, ocupación de hardware y costos de sincronización. Una nota de release sobre head_compute_mix_kernel les dice a los operadores que el soporte del modelo se está afinando debajo de la capa de API de Python. Ahí es donde realmente provienen muchos de los gains de serving de modelos grandes.

Los fixes de bugs son igual de importantes que el trabajo de rendimiento. vLLM corrige un deadlock cooperativo persistente de TopK en TopK 1024 y una carrera de inicialización inter-CTA en RadixRowState, con deshabilitación temporal de TopK persistente como workaround. Los deadlocks y las carreras inter-bloques son peligrosos porque pueden aparecer solo en ciertos tamaños de batch, rutas de modelo o programaciones de GPU. Un servidor de inferencia puede verse saludable en pruebas pequeñas y luego colgarse bajo una forma particular de producción. La respuesta segura del operador es tratar estos fixes como prerrequisitos de estabilidad, no como polish de rendimiento opcional.

La carga de cache de compilación AOT, errores de torch inductor e inicialización repetida de RoPE cache también reciben correcciones. Estos son puntos de fricción de deployment. Los caches de compilación ahead-of-time están diseñados para reducir el costo de startup o warmup, pero un error de importación al cargar cache puede bloquear el serving completamente. Los errores del compilador de torch pueden aparecer solo bajo rutas específicas de grafo o kernel. La inicialización repetida de RoPE cache desperdicia trabajo y puede crear picos de latencia. La inferencia estable es una cadena de estas pequeñas piezas trabajando juntas.

El comportamiento de tool-call recibe una reparación notable: conversión de tipo faltante para tool calls no-streaming en DeepSeek V3.2 y V4. Eso importa para sistemas de agentes. Un modelo puede ser rápido y aún así ser inutilizable para agentes si las salidas estructuradas o tool calls se rompen en un modo de respuesta. Las rutas streaming y no-streaming a menudo tienen diferentes parsers y puntos de conversión. Los operadores necesitan que ambas funcionen si soportan evaluación batch, llamadas API síncronas y chat streaming.

Los fixes generales de vLLM refuerzan el mismo tema de producción. max_num_batched_token es capturado en estado de grafo CUDA. num_gpu_blocks_override se tiene en cuenta en verificaciones de max-model-length. Los segmentos expandibles se deshabilitan automáticamente alrededor del pool de memoria cumem. Los kwargs del parser de razonamiento se pasan a salida estructurada. Las rutas ROCm para Quark W4A8 GPT-OSS reciben fixes de argumentos. Estos no son features de titular, pero previenen desajustes entre configuración, captura de grafo, asignación de memoria, comportamiento de parser y backend de hardware.

La lección más amplia es que serving de un nuevo modelo frontier o de peso abierto no es una feature. Es un stack: config del modelo, comportamiento del tokenizer, backend de atención, enrutamiento MoE, precisión de comunicación, cuantización, cache de compilación, captura de grafo CUDA, política de pool de memoria, parser de salida estructurada, convertidor de tool-call, y backend específico de hardware. vLLM v0.20.1 es valioso porque muestra ese trabajo de estabilización abiertamente. Los constructores deberían leer estos releases de parches como un mapa de dónde sus propios deployments de inferencia pueden fallar.

[49:00] Cierre La lección práctica es que la infraestructura de agentes ahora es mayormente sobre contratos de runtime. OpenClaw v2026.5.4 a través de v2026.5.6 aprieta colas de voz realtime, metadatos de plugin y secreto, atribución de startup, visualización de progreso y diagnóstico. LangGraph v1.2 alpha les da a los constructores de grafos contratos más claros de timeout, recuperación, checkpoint y streaming. vLLM v0.20.1 muestra cuánto trabajo de kernel, comunicación, cache y tool-call se sienta entre el soporte de modelo y el serving confiable. La pregunta del operador para cada historia es la misma: dónde puede colgarse el trabajo, dónde puede corromperse el estado, dónde pueden desaparecer secretos o credenciales, y qué muestra el sistema cuando algo se ralentiza o falla?

🎙 Never miss an episode — subscribe now

🎙 Subscribe to AgentStack Daily