Lewati ke konten utama

API File OPFS

@grant CAT.agent.opfs

API file OPFS (Origin Private File System) memungkinkan skrip membaca dan menulis file di ruang kerja Agent. Semua jalur relatif terhadap direktori agents/workspace/.

write — tulis file

const result = await CAT.agent.opfs.write(path, content);

Parameter:

ParameterJenisDeskripsi
pathstringJalur file (wajib); mendukung direktori bersarang
contentstring | BlobIsi file

Format content yang didukung:

FormatDeskripsi
String biasaDisimpan sebagai file teks UTF-8
String Data URLOtomatis didekode dan disimpan sebagai biner (mis. data:image/png;base64,...)
Objek BlobData biner disimpan langsung

Mengembalikan WriteResult:

BidangJenisDeskripsi
pathstringJalur tempat file disimpan
sizenumberUkuran file (byte)
// Tulis file teks
await CAT.agent.opfs.write("data/config.json", JSON.stringify({ key: "value" }));

// Tulis file biner (data URL)
const canvas = document.createElement("canvas");
const dataUrl = canvas.toDataURL("image/png");
await CAT.agent.opfs.write("images/chart.png", dataUrl);

Direktori induk dibuat otomatis jika tidak ada. Jika file sudah ada, isinya ditimpa.

read — baca file

const result = await CAT.agent.opfs.read(path, format?);

Parameter:

ParameterJenisBawaanDeskripsi
pathstringJalur file (wajib)
format"text" | "blob""text"Format pembacaan

Mengembalikan ReadResult:

BidangJenisSaat hadirDeskripsi
pathstringselalujalur file
sizenumberselaluUkuran file
contentstringformat="text"Isi teks file
dataBlobformat="blob"Objek Blob file (ditransfer melalui structured clone)
mimeTypestringformat="blob"Tipe MIME terdeteksi otomatis

Dua mode pembacaan:

// Mode teks — cocok untuk file JSON dan teks
const config = await CAT.agent.opfs.read("data/config.json");
const data = JSON.parse(config.content);

// Mode Blob — cocok untuk gambar dan file biner
const image = await CAT.agent.opfs.read("images/chart.png", "blob");
// image.data adalah objek Blob asli (bukan URL blob: yang dibatasi cakupan)
// Buat URL lokal dengan URL.createObjectURL(image.data) di konteks mana pun
// yang membutuhkannya, atau berikan Blob langsung ke API apa pun yang menerimanya

Deteksi tipe MIME otomatis:

EkstensiTipe MIME
.jpg / .jpegimage/jpeg
.pngimage/png
.gifimage/gif
.webpimage/webp
.svgimage/svg+xml
.mp3audio/mpeg
.wavaudio/wav
.mp4video/mp4
.pdfapplication/pdf
.jsonapplication/json
.txttext/plain
.htmltext/html
.csstext/css
.jsapplication/javascript
lainnyaapplication/octet-stream

list — daftar direktori

const entries = await CAT.agent.opfs.list(path?);

Parameter:

ParameterJenisBawaanDeskripsi
pathstring""Jalur direktori; string kosong berarti direktori akar

Mengembalikan FileEntry[]:

BidangJenisDeskripsi
namestringNama file/direktori
type"file" | "directory"Jenis
sizenumberUkuran file (hanya tipe file)
const entries = await CAT.agent.opfs.list("data/");
for (const entry of entries) {
if (entry.type === "file") {
console.log(`${entry.name} (${entry.size} bytes)`);
} else {
console.log(`${entry.name}/`);
}
}

delete — hapus file atau direktori

const result = await CAT.agent.opfs.delete(path);

Mendukung penghapusan rekursif direktori beserta semua isinya.

Mengembalikan:

{ success: true }

readAttachment — baca lampiran

const result = await CAT.agent.opfs.readAttachment(attachmentId);

Membaca data lampiran (gambar, file, dll.) dari percakapan. ID lampiran berasal dari ContentBlock.attachmentId dalam pesan.

Parameter:

ParameterJenisDeskripsi
attachmentIdstringID lampiran (wajib)

Mengembalikan:

BidangJenisDeskripsi
idstringID lampiran
dataBlobData biner lampiran
sizenumberUkuran file (byte)
mimeTypestringTipe MIME
// Baca lampiran gambar yang dibuat AI dalam percakapan
const messages = await conv.getMessages();
const lastMsg = messages[messages.length - 1];
const imageBlock = lastMsg.content.find(b => b.type === "image");
if (imageBlock) {
const attachment = await CAT.agent.opfs.readAttachment(imageBlock.attachmentId);
console.log(`Attachment size: ${attachment.size}, type: ${attachment.mimeType}`);
}

Bekerja dengan data Blob

  • read(path, "blob") mengembalikan objek Blob asli yang ditransfer melalui structured clone — bukan URL blob: yang dibatasi asal ekstensi, jadi tidak ada batasan akses lintas konteks yang perlu dikhawatirkan
  • Untuk mendapatkan URL sementara yang dapat digunakan di halaman, panggil URL.createObjectURL(result.data); panggil URL.revokeObjectURL() setelah selesai menggunakannya
  • Anda juga dapat memberikan Blob langsung ke API web apa pun yang menerima Blob/File (mis. body dari fetch, FormData.append, DataTransfer untuk <input type="file">)