> ## Documentation Index
> Fetch the complete documentation index at: https://agent-compass.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# 运行完整评测

export const COMMAND_BUILDER_UI = {
  benchmarkLabels: {
    browsecomp: "BrowseComp",
    browsecomp_zh: "BrowseComp-ZH",
    deepresearch_bench: "DeepResearch Bench",
    deepsearchqa: "DeepSearchQA",
    deepswe: "DeepSWE",
    frontier_engineering: "Frontier Engineering",
    frontierscience: "FrontierScience",
    gaia: "GAIA",
    gdpval_ac: "GDPval-AC",
    hle: "HLE",
    hle_verified: "HLE Verified",
    pinchbench: "PinchBench",
    researchclawbench: "ResearchClawBench",
    scicode: "SciCode",
    screenspot: "ScreenSpot",
    sealqa: "SealQA",
    sgi_deep_research: "SGI Deep Research",
    skillsbench: "SkillsBench",
    swebench_multilingual: "SWE-bench Multilingual",
    swebench_pro: "SWE-bench Pro",
    swebench_verified: "SWE-bench Verified",
    taubench: "TauBench (τ³)",
    terminal_bench_2: "Terminal-Bench 2.0",
    terminal_bench_2_1: "Terminal-Bench 2.1",
    terminal_bench_2_verified: "Terminal-Bench 2 Verified",
    wildclawbench: "WildClawBench",
    xbench_deepsearch: "xbench-DeepSearch"
  },
  harnessLabels: {
    claude_code: "Claude Code",
    codex: "Codex",
    mini_swe_agent: "Mini-SWE-agent",
    naive_search_agent: "Naive Search Agent",
    none: "None",
    openai_chat: "OpenAI Chat",
    openclaw: "OpenClaw",
    openhands: "OpenHands",
    openevolve: "OpenEvolve",
    qwen3vl_gui: "Qwen3-VL GUI",
    researchharness: "ResearchHarness",
    scicode_tool_use: "SciCode Tool Use",
    terminus2: "Terminus-2"
  },
  environmentLabels: {
    host_process: "Host process",
    docker: "Docker",
    daytona: "Daytona",
    modal: "Modal"
  },
  operatingSystemLabels: {
    linux: "Linux",
    wsl: "WSL 2",
    windows: "Windows",
    macos: "macOS"
  },
  protocolLabels: {
    "openai-chat": "OpenAI Chat Completions",
    "openai-responses": "OpenAI Responses",
    anthropic: "Anthropic Messages"
  },
  concurrencyOptions: ["1", "4", "8", "16", "32", "64", "128", "256", "512"],
  storageKey: "agentcompass.cli-builder.env.v1",
  credentialFields: {
    MODEL_BASE_URL: {
      defaultValue: "$MODEL_BASE_URL",
      type: "text",
      placeholder: "https://model-endpoint.example/v1"
    },
    MODEL_API_KEY: {
      defaultValue: "$MODEL_API_KEY",
      type: "password"
    },
    MODEL_NAME: {
      defaultValue: "$MODEL_NAME",
      type: "text",
      placeholder: "gpt-5.5"
    },
    JUDGE_MODEL_NAME: {
      defaultValue: "your-judge-model",
      type: "text",
      placeholder: "your-judge-model"
    },
    JUDGE_MODEL_BASE_URL: {
      defaultValue: "https://your-judge-endpoint/v1",
      type: "text",
      placeholder: "https://your-judge-endpoint.example/v1"
    },
    JUDGE_MODEL_API_KEY: {
      defaultValue: "sk-…",
      type: "password"
    },
    JUDGE_MODEL_API_PROTOCOL: {
      defaultValue: "openai-chat",
      type: "select",
      options: ["openai-chat", "openai-responses", "anthropic"]
    },
    EMBEDDING_MODEL_NAME: {
      defaultValue: "text-embedding-3-large",
      type: "text",
      placeholder: "text-embedding-3-large"
    },
    EMBEDDING_MODEL_BASE_URL: {
      defaultValue: "https://your-embedding-endpoint/v1",
      type: "text",
      placeholder: "https://your-embedding-endpoint.example/v1"
    },
    EMBEDDING_MODEL_API_KEY: {
      defaultValue: "sk-…",
      type: "password"
    },
    SERPER_API_KEY: {
      defaultValue: "your-serper-key",
      type: "password"
    },
    JINA_API_KEY: {
      defaultValue: "your-jina-key",
      type: "password"
    },
    MINERU_TOKEN: {
      defaultValue: "your-mineru-token",
      type: "password"
    },
    BRAVE_API_KEY: {
      defaultValue: "your-brave-key",
      type: "password"
    },
    DAYTONA_API_KEY: {
      defaultValue: "your-daytona-key",
      type: "password"
    },
    MODAL_TOKEN_ID: {
      defaultValue: "your-modal-token-id",
      type: "password"
    },
    MODAL_TOKEN_SECRET: {
      defaultValue: "your-modal-token-secret",
      type: "password"
    }
  }
};

