Skip to content

CH 15 · Tareas programadas y ejecución en background

Word count~3,530 wordsTime~20 minPrereqCH 05, CH 08, CH 14LevelReproducible

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:

NivelQué esEscenario 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):

yaml
# schedule.overlay.yml
- insert:
    - id: time-context
      name: '@deepseek-ai/dsh-time-context'
    - id: schedule
      name: '@deepseek-ai/dsh-schedule'
- id: ui-schedule
  disabled: false

Luego apunta a este archivo en el arranque:

bash
dsh web --patch C:\your-path\schedule.overlay.yml

Hace 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:

HerramientaQué hace
schedule_createCrear un recordatorio
schedule_listListar todos los recordatorios pendientes
schedule_deleteCancelar por id

Tres tipos de reglas para crear un recordatorio:

ReglaDescripción
afterRecordar una vez después de cuántos segundos (one-shot)
atRecordar una vez en un momento concreto (one-shot)
everyRepetició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

PuedeNo puede
Recordatorio con mensaje de seguimiento dentro de la sesiónSin 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:

bash
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"

Terminal con la introducción de este comando headless

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:

Tras correr headless, reporte de finalización del modelo en la terminal

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:

powershell
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
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:

powershell
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ámetroSignificado
/SC DAILYCorrer cada día
/ST 09:00A las 9 de la mañana
/TNNombre de la tarea
/TREl comando real a ejecutar (este llama al script del paso 2)

Tras crearla, puedes verificarla una vez sin esperar a mañana:

powershell
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, haz POST con el contenido del archivo a ServerChan (Fangtang) y servicios similares, y luego push a WeChat. Por ejemplo:
powershell
$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:

text
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.

Cuadro de entrada de la Web UI con este prompt, permiso seleccionado como Full access, modelo es DeepSeek-V4-Flash-Vision-Exp

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

Reporte de dsh: run-daily-hot.ps1 existe y el contenido es correcto, la tarea programada DSH Daily AI Hot se ha creado y verificado (schtasks /Query: Status Ready), con las estadísticas de ejecución de la ronda completa abajo

Errores comunes

TrampaCómo evitarla
La tarea programada corre en el directorio equivocadoEl 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 comillasEnvuelve 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 TLSProblema de canal schannel, el modelo cambiará a OpenSSL como fallback, normalmente no afecta al resultado
La tarea programada consume cuota de APINo 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.yml para 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 .ps1 y luego usar schtasks para 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

Open Source · MIT · Community Driven