contradex is a Python extraction of the core turn loop from:
codex-cli/bin/codex.js(CLI handoff/spawn role)codex-rs/core/src/codex.rscodex-rs/core/src/stream_events_utils.rscodex-rs/core/src/tools/parallel.rscodex-rs/core/src/tools/router.rs
codex_cli_entry(...)- mirrors the launcher role from
codex-cli/bin/codex.js
- mirrors the launcher role from
run_agent_query_loop(...)- mirrors
run_turn(...)outer loop behavior incodex.rs
- mirrors
run_sampling_request(...)/try_run_sampling_request(...)- mirrors request streaming + retry loop in
codex.rs
- mirrors request streaming + retry loop in
handle_output_item_done(...)- mirrors classification of output items into tool calls vs non-tool items from
stream_events_utils.rs
- mirrors classification of output items into tool calls vs non-tool items from
ToolCallRuntime- mirrors async tool dispatch behavior in
tools/parallel.rs
- mirrors async tool dispatch behavior in
build_tool_call(...)- mirrors tool-call parsing in
tools/router.rs
- mirrors tool-call parsing in
LocalSummarizationPromptCompactor- mirrors local compaction path in
compact.rs(run_inline_auto_compact_task,run_compact_task,build_compacted_history)
- mirrors local compaction path in
RemoteCompactApiCompactor- mirrors remote compact endpoint path in
compact_remote.rs+ModelClient::compact_conversation_historyinclient.rs
- mirrors remote compact endpoint path in
ReferenceCompactor- mirrors strategy routing in
codex.rs::run_auto_compactandtasks/compact.rs
- mirrors strategy routing in
run_pre_sampling_compact(...)/maybe_run_previous_model_inline_compact(...)/run_auto_compact(...)- mirrors compaction entrypoint flow in
codex.rs
- mirrors compaction entrypoint flow in
UrlLibResponsesModelClient- mirrors request/SSE/compact paths from
core/src/client.rsandcodex-api/src/sse/responses.rs, implemented with stdliburllib
- mirrors request/SSE/compact paths from
resolve_responses_api_auth(...)+find_codex_home(...)- mirrors auth source selection from
core/src/auth.rsand CODEX_HOME resolution fromutils/home-dir/src/lib.rs
- mirrors auth source selection from
resolve_responses_base_url(...)- mirrors provider base-url defaults from
core/src/model_provider_info.rs::ModelProviderInfo::to_api_provider(api.openai.com/v1vschatgpt.com/backend-api/codex)
- mirrors provider base-url defaults from
system_prompts.py- dedicated prompt constants file (base/system + compaction prompts)
python3 -m contradex.cli "show me current working directory"Live API mode (stdlib networking, gpt-5.3-codex + xhigh by default):
OPENAI_API_KEY=... python3 -m contradex.cli "review this repo" \
--model-client urllib \
--api-provider auto \
--model gpt-5.3-codex \
--reasoning-effort xhigh \
--reasoning-summary autoUse ChatGPT codex provider base URL:
python3 -m contradex.cli "review this repo" \
--model-client urllib \
--api-provider codexLive auth resolution for --model-client urllib depends on --api-provider:
--api-provider auto:- explicit
--api-key auth.json(default$CODEX_HOME/auth.json, fallback~/.codex/auth.json)OPENAI_API_KEYenv varauth.jsonfollowsauth_modewhen present; otherwise it prefersOPENAI_API_KEYovertokens.access_token
- explicit
--api-provider api:- explicit
--api-key OPENAI_API_KEYenv varauth.json:OPENAI_API_KEY
- explicit
--api-provider codex:- explicit
--api-key auth.json:tokens.access_token
- explicit
Base URL provider selection uses:
--api-provider auto-> derived from the winning auth source- API key auth ->
https://api.openai.com/v1 - ChatGPT token auth ->
https://chatgpt.com/backend-api/codex
- API key auth ->
--api-provider api->https://api.openai.com/v1--api-provider codex->https://chatgpt.com/backend-api/codex- optional
--api-base-urloverrides any preset
Use auth.json explicitly:
python3 -m contradex.cli "review this repo" \
--model-client urllib \
--auth-file ~/.codex/auth.jsonThis demo includes stubbed model/tool/compaction dependencies, while preserving the core loop semantics:
- send model request
- parse response actions
- execute tool calls in workspace
- append outputs and update state
- compact optionally
- repeat until no follow-up needed