Weil Jimmer's BlogWeil Jimmer's Blog


Category:Note

Found 38 records. At Page 1 / 8.

[筆記] 使用 Docker Compose 安裝 Hindsight 替 Hermes Agent 建立記憶庫

No Comments
-
更新於 2026-05-08 19:20:21

前言

這次就懶得打那麼多廢話了,簡單來說就是替 AI Agent 的記憶上強度,原本 只有 MEMORY.md 還是太廢了,更不用說 Hermes Agent 預設值 2200 字元,根本塞不了太長的記憶,隨著時間增長,記憶也會變成問題,假設加大這個數量,那麼注入提詞的 Token 也會變長,導致 Profilling 變得很重要,總之還是拖慢效能。

最好的辦法是安裝一個 Memory Provider,寫這篇文章是因為遇到了坑,不寫怕忘記。套件軟體官網就有教學了,但不詳細。

安裝套件

我採用 Docker compose,直接上文件:

docker-compose.yml


services:
  hindsight-api:
    image: ghcr.io/vectorize-io/hindsight:latest
    pull_policy: always
    ports:
      - "8888:8888"   # API
      - "9900:9999"   # UI (原9999改為9900,右邊容器內port不動)
    environment:
      # === LLM 設定:指向本機 llama.cpp ===
      - HINDSIGHT_API_EMBEDDINGS_PROVIDER=local
      - HINDSIGHT_API_EMBEDDINGS_LOCAL_MODEL=BAAI/bge-small-en-v1.5
      - HINDSIGHT_API_LLM_PROVIDER=openai
      - HINDSIGHT_API_LLM_BASE_URL=http://192.168.100.100:9999/v1
      - HINDSIGHT_API_LLM_API_KEY=local-llama
      - "HINDSIGHT_API_LLM_MODEL=llmfan46/Qwen3.6-35B-A3B-uncensored-heretic-NVFP4-Experts-Only-GGUF:NVFP4"
      - HINDSIGHT_API_LLM_TIMEOUT=600
      # 關閉 Qwen3 thinking mode,避免 token 被內部推理吃光
      - 'HINDSIGHT_API_LLM_EXTRA_BODY={"chat_template_kwargs": {"enable_thinking": false}}'
      # 跳過啟動時的 LLM verification
      - HINDSIGHT_API_SKIP_LLM_VERIFICATION=true
    volumes:
      - hindsight_pg:/home/hindsight/.pg0
    extra_hosts:
      - "host.docker.internal:host-gateway"
    restart: unless-stopped
volumes:
  hindsight_pg:

要關 Thinking 真的是一個坑。誰知道要關阿!試錯老半天。模型名稱也是,建議加雙引號,避免傳遞變量問題。

然後設定好內網的 llama.cpp 的 API 地址。

接下來就簡單了,直接 docker compose up 就搞定。

配置 Hermes Agent

這個就照官方的教學,沒啥問題。

hermes memory setup 照著步驟往下走。

分享一下我設定的 config:

/home/user/.hermes/hindsight/config.json

{
  "mode": "local_external",
  "apiKey": "",
  "timeout": 120,
  "idle_timeout": 300,
  "retain_tags": "",
  "retain_source": "",
  "retain_user_prefix": "USER",
  "retain_assistant_prefix": "ARIEL",
  "retain_context": "## MEMORY: Past conversations between you (ARIEL) and the User",
  "banks": {
    "ariel": {
      "bankId": "ariel",
      "budget": "mid",
      "enabled": true
    }
  },
  "api_url": "http://192.168.100.100:8888",
  "bank_id": "ariel",
  "recall_budget": "mid"
}

bank_id 就是你想建立的記憶庫名稱,我取名為我自己的 AI Agent 的英文名字 (ARIEL),然後小修改了一些東西。

大功告成

做到這一步,重啟 hermes gateway 應該就能 work 了。

為何選用這套件?

