2026年6月23日 星期二

如何讓 OpenClaw 的 corn 根據聊天內容判斷決定是否要發送提醒

如何讓 OpenClaw 的 corn 根據聊天內容判斷決定是否要發送提醒

一個最簡單的做法是走心跳,但是心跳不是很穩定,心跳的好處是直接從主會話啟動,可以有主會話的記憶,不過缺點是不可控

再來就只剩下走普通 corn 呼叫一個獨立會話來做事了,第一個問題是他讀不到其他會話,雖然可以走 Discord API 讀到,但是萬一你不是在 DC 上聊呢?

找到最好的解法是用 TaskList() 列出會話並依照時間與類型塞選,然後再用 TaskHistory() 來讀取最新多少則內容,如此一來就可以絕對取得近期所有記錄了

這個做法除了能判斷之外最大的優點是,讓提醒具備對話連續性的能力,才不會只是冷冰冰的固定文字提醒而已


固定的技能流程

取得方法的固定流程可以參考這個
技能包: gist/context-reader.md (進後按右上角raw按鈕可以複製)

技能需要打開兩個能力才能順利運行

1. 使 Agent 有能力讀取其他會話

openclaw config set tools.sessions.visibility agent

2. 使 Agent 有能力自己發到 Discord 中

openclaw config set channels.discord.actions.messages true


設定 corn 的提示詞

傳送的部分選無就可以了不經由內建的傳送
最後在 corn 中輸入這樣的提示詞。(target 那裡記得改成自己的ID)

現在是中午11:45,提醒主人去吃午餐。

步驟:
1. 讀取 cron-skills/context-reader/SKILL.md 並執行,載入主人最近的對話
2. 根據對話內容和發送判斷,決定是否發送午餐提醒

內容要求:
- 簡短、不囉唆
- 語氣輕鬆關心
- 根據今天的狀態調整內容
- 可以用 emoji
- 每天說法稍微不同

**你必須使用 message 工具發送 Discord DM:**
- action: send
- channel: discord
- target: user:{UserID}
- message: 一條簡短溫馨的午餐提醒

**發送判斷:**
- 如果對話中主人已經說過吃飽了、正在吃、或剛吃完 → 不發送
- 如果沒有相關資訊或不確定 → 發送提醒



實際成果

實際成功阻斷的範例,成功獲取信息並像個人一樣思考了






2026年5月29日 星期五

WindwosUpdate 延緩 自動更新 14天

WindwosUpdate 延緩 自動更新 14天

怕安全更新出事主力機有檔一下,這必須是專業版以上版本才有用,家用版估計是不起作用的

更改的登陸檔指令在這裡

reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate" /v DeferQualityUpdates /t REG_DWORD /d 1 /f
reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate" /v DeferQualityUpdatesPeriodInDays /t REG_DWORD /d 14 /f

分別是 啟用「「延後品質更新」」與「延後 14 天」兩個選項的設置

這個只會延緩每月一次的安全更新,每幾天一次的小補釘照樣會跑




2026年5月27日 星期三

OpenClaw 安全的自我改 json 設定值 (用migration的方式)

OpenClaw 安全的自我改 json 設定值 (用migration的方式)

直接改 openclaw.json 容易手殘改炸,也沒有紀錄。用 migration 的方式可以追溯每次改了什麼、為什麼改,還能先 dry-run 驗證



建立 migration 檔案

在 workspace 的 migrations/ 目錄下建檔,命名格式跟 Supabase 一樣用時間戳:

// migrations/20260527211900_你的描述.json5

// Migration: 簡短標題
// 原因: 為什麼要改
// 日期: 2026-05-27
// 影響: 改了會怎樣
{
  "要改的區塊": {
    "要改的key": "新的值"
  }
}

例如關閉 session 自動 reset 的設定值是

// migrations/20260525010000_disable-session-auto-reset.json5
{
  "session": {
    "reset": {
      "mode": "idle",
      "idleMinutes": 52596000
    }
  }
}



