Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 16 additions & 16 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -79,10 +79,10 @@ jobs:
max-parallel: 3
matrix:
model_entry:
- kimi-k2.6
- mimo-v2.5
- kimi-k2.6-camera-raw
- mimo-v2.5-camera-raw
- claude-code-mimo-v2.5
- claude-code-kimi-k2.6
- agents-sdk-mimo-v2.5
- agents-sdk-kimi-k2.7-code

steps:
- uses: actions/checkout@v4
Expand Down Expand Up @@ -211,33 +211,33 @@ jobs:
steps:
- uses: actions/checkout@v4

- name: Download Molmo live Kimi artifact
- name: Download Molmo live Claude Code MiMo artifact
continue-on-error: true
uses: actions/download-artifact@v4
with:
name: report-molmo-live-kimi-k2.6
path: molmo-live-src/kimi-k2.6
name: report-molmo-live-claude-code-mimo-v2.5
path: molmo-live-src/claude-code-mimo-v2.5

- name: Download Molmo live MiMo v2.5 artifact
- name: Download Molmo live Claude Code Kimi artifact
continue-on-error: true
uses: actions/download-artifact@v4
with:
name: report-molmo-live-mimo-v2.5
path: molmo-live-src/mimo-v2.5
name: report-molmo-live-claude-code-kimi-k2.6
path: molmo-live-src/claude-code-kimi-k2.6

- name: Download Molmo live Kimi RAW_FPV artifact
- name: Download Molmo live Agents SDK MiMo artifact
continue-on-error: true
uses: actions/download-artifact@v4
with:
name: report-molmo-live-kimi-k2.6-camera-raw
path: molmo-live-src/kimi-k2.6-camera-raw
name: report-molmo-live-agents-sdk-mimo-v2.5
path: molmo-live-src/agents-sdk-mimo-v2.5

- name: Download Molmo live MiMo v2.5 RAW_FPV artifact
- name: Download Molmo live Agents SDK Kimi artifact
continue-on-error: true
uses: actions/download-artifact@v4
with:
name: report-molmo-live-mimo-v2.5-camera-raw
path: molmo-live-src/mimo-v2.5-camera-raw
name: report-molmo-live-agents-sdk-kimi-k2.7-code
path: molmo-live-src/agents-sdk-kimi-k2.7-code

- name: Assemble Pages site
run: |
Expand Down
6 changes: 3 additions & 3 deletions just/molmo.just
Original file line number Diff line number Diff line change
Expand Up @@ -584,8 +584,8 @@ household-world-impl driver="mcp-smoke" profile="smoke" seeds="7" output_dir="ou
roboclaws_codex_provider_args codex_model_args
elif [[ "$driver" == "openai-agents-live" ]]; then
openai_agents_profile="$(roboclaws_code_agent_provider ROBOCLAWS_PROVIDER_PROFILE codex-router-responses)"
openai_agents_model="$(roboclaws_code_agent_model ROBOCLAWS_CODEX_MODEL ROBOCLAWS_PROVIDER_PROFILE codex-router-responses)"
openai_agents_profile_summary="$(roboclaws_code_agent_profile_summary ROBOCLAWS_PROVIDER_PROFILE ROBOCLAWS_CODEX_MODEL codex-router-responses)"
openai_agents_model="$(roboclaws_code_agent_model ROBOCLAWS_OPENAI_AGENTS_MODEL ROBOCLAWS_PROVIDER_PROFILE codex-router-responses)"
openai_agents_profile_summary="$(roboclaws_code_agent_profile_summary ROBOCLAWS_PROVIDER_PROFILE ROBOCLAWS_OPENAI_AGENTS_MODEL codex-router-responses)"
elif [[ "$driver" == "claude-live" ]]; then
claude_profile_summary="$(roboclaws_code_agent_profile_summary ROBOCLAWS_PROVIDER_PROFILE ROBOCLAWS_CLAUDE_MODEL auto-claude)"
roboclaws_claude_provider_args claude_model_args claude_env_args
Expand Down Expand Up @@ -759,7 +759,7 @@ household-world-impl driver="mcp-smoke" profile="smoke" seeds="7" output_dir="ou
HTTP_PROXY HTTPS_PROXY ALL_PROXY NO_PROXY \
http_proxy https_proxy all_proxy no_proxy \
DISPLAY XAUTHORITY MUJOCO_GL PYOPENGL_PLATFORM LIBGL_ALWAYS_SOFTWARE \
ROBOCLAWS_PROVIDER_PROFILE ROBOCLAWS_CODEX_MODEL \
ROBOCLAWS_PROVIDER_PROFILE ROBOCLAWS_CODEX_MODEL ROBOCLAWS_OPENAI_AGENTS_MODEL \
ROBOCLAWS_CODEX_DISABLE_RESPONSES_WEBSOCKETS \
ROBOCLAWS_PROVIDER_TIMING_PROXY \
ROBOCLAWS_TIMING_PROXY_UPSTREAM_BASE_URL \
Expand Down
53 changes: 33 additions & 20 deletions roboclaws/household/ci_live_reports.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,12 @@
"claude-version.txt",
"claude-events.jsonl",
"claude.stderr.log",
"driver.log",
"openai-agents-events.jsonl",
"openai-agents-trace.json",
"openai-agents-spans.jsonl",
"openai-agents-server.log",
"openai-agents-skill-context.json",
"checker.log",
"server.pid",
"trace.jsonl",
Expand All @@ -34,6 +40,7 @@
class MolmoLiveModelEntry:
name: str
label: str
agent_engine: str
provider_profile: str
model: str
secret_env: str
Expand All @@ -42,36 +49,40 @@ class MolmoLiveModelEntry:

