Codex App Server
Codex App Server
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 Codex GitHub (openai/codex/codex-rs/app-server). Lihat halaman Sumber Terbuka untuk mengetahui 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 balik TLS. Simpan bearer token dalam variabel lingkungan dan teruskan namanya alih-alih 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
port-nya diteruskan melalui 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 localhost atau
koneksi 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 ditransmisikan).
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 frame 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 ekspos transportasi lokal.
Saat Anda menjalankan dengan --listen ws://IP:PORT, listener yang sama juga melayani
probe kesehatan HTTP dasar:
GET /readyzmengembalikan200 OKsetelah listener menerima koneksi baru.GET /healthzmengembalikan200 OKjika 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 mengizinkan koneksi tanpa autentikasi
secara default 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 bearer token 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 initialize JSON-RPC.
Utamakan --ws-token-file daripada meneruskan bearer token mentah di baris perintah. Gunakan
--ws-token-sha256 hanya jika klien menyimpan token mentah berentropi tinggi dalam
penyimpanan rahasia lokal yang terpisah; hash hanya berfungsi sebagai pemverifikasi, dan klien tetap memerlukan
token asli.
Dalam mode WebSocket, app-server menggunakan antrean berbatas. Saat antrean masuk permintaan penuh,
server menolak permintaan baru dengan kode kesalahan JSON-RPC -32001 dan pesan
"Server overloaded; retry later." Klien harus mencoba lagi 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 serta 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
initializediikuti 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 beserta 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 pancarkaninitialized. Server menolak setiap permintaan pada koneksi tersebut sebelum handshake ini. - Memulai (atau melanjutkan) thread: Panggil
thread/startuntuk percakapan baru,thread/resumeuntuk melanjutkan percakapan yang sudah ada, atauthread/forkuntuk mencabangkan riwayat ke id thread baru. - Memulai turn: Panggil
turn/startdenganthreadIdtarget dan masukan pengguna. Field opsional mengganti model, personality,cwd, kebijakan sandbox, dan lainnya. - Mengarahkan turn aktif: Panggil
turn/steeruntuk menambahkan masukan pengguna ke turn yang sedang berlangsung tanpa membuat turn baru. - Mengalirkan 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. - Menyelesaikan turn: Server memancarkan
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 kemampuan klien berikut:
optOutNotificationMethods- nama metode notifikasi persis yang akan disembunyikan untuk koneksi ini. Pencocokan harus persis (tanpa wildcard atau prefiks); nama yang tidak dikenal diterima dan diabaikan.requestAttestation- memilih ikut serta dalam permintaanattestation/generateyang dimulai server. Host desktop yang menyediakan atestasi upstream merespons dengan nilai{ "token": "..." }buram.mcpServerOpenaiFormElicitation- mengizinkan server MCP downstream mengirim varian format 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 di balik kemampuan 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 memilih ikut serta, app-server menolaknya dengan:
<descriptor> requires experimentalApi capability
Ikhtisar API
thread/start- membuat thread baru; memancarkanthread/starteddan secara otomatis membuat Anda berlangganan peristiwa turn/item untuk thread tersebut.thread/resume- membuka kembali thread yang sudah ada berdasarkan id agar panggilanturn/startberikutnya ditambahkan ke thread tersebut.thread/fork- mencabangkan thread ke id thread baru dengan menyalin riwayat tersimpan. TeruskanlastTurnIduntuk menyalin riwayat hingga turn tersebut dan menghilangkan turn sesudahnya, atauephemeral: trueuntuk membuat cabang dalam memori. Memancarkanthread/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 sertamodelProviders,sourceKinds,archived,isPinned,cwd,useStateDbOnly,searchTerm, dan filter eksperimentalparentThreadIdatauancestorThreadId. 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, dan secara opsional membatasinya ke satuturnId. Penyimpanan thread aktif harus mendukung paginasi item.thread/loaded/list- mencantumkan id thread yang saat ini dimuat dalam memori.thread/name/set- menetapkan atau memperbarui nama thread yang ditampilkan kepada pengguna untuk thread yang dimuat atau rollout yang dipersistenkan; memancarkanthread/name/updated.thread/goal/set- menetapkan tujuan thread; memancarkanthread/goal/updated.thread/goal/get- membaca tujuan thread saat ini.thread/goal/clear- menghapus tujuan thread; memancarkanthread/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 yang belum diarsipkan; mengembalikan{}jika berhasil dan memancarkanthread/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 memancarkanthread/deleteduntuk setiap thread yang dihapus.thread/unsubscribe- menghentikan langganan koneksi ini dari peristiwa turn/item thread. Jika ini adalah pelanggan terakhir, server membongkar thread setelah masa tenggang tidak aktif tanpa pelanggan dan memancarkanthread/closed.thread/unarchive- memulihkan rollout thread yang diarsipkan kembali ke direktori sesi aktif; mengembalikanthreadyang dipulihkan dan memancarkanthread/unarchived.thread/status/changed- notifikasi yang dipancarkan ketikastatusruntime thread yang dimuat berubah.thread/compact/start- memicu pemadatan riwayat percakapan untuk thread; langsung 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 atau output alat mandiri ke thread dan memulai pembuatan oleh 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 thread yang terlihat oleh model tanpa memulai turn pengguna.turn/steer- menambahkan masukan pengguna ke turn aktif yang sedang berlangsung untuk thread; mengembalikanturnIdyang diterima.turn/interrupt- meminta pembatalan turn yang sedang berlangsung; keberhasilan ditandai dengan{}dan turn berakhir denganstatus: "interrupted".review/start- memulai peninjau Codex untuk thread; memancarkan 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) - dipancarkan untuk potongan stdout/stderr berenkode base64 dari sesicommand/execstreaming.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) - dipancarkan untuk keluaran proses streaming dan status keluar proses (eksperimental).model/list- mencantumkan model yang tersedia (aturincludeHidden: trueuntuk menyertakan entri denganhidden: true) beserta opsi effort,upgradeopsional, daninputModalities.modelProvider/capabilities/read- membaca batas kemampuan penyedia untuk kombinasi model/penyedia.experimentalFeature/list- mencantumkan flag fitur beserta metadata tahap siklus hidup dan paginasi kursor.experimentalFeature/enablement/set- menambal pengaturan runtime dalam memori untuk kunci fitur yang didukung sepertiappsdanplugins.environment/info- eksperimental; menghubungkan ke lingkungan eksekusi yang dikonfigurasi dan mengembalikan shell beserta direktori kerja default-nya.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 keterampilan untuk satu atau beberapa nilaicwd(mendukungforceReloaddanperCwdExtraUserRootsopsional).skills/extraRoots/set- mengganti root tambahan tingkat proses yang digunakan untuk menemukan keterampilan mandiri tanpa mempersistenkannya.skills/changed(notifikasi) - dipancarkan saat file keterampilan 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- sedang dikembangkan; 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 dulu.plugin/read- sedang dikembangkan; membaca satu plugin berdasarkan jalur marketplace atau nama marketplace jarak jauh dan nama plugin, termasuk keterampilan terbundel, aplikasi, nama server MCP, danshareUrlplugin jarak jauh jika katalog jarak jauh menyediakannya. Jangan panggil metode ini dari klien produksi dulu.plugin/install- sedang dikembangkan; menginstal plugin dari jalur marketplace atau nama marketplace jarak jauh. Jangan panggil metode ini dari klien produksi dulu.plugin/uninstall- sedang dikembangkan; menghapus instalasi plugin yang terinstal. Jangan panggil metode ini dari klien produksi dulu.plugin/skill/read- membaca Markdown keterampilan plugin jarak jauh sesuai permintaan berdasarkan marketplace jarak jauh, id plugin, dan nama keterampilan.app/installed- membaca status runtime aplikasi terinstal, termasuk status efektif aktif dan dapat dipanggil untuk setiap aplikasi.app/list- mencantumkan aplikasi (konektor) yang tersedia dengan paginasi serta metadata aksesibilitas/keaktifan.app/read- mengambil metadata dan ringkasan alat opsional yang hanya untuk ditampilkan bagi id aplikasi tertentu.skills/config/write- mengaktifkan atau menonaktifkan keterampilan berdasarkan jalur.mcpServer/oauth/login- memulai login OAuth untuk server MCP yang dikonfigurasi; mengembalikan URL otorisasi dan memancarkanmcpServer/oauthLogin/completedsetelah selesai.tool/requestUserInput- meminta pengguna menjawab 1-3 pertanyaan singkat untuk panggilan alat (eksperimental); pertanyaan dapat mengaturisOtheruntuk opsi isian bebas.mcpServer/elicitation/request(permintaan server) - meminta masukan formulir terstruktur atau konfirmasi alur URL dari klien yang diminta oleh server MCP.item/permissions/requestApproval(permintaan server) - meminta klien memberikan subset 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, alat, sumber daya, dan status autentikasi MCP (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) - dipancarkan saat status startup server MCP yang dikonfigurasi berubah untuk thread yang dimuat.windowsSandbox/setupStart- memulai penyiapan sandbox Windows untuk modeelevatedatauunelevated; segera kembali dan kemudian memancarkanwindowsSandbox/setupCompleted.feedback/upload- mengirim laporan umpan balik (klasifikasi + alasan/log opsional + id percakapan, serta lampiranextraLogFilesopsional).config/read- mengambil konfigurasi efektif di 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 bersamacwd(nulluntuk home). Jenis item yang didukung mencakup konfigurasi, keterampilan,AGENTS.md, plugin, konfigurasi server MCP, subagen, hook, perintah, dan sesi; impor yang tidak kosong memancarkanexternalAgentConfig/import/progressdanexternalAgentConfig/import/completedsaat pekerjaan selesai. Impor plugin dan sesi dapat selesai secara asinkron.config/value/write- menulis satu kunci/nilai konfigurasi keconfig.tomlpengguna di disk.config/batchWrite- menerapkan pengeditan konfigurasi secara atomik keconfig.tomlpengguna di disk.configRequirements/read- mengambil persyaratan darirequirements.tomldan/atau MDM, termasuk konfigurasi terkelola yang persis, daftar izin,featureRequirementsyang disematkan, dan persyaratan 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 yang hanya tersedia dari jarak jauh,
PluginMarketplaceEntry.path dapat berupa null; teruskan
remoteMarketplaceName alih-alih marketplacePath saat membaca atau menginstal
plugin tersebut.
Model
Mencantumkan model (model/list)
Panggil model/list untuk menemukan model yang tersedia beserta kemampuannya sebelum merender pemilih model atau personality.
{ "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 effort yang didukung untuk model.defaultReasoningEffort- effort default yang disarankan untuk klien.upgrade- id model peningkatan opsional yang direkomendasikan untuk prompt migrasi di klien.upgradeInfo- metadata peningkatan opsional untuk prompt migrasi di klien.hidden- apakah model disembunyikan dari daftar pemilih default.inputModalities- jenis masukan yang didukung model (misalnyatext,image).supportsPersonality- apakah model mendukung instruksi khusus personality 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 ada, nilai tersebut adalah URI file: kanonis yang menggunakan
sintaksis jalur asli lingkungan. 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, dan secara opsional membatasinya ke satu turn.thread/listmendukung paginasi kursor serta pemfilteranmodelProviders,sourceKinds,archived,isPinned,cwd,useStateDbOnly,searchTerm, danparentThreadIdatauancestorThreadIdeksperimental.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 yang 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 tidak aktif.thread/unarchivememulihkan rollout thread yang diarsipkan kembali ke direktori sesi aktif.thread/compact/startmemicu pemadatan dan langsung 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 thread yang terlihat oleh model 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 nilai ini jika 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
sintaksis absolut asli lingkungan sumbernya, termasuk untuk lingkungan
jarak jauh.
Klien eksperimental dapat mengatur historyMode pada thread/start ke "legacy"
(default) atau "paginated". Pembuatan thread berpaginasi belum didukung
dan mengembalikan kesalahan JSON-RPC -32601. App-server dapat mencantumkan dan membaca ringkasan untuk
catatan berpaginasi yang sudah ada, tetapi pembacaan riwayat lengkap, paginasi turn, dan pelanjutan
ditolak secara aman hingga riwayat berpaginasi didukung.
Klien beta yang memilih ikut serta dalam capabilities.experimentalApi dapat meneruskan id
profil izin bernama di permissions sebagai pengganti field sandbox lama.
Jangan kirim permissions dan sandbox bersamaan. Gunakan
permissionProfile/list bersama 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 fork mempertahankan id sesi
dari root asalnya. Klien harus membaca id sesi dari
thread.sessionId alih-alih menurunkannya dari id thread.
Untuk melanjutkan sesi tersimpan, panggil thread/resume dengan thread.id yang Anda catat sebelumnya. Bentuk responsnya 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 memperbarui thread.updatedAt (atau waktu modifikasi file rollout) dengan sendirinya. Stempel waktu diperbarui saat Anda memulai turn.
Jika Anda menandai server MCP yang diaktifkan 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 saat thread/resume jika Anda tidak menyediakan alat dinamis baru.
Jika Anda melanjutkan dengan model yang berbeda dari model yang tercatat dalam rollout, Codex memancarkan peringatan dan menerapkan instruksi pergantian model satu kali pada turn berikutnya.
Mengelola tujuan thread
Gunakan thread/goal/set, thread/goal/get, dan thread/goal/clear untuk mengelola
status tujuan persisten 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 tujuan tidak boleh kosong dan panjangnya paling banyak 4.000 karakter. Memberikan
objektif baru akan mengganti tujuan 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 sesi tersimpan, panggil thread/fork dengan thread.id. Tindakan ini membuat id thread baru dan memancarkan notifikasi thread/started untuknya. Teruskan
lastTurnId untuk menyalin riwayat hingga dan termasuk turn tersebut, serta menghilangkan turn
sesudahnya:
{ "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, fork akan mencatat penanda interupsi alih-alih
mempertahankan turn parsial tanpa penanda.
Teruskan ephemeral: true untuk membuat fork 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
}
}
}Fork 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 ditetapkan, 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 ditetapkan 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 memancarkan thread/started.
Mencantumkan turn thread
thread/turns/list bersifat eksperimental. Gunakan metode ini 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 respons:
notLoadedmenghilangkan item.summarymengembalikan data item yang diringkas dan merupakan 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 ke satu turn, atau hilangkan
untuk menelusuri item di seluruh thread. Penyimpanan thread aktif harus mendukung
paginasi item; jika tidak, server mengembalikan kesalahan metode 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 buram dari respons sebelumnya; hilangkan untuk halaman pertama.limit- server menggunakan ukuran halaman yang wajar secara default jika tidak ditetapkan.sortKey-created_at(default),updated_at, ataurecency_at.sortDirection-desc(default) atauasc.modelProviders- membatasi hasil ke penyedia tertentu; nilai yang tidak ditetapkan, null, atau array kosong menyertakan semua penyedia.sourceKinds- membatasi hasil ke sumber thread tertentu. Jika dihilangkan atau[], server secara default hanya menggunakan 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 penyematan persisten yang cocok. Hilangkan untuk mengembalikan thread yang disematkan maupun tidak.cwd- membatasi hasil ke thread yang direktori kerja sesi saat ininya sama persis dengan jalur ini, atau salah satu jalur dalam array. Jalur relatif ditentukan 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 ke thread yang judul hasil ekstraksinya berisi fragmen teks peka huruf besar-kecil ini.parentThreadId- membatasi hasil ke thread turunan langsung dari thread induk yang diberikan. Filter ini bersifat eksperimental dan memerlukancapabilities.experimentalApi = true.ancestorThreadId- membatasi hasil ke turunan yang dibuat dari thread tertentu pada kedalaman apa pun. Filter ini bersifat 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 membatalkan penyematan thread, atau perbarui gitInfo untuk mengubah
metadata Git yang dipersistenkan. Field yang dihilangkan tetap tidak berubah; null eksplisit menghapus
nilai metadata Git 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 dipancarkan 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 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 adalah pelanggan terakhir, server mempertahankan thread dalam keadaan dimuat hingga thread tidak memiliki pelanggan dan tidak ada aktivitas thread selama 30 menit. Saat masa tenggang berakhir, app-server membongkar thread dan memancarkan 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 di disk) ke direktori sesi arsip. Mengarsipkan thread juga mencoba mengarsipkan thread turunan yang dibuat yang 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 thread/list berikutnya kecuali Anda meneruskan archived: true. Server memancarkan satu notifikasi thread/archived untuk setiap thread yang benar-benar diarsipkan; jika thread 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 yang diarsipkan beserta
thread turunan yang dibuatnya. Server menghapus file rollout yang ada dan
metadata terkait sebelum mengembalikan keberhasilan; file rollout yang tidak ada 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 rollout thread yang diarsipkan kembali 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 memancarkan progres sebagai notifikasi turn/* dan item/* standar 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 menjadi bagian dari suatu thread. Permintaan segera mengembalikan {} sementara progres dialirkan melalui notifikasi turn/* dan item/* standar.
API ini berjalan di luar sandbox dengan akses penuh dan tidak mewarisi kebijakan sandbox thread. Klien sebaiknya mengeksposnya hanya untuk perintah yang dimulai pengguna secara eksplisit.
Jika thread sudah memiliki giliran aktif, perintah berjalan sebagai tindakan tambahan pada giliran tersebut dan output terformatnya dimasukkan ke aliran pesan giliran. Jika thread sedang menganggur, app-server memulai giliran mandiri untuk perintah shell tersebut.
Atur timeoutMs untuk membatasi waktu eksekusi dalam milidetik. Jika dihilangkan atau diberi nilai
null, batas waktu bawaan satu jam akan digunakan. 0 meminta batas waktu segera; nilai
negatif ditolak. Batas waktu tersebut tidak menunda respons RPC yang langsung dikirim.
{ "method": "thread/shellCommand", "id": 26, "params": { "threadId": "thr_b", "command": "git status --short", "timeoutMs": 10000 } }
{ "id": 26, "result": {} }Membersihkan terminal latar belakang
Gunakan thread/backgroundTerminals/clean untuk menghentikan semua terminal latar belakang yang sedang berjalan dan terkait dengan suatu 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 cursor dan limit
standar, 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 giliran terbaru
thread/rollback sudah tidak digunakan dan akan dihapus. Metode ini menghapus
numTurns entri terakhir dari konteks dalam memori dan menyimpan penanda pengembalian dalam
log rollout. thread yang dikembalikan menyertakan turns yang telah diisi setelah
pengembalian.
{ "method": "thread/rollback", "id": 30, "params": { "threadId": "thr_b", "numTurns": 1 } }
{ "id": 30, "result": { "thread": { "id": "thr_b", "name": "Bug bash notes", "ephemeral": false } } }Giliran
Bidang 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 untuk setiap giliran (model, upaya, kepribadian, cwd, kebijakan sandbox, ringkasan). Jika ditentukan, pengaturan ini menjadi nilai default bagi giliran berikutnya pada thread yang sama. outputSchema hanya berlaku untuk giliran 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 terbatas).workspaceWrite:readOnlyAccessopsional ({ "type": "fullAccess" }secara default, atau root terbatas).
Bentuk akses baca terbatas:
{
"type": "restricted",
"includePlatformDefaults": true,
"readableRoots": ["/Users/me/shared-read-only"]
}Di macOS, includePlatformDefaults: true menambahkan kebijakan Seatbelt default platform yang dikurasi untuk sesi dengan akses baca terbatas. Hal ini meningkatkan kompatibilitas alat tanpa memberikan akses luas ke seluruh /System.
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 giliran
{ "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 } } }Untuk memulai giliran dengan output dari alat yang dijalankan klien Anda, teruskan toolOutput
dengan name yang tidak kosong, namespace opsional, serta output berupa string atau
array item konten. Atur input menjadi array kosong; Anda tidak dapat menggabungkan
toolOutput dengan input pengguna yang tidak kosong.
{
"method": "turn/start",
"id": 31,
"params": {
"threadId": "thr_123",
"input": [],
"toolOutput": {
"name": "run_tests",
"namespace": null,
"output": "All 42 tests passed."
}
}
}Output tersebut tetap menjadi output alat dalam percakapan dan muncul sebagai item
functionCallOutput dalam notifikasi dan riwayat persisten. Jika giliran reguler
sudah aktif, Codex mengantrekan output tersebut untuk giliran itu.
Memasukkan item ke dalam thread
Gunakan thread/inject_items untuk menambahkan item Responses API yang telah dibuat sebelumnya ke riwayat prompt thread yang dimuat tanpa memulai giliran pengguna. Item ini disimpan 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 giliran aktif
Gunakan turn/steer untuk menambahkan lebih banyak input pengguna ke giliran aktif yang sedang berlangsung.
- Sertakan
expectedTurnId; nilainya harus cocok dengan ID giliran aktif. - Permintaan gagal jika thread tidak memiliki giliran aktif.
turn/steertidak memancarkan notifikasiturn/startedbaru.turn/steertidak menerima penggantian tingkat giliran (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 giliran (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 giliran
{ "method": "turn/interrupt", "id": 31, "params": { "threadId": "thr_123", "turnId": "turn_456" } }
{ "id": 31, "result": {} }Jika berhasil, giliran selesai dengan status: "interrupted".
Peninjauan
review/start menjalankan peninjau Codex untuk sebuah thread dan mengalirkan item peninjauan. Target mencakup:
uncommittedChangesbaseBranch(diff terhadap sebuah cabang)commit(meninjau commit tertentu)custom(instruksi bentuk bebas)
Gunakan delivery: "inline" (default) untuk menjalankan peninjauan pada thread yang ada, atau delivery: "detached" untuk membuat fork 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 memancarkan notifikasi thread/started untuk thread baru tersebut sebelum mengalirkan giliran peninjauan.
Codex mengalirkan notifikasi turn/started seperti 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 memancarkan item/started dan item/completed yang memuat 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 API ini
hanya jika klien Anda secara 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 seperti 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 sedang 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 alih-alih memblokir 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 memancarkan notifikasi penyelesaian:
{
"method": "windowsSandbox/setupCompleted",
"params": { "mode": "elevated", "success": true, "error": null }
}Mode:
elevated- menjalankan jalur penyiapan sandbox Windows dengan hak akses tinggi.unelevated- menjalankan jalur penyiapan/pemeriksaan awal 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 memancarkan fs/changed untuk path file tersebut, termasuk pembaruan yang dikirimkan melalui operasi penggantian atau pengubahan nama.
Peristiwa
Notifikasi peristiwa adalah aliran yang dimulai server untuk siklus hidup thread, siklus hidup giliran, dan item di dalamnya. Setelah 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.
Menolak notifikasi
Klien dapat menyembunyikan notifikasi tertentu per koneksi dengan mengirimkan nama metode yang persis sama dalam initialize.params.capabilities.optOutNotificationMethods.
- Hanya pencocokan persis:
item/agentMessage/deltahanya menyembunyikan metode tersebut. - Nama metode yang tidak dikenal diabaikan.
- Berlaku untuk
thread/*,turn/*,item/*saat ini, dan notifikasi v2 terkait. - Tidak berlaku untuk permintaan, respons, atau kesalahan.
Peristiwa pencarian file fuzzy (eksperimental)
API sesi pencarian file fuzzy memancarkan notifikasi untuk setiap 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 dipancarkan setelah permintaanwindowsSandbox/setupStartselesai.
Peristiwa giliran
turn/started-{ turn }dengan ID giliran,itemskosong, danstatus: "inProgress".turn/completed-{ turn }denganturn.statusberupacompleted,interrupted, ataufailed; kegagalan memuat{ error: { message, codexErrorInfo?, additionalDetails? } }.turn/diff/updated-{ threadId, turnId, diff }dengan unified diff gabungan terbaru untuk setiap perubahan file dalam giliran.turn/plan/updated-{ turnId, explanation?, plan }setiap kali agen membagikan atau mengubah rencananya; setiap entriplanadalah{ step, status }denganstatusdipending,inProgress, ataucompleted.hook/starteddanhook/completed-{ threadId, turnId?, run }saat hook siklus hidup sinkron dimulai dan saat ringkasan eksekusi akhirnya tersedia. Notifikasi ini tidak dipancarkan untuk hook asinkron.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 giliran.
Item
ThreadItem adalah union bertag yang dibawa dalam respons giliran dan notifikasi item/*. Jenis item umum mencakup:
userMessage-{id, content}dengancontentberupa daftar input pengguna (text,image, ataulocalImage).functionCallOutput-{id, name, namespace, output}untuk output alat mandiri yang diberikan melaluiturn/start.toolOutput.namespacedapat berupanull.agentMessage-{id, text, phase?}yang memuat balasan agen yang terakumulasi. Jika ada,phasemenggunakan nilai wire Responses API (commentary,final_answer).plan-{id, text}yang memuat teks rencana yang diusulkan dalam mode rencana. Perlakukan itemplanterakhir dariitem/completedsebagai acuan otoritatif.reasoning-{id, summary, content}dengansummaryyang menyimpan ringkasan penalaran yang dialirkan dancontentyang menyimpan blok penalaran mentah.commandExecution-{id, command, cwd, status, commandActions, aggregatedOutput?, exitCode?, durationMs?}.fileChange-{id, changes, status}yang menjelaskan edit 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 tersimpan mungkin tidak menyertakan metadata yang lebih baru. GunakanappContext.resourceUrisebagai penggantimcpAppResourceUritingkat atas yang tidak digunakan lagi.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 dikeluarkan agen.imageView-{id, path}yang dipancarkan saat agen memanggil alat penampil gambar.enteredReviewMode-{id, review}yang dikirim saat peninjau mulai bekerja.exitedReviewMode-{id, review}yang dipancarkan saat peninjau selesai.contextCompaction-{id}yang dipancarkan 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 menggunakan notifikasi lama thread/compacted; gunakan item contextCompaction sebagai gantinya.
Semua item memancarkan dua peristiwa siklus hidup bersama:
item/started- memancarkanitemlengkap saat unit kerja baru dimulai;item.idcocok denganitemIdyang digunakan oleh delta.item/completed- mengirimkanitemakhir 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 antarbagiannya dalam 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 yang tidak digunakan lagi untuk output teksapply_patchlama. Versi app-server saat ini tidak lagi memancarkannya; gunakan itemfileChangedanturn/diff/updatedsebagai gantinya.
Kesalahan
Jika giliran gagal, server memancarkan peristiwa error dengan { error: { message, codexErrorInfo?, additionalDetails? } } lalu menyelesaikan giliran 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 tertunda dengancommand,cwd, dan bidang 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. Semua path sistem file di dalamadditionalPermissionsbersifat absolut pada wire.- Klien merespons dengan salah satu keputusan persetujuan eksekusi perintah di atas.
serverRequest/resolvedmengonfirmasi bahwa permintaan tertunda telah dijawab atau dihapus.item/completedmengembalikan itemcommandExecutionakhir denganstatus: completed | failed | declined.
Jika networkApprovalContext tersedia, 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 yang berbeda pada host yang sama diperlakukan secara terpisah.
Persetujuan perubahan file
Urutan pesan:
item/startedmemancarkan itemfileChangedenganchangesdanstatus: "inProgress"yang diusulkan.item/fileChange/requestApprovalmenyertakanitemId,threadId,turnId,reasonopsional, dangrantRootopsional.- Klien merespons dengan salah satu keputusan persetujuan perubahan file di atas.
serverRequest/resolvedmengonfirmasi bahwa permintaan tertunda telah dijawab atau dihapus.item/completedmengembalikan itemfileChangeakhir denganstatus: completed | failed | declined.
tool/requestUserInput
Saat klien merespons item/tool/requestUserInput, app-server memancarkan serverRequest/resolved dengan { threadId, requestId }. Jika permintaan tertunda dihapus karena giliran dimulai, selesai, atau diinterupsi sebelum klien menjawab, server memancarkan notifikasi yang sama untuk pembersihan tersebut.
Parameter permintaan menyertakan autoResolutionMs sebagai batas waktu integer dalam milidetik atau
null. Jika tersedia, klien host dapat menyelesaikan prompt secara otomatis setelah
interval tersebut jika 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 memuat subset yang diberikan.
Atur scope ke "session" untuk mempertahankan pemberian izin bagi giliran berikutnya dalam
sesi yang sama; hilangkan atau gunakan "turn" untuk pemberian izin yang terbatas pada satu giliran. Izin yang
tidak diminta akan diabaikan.
Permintaan elisitasi server MCP
Server MCP dapat menginterupsi giliran 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 memancarkan
serverRequest/resolved. Untuk menerima varian openai/form, ikut serta dengan
initialize.params.capabilities.mcpServerOpenaiFormElicitation.
Pemanggilan alat dinamis (eksperimental)
dynamicTools pada thread/start dan 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 suatu giliran, app-server memancarkan:
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, dan 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 melalui 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 (disarankan) agar server memasukkan instruksi skill lengkap alih-alih mengandalkan model untuk mengidentifikasi 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 tersebut, 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 berdasarkan 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 untuk setiap cwd; atur forceReload: true untuk memuat ulang dari disk. Jika tersedia, 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 memancarkan 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 jika 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 alih-alih konfigurasi thread
yang dimuat. Atur forceRefresh: true untuk memuat ulang snapshot runtime konektor
sebelum membacanya. Jika kebijakan global atau ruang kerja memblokir akses aplikasi,
aplikasi yang teramati 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 bidang 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 terbaru. Entri cache hanya diganti jika pemuatan ulang berhasil.
Server juga memancarkan 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 terinstalnya. Teruskan maksimal 100 appIds. Server hanya menyimpan 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 menggagalkan seluruh permintaan.
{
"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 mengotorisasi pemanggilan alat; gunakan app/installed untuk memeriksa status enabled dan callable yang efektif.
Panggil aplikasi dengan menyisipkan $<app-slug> dalam input teks dan menambahkan item input mention dengan path app://<id> (disarankan).
{
"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 cadangan 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 edit 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 source tingkat atas yang opsional memberi label pada produk yang
menghasilkan item migrasi terpilih.
Server memancarkan externalAgentConfig/import/progress saat setiap jenis item selesai,
dan externalAgentConfig/import/completed setelah semua impor sinkron dan latar belakang
selesai. Notifikasi ini menyertakan importId yang sama dari
respons serta itemTypeResults dengan successes dan failures untuk setiap jenis.
Penyelesaian dapat tiba tepat 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 dimigrasikan oleh Codex. Deteksi hanya mengembalikan item yang masih
memerlukan tindakan. 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 ada,
Codex menyimpulkan anthropics/claude-plugins-official sebagai sumbernya.
Endpoint autentikasi
Permukaan akun/autentikasi JSON-RPC mengekspos metode permintaan/respons beserta notifikasi yang dimulai server (tanpa id). Gunakan semuanya untuk menentukan status autentikasi, memulai atau membatalkan login, logout, memeriksa batas laju ChatGPT, serta memberi tahu pemilik ruang kerja tentang kredit yang habis atau batas penggunaan.
Mode autentikasi
Codex mendukung mode autentikasi berikut. account/updated.authMode menampilkan 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. - ChatGPT terkelola (
chatgpt) - Codex mengelola alur OAuth ChatGPT, menyimpan token, dan memperbaruinya 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 mengelola siklus hidup autentikasi ChatGPT pengguna. Aplikasi host memberikanaccessToken,chatgptAccountId, danchatgptPlanTypeopsional secara langsung, serta harus memperbarui 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; memperbarui token secara opsional.account/login/start- memulai login (apiKey,chatgpt,chatgptDeviceCode, atauchatgptAuthTokenseksperimental).account/login/completed(notifikasi) - dipancarkan saat upaya login selesai (berhasil atau mengalami kesalahan).account/login/cancel- membatalkan login ChatGPT terkelola yang tertunda berdasarkanloginId.account/logout- logout; memicuaccount/updated.account/updated(notifikasi) - dipancarkan 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 kesalahan otorisasi.account/rateLimits/read- mengambil batas laju ChatGPT.account/rateLimits/updated(notifikasi) - dipancarkan setiap kali batas laju ChatGPT pengguna berubah.account/sendAddCreditsNudgeEmail- meminta ChatGPT mengirim email kepada pemilik ruang kerja 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 kelompok data harian.account/workspaceMessages/read- mengambil pesan ruang kerja aktif, termasuk judul notifikasi jika tersedia.mcpServer/oauthLogin/completed(notifikasi) - dipancarkan setelah alurmcpServer/oauth/loginselesai; payload menyertakan{ name, threadId, success, error? }.threadIddapat berupanulluntuk alur OAuth dalam cakupan aplikasi atau plugin.mcpServer/startupStatus/updated(notifikasi) - dipancarkan saat status startup server MCP yang dikonfigurasi berubah; payload menyertakan{ threadId, name, status, error, failureReason }.threadIdadalahnulluntuk startup dalam cakupan aplikasi. Jika startup gagal,failureReason: "reauthenticationRequired"berarti kredensial OAuth yang tersimpan telah kedaluwarsa dan tidak dapat diperbarui, sehingga klien sebaiknya menawarkan untuk menyambungkan 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 bidang:
refreshToken(boolean): aturtrueuntuk memaksa pembaruan 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; ini tidak memvalidasi bahwa rantai kredensial AWS dapat memperoleh kredensial.
2) Login dengan API key
- Kirim:
{
"method": "account/login/start",
"id": 2,
"params": { "type": "apiKey", "apiKey": "sk-..." }
}- Harapkan:
{ "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 keberhasilan lokal.
Atur useHostedLoginSuccessPage: true untuk menggunakan halaman keberhasilan yang di-host jika
penyiapan organisasi tidak diperlukan. Jika halaman keberhasilan yang di-host diaktifkan, appBrand
dapat berupa "codex" atau "chatgpt"; nilai yang dihilangkan atau null secara default menjadi
"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 jika klien Anda mengelola proses masuk atau jika 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 mengelola 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 mengelola 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"
}
}- Harapkan:
{ "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 diperbarui 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 menerima respons pembaruan yang berhasil. Waktu permintaan habis 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 bidang:
rateLimitsadalah tampilan satu kelompok yang kompatibel dengan versi sebelumnya.rateLimitsByLimitId(jika tersedia) adalah tampilan multikelompok yang dikunci berdasarkanlimit_idterukur (misalnyacodex).limitIdadalah pengenal kelompok terukur.limitNameadalah label opsional untuk kelompok yang ditampilkan kepada pengguna.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 suatu kelompok.creditsdisertakan saat server mengembalikan detail sisa kredit ruang kerja.rateLimitReachedTypemengidentifikasi status batas yang diklasifikasikan server saat suatu batas telah tercapai.rateLimitResetCreditsmemuat jumlah pengaturan ulang yang diperoleh dan tersedia jika layanan menyediakannya; jika tidak, nilainya adalahnull.rateLimitResetCredits.creditsadalahnulljika hanya jumlah yang diketahui. Array kosong berarti layanan mengambil detail dan tidak menemukan kredit yang tersedia. Layanan dapat membatasi baris detail, sehinggaavailableCountmerupakan nilai 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 bidang ringkasan aktivitas token ChatGPT dan
kelompok data 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 bidang:
- Nilai
summarydapat berupanulljika layanan belum mengembalikan metrik tersebut. dailyUsageBucketsdapat berupanull; jika tersedia, setiap kelompok menyertakanstartDatedantokens.- Endpoint memerlukan autentikasi yang didukung oleh layanan Codex. ChatGPT, token ChatGPT eksternal, identitas agen, dan autentikasi token akses pribadi 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 bidang:
idempotencyKeytidak boleh kosong. Gunakan UUID untuk setiap upaya penukaran logis dan gunakan kembali nilai yang sama saat mencoba ulang 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 diselesaikan sebelumnya. Perlakukan ini sebagai keberhasilan idempoten dan perbarui 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 diperbarui dari respons ini.
9) Memberi tahu pemilik ruang kerja tentang suatu batas
Gunakan account/sendAddCreditsNudgeEmail untuk meminta ChatGPT mengirim email kepada pemilik ruang kerja 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 ruang kerja habis, atau creditType: "usage_limit" saat batas penggunaan ruang kerja telah tercapai. Jika pemilik sudah diberi tahu baru-baru ini, status responsnya adalah cooldown_active.
10) Pesan ruang kerja (ChatGPT)
Gunakan account/workspaceMessages/read untuk mengambil pesan aktif bagi ruang kerja 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 }
] } }