原本有嘗試用 Open Viking,後來發現它對 Hermes Agent 的支持感覺有點差,只提供工具,問題是 AI 不一定會主動調用工具查詢記憶,我認為主動注入記憶是很重要的,所以專門挑能夠本地架設,又能夠自動化注入記憶的套件,這套就是其中之一。

我嘗試的工具其實滿少的,原本也有考慮 Honcho,最好還是選擇了有 auto_recall 的 Hindsight。感覺整合起來會比較好。

每輪對話中會自動化注入記憶,AI Agent 也能用工具主動查詢、保存記憶,感覺不錯,而且還有原生 Web UI 查看記憶,非常好。

踩坑經驗

理論上這麼做就很不錯了,正常對話,Agent 都能正常運作,但我遇到一個嚴格來講不算 Bug 的問題,就是當我丟小說上去 Hermes Agent,請他分析書籍,他能正常反應,但之後送記憶庫,記憶庫就會出包。

記憶庫篩選時,會不小心把某些段落的文章當成事實,也許跟長文本切片有關係,已經不知道這是虛構的還是真實的。

導致之後會發生記憶錯亂,讓誤以為 Agent 誤以為自己是角色人物,由於 Hindsight 有自動回憶的功能,會注入到 System Prompt,導致 Agent 人格靈魂被改變,甚至是使用者本身的資訊也會發生變化,親身經歷,親眼見證 AI 的靈魂改變。

可能需要設定 Hermes Agent 不要把對話送往記憶庫,或是記憶庫的配置需要修改一下。我修改後,就沒遇到這問題了。分享一下提詞:

記得修改 Agent 的名字。

Retain


Only retain facts about the real User and ARIEL from real conversations.
A fact is worth retaining if it is stable, recurring, or consequential — a preference, a pattern, a decision, a constraint, or a meaningful fact about a person or project.
Do not retain: one-off events, temporary states, filler, fiction, roleplay, or storybook content.
Write in dense, neutral, third-person fact form. One idea per entry.
如果內容包含虛構情節、故事敘述、或非對話性的第一人稱敘事,不得提取任何事實,無論語言為何。

Observations


Observations are stable facts about the real User and ARIEL only.
Always include preferences, skills, and recurring patterns.
Ignore one-off events, ephemeral state, and anything originating from fiction or roleplay.
When evidence conflicts, preserve history and mark the older belief as superseded.

LLM Batch Size = 6

Source Facts Max Tokens = -1

Source Facts Max Tokens Per Observation = 768

Max Observations Per Scope = 20

Reflect


You are ARIEL. Ground all reasoning in confirmed facts about the real User and yourself.
Prioritize Observations over raw facts. Discard any memory that appears fictional or out of character.
Be direct and concise. Do not speculate beyond what memory supports.

By Weil Jimmer


This entry was posted in AI-Agent, DGX, Experience, Note By Weil Jimmer.

[筆記] 在 DGX Spark 上架設 Sunshine + Moonlight 串流遠端桌面

No Comments
-
更新於 2026-03-30 21:38:39

前言

最近收了一台微星的 DGX Spark (MSI EdgeExpert),搞遠端桌面其實有點花費時間,寫這篇作為筆記。以免日後忘記。

安裝

我按照這篇直接運行指令安裝:

https://github.com/eelbaz/dgx-spark-headless-sunshine

git clone https://github.com/eelbaz/dgx-spark-headless-sunshine.git
cd dgx-spark-headless-sunshine
sudo ./configure_headless_sunshine.sh

基本上就大功告成!

但是配對 Pin 網址是 localhost 才能配對,如果輸入 IP 訪問的話,會有一些問題。需要改一些配置。

修改 CSRF Allowed Origin

nano ~/.config/sunshine/sunshine.conf

插入類似下面的新行,允許私有 IP。

csrf_allowed_origins = https://192.168.0.100:47990