export const createCommandBuilderRuntime = (catalog, ui) => {
  if (!catalog || !ui) {
    throw new Error("Command Builder requires both catalog and ui configuration props.");
  }
  const duplicateIds = values => values.filter((value, index) => values.indexOf(value) !== index);
  const errors = [];
  const benchmarkIds = catalog.benchmarks.map(benchmark => benchmark.id);
  const protocolIds = new Set(catalog.protocols);
  const operatingSystemIds = new Set(catalog.operatingSystems);
  const environmentIds = new Set(Object.keys(catalog.environments));
  const harnessIds = new Set(Object.keys(catalog.harnesses));
  const credentialKeys = new Set(Object.keys(ui.credentialFields));
  const validateCredentialParams = (params, fieldName) => {
    Object.entries(params || ({})).forEach(([key, param]) => {
      if (!credentialKeys.has(key)) errors.push(`unknown ${fieldName} credential: ${key}`);
      if (!String(param || "").trim()) errors.push(`empty ${fieldName} credential param: ${key}`);
    });
  };
  duplicateIds(benchmarkIds).forEach(id => errors.push(`duplicate benchmark: ${id}`));
  catalog.benchmarks.forEach(benchmark => {
    if (!ui.benchmarkLabels[benchmark.id]) {
      errors.push(`missing benchmark label: ${benchmark.id}`);
    }
    if (!benchmark.integrations?.length) {
      errors.push(`benchmark has no integrations: ${benchmark.id}`);
      return;
    }
    const recommended = benchmark.integrations.filter(integration => integration.recommended);
    if (recommended.length !== 1) {
      errors.push(`benchmark must have exactly one recommended integration: ${benchmark.id}`);
    }
    duplicateIds(benchmark.integrations.map(integration => integration.harness)).forEach(harness => errors.push(`duplicate integration: ${benchmark.id}/${harness}`));
    benchmark.integrations.forEach(integration => {
      if (!harnessIds.has(integration.harness)) {
        errors.push(`unknown harness: ${benchmark.id}/${integration.harness}`);
      }
      if (!integration.environments?.length) {
        errors.push(`integration has no environments: ${benchmark.id}/${integration.harness}`);
      }
      if (integration.environments?.includes("host_process") && integration.environments.length > 1) {
        errors.push(`host_process must be the only environment: ${benchmark.id}/${integration.harness}`);
      }
      integration.environments?.forEach(environment => {
        if (!environmentIds.has(environment)) {
          errors.push(`unknown environment: ${benchmark.id}/${integration.harness}/${environment}`);
        }
      });
      integration.credentialKeys?.forEach(key => {
        if (!credentialKeys.has(key)) {
          errors.push(`unknown integration credential: ${benchmark.id}/${integration.harness}/${key}`);
        }
      });
      validateCredentialParams(integration.credentialParams, `integration ${benchmark.id}/${integration.harness}`);
    });
  });
  Object.entries(catalog.harnesses).forEach(([id, harness]) => {
    if (!ui.harnessLabels[id]) errors.push(`missing harness label: ${id}`);
    if (!harness.protocols?.length) errors.push(`harness has no protocols: ${id}`);
    harness.protocols?.forEach(protocol => {
      if (!protocolIds.has(protocol)) errors.push(`unknown protocol: ${id}/${protocol}`);
    });
    harness.credentialKeys?.forEach(key => {
      if (!credentialKeys.has(key)) errors.push(`unknown harness credential: ${id}/${key}`);
    });
    validateCredentialParams(harness.credentialParams, `harness ${id}`);
  });
  Object.entries(catalog.environments).forEach(([id, environment]) => {
    if (!ui.environmentLabels[id]) errors.push(`missing environment label: ${id}`);
    environment.operatingSystems?.forEach(operatingSystem => {
      if (!operatingSystemIds.has(operatingSystem)) {
        errors.push(`unknown operating system: ${id}/${operatingSystem}`);
      }
    });
    environment.credentialKeys?.forEach(key => {
      if (!credentialKeys.has(key)) errors.push(`unknown environment credential: ${id}/${key}`);
    });
    validateCredentialParams(environment.credentialParams, `environment ${id}`);
  });
  catalog.protocols.forEach(id => {
    if (!ui.protocolLabels[id]) errors.push(`missing protocol label: ${id}`);
  });
  catalog.operatingSystems.forEach(id => {
    if (!ui.operatingSystemLabels[id]) errors.push(`missing operating-system label: ${id}`);
  });
  if (errors.length > 0) {
    throw new Error(`Invalid Command Builder configuration:\n- ${errors.join("\n- ")}`);
  }
  const BENCHMARKS = catalog.benchmarks.map(benchmark => ({
    ...benchmark,
    label: ui.benchmarkLabels[benchmark.id]
  }));
  const OPERATING_SYSTEMS = catalog.operatingSystems.map(id => ({
    id,
    label: ui.operatingSystemLabels[id]
  }));
  const PROTOCOLS = catalog.protocols.map(id => ({
    id,
    label: ui.protocolLabels[id]
  }));
  const CREDENTIAL_FIELDS = ui.credentialFields;
  const DEFAULT_ENV_VALUES = Object.fromEntries(Object.entries(CREDENTIAL_FIELDS).map(([key, field]) => [key, field.defaultValue || ""]));
  const getBenchmark = id => BENCHMARKS.find(benchmark => benchmark.id === id) || BENCHMARKS[0];
  const getSupportedHarnesses = benchmarkId => getBenchmark(benchmarkId).integrations.map(integration => integration.harness);
  const getRecommendedHarness = benchmarkId => {
    const benchmark = getBenchmark(benchmarkId);
    return benchmark.integrations.find(integration => integration.recommended)?.harness || benchmark.integrations[0].harness;
  };
  const getAvailableEnvironments = (benchmarkId, harnessId, operatingSystemId) => {
    const integration = getBenchmark(benchmarkId).integrations.find(item => item.harness === harnessId);
    return (integration?.environments || []).filter(environmentId => catalog.environments[environmentId].operatingSystems.includes(operatingSystemId));
  };
  const getSupportedProtocols = harnessId => catalog.harnesses[harnessId]?.protocols || ["openai-chat"];
  const getIntegrationCredentialKeys = (benchmarkId, harnessId) => {
    const integration = getBenchmark(benchmarkId).integrations.find(item => item.harness === harnessId);
    return [...new Set([...catalog.harnesses[harnessId]?.credentialKeys || [], ...integration?.credentialKeys || [], ...Object.keys(catalog.harnesses[harnessId]?.credentialParams || ({})), ...Object.keys(integration?.credentialParams || ({}))])];
  };
  const getIntegrationCredentialParams = (benchmarkId, harnessId) => {
    const integration = getBenchmark(benchmarkId).integrations.find(item => item.harness === harnessId);
    return {
      ...catalog.harnesses[harnessId]?.credentialParams || ({}),
      ...integration?.credentialParams || ({})
    };
  };
  const getIntegrationCommandConfig = (benchmarkId, harnessId) => {
    const integration = getBenchmark(benchmarkId).integrations.find(item => item.harness === harnessId);
    return integration?.commandConfig || ({});
  };
  return {
    BENCHMARKS,
    CONCURRENCY_OPTIONS: ui.concurrencyOptions,
    DEFAULT_ENV_VALUES,
    ENV_KEYS: Object.keys(CREDENTIAL_FIELDS),
    OPERATING_SYSTEMS,
    PROTOCOLS,
    STORAGE_KEY: ui.storageKey,
    benchmarkRequires: (benchmarkId, requirement) => Boolean(getBenchmark(benchmarkId).requirements?.[requirement]),
    getAvailableEnvironments,
    getBenchmark,
    getCredentialField: key => CREDENTIAL_FIELDS[key] || ({}),
    getDefaultProtocol: harnessId => getSupportedProtocols(harnessId)[0],
    getEnvironmentCredentialKeys: environmentId => [...new Set([...catalog.environments[environmentId]?.credentialKeys || [], ...Object.keys(catalog.environments[environmentId]?.credentialParams || ({}))])],
    getEnvironmentCredentialParams: environmentId => catalog.environments[environmentId]?.credentialParams || ({}),
    getEnvironmentLabel: id => ui.environmentLabels[id] || id,
    getIntegrationCredentialKeys,
    getIntegrationCredentialParams,
    getIntegrationCommandConfig,
    getHarnessLabel: id => ui.harnessLabels[id] || id,
    getProtocolLabel: id => ui.protocolLabels[id] || id,
    getRecommendedHarness,
    getSupportedHarnesses,
    getSupportedProtocols
  };
};

