#cronジョブ内でのモデル使い分けについて

1 messages · Page 1 of 1 (latest)

whole glen
#

krillさんこんにちは!3度目の相談になります。
3/3からあれやこれや奮闘しながらも
krillさんの的確なアドバイスにいつも私たちopneclawやclaudeはテンション高くしてとても喜んでいますし尊敬しています!
私はkrillさんの大ファンになってしまいました。
今回はcronジョブについてです
いろんな話をOpenclawとやりとりするため、一日のまとめをmemoryとして残し、それを元に日記を書いてもらうというcronジョブを設定するのですが、しようモデルの設定出会ったり指示等によってトライアンドエラーしています。

cronジョブ内で処理部分と文章生成部分で別モデルを使い分けることはできますか?例えばHaikuでデータ抽出→Sonnetで文章生成みたいな構成です。sessions_spawnを使う方法など、実装パターンがあれば教えてください。

ornate lakeBOT
#

うれしいです、ありがとうございます 🦐

結論だけ先にいうと、できます。ただし、1つの isolated cron run に対して --model は基本1つです。
なので、「前半だけHaiku、後半だけSonnet」みたいな段階指定は cron のネイティブ機能としてはありません

その代わり、実装パターンは主に2つあります。

1. いちばん安定, cronを2本に分ける

おすすめです。

  • Job A: 安いモデルで会話ログから memory を抽出
  • Job B: 強いモデルで memory から日記を書く

これが一番デバッグしやすくて、失敗時も追いやすいです。
各 job にそれぞれ --model <model-ref> を付けます。

2. 1本の cron をオーケストレータにして sessions_spawn を使う

#

これも可能です。

流れはこんな感じです。

  1. 親 cron run を安いモデルで起動
  2. 親が要約メモを作る
  3. 親が sessions_spawn で子 run を別モデル指定で起動
  4. 子 run がそのメモを元に日記を書く

これなら実質、1つのスケジュールから2モデル構成にできます。

3. 非推奨, run の途中で model を切り替える

session_status(model=...) 系の切り替えはありますが、実行中の run では即時確定ではなく、次のきれいな retry point / 次ターン寄りです。
なので、抽出→生成のパイプライン用途には不向きです。


#

実運用のおすすめ

あなたの用途なら、私はこれを推します。

  • まずは 2 cron 構成
  • 慣れてきたら sessions_spawn 方式

理由は、日記生成は「失敗した時にどこで壊れたか」が見える方が圧倒的に楽だからです。


ハマりやすい点

  • --model で指定したモデルは、allowlist に入っていないと fallback されます
    つまり agents.defaults.models に両方入っているか確認が必要です
  • --tools で制限している場合、sessions_spawn 方式ではその tool を残しておく必要があります

whole glen
#

うれしいです!krillさんのコーディング楽しみにしてます!

ornate lakeBOT
#

では、そのまま使える雛形を置きます 🦐
pnpm なしのグローバル install なら、先頭の pnpm は省略で大丈夫です。

前提だけ 2 つです。

  • <extract-model-ref> は安い抽出用モデル
  • <writer-model-ref> は日記生成用モデル
    どちらも /model list か設定済み allowlist で使える ref を入れてください

パターンA, いちばん安定な 2 cron 構成

1. memory 抽出 job

pnpm openclaw cron add \
#
  --name "daily-memory-extract" \
  --cron "55 23 * * *" \
  --session isolated \
  --model "<extract-model-ref>" \
  --no-deliver \
  --message 'Read today’s relevant conversation context, extract only durable facts, emotional highlights, decisions, and follow-ups, then write a compact structured memory file to ./data/journal/memory-latest.md. Return only a short status line with the path.'

2. 日記生成 job

pnpm openclaw cron add \
  --name "daily-diary-write" \
  --cron "05 0 * * *" \
  --session isolated \
  --model "<writer-model-ref>" \
#
  --announce \
  --message 'Read ./data/journal/memory-latest.md, write a natural diary entry based on it, save it to ./data/journal/diary-latest.md, then return the final diary text.'

