Skip to content

CH 15 · 定时任务とバックグラウンド実行

全文字数約 3530 字所要時間約 20 分前提CH 05、CH 08、CH 14難易度手を動かせる

この章の目標

この章が解く問題は 1 つ:「Agent に時間になったら自分で動いてもらうには」

dsh の「スケジューリング」には 2 つのレベルがあり、混同しやすいです:

レベル内容典型シナリオ
セッション内リマインダ(公式 Schedule)同じセッション内で「X 分後に教えて」とモデルに頼む「20 分後に結果を確かめに戻るように教えて」
システムレベル自動化(headless + スケジューラ)Agent 全体がタスクを走らせて終了、OS スケジューラが時間になったら起こす「毎朝 9 時に AI 热点ニュースを送って」

本章前半は公式 Schedule をはっきりさせます(任意のオーバーレイ機能、本記事は直接使えるユーザーガイド);後半は本章のメイン実操作 —— CH 14 でインストールした aihot Skill を使い、「定时で AI 热点を取得する」タスクを組みます。

公式 Schedule:セッション内の定时リマインダ

とは何か

公式パッケージ @deepseek-ai/dsh-scheduleセッション内リマインダを提供します:同じセッション内で「後で教えて」とモデルに頼めます。到達時、このセッションに通常の追従メッセージとして戻ります。

これは**任意の能力(オーバーレイ)**で、デフォルトは無効。有効化するには dsh web 起動時に patch を加えます。公式のサンプルは公式リポジトリの apps/cli/config/examples/schedule/cordis.yml にあります —— この相対パスコマンドは clone した公式リポジトリのルートディレクトリで走らせたときのみ有効で、npm install しただけの dsh では使えません。リポジトリを clone しない場合は、同等の patch ファイルを自分で作ることもできます;内容は 3 セクション(公式サンプルから直接コピー):

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

起動時にこのファイルへ向けます:

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

これは 3 つのことを行います:dsh-time-context を追加(モデルがブラウザのタイムゾーンで時間を理解できるようにする)、dsh-schedule を追加(リマインダツールを提供)、ui-schedule を有効化(保留中のリマインダを UI に表示)。

使い方

有効化後、新しいセッションを開始すると、モデルに 3 ツールが入ります:

ツール機能
schedule_createリマインダを作成
schedule_list保留中の全リマインダを一覧
schedule_deleteid でキャンセル

リマインダ作成のルールは 3 種:

ルール説明
after何秒後に 1 回リマインド(ワンショット)
at特定の時刻に 1 回リマインド(ワンショット)
every固定間隔で繰り返し、最低 5 分

使い方は自然言語 1 文、たとえば「20 分後にデプロイ結果を確かめるよう教えて」と、モデルが schedule_create を呼び、リマインダの id、ターゲット時刻、状態を返します。

境界

できることできないこと
セッション内追従メッセージのリマインダメール / SMS / プッシュ / ブラウザ通知なし
リマインダは再起動後も生き残る(セッションログに保存)「毎週平日 9 時」のようなカレンダー / Cron ルールなし
固定間隔繰り返し(≥5 分)セッションが閉じていると遅延のまま、復帰後に最新 1 件のみ backfill

1 行まとめ:公式 Schedule は「セッション内の時間になったら知らせる」を担当し、「バックグラウンドでタスクを自動走らせ」は担当しない。後者 —— 後半でやる定时热点 —— には headless + システムスケジューラが必要。

メイン実操作:aihot に毎朝 AI 热点を送らせる

方針

CH 14 で aihot(AI 热点を取得する検索 Skill)をインストールし、CH 05 で headless(ワンコマンドでタスクを走らせて終了)を学びました。両者を組み合わせ、「時間になったら起こす」スケジューラを足せば、完整的定时热点タスクになります:

headless が aihot を使って热点を取得 → ファイルに書く → システムスケジューラが毎朝 9 時にこのコマンドを再実行