export const COMMAND_BUILDER_CATALOG = {
  schemaVersion: 2,
  protocols: ["openai-chat", "openai-responses", "anthropic"],
  operatingSystems: ["linux", "wsl", "windows", "macos"],
  environments: {
    host_process: {
      operatingSystems: ["linux", "wsl", "macos"],
      credentialKeys: []
    },
    docker: {
      operatingSystems: ["linux", "wsl"],
      credentialKeys: []
    },
    daytona: {
      operatingSystems: ["linux", "wsl", "windows", "macos"],
      credentialKeys: ["DAYTONA_API_KEY"],
      credentialParams: {
        DAYTONA_API_KEY: "api_key"
      }
    },
    modal: {
      operatingSystems: ["linux", "wsl", "windows", "macos"],
      credentialKeys: ["MODAL_TOKEN_ID", "MODAL_TOKEN_SECRET"],
      credentialParams: {
        MODAL_TOKEN_ID: "token_id",
        MODAL_TOKEN_SECRET: "token_secret"
      }
    }
  },
  harnesses: {
    claude_code: {
      protocols: ["anthropic"],
      credentialKeys: []
    },
    codex: {
      protocols: ["openai-responses", "openai-chat"],
      credentialKeys: []
    },
    mini_swe_agent: {
      protocols: ["openai-chat", "openai-responses"],
      credentialKeys: []
    },
    naive_search_agent: {
      protocols: ["openai-chat", "openai-responses"],
      credentialKeys: ["SERPER_API_KEY", "JINA_API_KEY"],
      credentialParams: {
        SERPER_API_KEY: "serper_api_key",
        JINA_API_KEY: "jina_api_key"
      }
    },
    none: {
      protocols: ["openai-chat", "openai-responses", "anthropic"],
      credentialKeys: []
    },
    openai_chat: {
      protocols: ["openai-chat"],
      credentialKeys: []
    },
    openclaw: {
      protocols: ["openai-chat", "openai-responses"],
      credentialKeys: []
    },
    openhands: {
      protocols: ["openai-chat", "openai-responses"],
      credentialKeys: []
    },
    openevolve: {
      protocols: ["openai-chat"],
      credentialKeys: []
    },
    qwen3vl_gui: {
      protocols: ["openai-chat"],
      credentialKeys: []
    },
    researchharness: {
      protocols: ["openai-chat"],
      credentialKeys: ["SERPER_API_KEY", "JINA_API_KEY", "MINERU_TOKEN"],
      credentialParams: {
        SERPER_API_KEY: "serper_api_key",
        JINA_API_KEY: "jina_api_key",
        MINERU_TOKEN: "mineru_token"
      }
    },
    scicode_tool_use: {
      protocols: ["openai-chat", "openai-responses"],
      credentialKeys: []
    },
    terminus2: {
      protocols: ["openai-chat", "openai-responses"],
      credentialKeys: []
    }
  },
  benchmarks: [{
    id: "browsecomp",
    requirements: {
      judgeModel: true
    },
    integrations: [{
      harness: "naive_search_agent",
      environments: ["host_process"],
      recommended: true
    }]
  }, {
    id: "browsecomp_zh",
    requirements: {
      judgeModel: true
    },
    integrations: [{
      harness: "naive_search_agent",
      environments: ["host_process"],
      recommended: true
    }]
  }, {
    id: "deepresearch_bench",
    requirements: {
      judgeModel: true
    },
    recommendedConfig: {
      benchmarkParams: {
        fact_judge_model: {
          id: "${JUDGE_MODEL_NAME}",
          base_url: "${JUDGE_MODEL_BASE_URL}",
          api_key: "${JUDGE_MODEL_API_KEY}",
          api_protocol: "${JUDGE_MODEL_API_PROTOCOL}"
        },
        jina_api_key: "${JINA_API_KEY}"
      },
      harnessParams: {
        max_iterations: 80,
        max_tool_response_length: 16384
      },
      modelParams: {
        max_tokens: 32768
      }
    },
    integrations: [{
      harness: "naive_search_agent",
      environments: ["host_process"],
      recommended: true
    }]
  }, {
    id: "deepsearchqa",
    requirements: {
      judgeModel: true
    },
    integrations: [{
      harness: "naive_search_agent",
      environments: ["host_process"],
      recommended: true
    }]
  }, {
    id: "deepswe",
    recommendedConfig: {
      benchmarkParams: {
        version: "v1.1"
      },
      harnessParams: {
        version: "2.4.2"
      }
    },
    integrations: [{
      harness: "mini_swe_agent",
      environments: ["docker", "daytona", "modal"],
      recommended: true
    }, {
      harness: "openhands",
      environments: ["docker", "daytona", "modal"]
    }, {
      harness: "codex",
      environments: ["docker", "daytona", "modal"],
      commandConfig: {
        harnessParams: {
          install_command: "apt-get update && apt-get install -y curl ca-certificates && curl -fsSL https://deb.nodesource.com/setup_20.x | bash - && apt-get install -y nodejs && npm install -g @openai/codex"
        }
      }
    }, {
      harness: "claude_code",
      environments: ["docker", "daytona", "modal"],
      commandConfig: {
        harnessParams: {
          install_command: "apt-get update && apt-get install -y curl ca-certificates && curl -fsSL https://deb.nodesource.com/setup_20.x | bash - && apt-get install -y nodejs && npm install -g @anthropic-ai/claude-code"
        }
      }
    }]
  }, {
    id: "frontier_engineering",
    recommendedConfig: {
      benchmarkParams: {
        task_set: "v1_non_gpu"
      },
      harnessParams: {
        iterations: 100,
        max_code_length: 20000
      }
    },
    integrations: [{
      harness: "openevolve",
      environments: ["docker"],
      recommended: true
    }]
  }, {
    id: "frontierscience",
    requirements: {
      judgeModel: true
    },
    integrations: [{
      harness: "naive_search_agent",
      environments: ["host_process"],
      recommended: true
    }]
  }, {
    id: "gaia",
    requirements: {
      judgeModel: true
    },
    integrations: [{
      harness: "naive_search_agent",
      environments: ["host_process"],
      recommended: true
    }]
  }, {
    id: "gdpval_ac",
    requirements: {
      judgeModel: true
    },
    recommendedConfig: {
      harnessParams: {
        openclaw_version: "2026.5.7",
        context_window: 262144,
        max_tokens: 80000,
        timeout: 14400
      }
    },
    integrations: [{
      harness: "openclaw",
      environments: ["docker", "daytona", "modal"],
      recommended: true
    }]
  }, {
    id: "hle",
    requirements: {
      judgeModel: true
    },
    integrations: [{
      harness: "naive_search_agent",
      environments: ["host_process"],
      recommended: true
    }]
  }, {
    id: "hle_verified",
    requirements: {
      judgeModel: true
    },
    integrations: [{
      harness: "naive_search_agent",
      environments: ["host_process"],
      recommended: true
    }]
  }, {
    id: "pinchbench",
    requirements: {
      judgeModel: true
    },
    recommendedConfig: {
      benchmarkParams: {
        judge_model: {
          params: {
            temperature: 0
          }
        }
      }
    },
    integrations: [{
      harness: "openclaw",
      environments: ["docker", "daytona", "modal"],
      credentialKeys: ["BRAVE_API_KEY"],
      credentialParams: {
        BRAVE_API_KEY: "brave_api_key"
      },
      recommended: true
    }]
  }, {
    id: "researchclawbench",
    requirements: {
      judgeModel: true
    },
    integrations: [{
      harness: "researchharness",
      environments: ["docker", "daytona", "modal"],
      recommended: true
    }]
  }, {
    id: "scicode",
    recommendedConfig: {
      modelParams: {
        temperature: 0
      }
    },
    integrations: [{
      harness: "scicode_tool_use",
      environments: ["host_process"],
      recommended: true
    }]
  }, {
    id: "screenspot",
    integrations: [{
      harness: "qwen3vl_gui",
      environments: ["host_process"],
      recommended: true
    }]
  }, {
    id: "sealqa",
    requirements: {
      judgeModel: true
    },
    integrations: [{
      harness: "naive_search_agent",
      environments: ["host_process"],
      recommended: true
    }]
  }, {
    id: "sgi_deep_research",
    requirements: {
      judgeModel: true
    },
    integrations: [{
      harness: "naive_search_agent",
      environments: ["host_process"],
      recommended: true
    }]
  }, {
    id: "skillsbench",
    recommendedConfig: {
      benchmarkParams: {
        data_version: "1.1",
        verifier_timeout_multiplier: 8,
        execute_timeout_multiplier: 16
      }
    },
    integrations: [{
      harness: "openhands",
      environments: ["docker"],
      recommended: true
    }, {
      harness: "openclaw",
      environments: ["docker"]
    }]
  }, {
    id: "swebench_multilingual",
    recommendedConfig: {
      harnessParams: {
        step_limit: 250,
        cost_limit: 3.0,
        command_timeout: 2400,
        timeout: 9600
      }
    },
    integrations: [{
      harness: "mini_swe_agent",
      environments: ["docker", "daytona", "modal"],
      recommended: true
    }, {
      harness: "openhands",
      environments: ["docker", "daytona", "modal"]
    }, {
      harness: "claude_code",
      environments: ["docker", "daytona", "modal"],
      commandConfig: {
        harnessParams: {
          install_command: "apt-get update && apt-get install -y curl ca-certificates && curl -fsSL https://deb.nodesource.com/setup_20.x | bash - && apt-get install -y nodejs && npm install -g @anthropic-ai/claude-code"
        }
      }
    }, {
      harness: "codex",
      environments: ["docker", "daytona", "modal"],
      commandConfig: {
        harnessParams: {
          install_command: "apt-get update && apt-get install -y curl ca-certificates && curl -fsSL https://deb.nodesource.com/setup_20.x | bash - && apt-get install -y nodejs && npm install -g @openai/codex"
        }
      }
    }]
  }, {
    id: "swebench_pro",
    recommendedConfig: {
      harnessParams: {
        step_limit: 250,
        cost_limit: 3.0,
        command_timeout: 2400,
        timeout: 12000
      }
    },
    integrations: [{
      harness: "mini_swe_agent",
      environments: ["docker", "daytona", "modal"],
      recommended: true
    }, {
      harness: "openhands",
      environments: ["docker", "daytona", "modal"]
    }, {
      harness: "claude_code",
      environments: ["docker", "daytona", "modal"],
      commandConfig: {
        harnessParams: {
          install_command: "apt-get update && apt-get install -y curl ca-certificates && curl -fsSL https://deb.nodesource.com/setup_20.x | bash - && apt-get install -y nodejs && npm install -g @anthropic-ai/claude-code"
        }
      }
    }, {
      harness: "codex",
      environments: ["docker", "daytona", "modal"],
      commandConfig: {
        harnessParams: {
          install_command: "apt-get update && apt-get install -y curl ca-certificates && curl -fsSL https://deb.nodesource.com/setup_20.x | bash - && apt-get install -y nodejs && npm install -g @openai/codex"
        }
      }
    }]
  }, {
    id: "swebench_verified",
    recommendedConfig: {
      harnessParams: {
        step_limit: 250,
        cost_limit: 3.0,
        command_timeout: 2400,
        timeout: 9600
      }
    },
    integrations: [{
      harness: "mini_swe_agent",
      environments: ["docker", "daytona", "modal"],
      recommended: true
    }, {
      harness: "openhands",
      environments: ["docker", "daytona", "modal"]
    }, {
      harness: "claude_code",
      environments: ["docker", "daytona", "modal"],
      commandConfig: {
        harnessParams: {
          install_command: "apt-get update && apt-get install -y curl ca-certificates && curl -fsSL https://deb.nodesource.com/setup_20.x | bash - && apt-get install -y nodejs && npm install -g @anthropic-ai/claude-code"
        }
      }
    }, {
      harness: "codex",
      environments: ["docker", "daytona", "modal"],
      commandConfig: {
        harnessParams: {
          install_command: "apt-get update && apt-get install -y curl ca-certificates && curl -fsSL https://deb.nodesource.com/setup_20.x | bash - && apt-get install -y nodejs && npm install -g @openai/codex"
        }
      }
    }]
  }, {
    id: "taubench",
    requirements: {
      judgeModel: true,
      embeddingModel: true
    },
    integrations: [{
      harness: "none",
      environments: ["docker"],
      recommended: true
    }]
  }, {
    id: "terminal_bench_2",
    recommendedConfig: {
      benchmarkParams: {
        verifier_timeout_multiplier: 8,
        execute_timeout_multiplier: 16
      },
      harnessParams: {
        max_turns: 300,
        timeout: 14400
      }
    },
    integrations: [{
      harness: "terminus2",
      environments: ["docker", "daytona", "modal"],
      recommended: true
    }, {
      harness: "codex",
      environments: ["docker"],
      commandConfig: {
        recipe: "terminalbench2_docker_ac",
        protocol: "openai-responses",
        defaultTaskConcurrency: "16"
      }
    }, {
      harness: "claude_code",
      environments: ["docker"],
      commandConfig: {
        recipe: "terminalbench2_docker_ac",
        protocol: "anthropic",
        defaultTaskConcurrency: "16"
      }
    }]
  }, {
    id: "terminal_bench_2_1",
    recommendedConfig: {
      benchmarkParams: {
        verifier_timeout_multiplier: 8,
        execute_timeout_multiplier: 16
      },
      harnessParams: {
        max_turns: 300,
        timeout: 14400
      }
    },
    integrations: [{
      harness: "terminus2",
      environments: ["docker", "daytona", "modal"],
      recommended: true
    }, {
      harness: "codex",
      environments: ["docker"],
      commandConfig: {
        recipe: "terminalbench2_1_docker_ac",
        protocol: "openai-responses",
        defaultTaskConcurrency: "16"
      }
    }, {
      harness: "claude_code",
      environments: ["docker"],
      commandConfig: {
        recipe: "terminalbench2_1_docker_ac",
        protocol: "anthropic",
        defaultTaskConcurrency: "16"
      }
    }]
  }, {
    id: "terminal_bench_2_verified",
    recommendedConfig: {
      benchmarkParams: {
        verifier_timeout_multiplier: 8,
        execute_timeout_multiplier: 16
      },
      harnessParams: {
        max_turns: 300,
        timeout: 14400
      }
    },
    integrations: [{
      harness: "terminus2",
      environments: ["docker", "daytona", "modal"],
      recommended: true
    }, {
      harness: "codex",
      environments: ["docker"],
      commandConfig: {
        recipe: "terminalbench2_verified_docker_ac",
        protocol: "openai-responses",
        defaultTaskConcurrency: "16"
      }
    }, {
      harness: "claude_code",
      environments: ["docker"],
      commandConfig: {
        recipe: "terminalbench2_verified_docker_ac",
        protocol: "anthropic",
        defaultTaskConcurrency: "16"
      }
    }]
  }, {
    id: "wildclawbench",
    recommendedConfig: {
      harnessParams: {
        context_window: 262144,
        timeout: 14400
      }
    },
    integrations: [{
      harness: "openclaw",
      environments: ["docker"],
      credentialKeys: ["BRAVE_API_KEY"],
      credentialParams: {
        BRAVE_API_KEY: "brave_api_key"
      },
      recommended: true
    }]
  }, {
    id: "xbench_deepsearch",
    requirements: {
      judgeModel: true
    },
    integrations: [{
      harness: "naive_search_agent",
      environments: ["host_process"],
      recommended: true
    }]
  }]
};

