How do I compare usage between Codex (beta) and OpenHands on my team?
Rius puts Codex (beta) and OpenHands in one workspace when you connect both to it, so you compare them on traces, users, tokens and cost. Codex (beta) sends through the Rius plugin and OpenHands through three environment variables. Compare tokens and cost only where both agents report them, and read timing and error figures with the differences below in mind. The Coding agents page has the full side-by-side table.
How it works
- One workspace. Each trace belongs to the workspace of the API key that sent it. Point both agents at the same workspace and their traces land in one trace list.
- Codex (beta). The Rius plugin sends one trace per session, with model calls, tokens, tool calls and subagents. Resuming a session continues the same trace. The sessions show as an agent named
codexon the Agents page. - OpenHands. Its SDK already sends OpenTelemetry, so no plugin is needed. Each conversation becomes one trace.
- Who ran it. On the Users page, Codex (beta) sessions appear under the email the developer signed in with (plugin 0.6.2 or later). OpenHands conversations appear under the
user_idyou pass when you create the conversation. Sessions sent with a key stored byuse-key, and OpenHands conversations without auser_id, land in the anonymous row. - Sent by. The trace list has a Sent by column that names the owner of the key that sent each trace.
Set it up
- Pick the team workspace. Everyone signs in to, or creates keys in, the same workspace. A workspace admin invites teammates first, as described in Track Claude Code usage and cost across a team.
- Connect Codex (beta) on each machine. Install the plugin:
codex plugin marketplace add glassflow/rius-coding-agents
codex plugin add rius@rius-coding-agentsTrust the five rius hooks in /hooks, run $rius:rius-login and pick the team workspace in the browser. Then run $rius:rius-enable-here in each repo. Tracing is off until each developer does this. The Codex (beta) guide covers the details.
3. Connect OpenHands. Create a key in the team workspace under Settings → API keys with Send telemetry. Then set these variables where OpenHands runs, with your key in place of ri_...:
export OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=https://ingest.eu.console.rius-glassflow.com/v1/traces
export OTEL_EXPORTER_OTLP_TRACES_PROTOCOL=http/protobuf
export OTEL_EXPORTER_OTLP_TRACES_HEADERS="Authorization=Bearer%20ri_..."- Set a user for OpenHands. Pass a
user_idfor each developer when you create a conversation. The Codex (beta) plugin uses the sign-in email as its user. One person shows as one row on the Users page only if both agents send the same value. For ids you set yourself, prefer an opaque id to an email. - Filter by agent. In the trace list, search and filter by agent, or open the Agents page and pick
codex, to look at one agent at a time.
What you get
You see both agents’ sessions in one trace list and one Users page, each trace opening to its model calls and tool calls. These figures compare fairly, with the caveats shown:
- Trace counts per developer. One Codex (beta) session and one OpenHands conversation are each one trace. Codex (beta) sessions started with
codex exec --ephemeralare not traced, so they are missing from the count. - Tokens and cost. Codex (beta) reports tokens and cost. OpenHands has no token data for OpenAI Responses API models or for the web app’s streamed calls, so those conversations show no tokens or cost. Leave them out of any comparison. Codex (beta) shows no cache-write tokens, because OpenAI does not report them.
- What cost means. Cost is a list-price estimate in US dollars, worked out from token counts at API rates. On a ChatGPT plan or another subscription it measures usage, not what you pay.
- Errors. In Codex (beta), a failed tool call is marked as an error only when a command exits non-zero or an MCP tool fails. Other failures look like success. Read Codex (beta) error figures as that narrower signal. In OpenHands a failed command is not an error span at all, because the exit code stays in the tool output, so a command that fails counts as an error in Codex (beta) and not in OpenHands.
- Timing. Codex (beta) model-call start times are approximate, so avoid fine-grained latency comparisons.
- When figures appear. Codex (beta) does not tell the plugin when a session ends. A trace closes when you start your next Codex (beta) session on the same key, after the old session’s process has exited and it has been idle for about an hour. Agents and Users figures count a Codex (beta) session only once its trace is closed. Until then, a recent session looks missing from the totals.
- Content. Codex (beta) sends prompts, replies and tool output only from folders opted in with
$rius:rius-enable-content-here. OpenHands always sends them, and everyone in the workspace can read what is sent.
When something else fits
If your team also uses Claude Code, the same plugin and workspace cover it, and the Claude Code team guide shows how to read usage per developer. OpenHands Cloud cannot send to Rius, so use the OpenHands SDK. If you need tokens and cost for every agent you compare, leave Cursor (beta) out of that comparison, because it reports none.