MODEL_ENTRIES: tuple[MolmoLiveModelEntry, ...] = (
MolmoLiveModelEntry(
name="kimi-k2.6",
label="Kimi K2.6",
provider_profile="kimi-anthropic",
model="kimi-k2.6",
secret_env="KIMI_API_KEY",
profile="world-public-labels",
),
MolmoLiveModelEntry(
name="mimo-v2.5",
label="MiMo v2.5",
name="claude-code-mimo-v2.5",
label="Claude Code + MiMo v2.5",
agent_engine="claude-code",
provider_profile="mimo-tp-anthropic",
model="mimo-v2.5",
secret_env="MIMO_TP_KEY",
profile="world-public-labels",
),
MolmoLiveModelEntry(
name="kimi-k2.6-camera-raw-fpv",
label="Kimi K2.6 RAW_FPV",
name="claude-code-kimi-k2.6",
label="Claude Code + Kimi K2.6",
agent_engine="claude-code",
provider_profile="kimi-anthropic",
model="kimi-k2.6",
secret_env="KIMI_API_KEY",
profile="camera-raw-fpv",
profile="world-public-labels",
),
MolmoLiveModelEntry(
name="mimo-v2.5-camera-raw-fpv",
label="MiMo v2.5 RAW_FPV",
provider_profile="mimo-tp-anthropic",
name="agents-sdk-mimo-v2.5",
label="OpenAI Agents SDK + MiMo v2.5",
agent_engine="openai-agents-sdk",
provider_profile="mimo-tp-openai-chat",
model="mimo-v2.5",
secret_env="MIMO_TP_KEY",
profile="camera-raw-fpv",
profile="world-public-labels",
),
MolmoLiveModelEntry(
name="agents-sdk-kimi-k2.7-code",
label="OpenAI Agents SDK + Kimi K2.7 Code",
agent_engine="openai-agents-sdk",
provider_profile="kimi-openai-chat",
model="kimi-k2.7-code",
secret_env="KIMI_API_KEY",
profile="world-public-labels",
),
)

