Skip to main content
agent 是你在 BRICKS Buttress 伺服器設定中宣告的 LLM 迴圈。它在伺服器行程內執行,以本地函式、MCP 伺服器以及選用的裝置工具作為工具,並把對話歷史保存在磁碟上的 session 檔案中。 主要的使用者是自動化流程:本地函式或 daemon 呼叫 context.agents.run(...),為伺服器端的工作流程加入多步推理。另有互動式 CLI 可驅動並檢視同一批 agent。
Agents 屬於實驗性功能。[[agents]] 與 [agents_options] 設定鍵、/agents 端點、SSE 事件結構以及 context.agents API 都可能在版本之間變動,且不保證有淘汰緩衝期。伺服器啟動時會顯示這項提醒。若你要以此為基礎開發,請鎖定 bricks-buttress 版本,並在升級後重新閱讀本頁。

定義 agent

在設定至少宣告一個 [[agents]] 區段之前,agents 都是關閉的:
上表未列出的鍵都會直接傳遞給生成,因此 temperature、top_p 等設定可照寫。 agent 定義會在啟動時驗證,而不是等到第一次執行:未知的 buttress/ 模型、找不到的提示檔案、格式錯誤的工具名稱或重複的 agent 名稱,都會讓伺服器直接報錯停止,而不是默默略過該 agent。

全域選項

[agents_options] 會套用到每個 agent:

模型

model 的格式是 provider/model-id,以第一個斜線切分,因此 model id 本身可以含有斜線。 buttress/<repo_id> 指向這台伺服器已經載入的模型。該 id 必須對應到某個已設定的 ggml-llm 或 mlx-llm [[generators]] 項目的 repo_id,伺服器會在啟動時檢查。流量透過行程內的 loopback 抵達 generator — 不經過 socket,也不需要額外設定。你不需要啟用 [openai_compat];該鍵仍然只管外部的 HTTP 路由。
其他前綴則代表雲端供應商 — anthropic/…、openai/…、google/… — 並以該供應商慣用的環境變數(ANTHROPIC_API_KEY、OPENAI_API_KEY 等)進行驗證。請在 [env] 或行程環境中設定。
不支援以 OAuth 登入供應商。使用雲端供應商時,環境中必須有 API key。

工具

tools 必須逐一列出本地函式名稱。每次工具呼叫都會走一般的函式執行器,因此工具會取得與透過 HTTP 或 MCP 呼叫時相同的延遲重新載入、暫存目錄、行程追蹤與 meta.timeout 期限 — 而模型看到的參數結構就是該函式的 meta.parameters JSON Schema。 中止一次執行時,會一併中止進行中的工具呼叫,以及這些呼叫所產生的行程。 若列出的函式並不存在,該次執行會直接失敗,而不是讓無人值守的自動化流程繞過缺少的能力自行發揮。

MCP 伺服器

[agents.mcp_servers.<name>] 可在本地函式之外,額外加入某個 MCP 伺服器的工具。每個伺服器只能指定 url(Streamable HTTP)或 command(stdio)其中一項:
MCP 工具會以帶伺服器前綴的名稱公開 — mcp__github__create_issue — 因此不會與本地函式名稱衝突。伺服器會在第一次需要它的執行時延遲連線;若某個伺服器無法連線,該次執行會直接失敗,除非它標記了 optional = true,此時 agent 會在沒有該伺服器工具的情況下繼續執行。 以 exposure 設定伺服器的工具如何提供給模型,並以 tool_exposure 針對個別工具覆寫,鍵值為確切的工具名稱或 * 模式。確切名稱優先於模式;多個模式之間,以第一個符合者為準。
若 agent 未設定 codemode = true 卻使用 codemode 或 deferred,伺服器會在啟動時停止。

區域網路裝置

local_devices = true 會為單一 agent 加入兩個內建工具,用來連線區域網路上的 BRICKS 裝置。它們與本地函式和 MCP 伺服器各自獨立 — 不需要啟用 [functions] — 而且在你明確選擇啟用之前都是關閉的:
請不要把 devices_scan 或 devtools 加進 tools,該欄位只接受本地函式名稱。變更 local_devices 會在伺服器下次啟動時生效。 devices_scan 會執行與 bricks devtools scan 相同的 UDP 與 HTTP 探索,但掃描的是 Buttress 主機所在的網路,而非呼叫端的網路,同時也會找出設定目錄下的本機專案預覽。你可以用 {} 呼叫它,或進一步限縮: devtools 會透過 Chrome DevTools Protocol 操作單一裝置。每次呼叫都需要 action 與 address — 主機名稱或 IP,不含連接埠,IPv6 請加上方括號 — 以及 port(預設為 19851): 請先掃描,再指定結果中的某個裝置:
當裝置需要驗證時,請傳入 passcode 或工作區的 DevTools accessToken;否則連線會使用裝置為 Chrome Inspect 公告的憑證。Buttress 絕不會讀取主機上的 BRICKS CLI 登入資訊,也不會自行簽發 token。 每次呼叫都會自行建立並關閉 CDP 連線,而且每台裝置同時只接受一個 inspector — 因此請依序發出呼叫,並在 agent 作業期間避免其他 DevTools 用戶端連上該裝置。中止執行會關閉所有開啟中的連線;已經開始的掃描會先完成其有限範圍的探索,才回報中止結果。
local_devices = true 會授予網路探索以及裝置控制能力,包含在 agent 能通過驗證的任何可連線裝置上執行任意 JavaScript。它既不是唯讀,也不是網路沙箱。工具的參數與結果 — 包括通行碼、存取 token、主控台輸出與裝置資料 — 都會進入模型的脈絡以及保存下來的 session 記錄。請只為你信任的 agent 與呼叫端啟用這個選項。