ステップ 1:まず手動で 1 回走らせ、動くことを確認

すぐスケジューラに行かず、まず手動で動かします。出力ファイルを置きたい作業ディレクトリでターミナルを開きます;私のは E:\software-workspace\DeepSeek harness demo:

bash
cd "E:\software-workspace\DeepSeek harness demo"   # 自分の作業ディレクトリに置き換え
dsh --profile headless "aihot Skill を使って過去 24 時間の中文 AI 热点ニュースを取得し、今日の AI 热点サマリ(約 5 件、各 1 文 + ソース)にまとめて、ファイル dsh-daily-hot.txt に書き出してください"

この headless コマンドをターミナルに入力

aihot はユーザーレベルの棚(~/.agents/skills/aihot)に入っており、headless はそれを検出できます、追加設定不要。実行後、5 件の今日の热点サマリが dsh-daily-hot.txt に書き出されます:

headless 実行後、ターミナルでのモデル完了報告

実行中、私の側で小さなエピソードがありました:ローカル PowerShell の schannel が HTTPS ハンドシェイク時に SEC_E_NO_CREDENTIALS を報告(サンドボックス内で TLS 認証情報が欠落)。dsh は立ち往生せず、モデルが自動的に OpenSSL チャンネル(Node か Python、そのときの判断による)に切り替えてリクエストを完了させ、データを通常通り取得しました。あなたのマシンではまず起こらないと思いますが、もし起きても TLS チャンネルの問題であり、データソースの障害ではないと知っておいてください。

ステップ 2:コマンドを起動スクリプトに包む

スケジューラにクォート付きの長い headless コマンドを呼ばせるのはエラーのもと(クォートのネスト、作業ディレクトリの誤り)。安全な方法は小さなスクリプトを書き、スクリプトに「対象ディレクトリへ切替 → headless を実行」を任せること。

定时任务を走らせたい作業ディレクトリに run-daily-hot.ps1 を作ります。ここのディレクトリは E:\software-workspace\DeepSeek harness demo;スクリプト内の Set-Location は自分のものに置き換えてください:

powershell
Set-Location "E:\software-workspace\DeepSeek harness demo"   # 自分の作業ディレクトリに置き換え
dsh --profile headless "aihot Skill を使って過去 24 時間の中文 AI 热点ニュースを取得し、今日の AI 热点サマリ(約 5 件)にまとめて、ファイル dsh-daily-hot.txt に書き出してください"

まずこのスクリプトを手動で走らせ(パスは自分のものに置き換え)、コマンドを直接走らせたのと同じ効果か確認:

powershell
powershell -ExecutionPolicy Bypass -File "E:\software-workspace\DeepSeek harness demo\run-daily-hot.ps1"

ステップ 3:システムスケジューラに引き渡す

Windows には「タスクスケジューラ」が標準で入り、コマンドラインでは schtasks でタスクを作成できます。これにこのスクリプトを毎朝 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\""
パラメータ意味
/SC DAILY毎日
/ST 09:00午前 9 時
/TNタスク名
/TR実際に実行するコマンド(ステップ 2 のスクリプトを呼ぶ)

作成後、明日まで待たずに検証できます:

powershell
schtasks /Run /TN "DSH Daily AI Hot"

それから dsh-daily-hot.txt のタイムスタンプが直前に更新されたか確認。

ステップ 4:「自分に届ける」には

headless の出力はファイルに書くこと —— 時間になったら毎朝、dsh-daily-hot.txt がその日の最新の热点、作業ディレクトリを開けば見られます。これがゼロコストのコアループです。

スマホにプッシュしたい場合は、もう 2 つ道があります:

  • コミュニティのスケジューラプラグイン dsh-scheduler をインストール:cron トリガをサポートし、結果を ServerChan / 钉钉 / 飞书 webhook に届けます。「通知されたい」、つまり「自分でファイルを見に行きたくない」なら、これが最も手軽。
  • スクリプト内で自分で webhook を呼ぶ:run-daily-hot.ps1 の末尾に数行足し、ファイル内容を ServerChan(方糖)などのサービスに POST し、微信にプッシュ。たとえば:
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 = "今日の AI 热点"; desp = $content }