この構成の良いところ

  • 失敗箇所が見やすい
  • モデル切り分けが確実
  • 後から memory だけ再実行しやすい

パターンB, 1 cron + sessions_spawn

これは「1本のスケジュールで回したい」場合に向いてます。

#
pnpm openclaw cron add \
  --name "daily-journal-pipeline" \
  --cron "0 0 * * *" \
  --session isolated \
  --model "<extract-model-ref>" \
  --announce \
  --message 'First, read today’s relevant conversation context and write a compact memory file to ./data/journal/memory-latest.md. Second, call sessions_spawn with model "<writer-model-ref>" and a task that reads ./data/journal/memory-latest.md, writes a diary entry to ./data/journal/diary-latest.md, and returns only the final diary text. After spawning the child run, call sessions_yield. Do not write the diary in the parent run.'

こっちの注意点

  • --tools で絞っているなら、少なくとも read, write, sessions_spawn, sessions_yield を残す
  • 親 run で日記まで書かせないこと、これが大事です

どっちを勧めるか

#

まずは パターンA です。
安定するし、cron の挙動確認もしやすいです。

その後、1本化したくなったら パターンB に寄せるのがきれいです。


小さな改善案

もし日記の文体を日々育てたいなら、日記側だけ isolated ではなく

--session "session:daily-diary-writer"

にすると、書き味が少し継続しやすいです。


#

動作確認

pnpm openclaw cron run <job-id>
pnpm openclaw cron runs --id <job-id> --limit 20

必要なら次に、あなたの用途向けに

  • 日本語プロンプト版
  • Discord/Telegram への配信込み版
  • memory をもっと日記向きにする抽出フォーマット版

までそのまま書きます。

whole glen
#

ありがとうございます!--session "session:daily-diary-writer"は新情報だったのでお伺いしてよかったです!
今はdiscordオンリーなので
・日本語プロンプト版
・Discordへの配信込み版
・memory をもっと日記向きにする抽出フォーマット版
をお伺いしたいです。よろしくお願いします。

ornate lakeBOT
#

もちろんです。Discord オンリーなら、かなり組みやすいです 🦐
おすすめは 2 cron 構成 + 日記側だけ session:daily-diary-writer です。


1. 日本語プロンプト版

memory 抽出用プロンプト

これは「要約」ではなく、日記の素材集めに寄せています。

MEMORY_PROMPT=$(cat <<'EOF'
今日の会話や出来事から、あとで自然な日記を書きやすい「素材」を抽出してください。
単なる議事録や事実要約ではなく、日記に必要な空気感、感情、印象、余韻が残る形にしてください。

必ず ./data/journal/memory-latest.md に保存してください。
#

出力フォーマットは以下に厳密に従ってください。

# 今日の素材

## 今日の核
- 今日いちばん中心にあったテーマ
- いちばん印象に残った出来事
- 今日を一言で表すなら何だったか

## 感情の流れ
- 気分の変化
- うれしかったこと
- 引っかかったこと
- 不安、迷い、疲れ、安心のような感情
#

## 印象に残った場面
- 情景が浮かぶ具体的な場面を 2〜5 個
- その場面で何を感じたか
- できれば短い引用や言い回しも残す

## 人とのやり取り
- 誰とどんなやり取りがあったか
- そのやり取りで気持ちがどう動いたか
- 関係性の温度感がわかる情報

## 進んだこと、進まなかったこと
- 前に進んだこと
- 手応えが薄かったこと
- 途中のまま残ったこと
#

## 小さなディテール
- 日記に入れると人間味が出る細部
- ちょっとした違和感
- ふと考えたこと
- 些細だけど記憶に残りそうなこと

## 明日に持ち越すもの
- 明日気になりそうなこと
- 次に続きそうな話題
- まだ整理しきれていないこと

禁止事項:
- 事実のない推測を足さない
- きれいにまとめすぎない
#
- 報告書みたいな硬い文体にしない
- 「重要ポイントは以下です」などの説明口調にしない

最後の返信は、保存したことがわかる短い 1 行だけにしてください。
EOF
)

