CH 15 · Tareas programadas y ejecución en background
Objetivo del capítulo
Este capítulo resuelve un problema: cómo hacer que el Agent "haga cosas por su cuenta cuando llegue la hora".
"Programación" en dsh tiene dos niveles, fáciles de mezclar:
| Nivel | Qué es | Escenario típico |
|---|---|---|
| Recordatorio dentro de la sesión (Schedule oficial) | Hacer que el modelo "recuérdame en X minutos" en la misma sesión | "Recuérdame volver en 20 minutos a revisar los resultados" |
| Automatización a nivel de sistema (headless + scheduler) | El Agent entero corre una tarea y termina, despertado por el scheduler del SO cuando toca | "Mándame un informe de hot topics de IA cada mañana a las 9" |
La primera mitad del capítulo aclara el Schedule oficial (es un overlay opcional; este artículo te da una guía de usuario directamente utilizable); la segunda mitad es el manos a la obra principal del capítulo — usa la skill aihot instalada en CH 14, monta una tarea programada tipo "scrapea hot topics de IA cada día a una hora".
Schedule oficial: recordatorios temporizados dentro de la sesión
Qué es
El paquete oficial @deepseek-ai/dsh-schedule ofrece recordatorios dentro de la sesión: hacer que el modelo "recuérdame luego" en la misma sesión. Cuando toca, vuelve a esta sesión como un mensaje de seguimiento normal.
Es una capacidad opcional (overlay), desactivada por defecto. Para habilitarla, añade un patch al arrancar dsh web. El ejemplo oficial está en el repo oficial en apps/cli/config/examples/schedule/cordis.yml — ese comando con ruta relativa solo funciona cuando se ejecuta en el directorio raíz del repo oficial clonado, y queda inutilizable tras solo npm install de dsh. Sin clonar el repo, también puedes construir a mano un archivo patch equivalente; el contenido son tres secciones (yo copié uno directamente del ejemplo oficial):
# schedule.overlay.yml
- insert:
- id: time-context
name: '@deepseek-ai/dsh-time-context'
- id: schedule
name: '@deepseek-ai/dsh-schedule'
- id: ui-schedule
disabled: falseLuego apunta a este archivo en el arranque:
dsh web --patch C:\your-path\schedule.overlay.ymlHace tres cosas: añadir dsh-time-context (para que el modelo entienda la hora en la zona horaria de tu navegador), añadir dsh-schedule (provee la herramienta de recordatorio) y habilitar ui-schedule (muestra los recordatorios pendientes en la UI).
Cómo se usa
Tras habilitarlo, abre una sesión nueva y el modelo tiene tres herramientas:
| Herramienta | Qué hace |
|---|---|
schedule_create | Crear un recordatorio |
schedule_list | Listar todos los recordatorios pendientes |
schedule_delete | Cancelar por id |
Tres tipos de reglas para crear un recordatorio:
| Regla | Descripción |
|---|---|
after | Recordar una vez después de cuántos segundos (one-shot) |
at | Recordar una vez en un momento concreto (one-shot) |
every | Repetición a intervalo fijo, mínimo 5 minutos |
El uso es una frase en lenguaje natural, p. ej. "recuérdame en 20 minutos revisar los resultados del despliegue", y el modelo llamará a schedule_create y devolverá el id, hora objetivo y estado del recordatorio.
Límites
| Puede | No puede |
|---|---|
| Recordatorio con mensaje de seguimiento dentro de la sesión | Sin email / SMS / push / notificaciones del navegador |
| El recordatorio sobrevive al reinicio (almacenado en el log de sesión) | Sin reglas tipo "cada día laborable a las 9" tipo calendario / Cron |
| Repetición a intervalo fijo (≥5 min) | Si se cierra la sesión queda vencido, solo se rellena el último tras la recuperación |
Resumen en una línea: el Schedule oficial se ocupa de "recordarte a la hora dentro de la sesión", no de "correr tareas automáticamente en background". Para esto último — el hot-topic programado que haremos en la segunda mitad — necesitas headless más un scheduler del sistema.
Manos a la obra principal: deja que aihot te mande hot topics de IA cada mañana
Enfoque
En CH 14 instalamos aihot (una skill de búsqueda que scrapea hot topics de IA), y en CH 05 aprendimos headless (un comando corre una tarea y termina al acabar). Combina los dos y añade un scheduler que "lo despierte a la hora", y tienes una tarea programada completa de hot topics:
headless usa aihot para scrapear hot topics → escribir a un archivo → el scheduler del sistema re-ejecuta este comando cada mañana a las 9
Paso 1: correlo una vez a mano, confirma que funciona
No vayas directo al scheduler; primero hazlo funcionar a mano. Abre una terminal en el workspace donde quieras el archivo de salida; el mío es E:\software-workspace\DeepSeek harness demo:
cd "E:\software-workspace\DeepSeek harness demo" # replace with your workspace
dsh --profile headless "Use the aihot skill to scrape the past 24 hours of Chinese AI hot-topic news, organize it into a brief today's AI hot-topic summary (about 5 items, each one sentence plus source), and write it to the file dsh-daily-hot.txt"
aihot está instalada en el estante a nivel de usuario (~/.agents/skills/aihot) y headless la puede descubrir, sin config extra. Tras la ejecución se escribe un resumen de hot topics de hoy de 5 elementos en dsh-daily-hot.txt:

Al correr, en mi lado hubo un pequeño episodio: el schannel local de PowerShell reportó SEC_E_NO_CREDENTIALS durante el handshake HTTPS (faltan credenciales TLS en el sandbox). dsh no se atascó; el modelo cambió automáticamente al canal OpenSSL para terminar la petición (concretamente Node o Python, según lo que decidiera en ese momento) y los datos se recuperaron con normalidad. Es poco probable que te pase en tu máquina; si pasa, quédate con que es un problema de canal TLS, no de fuente de datos.
Paso 2: envuelve el comando en un script de arranque
Dejar que el scheduler llame a un comando headless largo con comillas es propenso a errores (anidamiento de comillas, directorio de trabajo mal). La forma segura es escribir un pequeño script, y el script se encarga de "cambiar al directorio destino → correr headless".
Crea un run-daily-hot.ps1 en el workspace donde quieras correr la tarea programada. Mi directorio aquí es E:\software-workspace\DeepSeek harness demo; reemplaza el Set-Location del script por el tuyo:
Set-Location "E:\software-workspace\DeepSeek harness demo" # replace with your workspace
dsh --profile headless "Use the aihot skill to scrape the past 24 hours of Chinese AI hot-topic news, organize it into a today's AI hot-topic summary (about 5 items), and write it to the file dsh-daily-hot.txt"Primero corre este script a mano (reemplaza la ruta por la tuya) y confirma que tiene el mismo efecto que correr el comando directamente:
powershell -ExecutionPolicy Bypass -File "E:\software-workspace\DeepSeek harness demo\run-daily-hot.ps1"Paso 3: pásaselo al scheduler del sistema
Windows trae "Task Scheduler", y en línea de comandos se puede usar schtasks para crear tareas. Haz que corra este script cada mañana a las 9:
schtasks /Create /SC DAILY /ST 09:00 /TN "DSH Daily AI Hot" /TR "powershell -ExecutionPolicy Bypass -File \"E:\software-workspace\DeepSeek harness demo\run-daily-hot.ps1\""| Parámetro | Significado |
|---|---|
/SC DAILY | Correr cada día |
/ST 09:00 | A las 9 de la mañana |
/TN | Nombre de la tarea |
/TR | El comando real a ejecutar (este llama al script del paso 2) |
Tras crearla, puedes verificarla una vez sin esperar a mañana:
schtasks /Run /TN "DSH Daily AI Hot"Luego comprueba si el timestamp de dsh-daily-hot.txt se ha actualizado a ahora mismo.
Paso 4: cómo "mandármelo a mí"
La salida de headless es escribir un archivo — cada mañana cuando llegue la hora, dsh-daily-hot.txt es el hot topic del día, solo abre el workspace para verlo. Este es el bucle principal de coste cero.
Si quieres hacérselo push a tu móvil, hay dos caminos más:
- Instala el plugin de scheduling de la comunidad dsh-scheduler: soporta triggers cron y entrega resultados a webhooks de ServerChan / DingTalk / Feishu. Si quieres que te "notifiquen" en vez de "ir tú a mirar el archivo", esta es la opción más fácil.
- Llama tú mismo a webhooks desde el script: añade unas líneas al final de
run-daily-hot.ps1, hazPOSTcon el contenido del archivo a ServerChan (Fangtang) y servicios similares, y luego push a WeChat. Por ejemplo:
$content = Get-Content "E:\software-workspace\DeepSeek harness demo\dsh-daily-hot.txt" -Raw
Invoke-RestMethod -Uri "https://sctapi.ftqq.com/<your-SCKEY>.send" -Method Post -Body @{ title = "Today's AI Hot-Topics"; desp = $content }<your-SCKEY> es la clave que ServerChan te asigna; regístrate en el sitio de ServerChan para conseguir una (es un servicio de terceros, no escribas la clave en un repo público).
Deja que dsh lo haga: un prompt lo resuelve
Los pasos anteriores fueron manuales: escribir scripts, crear tareas. En realidad dsh puede hacer todo esto él solo — sabe escribir archivos, correr comandos y registrar tareas programadas. Solo tienes que tener claros los requisitos y lo hace todo de una; tú solo verificas.
Envía este prompt directamente en el cuadro de entrada de la Web UI:
Help me complete two things in the E:\software-workspace\DeepSeek harness demo directory:
1. Create a run-daily-hot.ps1 script: first use Set-Location to switch to that directory, then run
dsh --profile headless "Use the aihot skill to scrape the past 24 hours of Chinese AI hot-topic news, organize it into a today's AI hot-topic summary (about 5 items), and write it to the file dsh-daily-hot.txt";
2. Use schtasks to register a scheduled task called DSH Daily AI Hot, every day at 09:00 use powershell to run this script.
After completion, manually trigger it once, confirm dsh-daily-hot.txt has been updated, and tell me the result.Él escribirá el script, correrá schtasks /Create y disparará la verificación él mismo — tú solo te sientas en la conversación y lo ves ir paso a paso.
Nota: crear tareas programadas y otras operaciones a nivel de sistema requiere acceso total; se recomienda seleccionar directamente ese permiso y continuar, así no saltará ninguna confirmación.