Codemode

codemode = true 會為單一 agent 加入 codemode 工具。啟用後,模型會撰寫一段簡短的 JavaScript 程式來呼叫 agent 的其他工具——本地函式、MCP 工具和區域網路裝置工具——而不必逐一呼叫。它可以平行執行呼叫、把一個結果串接到下一個呼叫,或在大型結果進入脈絡前先加以過濾。只有指令碼輸出的內容會回到模型。
指令碼在 QuickJS 沙箱中執行,本身沒有檔案系統、網路或計時器。所有動作都透過 agent 的工具進行,因此指令碼無法觸及 agent 原本就不能呼叫的任何東西。指令碼也可以:
  • 搜尋並呼叫以 exposure = "codemode" 排除在模型工具清單之外的 MCP 工具。請參閱 MCP 伺服器
  • 使用 agent 的供應商憑證執行分類器模型
  • 在同一個 session 中保留少量數值供後續指令碼使用
變更 codemode 會在下次伺服器啟動時生效。
小型本地模型可能寫出品質不佳的指令碼。請只為使用能力較強模型的 agent 啟用 codemode。

執行 agent

從本地函式

這是主要的使用介面。每個已設定的 agent 都可透過 context.agents 取用:
一次執行會沿用呼叫端函式的生命週期與期限:context.signal — 函式的 meta.timeout 到期,或呼叫端斷線 — 會中止該次執行及其工具呼叫。agent 迴圈比一般函式呼叫慢得多,因此請調高 meta.timeout,或把工作移到沒有期限的 daemon。 agent 的進度會映射到函式自己的 SSE 串流上,成為 agent 事件,因此函式的 SSE 呼叫端不需額外接線就能看到 agent 的執行過程。 若伺服器沒有設定任何 [[agents]],上述每個方法都會拋出例外。

透過 HTTP

執行失敗時會回傳 AGENT_RUN_FAILED,並附上 sessionId,因此仍然可以取得逐字記錄。被中止的執行回應 499,其他失敗回應 500。找不到的 agent 與 session 回應 404 NOT_FOUND。 串流回應攜帶的是精簡過的 agent 事件:不含部分完成的助理訊息與完整工具結果,因為那會讓串流負載過於龐大。需要完整記錄時,請改從 sessions 端點取得逐字記錄。

從 CLI

bricks-buttress agent 是一個串流式聊天用戶端,用來連線執行中伺服器上的 agent。只要指向伺服器所使用的同一份設定檔,它就會自行找出連接埠與本機 token:
聊天過程會即時串流文字、思考內容與工具呼叫。在聊天中,/exit 可離開,/new 可開始新的 session,Ctrl+C 會中止目前的執行 — 再按一次 Ctrl+C 則離開。

執行結果

context.agents.run 與 POST /agents/<name>/run 都會回傳: stopReason 為 end_turn(agent 已作答)、max_turns、token_budget、aborted 或 error 其中之一。除 end_turn 外,都應視為未完成的回答。

Sessions

每次執行都屬於某個 session。省略 sessionId 就會開啟新的 session;把它傳回則接續該對話;若同時加上 fork: true,則會分支出一個新的 session 並記下其來源,原本的 session 維持不變。 session 是 sessions_dir 底下的 JSONL 檔案,以 agent 名稱區分範圍,並在執行串流的同時寫入 — 因此被中止或逾時的執行仍會留下可接續的逐字記錄。 同一個 session 上的執行會依序排隊;不同 session 則平行執行。 清理機制會依存留時間(session_max_age)與數量(session_max_count,以每個 agent 計)清除舊的 session。
session 是以 agent 的 name 區分範圍。重新命名 agent 會讓既有的 session 失去歸屬 — 檔案仍留在磁碟上,但更名後的 agent 不會列出或接續它們。

安全性

/agents 的驗證方式與本地函式介面相同,而非比照開放的推論端點:
  • 已繫結的伺服器需要 workspace 存取 token。請參閱工作區繫結。
  • 未繫結的伺服器會完全拒絕遠端呼叫,除非設定 [agents_options] allow_unauthenticated = true。
  • 跨站的瀏覽器請求一律遭到拒絕。
伺服器啟動時會在 sessions_dir 旁寫入一個臨時的執行階段 token 檔案 runtime-token,權限為 0600。同一台主機上的工具 — 例如上述 CLI — 會讀取它並自動完成驗證,無論伺服器是否已繫結。
allow_unauthenticated = true 會讓任何能連到該連接埠的人執行每個 agent,連帶執行你交給它的每個工具。請只在受信任的網路上這麼做。
agent 定義屬於受信任的輸入,與設定檔和函式檔案一樣。agent 的安全性取決於你交給它的函式、MCP 伺服器以及裝置存取權:決定何時呼叫它們的是模型,因此請只給 agent 完成工作所需的最小工具清單。 已繫結的伺服器無法為自己簽發 workspace token — 連向 buttress/ 模型的 loopback 改以內部 token 授權,絕不使用 workspace 憑證。

範例

伺服器套件內附 config/function-samples/run-agent.ts,這是一個驅動已設定 agent 並回傳其結論、session id、輪數與停止原因的本地函式。config/sample.toml 中也帶有一段註解掉的 [[agents]] 區塊。其餘範例請參閱本地函式。

後續步驟

本地函式

撰寫 agent 要當作工具使用的函式。

設定

完整的 TOML 參考,包含 agent 執行所依賴的 generator。