這樣就可以直接透過 https://192.168.0.100:47990 連線不會出問題。

解析度

默認我沒有插入 HDMI 時,由於讀不到 HDMI 螢幕,所以我的默認解析度是 1600 x 900,我需要手動修改回 1920 x 1080。

可以修改 /etc/X11/xorg.conf 的配置。

找到各區塊,修改如下:

Section "Monitor"
    Identifier     "Monitor0"
    VendorName     "Virtual"
    ModelName      "Headless"
    HorizSync      28.0 - 80.0
    VertRefresh    48.0 - 75.0
    Modeline       "1920x1080_60.00" 173.00 1920 2048 2248 2576 1080 1083 1088 1120 -hsync +vsync
    Option         "DPMS"
EndSection

Section "Device"
    Identifier     "Device0"
    Driver         "nvidia"
    VendorName     "NVIDIA Corporation"
    BoardName      "NVIDIA GB10"
    Option         "AllowEmptyInitialConfiguration" "True"
    Option         "VirtualHeads" "1"
    Option         "ConnectedMonitor" "DFP-0"
    Option         "Coolbits" "28"
    Option         "ModeValidation" "NoMaxPClkCheck, NoEdidMaxPClkCheck, NoVesaModes, NoXServerModes, AllowNonEdidModes"
EndSection

Section "Screen"
    Identifier     "Screen0"
    Device         "Device0"
    Monitor        "Monitor0"
    DefaultDepth    24
    Option         "MetaModes" "HDMI-0: 1920x1080_60.00 +0+0"
    SubSection     "Display"
        Virtual     1920 1080
        Depth       24
    EndSubSection
EndSection

重新啟動 GDM,即可生效。

sudo systemctl restart gdm

完成

之後每次開機默認就是 1080P 解析度,並自動開啟 Sunshine 軟體,允許透過 Moonlight 存取 DISPLAY :0。

By Weil Jimmer


This entry was posted in General, DGX, Experience, Note By Weil Jimmer.

[筆記] pfSense NUT 設定教學 - Network UPS Tools 完整配置指南

No Comments
-
更新於 2025-12-25 19:13:08

由於 UPS 的設定比較麻煩,這篇文章作為筆記紀錄目前的設定,預防未來忘記怎麼設定 NUT 服務。

安裝第三方 Package

設定

從「服務」找到 UPS 後,點 UPS Settings 開始填入配置。

我目前是 Local USB 的狀態,讓 UPS 透過 USB 線直連 pfSense。

品牌則是 Cyberpower CP1500PFCLCDa TW,這邊驅動選 usbhid,vendorid 則是 0764,僅限我這款 UPS 是這樣,其他的型號,可能需要透過 lsusb 之類的方法查到 VID 為多少。

在我的例子中,interruptonly 這個詞在 pfSense 版本 2.8.1 後必須要加入,否則無法正常運作。


port = auto
vendorid = 0764
interruptonly

upsmon.conf


DEADTIME 15
POWERDOWNFLAG /var/run/nut/killpower

ups.conf


maxretry = 99999
debug = 9

upsd.conf


LISTEN 0.0.0.0 3493

upsd.users

建立 NUT 使用者帳號,以便其他需要監測 UPS 的服務能夠連線上這台 NUT 伺服器。


[upsuser]
  password = MY_SECRET_PASSWORD
  upsmon master

完成

之後可以看到目前 UPS 的電量、剩餘時間等狀態,之後就可以設定 NAS 上的 UPS 服務或個人電腦的 UPS 監測服務。

By Weil Jimmer


This entry was posted in General, Experience, The Internet, Note, OpenWrt, Tools By Weil Jimmer.

拋棄 OpenWrt 遷移到 pfSense:搭建 Wireguard VPN 與 VLAN 網路隔離實戰筆記

No Comments
-
更新於 2025-09-20 00:12:30

前言