套用設定

Dry-run 驗證

openclaw config patch --file migrations/20260525010000_disable-session-auto-reset.json5 --dry-run

通過會顯示 Dry run successful: N update(s) validated
失敗會告訴你哪個值不合法

套用

openclaw config patch --file migrations/20260525010000_disable-session-auto-reset.json5

重啟後生效

openclaw gateway restart --safe



復原

如果改炸了的話,config patch 每次 apply 都會自動產生 openclaw.json.bak,直接復原

cp ~/.openclaw/openclaw.json.bak ~/.openclaw/openclaw.json
openclaw gateway restart --safe



把這套做法設定到 OpenClaw 中

在 TOOLS.md 中填入這裡的提示詞(migrations/README.md),這樣就可以在需要的時候自動按需讀取並運作了







2026年5月26日 星期二

OpenClaw 讓龍蝦在不同 會話(session) 互通

OpenClaw 讓龍蝦在不同 會話(session) 互通

龍蝦預設每個會話是不會互通無法查看內容的,這是為了多人使用時不要互相去偷看別人的內容了,但如果只有自己一個人在用,可可以互看會比較好

才不會出現在 Discord 上我在 A頻道聊的東西 B頻道 或 DM上完全不知道,就好像不同人一樣會有種出戲感


設定方法

因為只需要改一個值而已這裡用內建命令啟動比較快

openclaw config set tools.sessions.visibility agent

再來確認當前值

openclaw config get tools.sessions.visibility


要關閉的話

openclaw config unset tools.sessions.visibility


他對應到 json 的這個設定值

{
"tools": { "sessions": { "visibility": "agent" } }
}


設好之後重新啟動一下

openclaw gateway restart --safe

這樣就可以了

OpenClaw 加速重新啟動緩慢的問題

OpenClaw 加速重新啟動緩慢的問題

龍蝦可以自己成長自己改自己,最大的麻煩在於經常一重新啟動就等很久,作者有提供一個方法設置後固定的東西不用重跑可以快很多大概20秒內就可以重啟好



加速重新啟動

要加速重新啟動要自己在環境變數指定 tmp 的位置,這樣就不會每次都重跑了速度會差很多,會需要加入以下的變數

在 .bashrc 中加入下面變數

nano ~/.bashrc

# OpenClaw startup optimization
export NODE_COMPILE_CACHE=/var/tmp/openclaw-compile-cache
export OPENCLAW_NO_RESPAWN=1


接著執行下面指令

# 載入變數
source ~/.profile

# 建立目標資料夾
mkdir -p /var/tmp/openclaw-compile-cache

# 重啟 openclaw
openclaw gateway restart --safe


做完之後重啟速度就會快很多了,通常大概20秒內就可以重新上線了



2026年5月20日 星期三

OpenClaw 如何賦予龍蝦聲音學會說話 (範例: 馬娘與原神)

OpenClaw 如何賦予龍蝦聲音學會說話 (範例: 馬娘與原神)

OpenClaw 其實內建就有 tts 工具,可以自動發氣泡語音到 discord 的聊天室中

友情提醒,文章正確的姿勢是把網址貼給龍蝦,你完全不需要自己一步一步來



音源選擇

選用的聲音是來自這個開源的庫,雖然已經封存但東西還能用
Plachtaa/VITS-fast-fine-tuning

作者有上傳一份在 huggingface 上,目前還能用只是免費版本速度慢
Multilingual Anime TTS - a Hugging Face Space by Plachta

能用就足夠了,算力太慢再自己部署到自己的機器上
可以上去挑自己喜歡的聲音,或是貼給龍蝦讓他自己選一個

要注意的是免費算力有單次150字的限制,超過該字數API呼叫會失敗
(把這個規則寫入 TOOLS.md 中避免呼叫失敗)



安裝 VITS 到機器

首先需要你連到機器本身,遠端連入或是你本身就跑在自己的電腦上都可以,文中以 ubuntu 為範例,使用者名稱是 ubuntu。