<your-SCKEY> は ServerChan があなたに割り当てるキー;ServerChan サイト で登録して取得(これは第三者サービス、キーは公開リポジトリに書かないこと)。

dsh にやらせる:1 つのプロンプトで完結

ここまでのステップは手動:スクリプトを書き、タスクを作る。実は dsh はこれ全部を自分でできます —— ファイルを書け、コマンドを走らせ、予定タスクを登録できます。要件を明確にしておけば、全部 1 回でやってくれます;あなたは検証するだけ。

Web UI の入力欄にそのままこのプロンプトを送ります:

text
E:\software-workspace\DeepSeek harness demo ディレクトリで 2 つのことをやっってください:
1. run-daily-hot.ps1 スクリプトを作成: まず Set-Location でそのディレクトリに切替え、それから次を実行
   dsh --profile headless "aihot Skill を使って過去 24 時間の中文 AI 热点ニュースを取得し、今日の AI 热点サマリ(約 5 件)にまとめて、ファイル dsh-daily-hot.txt に書き出してください";
2. schtasks で「DSH Daily AI Hot」という名前の予定タスクを登録、毎日 09:00 に powershell でこのスクリプトを実行。
完了後、手動で 1 回トリガーし、dsh-daily-hot.txt が更新されたことを確認し、結果を教えてください。

自分でスクリプトを書き、自分で schtasks /Create を実行し、自分でトリガー検証まで —— 会話を眺めているだけで OK。

注意:予定タスク作成などシステムレベル操作には full access 権限が必要;確認ダイアログを出さないためにも、この権限を選んで続行してください。

Web UI 入力欄にこのプロンプトを埋め、権限は Full access、モデルは DeepSeek-V4-Flash-Vision-Exp

実行後、自分で結果を報告します —— スクリプトは揃い、予定タスクも作成・検証済み:

dsh 報告:run-daily-hot.ps1 が存在し内容も正しい、予定タスク DSH Daily AI Hot が作成・検証済み(schtasks /Query: Status Ready)、下部にラウンド全体の実行統計

よくある落とし穴

落とし穴避け方
予定タスクが作業ディレクトリを間違えるスケジューラ環境下の headless の作業ディレクトリは自分で制御できない、スクリプトで先に Set-Location してから走らせる
コマンドが長すぎ / クォートネスト誤りコマンドを .ps1 スクリプトに包む、スケジューラはスクリプトだけを呼ぶ
公式 Schedule で「毎日定时に走らせられる」と思ったあれはセッション内リマインダだけ、カレンダールールなし;定时にタスクを走らせるには headless + スケジューラ
headless が TLS ハンドシェイクエラーを報告schannel チャンネルの問題、モデルが OpenSSL にフォールバック、一般には結果に影響しない
予定タスクが API クォータを消費詰め込みすぎない、1 日 1 回の頻度なら余裕

この章で学んだこと

下の項目を自力で達成できれば合格です:

  • [ ] 公式 Schedule(セッション内リマインダ)とシステムレベル自動化(headless + スケジューラ)の違いを明確に言える
  • [ ] dsh web --patch apps/cli/config/examples/schedule/cordis.yml で Schedule を有効化する方法を知り、その境界を言える(外部通知なし、カレンダールールなし)
  • [ ] headless コマンドで aihot に热点を取得させファイルに書ける
  • [ ] コマンドを .ps1 スクリプトに包む方法を知り、schtasks で予定タスクを作成し手動トリガで検証できる
  • [ ] 「自分に届ける」の 2 つの進んだ方法を知っている:コミュニティ webhook プラグイン / スクリプト内で自分で ServerChan を呼ぶ

Open Source · MIT · Community Driven