export const AgentCompassCommandBuilder = ({locale = "en", catalog, ui, runtimeFactory}) => {
  const shellQuote = (value, isWindows) => {
    const stringValue = String(value);
    if ((/^\$[A-Z][A-Z0-9_]*$/).test(stringValue)) return `"${stringValue}"`;
    return isWindows ? `'${stringValue.replaceAll("'", "''")}'` : `'${stringValue.replaceAll("'", "'\"'\"'")}'`;
  };
  const {BENCHMARKS, CONCURRENCY_OPTIONS, DEFAULT_ENV_VALUES, ENV_KEYS, OPERATING_SYSTEMS, PROTOCOLS, STORAGE_KEY, benchmarkRequires, getAvailableEnvironments, getBenchmark, getCredentialField, getDefaultProtocol, getEnvironmentCredentialKeys, getEnvironmentCredentialParams, getEnvironmentLabel, getIntegrationCredentialKeys, getIntegrationCredentialParams, getIntegrationCommandConfig, getHarnessLabel, getProtocolLabel, getRecommendedHarness, getSupportedHarnesses, getSupportedProtocols} = runtimeFactory(catalog, ui);
  const copy = {
    en: {
      operatingSystem: "Operating system",
      benchmark: "Benchmark",
      benchmarkSearch: "Search benchmarks",
      benchmarkSearchPlaceholder: "Search by name or scroll down to select the benchmark...",
      noBenchmarkMatches: "No benchmarks match this search.",
      harness: "Harness",
      recommendedHarness: "Recommended",
      otherHarnesses: "Other Supported",
      environment: "Environment",
      noEnvironment: "No supported environment is available for this benchmark on the selected operating system. Use WSL 2 or choose another operating system.",
      protocol: "Model API protocol",
      protocolHint: "Protocols that are incompatible with the selected harness are disabled.",
      concurrency: "Task concurrency",
      custom: "Custom",
      customConcurrency: "Custom concurrency",
      envTitle: "Command values",
      commandValuesButton: "Parameters",
      envHint: "Enter the model settings and credentials to place directly in the generated command.",
      modelCredentials: "Model under test",
      modelCredentialsHint: "The endpoint evaluated by this run.",
      judgeCredentials: "Judge model",
      judgeCredentialsHint: "Required for scoring this benchmark. Use a fixed judge endpoint that is independent of the model under test.",
      embeddingCredentials: "Embedding model",
      embeddingCredentialsHint: "Required by TauBench's default alltools retrieval variant.",
      searchCredentials: "Search and document tools",
      searchCredentialsHint: "Provide the service credentials used by the selected harness tools.",
      braveRequiredHint: "Brave Search credentials are required for WildClawBench.",
      sandboxCredentials: "Sandbox provider",
      sandboxCredentialsHint: "Credentials required to start the selected remote sandbox.",
      privacy: "Values persist in localStorage and are reused the next time you visit. They are placed directly in the generated command and are never sent to or stored by the documentation server.",
      save: "Save",
      saved: "saved",
      clear: "Clear",
      cancel: "Cancel",
      close: "Close",
      command: "Generated command",
      copied: "copied",
      copy: "copy",
      claudeWarning: "Claude Code requires the Anthropic protocol and a compatible Claude endpoint.",
      codexWarning: "Codex must already exist in the task image or the image must provide Node.js and npm for automatic installation.",
      macosWarning: "Host process support on macOS is limited. Use it only when the benchmark explicitly supports macOS."
    },
    zh: {
      operatingSystem: "操作系统",
      benchmark: "Benchmark",
      benchmarkSearch: "搜索 Benchmark",
      benchmarkSearchPlaceholder: "按名称或 id 搜索...",
      noBenchmarkMatches: "没有匹配的 Benchmark。",
      harness: "Harness",
      recommendedHarness: "推荐",
      otherHarnesses: "其他支持",
      environment: "Environment",
      noEnvironment: "当前操作系统没有适用于该 Benchmark 的 Environment。请使用 WSL 2 或选择其他操作系统。",
      protocol: "模型 API 协议",
      protocolHint: "与当前 Harness 不兼容的协议已禁用。",
      concurrency: "任务并发数",
      custom: "自定义",
      customConcurrency: "自定义并发数",
      envTitle: "命令参数值",
      commandValuesButton: "参数",
      envHint: "填写要直接写入生成命令的 Model 配置，以及 Benchmark、Harness 和 Environment 所需凭据。",
      modelCredentials: "待测模型",
      modelCredentialsHint: "本次评测使用的模型服务端点。",
      judgeCredentials: "Judge 模型",
      judgeCredentialsHint: "该 Benchmark 的评分需要独立且固定的 Judge 模型端点。",
      embeddingCredentials: "Embedding 模型",
      embeddingCredentialsHint: "TauBench 默认的 alltools 检索模式需要该端点。",
      searchCredentials: "搜索与文档工具",
      searchCredentialsHint: "填写所选 Harness 工具使用的服务凭据。",
      braveRequiredHint: "WildClawBench 必须配置 Brave Search 凭据。",
      sandboxCredentials: "远程沙箱",
      sandboxCredentialsHint: "启动所选远程沙箱所需的凭据。",
      privacy: "这些值会直接写入生成的命令，同时保存在浏览器 localStorage 中供下次访问复用；文档服务器不会接收或保存这些信息。",
      save: "保存",
      saved: "已保存",
      clear: "清除",
      cancel: "取消",
      close: "关闭",
      command: "生成的命令",
      copied: "已复制",
      copy: "复制",
      claudeWarning: "Claude Code 需要 Anthropic 协议以及兼容的 Claude Endpoint。",
      codexWarning: "任务镜像需要预装 Codex，或提供 Node.js 和 npm 以便自动安装。",
      macosWarning: "macOS 的 Host Process 支持有限，仅应在 Benchmark 明确支持 macOS 时使用。"
    }
  };
  const text = copy[locale] || copy.en;
  const dialogId = `agentcompass-env-dialog-${locale}`;
  const defaultBenchmark = BENCHMARKS[0];
  const defaultHarness = getRecommendedHarness(defaultBenchmark.id);
  const [selection, setSelection] = useState({
    operatingSystem: "linux",
    benchmark: defaultBenchmark.id,
    harness: defaultHarness,
    environment: getAvailableEnvironments(defaultBenchmark.id, defaultHarness, "linux")[0],
    protocol: getDefaultProtocol(defaultHarness),
    concurrency: "4",
    customConcurrency: ""
  });
  const [envValues, setEnvValues] = useState({
    ...DEFAULT_ENV_VALUES
  });
  const [envDraft, setEnvDraft] = useState({
    ...DEFAULT_ENV_VALUES
  });
  const [envOpen, setEnvOpen] = useState(false);
  const [benchmarkQuery, setBenchmarkQuery] = useState("");
  const [hashReady, setHashReady] = useState(false);
  const [saved, setSaved] = useState(false);
  const [copied, setCopied] = useState(false);
  const [isDark, setIsDark] = useState(false);
  useEffect(() => {
    const updateTheme = () => {
      const root = document.documentElement;
      setIsDark(root.classList.contains("dark") || root.getAttribute("data-theme") === "dark" || root.style.colorScheme === "dark");
    };
    updateTheme();
    const observer = new MutationObserver(updateTheme);
    observer.observe(document.documentElement, {
      attributes: true,
      attributeFilter: ["class", "data-theme", "style"]
    });
    return () => observer.disconnect();
  }, []);
  useEffect(() => {
    try {
      const stored = JSON.parse(window.localStorage.getItem(STORAGE_KEY) || "{}");
      const values = {
        ...DEFAULT_ENV_VALUES
      };
      ENV_KEYS.forEach(key => {
        if (typeof stored[key] === "string" && stored[key].trim()) values[key] = stored[key];
      });
      setEnvValues(values);
      setEnvDraft(values);
    } catch {
      setEnvValues({
        ...DEFAULT_ENV_VALUES
      });
      setEnvDraft({
        ...DEFAULT_ENV_VALUES
      });
    }
  }, []);
  useEffect(() => {
    const dialog = document.getElementById(dialogId);
    if (!dialog) return;
    if (envOpen && !dialog.open) dialog.showModal();
    if (!envOpen && dialog.open) dialog.close();
  }, [dialogId, envOpen]);
  useEffect(() => {
    const raw = window.location.hash.replace(/^#/, "");
    if (!raw) {
      setHashReady(true);
      return;
    }
    const params = new URLSearchParams(raw);
    const benchmark = getBenchmark(params.get("benchmark"));
    const operatingSystem = OPERATING_SYSTEMS.some(item => item.id === params.get("os")) ? params.get("os") : "linux";
    const harnesses = getSupportedHarnesses(benchmark.id);
    const harness = harnesses.includes(params.get("harness")) ? params.get("harness") : getRecommendedHarness(benchmark.id);
    const environments = getAvailableEnvironments(benchmark.id, harness, operatingSystem);
    const environment = environments.includes(params.get("env")) ? params.get("env") : environments[0] || "";
    const protocols = getSupportedProtocols(harness);
    const protocol = protocols.includes(params.get("protocol")) ? params.get("protocol") : protocols[0];
    const concurrencyParam = params.get("concurrency");
    const concurrency = CONCURRENCY_OPTIONS.includes(concurrencyParam) ? concurrencyParam : concurrencyParam ? "custom" : "4";
    setSelection({
      operatingSystem,
      benchmark: benchmark.id,
      harness,
      environment,
      protocol,
      concurrency,
      customConcurrency: concurrency === "custom" ? concurrencyParam : ""
    });
    setHashReady(true);
  }, []);
  useEffect(() => {
    if (!hashReady) return;
    const concurrency = selection.concurrency === "custom" ? selection.customConcurrency : selection.concurrency;
    const params = new URLSearchParams({
      os: selection.operatingSystem,
      benchmark: selection.benchmark,
      harness: selection.harness,
      env: selection.environment,
      protocol: selection.protocol,
      concurrency
    });
    const target = `#${params.toString()}`;
    if (window.location.hash !== target) window.history.replaceState(null, "", target);
  }, [hashReady, selection]);
  const colors = {
    border: isDark ? "#374151" : "#dbe3ed",
    muted: isDark ? "#9ca3af" : "#5f6b7a",
    panel: isDark ? "#111827" : "#f8fafc",
    card: isDark ? "#1f2937" : "#ffffff",
    text: isDark ? "#e5e7eb" : "#172033",
    active: "#0B5CAD",
    activeText: "#ffffff",
    disabled: isDark ? "#111827" : "#f1f5f9",
    warning: isDark ? "#78350f" : "#fff7d6",
    warningText: isDark ? "#fde68a" : "#7c4a03",
    success: isDark ? "#052e16" : "#ecfdf5",
    successText: isDark ? "#86efac" : "#166534",
    code: isDark ? "#0b1220" : "#f8fafc"
  };
  const styles = {
    root: {
      display: "flex",
      flexDirection: "column",
      gap: "10px",
      margin: "18px 0"
    },
    row: {
      display: "grid",
      gridTemplateColumns: "minmax(140px, 0.25fr) minmax(0, 1fr)",
      gap: "12px",
      alignItems: "start",
      padding: "11px",
      border: `1px solid ${colors.border}`,
      borderRadius: "8px",
      background: colors.card
    },
    harnessGroups: {
      display: "flex",
      flexDirection: "column",
      minWidth: 0
    },
    harnessGroup: {
      display: "flex",
      flexDirection: "column",
      alignItems: "flex-start",
      gap: "7px",
      minWidth: 0
    },
    secondaryHarnessGroup: {
      marginTop: "10px"
    },
    harnessGroupTitle: {
      color: colors.muted,
      fontSize: "11px",
      fontWeight: 650,
      lineHeight: 1.35
    },
    title: {
      fontSize: "13px",
      fontWeight: 650,
      color: colors.text,
      paddingTop: "6px"
    },
    options: {
      display: "flex",
      flexWrap: "wrap",
      gap: "7px"
    },
    benchmarkOptions: {
      display: "grid",
      gridTemplateColumns: "repeat(4, minmax(112px, 1fr))",
      gridAutoRows: "44px",
      gap: "7px",
      minWidth: "476px"
    },
    benchmarkPicker: {
      display: "flex",
      flexDirection: "column",
      gap: "8px",
      minWidth: 0
    },
    benchmarkScroller: {
      maxHeight: "146px",
      overflow: "auto",
      paddingRight: "3px",
      scrollbarGutter: "stable"
    },
    benchmarkSearch: {
      width: "100%",
      boxSizing: "border-box",
      padding: "8px 10px",
      border: `1px solid ${colors.border}`,
      borderRadius: "7px",
      background: colors.card,
      color: colors.text,
      fontSize: "12px",
      fontFamily: "inherit"
    },
    button: (active, disabled = false) => ({
      padding: "6px 11px",
      border: `1px solid ${active ? colors.active : colors.border}`,
      borderRadius: "6px",
      background: disabled ? colors.disabled : active ? colors.active : colors.card,
      color: disabled ? colors.muted : active ? colors.activeText : colors.text,
      cursor: disabled ? "not-allowed" : "pointer",
      fontSize: "12px",
      fontWeight: active ? 650 : 500,
      opacity: disabled ? 0.58 : 1
    }),
    benchmarkButton: active => ({
      padding: "8px 10px",
      border: `1px solid ${active ? colors.active : colors.border}`,
      borderLeft: `3px solid ${active ? colors.active : colors.border}`,
      borderRadius: "7px",
      background: active ? isDark ? "#15365d" : "#eef6ff" : colors.card,
      color: colors.text,
      cursor: "pointer",
      textAlign: "left",
      fontSize: "12px",
      fontWeight: active ? 650 : 500,
      lineHeight: 1.2,
      overflow: "hidden"
    }),
    input: {
      width: "100%",
      boxSizing: "border-box",
      padding: "7px 9px",
      border: `1px solid ${colors.border}`,
      borderRadius: "6px",
      background: colors.card,
      color: colors.text,
      fontFamily: "'Menlo', 'Monaco', 'Courier New', monospace",
      fontSize: "12px"
    },
    hint: {
      marginTop: "5px",
      color: colors.muted,
      fontSize: "11px",
      lineHeight: 1.45
    },
    privacy: {
      marginTop: "8px",
      padding: "8px 10px",
      borderRadius: "7px",
      background: colors.success,
      color: colors.successText,
      fontSize: "11px",
      lineHeight: 1.5
    },
    commandCard: {
      overflow: "hidden",
      border: `1px solid ${colors.border}`,
      borderRadius: "12px",
      background: colors.card,
      boxShadow: isDark ? "0 10px 30px rgba(0, 0, 0, 0.18)" : "0 10px 30px rgba(15, 23, 42, 0.06)"
    },
    command: {
      position: "relative",
      padding: "20px 22px 22px",
      margin: 0,
      overflowX: "auto",
      whiteSpace: "pre",
      scrollbarGutter: "stable",
      background: colors.code,
      color: colors.text,
      fontSize: "12.5px",
      lineHeight: 1.65,
      fontFamily: "'Menlo', 'Monaco', 'Courier New', monospace"
    },
    commandHeader: {
      display: "flex",
      justifyContent: "space-between",
      alignItems: "center",
      padding: "11px 13px 11px 16px",
      borderBottom: `1px solid ${colors.border}`,
      background: colors.card,
      color: colors.text,
      fontSize: "12px",
      fontWeight: 650,
      flexWrap: "wrap",
      gap: "8px"
    },
    commandActions: {
      display: "flex",
      alignItems: "center",
      justifyContent: "flex-end",
      flexWrap: "wrap",
      gap: "7px"
    },
    iconButton: {
      display: "inline-flex",
      alignItems: "center",
      justifyContent: "center",
      gap: "5px"
    },
    modalDialog: {
      position: "fixed",
      inset: 0,
      width: "min(560px, calc(100vw - 40px))",
      maxWidth: "none",
      margin: "auto",
      padding: 0,
      border: "none",
      borderRadius: "10px",
      overflow: "visible",
      background: "transparent",
      color: colors.text,
      boxShadow: "0 0 0 100vmax rgba(15, 23, 42, 0.58)"
    },
    modal: {
      display: "flex",
      flexDirection: "column",
      width: "100%",
      maxHeight: "min(720px, calc(100vh - 40px))",
      boxSizing: "border-box",
      overflow: "hidden",
      border: `1px solid ${colors.border}`,
      borderRadius: "10px",
      background: colors.card,
      color: colors.text,
      boxShadow: "0 20px 55px rgba(15, 23, 42, 0.28)"
    },
    modalHeader: {
      display: "flex",
      alignItems: "center",
      justifyContent: "space-between",
      gap: "12px",
      padding: "14px 16px",
      borderBottom: `1px solid ${colors.border}`,
      fontSize: "14px",
      fontWeight: 700
    },
    modalBody: {
      display: "flex",
      flexDirection: "column",
      gap: "13px",
      padding: "16px",
      overflowX: "hidden",
      overflowY: "auto"
    },
    credentialSection: {
      display: "flex",
      flexDirection: "column",
      gap: "11px",
      paddingTop: "3px"
    },
    credentialSectionHeader: {
      paddingBottom: "7px",
      borderBottom: `1px solid ${colors.border}`
    },
    credentialSectionTitle: {
      color: colors.text,
      fontSize: "12px",
      fontWeight: 700
    },
    fieldLabel: {
      display: "block",
      marginBottom: "6px",
      color: colors.text,
      fontFamily: "'Menlo', 'Monaco', 'Courier New', monospace",
      fontSize: "11px",
      fontWeight: 650
    },
    modalFooter: {
      display: "flex",
      alignItems: "center",
      justifyContent: "space-between",
      flexWrap: "wrap",
      gap: "8px",
      padding: "12px 16px",
      borderTop: `1px solid ${colors.border}`
    },
    warning: {
      padding: "9px 11px",
      borderRadius: "7px",
      background: colors.warning,
      color: colors.warningText,
      fontSize: "12px",
      lineHeight: 1.45
    }
  };
  const setField = (key, value) => setSelection(current => ({
    ...current,
    [key]: value
  }));
  const selectOperatingSystem = operatingSystem => {
    const environments = getAvailableEnvironments(selection.benchmark, selection.harness, operatingSystem);
    setSelection(current => ({
      ...current,
      operatingSystem,
      environment: environments.includes(current.environment) ? current.environment : environments[0] || ""
    }));
  };
  const selectBenchmark = benchmarkId => {
    const benchmark = getBenchmark(benchmarkId);
    const harness = getRecommendedHarness(benchmark.id);
    const environments = getAvailableEnvironments(benchmark.id, harness, selection.operatingSystem);
    setSelection(current => ({
      ...current,
      benchmark: benchmark.id,
      harness,
      environment: environments.includes(current.environment) ? current.environment : environments[0] || "",
      protocol: getDefaultProtocol(harness)
    }));
  };
  const selectHarness = harness => {
    const protocols = getSupportedProtocols(harness);
    const commandConfig = getIntegrationCommandConfig(selection.benchmark, harness);
    const environments = getAvailableEnvironments(selection.benchmark, harness, selection.operatingSystem);
    setSelection(current => ({
      ...current,
      harness,
      environment: environments.includes(current.environment) ? current.environment : environments[0] || "",
      protocol: commandConfig.protocol && protocols.includes(commandConfig.protocol) ? commandConfig.protocol : protocols.includes(current.protocol) ? current.protocol : protocols[0],
      concurrency: commandConfig.defaultTaskConcurrency || current.concurrency,
      customConcurrency: commandConfig.defaultTaskConcurrency ? "" : current.customConcurrency
    }));
  };
  const openEnvValues = () => {
    setEnvDraft({
      ...envValues
    });
    setEnvOpen(true);
  };
  const closeEnvValues = () => {
    setEnvDraft({
      ...envValues
    });
    setEnvOpen(false);
  };
  const saveEnvValues = () => {
    const values = Object.fromEntries(ENV_KEYS.map(key => [key, typeof envDraft[key] === "string" && envDraft[key].trim() ? envDraft[key] : DEFAULT_ENV_VALUES[key]]));
    window.localStorage.setItem(STORAGE_KEY, JSON.stringify(values));
    setEnvValues(values);
    setEnvDraft(values);
    setEnvOpen(false);
    setSaved(true);
    setTimeout(() => setSaved(false), 1600);
  };
  const clearEnvValues = () => {
    window.localStorage.removeItem(STORAGE_KEY);
    setEnvValues({
      ...DEFAULT_ENV_VALUES
    });
    setEnvDraft({
      ...DEFAULT_ENV_VALUES
    });
    setSaved(false);
  };
  const benchmark = getBenchmark(selection.benchmark);
  const supportedHarnesses = getSupportedHarnesses(selection.benchmark);
  const recommendedHarness = getRecommendedHarness(selection.benchmark);
  const otherSupportedHarnesses = supportedHarnesses.filter(harness => harness !== recommendedHarness);
  const normalizedBenchmarkQuery = benchmarkQuery.trim().toLowerCase();
  const filteredBenchmarks = BENCHMARKS.filter(item => `${item.label} ${item.id}`.toLowerCase().includes(normalizedBenchmarkQuery));
  const availableEnvironments = getAvailableEnvironments(selection.benchmark, selection.harness, selection.operatingSystem);
  const selectedCommandConfig = getIntegrationCommandConfig(selection.benchmark, selection.harness);
  const supportedProtocols = selectedCommandConfig.protocol ? [selectedCommandConfig.protocol] : getSupportedProtocols(selection.harness);
  const selectedProtocol = selectedCommandConfig.protocol || selection.protocol;
  const concurrency = selection.concurrency === "custom" ? String(Math.max(1, Number.parseInt(selection.customConcurrency, 10) || 1)) : selection.concurrency;
  const judgeModelRequired = benchmarkRequires(selection.benchmark, "judgeModel");
  const embeddingModelRequired = benchmarkRequires(selection.benchmark, "embeddingModel");
  const searchCredentialKeys = getIntegrationCredentialKeys(selection.benchmark, selection.harness);
  const sandboxCredentialKeys = getEnvironmentCredentialKeys(selection.environment);
  const activeEnvSections = [{
    id: "model",
    title: text.modelCredentials,
    hint: text.modelCredentialsHint,
    keys: ["MODEL_NAME", "MODEL_BASE_URL", "MODEL_API_KEY"]
  }, {
    id: "judge",
    title: text.judgeCredentials,
    hint: text.judgeCredentialsHint,
    keys: judgeModelRequired ? ["JUDGE_MODEL_NAME", "JUDGE_MODEL_BASE_URL", "JUDGE_MODEL_API_KEY", "JUDGE_MODEL_API_PROTOCOL"] : []
  }, {
    id: "embedding",
    title: text.embeddingCredentials,
    hint: text.embeddingCredentialsHint,
    keys: embeddingModelRequired ? ["EMBEDDING_MODEL_NAME", "EMBEDDING_MODEL_BASE_URL", "EMBEDDING_MODEL_API_KEY"] : []
  }, {
    id: "search",
    title: text.searchCredentials,
    hint: selection.benchmark === "wildclawbench" ? text.braveRequiredHint : text.searchCredentialsHint,
    keys: searchCredentialKeys
  }, {
    id: "sandbox",
    title: text.sandboxCredentials,
    hint: text.sandboxCredentialsHint,
    keys: sandboxCredentialKeys
  }].filter(section => section.keys.length > 0);
  const isWindows = selection.operatingSystem === "windows";
  const lineContinuation = isWindows ? " `" : " \\";
  const jsonArgument = value => shellQuote(JSON.stringify(value, null, 2), isWindows).replaceAll("\n", "\n  ");
  const deepMerge = (base, override) => {
    const merged = {
      ...base || ({})
    };
    Object.entries(override || ({})).forEach(([key, value]) => {
      merged[key] = value && typeof value === "object" && !Array.isArray(value) && merged[key] && typeof merged[key] === "object" && !Array.isArray(merged[key]) ? deepMerge(merged[key], value) : value;
    });
    return merged;
  };
  const resolveCommandValues = value => {
    if (Array.isArray(value)) return value.map(resolveCommandValues);
    if (value && typeof value === "object") {
      return Object.fromEntries(Object.entries(value).map(([key, item]) => [key, resolveCommandValues(item)]));
    }
    if (typeof value !== "string") return value;
    const match = value.match(/^\$\{([A-Za-z_][A-Za-z0-9_]*)\}$/);
    return match ? envValues[match[1]] || "" : value;
  };
  const useRecommendedConfig = selection.harness === recommendedHarness;
  const benchmarkRecommendedConfig = useRecommendedConfig ? resolveCommandValues(benchmark.recommendedConfig || ({})) : {};
  const integrationCommandConfig = resolveCommandValues(selectedCommandConfig);
  const commandConfig = deepMerge(benchmarkRecommendedConfig, integrationCommandConfig);
  let benchmarkParams = {
    ...commandConfig.benchmarkParams || ({})
  };
  if (judgeModelRequired) {
    benchmarkParams = deepMerge(benchmarkParams, {
      judge_model: {
        id: envValues.JUDGE_MODEL_NAME,
        base_url: envValues.JUDGE_MODEL_BASE_URL,
        api_key: envValues.JUDGE_MODEL_API_KEY,
        api_protocol: envValues.JUDGE_MODEL_API_PROTOCOL || "openai-chat"
      }
    });
  }
  if (embeddingModelRequired) {
    benchmarkParams = deepMerge(benchmarkParams, {
      embedding_model: {
        id: envValues.EMBEDDING_MODEL_NAME,
        base_url: envValues.EMBEDDING_MODEL_BASE_URL,
        api_key: envValues.EMBEDDING_MODEL_API_KEY
      }
    });
  }
  const credentialParams = getIntegrationCredentialParams(selection.benchmark, selection.harness);
  const harnessCredentialParams = Object.fromEntries(Object.entries(credentialParams).map(([key, param]) => [param, envValues[key]]));
  const harnessParams = deepMerge(commandConfig.harnessParams || ({}), harnessCredentialParams);
  const modelParams = commandConfig.modelParams || ({});
  const benchmarkParamsArgument = Object.keys(benchmarkParams).length > 0 ? `  --benchmark-params ${jsonArgument(benchmarkParams)}` : null;
  const harnessParamsArgument = Object.keys(harnessParams).length > 0 ? `  --harness-params ${jsonArgument(harnessParams)}` : null;
  const modelParamsArgument = Object.keys(modelParams).length > 0 ? `  --model-params ${jsonArgument(modelParams)}` : null;
  const environmentCredentialParams = Object.fromEntries(Object.entries(getEnvironmentCredentialParams(selection.environment)).map(([key, param]) => [param, envValues[key]]));
  const environmentParamsArgument = Object.keys(environmentCredentialParams).length > 0 ? `  --env-params ${jsonArgument(environmentCredentialParams)}` : null;
  const recipeArgument = commandConfig.recipe ? `  --recipe ${commandConfig.recipe}` : null;
  const runnable = Boolean(selection.environment);
  const commandLines = runnable ? ["agentcompass run", `  ${benchmark.id}`, `  ${selection.harness}`, `  ${shellQuote(envValues.MODEL_NAME, isWindows)}`, `  --env ${selection.environment}`, recipeArgument, environmentParamsArgument, benchmarkParamsArgument, harnessParamsArgument, modelParamsArgument, `  --model-base-url ${shellQuote(envValues.MODEL_BASE_URL, isWindows)}`, `  --model-api-key ${shellQuote(envValues.MODEL_API_KEY, isWindows)}`, `  --model-api-protocol ${selectedProtocol}`, `  --task-concurrency ${concurrency}`].filter(Boolean) : [];
  const command = runnable ? commandLines.map((line, index) => index < commandLines.length - 1 ? `${line}${lineContinuation}` : line).join("\n") : `# ${text.noEnvironment}`;
  const handleCopy = () => {
    if (!runnable) return;
    navigator.clipboard.writeText(command);
    setCopied(true);
    setTimeout(() => setCopied(false), 1200);
  };
  return <div id="agentcompass-command-builder" style={styles.root}>
      <div style={styles.row}>
        <div style={styles.title}>{text.operatingSystem}</div>
        <div style={styles.options}>
          {OPERATING_SYSTEMS.map(item => <button key={item.id} type="button" style={styles.button(selection.operatingSystem === item.id)} onClick={() => selectOperatingSystem(item.id)}>
              {item.label}
            </button>)}
        </div>
      </div>

      <div style={styles.row}>
        <div style={styles.title}>{text.benchmark}</div>
        <div style={styles.benchmarkPicker}>
          <input type="search" value={benchmarkQuery} style={styles.benchmarkSearch} placeholder={text.benchmarkSearchPlaceholder} aria-label={text.benchmarkSearch} onChange={event => setBenchmarkQuery(event.target.value)} />
          {filteredBenchmarks.length > 0 ? <div style={styles.benchmarkScroller}>
              <div style={styles.benchmarkOptions}>
                {filteredBenchmarks.map(item => <button key={item.id} type="button" style={styles.benchmarkButton(selection.benchmark === item.id)} onClick={() => selectBenchmark(item.id)}>
                    {item.label}
                  </button>)}
              </div>
            </div> : <div style={styles.hint}>{text.noBenchmarkMatches}</div>}
        </div>
      </div>

      <div style={styles.row}>
        <div style={styles.title}>{text.harness}</div>
        <div style={styles.harnessGroups}>
          <div style={styles.harnessGroup}>
            <div style={styles.harnessGroupTitle}>{text.recommendedHarness}</div>
            <div style={styles.options}>
              <button key={recommendedHarness} type="button" style={styles.button(selection.harness === recommendedHarness)} onClick={() => selectHarness(recommendedHarness)}>
                {getHarnessLabel(recommendedHarness)}
              </button>
            </div>
          </div>
          {otherSupportedHarnesses.length > 0 && <div style={{
    ...styles.harnessGroup,
    ...styles.secondaryHarnessGroup
  }}>
              <div style={styles.harnessGroupTitle}>{text.otherHarnesses}</div>
              <div style={styles.options}>
                {otherSupportedHarnesses.map(harness => <button key={harness} type="button" style={styles.button(selection.harness === harness)} onClick={() => selectHarness(harness)}>
                    {getHarnessLabel(harness)}
                  </button>)}
              </div>
            </div>}
        </div>
      </div>

      <div style={styles.row}>
        <div style={styles.title}>{text.environment}</div>
        <div>
          {availableEnvironments.length > 0 ? <div style={styles.options}>
              {availableEnvironments.map(environment => <button key={environment} type="button" style={styles.button(selection.environment === environment)} onClick={() => setField("environment", environment)}>
                  {getEnvironmentLabel(environment)}
                </button>)}
            </div> : <div style={styles.warning}>{text.noEnvironment}</div>}
          {selection.operatingSystem === "macos" && selection.environment === "host_process" && <div style={{
    ...styles.hint,
    color: colors.warningText
  }}>{text.macosWarning}</div>}
        </div>
      </div>

      <div style={styles.row}>
        <div style={styles.title}>{text.protocol}</div>
        <div>
          <div style={styles.options}>
            {PROTOCOLS.map(protocol => {
    const disabled = !supportedProtocols.includes(protocol.id);
    return <button key={protocol.id} type="button" disabled={disabled} style={styles.button(selectedProtocol === protocol.id, disabled)} onClick={() => !disabled && setField("protocol", protocol.id)}>
                  {protocol.label}
                </button>;
  })}
          </div>
          <div style={styles.hint}>{text.protocolHint}</div>
        </div>
      </div>

      <div style={styles.row}>
        <div style={styles.title}>{text.concurrency}</div>
        <div>
          <div style={styles.options}>
            {CONCURRENCY_OPTIONS.map(value => <button key={value} type="button" style={styles.button(concurrency === value)} onClick={() => setField("concurrency", value)}>
                {value}
              </button>)}
            <button type="button" style={styles.button(selection.concurrency === "custom")} onClick={() => setField("concurrency", "custom")}>
              {text.custom}
            </button>
          </div>
          {selection.concurrency === "custom" && <input style={{
    ...styles.input,
    marginTop: "8px",
    maxWidth: "220px"
  }} type="number" min="1" step="1" value={selection.customConcurrency} placeholder={text.customConcurrency} onChange={event => setField("customConcurrency", event.target.value)} aria-label={text.customConcurrency} />}
        </div>
      </div>

      {selection.harness === "claude_code" && <div style={styles.warning}>{text.claudeWarning}</div>}
      {selection.harness === "codex" && <div style={styles.warning}>{text.codexWarning}</div>}

      <div style={styles.commandCard}>
        <div style={styles.commandHeader}>
          <span>{text.command}</span>
          <div style={styles.commandActions}>
            <button type="button" style={{
    ...styles.button(false),
    ...styles.iconButton
  }} onClick={openEnvValues}>
              <svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.8" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">
                <path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8Z" />
                <path d="M14 2v6h6" />
                <path d="M8 14h.01M12 14h.01M16 14h.01" />
              </svg>
              {saved ? `${text.commandValuesButton} · ${text.saved}` : text.commandValuesButton}
            </button>
            <button type="button" disabled={!runnable} style={{
    ...styles.button(false, !runnable),
    ...styles.iconButton
  }} onClick={handleCopy}>
              <svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.8" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">
                <rect width="14" height="14" x="8" y="8" rx="2" />
                <path d="M16 8V6a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h2" />
              </svg>
              {copied ? text.copied : text.copy}
            </button>
          </div>
        </div>
        <pre style={styles.command}>{command}</pre>
      </div>

      <dialog id={dialogId} style={styles.modalDialog} aria-labelledby={`${dialogId}-title`} onCancel={event => {
    event.preventDefault();
    closeEnvValues();
  }} onMouseDown={event => {
    if (event.target === event.currentTarget) closeEnvValues();
  }}>
        <div style={styles.modal}>
          <div style={styles.modalHeader}>
            <span id={`${dialogId}-title`}>{text.envTitle}</span>
            <button type="button" style={styles.button(false)} onClick={closeEnvValues} aria-label={text.close}>
              ×
            </button>
          </div>
          <div style={styles.modalBody}>
            <div style={{
    ...styles.hint,
    marginTop: 0
  }}>{text.envHint}</div>
            {activeEnvSections.map(section => <div key={section.id} style={styles.credentialSection}>
                <div style={styles.credentialSectionHeader}>
                  <div style={styles.credentialSectionTitle}>{section.title}</div>
                  <div style={styles.hint}>{section.hint}</div>
                </div>
                {section.keys.map(key => {
    const field = getCredentialField(key);
    return <label key={key}>
                      <span style={styles.fieldLabel}>{key}</span>
                      {field.type === "select" ? <select style={styles.input} value={envDraft[key] || field.options[0]} onChange={event => setEnvDraft(current => ({
      ...current,
      [key]: event.target.value
    }))}>
                          {field.options.map(option => <option key={option} value={option}>
                              {getProtocolLabel(option)}
                            </option>)}
                        </select> : <input style={styles.input} type={field.type || "text"} value={envDraft[key] || ""} placeholder={field.placeholder || ""} spellCheck="false" autoComplete="off" onChange={event => setEnvDraft(current => ({
      ...current,
      [key]: event.target.value
    }))} />}
                    </label>;
  })}
              </div>)}
            <div style={{
    ...styles.privacy,
    marginTop: 0
  }}>{text.privacy}</div>
          </div>
          <div style={styles.modalFooter}>
            <button type="button" style={styles.button(false)} onClick={clearEnvValues}>
              {text.clear}
            </button>
            <div style={styles.options}>
              <button type="button" style={styles.button(false)} onClick={closeEnvValues}>
                {text.cancel}
              </button>
              <button type="button" style={styles.button(true)} onClick={saveEnvValues}>
                {text.save}
              </button>
            </div>
          </div>
        </div>
      </dialog>
    </div>;
};

通过命令生成器，将已通过单任务验证的配置用于完整 Benchmark 评测。

完成单任务验证后，可以在本页选择 Model API 协议、Benchmark、Harness、Environment、操作系统和并发数，并生成可直接运行的命令。修改选项时，命令预览会实时更新；非敏感选项会保存在页面 URL 中，便于以后继续使用或分享给他人。

## 扩大规模前

运行完整 Benchmark 前，请确认：

* 已使用与完整评测相同的 Model、Benchmark、Harness 和 Environment 成功运行一个代表性任务；操作方式可参考[快速开始](/zh/get_started/quick_start)。
* Model 端点和所选 Environment 的容量、资源和配额足以支持目标并发数。
* 评测所需的数据集、任务镜像、Harness CLI 和可选依赖均已准备就绪。
* 输出目录有足够空间保存所有任务的轨迹、日志和评测产物。

## 命令生成器

使用下方命令生成器选择 Model API 协议、Benchmark、Harness、Environment 和并发数等设置。每次修改选项后，请检查更新后的命令预览；确认无误后，在已安装 AgentCompass 的 Python 环境中执行生成的命令。

<AgentCompassCommandBuilder locale="zh" catalog={COMMAND_BUILDER_CATALOG} ui={COMMAND_BUILDER_UI} runtimeFactory={createCommandBuilderRuntime} />

<Tip>
  点击 **参数** 可以填写 Model 端点、Model 名称和必要凭证。如果所选配置需要其他服务，表单还会显示评委 Model、嵌入 Model、搜索工具或所选 Environment 的凭证字段。生成的命令直接以 `agentcompass run` 开头，并将所有值写入对应的 CLI 参数，包括 `--benchmark-params`、`--harness-params` 和 `--env-params`。

  如需在后续访问中复用这些值，可以将其保存在当前浏览器中；凭证更新或不再使用时，请及时清除。
</Tip>

<Danger>
  保存的值会写入当前浏览器的 `localStorage`，并在下次访问时复用。文档服务器不会接收或保存这些值；请勿在共享设备上保存凭证。
</Danger>

## 常见问题

### 如何设置合适的并发数？

任务并发数决定 AgentCompass 最多同时评测多少个样本。提高并发数可能缩短整体运行时间，但也会增加 Model 请求流量、Environment 资源用量和 host 内存压力，并更容易触发限流或超出配额。

实际可用的并发数取决于 Model 端点容量、所选 Environment 的资源与配额，以及 host 的 CPU 和内存。先以低并发完成一小批任务，再逐步提高并观察任务启动耗时、Model 延迟、错误率和配额用量。如果出现限流、错误率升高或资源不足，请退回上一个稳定值。

### 如何调整生成器未提供的参数？

命令生成器提供了运行完整评测所需的常用设置。其他 CLI 参数和默认值见 [`agentcompass run`](/zh/user_guide/using_agentcompass/cli/run#参数参考)，配置优先级见 [`agentcompass config`](/zh/user_guide/using_agentcompass/cli/config#覆盖顺序)；组件专属字段分别见 [Model](/zh/user_guide/modules/models/overview)、[Benchmark](/zh/user_guide/modules/benchmarks/overview)、[Harness](/zh/user_guide/modules/harnesses/overview) 和 [Environment](/zh/user_guide/modules/environments/overview)。建议从生成的命令开始，只添加本次评测确实需要调整的参数。
