Web interfaces
Obrolan Web
Status: UI chat SwiftUI macOS/iOS berbicara langsung ke WebSocket Gateway.
Apa ini
- UI chat native untuk Gateway (tanpa browser tertanam dan tanpa server statis lokal).
- Menggunakan sesi dan aturan perutean yang sama seperti channel lain.
- Perutean deterministik: balasan selalu kembali ke WebChat.
Mulai cepat
- Mulai Gateway.
- Buka UI WebChat (aplikasi macOS/iOS) atau tab chat Control UI.
- Pastikan jalur autentikasi Gateway yang valid dikonfigurasi (shared-secret secara default, bahkan pada loopback).
Cara kerjanya (perilaku)
- UI terhubung ke WebSocket Gateway dan menggunakan
chat.history,chat.send, danchat.inject. chat.historydibatasi untuk stabilitas: Gateway dapat memotong field teks yang panjang, menghilangkan metadata berat, dan mengganti entri yang terlalu besar dengan[chat.history omitted: message too large].chat.historymengikuti cabang transkrip aktif untuk file sesi append-only modern, sehingga cabang rewrite yang ditinggalkan dan salinan prompt yang sudah digantikan tidak dirender di WebChat.- Entri Compaction dirender sebagai pemisah riwayat yang dipadatkan secara eksplisit. Pemisah tersebut menjelaskan bahwa giliran sebelumnya dipertahankan dalam checkpoint dan menautkan ke kontrol checkpoint Sesi, tempat operator dapat membuat cabang atau memulihkan tampilan pra-compaction ketika izin mereka memungkinkan.
- Control UI mengingat
sessionIdGateway pendukung yang dikembalikan olehchat.historydan menyertakannya pada panggilan lanjutanchat.send, sehingga penyambungan ulang dan refresh halaman melanjutkan percakapan tersimpan yang sama kecuali pengguna memulai atau mereset sesi. - Control UI menggabungkan pengiriman duplikat yang masih berjalan untuk sesi, pesan, dan lampiran yang sama sebelum membuat id run
chat.sendbaru; Gateway tetap melakukan deduplikasi permintaan berulang yang menggunakan ulang kunci idempotensi yang sama. - File startup workspace dan instruksi
BOOTSTRAP.mdyang tertunda disediakan melalui Project Context pada prompt sistem agen, bukan disalin ke pesan pengguna WebChat. Pemotongan bootstrap hanya menambahkan notifikasi pemulihan prompt sistem yang ringkas; hitungan terperinci dan knob konfigurasi tetap berada di permukaan diagnostik. chat.historyjuga dinormalisasi untuk tampilan: konteks runtime-only OpenClaw, pembungkus amplop masuk, tag direktif pengiriman inline seperti[[reply_to_*]]dan[[audio_as_voice]], payload XML tool-call teks biasa (termasuk<tool_call>...</tool_call>,<function_call>...</function_call>,<tool_calls>...</tool_calls>,<function_calls>...</function_calls>, dan blok tool-call yang terpotong), serta token kontrol model ASCII/full-width yang bocor dihapus dari teks yang terlihat, dan entri asisten yang seluruh teks terlihatnya hanya token senyap persisNO_REPLY/no_replydihilangkan.- Payload balasan bertanda reasoning (
isReasoning: true) dikecualikan dari konten asisten WebChat, teks replay transkrip, dan blok konten audio, sehingga payload khusus pemikiran tidak muncul sebagai pesan asisten yang terlihat atau audio yang dapat diputar. chat.injectmenambahkan catatan asisten langsung ke transkrip dan menyiarkannya ke UI (tanpa run agen).- Run yang dibatalkan dapat tetap menampilkan output asisten parsial di UI.
- Gateway mempertahankan teks asisten parsial yang dibatalkan ke dalam riwayat transkrip ketika ada output yang di-buffer, dan menandai entri tersebut dengan metadata pembatalan.
- Riwayat selalu diambil dari Gateway (tanpa pemantauan file lokal).
- Jika Gateway tidak dapat dijangkau, WebChat bersifat hanya-baca.
Model transkrip dan pengiriman
WebChat memiliki dua jalur data terpisah:
- File JSONL sesi adalah transkrip model/runtime yang tahan lama. Untuk run agen normal, Pi mempertahankan pesan
user,assistant, dantoolResultyang terlihat oleh model melalui pengelola sesinya. WebChat tidak menulis pengiriman, status, atau teks pembantu arbitrer ke transkrip tersebut. - Event
ReplyPayloadGateway adalah proyeksi pengiriman live. Event tersebut dapat dinormalisasi untuk tampilan WebChat/channel, block streaming, tag direktif, penyematan media, flag TTS/audio, dan perilaku fallback UI. Event tersebut bukan log sesi kanonis itu sendiri. - WebChat menyuntikkan entri transkrip asisten hanya ketika Gateway memiliki pesan yang ditampilkan di luar giliran asisten Pi normal:
chat.inject, balasan perintah non-agen, output parsial yang dibatalkan, dan pelengkap transkrip media yang dikelola WebChat. chat.historymembaca transkrip sesi yang tersimpan dan menerapkan proyeksi tampilan WebChat. Jika teks asisten live muncul selama run tetapi menghilang setelah riwayat dimuat ulang, periksa terlebih dahulu apakah JSONL mentah berisi teks asisten, lalu apakah proyeksichat.historymenghapusnya, lalu apakah penggabungan optimistic-tail Control UI mengganti status pengiriman lokal dengan snapshot yang dipertahankan.
Jawaban akhir run agen normal harus tahan lama karena Pi menulis message_end asisten. Fallback apa pun yang mencerminkan payload akhir yang terkirim ke transkrip harus terlebih dahulu menghindari duplikasi giliran asisten yang sudah ditulis Pi.
Panel alat agen Control UI
- Panel Tools
/agentsControl UI memiliki dua tampilan terpisah:- Tersedia Saat Ini menggunakan
tools.effective(sessionKey=...)dan menunjukkan apa yang benar-benar dapat digunakan sesi saat ini pada runtime, termasuk alat milik inti, Plugin, dan channel. - Konfigurasi Alat menggunakan
tools.catalogdan tetap berfokus pada profil, override, dan semantik katalog.
- Tersedia Saat Ini menggunakan
- Ketersediaan runtime dicakup per sesi. Berpindah sesi pada agen yang sama dapat mengubah daftar Tersedia Saat Ini.
- Editor konfigurasi tidak menyiratkan ketersediaan runtime; akses efektif tetap mengikuti prioritas kebijakan
(
allow/deny, override per-agen dan provider/channel).
Penggunaan jarak jauh
- Mode jarak jauh membuat tunnel WebSocket Gateway melalui SSH/Tailscale.
- Anda tidak perlu menjalankan server WebChat terpisah.
Referensi konfigurasi (WebChat)
Konfigurasi lengkap: Konfigurasi
Opsi WebChat:
gateway.webchat.chatHistoryMaxChars: jumlah karakter maksimum untuk field teks dalam responschat.history. Ketika entri transkrip melebihi batas ini, Gateway memotong field teks panjang dan dapat mengganti pesan yang terlalu besar dengan placeholder.maxCharsper-permintaan juga dapat dikirim oleh klien untuk menimpa default ini untuk satu panggilanchat.history.
Opsi global terkait:
gateway.port,gateway.bind: host/port WebSocket.gateway.auth.mode,gateway.auth.token,gateway.auth.password: autentikasi WebSocket shared-secret.gateway.auth.allowTailscale: tab chat Control UI browser dapat menggunakan header identitas Tailscale Serve ketika diaktifkan.gateway.auth.mode: "trusted-proxy": autentikasi reverse-proxy untuk klien browser di belakang sumber proksi non-loopback yang sadar identitas (lihat Autentikasi Proksi Tepercaya).gateway.remote.url,gateway.remote.token,gateway.remote.password: target Gateway jarak jauh.session.*: penyimpanan sesi dan default kunci utama.