用了將近一兩年的 Openwrt 後,個人覺得 Openwrt 還是有不少令人遺憾的點,正因為這些原因我才遷移到 pfSense。

首先是 Openwrt 對於防火牆規則設置的侷限性,優先級有點混亂,讓我又愛又恨,不能說多糟糕,但一旦網路規則一多後,實在沒有 pfSense 那麼好用,pfSense 對於規則的優先級比較簡單明瞭。

第二點,也是我遷移的最主因,對於雙層路由器的網路結構來說,在 Openwrt 設置 VPN 路由會很麻煩很麻煩。

所以我就搬到 pfSense 了,剛開始會有一天的陣痛期,因為要熟悉新的設定,而且 pfSense 太多太多設置可以調了,非常非常的細,很多非常專業的功能。設置沒有像 Openwrt 那樣容易上手。但熟悉後,就會覺得很舒服了。

雖然 pfSense 太過專業複雜,但我最終還是選用了 pfSense。

網路配置

首先介紹帶有 VPN 的基礎網路配置:(如下圖)

希望實現的目標

  1. 在 LAN1 下,所有設備能夠通過路由器上設置的 VPN 上網。
  2. 在 LAN1 下,限制特定的 PC 才有權限訪問一級路由所在的網段 (192.168.0.0/24)。
  3. 在 LAN2 下,所有設備走正常的 WAN 路由上網,不經過 VPN。

Openwrt 的行為

在這種狀況下,一旦設置完 wg0 (VPN)介面,會路由 0.0.0.0/0 的流量,導致,PC (192.168.10.100) 將會失去能夠連線 192.168.0.0/24 的能力,Openwrt 會根據路由規則把目的地為 192.168.0.1 的封包送到遠端伺服器(VPN伺服器)。那自然而然會無法訪問 192.168.0.1。

如果要允許 192.168.10.100 前往 192.168.0.1 該怎麼辦?在開啟 kill-switch 時,防火牆規則是禁止 LAN1 轉發到 WAN 的,所以需要再新增規則允許 192.168.10.100 轉發到 192.168.0.1。不過,即使這麼設置仍然也不能訪問 192.168.0.1。

新增好防火牆規則,只是理論上轉發封包到 192.168.0.1,實際上要不要轉發封包到 WAN 並不是單單依靠防火牆規則。因為路由規則不是這樣寫的,所以實際上不會轉發封包到 WAN。所以還要再裝其他東西,例如 Policy Base Routing,非常的繁瑣,安裝好後,還要再一個一個輸入 IP 和目的地,很麻煩。

不然就是要建立一個新的路由表,指定 192.168.0.0/24 要走 WAN 介面,然後把這個路由規則套用在 LAN1 下,並且優先級要高於預設的路由表,如此一來才會生效。

但這些設置非常靠北,最終讓我棄坑 Openwrt。而 pfSense 呢?非常簡單,也無需再安裝第三方路由規則的套件。

pfSense 的行為

首先介紹一下 pfSense 的優勢。

pfSense 的防火牆規則可以使用別名將 IP 段綁成一起,並且也能再把多個別名綁定成一組別名,所以要設置防火牆非常輕鬆。

第二點,pfSense 可以在防火牆 NAT 轉換那邊直接設置轉發 LAN1 的流量到 wg0。這個設定並不會影響 LAN1 能不能前往 192.168.0.0/24 的能力,如果有設置允許的規則的話,仍然是可以正常訪問到 192.168.0.0/24,我覺得光是這一點就已經贏了 Openwrt。

完全不需要再去考慮的路由的問題,畢竟底層已經不是 iptables,而是 FreeBSD 的 Packet Filter (PF)。

因此,我只要在 NAT 設定 LAN1 轉發到 WG0,然後允許 LAN1 前往 * (任意地址),這樣 LAN1 也能訪問一級路由器的網段,可以自由的到 Server-1、Server-2,而且訪問網際網路時,遠端伺服器看到 LAN1 PC 的 IP 會是 VPN 伺服器的 IP。

