Expand description
Long-lived Python REPL runtime.
One python3 -u subprocess lives for the duration of an RLM turn (or an
inline repl block sequence in the agent loop). Code blocks are sent
over stdin framed by __RLM_RUN__/__RLM_END__ sentinels; the bootstrap
exec()s them into the same global namespace so variables, imports,
and even open file handles persist naturally across rounds.
Sub-LLM helpers (llm_query, llm_query_batched, rlm_query,
rlm_query_batched) are wired through a stdin/stdout RPC protocol:
Python emits __RLM_REQ_<sid>__::{json} on stdout, Rust dispatches the
request and writes __RLM_RESP_<sid>__::{json} back on stdin. No HTTP
sidecar, no temp ports — the same pipes carry both control and data.
The session id (<sid>) is a UUID generated per spawn, so user output
that happens to contain “REQ” or “FINAL” can’t be confused with control
messages.
Structs§
- Batch
Resp - Python
Runtime - Long-lived Python REPL.
- Repl
Round - Result of executing one code block.
- Single
Resp
Enums§
- RpcRequest
- One RPC request emitted by Python during a round.
- RpcResponse
- Response for one RPC request.
Traits§
- RpcDispatcher
- Trait-object handle for dispatching Python RPCs back into Rust.