"""Credential-free execution settings persisted for repeatable favorites.""" from apps.admin_console.services.task_import import TaskOptions from artemis.config import load_agent_config, parse_llm_config, verification_level_for_checker from artemis.config.settings import settings def execution_config(item: dict) -> dict: agent = load_agent_config() model = parse_llm_config().operator overrides = item.get("runtime_overrides") or {} profile = overrides.get("profile") or item.get("profile") or "flash" options = { "profile": profile, "model": model.model, "reasoning_effort": model.reasoning_effort or "default", "request_timeout_seconds": model.timeout, "max_retries": model.max_retries, "retry_interval_seconds": settings.OPENAI_RETRY_INTERVAL_SECONDS, "record_video": settings.ARTEMIS_RECORDING_ENABLED, "recording": agent.recording.model_dump(), "analyze_video": agent.video_analyzer.enable_ledger, "timeout_seconds": settings.ARTEMIS_TASK_TIMEOUT_SECONDS, "verification_level": verification_level_for_checker(agent.checker), "explorer_mode": agent.explorer.resolve(profile=profile), "observation_timeout_seconds": settings.ARTEMIS_OBSERVATION_TIMEOUT_SECONDS, "observation_max_attempts": settings.ARTEMIS_OBSERVATION_MAX_ATTEMPTS, "device_command_timeout_seconds": settings.ARTEMIS_DEVICE_COMMAND_TIMEOUT_SECONDS, "action_failure_attempts": settings.ARTEMIS_ACTION_FAILURE_ATTEMPTS, "worker_cleanup_timeout_seconds": settings.ARTEMIS_WORKER_CLEANUP_TIMEOUT_SECONDS, } for key in ("device_serial", "verification_level", "explorer_mode", "locked_app_package"): if item.get(key) is not None: options[key] = item[key] options["recording"] = {**options["recording"], **(overrides.get("recording") or {})} options.update({k: v for k, v in overrides.items() if k != "recording" and v is not None}) return { "runtime_overrides": TaskOptions.model_validate(options).model_dump(exclude_none=True), "expected_output": item.get("expected_output"), "enable_outputter": item.get("enable_outputter") if item.get("enable_outputter") is not None else agent.outputter.enabled, "app_path": item.get("app_path"), } def persist_execution_config(item: dict) -> None: from apps.admin_console.services.automation_store import store snapshot = execution_config(item) item["execution_config"] = snapshot if job := store.job(str(item["session_id"])): job["execution_config"] = snapshot store.save_job(job)