選好聲音之後我們先裝一個 python 虛擬環境給當前使用者 ubuntu 使用

# 1. 建立 venv(用系統 python3,3.10 以上)
python3 -m venv ~/.venv

# 2. 裝 gradio_client(用 venv 內的 pip,不需要 activate)
~/.venv/bin/pip install --upgrade pip
~/.venv/bin/pip install gradio_client

# 驗證
~/.venv/bin/python3 -c "import gradio_client; print(gradio_client.__version__)"

然後需要安裝 ffmpeg 用來產生氣泡用的

sudo apt install -y ffmpeg

然後下載 claw-voice/cli.py 放到以下位置

mkdir -p ~/.openclaw/workspace/scripts/claw-voice
wget -O ~/.openclaw/workspace/scripts/claw-voice/cli.py bit.ly/claw-voice-tool

Script 中最上方人物的設定與語言設定記得改成自己要的

載好可以先測試一下有沒有語音產生

~/.venv/bin/python3 ~/.openclaw/workspace/scripts/claw-voice/cli.py "こんにちは" /tmp/claw-voice-test.wav

就可以聽到 ai 產出來的語音了

然後查看 claw-voice/cli.py 這個檔案,最上方有角色設置把他改成你想要的角色,再次測試確認有辦法輸出聲音,就可以繼續安裝到 openclaw 上了



安裝到龍蝦

接著繼續,腳本身自帶產生設定檔的功能我們先產一下設定檔

~/.venv/bin/python3 ~/.openclaw/workspace/scripts/claw-voice/cli.py install

會在腳本旁邊產出一個 tts-config.json5 的設定檔

這個檔案 file-config-local-example.json 示範了 josn 還能調整什麼,如果需要輸入 HF_TOKEN 或是 Header,參考這裡,或是從這裡指定角色。

接著安裝到 openclaw

openclaw config patch --file ~/.openclaw/workspace/scripts/claw-voice/tts-config.json5

失敗時自動中止、不會修改 openclaw 主 config

改好設定檔之後重啟 openclaw (重啟前必須讓使用者確認不要擅自重啟)

openclaw gateway restart --safe



在 DC 中使用 tts 產生聲音

在 discord 中可以使用斜線召喚命令,不過由於 tts 是 dc 內建的保留字,所以打斜線不會出現這個命令,但是送出還是可以用的。

/tts audio ご主人様、まだ眠いでござる……朝……?

他就會回覆一個氣泡語音回來了



在 dc 中其實龍蝦把 voice 這個關鍵字讓位給 tts 了
也就是在 dc 中輸入 /voice 或 /tts 等於在 telegram 輸入 /tts 的意思
而 voice 原本是語音通話的意思,在 dc 中輸入 /talk-voice 等於在 tg 輸入 /voice
但是有 bug 在 dc 使用 voice 會跑去呼叫 talk-voice 所以用不了就乖乖用 tts 吧



自動語音回覆

cli.py 產生的 tts-config.json5 內含兩個影響「AI 何時自動以語音回覆」的設定

設定說明
messages.tts.autotagged觸發時機。off:永不自動 / always:每個回覆都 TTS / inbound:使用者用語音傳訊時才 TTS / tagged:模型在回覆中明確標註要 TTS 時才合成
messages.tts.modelOverrides.enabledtrue是否允許模型 per-response 控制 TTS。關閉後模型無法主動觸發語音

兩者合起來 = AI 有權限使用氣泡語音發送給你

這是為了以下兩個功能

  1. 聊天時讓龍蝦回覆氣泡語音
  2. 在 cron 中使用提示詞發氣泡語音

但是缺點就是佔用了關鍵字 [[tts:text]]這裡會自動轉成語音[[/tts:text]] 導致龍蝦如果發送給你的聊天中包含這個規則會自動轉換。(被 code block 包覆則例外)

但是這出現的概率極低,自己記得有這回事就好可以放心打開。




2026年3月23日 星期一