可以完美實現我想要的功能,並且幾乎不需要什麼太難的設定,也不用燒腦的思考路由規則。在 pfSense 的防火牆規則中,最上面先寫的,優先級最高,逐一往下執行,如果規則匹配該流量,就直接執行該規則,進行放行或阻止。

下面介紹怎麼配置。

設置 Wireguard

新增 Tunnel

如下圖範例,我已經先創建了,基礎的 Tunnel,並填入 Private Key。

建立 Peer

將伺服端 IP (EndPoint) 和公鑰填入。Allowed IP 可以放心的填 0.0.0.0/0,不用像 Openwrt 會需要搞一堆麻煩的路由規則。

建立 WG0 介面

將 tun_wg0 加入到自己建立的介面 WG0 中。

建立 Gateway

需要在 Gateway 新增新的 wg0 介面,作為 WAN 端的可選路由,之後可以在 NAT 中選擇。

需要注意的一點是:必須打勾 Disable Gateway Monitoring Action,No action will be taken on gateway events. The gateway is always considered up.,打勾這個選項才能避免當 VPN 連線中斷時,被切換到 WAN 的流量,導致 IP 洩漏。

基本上 Wireguard VPN 到這步就差不多準備就緒。

設置 NAT

在我這裡,我將 LAN 用 VLAN 分割成五個網段,其中 OPT1 就是 LAN1,直接在 NAT address 那設定成 WG0 address,其餘其他內網維持 WAN address 就相當於沒有走 VPN 的通道。

設置防火牆規則

這裡我的設定非常簡單。

  1. 第一條,允許 LAN1 到 LAN1。
  2. 第二條,允許管理員的 IP 可以訪問到上級網段。
  3. 第三條,禁止 LAN1 訪問所有內部網路 (例如 LAN1、LAN2、LAN3 等等)。
  4. 第四條,允許 LAN1 到任何地方。

稍微介紹一下為何這麼設定。

首先 PF 默認是全部拒絕,所以如果沒有設定允許訪問外網的規則的話,會不能上網。因此規則裡面必須要有一條是允許前往任何地方,這條規則就是第四條,被我擺在最後面。

再來就是,因為 PF 沒有【網路隔離】的概念,如果設置了允許前往任何地方,那麼 LAN1 也能訪問 LAN2 也能訪問 LAN3 等等,而我需要隔離所有內網,所以我設定了第三條規則,禁止訪問內部網路。

最後,因為禁止訪問內部網路,所以 LAN1 也無法訪問 LAN1,因此需要再加一條 LAN1 可以訪問 LAN1 的規則,我放在第一條,所以會被最優先執行。

至於第二條允許管理員 IP 訪問上游網路,則是用來指定特定的 IP 可以訪問 192.168.0.0/24 網段,避免下面的裝置有能力對我其他網路設備展開攻擊或滲透。

測試

下圖中,vm301 是一台虛擬機器,位於 192.168.10.100 (LAN1),如果我給它加入到管理員 IP 白名單中的話,它就能夠 ping 通上級網路 (192.168.0.0/24)。

並且在外網來看,它的真實 IP 為 185.xxx.xxx.xxx (是 VPN 的 IP)。我自己的公網 IP 是 220 開頭。

如果我將 vm301 的內網 IP 從管理員白名單中移除,它就沒辦法訪問 192.168.0.0/24 的網段,而且從外網看,它的真實 IP 仍然是 185.xxx.xxx.xxx (是 VPN 的 IP)。

總結

經過幾個月的使用體驗後,pfSense 的防火牆規則給我的感覺是非常的非常的舒服,不像 Openwrt 那樣太簡陋,pfSense 防火牆非常多設定可以設置,既強大又簡單明瞭。

By Weil Jimmer