Tras la ejecución, te reportará sus propios resultados — el script está en su sitio, la tarea programada se ha creado y verificado:

Errores comunes
| Trampa | Cómo evitarla |
|---|---|
| La tarea programada corre en el directorio equivocado | El directorio de trabajo de headless bajo el entorno del scheduler no lo controlas tú, usa el script para hacer Set-Location primero y luego correr |
| Comando demasiado largo / error de anidamiento de comillas | Envuelve el comando en un script .ps1, el scheduler solo llama al script |
| Pensaste que el Schedule oficial puede "correr a diario a la hora" | Solo hace recordatorios dentro de la sesión, sin reglas tipo calendario; para correr tareas a la hora usa headless + scheduler |
| headless reporta error de handshake TLS | Problema de canal schannel, el modelo cambiará a OpenSSL como fallback, normalmente no afecta al resultado |
| La tarea programada consume cuota de API | No la programmes demasiado apretada, una frecuencia de una vez al día no es problema |
Qué aprendiste en este capítulo
Apruebas si puedes completar los siguientes puntos:
- [ ] Enunciar con claridad la diferencia entre el Schedule oficial (recordatorio dentro de la sesión) y la automatización a nivel de sistema (headless + scheduler)
- [ ] Saber cómo usar
dsh web --patch apps/cli/config/examples/schedule/cordis.ymlpara habilitar Schedule y enunciar sus límites (sin notificaciones externas, sin reglas tipo calendario) - [ ] Saber cómo usar un comando headless para que aihot scrapee hot topics y los escriba en un archivo
- [ ] Saber cómo envolver el comando en un script
.ps1y luego usarschtaskspara crear una tarea programada y dispararla a mano para verificarla - [ ] Conocer las dos formas avanzadas de "mandármelo a mí": plugin de webhook de la comunidad / llamar a ServerChan tú mismo desde el script
