AI News HubLIVE
站内改写4 分鐘閱讀

代理與應用之間的缺失環節

大多數AI代理工具執行在伺服器上,限制了瀏覽器API、裝置功能和前端狀態的訪問。瞭解LangChain的無頭工具如何為現代代理應用啟用安全的客戶端工具執行。

開源

代理與應用之間的缺失連結

2026年6月10日

6

分鐘

返回部落格

建立代理

關鍵要點

大多數代理工具只看到後端。瀏覽器、應用和裝置包含伺服器端工具無法直接訪問的有價值狀態和能力。

無頭工具將客戶端能力引入代理迴圈。代理可以呼叫瀏覽器API、本地記憶體和應用特定操作作為第一類工具,同時保留結構化輸入和輸出。

在客戶端執行既改善使用者體驗又提升隱私。代理可以直接與使用者環境互動,減少往返,並允許敏感資料預設保留在本地。

TL;DR:大多數代理工具在伺服器上執行,這意味著代理可以呼叫API,但無法與使用者實際工作的瀏覽器、應用狀態或裝置能力互動。透過LangChain中的無頭工具,我們透過讓代理呼叫客戶端能力(如地理位置、剪貼簿訪問、本地記憶體和應用內操作)作為第一類工具來彌補這一差距。這使代理更有用、更私密,並更好地與實際應用行為對齊。

如今的代理能力越來越強,但使用者關心的許多能力存在於客戶端執行時而非伺服器上。瀏覽器和應用擁有本地狀態、使用者選擇、裝置API和應用特定操作,這些通常無法透過後端系統訪問。結果,代理可以推理下一步該做什麼,但難以在使用者實際工作的環境中行動。

造成這一差距的一個原因是大多數代理工具在伺服器上執行。當模型決定使用工具時,代理在程序中執行它或將其委託給外部服務(如MCP伺服器),然後將結果反饋給推理迴圈。這對API、資料庫和後端系統有效,但存在明顯限制:

無法直接訪問僅瀏覽器或僅裝置的API。

無法對從未同步到伺服器的前端狀態採取行動。

通常迫使隱私敏感資料離開裝置。

為本質上是本地的操作引入不必要的往返。

瀏覽器是許多高價值代理操作實際發生的地方:讀取本地應用狀態、對當前UI採取行動、使用裝置能力而不將資料傳送到後端。桌面應用透過本地檔案、原生整合和會話特定狀態展現相同模式。如果您的代理無法訪問該執行時,它仍然擅長後端工作流,但弱於使用者實際體驗的互動。

想象您正在為Figma、Google Slides或富文本編輯器構建副駕駛代理。代理可以在伺服器上推理使用者的請求,但文件模型、選擇狀態和編輯命令都在客戶端。伺服器端工具無法在游標處插入文本、重新格式化選定物件或跳轉到活動幻燈片,因為這些操作屬於應用執行時,而非後端API。如今,團隊通常透過臨時UI橋接來彌合這一差距:將一些客戶端狀態序列化到伺服器,獲取響應,然後命令式地修補客戶端。這可行,但脆弱、難以組合,且對模型的推理迴圈不可見。

讓您的代理直接從使用者瀏覽器訪問記憶體或地理位置API。

這就是LangChain中無頭工具解決的問題。

無頭工具改變了什麼

對模型而言,無頭工具看起來與其他工具無異:它有名稱、描述和一組預期輸入。模型決定何時呼叫它,就像其他工具一樣。不同之處在於接下來發生的事情。

伺服器不是自己執行工具,而是將工具呼叫傳送到客戶端:使用者的瀏覽器、桌面應用或實際擁有該能力的任何環境。客戶端在本地執行工具並將結果傳送回來,代理從中斷處繼續。

雖然這初聽起來像一個小實現細節,但它實際上改變了代理可以可靠控制的系統型別。

模型從不需要知道工具在哪裡執行。它看到一個工具,決定使用它,並獲得結果。但在幕後,伺服器和客戶端正在協調:伺服器知道代理想做什麼,客戶端知道如何做。這種分離是核心思想。

您可以手動連線,從React應用呼叫navigator.geolocation.getCurrentPosition()並將結果傳送給代理。但這樣一來,模型無法發現或決定何時呼叫該能力。它作為臨時側通道存在於推理迴圈之外。無頭工具將客戶端操作置於代理的推理迴圈之內,而非旁邊。

為什麼這很重要

好處不僅僅是“瀏覽器訪問”。想象一個幫助您處理幻燈片堆的代理:它應該能夠跳轉到活動幻燈片、讀取本地上下文並原地更新簡報,而無需將會話傳送到後端。無頭工具透過將客戶端能力作為代理迴圈中的真實工具暴露出來,使這種互動成為可能。

某些操作無法在後端正確模擬。地理位置是明顯的例子——瀏覽器擁有許可權提示和裝置訊號。剪貼簿訪問、畫布渲染、檔案選擇器和即時UI導航都依賴於活動客戶端環境。標準工具可以透過後端服務近似這些操作。無頭工具可以呼叫真實事物。

但無頭工具不僅限於瀏覽器API。它們是給代理安全訪問應用原生操作的通用機制。例如,slidev-agent(Popular Slidev演示框架的外掛)使用無頭工具在使用者活動演示中導航到特定幻燈片。這不是資料檢索問題或伺服器自動化問題。

這種模式也改變了隱私權衡。代理記憶體並不總屬於集中式後端。透過由瀏覽器儲存(如IndexedDB)支援的無頭工具,記憶體可以預設保留在本地——持久、低延遲、自然限定於該使用者和瀏覽器——而無需將回憶轉化為伺服器端資料管理問題。

它在程式碼中如何工作

在TypeScript中,定義和實現之間的分離特別清晰。您定義一次工具,使用.implement(...)附加實現,並將實現傳遞給前端流式鉤子。伺服器和客戶端共享相同的模式,但只有客戶端載入特定於瀏覽器的執行邏輯。

// tools.ts import { tool } from "langchain";

export const geolocationGet = tool({ name: "geolocation_get", description: "從瀏覽器獲取使用者的當前位置。", schema: z.object({}), }); // App.tsx import { useStream } from '@langchain/react';

// 共享工具定義 import { geolocationGet as geolocationGetDefinition } from './tools';

export function App() { const stream = useStream({ // ... tools: [ // 客戶端側的實際工具實現 geolocationGetDefinition.implement(async () => { const position = await new Promise((resolve, reject) => navigator.geolocation.getCurrentPosition(resolve, reject), );

return { latitude: position.coords.latitude, longitude: position.coords.longitude, accuracy: position.coords.accuracy, }; }), ], });

return

...

; }

在我們的LangChain文件中檢視即時演示,結合瀏覽器本地記憶體、地理位置和可選的人工審批。

總結

標準工具讓代理訪問後端系統。無頭工具讓它們訪問使用者實際工作的地方。

使用者並不生活在您的後端。他們生活在瀏覽器、應用和裝置中,許多最有價值的代理互動都在那裡發生。無頭工具使這些互動可用,同時保留型別化模式、顯式能力、結構化輸出和可審查性,允許代理使用對使用者原生、而非僅對伺服器方便的工具。

開始使用LangChain Python或LangChain JS中的無頭工具。

感謝@huntlovell、@colifran_和@sydneyrunkle的 thoughtful 審閱和反饋。

檢視您的代理真正在做什麼

LangSmith,我們的代理工程平臺,幫助開發者除錯每個代理決策、評估更改並一鍵部署。

嘗試LangSmith

獲取演示