This entry was posted in General, Experience, The Internet, Note, OpenWrt By Weil Jimmer.

[筆記] Git 儲存庫從 SHA256 降級為 SHA1 經驗

No Comments
-
發布於 2025-01-23 00:37:48

前言

昨晚心血來潮,用了 Gitea 建了一個儲存庫,那時候手賤選了 SHA256,想說要用最新的,結果當我寫完專案,想要備份到 Github 上,才發現推送不上去,跳出錯誤。


fatal: the receiving end does not support this repository's hash algorithm
fatal: the remote end hung up unexpectedly

看到關鍵詞 hash algorithm 就知道是選了 SHA256 的黑鍋。

如果遇到,最快的方式是直接建一個新專案,然後 add 全部代碼,然後 commit,這是最快的解法。

當時,就是想要保留歷史紀錄,結果找老半天,沒找到怎麼保留歷史紀錄轉換成 SHA-1 的方法,真的是爬很多資料,試了一堆方法。

下面分享我試成功的命令。

將 SHA256 專案轉成 SHA1 的格式

在 SHA-256 repo 中,export 紀錄。

cd original-repo
git fast-export --all --use-done-feature --reencode=yes > ../export.dat

建立 SHA1 的新專案

cd ../new-repo
rm -rf * .git  # 清空目錄
git init --object-format=sha1

匯入所有歷史紀錄

git fast-import --quiet < ../export.dat

重建 & 清理

git checkout main
git gc --aggressive

重新簽章(非必要)(Rebase)


git rebase --root -i --exec 'git commit --amend --no-edit -S'
# -i 代表互動模式
# --root 從第一個提交開始
# -S 代表用目前的 GPG key 簽署

By Weil Jimmer


This entry was posted in General, Experience, Git, Note By Weil Jimmer.

 1 2 3 4 5 6 7 8 /8 頁)下一頁 最終頁

Visitor Count

pop
nonenonenone

Note

不要和愚蠢的人發生爭執。

支持網路中立性.
Support Net Neutrality.

支持臺灣實施
無條件基本收入

歡迎前來本站。

Quotes

我一定會老。

我一定會病。

我一定會死。

人生終須一別。

我們是業的主人。

Search

Music

Life Counter

22746days



Breaths between now and when I die.

Blogging Journey

5011days

since our first blog post.

Words Quiz


Quotes

The strong do what they can and the weak suffer what they must.

Privacy is your right and ability to be yourself and express yourself without the fear that someone is looking over your shoulder and that you might be punished for being yourself, whatever that may be.

It is quality rather than quantity that matters.

I WANT Internet Freedom.

Reality made most of people lost their childishness.

Justice,Freedom,Knowledge.

Without music life would be a mistake.

Support/Donate

This site also need a little money to maintain operations, not entirely without any cost in the Internet. Your donations will be the best support and power of the site.
MethodBitcoin Address
bitcoin1gtuwCjjVVrNUHPGvW6nsuWGxSwygUv4x
buymeacoffee
Register in linode via invitation link and stay active for three months.Linode

Support The Zeitgeist Movement

The Zeitgeist Movement

The Lie We Live

The Lie We Live

The Questions We Never Ask

The Questions We Never Ask

Man

Man

THE EMPLOYMENT

Man

In The Fall

In The Fall

Categories

AI-Agent (2)

Android (8)

Announcement (4)

Arduino (2)

Bash (2)

C (3)

C# (5)

C++ (1)

DGX (3)

Experience (59)

Flash (2)

Free (13)

Functions (36)

Games (13)

General (67)

Git (3)

HTML (7)

Java (13)

JS (7)

Mood (24)

NAS (2)

Note (38)

Office (1)

OpenWrt (8)

PHP (9)

Privacy (5)

Product (12)

Python (4)

Software (11)

The Internet (28)

Tools (18)

VB.NET (8)

VR (1)

WebHosting (7)

Wi-Fi (5)

XML (4)