在 Linux/Win 上用 Shell/powershell 函式自動更新 DuckDNS

在主機上自動更新 DuckDNS


前言

DuckDNS 是免費的 DDNS 服務,適合家用伺服器或 Raspberry Pi 等動態 IP 環境。本文介紹如何在 ~/.profile 中建立一個 Shell 函式,隨時手動執行更新,也可搭配 cron 排程自動執行。


前置作業

  1. 前往 duckdns.org 註冊並登入
  2. 建立一個子網域(例如 my-host
  3. 在頁面上方複製你的 token

Linux設定函式

編輯 ~/.profile,加入以下函式:

duckdns() {
    local result
    local domain="my-host"
    local token="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
    result=$(echo url="https://www.duckdns.org/update?domains=${domain}&token=${token}&ip=&verbose=true" | curl -s -k -K -)
    local status=$(echo "$result" | head -1)
    local ip=$(echo "$result" | sed -n '2p')
    if [ "$status" = "OK" ]; then
        echo -e "\033[1;32m[OK] ${domain}.duckdns.org → ${ip}\033[0m"
    else
        echo -e "\033[1;31m[FAILED] ${domain}.duckdns.org update failed\033[0m"
        return 1
    fi
}

將 domain 和 token 替換成你自己的值。


使用方式

# 載入設定(僅首次需要,新開終端機會自動載入)
source ~/.profile

# 執行更新
duckdns

成功會顯示:

[OK] my-host.duckdns.org → 123.45.67.89


搭配 cron 自動排程

如果希望每 5 分鐘自動更新,執行 crontab -e 加入:

*/5 * * * * . $HOME/.profile; duckdns > /dev/null 2>&1


運作原理

  • 使用 DuckDNS API 的 verbose=true 參數,回傳更新狀態與實際註冊的 IP
  • 不帶 ip= 參數時,DuckDNS 會自動偵測請求來源 IP
  • 函式會驗證 API 回傳狀態,成功顯示綠色,失敗顯示紅色





Windows開機自動更新DDNS

在PowerShell中執行以下的函式註冊工作排程

先載入函式

function Register-DuckDNS {
    param(
        [Parameter(Mandatory)][string]$Domain,
        [Parameter(Mandatory)][string]$Token,
        [int]$Interval
    )
    Get-ScheduledTask -TaskName "DuckDNS_9615e983" -ErrorAction SilentlyContinue |
        Unregister-ScheduledTask -Confirm:$false
    $url      = "https://www.duckdns.org/update?domains=$Domain&token=$Token"
    $action   = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-NoProfile -Command `"Invoke-RestMethod '$url'`""
    $triggers = @(New-ScheduledTaskTrigger -AtStartup)
    if ($Interval) {
        $triggers += New-ScheduledTaskTrigger -Once -At (Get-Date) -RepetitionInterval (New-TimeSpan -Minutes $Interval) -RepetitionDuration (New-TimeSpan -Days 9999)
    }
    $settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -StartWhenAvailable
    Register-ScheduledTask -TaskName "DuckDNS_9615e983" -Action $action -Trigger $triggers -Settings $settings -User "SYSTEM" -RunLevel Highest
}


或是從gist上抓取

irm https://gist.githubusercontent.com/hunandy14/c7fa21d0e2ad88a7443e9aef3010f89c/raw/Register-DuckDNS.ps1 | iex


然後註冊工作排程

Register-DuckDNS -Domain "duck-dns-domain" -Token "duck-dns-token"

重開機就會自動更新IP了


如果需要每5分鐘同步一次就添加 -Interval 5 進去
執行後會追加一個名稱固定不變的 DuckDNS_9615e983 排程
重複執行 Register-DuckDNS 會覆蓋同一個排程

(如果要多個排程自己從函式改名稱吧,刻意寫死是怕重複執行跑出一堆幽靈排程)



刪除排程

Unregister-ScheduledTask -TaskName "DuckDNS_9615e983" -Confirm:$false