上一篇我們認識了 DeepAgent 的基本骨架:一個內建檔案系統、子代理(subagent)機制與任務規劃能力的「開箱即用」深度代理框架。但骨架終究只是骨架,要讓 Agent 真正能在地端環境裡完成有意義的工作,還需要五個關鍵拼圖:
- Tools — 讓 Agent 能對外採取行動的手
- Backends — 決定 Agent 工作空間長什麼樣子、資料存在哪裡的地基
- Skills — 把「怎麼做」封裝成可重複使用的知識包
- Memory — 讓 Agent 能跨對話記得事情的長期記憶
- Summarization Middleware — 避免 context window 爆掉的壓縮機制
本篇先整理前兩塊 — Tools 與 Backends,全部搭配 Ollama 地端模型 ornith-1.5:9b 示範,讓大家看到即使不依賴雲端 API,也能組出 Agent 的行動力與工作空間。剩下的 Skills、Memory、Summarization 留到下一篇再分享。
Tools:賦予 Agent 操作能力DeepAgent 的工具系統分成三層:自訂工具、內建 harness 工具、MCP 工具。三者可以同時存在,透過 create_deep_agent 的 tools= 參數統一掛載。
任何 Python callable — 不論是純函式、@tool 裝飾過的 LangChain 工具,還是 tool dict,都可以直接丟進 tools=。DeepAgent 會從函式簽名與 docstring 自動推斷 schema,多數情況下不需要額外定義。
from typing import Literal
from deepagents import create_deep_agent
def internet_search(
query: str,
max_results: int = 5,
topic: Literal["general", "news", "finance"] = "general",
):
"""執行網路搜尋"""
# 這裡串接你自己的搜尋 API(Tavily、SearXNG 皆可)
...
agent = create_deep_agent(
model="ollama:ornith-1.5:9b",
tools=[internet_search],
)
每個 DeepAgent 出廠就自帶一組檔案操作與委派任務的工具,這些工具不需要另外註冊:
| 工具 | 說明 |
|---|---|
ls |
列出目錄檔案 |
read_file |
讀取檔案內容(支援分頁與多模態) |
write_file |
建立或覆寫檔案 |
edit_file |
對檔案做精確字串替換 |
delete |
刪除檔案或遞迴刪除目錄(需 deepagents>=0.7) |
glob |
依 glob pattern 尋找檔案 |
grep |
搜尋檔案內容 |
execute |
執行 shell 指令(僅限 sandbox backend) |
task |
派任務給子代理 |
若想再加上任務規劃能力,可以選用 TodoListMiddleware 讓 Agent 具備 write_todos 工具。
DeepAgent 對 Model Context Protocol(MCP)有原生支援,這代表你可以把 Agent 接到資料庫、瀏覽器、內部系統等任意 MCP Server,而不用為每個服務手刻整合程式碼。
先安裝擴充套件:
pip install "langchain[mcp]"
接著透過 MCPAdapter 把 MCP Server 暴露的工具全部載入:
import asyncio
from deepagents import create_deep_agent
from langchain.mcp import MCPAdapter
async def main():
config = {"mcpServers": {"my_server": {"url": "http://localhost:8000/mcp"}}}
async with MCPAdapter(config) as adapter:
tools = await adapter.list_tools()
agent = create_deep_agent(
model="ollama:ornith-1.5:9b",
tools=tools,
)
await agent.ainvoke(
{"messages": [{"role": "user", "content": "幫我用 MCP server 查一下資料"}]},
config={"configurable": {"thread_id": "1"}},
)
asyncio.run(main())
小結:Tools 決定 Agent「能做什麼」。地端場景下,把內部服務(Ollama 本地模型管理、地端資料庫、內部 API)包成 MCP Server 或自訂工具,就能讓 Agent 安全地在你的私有網路裡行動。
Backends:Agent 工作空間的隔離層如果說 Tools 是 Agent 的手,Backend 就是 Agent 站立的地板。DeepAgent 的檔案類工具(ls、read_file、write_file、edit_file、delete、glob、grep)全部透過一個可替換的 Backend 介面運作——這正是「工作空間隔離」的核心機制。
| Backend | 特性 | 適用場景 |
|---|---|---|
StateBackend(預設) |
存在 LangGraph state 裡,thread 內持久,跨 thread 不共享 | Agent 的暫存草稿區 |
FilesystemBackend |
直接讀寫地端真實磁碟 | 本機開發 CLI、CI/CD |
StoreBackend |
存在 LangGraph store,可跨 thread 持久化 | 長期記憶、跨對話設定 |
ContextHubBackend |
存在 LangSmith Context Hub repo | Skill/Agent 版本控管 |
| Sandbox(如 LangSmith Sandbox) | 隔離容器內執行,含 execute 工具 |
需要跑程式碼的任務 |
LocalShellBackend |
直接在主機執行 shell,無隔離 | 僅限受信任的本機開發環境 |
CompositeBackend |
依路徑前綴路由到不同 Backend | 混合短期/長期儲存的最靈活方案 |
實務上最常見的做法是用 CompositeBackend 當路由器:一般暫存資料留在 StateBackend(用完即丟),但 /workspace/ 底下的專案檔案落地到真實磁碟,/memories/ 則寫進可跨對話存取的 StoreBackend。
from deepagents import create_deep_agent
from deepagents.backends import CompositeBackend, StateBackend, FilesystemBackend
agent = create_deep_agent(
model="ollama:ornith-1.5:9b",
backend=CompositeBackend(
default=StateBackend(),
routes={
"/workspace/": FilesystemBackend(root_dir="/data/project", virtual_mode=True),
},
),
)
這樣設計的好處是:Agent 產生的中間結果(offload 的大型工具輸出、對話紀錄)不會混進你的專案資料夾,/workspace/ 以外的一切都停留在 ephemeral state。
官方文件對 FilesystemBackend 與 LocalShellBackend 給了明確警告:
.env、API 金鑰等機密LocalShellBackend 開放 execute 工具後,等於讓 Agent 對主機有近乎完整的 shell 權限在地端建置生產級 Agent 時,建議:
virtual_mode=True,把路徑存取限制在 root_dir 內Backend 之上還有一層 Permissions,能宣告式地限制哪些路徑只能讀不能寫:
from deepagents import create_deep_agent, FilesystemPermission
agent = create_deep_agent(
model="ollama:ornith-1.5:9b",
backend=CompositeBackend(
default=StateBackend(),
routes={"/policies/": StoreBackend(namespace=lambda rt: (rt.context.org_id,))},
),
permissions=[
FilesystemPermission(operations=["write"], paths=["/policies/**"], mode="deny"),
],
)
小結:Backend 決定 Agent「資料存在哪裡、誰能看到、誰能改」。地端部署尤其要把「暫存」與「落地磁碟」分開設計,避免內部資料外洩或被覆寫。
有了 Tools(能做什麼)與 Backends(資料放哪、誰能碰),Agent 已經具備行動力與安全的工作空間。但這樣的 Agent 還不知道「複雜任務該怎麼做」,也記不住「跨對話該記得什麼」,更撐不住「又長又貴的對話」。下一篇會接著分享 Skills、Memory、Summarization Middleware,把這套地端 Agent 架構補完整。