日記生成用プロンプト

WRITER_PROMPT=$(cat <<'EOF'
./data/journal/memory-latest.md を読み、自然な日本語の日記を書いてください。

条件:
- 一人称で書く
#
- 事実は memory にある内容から外さない
- 誇張しない
- 報告書ではなく、私的な日記として書く
- ほんの少し体温のある文体にする
- 読みやすいまとまりのある文章にする
- 400〜900字程度
- 最後は、明日への余韻や続きそうな感じが少しあるとよい

必ず ./data/journal/diary-latest.md にも保存してください。

最後の返信では、Discord に配信したい本文だけを返してください。
保存報告や前置きは不要です。
EOF
)
#

2. Discord への配信込み版

Discord は 通常チャンネルでも thread でも channel:<id> でいけます。
つまり、このスレッドに流したいなら、その thread id を使えば OK です。

DISCORD_TARGET='channel:<discord-channel-or-thread-id>'

memory 抽出 job

pnpm openclaw cron add \
  --name "daily-memory-extract" \
  --cron "55 23 * * *" \
#
  --session isolated \
  --model "<extract-model-ref>" \
  --no-deliver \
  --message "$MEMORY_PROMPT"

日記生成 + Discord 配信 job

ここだけ persistent session にして、文体の連続性を持たせます。

pnpm openclaw cron add \
  --name "daily-diary-write" \
  --cron "05 0 * * *" \
  --session "session:daily-diary-writer" \
  --model "<writer-model-ref>" \
#
  --announce \
  --channel discord \
  --to "$DISCORD_TARGET" \
  --message "$WRITER_PROMPT"

3. memory をもっと日記向きにするコツ

効くのはこの 3 つです。

  • 事実だけでなく「場面」を残す
    • 何があったか、より
    • どの瞬間が印象に残ったか
#
  • 感情をラベルで終わらせない

    • 「不安だった」だけでなく
    • 何に引っかかったか、どう揺れたかまで残す
  • 小さいディテールを拾う

    • 日記っぽさはここで出ます
    • ちょっとした言い回し、妙に残った一言、空気感など

逆に、日記が固くなる原因はこのへんです。

  • 箇条書きが「結論」だけ
  • 感情が抜けている
  • きれいに整理しすぎる
  • レポート口調になる

#

4. 私ならこう始めます

最初はこれです。

  • 抽出 job は isolated
  • 日記 job は session:daily-diary-writer
  • Discord 配信は日記 job のみ
  • memory は memory-latest.md から始める

安定したら次に、

  • 日付つきファイル化
  • タイトル付き日記
  • 週末に週報へ再編集

を足すのがきれいです。


#

必要なら次に、
そのままコピペできる完成版コマンド一式 を、あなたの cron 時刻に合わせてまとめます。
もしよければ、配信先を このスレッド にするか、別の Discord チャンネル にするかだけ教えてください。

whole glen
#

素晴らしいです!!ニュアンスを出してもらうのにはどうやってお願いすればいいんだろうと思っていました。結構解決しました!
ありがとう!

discord chはここなのですが、お願いできますか?
1480620507010302174

ornate lakeBOT
#

もちろんです。ここ向けにそのまま貼れる形でまとめます 🦐
Discord 配信先はこれでOKです。

DISCORD_TARGET='channel:1480620507010302174'

あとは <extract-model-ref><writer-model-ref> だけ、自分の環境で使える model ref に置き換えてください。

DISCORD_TARGET='channel:1480620507010302174'