Expand Down Expand Up @@ -104,10 +115,11 @@ def base_status(
"schema": STATUS_SCHEMA,
"entry": entry.name,
"label": entry.label,
"agent_engine": entry.agent_engine,
"provider_profile": entry.provider_profile,
"model": entry.model,
"secret_env": entry.secret_env,
"driver": "claude",
"driver": entry.agent_engine,
"profile": profile,
"seed": seed,
"generated_mess_count": generated_mess_count,
Expand Down Expand Up @@ -294,7 +306,7 @@ def write_live_index(root: Path, statuses: list[dict[str, Any]] | None = None) -
"<h1>MolmoSpaces Live Cleanup Reports</h1>",
'<p class="sub">Published by GitHub Actions for main-only / opt-in '
"MolmoSpaces cleanup runs. Each row links to the report or diagnostics "
"for one provider-backed Claude Code run.</p>",
"for one provider-backed live-agent run.</p>",
"<table>",
"<thead><tr><th>Model</th><th>Status</th><th>Profile</th><th>Report</th>"
"<th>Provider</th><th>Rerun locally</th><th>Reason</th></tr></thead>",
Expand All @@ -313,6 +325,7 @@ def _live_index_row(status: dict[str, Any]) -> str:
label = html.escape(str(status.get("label") or status.get("entry") or "Molmo live run"))
state = html.escape(str(status.get("status") or "unknown"))
provider = html.escape(str(status.get("provider_profile") or "unknown provider"))
agent_engine = html.escape(str(status.get("agent_engine") or status.get("driver") or "unknown"))
model = html.escape(str(status.get("model") or "unknown model"))
profile = html.escape(str(status.get("profile") or "unknown profile"))
reason = html.escape(str(status.get("reason") or ""))
Expand All @@ -335,7 +348,7 @@ def _live_index_row(status: dict[str, Any]) -> str:
f"<td><code>{state}</code></td>"
f"<td><code>{profile}</code></td>"
f"<td>{report}</td>"
f"<td><code>{provider}</code></td>"
f"<td><code>{agent_engine}</code><br><code>{provider}</code></td>"
f"<td><code>{rerun_command}</code></td>"
f"<td>{reason}</td>"
"</tr>"
Expand Down
38 changes: 23 additions & 15 deletions scripts/molmo_cleanup/run_ci_live_cleanup_matrix.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,11 +51,7 @@ def parse_args(argv: list[str] | None = None) -> argparse.Namespace:
"--generated-mess-count",
type=int,
default=None,
help=(
"Generated mess count override. Defaults to 5 for world-public-labels entries "
"and 10 for camera-raw-fpv entries so the RAW_FPV success gate can require "
"7 accepted placements."
),
help="Generated mess count override. Defaults to 5 for world-public-labels entries.",
)
parser.add_argument(
"--profile",
Expand Down Expand Up @@ -108,7 +104,7 @@ def _run_preflight_or_statuses(
return None
try:
if not args.skip_version_check:
_version_checks(args)
_version_checks(args, entries)
if not args.skip_uv_sync:
_run_checked([args.uv_bin, "sync", "--extra", "dev", "--extra", "molmospaces"])
if not args.skip_prewarm:
Expand Down Expand Up @@ -181,7 +177,7 @@ def _run_entry(
"rerun_command": rerun_command,
"env": {
"ROBOCLAWS_PROVIDER_PROFILE": entry.provider_profile,
"ROBOCLAWS_CLAUDE_MODEL": entry.model,
_model_env_key(entry): entry.model,
PROVIDER_TIMING_PROXY_ENV: _default_provider_timing_proxy_value(),
},
"cache_roots": [
Expand All @@ -205,7 +201,7 @@ def _run_entry(

env = os.environ.copy()
env["ROBOCLAWS_PROVIDER_PROFILE"] = entry.provider_profile
env["ROBOCLAWS_CLAUDE_MODEL"] = entry.model
env[_model_env_key(entry)] = entry.model
env.setdefault(PROVIDER_TIMING_PROXY_ENV, "1")
env["ROBOCLAWS_REPORT_RERUN_COMMAND"] = rerun_command
try:
Expand Down Expand Up @@ -258,8 +254,6 @@ def _entry_profile(entry: MolmoLiveModelEntry, args: argparse.Namespace) -> str:
def _entry_generated_mess_count(entry: MolmoLiveModelEntry, args: argparse.Namespace) -> int:
if args.generated_mess_count is not None:
return int(args.generated_mess_count)
if _entry_profile(entry, args) == "camera-raw-fpv":
return 10
return 5


Expand All @@ -284,7 +278,7 @@ def _live_command(
"world=molmospaces/val_0",
"backend=mujoco",
"intent=cleanup",
"agent_engine=claude-code",
f"agent_engine={entry.agent_engine}",
f"provider_profile={entry.provider_profile}",
f"evidence_lane={profile}",
f"seed={args.seed}",
Expand All @@ -307,7 +301,7 @@ def _live_report_rerun_command(entry: MolmoLiveModelEntry, args: argparse.Namesp
"world=molmospaces/val_0",
"backend=mujoco",
"intent=cleanup",
"agent_engine=claude-code",
f"agent_engine={entry.agent_engine}",
f"provider_profile={entry.provider_profile}",
f"evidence_lane={profile}",
f"seed={args.seed}",
Expand All @@ -317,12 +311,20 @@ def _live_report_rerun_command(entry: MolmoLiveModelEntry, args: argparse.Namesp
]
return (
f"ROBOCLAWS_PROVIDER_PROFILE={entry.provider_profile} "
f"ROBOCLAWS_CLAUDE_MODEL={entry.model} "
f"{_model_env_key(entry)}={entry.model} "
f"{PROVIDER_TIMING_PROXY_ENV}={_default_provider_timing_proxy_value()} "
f"{shell_join(command)}"
)


def _model_env_key(entry: MolmoLiveModelEntry) -> str:
if entry.agent_engine == "claude-code":
return "ROBOCLAWS_CLAUDE_MODEL"
if entry.agent_engine == "openai-agents-sdk":
return "ROBOCLAWS_OPENAI_AGENTS_MODEL"
raise ValueError(f"unsupported Molmo live agent engine: {entry.agent_engine}")


def _default_provider_timing_proxy_value() -> str:
return os.environ.get(PROVIDER_TIMING_PROXY_ENV, "1")

Expand All @@ -344,8 +346,14 @@ def _prewarm(args: argparse.Namespace, *, generated_mess_count: int) -> None:
)


def _version_checks(args: argparse.Namespace) -> None:
for binary in ("codex", "claude"):
def _version_checks(
args: argparse.Namespace,
entries: tuple[MolmoLiveModelEntry, ...],
) -> None:
required_binaries = (
{"claude"} if any(entry.agent_engine == "claude-code" for entry in entries) else set()
)
for binary in sorted(required_binaries):
resolved = shutil.which(binary)
if not resolved:
raise RuntimeError(f"{binary} command not found")
Expand Down
5 changes: 4 additions & 1 deletion scripts/reports/write_pages_index.py
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,9 @@ def _molmo_live_section(site_dir: Path) -> str:
items = []
for entry in entries:
label = html.escape(str(entry.get("label") or entry.get("entry") or "Molmo live run"))
agent_engine = html.escape(
str(entry.get("agent_engine") or entry.get("driver") or "unknown")
)
model = html.escape(str(entry.get("model") or "unknown model"))
provider = html.escape(str(entry.get("provider_profile") or "unknown provider"))
status = html.escape(str(entry.get("status") or "unknown"))
Expand All @@ -116,7 +119,7 @@ def _molmo_live_section(site_dir: Path) -> str:
else:
title = f"<span>{label}</span>"
desc = (
f' <div class="desc">Claude Code live cleanup via '
f' <div class="desc">Live cleanup via <code>{agent_engine}</code> and '
f"<code>{provider}</code> / <code>{model}</code> using "
f"<code>{profile}</code>. Status: "
f"<code>{status}</code>"
Expand Down
6 changes: 3 additions & 3 deletions tests/contract/dev_tools/test_task_agent_just_recipes.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,7 @@
CODING_AGENT_DOCKER = REPO_ROOT / "scripts" / "dev" / "coding_agent_docker.sh"
LIVE_CODEX_RUNNER = REPO_ROOT / "scripts" / "molmo_cleanup" / "run_live_codex_cleanup.py"
LIVE_CLAUDE_RUNNER = REPO_ROOT / "scripts" / "molmo_cleanup" / "run_live_claude_cleanup.py"
LIVE_OPENAI_AGENTS_RUNNER = (
REPO_ROOT / "scripts" / "molmo_cleanup" / "run_live_openai_agents_cleanup.py"
)
LIVE_OPENAI_AGENTS_RUNNER = REPO_ROOT / "scripts/molmo_cleanup/run_live_openai_agents_cleanup.py"
AGIBOT_MAP_BUILD_CODEX_RUNNER = (
REPO_ROOT / "scripts" / "molmo_cleanup" / "run_live_codex_agibot_map_build.py"
)
Expand Down Expand Up @@ -848,6 +846,8 @@ def test_openai_agents_sdk_cleanup_route_stays_private_non_default() -> None:
assert "--model-thinking-mode" in molmo_text
assert "ROBOCLAWS_OPENAI_AGENTS_THINKING_MODE" in molmo_text
assert "--context-soft-limit-tokens" in molmo_text
assert "ROBOCLAWS_OPENAI_AGENTS_MODEL ROBOCLAWS_PROVIDER_PROFILE" in molmo_text
assert "ROBOCLAWS_PROVIDER_PROFILE ROBOCLAWS_OPENAI_AGENTS_MODEL" in molmo_text
assert "openai-agents-live" not in trace_household_cleanup_run("codex")

plan = resolve_surface_launch(
Expand Down
Loading
Loading