Codex App Server
Untuk indeks dokumentasi lengkap, lihat llms.txt. Versi Markdown dari halaman dokumentasi tersedia dengan menambahkan .md ke URL halaman.
Codex app-server adalah antarmuka yang digunakan Codex untuk mendukung klien kaya fitur (misalnya, ekstensi Codex VS Code). Gunakan antarmuka ini saat Anda menginginkan integrasi mendalam di dalam produk Anda sendiri: autentikasi, riwayat percakapan, persetujuan, dan peristiwa agen yang dialirkan. Implementasi app-server bersifat sumber terbuka di repositori GitHub Codex (openai/codex/codex-rs/app-server). Lihat halaman Sumber Terbuka untuk daftar lengkap komponen Codex sumber terbuka.
Menghubungkan antarmuka terminal CLI
Mode antarmuka terminal jarak jauh memungkinkan Anda menjalankan app-server di satu mesin dan menghubungkan antarmuka terminal Codex CLI dari mesin lain. Mulai listener WebSocket:
codex app-server --listen ws://127.0.0.1:4500Kemudian hubungkan antarmuka terminal:
codex --remote ws://127.0.0.1:4500Untuk koneksi nonlokal, konfigurasikan autentikasi WebSocket dan tempatkan koneksi di belakang TLS. Simpan token bearer dalam variabel lingkungan dan teruskan namanya, bukan menempatkan token di baris perintah:
export CODEX_REMOTE_TOKEN="$(cat "$HOME/.codex/app-server-token")"
codex --remote wss://remote-host:4500 \
--remote-auth-token-env CODEX_REMOTE_TOKENOpsi --remote menerima endpoint ws://, wss://, unix://, dan
unix://PATH. Gunakan WebSocket biasa hanya untuk localhost atau koneksi
yang diteruskan melalui port SSH.
Menghubungkan host Code Mode jarak jauh
Secara default, app-server memulai host Code Mode lokal. Untuk menggunakan host jarak jauh sebagai gantinya, teruskan URL WebSocket amannya:
codex app-server --code-mode-host wss://code-mode.example.com/host--code-mode-host mengontrol koneksi keluar dari app-server ke host Code
Mode-nya. Opsi ini tidak mengubah --listen, yang mengontrol cara klien terhubung ke
app-server. Setiap thread dalam proses app-server yang sama berbagi koneksi
host Code Mode yang dipilih.
Gunakan wss:// untuk host jarak jauh. Gunakan ws:// hanya untuk koneksi localhost atau
yang diteruskan melalui SSH. Perintah app-server dan transportasi WebSocket bersifat
eksperimental dan tidak didukung untuk beban kerja produksi.
Protokol
Seperti MCP, codex app-server mendukung komunikasi dua arah menggunakan pesan JSON-RPC 2.0 (dengan header "jsonrpc":"2.0" dihilangkan saat dikirim melalui jaringan).
Transportasi yang didukung:
stdio(--listen stdio://, default): JSON yang dibatasi baris baru (JSONL).websocket(--listen ws://IP:PORT, eksperimental dan tidak didukung): satu pesan JSON-RPC per bingkai teks WebSocket.- Soket Unix (
--listen unix://atau--listen unix://PATH): koneksi WebSocket melalui soket kontrol app-server default Codex atau jalur soket Unix khusus, menggunakan handshake HTTP Upgrade standar. off(--listen off): jangan mengekspos transportasi lokal.
Saat Anda menjalankan dengan --listen ws://IP:PORT, listener yang sama juga melayani
pemeriksaan kesehatan HTTP dasar:
GET /readyzmengembalikan200 OKsetelah listener menerima koneksi baru.GET /healthzmengembalikan200 OKsaat permintaan tidak menyertakan headerOrigin.- Permintaan dengan header
Originditolak dengan403 Forbidden.
Transportasi WebSocket bersifat eksperimental dan tidak didukung. Listener lokal seperti
ws://127.0.0.1:PORT sesuai untuk alur kerja localhost dan penerusan port SSH.
Listener WebSocket non-loopback saat ini secara default mengizinkan koneksi tanpa autentikasi
selama peluncuran bertahap, jadi konfigurasikan autentikasi WebSocket sebelum
mengeksposnya dari jarak jauh.
Flag autentikasi WebSocket yang didukung:
--ws-auth capability-token --ws-token-file /absolute/path--ws-auth capability-token --ws-token-sha256 HEX--ws-auth signed-bearer-token --ws-shared-secret-file /absolute/path
Untuk token bearer bertanda tangan, Anda juga dapat mengatur --ws-issuer, --ws-audience, dan
--ws-max-clock-skew-seconds. Klien menyajikan kredensial sebagai
Authorization: Bearer <token> selama handshake WebSocket, dan app-server
memberlakukan autentikasi sebelum JSON-RPC initialize.
Utamakan --ws-token-file daripada meneruskan token bearer mentah di baris perintah. Gunakan
--ws-token-sha256 hanya jika klien menyimpan token mentah berentropi tinggi dalam
penyimpanan rahasia lokal terpisah; hash hanya merupakan pemverifikasi, dan klien tetap memerlukan
token asli.
Dalam mode WebSocket, app-server menggunakan antrean terbatas. Saat antrean masuk permintaan penuh,
server menolak permintaan baru dengan kode kesalahan JSON-RPC -32001 dan pesan
"Server overloaded; retry later." Klien harus mencoba kembali dengan penundaan yang
meningkat secara eksponensial dan jitter.
Skema pesan
Permintaan menyertakan method, params, dan id:
{ "method": "thread/start", "id": 10, "params": { "model": "gpt-5.6-terra" } }Respons menggemakan id dengan result atau error:
{ "id": 10, "result": { "thread": { "id": "thr_123" } } }{ "id": 10, "error": { "code": 123, "message": "Something went wrong" } }Notifikasi menghilangkan id dan hanya menggunakan method dan params:
{ "method": "turn/started", "params": { "turn": { "id": "turn_456" } } }Anda dapat menghasilkan skema TypeScript atau bundel JSON Schema dari CLI. Setiap keluaran khusus untuk versi Codex yang Anda jalankan, sehingga artefak yang dihasilkan sama persis dengan versi tersebut:
codex app-server generate-ts --out ./schemas
codex app-server generate-json-schema --out ./schemasMemulai
- Mulai server dengan
codex app-server(transportasi stdio default),codex app-server --listen ws://127.0.0.1:4500(TCP WebSocket), ataucodex app-server --listen unix://(soket Unix default). - Hubungkan klien melalui transportasi yang dipilih, lalu kirim
initializeyang diikuti oleh notifikasiinitialized. - Mulai thread dan turn, lalu terus baca notifikasi dari aliran transportasi aktif.
Contoh (Node.js / TypeScript):
const proc = spawn("codex", ["app-server"], {
stdio: ["pipe", "pipe", "inherit"],
});
const rl = readline.createInterface({ input: proc.stdout });
const send = (message: unknown) => {
proc.stdin.write(`${JSON.stringify(message)}\n`);
};
let threadId: string | null = null;
rl.on("line", (line) => {
const msg = JSON.parse(line) as any;
console.log("server:", msg);
if (msg.id === 1 && msg.result?.thread?.id && !threadId) {
threadId = msg.result.thread.id;
send({
method: "turn/start",
id: 2,
params: {
threadId,
input: [{ type: "text", text: "Summarize this repo." }],
},
});
}
});
send({
method: "initialize",
id: 0,
params: {
clientInfo: {
name: "my_product",
title: "My Product",
version: "0.1.0",
},
},
});
send({ method: "initialized", params: {} });
send({ method: "thread/start", id: 1, params: { model: "gpt-5.6-terra" } });Primitif inti
- Thread: Percakapan antara pengguna dan agen Codex. Thread berisi turn.
- Turn: Satu permintaan pengguna dan pekerjaan agen yang mengikutinya. Turn berisi item dan mengalirkan pembaruan inkremental.
- Item: Unit masukan atau keluaran (pesan pengguna, pesan agen, eksekusi perintah, perubahan file, panggilan alat, dan lainnya).
Gunakan API thread untuk membuat, mencantumkan, atau mengarsipkan percakapan. Jalankan percakapan dengan API turn dan alirkan progres melalui notifikasi turn.
Ikhtisar siklus hidup
- Inisialisasi sekali per koneksi: Segera setelah membuka koneksi transportasi, kirim permintaan
initializedengan metadata klien Anda, lalu kiriminitialized. Server menolak setiap permintaan pada koneksi tersebut sebelum handshake ini. - Mulai (atau lanjutkan) thread: Panggil
thread/startuntuk percakapan baru,thread/resumeuntuk melanjutkan percakapan yang ada, atauthread/forkuntuk mencabangkan riwayat ke id thread baru. - Mulai turn: Panggil
turn/startdenganthreadIdtarget dan masukan pengguna. Field opsional menimpa model, kepribadian,cwd, kebijakan sandbox, dan lainnya. - Arahkan turn aktif: Panggil
turn/steeruntuk menambahkan masukan pengguna ke turn yang sedang berlangsung tanpa membuat turn baru. - Alirkan peristiwa: Setelah
turn/start, terus baca notifikasi di stdout:thread/archived,thread/unarchived,item/started,item/completed,item/agentMessage/delta, progres alat, dan pembaruan lainnya. - Selesaikan turn: Server mengirim
turn/completeddengan status akhir saat model selesai atau setelah pembatalanturn/interrupt.
Inisialisasi
Klien harus mengirim satu permintaan initialize per koneksi transportasi sebelum memanggil metode lain pada koneksi tersebut, lalu mengakuinya dengan notifikasi initialized. Permintaan yang dikirim sebelum inisialisasi menerima kesalahan Not initialized, dan panggilan initialize berulang pada koneksi yang sama mengembalikan Already initialized.
Server mengembalikan string agen pengguna yang akan disajikannya kepada layanan upstream beserta nilai platformFamily dan platformOs yang menjelaskan target runtime. Atur clientInfo untuk mengidentifikasi integrasi Anda.
initialize.params.capabilities juga mendukung kapabilitas klien berikut:
optOutNotificationMethods- nama metode notifikasi persis yang akan disembunyikan untuk koneksi ini. Pencocokan bersifat persis (tanpa wildcard atau prefiks); nama yang tidak dikenal diterima dan diabaikan.requestAttestation- ikut serta dalam permintaanattestation/generateyang dimulai server. Host desktop yang menyediakan pengesahan upstream merespons dengan nilai{ "token": "..." }yang opak.mcpServerOpenaiFormElicitation- mengizinkan server MCP downstream mengirim varian bentuk diperluas OpenAI darimcpServer/elicitation/request.
Penting: Gunakan clientInfo.name untuk mengidentifikasi klien Anda bagi OpenAI Compliance Logs Platform. Jika Anda mengembangkan integrasi Codex baru yang ditujukan untuk penggunaan perusahaan, hubungi OpenAI agar integrasi tersebut ditambahkan ke daftar klien yang dikenal. Untuk konteks selengkapnya, lihat referensi log Codex.
Contoh (dari ekstensi Codex VS Code):
{
"method": "initialize",
"id": 0,
"params": {
"clientInfo": {
"name": "codex_vscode",
"title": "Codex VS Code Extension",
"version": "0.1.0"
}
}
}Contoh dengan penolakan notifikasi:
{
"method": "initialize",
"id": 1,
"params": {
"clientInfo": {
"name": "my_client",
"title": "My Client",
"version": "0.1.0"
},
"capabilities": {
"experimentalApi": true,
"optOutNotificationMethods": ["thread/started", "item/agentMessage/delta"]
}
}
}Keikutsertaan API eksperimental
Beberapa metode dan field app-server sengaja dibatasi oleh kapabilitas experimentalApi.
- Hilangkan
capabilities(atau aturexperimentalApikefalse) agar tetap menggunakan permukaan API stabil, dan server akan menolak metode/field eksperimental. - Atur
capabilities.experimentalApiketrueuntuk mengaktifkan metode dan field eksperimental.
{
"method": "initialize",
"id": 1,
"params": {
"clientInfo": {
"name": "my_client",
"title": "My Client",
"version": "0.1.0"
},
"capabilities": {
"experimentalApi": true
}
}
}Jika klien mengirim metode atau field eksperimental tanpa ikut serta, app-server menolaknya dengan:
<descriptor> requires experimentalApi capability
Ikhtisar API
thread/start- membuat thread baru; mengirimthread/starteddan secara otomatis membuat Anda berlangganan peristiwa turn/item untuk thread tersebut.thread/resume- membuka kembali thread yang ada berdasarkan id agar panggilanturn/startberikutnya ditambahkan ke thread tersebut.thread/fork- mencabangkan thread ke id thread baru dengan menyalin riwayat yang tersimpan. TeruskanlastTurnIduntuk menyalin riwayat hingga turn tersebut dan menghilangkan turn berikutnya, atauephemeral: trueuntuk membuat cabang dalam memori. Mengirimthread/starteduntuk thread baru; thread yang dikembalikan menyertakanforkedFromIdjika tersedia.thread/read- membaca thread tersimpan berdasarkan id tanpa melanjutkannya; aturincludeTurnsuntuk mengembalikan riwayat turn lengkap. Objekthreadyang dikembalikan menyertakanstatusruntime.thread/list- menelusuri log thread tersimpan per halaman; mendukung paginasi berbasis kursor beserta filtermodelProviders,sourceKinds,archived,isPinned,cwd,useStateDbOnly,searchTerm, danparentThreadIdatauancestorThreadIdyang eksperimental. Objekthreadyang dikembalikan menyertakanstatusruntime.thread/turns/list- eksperimental; menelusuri riwayat turn thread tersimpan per halaman tanpa melanjutkannya.itemsViewmengontrol apakah item turn dihilangkan, diringkas, atau dimuat sepenuhnya.thread/items/list- eksperimental; menelusuri item thread yang dipersistenkan per halaman, dengan opsi membatasinya pada satuturnId. Penyimpanan thread aktif harus mendukung paginasi item.thread/loaded/list- mencantumkan id thread yang sedang dimuat dalam memori.thread/name/set- mengatur atau memperbarui nama thread yang ditampilkan kepada pengguna untuk thread yang dimuat atau rollout yang dipersistenkan; mengirimthread/name/updated.thread/goal/set- mengatur sasaran untuk thread; mengirimthread/goal/updated.thread/goal/get- membaca sasaran saat ini untuk thread.thread/goal/clear- menghapus sasaran; mengirimthread/goal/cleared.thread/metadata/update- menambal metadata thread tersimpan berbasis SQLite, termasukgitInfodanisPinnedyang dipersistenkan.thread/archive- memindahkan file log thread ke direktori arsip dan mencoba mengarsipkan log thread turunan yang dibuat dan belum diarsipkan; mengembalikan{}jika berhasil dan mengirimthread/archiveduntuk setiap thread yang diarsipkan.thread/delete- menghapus secara permanen thread aktif atau arsip yang dipersistenkan beserta semua thread turunan yang dibuat; mengembalikan{}jika berhasil dan mengirimthread/deleteduntuk setiap thread yang dihapus.thread/unsubscribe- menghentikan langganan koneksi ini dari peristiwa turn/item thread. Jika ini pelanggan terakhir, server membongkar thread setelah masa tenggang tanpa aktivitas tanpa pelanggan dan mengirimthread/closed.thread/unarchive- memulihkan rollout thread yang diarsipkan ke direktori sesi aktif; mengembalikanthreadyang dipulihkan dan mengirimthread/unarchived.thread/status/changed- notifikasi yang dikirim saatstatusruntime thread yang dimuat berubah.thread/compact/start- memicu pemadatan riwayat percakapan untuk thread; segera mengembalikan{}sementara progres dialirkan melalui notifikasiturn/*danitem/*.thread/shellCommand- menjalankan perintah shell yang dimulai pengguna terhadap thread. Perintah ini berjalan di luar sandbox dengan akses penuh dan tidak mewarisi kebijakan sandbox thread.thread/backgroundTerminals/clean- menghentikan semua terminal latar belakang yang berjalan untuk thread (eksperimental; memerlukancapabilities.experimentalApi).thread/backgroundTerminals/list- mencantumkan terminal latar belakang yang berjalan untuk thread yang dimuat (eksperimental; memerlukancapabilities.experimentalApi).thread/backgroundTerminals/terminate- menghentikan satu terminal latar belakang yang berjalan berdasarkanprocessIdapp-server (eksperimental; memerlukancapabilities.experimentalApi).thread/rollback- tidak digunakan lagi; menghapus N turn terakhir dari konteks dalam memori dan mempersistenkan penanda rollback; mengembalikanthreadyang diperbarui.turn/start- menambahkan masukan pengguna ke thread dan memulai pembuatan Codex; merespons denganturnawal dan mengalirkan peristiwa. UntukcollaborationMode,settings.developer_instructions: nullberarti "gunakan instruksi bawaan untuk mode yang dipilih."thread/inject_items- menambahkan item Responses API mentah ke riwayat yang terlihat oleh model pada thread yang dimuat tanpa memulai turn pengguna.turn/steer- menambahkan masukan pengguna ke turn aktif yang sedang berlangsung untuk suatu thread; mengembalikanturnIdyang diterima.turn/interrupt- meminta pembatalan turn yang sedang berlangsung; keberhasilan dinyatakan dengan{}dan turn berakhir denganstatus: "interrupted".review/start- memulai peninjau Codex untuk thread; mengirim itementeredReviewModedanexitedReviewMode.command/exec- menjalankan satu perintah di bawah sandbox server tanpa memulai thread/turn.command/exec/write- menulis bytestdinke sesicommand/execyang berjalan atau menutupstdin.command/exec/resize- mengubah ukuran sesicommand/execberbasis PTY yang berjalan.command/exec/terminate- menghentikan sesicommand/execyang berjalan.command/exec/outputDelta(notifikasi) - dikirim untuk potongan stdout/stderr berkode base64 dari sesicommand/execyang dialirkan.process/spawn- memulai sesi proses eksplisit di luar sandbox Codex (eksperimental; memerlukancapabilities.experimentalApi).process/writeStdin- menulis byte stdin ke sesiprocess/spawnyang berjalan atau menutup stdin (eksperimental).process/resizePty- mengubah ukuran sesi proses berbasis PTY yang berjalan (eksperimental).process/kill- menghentikan sesi proses yang berjalan (eksperimental).process/outputDeltadanprocess/exited(notifikasi) - dikirim untuk keluaran proses yang dialirkan dan status keluar proses (eksperimental).model/list- mencantumkan model yang tersedia (aturincludeHidden: trueuntuk menyertakan entri denganhidden: true) beserta opsi upaya,upgradeopsional, daninputModalities.modelProvider/capabilities/read- membaca batas kapabilitas penyedia untuk kombinasi model/penyedia.experimentalFeature/list- mencantumkan flag fitur dengan metadata tahap siklus hidup dan paginasi kursor.experimentalFeature/enablement/set- menambal pengaturan runtime dalam memori untuk kunci fitur yang didukung sepertiappsdanplugins.environment/info- eksperimental; terhubung ke lingkungan eksekusi yang dikonfigurasi dan mengembalikan shell beserta direktori kerja defaultnya.permissionProfile/list- mencantumkan profil izin beta dan apakah persyaratan efektif mengizinkannya, dengan paginasi kursor.collaborationMode/list- mencantumkan preset mode kolaborasi (eksperimental, tanpa paginasi).skills/list- mencantumkan skill untuk satu atau beberapa nilaicwd(mendukungforceReloaddanperCwdExtraUserRootsopsional).skills/extraRoots/set- mengganti root tambahan tingkat proses yang digunakan untuk menemukan skill mandiri tanpa mempersistenkannya.skills/changed(notifikasi) - dikirim saat file skill lokal yang dipantau berubah.hooks/list- mencantumkan hook siklus hidup yang ditemukan untuk satu atau beberapa nilaicwd.marketplace/add- menambahkan marketplace plugin jarak jauh dan mempersistenkannya ke konfigurasi marketplace pengguna.marketplace/remove- menghapus marketplace yang dikonfigurasi dan root marketplace terinstalnya jika ada.marketplace/upgrade- menyegarkan marketplace Git yang dikonfigurasi, atau semua marketplace Git yang dikonfigurasi jika nama marketplace dihilangkan.plugin/list- dalam pengembangan; mencantumkan marketplace plugin yang ditemukan dan status plugin, termasuk metadata kebijakan instalasi/autentikasi, kesalahan pemuatan marketplace, id plugin unggulan, serta metadata sumber plugin lokal, Git, registri paket, atau jarak jauh. Ringkasan dapat menyertakanversionjarak jauh,localVersionlokal, ikon terang/gelap terstruktur, daninstallPolicySource, yang dapat berupanull,WORKSPACE_SETTING, atauIMPLICIT_CANONICAL_APPuntuk baris jarak jauh saat ini. Jangan panggil metode ini dari klien produksi untuk saat ini.plugin/read- dalam pengembangan; membaca satu plugin berdasarkan jalur marketplace atau nama marketplace jarak jauh dan nama plugin, termasuk skill yang dibundel, app, nama server MCP, danshareUrlplugin jarak jauh jika katalog jarak jauh menyediakannya. Jangan panggil metode ini dari klien produksi untuk saat ini.plugin/install- dalam pengembangan; menginstal plugin dari jalur marketplace atau nama marketplace jarak jauh. Jangan panggil metode ini dari klien produksi untuk saat ini.plugin/uninstall- dalam pengembangan; menghapus instalasi plugin yang terinstal. Jangan panggil metode ini dari klien produksi untuk saat ini.plugin/skill/read- membaca Markdown skill plugin jarak jauh sesuai permintaan berdasarkan marketplace jarak jauh, id plugin, dan nama skill.app/installed- membaca status runtime app yang terinstal, termasuk status aktif dan dapat dipanggil yang efektif untuk setiap app.app/list- mencantumkan app (konektor) yang tersedia dengan paginasi serta metadata aksesibilitas/aktif.app/read- mengambil metadata dan ringkasan alat opsional khusus tampilan untuk id app tertentu.skills/config/write- mengaktifkan atau menonaktifkan skill berdasarkan jalur.mcpServer/oauth/login- memulai login OAuth untuk server MCP yang dikonfigurasi; mengembalikan URL otorisasi dan mengirimmcpServer/oauthLogin/completedsaat selesai.tool/requestUserInput- meminta pengguna menjawab 1–3 pertanyaan singkat untuk panggilan alat (eksperimental); pertanyaan dapat mengaturisOtheruntuk opsi bentuk bebas.mcpServer/elicitation/request(permintaan server) - meminta klien memberikan masukan formulir terstruktur atau konfirmasi alur URL yang diminta oleh server MCP.item/permissions/requestApproval(permintaan server) - meminta klien memberikan sebagian izin jaringan atau sistem file yang diminta oleh alat bawaanrequest_permissions.config/mcpServer/reload- memuat ulang konfigurasi server MCP dari disk dan mengantrekan penyegaran untuk thread yang dimuat.mcpServerStatus/list- mencantumkan server MCP, alat, sumber daya, dan status autentikasi (paginasi kursor + batas). Gunakandetail: "full"untuk data lengkap ataudetail: "toolsAndAuthOnly"untuk menghilangkan sumber daya.mcpServer/resource/read- membaca satu sumber daya MCP melalui server MCP yang telah diinisialisasi.mcpServer/tool/call- memanggil alat pada server MCP yang dikonfigurasi untuk thread.mcpServer/startupStatus/updated(notifikasi) - dikirim saat status startup server MCP yang dikonfigurasi berubah untuk thread yang dimuat.windowsSandbox/setupStart- memulai penyiapan sandbox Windows untuk modeelevatedatauunelevated; segera mengembalikan hasil dan kemudian mengirimwindowsSandbox/setupCompleted.feedback/upload- mengirim laporan umpan balik (klasifikasi + alasan/log opsional + id percakapan, beserta lampiranextraLogFilesopsional).config/read- mengambil konfigurasi efektif pada disk setelah menyelesaikan pelapisan konfigurasi.externalAgentConfig/detect- mendeteksi artefak agen eksternal yang dapat dimigrasikan denganincludeHomedancwdsopsional; setiap item yang terdeteksi menyertakancwd(nulluntuk home).externalAgentConfig/import- menerapkan item migrasi agen eksternal yang dipilih dengan meneruskanmigrationItemseksplisit besertacwd(nulluntuk home). Jenis item yang didukung mencakup konfigurasi, skill,AGENTS.md, plugin, konfigurasi server MCP, subagen, hook, perintah, dan sesi; impor yang tidak kosong mengirimexternalAgentConfig/import/progressdanexternalAgentConfig/import/completedsaat pekerjaan selesai. Impor plugin dan sesi dapat diselesaikan secara asinkron.config/value/write- menulis satu kunci/nilai konfigurasi keconfig.tomlpengguna pada disk.config/batchWrite- menerapkan pengeditan konfigurasi secara atomik keconfig.tomlpengguna pada disk.configRequirements/read- mengambil persyaratan darirequirements.tomldan/atau MDM, termasuk konfigurasi terkelola yang tepat, daftar yang diizinkan,featureRequirementsyang disematkan, dan persyaratan residensi/jaringan (ataunulljika Anda belum menyiapkannya).fs/readFile,fs/writeFile,fs/createDirectory,fs/getMetadata,fs/readDirectory,fs/remove,fs/copy,fs/watch,fs/unwatch, danfs/changed(notifikasi) - beroperasi pada jalur sistem file absolut melalui API sistem file app-server v2.
Ringkasan plugin menyertakan union source. Plugin lokal mengembalikan
{ "type": "local", "path": ... }, entri marketplace berbasis Git mengembalikan
{ "type": "git", "url": ..., "path": ..., "refName": ..., "sha": ... },
entri registri paket mengembalikan
{ "type": "npm", "package": ..., "version": ..., "registry": ... }, dan
entri katalog jarak jauh mengembalikan { "type": "remote" }. Untuk entri katalog khusus jarak jauh,
PluginMarketplaceEntry.path dapat berupa null; teruskan
remoteMarketplaceName sebagai pengganti marketplacePath saat membaca atau menginstal
plugin tersebut.
Model
Mencantumkan model (model/list)
Panggil model/list untuk menemukan model yang tersedia dan kapabilitasnya sebelum merender pemilih model atau kepribadian.
{ "method": "model/list", "id": 6, "params": { "limit": 20, "includeHidden": false } }
{ "id": 6, "result": {
"data": [{
"id": "gpt-5.6-sol",
"model": "gpt-5.6-sol",
"displayName": "GPT-5.6-Sol",
"hidden": false,
"defaultReasoningEffort": "low",
"supportedReasoningEfforts": [{
"reasoningEffort": "low",
"description": "Fast responses with lighter reasoning"
}],
"inputModalities": ["text", "image"],
"supportsPersonality": true,
"isDefault": true
}],
"nextCursor": null
} }Setiap entri model dapat menyertakan:
supportedReasoningEfforts- opsi upaya yang didukung untuk model.defaultReasoningEffort- upaya default yang disarankan untuk klien.upgrade- id model peningkatan opsional yang direkomendasikan untuk prompt migrasi dalam klien.upgradeInfo- metadata peningkatan opsional untuk prompt migrasi dalam klien.hidden- apakah model disembunyikan dari daftar pemilih default.inputModalities- jenis masukan yang didukung untuk model (misalnyatext,image).supportsPersonality- apakah model mendukung instruksi khusus kepribadian seperti/personality.isDefault- apakah model merupakan default yang direkomendasikan.
Secara default, model/list hanya mengembalikan model yang terlihat di pemilih. Atur includeHidden: true jika Anda memerlukan daftar lengkap dan ingin memfilter di sisi klien menggunakan hidden.
Jika inputModalities tidak ada (katalog model lama), perlakukan sebagai ["text", "image"] untuk kompatibilitas mundur.
Mencantumkan fitur eksperimental (experimentalFeature/list)
Gunakan endpoint ini untuk menemukan flag fitur beserta metadata dan tahap siklus hidup:
{ "method": "experimentalFeature/list", "id": 7, "params": { "limit": 20 } }
{ "id": 7, "result": {
"data": [{
"name": "unified_exec",
"stage": "beta",
"displayName": "Unified exec",
"description": "Use the unified PTY-backed execution tool.",
"announcement": "Beta rollout for improved command execution reliability.",
"enabled": false,
"defaultEnabled": false
}],
"nextCursor": null
} }stage dapat berupa beta, underDevelopment, stable, deprecated, atau removed. Untuk flag non-beta, displayName, description, dan announcement dapat berupa null.
Memeriksa lingkungan eksekusi (eksperimental)
Gunakan environment/info untuk memeriksa lingkungan jarak jauh yang dikonfigurasi sebelum
memulai pekerjaan di sana. Metode ini memerlukan capabilities.experimentalApi = true.
{ "method": "environment/info", "id": 8, "params": { "environmentId": "devbox" } }
{ "id": 8, "result": {
"shell": { "name": "zsh", "path": "/bin/zsh" },
"cwd": "file:///workspace/project"
} }cwd dapat berupa null. Jika tersedia, nilainya adalah URI file: kanonis yang menggunakan
sintaks jalur asli lingkungan tersebut. ID lingkungan yang tidak dikenal serta kegagalan koneksi atau
protokol mengembalikan kesalahan permintaan.
Thread
thread/readmembaca thread tersimpan tanpa berlangganan; aturincludeTurnsuntuk menyertakan turn.thread/turns/listbersifat eksperimental dan menelusuri riwayat turn thread tersimpan per halaman tanpa melanjutkannya. GunakanitemsViewuntuk memilih apakah item turn dihilangkan, diringkas, atau dimuat sepenuhnya.thread/items/listbersifat eksperimental dan menelusuri item thread yang dipersistenkan per halaman, dengan opsi membatasinya pada satu turn.thread/listmendukung paginasi kursor beserta pemfilteranmodelProviders,sourceKinds,archived,isPinned,cwd,useStateDbOnly,searchTerm, danparentThreadIdatauancestorThreadIdyang eksperimental.thread/loaded/listmengembalikan ID thread yang saat ini berada dalam memori.thread/archivememindahkan log JSONL thread yang dipersistenkan ke direktori arsip dan mencoba mengarsipkan log thread turunan yang dibuat dan belum diarsipkan.thread/deletemenghapus secara permanen thread aktif atau arsip yang dipersistenkan beserta thread turunannya yang dibuat.thread/metadata/updatemenambal metadata thread tersimpan, termasukgitInfodanisPinnedyang dipersistenkan.thread/unsubscribemenghentikan langganan koneksi saat ini dari thread yang dimuat dan dapat memicuthread/closedsetelah masa tenggang tanpa aktivitas.thread/unarchivememulihkan rollout thread yang diarsipkan ke direktori sesi aktif.thread/compact/startmemicu pemadatan dan segera mengembalikan{}.thread/rollbacktidak digunakan lagi. Metode ini menghapus N turn terakhir dari konteks dalam memori dan mencatat penanda rollback dalam log JSONL thread yang dipersistenkan.thread/inject_itemsmenambahkan item Responses API mentah ke riwayat yang terlihat oleh model pada thread yang dimuat tanpa memulai turn pengguna.
Memulai atau melanjutkan thread
Mulai thread baru saat Anda memerlukan percakapan Codex baru.
{ "method": "thread/start", "id": 10, "params": {
"model": "gpt-5.6-terra",
"cwd": "/Users/me/project",
"approvalPolicy": "never",
"sandbox": "workspaceWrite",
"personality": "friendly",
"serviceName": "my_app_server_client"
} }
{ "id": 10, "result": {
"thread": {
"id": "thr_123",
"sessionId": "thr_123",
"preview": "",
"ephemeral": false,
"modelProvider": "openai",
"createdAt": 1730910000
}
} }
{ "method": "thread/started", "params": { "thread": { "id": "thr_123" } } }serviceName bersifat opsional. Atur saat Anda ingin app-server menandai metrik tingkat thread dengan nama layanan integrasi Anda.
thread/start, thread/resume, dan thread/fork mengembalikan
instructionSources, yaitu array jalur file instruksi yang dimuat. Setiap jalur menggunakan
sintaks absolut asli lingkungan sumbernya, termasuk untuk lingkungan
jarak jauh.
Klien eksperimental dapat mengatur historyMode pada thread/start ke "legacy"
(default) atau "paginated". Pembuatan thread dengan paginasi belum didukung
dan mengembalikan kesalahan JSON-RPC -32601. App-server dapat mencantumkan dan membaca ringkasan untuk
catatan berpaginasi yang ada, tetapi pembacaan riwayat lengkap, paginasi turn, dan pelanjutan
ditolak hingga riwayat berpaginasi didukung.
Klien beta yang ikut serta dalam capabilities.experimentalApi dapat meneruskan id
profil izin bernama dalam permissions sebagai pengganti field lama sandbox.
Jangan kirim permissions dan sandbox bersamaan. Gunakan
permissionProfile/list dengan cwd proyek untuk menemukan profil yang tersedia
dan apakah persyaratan terkelola mengizinkan masing-masing profil.
thread.sessionId mengidentifikasi root pohon sesi aktif saat ini. Thread root
menggunakan id thread-nya sendiri sebagai id sesi; thread hasil pencabangan mempertahankan id sesi
dari root asalnya. Klien harus membaca id sesi dari
thread.sessionId dan bukan menurunkannya dari id thread.
Untuk melanjutkan sesi tersimpan, panggil thread/resume dengan thread.id yang Anda catat sebelumnya. Bentuk respons sama dengan thread/start. Anda juga dapat meneruskan penggantian konfigurasi yang sama dengan yang didukung oleh thread/start, seperti personality:
{ "method": "thread/resume", "id": 11, "params": {
"threadId": "thr_123",
"personality": "friendly"
} }
{ "id": 11, "result": { "thread": { "id": "thr_123", "name": "Bug bash notes", "ephemeral": false } } }Melanjutkan thread tidak dengan sendirinya memperbarui thread.updatedAt (atau waktu modifikasi file rollout). Stempel waktu diperbarui saat Anda memulai turn.
Jika Anda menandai server MCP yang aktif sebagai required dalam konfigurasi dan server tersebut gagal diinisialisasi, thread/start dan thread/resume akan gagal alih-alih melanjutkan tanpanya.
dynamicTools pada thread/start adalah field eksperimental (memerlukan capabilities.experimentalApi = true). Codex mempersistenkan alat dinamis ini dalam metadata rollout thread dan memulihkannya pada thread/resume saat Anda tidak menyediakan alat dinamis baru.
Jika Anda melanjutkan dengan model yang berbeda dari model yang dicatat dalam rollout, Codex mengirim peringatan dan menerapkan instruksi peralihan model satu kali pada turn berikutnya.
Mengelola sasaran thread
Gunakan thread/goal/set, thread/goal/get, dan thread/goal/clear untuk mengelola
status sasaran terpersisten yang sama dengan yang ditampilkan oleh /goal di TUI.
{ "method": "thread/goal/set", "id": 13, "params": {
"threadId": "thr_123",
"objective": "Finish the migration and keep tests green",
"status": "active",
"tokenBudget": 40000
} }
{ "id": 13, "result": { "goal": {
"threadId": "thr_123",
"objective": "Finish the migration and keep tests green",
"status": "active",
"tokenBudget": 40000,
"tokensUsed": 0,
"timeUsedSeconds": 0
} } }
{ "method": "thread/goal/updated", "params": {
"threadId": "thr_123",
"goal": {
"threadId": "thr_123",
"objective": "Finish the migration and keep tests green",
"status": "active",
"tokenBudget": 40000,
"tokensUsed": 0,
"timeUsedSeconds": 0
}
} }Objektif sasaran tidak boleh kosong dan panjangnya maksimum 4.000 karakter. Memberikan
objektif baru akan mengganti sasaran dan mengatur ulang penghitungan penggunaan. Memberikan
objektif nonterminal saat ini, atau menghilangkan objective, akan memperbarui status atau anggaran token
sekaligus mempertahankan riwayat penggunaan.
Untuk mencabangkan dari sesi tersimpan, panggil thread/fork dengan thread.id. Tindakan ini membuat id thread baru dan mengirim notifikasi thread/started untuknya. Teruskan
lastTurnId untuk menyalin riwayat hingga dan termasuk turn tersebut serta menghilangkan turn
berikutnya:
{ "method": "thread/fork", "id": 12, "params": { "threadId": "thr_123", "lastTurnId": "turn_456" } }
{ "id": 12, "result": { "thread": { "id": "thr_456", "sessionId": "thr_123", "forkedFromId": "thr_123" } } }
{ "method": "thread/started", "params": { "thread": { "id": "thr_456" } } }App-server menolak lastTurnId yang sedang berlangsung. Jika Anda menghilangkan field tersebut saat
thread sumber berada di tengah turn, cabang mencatat penanda interupsi alih-alih
mempertahankan turn parsial tanpa penanda.
Teruskan ephemeral: true untuk membuat cabang dalam memori tanpa menambahkannya ke daftar
thread tersimpan:
{
"method": "thread/fork",
"id": 13,
"params": {
"threadId": "thr_123",
"ephemeral": true
}
}
{
"id": 13,
"result": {
"thread": {
"id": "thr_789",
"sessionId": "thr_789",
"forkedFromId": "thr_123",
"ephemeral": true
}
}
}Cabang sementara dari thread berpaginasi juga memerlukan excludeTurns: true. Field tersebut
bersifat eksperimental dan memerlukan capabilities.experimentalApi = true.
Jika judul thread yang ditampilkan kepada pengguna telah diatur, app-server menghidrasi thread.name pada respons thread/list, thread/read, thread/resume, thread/unarchive, dan thread/rollback. thread/start dan thread/fork dapat menghilangkan name (atau mengembalikan null) hingga judul diatur kemudian.
Membaca thread tersimpan (tanpa melanjutkan)
Gunakan thread/read saat Anda menginginkan data thread tersimpan tetapi tidak ingin melanjutkan thread atau berlangganan peristiwanya.
includeTurns- jikatrue, respons menyertakan turn thread; jikafalseatau dihilangkan, Anda hanya mendapatkan ringkasan thread.- Objek
threadyang dikembalikan menyertakanstatusruntime (notLoaded,idle,systemError, atauactivedenganactiveFlags).
{ "method": "thread/read", "id": 19, "params": { "threadId": "thr_123", "includeTurns": true } }
{ "id": 19, "result": { "thread": { "id": "thr_123", "name": "Bug bash notes", "ephemeral": false, "status": { "type": "notLoaded" }, "turns": [] } } }Tidak seperti thread/resume, thread/read tidak memuat thread ke dalam memori atau mengirim thread/started.
Mencantumkan turn thread
thread/turns/list bersifat eksperimental. Gunakan untuk menelusuri riwayat turn thread tersimpan per halaman tanpa melanjutkannya. Hasil secara default diurutkan dari yang terbaru agar klien dapat mengambil turn yang lebih lama dengan nextCursor. Respons juga menyertakan backwardsCursor; teruskan sebagai cursor dengan sortDirection: "asc" untuk mengambil turn yang lebih baru daripada item pertama dari halaman sebelumnya.
itemsView mengontrol jumlah data item turn yang disertakan dalam respons:
notLoadedmenghilangkan item.summarymengembalikan data item yang diringkas dan menjadi default jika dihilangkan.fullmengembalikan data item lengkap.
{ "method": "thread/turns/list", "id": 20, "params": {
"threadId": "thr_123",
"limit": 50,
"sortDirection": "desc",
"itemsView": "summary"
} }
{ "id": 20, "result": {
"data": [],
"nextCursor": "older-turns-cursor-or-null",
"backwardsCursor": "newer-turns-cursor-or-null"
} }thread/items/list juga bersifat eksperimental. Metode ini menelusuri item yang dipersistenkan per halaman tanpa
melanjutkan thread. Teruskan turnId untuk membatasi hasil pada satu turn, atau hilangkan
untuk menelusuri item di seluruh thread. Penyimpanan thread aktif harus mendukung
paginasi item; jika tidak, server mengembalikan kesalahan metode yang tidak didukung.
Mencantumkan thread (dengan paginasi & filter)
thread/list memungkinkan Anda merender UI riwayat. Hasil secara default diurutkan dari yang terbaru berdasarkan createdAt. Filter diterapkan sebelum paginasi. Teruskan kombinasi apa pun dari:
cursor- string opak dari respons sebelumnya; hilangkan untuk halaman pertama.limit- server menggunakan ukuran halaman yang wajar secara default jika tidak diatur.sortKey-created_at(default),updated_at, ataurecency_at.sortDirection-desc(default) atauasc.modelProviders- membatasi hasil pada penyedia tertentu; tidak diatur, null, atau array kosong akan menyertakan semua penyedia.sourceKinds- membatasi hasil pada sumber thread tertentu. Jika dihilangkan atau[], server secara default hanya menyertakan sumber interaktif:clidanvscode.archived- jikatrue, hanya mencantumkan thread yang diarsipkan. Jikafalseatau dihilangkan, mencantumkan thread yang tidak diarsipkan (default).isPinned- jika diberikan, hanya mengembalikan thread dengan status sematan terpersisten yang cocok. Hilangkan untuk mengembalikan thread yang disematkan dan tidak disematkan.cwd- membatasi hasil pada thread yang direktori kerja sesi saat ini sama persis dengan jalur ini, atau salah satu jalur dalam array. Jalur relatif diselesaikan dari direktori kerja proses app-server.useStateDbOnly- jikatrue, mengembalikan hasil basis data status tanpa memindai log thread JSONL untuk memperbaiki metadata. Hilangkan atau teruskanfalseuntuk perilaku pindai-dan-perbaiki default.searchTerm- membatasi hasil pada thread yang judul ekstraknya berisi fragmen teks peka huruf besar-kecil ini.parentThreadId- membatasi hasil pada thread anak langsung dari thread induk yang diberikan. Filter ini eksperimental dan memerlukancapabilities.experimentalApi = true.ancestorThreadId- membatasi hasil pada turunan yang dibuat dari thread yang diberikan pada kedalaman berapa pun. Filter ini eksperimental dan memerlukancapabilities.experimentalApi = true; jangan gabungkan denganparentThreadId.
sourceKinds menerima nilai berikut:
clivscodeexecappServersubAgentsubAgentReviewsubAgentCompactsubAgentThreadSpawnsubAgentOtherunknown
Contoh:
{ "method": "thread/list", "id": 20, "params": {
"cursor": null,
"limit": 25,
"sortKey": "created_at"
} }
{ "id": 20, "result": {
"data": [
{ "id": "thr_a", "preview": "Create a TUI", "ephemeral": false, "isPinned": true, "modelProvider": "openai", "createdAt": 1730831111, "updatedAt": 1730831111, "name": "TUI prototype", "status": { "type": "notLoaded" } },
{ "id": "thr_b", "preview": "Fix tests", "ephemeral": false, "isPinned": false, "modelProvider": "openai", "createdAt": 1730750000, "updatedAt": 1730750000, "status": { "type": "notLoaded" } }
],
"nextCursor": "opaque-token-or-null"
} }Jika nextCursor adalah null, Anda telah mencapai halaman terakhir.
Memperbarui metadata thread tersimpan
Gunakan thread/metadata/update untuk menambal metadata thread tersimpan tanpa melanjutkan
thread. Atur isPinned untuk menyematkan atau melepas sematan thread, atau perbarui gitInfo untuk mengubah
metadata Git yang dipersistenkan. Field yang dihilangkan tetap tidak berubah; null eksplisit menghapus
nilai metadata Git yang tersimpan.
{ "method": "thread/metadata/update", "id": 21, "params": {
"threadId": "thr_123",
"isPinned": true,
"gitInfo": { "branch": "feature/sidebar-pr" }
} }
{ "id": 21, "result": {
"thread": {
"id": "thr_123",
"isPinned": true,
"gitInfo": { "sha": null, "branch": "feature/sidebar-pr", "originUrl": null }
}
} }Melacak perubahan status thread
thread/status/changed dikirim setiap kali status runtime thread yang dimuat berubah. Payload menyertakan threadId dan status baru.
{
"method": "thread/status/changed",
"params": {
"threadId": "thr_123",
"status": { "type": "active", "activeFlags": ["waitingOnApproval"] }
}
}Mencantumkan thread yang dimuat
thread/loaded/list mengembalikan ID thread yang saat ini dimuat dalam memori.
{ "method": "thread/loaded/list", "id": 21 }
{ "id": 21, "result": { "data": ["thr_123", "thr_456"] } }Menghentikan langganan dari thread yang dimuat
thread/unsubscribe menghapus langganan koneksi saat ini dari suatu thread. Status respons adalah salah satu dari:
unsubscribedjika koneksi sebelumnya berlangganan dan kini telah dihapus.notSubscribedjika koneksi tidak berlangganan thread tersebut.notLoadedjika thread tidak dimuat.
Jika ini pelanggan terakhir, server tetap memuat thread hingga thread tidak memiliki pelanggan dan tidak memiliki aktivitas selama 30 menit. Saat masa tenggang berakhir, app-server membongkar thread dan mengirim transisi thread/status/changed ke notLoaded beserta thread/closed.
{ "method": "thread/unsubscribe", "id": 22, "params": { "threadId": "thr_123" } }
{ "id": 22, "result": { "status": "unsubscribed" } }Jika thread kemudian kedaluwarsa:
{ "method": "thread/status/changed", "params": {
"threadId": "thr_123",
"status": { "type": "notLoaded" }
} }
{ "method": "thread/closed", "params": { "threadId": "thr_123" } }Mengarsipkan thread
Gunakan thread/archive untuk memindahkan log thread yang dipersistenkan (disimpan sebagai file JSONL pada disk) ke direktori sesi yang diarsipkan. Mengarsipkan thread juga akan mencoba mengarsipkan thread turunan yang dibuat dan belum diarsipkan.
{ "method": "thread/archive", "id": 22, "params": { "threadId": "thr_b" } }
{ "id": 22, "result": {} }
{ "method": "thread/archived", "params": { "threadId": "thr_b" } }
{ "method": "thread/archived", "params": { "threadId": "thr_child" } }Thread yang diarsipkan tidak akan muncul dalam panggilan mendatang ke thread/list kecuali Anda meneruskan archived: true. Server mengirim satu notifikasi thread/archived untuk setiap thread yang benar-benar diarsipkannya; jika turunan yang dibuat tidak dapat diarsipkan, permintaan tetap dapat berhasil tanpa notifikasi pengarsipan untuk turunan tersebut.
Menghapus thread
Gunakan thread/delete untuk menghapus secara permanen thread aktif atau arsip yang dipersistenkan
beserta thread turunannya yang dibuat. Server menghapus file rollout yang ada dan
metadata terkait sebelum mengembalikan keberhasilan; file rollout yang tidak ditemukan
dianggap sudah dihapus. Thread root sementara tidak dapat dihapus.
{ "method": "thread/delete", "id": 23, "params": { "threadId": "thr_b" } }
{ "id": 23, "result": {} }
{ "method": "thread/deleted", "params": { "threadId": "thr_b" } }
{ "method": "thread/deleted", "params": { "threadId": "thr_child" } }Membatalkan pengarsipan thread
Gunakan thread/unarchive untuk memindahkan kembali rollout thread yang diarsipkan ke direktori sesi aktif.
{ "method": "thread/unarchive", "id": 24, "params": { "threadId": "thr_b" } }
{ "id": 24, "result": { "thread": { "id": "thr_b", "name": "Bug bash notes" } } }
{ "method": "thread/unarchived", "params": { "threadId": "thr_b" } }Memicu pemadatan thread
Gunakan thread/compact/start untuk memicu pemadatan riwayat secara manual bagi sebuah thread. Permintaan segera mengembalikan {}.
App-server mengirim progres sebagai notifikasi standar turn/* dan item/* pada threadId yang sama, termasuk siklus hidup item contextCompaction (item/started lalu item/completed).
{ "method": "thread/compact/start", "id": 25, "params": { "threadId": "thr_b" } }
{ "id": 25, "result": {} }Menjalankan perintah shell thread
Gunakan thread/shellCommand untuk perintah shell yang dimulai pengguna dan merupakan bagian dari sebuah thread. Permintaan segera mengembalikan {}, sementara progres dialirkan melalui notifikasi standar turn/* dan item/*.
API ini berjalan di luar sandbox dengan akses penuh dan tidak mewarisi kebijakan sandbox thread. Klien sebaiknya hanya mengeksposnya untuk perintah yang secara eksplisit dimulai pengguna.
Jika thread sudah memiliki turn aktif, perintah berjalan sebagai tindakan tambahan pada turn tersebut dan output yang telah diformat disisipkan ke aliran pesan turn. Jika thread sedang tidak aktif, app-server memulai turn mandiri untuk perintah shell tersebut.
{ "method": "thread/shellCommand", "id": 26, "params": { "threadId": "thr_b", "command": "git status --short" } }
{ "id": 26, "result": {} }Membersihkan terminal latar belakang
Gunakan thread/backgroundTerminals/clean untuk menghentikan semua terminal latar belakang yang sedang berjalan dan terkait dengan sebuah thread. Metode ini bersifat eksperimental dan memerlukan capabilities.experimentalApi = true.
{ "method": "thread/backgroundTerminals/clean", "id": 27, "params": { "threadId": "thr_b" } }
{ "id": 27, "result": {} }Gunakan thread/backgroundTerminals/list untuk memeriksa terminal latar belakang yang sedang berjalan
bagi thread yang telah dimuat. Permintaan mendukung paginasi standar cursor dan limit,
dan processId yang dikembalikan adalah ID proses app-server. Metode ini
bersifat eksperimental dan memerlukan capabilities.experimentalApi = true:
{ "method": "thread/backgroundTerminals/list", "id": 28, "params": { "threadId": "thr_b" } }
{ "id": 28, "result": { "data": [
{
"itemId": "item_456",
"processId": "42",
"command": "python3 -m http.server",
"cwd": "/workspace",
"osPid": null,
"cpuPercent": null,
"rssKb": null
}
], "nextCursor": null } }Gunakan thread/backgroundTerminals/terminate dengan processId tersebut untuk menghentikan satu
terminal latar belakang. Metode ini bersifat eksperimental dan memerlukan
capabilities.experimentalApi = true:
{ "method": "thread/backgroundTerminals/terminate", "id": 29, "params": { "threadId": "thr_b", "processId": "42" } }
{ "id": 29, "result": { "terminated": true } }Mengembalikan turn terbaru
thread/rollback sudah tidak direkomendasikan dan akan dihapus. Metode ini menghapus
numTurns entri terakhir dari konteks dalam memori dan menyimpan penanda rollback dalam
log rollout. thread yang dikembalikan mencakup turns yang telah diisi setelah
rollback.
{ "method": "thread/rollback", "id": 30, "params": { "threadId": "thr_b", "numTurns": 1 } }
{ "id": 30, "result": { "thread": { "id": "thr_b", "name": "Bug bash notes", "ephemeral": false } } }Turn
Kolom input menerima daftar item:
{ "type": "text", "text": "Explain this diff" }{ "type": "image", "url": "https://.../design.png" }{ "type": "localImage", "path": "/tmp/screenshot.png" }
Anda dapat mengganti pengaturan konfigurasi per turn (model, upaya, kepribadian, cwd, kebijakan sandbox, ringkasan). Jika ditentukan, pengaturan ini menjadi nilai default bagi turn berikutnya pada thread yang sama. outputSchema hanya berlaku untuk turn saat ini. Untuk sandboxPolicy.type = "externalSandbox", atur networkAccess ke restricted atau enabled; untuk workspaceWrite, networkAccess tetap berupa boolean.
Untuk turn/start.collaborationMode, settings.developer_instructions: null berarti "gunakan instruksi bawaan untuk mode yang dipilih", bukan menghapus instruksi mode.
Akses baca sandbox (ReadOnlyAccess)
sandboxPolicy mendukung kontrol akses baca eksplisit:
readOnly:accessopsional ({ "type": "fullAccess" }secara default, atau root yang dibatasi).workspaceWrite:readOnlyAccessopsional ({ "type": "fullAccess" }secara default, atau root yang dibatasi).
Bentuk akses baca terbatas:
{
"type": "restricted",
"includePlatformDefaults": true,
"readableRoots": ["/Users/me/shared-read-only"]
}Di macOS, includePlatformDefaults: true menambahkan kebijakan Seatbelt default platform yang telah dikurasi untuk sesi dengan akses baca terbatas. Hal ini meningkatkan kompatibilitas alat tanpa mengizinkan seluruh /System secara luas.
Contoh:
{ "type": "readOnly", "access": { "type": "fullAccess" } }{
"type": "workspaceWrite",
"writableRoots": ["/Users/me/project"],
"readOnlyAccess": {
"type": "restricted",
"includePlatformDefaults": true,
"readableRoots": ["/Users/me/shared-read-only"]
},
"networkAccess": false
}Memulai turn
{ "method": "turn/start", "id": 30, "params": {
"threadId": "thr_123",
"input": [ { "type": "text", "text": "Run tests" } ],
"cwd": "/Users/me/project",
"approvalPolicy": "unlessTrusted",
"sandboxPolicy": {
"type": "workspaceWrite",
"writableRoots": ["/Users/me/project"],
"networkAccess": true
},
"model": "gpt-5.6-terra",
"effort": "medium",
"summary": "concise",
"personality": "friendly",
"outputSchema": {
"type": "object",
"properties": { "answer": { "type": "string" } },
"required": ["answer"],
"additionalProperties": false
}
} }
{ "id": 30, "result": { "turn": { "id": "turn_456", "status": "inProgress", "items": [], "error": null } } }Menyisipkan item ke dalam thread
Gunakan thread/inject_items untuk menambahkan item Responses API siap pakai ke riwayat prompt thread yang telah dimuat tanpa memulai turn pengguna. Item ini dipersistenkan ke rollout dan disertakan dalam permintaan model berikutnya.
{ "method": "thread/inject_items", "id": 31, "params": {
"threadId": "thr_123",
"items": [
{
"type": "message",
"role": "assistant",
"content": [{ "type": "output_text", "text": "Previously computed context." }]
}
]
} }
{ "id": 31, "result": {} }Mengarahkan turn aktif
Gunakan turn/steer untuk menambahkan input pengguna ke turn aktif yang sedang berlangsung.
- Sertakan
expectedTurnId; nilainya harus cocok dengan ID turn aktif. - Permintaan gagal jika tidak ada turn aktif pada thread.
turn/steertidak mengirim notifikasiturn/startedbaru.turn/steertidak menerima penggantian tingkat turn (model,cwd,sandboxPolicy, atauoutputSchema).
{ "method": "turn/steer", "id": 32, "params": {
"threadId": "thr_123",
"input": [ { "type": "text", "text": "Actually focus on failing tests first." } ],
"expectedTurnId": "turn_456"
} }
{ "id": 32, "result": { "turnId": "turn_456" } }Memulai turn (memanggil skill)
Panggil skill secara eksplisit dengan menyertakan $<skill-name> dalam input teks dan menambahkan item input skill bersamanya.
{ "method": "turn/start", "id": 33, "params": {
"threadId": "thr_123",
"input": [
{ "type": "text", "text": "$skill-creator Add a new skill for triaging flaky CI and include step-by-step usage." },
{ "type": "skill", "name": "skill-creator", "path": "/Users/me/.codex/skills/skill-creator/SKILL.md" }
]
} }
{ "id": 33, "result": { "turn": { "id": "turn_457", "status": "inProgress", "items": [], "error": null } } }Menginterupsi turn
{ "method": "turn/interrupt", "id": 31, "params": { "threadId": "thr_123", "turnId": "turn_456" } }
{ "id": 31, "result": {} }Jika berhasil, turn selesai dengan status: "interrupted".
Peninjauan
review/start menjalankan peninjau Codex untuk sebuah thread dan mengalirkan item peninjauan. Target mencakup:
uncommittedChangesbaseBranch(diff terhadap sebuah branch)commit(meninjau commit tertentu)custom(instruksi berformat bebas)
Gunakan delivery: "inline" (default) untuk menjalankan peninjauan pada thread yang ada, atau delivery: "detached" untuk membuat fork berupa thread peninjauan baru.
Contoh permintaan/respons:
{ "method": "review/start", "id": 40, "params": {
"threadId": "thr_123",
"delivery": "inline",
"target": { "type": "commit", "sha": "1234567deadbeef", "title": "Polish tui colors" }
} }
{ "id": 40, "result": {
"turn": {
"id": "turn_900",
"status": "inProgress",
"items": [
{ "type": "userMessage", "id": "turn_900", "content": [ { "type": "text", "text": "Review commit 1234567: Polish tui colors" } ] }
],
"error": null
},
"reviewThreadId": "thr_123"
} }Untuk peninjauan terpisah, gunakan "delivery": "detached". Bentuk responsnya sama, tetapi reviewThreadId akan menjadi ID thread peninjauan baru (berbeda dari threadId asli). Server juga mengirim notifikasi thread/started untuk thread baru tersebut sebelum mengalirkan turn peninjauan.
Codex mengalirkan notifikasi turn/started yang biasa, diikuti oleh item/started dengan item enteredReviewMode:
{
"method": "item/started",
"params": {
"item": {
"type": "enteredReviewMode",
"id": "turn_900",
"review": "current changes"
}
}
}Saat peninjau selesai, server mengirim item/started dan item/completed yang berisi item exitedReviewMode dengan teks peninjauan akhir:
{
"method": "item/completed",
"params": {
"item": {
"type": "exitedReviewMode",
"id": "turn_900",
"review": "Looks solid overall..."
}
}
}Gunakan notifikasi ini untuk merender output peninjau di klien Anda.
Eksekusi proses
process/* adalah API kontrol proses eksplisit yang bersifat eksperimental. API ini memerlukan
capabilities.experimentalApi = true dan berjalan di luar sandbox Codex. Gunakan
hanya jika klien Anda sengaja mengekspos kontrol proses lokal tanpa
sandbox.
Mulai proses dengan process/spawn dan berikan processHandle, lalu gunakan
handle tersebut untuk permintaan stdin, pengubahan ukuran, dan penghentian. Output dialirkan melalui
notifikasi process/outputDelta dan penyelesaian dialirkan melalui
process/exited.
{ "method": "process/spawn", "id": 48, "params": {
"command": ["python3", "-m", "pytest", "-q"],
"processHandle": "pytest-1",
"cwd": "/Users/me/project",
"tty": true
} }
{ "id": 48, "result": {} }
{ "method": "process/outputDelta", "params": {
"processHandle": "pytest-1",
"stream": "stdout",
"deltaBase64": "Li4u"
} }
{ "method": "process/exited", "params": {
"processHandle": "pytest-1",
"exitCode": 0
} }Gunakan process/writeStdin dengan deltaBase64, closeStdin, atau keduanya untuk mengirim
input. Gunakan process/resizePty untuk peristiwa pengubahan ukuran PTY dan process/kill untuk
menghentikan proses yang sedang berjalan.
Eksekusi perintah
command/exec menjalankan satu perintah (array argv) di dalam sandbox server tanpa membuat thread.
{ "method": "command/exec", "id": 50, "params": {
"command": ["ls", "-la"],
"cwd": "/Users/me/project",
"sandboxPolicy": { "type": "workspaceWrite" },
"timeoutMs": 10000
} }
{ "id": 50, "result": { "exitCode": 0, "stdout": "...", "stderr": "" } }Gunakan sandboxPolicy.type = "externalSandbox" jika Anda sudah menjalankan proses server dalam sandbox dan ingin Codex melewati penerapan sandbox-nya sendiri. Untuk mode sandbox eksternal, atur networkAccess ke restricted (default) atau enabled. Untuk readOnly dan workspaceWrite, gunakan struktur opsional access / readOnlyAccess yang sama seperti ditunjukkan di atas.
Catatan:
- Server menolak array
commandkosong. sandboxPolicymenerima bentuk yang sama dengan yang digunakan olehturn/start(misalnya,dangerFullAccess,readOnly,workspaceWrite,externalSandbox).- Jika dihilangkan,
timeoutMskembali ke nilai default server. - Atur
tty: trueuntuk sesi berbasis PTY, dan gunakanprocessIdjika Anda berencana menindaklanjutinya dengancommand/exec/write,command/exec/resize, ataucommand/exec/terminate. - Atur
streamStdoutStderr: trueuntuk menerima notifikasicommand/exec/outputDeltasaat perintah berjalan.
Membaca persyaratan admin (configRequirements/read)
Gunakan configRequirements/read untuk memeriksa persyaratan admin efektif yang dimuat dari requirements.toml dan/atau MDM.
{ "method": "configRequirements/read", "id": 52, "params": {} }
{ "id": 52, "result": {
"requirements": {
"allowedApprovalPolicies": ["onRequest", "unlessTrusted"],
"allowedSandboxModes": ["readOnly", "workspaceWrite"],
"featureRequirements": {
"personality": true,
"unified_exec": false
},
"network": {
"enabled": true,
"allowedDomains": ["api.openai.com"],
"allowUnixSockets": ["/tmp/example.sock"],
"dangerouslyAllowAllUnixSockets": false
}
}
} }result.requirements adalah null jika tidak ada persyaratan yang dikonfigurasi. Lihat dokumentasi tentang requirements.toml untuk detail mengenai kunci dan nilai yang didukung.
Penyiapan sandbox Windows (windowsSandbox/setupStart)
Klien Windows khusus dapat memicu penyiapan sandbox secara asinkron agar tidak terblokir oleh pemeriksaan saat startup.
{ "method": "windowsSandbox/setupStart", "id": 53, "params": { "mode": "elevated" } }
{ "id": 53, "result": { "started": true } }App-server memulai penyiapan di latar belakang dan kemudian mengirim notifikasi penyelesaian:
{
"method": "windowsSandbox/setupCompleted",
"params": { "mode": "elevated", "success": true, "error": null }
}Mode:
elevated- menjalankan jalur penyiapan sandbox Windows dengan hak akses yang ditingkatkan.unelevated- menjalankan jalur penyiapan/pemeriksaan awal versi lama.
Sistem file
API sistem file v2 beroperasi pada path absolut. Gunakan fs/watch saat klien perlu membatalkan validitas status UI setelah file atau direktori berubah.
{ "method": "fs/watch", "id": 54, "params": {
"watchId": "0195ec6b-1d6f-7c2e-8c7a-56f2c4a8b9d1",
"path": "/Users/me/project/.git/HEAD"
} }
{ "id": 54, "result": { "path": "/Users/me/project/.git/HEAD" } }
{ "method": "fs/changed", "params": {
"watchId": "0195ec6b-1d6f-7c2e-8c7a-56f2c4a8b9d1",
"changedPaths": ["/Users/me/project/.git/HEAD"]
} }
{ "method": "fs/unwatch", "id": 55, "params": {
"watchId": "0195ec6b-1d6f-7c2e-8c7a-56f2c4a8b9d1"
} }
{ "id": 55, "result": {} }Pemantauan file mengirim fs/changed untuk path file tersebut, termasuk pembaruan yang dikirim melalui operasi penggantian atau penggantian nama.
Peristiwa
Notifikasi peristiwa merupakan aliran yang dimulai server untuk siklus hidup thread, siklus hidup turn, dan item di dalamnya. Setelah Anda memulai atau melanjutkan thread, terus baca aliran transport aktif untuk notifikasi thread/started, thread/archived, thread/unarchived, thread/closed, thread/status/changed, turn/*, item/*, dan serverRequest/resolved.
Menonaktifkan notifikasi
Klien dapat menyembunyikan notifikasi tertentu per koneksi dengan mengirim nama metode persis dalam initialize.params.capabilities.optOutNotificationMethods.
- Hanya kecocokan persis:
item/agentMessage/deltahanya menyembunyikan metode tersebut. - Nama metode yang tidak dikenal diabaikan.
- Berlaku untuk
thread/*,turn/*,item/*, dan notifikasi v2 terkait saat ini. - Tidak berlaku untuk permintaan, respons, atau kesalahan.
Peristiwa pencarian file fuzzy (eksperimental)
API sesi pencarian file fuzzy mengirim notifikasi per kueri:
fuzzyFileSearch/sessionUpdated-{ sessionId, query, files }dengan kecocokan saat ini untuk kueri aktif.fuzzyFileSearch/sessionCompleted-{ sessionId }setelah pengindeksan dan pencocokan untuk kueri tersebut selesai.
Peristiwa peringatan
configWarning-{ summary, details?, path?, range? }untuk masalah konfigurasi atau inisialisasi yang dapat dipulihkan.warning-{ threadId?, message }untuk peringatan runtime yang tidak fatal.
Peristiwa penyiapan sandbox Windows
windowsSandbox/setupCompleted-{ mode, success, error }yang dikirim setelah permintaanwindowsSandbox/setupStartselesai.
Peristiwa turn
turn/started-{ turn }dengan ID turn,itemskosong, danstatus: "inProgress".turn/completed-{ turn }denganturn.statusberupacompleted,interrupted, ataufailed; kegagalan membawa{ error: { message, codexErrorInfo?, additionalDetails? } }.turn/diff/updated-{ threadId, turnId, diff }dengan unified diff gabungan terbaru untuk setiap perubahan file dalam turn.turn/plan/updated-{ turnId, explanation?, plan }setiap kali agen membagikan atau mengubah rencananya; setiap entriplanadalah{ step, status }denganstatusberupapending,inProgress, ataucompleted.hook/starteddanhook/completed-{ threadId, turnId?, run }saat hook siklus hidup dimulai dan ketika ringkasan eksekusi akhirnya tersedia.model/safetyBuffering/updated-{ threadId, turnId, model, useCases, reasons, showBufferingUi, fasterModel }saat respons memasuki buffering keamanan sementara.model/rerouted-{ threadId, turnId, fromModel, toModel, reason }saat layanan merutekan permintaan ke model lain.model/verification-{ threadId, turnId, verifications }saat layanan memerlukan verifikasi akun tambahan.thread/tokenUsage/updated- pembaruan penggunaan untuk thread aktif.
turn/diff/updated dan turn/plan/updated saat ini menyertakan array items kosong meskipun peristiwa item dialirkan. Gunakan notifikasi item/* sebagai sumber kebenaran untuk item turn.
Item
ThreadItem adalah tagged union yang dibawa dalam respons turn dan notifikasi item/*. Jenis item umum mencakup:
userMessage-{id, content}dengancontentberupa daftar input pengguna (text,image, ataulocalImage).agentMessage-{id, text, phase?}yang berisi balasan agen yang telah diakumulasi. Jika ada,phasemenggunakan nilai wire Responses API (commentary,final_answer).plan-{id, text}yang berisi teks rencana yang diusulkan dalam mode rencana. Perlakukan itemplanterakhir dariitem/completedsebagai sumber otoritatif.reasoning-{id, summary, content}dengansummarymenyimpan ringkasan penalaran yang dialirkan dancontentmenyimpan blok penalaran mentah.commandExecution-{id, command, cwd, status, commandActions, aggregatedOutput?, exitCode?, durationMs?}.fileChange-{id, changes, status}yang menjelaskan pengeditan yang diusulkan;changesmencantumkan{path, kind, diff}.mcpToolCall-{id, server, tool, status, arguments, appContext?, pluginId?, result?, error?}. Untuk aplikasi MCP tepercaya,appContextdapat menyertakanconnectorId,linkId,resourceUri,appName,templateId, dan konektor stabilactionName. Item lama yang dipersistenkan dapat tidak menyertakan metadata yang lebih baru. GunakanappContext.resourceUrisebagai penggantimcpAppResourceUritingkat atas yang sudah tidak direkomendasikan.dynamicToolCall-{id, tool, arguments, status, contentItems?, success?, durationMs?}untuk pemanggilan alat dinamis yang dijalankan klien.collabToolCall-{id, tool, status, senderThreadId, receiverThreadId?, newThreadId?, prompt?, agentStatus?}.webSearch-{id, query, action?}untuk permintaan pencarian web yang dibuat oleh agen.imageView-{id, path}yang dikirim saat agen memanggil alat penampil gambar.enteredReviewMode-{id, review}yang dikirim saat peninjau mulai bekerja.exitedReviewMode-{id, review}yang dikirim saat peninjau selesai.contextCompaction-{id}yang dikirim saat Codex memadatkan riwayat percakapan.
Untuk webSearch.action, tindakan type dapat berupa search (query?, queries?), openPage (url?), atau findInPage (url?, pattern?).
App-server tidak lagi merekomendasikan notifikasi lama thread/compacted; gunakan item contextCompaction sebagai gantinya.
Semua item mengirim dua peristiwa siklus hidup bersama:
item/started- mengirimitemlengkap saat unit kerja baru dimulai;item.idcocok denganitemIdyang digunakan oleh delta.item/completed- mengirimitemakhir setelah pekerjaan selesai; perlakukan ini sebagai status otoritatif.
Delta item
item/agentMessage/delta- menambahkan teks yang dialirkan untuk pesan agen.item/plan/delta- mengalirkan teks rencana yang diusulkan. Itemplanakhir mungkin tidak sama persis dengan gabungan delta.item/reasoning/summaryTextDelta- mengalirkan ringkasan penalaran yang mudah dibaca;summaryIndexbertambah saat bagian ringkasan baru dibuka.item/reasoning/summaryPartAdded- menandai batas antara bagian ringkasan penalaran.item/reasoning/textDelta- mengalirkan teks penalaran mentah (jika didukung oleh model).item/commandExecution/outputDelta- mengalirkan stdout/stderr untuk sebuah perintah; tambahkan delta secara berurutan.item/fileChange/outputDelta- notifikasi kompatibilitas untuk output teksapply_patchlama yang sudah tidak direkomendasikan. Versi app-server saat ini tidak lagi mengirimnya; gunakan itemfileChangedanturn/diff/updatedsebagai gantinya.
Kesalahan
Jika turn gagal, server mengirim peristiwa error dengan { error: { message, codexErrorInfo?, additionalDetails? } }, lalu menyelesaikan turn dengan status: "failed". Jika status HTTP upstream tersedia, status tersebut muncul dalam codexErrorInfo.httpStatusCode.
Nilai codexErrorInfo yang umum mencakup:
ContextWindowExceededUsageLimitExceededHttpConnectionFailed(kesalahan upstream 4xx/5xx)ResponseStreamConnectionFailedResponseStreamDisconnectedResponseTooManyFailedAttemptsBadRequest,Unauthorized,SandboxError,InternalServerError,Other
Jika status HTTP upstream tersedia, server meneruskannya dalam httpStatusCode pada varian codexErrorInfo yang relevan.
Persetujuan
Bergantung pada pengaturan Codex pengguna, eksekusi perintah dan perubahan file mungkin memerlukan persetujuan. App-server mengirim permintaan JSON-RPC yang dimulai server kepada klien, lalu klien merespons dengan payload keputusan.
Keputusan eksekusi perintah:
accept,acceptForSession,decline,cancel, atau{ "acceptWithExecpolicyAmendment": { "execpolicy_amendment": ["cmd", "..."] } }.Keputusan perubahan file:
accept,acceptForSession,decline,cancel.Permintaan menyertakan
threadIddanturnId- gunakan keduanya untuk membatasi status UI ke percakapan aktif.Server melanjutkan atau menolak pekerjaan dan mengakhiri item dengan
item/completed.
Persetujuan eksekusi perintah
Urutan pesan:
item/startedmenampilkan itemcommandExecutionyang menunggu dengancommand,cwd, dan kolom lainnya.item/commandExecution/requestApprovalmenyertakanitemId,threadId,turnId,reasonopsional,commandopsional,cwdopsional,commandActionsopsional,proposedExecpolicyAmendmentopsional,networkApprovalContextopsional, danavailableDecisionsopsional. Jikainitialize.params.capabilities.experimentalApi = true, payload juga dapat menyertakanadditionalPermissionseksperimental yang menjelaskan akses sandbox per perintah yang diminta. Setiap path sistem file di dalamadditionalPermissionsbersifat absolut pada wire.- Klien merespons dengan salah satu keputusan persetujuan eksekusi perintah di atas.
serverRequest/resolvedmengonfirmasi bahwa permintaan yang menunggu telah dijawab atau dihapus.item/completedmengembalikan itemcommandExecutionakhir denganstatus: completed | failed | declined.
Jika networkApprovalContext ada, prompt tersebut ditujukan untuk akses jaringan terkelola (bukan persetujuan perintah shell umum). Skema v2 saat ini mengekspos target host dan protocol; klien sebaiknya merender prompt khusus jaringan dan tidak mengandalkan command sebagai pratinjau perintah shell yang bermakna bagi pengguna.
Codex mengelompokkan prompt persetujuan jaringan serentak berdasarkan tujuan (host, protokol, dan port). Karena itu, app-server dapat mengirim satu prompt yang membuka blokir beberapa permintaan dalam antrean ke tujuan yang sama, sedangkan port berbeda pada host yang sama diperlakukan secara terpisah.
Persetujuan perubahan file
Urutan pesan:
item/startedmengirim itemfileChangedengan usulanchangesdanstatus: "inProgress".item/fileChange/requestApprovalmenyertakanitemId,threadId,turnId,reasonopsional, dangrantRootopsional.- Klien merespons dengan salah satu keputusan persetujuan perubahan file di atas.
serverRequest/resolvedmengonfirmasi bahwa permintaan yang menunggu telah dijawab atau dihapus.item/completedmengembalikan itemfileChangeakhir denganstatus: completed | failed | declined.
tool/requestUserInput
Saat klien merespons item/tool/requestUserInput, app-server mengirim serverRequest/resolved dengan { threadId, requestId }. Jika permintaan yang menunggu dihapus karena turn dimulai, turn selesai, atau turn diinterupsi sebelum klien menjawab, server mengirim notifikasi yang sama untuk pembersihan tersebut.
Parameter permintaan menyertakan autoResolutionMs sebagai batas waktu milidetik berupa bilangan bulat atau
null. Jika ada, klien host dapat menyelesaikan prompt secara otomatis setelah
interval tersebut apabila pengguna tidak menjawab.
Permintaan izin
Alat bawaan request_permissions mengirim
item/permissions/requestApproval dengan threadId, turnId, itemId,
environmentId, cwd, reason opsional, dan izin jaringan atau sistem file
yang diminta. Respons dengan permissions yang hanya berisi subset yang diberikan.
Atur scope ke "session" untuk mempertahankan pemberian izin bagi turn berikutnya dalam
sesi yang sama; hilangkan atau gunakan "turn" untuk pemberian izin yang cakupannya terbatas pada turn. Izin yang
tidak diminta akan diabaikan.
Permintaan elisitasi server MCP
Server MCP dapat menginterupsi turn dengan mcpServer/elicitation/request. Permintaan
menyertakan threadId, turnId opsional, serverName, dan salah satu
bentuk permintaan berikut:
mode: "form"ataumode: "openai/form", denganmessagedanrequestedSchema.mode: "url", denganmessage,url, danelicitationId.
Respons dengan action: "accept" dan content yang diminta, atau dengan
action: "decline" atau "cancel" dan content: null. App-server kemudian mengirim
serverRequest/resolved. Untuk menerima varian openai/form, ikut serta dengan
initialize.params.capabilities.mcpServerOpenaiFormElicitation.
Pemanggilan alat dinamis (eksperimental)
dynamicTools pada thread/start serta alur permintaan atau respons item/tool/call yang terkait merupakan API eksperimental.
Nama alat dinamis dan nama namespace harus mengikuti batasan penamaan Responses API. Hindari nama namespace khusus yang digunakan oleh alat bawaan Codex.
Saat alat dinamis dipanggil selama turn, app-server mengirim:
item/starteddenganitem.type = "dynamicToolCall",status = "inProgress", sertatooldanarguments.item/tool/callsebagai permintaan server kepada klien.- Payload respons klien dengan item konten yang dikembalikan.
item/completeddenganitem.type = "dynamicToolCall",statusakhir, serta setiap nilaicontentItemsatausuccessyang dikembalikan.
Persetujuan pemanggilan alat MCP (aplikasi)
Pemanggilan alat aplikasi (konektor) juga dapat memerlukan persetujuan. Jika pemanggilan alat aplikasi memiliki efek samping, server dapat meminta persetujuan dengan tool/requestUserInput dan opsi seperti Terima, Tolak, dan Batal. Anotasi alat yang bersifat destruktif selalu memicu persetujuan meskipun alat tersebut juga mengiklankan petunjuk dengan hak akses lebih rendah. Jika pengguna menolak atau membatalkan, item mcpToolCall terkait selesai dengan kesalahan tanpa menjalankan alat.
Skill
Panggil skill dengan menyertakan $<skill-name> dalam input teks pengguna. Tambahkan item input skill (direkomendasikan) agar server menyisipkan instruksi skill lengkap, bukan mengandalkan model untuk menemukan namanya.
{
"method": "turn/start",
"id": 101,
"params": {
"threadId": "thread-1",
"input": [
{
"type": "text",
"text": "$skill-creator Add a new skill for triaging flaky CI."
},
{
"type": "skill",
"name": "skill-creator",
"path": "/Users/me/.codex/skills/skill-creator/SKILL.md"
}
]
}
}Jika Anda menghilangkan item skill, model tetap akan mengurai penanda $<skill-name> dan mencoba menemukan skill, yang dapat menambah latensi.
Contoh:
$skill-creator Add a new skill for triaging flaky CI and include step-by-step usage.Gunakan skills/list untuk mengambil skill yang tersedia (secara opsional dibatasi oleh cwds, dengan forceReload). Anda juga dapat menyertakan perCwdExtraUserRoots untuk memindai path absolut tambahan sebagai cakupan user bagi nilai cwd tertentu. App-server mengabaikan entri yang cwd-nya tidak ada dalam cwds. skills/list dapat menggunakan kembali hasil cache per cwd; atur forceReload: true untuk memuat ulang dari disk. Jika ada, server membaca interface dan dependencies dari SKILL.json.
{ "method": "skills/list", "id": 25, "params": {
"cwds": ["/Users/me/project", "/Users/me/other-project"],
"forceReload": true,
"perCwdExtraUserRoots": [
{
"cwd": "/Users/me/project",
"extraUserRoots": ["/Users/me/shared-skills"]
}
]
} }
{ "id": 25, "result": {
"data": [{
"cwd": "/Users/me/project",
"skills": [
{
"name": "skill-creator",
"description": "Create or update a Codex skill",
"enabled": true,
"interface": {
"displayName": "Skill Creator",
"shortDescription": "Create or update a Codex skill"
},
"dependencies": {
"tools": [
{
"type": "env_var",
"value": "GITHUB_TOKEN",
"description": "GitHub API token"
},
{
"type": "mcp",
"value": "github",
"transport": "streamable_http",
"url": "https://example.com/mcp"
}
]
}
}
],
"errors": []
}]
} }Server juga mengirim notifikasi skills/changed saat file skill lokal yang dipantau berubah. Perlakukan ini sebagai sinyal pembatalan validitas dan jalankan kembali skills/list dengan parameter Anda saat ini bila diperlukan.
Untuk mengaktifkan atau menonaktifkan skill berdasarkan path:
{
"method": "skills/config/write",
"id": 26,
"params": {
"path": "/Users/me/.codex/skills/skill-creator/SKILL.md",
"enabled": false
}
}Aplikasi (konektor)
Gunakan app/installed untuk membaca snapshot runtime aplikasi terinstal terbaru yang telah di-commit.
Setiap hasil menyertakan id aplikasi, runtimeName (atau null), status
enabled efektif, dan status callable. Aplikasi hanya dapat dipanggil jika
konfigurasi efektif mengaktifkannya dan setidaknya satu alat yang terlihat oleh model mematuhi
kebijakan aplikasi dan alat.
{
"method": "app/installed",
"id": 49,
"params": {
"threadId": "thread-1",
"forceRefresh": false
}
}
{
"id": 49,
"result": {
"apps": [
{
"id": "demo-app",
"runtimeName": "Demo App",
"enabled": true,
"callable": true
}
]
}
}Hilangkan threadId untuk menggunakan konfigurasi global, bukan konfigurasi thread yang telah dimuat.
Atur forceRefresh: true untuk menyegarkan snapshot runtime konektor
sebelum membacanya. Jika kebijakan global atau workspace memblokir akses aplikasi,
aplikasi yang terdeteksi tetap dapat muncul dengan enabled dan callable yang diatur ke false.
Gunakan app/list untuk mengambil aplikasi yang tersedia. Di CLI/TUI, /apps adalah pemilih yang ditampilkan kepada pengguna; di klien khusus, panggil app/list secara langsung. Setiap entri menyertakan isAccessible (tersedia bagi pengguna) dan isEnabled (diaktifkan dalam config.toml), sehingga klien dapat membedakan instalasi/akses dari status aktif lokal. Entri aplikasi juga dapat menyertakan kolom opsional branding, appMetadata, dan labels.
{ "method": "app/list", "id": 50, "params": {
"cursor": null,
"limit": 50,
"threadId": "thread-1",
"forceRefetch": false
} }
{ "id": 50, "result": {
"data": [
{
"id": "demo-app",
"name": "Demo App",
"description": "Example connector for documentation.",
"logoUrl": "https://example.com/demo-app.png",
"logoUrlDark": null,
"distributionChannel": null,
"branding": null,
"appMetadata": null,
"labels": null,
"installUrl": "https://chatgpt.com/apps/demo-app/demo-app",
"isAccessible": true,
"isEnabled": true
}
],
"nextCursor": null
} }Jika Anda memberikan threadId, pembatasan fitur aplikasi (features.apps) menggunakan snapshot konfigurasi thread tersebut. Jika dihilangkan, app-server menggunakan konfigurasi global terbaru.
app/list kembali setelah aplikasi yang dapat diakses dan aplikasi direktori selesai dimuat. Atur forceRefetch: true untuk melewati cache aplikasi dan mengambil data baru. Entri cache hanya diganti jika penyegaran berhasil.
Server juga mengirim notifikasi app/list/updated setiap kali salah satu sumber (aplikasi yang dapat diakses atau aplikasi direktori) selesai dimuat. Setiap notifikasi menyertakan daftar aplikasi gabungan terbaru.
{
"method": "app/list/updated",
"params": {
"data": [
{
"id": "demo-app",
"name": "Demo App",
"description": "Example connector for documentation.",
"logoUrl": "https://example.com/demo-app.png",
"logoUrlDark": null,
"distributionChannel": null,
"branding": null,
"appMetadata": null,
"labels": null,
"installUrl": "https://chatgpt.com/apps/demo-app/demo-app",
"isAccessible": true,
"isEnabled": true
}
]
}
}Gunakan app/read jika Anda sudah mengetahui ID aplikasi dan memerlukan metadata aplikasi, bukan status runtime yang terinstal. Teruskan maksimal 100 appIds. Server hanya mempertahankan kemunculan pertama setiap ID yang berulang dan mempertahankan urutan tersebut dalam apps maupun missingAppIds. Aplikasi yang tidak dikenal atau tidak dapat diakses dikembalikan dalam missingAppIds tanpa menyebabkan seluruh permintaan gagal.
{
"method": "app/read",
"id": 52,
"params": {
"appIds": ["demo-app", "missing-app"],
"includeTools": true
}
}
{
"id": 52,
"result": {
"apps": [
{
"id": "demo-app",
"name": "Demo App",
"description": "Example connector for documentation.",
"iconUrl": null,
"iconUrlDark": null,
"distributionChannel": null,
"installUrl": null,
"pluginDisplayNames": [],
"toolSummaries": [
{
"name": "search",
"title": "Search",
"description": "Search the app.",
"isEnabled": true,
"disabledReason": null,
"isReadOnly": true
}
]
}
],
"missingAppIds": ["missing-app"]
}
}Atur includeTools: true untuk meminta ringkasan alat publik yang hanya ditujukan bagi tampilan. Respons metadata tidak menyertakan status runtime aplikasi terinstal atau memberikan otorisasi untuk pemanggilan alat; gunakan app/installed untuk memeriksa status efektif enabled dan callable.
Panggil aplikasi dengan menyisipkan $<app-slug> dalam input teks dan menambahkan item input mention dengan path app://<id> (direkomendasikan).
{
"method": "turn/start",
"id": 51,
"params": {
"threadId": "thread-1",
"input": [
{
"type": "text",
"text": "$demo-app Pull the latest updates from the team."
},
{
"type": "mention",
"name": "Demo App",
"path": "app://demo-app"
}
]
}
}Contoh RPC konfigurasi untuk pengaturan aplikasi
Gunakan config/read, config/value/write, dan config/batchWrite untuk memeriksa atau memperbarui kontrol aplikasi dalam config.toml.
Baca bentuk konfigurasi aplikasi efektif (termasuk _default dan penggantian per alat):
{ "method": "config/read", "id": 60, "params": { "includeLayers": false } }
{ "id": 60, "result": {
"config": {
"apps": {
"_default": {
"enabled": true,
"destructive_enabled": true,
"open_world_enabled": true,
"approvals_reviewer": "user",
"default_tools_approval_mode": "auto"
},
"google_drive": {
"enabled": true,
"destructive_enabled": false,
"approvals_reviewer": "auto_review",
"default_tools_approval_mode": "prompt",
"tools": {
"files/delete": { "enabled": false, "approval_mode": "approve" }
}
}
}
}
} }apps._default.approvals_reviewer menetapkan peninjau untuk semua aplikasi kecuali
nilai per aplikasi menggantikannya. Jika keduanya dihilangkan, aplikasi mewarisi
nilai approvals_reviewer tingkat atas. apps._default.default_tools_approval_mode
menetapkan mode persetujuan fallback untuk alat tanpa penggantian per aplikasi atau per alat.
Persyaratan mode persetujuan terkelola menggantikan pengaturan mode persetujuan
alat.
Perbarui satu pengaturan aplikasi:
{
"method": "config/value/write",
"id": 61,
"params": {
"keyPath": "apps.google_drive.default_tools_approval_mode",
"value": "prompt",
"mergeStrategy": "replace"
}
}Terapkan beberapa pengeditan aplikasi secara atomik:
{
"method": "config/batchWrite",
"id": 62,
"params": {
"edits": [
{
"keyPath": "apps._default.destructive_enabled",
"value": false,
"mergeStrategy": "upsert"
},
{
"keyPath": "apps.google_drive.tools.files/delete.approval_mode",
"value": "approve",
"mergeStrategy": "upsert"
}
]
}
}Mendeteksi dan mengimpor konfigurasi agen eksternal
Gunakan externalAgentConfig/detect untuk menemukan artefak agen eksternal yang dapat dimigrasikan, lalu teruskan entri yang dipilih ke externalAgentConfig/import.
Contoh deteksi:
{ "method": "externalAgentConfig/detect", "id": 63, "params": {
"includeHome": true,
"cwds": ["/Users/me/project"]
} }
{ "id": 63, "result": {
"items": [
{
"itemType": "AGENTS_MD",
"description": "Import /Users/me/project/CLAUDE.md to /Users/me/project/AGENTS.md.",
"cwd": "/Users/me/project"
},
{
"itemType": "SKILLS",
"description": "Copy skill folders from /Users/me/.claude/skills to /Users/me/.agents/skills.",
"cwd": null
}
]
} }Contoh impor:
{ "method": "externalAgentConfig/import", "id": 64, "params": {
"migrationItems": [
{
"itemType": "AGENTS_MD",
"description": "Import /Users/me/project/CLAUDE.md to /Users/me/project/AGENTS.md.",
"cwd": "/Users/me/project"
}
],
"source": "claude-code"
} }
{ "id": 64, "result": { "importId": "8ae96ff3-3425-4f4c-8772-b6fd61502868" } }Parameter impor tingkat atas opsional source memberi label pada produk yang
menghasilkan item migrasi yang dipilih.
Server mengirim externalAgentConfig/import/progress saat jenis item selesai,
dan externalAgentConfig/import/completed setelah semua impor sinkron dan latar belakang
selesai. Notifikasi ini menyertakan importId yang sama dari
respons dan itemTypeResults dengan successes serta failures per jenis.
Penyelesaian dapat tiba segera setelah respons atau setelah impor jarak jauh di
latar belakang selesai.
{ "method": "externalAgentConfig/import/progress", "params": {
"importId": "8ae96ff3-3425-4f4c-8772-b6fd61502868",
"itemTypeResults": [
{
"itemType": "AGENTS_MD",
"successes": [
{ "itemType": "AGENTS_MD", "cwd": "/Users/me/project", "source": null, "target": "/Users/me/project/AGENTS.md" }
],
"failures": []
}
]
} }
{ "method": "externalAgentConfig/import/completed", "params": {
"importId": "8ae96ff3-3425-4f4c-8772-b6fd61502868",
"itemTypeResults": [
{
"itemType": "AGENTS_MD",
"successes": [
{ "itemType": "AGENTS_MD", "cwd": "/Users/me/project", "source": null, "target": "/Users/me/project/AGENTS.md" }
],
"failures": []
}
]
} }Baca impor terdahulu yang telah selesai:
{ "method": "externalAgentConfig/import/readHistories", "id": 65 }
{ "id": 65, "result": { "data": [
{
"importId": "8ae96ff3-3425-4f4c-8772-b6fd61502868",
"completedAtMs": 1781784000000,
"successes": [
{ "itemType": "AGENTS_MD", "cwd": "/Users/me/project", "source": null, "target": "/Users/me/project/AGENTS.md" }
],
"failures": []
}
] } }Nilai itemType yang didukung adalah AGENTS_MD, CONFIG, SKILLS, PLUGINS,
MCP_SERVER_CONFIG, SUBAGENTS, HOOKS, COMMANDS, dan SESSIONS. Untuk
item PLUGINS, details.plugins mencantumkan setiap marketplaceName dan
pluginNames yang dapat dicoba Codex untuk dimigrasikan. Deteksi hanya mengembalikan item yang masih
memerlukan pekerjaan. Misalnya, Codex melewati migrasi AGENTS jika AGENTS.md
sudah ada dan tidak kosong, dan impor skill tidak menimpa direktori
skill yang ada.
Saat mendeteksi plugin dari .claude/settings.json, Codex membaca sumber
marketplace yang dikonfigurasi dari extraKnownMarketplaces. Jika enabledPlugins berisi
plugin dari claude-plugins-official tetapi sumber marketplace tidak ditemukan,
Codex menyimpulkan anthropics/claude-plugins-official sebagai sumbernya.
Endpoint autentikasi
Permukaan autentikasi/akun JSON-RPC mengekspos metode permintaan/respons serta notifikasi yang dimulai server (tanpa id). Gunakan ini untuk menentukan status autentikasi, memulai atau membatalkan login, logout, memeriksa batas laju ChatGPT, dan memberi tahu pemilik workspace tentang kredit yang habis atau batas penggunaan.
Mode autentikasi
Codex mendukung mode autentikasi berikut. account/updated.authMode menunjukkan mode aktif dan menyertakan planType ChatGPT saat ini jika tersedia. account/read juga melaporkan detail akun dan paket.
- API key (
apikey) - pemanggil memberikan OpenAI API key melaluitype: "apiKey", dan Codex menyimpannya untuk permintaan API. - Dikelola ChatGPT (
chatgpt) - Codex menangani alur OAuth ChatGPT, menyimpan token, dan menyegarkannya secara otomatis. Mulai dengantype: "chatgpt"untuk alur browser atautype: "chatgptDeviceCode"untuk alur kode perangkat. - Token eksternal ChatGPT (
chatgptAuthTokens) - bersifat eksperimental dan ditujukan bagi aplikasi host yang sudah menangani siklus hidup autentikasi ChatGPT pengguna. Aplikasi host memberikanaccessToken,chatgptAccountId, danchatgptPlanTypeopsional secara langsung, serta harus menyegarkan token saat diminta. - Amazon Bedrock -
account/readmelaporkan akun Bedrock sebagaitype: "amazonBedrock"dan menunjukkan apakah kredensial berasal dari Bedrock API key yang dikelola Codex (credentialSource: "codexManaged") atau rantai kredensial AWS eksternal (credentialSource: "awsManaged").account/updated.authModemenggunakanbedrockApiKeyuntuk Bedrock API key yang dikelola Codex.
Ringkasan API
account/read- mengambil informasi akun saat ini; menyegarkan token secara opsional.account/login/start- memulai login (apiKey,chatgpt,chatgptDeviceCode, atauchatgptAuthTokenseksperimental).account/login/completed(notifikasi) - dikirim saat upaya login selesai (berhasil atau mengalami kesalahan).account/login/cancel- membatalkan login ChatGPT terkelola yang sedang menunggu berdasarkanloginId.account/logout- logout; memicuaccount/updated.account/updated(notifikasi) - dikirim setiap kali mode autentikasi berubah (authMode:apikey,chatgpt,chatgptAuthTokens,agentIdentity,personalAccessToken,bedrockApiKey, ataunull) dan menyertakanplanTypejika tersedia.account/chatgptAuthTokens/refresh(permintaan server) - meminta token ChatGPT baru yang dikelola secara eksternal setelah terjadi kesalahan otorisasi.account/rateLimits/read- mengambil batas laju ChatGPT.account/rateLimits/updated(notifikasi) - dikirim setiap kali batas laju ChatGPT pengguna berubah.account/sendAddCreditsNudgeEmail- meminta ChatGPT mengirim email kepada pemilik workspace tentang kredit yang habis atau batas penggunaan yang tercapai.account/rateLimitResetCredit/consume- menggunakan satu pengaturan ulang batas laju yang diperoleh dengan nilaiidempotencyKeyyang diberikan pemanggil.account/usage/read- mengambil ringkasan aktivitas token akun ChatGPT dan bucket harian.account/workspaceMessages/read- mengambil pesan workspace aktif, termasuk judul notifikasi jika tersedia.mcpServer/oauthLogin/completed(notifikasi) - dikirim setelah alurmcpServer/oauth/loginselesai; payload menyertakan{ name, threadId, success, error? }.threadIddapat berupanulluntuk alur OAuth yang cakupannya terbatas pada aplikasi atau plugin.mcpServer/startupStatus/updated(notifikasi) - dikirim saat status startup server MCP yang dikonfigurasi berubah; payload menyertakan{ threadId, name, status, error, failureReason }.threadIdadalahnulluntuk startup yang cakupannya terbatas pada aplikasi. Jika startup gagal,failureReason: "reauthenticationRequired"berarti kredensial OAuth yang tersimpan telah kedaluwarsa dan tidak dapat disegarkan, sehingga klien sebaiknya menawarkan untuk menghubungkan kembali server.
1) Memeriksa status autentikasi
Permintaan:
{ "method": "account/read", "id": 1, "params": { "refreshToken": false } }Contoh respons:
{ "id": 1, "result": { "account": null, "requiresOpenaiAuth": false } }{ "id": 1, "result": { "account": null, "requiresOpenaiAuth": true } }{
"id": 1,
"result": { "account": { "type": "apiKey" }, "requiresOpenaiAuth": true }
}{
"id": 1,
"result": {
"account": {
"type": "amazonBedrock",
"credentialSource": "codexManaged"
},
"requiresOpenaiAuth": false
}
}{
"id": 1,
"result": {
"account": {
"type": "amazonBedrock",
"credentialSource": "awsManaged"
},
"requiresOpenaiAuth": false
}
}{
"id": 1,
"result": {
"account": {
"type": "chatgpt",
"email": "user@example.com",
"planType": "pro"
},
"requiresOpenaiAuth": true
}
}Catatan kolom:
refreshToken(boolean): aturtrueuntuk memaksa penyegaran token dalam mode ChatGPT terkelola. Dalam mode token eksternal (chatgptAuthTokens), app-server mengabaikan flag ini.emailadalahnulljika akun ChatGPT tidak memiliki alamat email.requiresOpenaiAuthmencerminkan penyedia aktif; jikafalse, Codex dapat berjalan tanpa kredensial OpenAI.- Amazon Bedrock melaporkan
credentialSource: "codexManaged"saat menggunakan Bedrock API key yang dikelola Codex. Amazon Bedrock melaporkancredentialSource: "awsManaged"untuk jalur kredensial AWS eksternal. Ini mengidentifikasi sumber kredensial yang dipilih; hal ini tidak memvalidasi bahwa rantai kredensial AWS dapat menemukan kredensial.
2) Login dengan API key
- Kirim:
{
"method": "account/login/start",
"id": 2,
"params": { "type": "apiKey", "apiKey": "sk-..." }
}- Respons yang diharapkan:
{ "id": 2, "result": { "type": "apiKey" } }- Notifikasi:
{
"method": "account/login/completed",
"params": { "loginId": null, "success": true, "error": null }
} {
"method": "account/updated",
"params": { "authMode": "apikey", "planType": null }
}3) Login dengan ChatGPT (alur browser)
- Mulai:
{
"method": "account/login/start",
"id": 3,
"params": {
"type": "chatgpt",
"useHostedLoginSuccessPage": true,
"appBrand": "chatgpt"
}
} Secara default, callback browser yang berhasil mengalihkan ke halaman sukses lokal.
Atur useHostedLoginSuccessPage: true untuk menggunakan halaman sukses yang di-host jika
penyiapan organisasi tidak diperlukan. Jika halaman sukses yang di-host diaktifkan, appBrand
dapat berupa "codex" atau "chatgpt"; nilai yang dihilangkan atau null secara default menggunakan
"codex".
{
"id": 3,
"result": {
"type": "chatgpt",
"loginId": "<uuid>",
"authUrl": "https://chatgpt.com/...&redirect_uri=http%3A%2F%2Flocalhost%3A<port>%2Fauth%2Fcallback"
}
}- Buka
authUrldi browser; app-server meng-host callback lokal. - Tunggu notifikasi:
{
"method": "account/login/completed",
"params": { "loginId": "<uuid>", "success": true, "error": null }
} {
"method": "account/updated",
"params": { "authMode": "chatgpt", "planType": "plus" }
}3b) Login dengan ChatGPT (alur kode perangkat)
Gunakan alur ini saat klien Anda menangani proses login atau ketika callback browser tidak andal.
- Mulai:
{
"method": "account/login/start",
"id": 4,
"params": { "type": "chatgptDeviceCode" }
} {
"id": 4,
"result": {
"type": "chatgptDeviceCode",
"loginId": "<uuid>",
"verificationUrl": "https://auth.openai.com/codex/device",
"userCode": "ABCD-1234"
}
}- Tampilkan
verificationUrldanuserCodekepada pengguna; frontend menangani UX. - Tunggu notifikasi:
{
"method": "account/login/completed",
"params": { "loginId": "<uuid>", "success": true, "error": null }
} {
"method": "account/updated",
"params": { "authMode": "chatgpt", "planType": "plus" }
}3c) Login dengan token ChatGPT yang dikelola secara eksternal (chatgptAuthTokens)
Gunakan mode eksperimental ini hanya jika aplikasi host menangani siklus hidup autentikasi ChatGPT pengguna dan memberikan token secara langsung. Klien harus mengatur capabilities.experimentalApi = true selama initialize sebelum menggunakan jenis login ini.
- Kirim:
{
"method": "account/login/start",
"id": 7,
"params": {
"type": "chatgptAuthTokens",
"accessToken": "<jwt>",
"chatgptAccountId": "org-123",
"chatgptPlanType": "business"
}
}- Respons yang diharapkan:
{ "id": 7, "result": { "type": "chatgptAuthTokens" } }- Notifikasi:
{
"method": "account/login/completed",
"params": { "loginId": null, "success": true, "error": null }
} {
"method": "account/updated",
"params": { "authMode": "chatgptAuthTokens", "planType": "business" }
}Saat server menerima 401 Unauthorized, server dapat meminta token yang telah disegarkan dari aplikasi host:
{
"method": "account/chatgptAuthTokens/refresh",
"id": 8,
"params": { "reason": "unauthorized", "previousAccountId": "org-123" }
}
{ "id": 8, "result": { "accessToken": "<jwt>", "chatgptAccountId": "org-123", "chatgptPlanType": "business" } }Server mencoba kembali permintaan asli setelah respons penyegaran berhasil. Batas waktu permintaan tercapai setelah sekitar 10 detik.
4) Membatalkan login ChatGPT
{ "method": "account/login/cancel", "id": 4, "params": { "loginId": "<uuid>" } }
{ "method": "account/login/completed", "params": { "loginId": "<uuid>", "success": false, "error": "..." } }5) Logout
{ "method": "account/logout", "id": 5 }
{ "id": 5, "result": {} }
{ "method": "account/updated", "params": { "authMode": null, "planType": null } }6) Batas laju (ChatGPT)
{ "method": "account/rateLimits/read", "id": 6 }
{ "id": 6, "result": {
"rateLimits": {
"limitId": "codex",
"limitName": null,
"primary": { "usedPercent": 25, "windowDurationMins": 15, "resetsAt": 1730947200 },
"secondary": null,
"rateLimitReachedType": null
},
"rateLimitsByLimitId": {
"codex": {
"limitId": "codex",
"limitName": null,
"primary": { "usedPercent": 25, "windowDurationMins": 15, "resetsAt": 1730947200 },
"secondary": null,
"rateLimitReachedType": null
},
"codex_other": {
"limitId": "codex_other",
"limitName": "codex_other",
"primary": { "usedPercent": 42, "windowDurationMins": 60, "resetsAt": 1730950800 },
"secondary": null,
"rateLimitReachedType": null
}
},
"rateLimitResetCredits": {
"availableCount": 2,
"credits": [{
"id": "RateLimitResetCredit_1",
"resetType": "codexRateLimits",
"status": "available",
"grantedAt": 1781654400,
"expiresAt": 1784246400,
"title": "Rate-limit reset",
"description": "Reset an eligible Codex rate-limit window."
}]
}
} }
{ "method": "account/rateLimits/updated", "params": {
"rateLimits": {
"limitId": "codex",
"primary": { "usedPercent": 31, "windowDurationMins": 15, "resetsAt": 1730948100 }
}
} }Catatan kolom:
rateLimitsadalah tampilan satu bucket yang kompatibel dengan versi sebelumnya.rateLimitsByLimitId(jika ada) adalah tampilan beberapa bucket yang menggunakanlimit_idterukur sebagai kunci (misalnyacodex).limitIdadalah pengidentifikasi bucket terukur.limitNameadalah label opsional yang ditampilkan kepada pengguna untuk bucket tersebut.usedPercentadalah penggunaan saat ini dalam jendela kuota.windowDurationMinsadalah panjang jendela kuota.resetsAtadalah stempel waktu Unix (detik) untuk pengaturan ulang berikutnya.planTypedisertakan saat server mengembalikan paket ChatGPT yang terkait dengan bucket.creditsdisertakan saat server mengembalikan detail sisa kredit workspace.rateLimitReachedTypemengidentifikasi status batas yang diklasifikasikan server saat batas telah tercapai.rateLimitResetCreditsberisi jumlah pengaturan ulang yang diperoleh dan tersedia jika layanan menyediakannya; jika tidak, nilainya adalahnull.rateLimitResetCredits.creditsadalahnulljika hanya jumlahnya yang diketahui. Array kosong berarti layanan telah mengambil detail dan tidak menemukan kredit yang tersedia. Layanan dapat membatasi baris detail, sehinggaavailableCountbersifat otoritatif.- Setiap baris detail menyertakan
idburam,resetType,status,grantedAt,expiresAt(yang dapat berupanull),title(yang dapat berupanull), dandescription(yang dapat berupanull). - Ambil
account/rateLimits/readsetelah menggunakan pengaturan ulang.
7) Penggunaan token (ChatGPT)
Gunakan account/usage/read untuk mengambil kolom ringkasan aktivitas token ChatGPT dan
bucket harian opsional.
{ "method": "account/usage/read", "id": 7 }
{ "id": 7, "result": {
"summary": {
"lifetimeTokens": 1234567,
"peakDailyTokens": 45678,
"longestRunningTurnSec": 540,
"currentStreakDays": 8,
"longestStreakDays": 14
},
"dailyUsageBuckets": [
{ "startDate": "2026-06-18", "tokens": 12345 }
]
} }Catatan kolom:
- Nilai
summarydapat berupanulljika layanan belum mengembalikan metrik tersebut. dailyUsageBucketsdapat berupanull; jika ada, setiap bucket menyertakanstartDatedantokens.- Endpoint memerlukan autentikasi yang didukung oleh layanan Codex. ChatGPT, token ChatGPT eksternal, identitas agen, dan autentikasi personal access token dapat digunakan; autentikasi yang hanya menggunakan API key dan autentikasi Bedrock tidak dapat digunakan.
8) Pengaturan ulang batas laju yang diperoleh (ChatGPT)
Gunakan account/rateLimitResetCredit/consume untuk menggunakan satu pengaturan ulang yang diperoleh.
{ "method": "account/rateLimitResetCredit/consume", "id": 8, "params": { "idempotencyKey": "8ae96ff3-3425-4f4c-8772-b6fd61502868", "creditId": "RateLimitResetCredit_1" } }
{ "id": 8, "result": { "outcome": "reset" } }Catatan kolom:
idempotencyKeytidak boleh kosong. Gunakan UUID untuk setiap upaya penukaran logis dan gunakan kembali nilai yang sama saat mencoba kembali upaya tersebut.creditIdbersifat opsional. Jika diberikan, nilainya harus berupa ID buram yang tidak kosong dariaccount/rateLimits/read. Jika dihilangkan, layanan memilih kredit berikutnya yang tersedia.resetberarti kredit telah digunakan.alreadyRedeemedberarti penukaran yang sama telah selesai sebelumnya. Perlakukan ini sebagai keberhasilan idempoten dan segarkan batas akun.nothingToResetberarti tidak ada jendela batas laju yang memenuhi syarat untuk diatur ulang.noCreditberarti akun tidak memiliki kredit pengaturan ulang yang diperoleh dan tersedia.- Ambil
account/rateLimits/readsetelah menggunakan pengaturan ulang, bukan menyimpulkan jendela yang telah diperbarui dari respons ini.
9) Memberi tahu pemilik workspace tentang batas
Gunakan account/sendAddCreditsNudgeEmail untuk meminta ChatGPT mengirim email kepada pemilik workspace saat kredit habis atau batas penggunaan telah tercapai.
{ "method": "account/sendAddCreditsNudgeEmail", "id": 9, "params": { "creditType": "credits" } }
{ "id": 9, "result": { "status": "sent" } }Gunakan creditType: "credits" saat kredit workspace habis, atau creditType: "usage_limit" saat batas penggunaan workspace telah tercapai. Jika pemilik baru-baru ini sudah diberi tahu, status responsnya adalah cooldown_active.
10) Pesan workspace (ChatGPT)
Gunakan account/workspaceMessages/read untuk mengambil pesan aktif bagi workspace saat ini,
termasuk judul notifikasi jika tersedia.
{ "method": "account/workspaceMessages/read", "id": 10 }
{ "id": 10, "result": { "featureEnabled": true, "messages": [
{ "messageId": "msg_123", "messageType": "headline", "messageBody": "Workspace maintenance starts at 5pm.", "createdAt": 1781395200, "archivedAt": null }
] } }