GoogleDriveFilesystem
將檔案儲存在單一 Google Drive 資料夾中。每個目錄都會對應到已設定根目錄下的 Drive 資料夾,路徑則採用 POSIX 語意(例如 /notes/todo.txt)。介面詳情請參閱 WorkspaceFilesystem 介面。
安裝「安裝」的直接連結
- npm
- pnpm
- Yarn
- Bun
npm install @mastra/google-drive
pnpm add @mastra/google-drive
yarn add @mastra/google-drive
bun add @mastra/google-drive
使用方式「使用方式」的直接連結
將 GoogleDriveFilesystem 加入 Workspace,並指派給 Agent:
import { Agent } from '@mastra/core/agent'
import { Workspace } from '@mastra/core/workspace'
import { GoogleDriveFilesystem } from '@mastra/google-drive'
const workspace = new Workspace({
filesystem: new GoogleDriveFilesystem({
folderId: process.env.GOOGLE_DRIVE_FOLDER_ID!,
accessToken: process.env.GOOGLE_DRIVE_ACCESS_TOKEN!,
}),
})
const agent = new Agent({
id: 'drive-agent',
name: 'Drive Agent',
model: 'openai/gpt-5-mini',
workspace,
})
身分驗證「身分驗證」的直接連結
提供下列其中一種身分驗證選項:
accessToken:預先取得的 OAuth 存取 Token。使用https://www.googleapis.com/auth/drivescope,讓 Token 能查看與已驗證身分共用的資料夾。getAccessToken:傳回 Token 的回呼函式,適合在外部重新整理 Token 時使用。serviceAccount:Google 服務帳戶。請將目標資料夾與服務帳戶電子郵件地址共用。
服務帳戶「服務帳戶」的直接連結
對後端 Agent 而言,建議使用服務帳戶身分驗證。它不需要使用者同意流程,也不需要處理 Token 更新。你只需要服務帳戶 JSON 金鑰檔案中的兩個值:client_email 和 private_key。
設定服務帳戶「設定服務帳戶」的直接連結
- 開啟 Google Cloud Console,選取或建立專案。
- 前往 APIs & Services > Library,搜尋 Google Drive API,然後選取 Enable。
- 前往 APIs & Services > Credentials,依序選取 Create credentials > Service account,並完成表單。角色可以留空,因為 Drive 權限是透過共用資料夾授予,而不是透過 IAM 角色。
- 開啟新的服務帳戶,前往 Keys 分頁,依序選取 Add key > Create new key > JSON。瀏覽器會下載 JSON 金鑰檔案。
- 從 JSON 檔案複製
client_email值。這就是與 Drive 資料夾共用時使用的地址。
與服務帳戶共用 Drive 資料夾「與服務帳戶共用 Drive 資料夾」的直接連結
服務帳戶具有獨立的 Google 身分。除非你明確與它共用,否則它無法查看 Drive 中的任何內容。
- 在 Google Drive 中開啟目標資料夾。
- 選取 Share。
- 貼上服務帳戶的
client_email地址。 - 將角色設為 Editor(讀寫)或 Viewer(唯讀存取),然後選取 Send。
- 從 URL 複製資料夾 ID。它是
https://drive.google.com/drive/folders/<folderId>中/folders/後面的區段。
服務帳戶無法在標準的「My Drive」資料夾中建立檔案。服務帳戶沒有個人 Drive 儲存空間配額,因此它建立的任何檔案都必須由具有配額的實體擁有。如果只共用個人 Drive 資料夾,讀取操作可以正常執行,但寫入操作會因配額錯誤而失敗。
若要提供寫入權限,請將資料夾放在共用雲端硬碟(舊稱 Team Drive)中,並將服務帳戶加入該共用雲端硬碟成為成員。共用雲端硬碟能提供服務帳戶建立檔案所需的儲存空間配額。
針對個人 Drive 資料夾的唯讀工作負載不受此限制。
設定檔案系統「設定檔案系統」的直接連結
將 JSON 檔案中的 client_email 和 private_key 複製到環境中:
GOOGLE_DRIVE_FOLDER_ID=1AbCdEfGhIjKlMnOpQrStUvWxYz
GOOGLE_DRIVE_CLIENT_EMAIL=my-bot@my-project.iam.gserviceaccount.com
# Wrap the value in quotes — the key contains newlines that must be preserved.
GOOGLE_DRIVE_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkq...\n-----END PRIVATE KEY-----\n"
import { GoogleDriveFilesystem } from '@mastra/google-drive'
const filesystem = new GoogleDriveFilesystem({
folderId: process.env.GOOGLE_DRIVE_FOLDER_ID!,
serviceAccount: {
clientEmail: process.env.GOOGLE_DRIVE_CLIENT_EMAIL!,
privateKey: process.env.GOOGLE_DRIVE_PRIVATE_KEY!,
},
})
你不需要複製整個 JSON 檔案,也不需要傳入 project_id、client_id、private_key_id 或 token_uri 等其他欄位,因為系統不會使用它們。只有 clientEmail 和 privateKey 是必填項目。privateKeyId、scopes 和 subject 則為選填。scopes 預設為 ['https://www.googleapis.com/auth/drive'],這是服務帳戶查看與其共用資料夾所需的 scope。範圍較小的 drive.file scope 只能存取應用程式自行建立的檔案,因此與服務帳戶共用的資料夾會傳回 404 Not Found。
GoogleDriveFilesystem 會在簽署前自動正規化 privateKey 字串。它會移除前後引號,包括 JSON 包裝值中的逸出引號,並將字面值 \n 序列轉換為實際換行。它也會正規化 \r\n 行尾,並移除結尾逗號。無論 .env 載入器如何處理該值,金鑰都可正常運作。
疑難排解「疑難排解」的直接連結
404 File not found: <folderId>:服務帳戶沒有該資料夾的存取權。確認資料夾已與完全相符的client_email地址共用,且資料夾 ID 與 URL 相符。- 寫入時發生
storageQuotaExceeded:資料夾位於個人的「My Drive」中。請將資料夾移至共用雲端硬碟,並將服務帳戶加入成為成員。 error:1E08010C:DECODER routines::unsupported:privateKey值的格式不正確。確認該值包含完整 PEM 區塊,且換行已保留(可使用字面值\n)。
唯讀模式「唯讀模式」的直接連結
傳入 readOnly: true,即可封鎖寫入操作(writeFile、appendFile、deleteFile、copyFile、moveFile、mkdir、rmdir)。
const filesystem = new GoogleDriveFilesystem({
folderId,
accessToken,
readOnly: true,
})
建構函式參數「建構函式參數」的直接連結
folderId:
accessToken?:
getAccessToken?:
serviceAccount?:
id?:
readOnly?:
instructions?:
屬性「屬性」的直接連結
id:
name:
provider:
readOnly:
方法「方法」的直接連結
GoogleDriveFilesystem 實作 WorkspaceFilesystem 介面,並提供所有標準檔案系統方法:
readFile(path, options?)- 下載檔案內容writeFile(path, content, options?)- 上傳或覆寫檔案appendFile(path, content)- 讀取檔案並重新上傳,以附加內容deleteFile(path, options?)- 刪除檔案copyFile(src, dest, options?)- 使用 Drivefiles.copyAPI 複製檔案moveFile(src, dest, options?)- 透過更換上層資料夾,在資料夾間移動檔案mkdir(path, options?)- 建立資料夾rmdir(path, options?)- 移除資料夾readdir(path, options?)- 列出資料夾內容(支援recursive和extension篩選)stat(path)- 傳回檔案或資料夾的 Drive 中繼資料exists(path)- 檢查檔案或資料夾是否存在
注意事項「注意事項」的直接連結
- Google Drive 允許同一個資料夾中存在多個同名檔案。
GoogleDriveFilesystem會選取第一個相符項目來解析路徑,因此依賴路徑查詢時,請讓每個資料夾內的名稱保持唯一。 - 當
recursive未設定(預設值)或設為true時,writeFile會自動建立上層資料夾。設為recursive: false,即可要求上層資料夾必須已存在。 - 系統會遵循
WriteOptions上的expectedMtime。當儲存的modifiedTime不同時,寫入會因StaleFileError而遭到拒絕,以支援樂觀並行控制。 - 此 Provider 僅透過內建
fetch存取 Drive REST 端點(https://www.googleapis.com/drive/v3和https://www.googleapis.com/upload/drive/v3),不需要其他 dependency。