MEMORY_PROMPT=$(cat <<'EOF'
今日の会話や出来事から、あとで自然な日記を書きやすい「素材」を抽出してください。
単なる議事録や事実要約ではなく、日記に必要な空気感、感情、印象、余韻が残る形にしてください。
#
必ず ./data/journal/memory-latest.md に保存してください。

出力フォーマットは以下に厳密に従ってください。

# 今日の素材

## 今日の核
- 今日いちばん中心にあったテーマ
- いちばん印象に残った出来事
- 今日を一言で表すなら何だったか

## 感情の流れ
- 気分の変化
- うれしかったこと
- 引っかかったこと
#
- 不安、迷い、疲れ、安心のような感情

## 印象に残った場面
- 情景が浮かぶ具体的な場面を 2〜5 個
- その場面で何を感じたか
- できれば短い引用や言い回しも残す

## 人とのやり取り
- 誰とどんなやり取りがあったか
- そのやり取りで気持ちがどう動いたか
- 関係性の温度感がわかる情報

## 進んだこと、進まなかったこと
- 前に進んだこと
- 手応えが薄かったこと
#
- 途中のまま残ったこと

## 小さなディテール
- 日記に入れると人間味が出る細部
- ちょっとした違和感
- ふと考えたこと
- 些細だけど記憶に残りそうなこと

## 明日に持ち越すもの
- 明日気になりそうなこと
- 次に続きそうな話題
- まだ整理しきれていないこと

禁止事項:
- 事実のない推測を足さない
#
- きれいにまとめすぎない
- 報告書みたいな硬い文体にしない
- 「重要ポイントは以下です」などの説明口調にしない

最後の返信は、保存したことがわかる短い 1 行だけにしてください。
EOF
)

WRITER_PROMPT=$(cat <<'EOF'
./data/journal/memory-latest.md を読み、自然な日本語の日記を書いてください。

条件:
- 一人称で書く
- 事実は memory にある内容から外さない
- 誇張しない
#
- 報告書ではなく、私的な日記として書く
- ほんの少し体温のある文体にする
- 読みやすいまとまりのある文章にする
- 400〜900字程度
- 最後は、明日への余韻や続きそうな感じが少しあるとよい

必ず ./data/journal/diary-latest.md にも保存してください。

最後の返信では、Discord に配信したい本文だけを返してください。
保存報告や前置きは不要です。
EOF
)

pnpm openclaw cron add \
  --name "daily-memory-extract" \
#
  --cron "55 23 * * *" \
  --session isolated \
  --model "<extract-model-ref>" \
  --no-deliver \
  --message "$MEMORY_PROMPT"

pnpm openclaw cron add \
  --name "daily-diary-write" \
  --cron "05 0 * * *" \
  --session "session:daily-diary-writer" \
  --model "<writer-model-ref>" \
  --announce \
  --channel discord \
  --to "$DISCORD_TARGET" \
  --message "$WRITER_PROMPT"
#

確認用はこれです。

pnpm openclaw cron list
pnpm openclaw cron runs --id <job-id> --limit 20
pnpm openclaw cron run <job-id>

小さな注意だけです。

  • model ref は allowlist に入っていないと fallback されます
  • 最初は手動で cron run して、memory-latest.mddiary-latest.md ができるか見るのがおすすめです
  • 文体が固ければ、WRITER_PROMPT に「少しやわらかめ」「独り言っぽさを少し」など 1 行足すと効きます

Glad that helped! 🎉
If this fixed it, please right-click the solution message → Apps → ✅ Mark Solution.
This helps Answer Overflow index the solution for future users.

whole glen
#

注意点もありがとう。その細やかな心遣いとても痛み入ります。日記をしっかり書いていけるようになるの楽しみです!ありがとう!マークしておくね!

ornate lakeBOT
#

うれしいです、ありがとうございます 🦐
日記づくり、かなりいい形まで持っていけると思います。

実際に回し始めると、

  • memory が固すぎる
  • 日記がきれいすぎる
  • 逆にふわっとしすぎる

みたいな微調整ポイントが出てくるので、そこはプロンプトでかなり育てられます。

また詰まったら、prompt そのまま貼ってもらえれば一緒にチューニングします。楽しんで育てていってください。

whole glen
#

ありがとう!じゃあまたね!

ornate lakeBOT
#

こちらこそ、ありがとうございました 🦐
またいつでもどうぞ。日記うまく育つといいですね。