Preskočiť na obsah

Codex

Codex je asistent na programovanie využívajúci umelú inteligenciu od spoločnosti OpenAI. Umožňuje kontrolovať a upravovať súbory, spúšťať príkazy a pracovať s existujúcim zdrojovým kódom z terminálu.

V infraštruktúre SAV sa Codex spúšťa v kontajneri Singularity/Apptainer na prihlasovacom uzle HPC. Pripája sa priamo k službám OpenAI; nevyžaduje server vLLM ani tunel SSH.

Rýchly štart

V adresári svojho projektu spustite:

cd ~/my-project
~/llm/codex.sh

Spúšťací skript zobrazí ponuku:

Relácia Codex:

  1) Obnoviť poslednú reláciu
  2) Spustiť novú reláciu
  3) Vybrať predchádzajúcu reláciu
  4) Ukončiť

Vyberte [1]:

Stlačením klávesu Enter obnovíte poslednú reláciu. Prípadne vyberte inú možnosť.

Spúšťací skript

Nižšie uvedený skript uložte ako ~/llm/codex.sh a nastavte mu právo na spustenie:

chmod +x ~/llm/codex.sh

Na rozpoznanie UID a skupiny používateľa v kontajneri skript využíva dva súbory s údajmi o účte z hostiteľského systému. Vytvorte ich jednorazovo:

mkdir -p ~/llm
getent passwd root "$USER" > ~/llm/.container_passwd
getent group root "$(id -gn)" > ~/llm/.container_group

Ak sa zmenia údaje vášho účtu alebo primárna skupina, súbory vytvorte znova. Skript nespúšťajte ako používateľ root, pokiaľ nechcete zámerne použiť jeho autentifikáciu a históriu relácií.

Autentifikácia

Codex sa pripája k službám OpenAI. Prihláste sa spôsobom podporovaným vašou inštaláciou a účtom, spravidla spustením Codexu a vykonaním pokynov na prihlásenie. Skript pripája adresár $HOME, takže konfigurácia a údaje o reláciách zostávajú zachované medzi spusteniami. Lokálny API kľúč pre vLLM nie je potrebný.

Používanie

codex.sh [WORKSPACE] [MODE] [-B HOST[:CONTAINER]] [-- CODEX_ARGS...]

  WORKSPACE    Pracovný adresár (predvolene aktuálny adresár)
  MODE         --continue, --new, --resume alebo --list
  -B, --bind   Ďalšie pripojenie adresára (možno opakovať)
  -- ARGS      Ďalšie argumenty odovzdané Codexu

Príklady:

# Otvorenie ponuky v aktuálnom adresári.
~/llm/codex.sh

# Práca v inom adresári a spustenie novej relácie.
~/llm/codex.sh /myproject/path --new

# Obnovenie poslednej relácie.
~/llm/codex.sh --continue

# Otvorenie výberu relácií.
~/llm/codex.sh --resume

# Pripojenie ďalších adresárov.
~/llm/codex.sh /myproject/path \
    -B /project/<account_ID>:/project/<account_ID> \
    -B /scratch/<account_ID>:/scratch/<account_ID>

# Zobrazenie pomocníka Codex CLI.
~/llm/codex.sh --new -- --help

Režimy relácií

Režim skriptu Argumenty Codexu Účinok
--continue --no-daemon resume --last Obnovenie poslednej relácie
--new --no-daemon Spustenie novej relácie
--resume --no-daemon resume Otvorenie výberu relácií
--list --no-daemon resume Alternatíva na otvorenie výberu relácií
(none) Interaktívna ponuka Výber režimu

--continue a --resume sú voľby spúšťacieho skriptu, nie priame voľby Codexu. Codex na obnovenie relácií používa podpríkaz resume. Voľba --no-daemon sa používa preto, že niektoré kontajnerové inštalácie neobsahujú kompletný balík servera na pozadí. Ak sa vaša verzia správa inak, skontrolujte codex --help a codex resume --help.

Funkcia spúšťacieho skriptu

Skript kontroluje obraz kontajnera a pracovný adresár, spracúva voľby relácií a ďalšie pripojené adresáre, podľa potreby načíta Singularity a spustí Codex so zvolenými argumentmi. Cestu k obrazu kontajnera a ku konfigurácii Slurmu možno nastaviť bez úpravy skriptu.

~/llm/codex.sh
#!/bin/bash
set -euo pipefail

# ----------------------------------------------------------------------
# Configuration
# ----------------------------------------------------------------------

CODEX_SIF="${CODEX_SIF:-/apps/images/vllm/x86_64/Codex_x86_64_Nov2026_perun.sif}"

if [[ -z "$CODEX_SIF" || ! -f "$CODEX_SIF" ]]; then
    echo "ERROR: CODEX_SIF is not set or the image does not exist." >&2
    echo "Example: export CODEX_SIF=/path/to/Codex.sif" >&2
    exit 1
fi

USER_HOME="$HOME"
USER_LLM_DIR="$HOME/llm"

WORKSPACE="$PWD"
WORKSPACE_SET=0
MODE=""

EXTRA_ARGS=()
EXTRA_BINDS=()

# ----------------------------------------------------------------------
# Usage
# ----------------------------------------------------------------------

usage() {
    cat <<EOF
Usage:
  $(basename "$0") [WORKSPACE] [MODE] [OPTIONS] [-- CODEX_ARGS...]

Modes:
  --continue       Continue the last session
  --new            Start a new session
  --resume         Select a previous session
  --list           Open the session picker

Options:
  -B, --bind HOST[:CONTAINER]
                   Add an additional bind mount (repeatable)
  -h, --help       Show this help

Examples:
  $(basename "$0")
  $(basename "$0") /project/myproject
  $(basename "$0") --continue
  $(basename "$0") /project/myproject --new
  $(basename "$0") -B /data:/data
  $(basename "$0") /project/myproject -B /data:/data -- --model gpt-5.1-codex

Default bind mounts:
  \$HOME:\$HOME
  /project/p2075-26-2:/project/p2075-26-2
  /run/munge:/run/munge
  /var/spool/slurmd/conf-cache:/etc/slurm
  \$HOME/llm/.container_passwd:/etc/passwd
  \$HOME/llm/.container_group:/etc/group
EOF
}

# ----------------------------------------------------------------------
# Parse arguments
# ----------------------------------------------------------------------

while [[ $# -gt 0 ]]; do
    case "$1" in
        --continue|--new|--resume|--list)
            MODE="$1"
            shift
            ;;

        -B|--bind)
            if [[ $# -lt 2 ]]; then
                echo "ERROR: $1 requires a bind specification." >&2
                exit 1
            fi

            EXTRA_BINDS+=("$2")
            shift 2
            ;;

        --)
            shift
            EXTRA_ARGS+=("$@")
            break
            ;;

        -h|--help)
            usage
            exit 0
            ;;

        -*)
            echo "ERROR: Unknown option: $1" >&2
            usage >&2
            exit 1
            ;;

        *)
            if [[ "$WORKSPACE_SET" -eq 0 ]]; then
                WORKSPACE="$1"
                WORKSPACE_SET=1
            else
                echo "ERROR: Unexpected argument: $1" >&2
                usage >&2
                exit 1
            fi
            shift
            ;;
    esac
done

# ----------------------------------------------------------------------
# Validate workspace
# ----------------------------------------------------------------------

WORKSPACE="$(realpath "$WORKSPACE")"

if [[ ! -d "$WORKSPACE" ]]; then
    echo "ERROR: Workspace does not exist: $WORKSPACE" >&2
    exit 1
fi

# ----------------------------------------------------------------------
# Interactive session menu
# ----------------------------------------------------------------------

case "$MODE" in
    --continue)
        CODEX_ARGS=(--no-daemon resume --last)
        ;;

    --new)
        CODEX_ARGS=(--no-daemon)
        ;;

    --resume|--list)
        CODEX_ARGS=(--no-daemon resume)
        ;;

    "")
        if [[ ! -t 0 ]]; then
            echo "Not a terminal. Pass --continue, --new," >&2
            echo "--resume or --list explicitly." >&2
            exit 1
        fi

        echo
        echo "Codex session:"
        echo
        echo "  1) Continue last session"
        echo "  2) Start new session"
        echo "  3) Select previous session"
        echo "  4) List sessions"
        echo "  5) Exit"
        echo

        read -r -p "Select [1]: " CHOICE || CHOICE=1

        # Pressing Enter selects the default.
        CHOICE=${CHOICE:-1}

        case "$CHOICE" in
            1)
                CODEX_ARGS=(--no-daemon resume --last)
                ;;
            2)
                CODEX_ARGS=(--no-daemon)
                ;;
            3|4)
                CODEX_ARGS=(--no-daemon resume)
                ;;
            5)
                exit 0
                ;;
            *)
                echo "Invalid selection." >&2
                exit 1
                ;;
        esac
        ;;

    *)
        echo "Unknown option: $MODE" >&2
        usage >&2
        exit 1
        ;;
esac

# Append additional Codex arguments.
CODEX_ARGS+=("${EXTRA_ARGS[@]}")

# ----------------------------------------------------------------------
# Default bind mounts
# ----------------------------------------------------------------------

BINDS=(
    "$WORKSPACE:$WORKSPACE"
    "$USER_HOME:$USER_HOME"
    "/project/p2075-26-2:/project/p2075-26-2"
    "/run/munge:/run/munge"
    "/var/spool/slurmd/conf-cache:/etc/slurm"
    "$USER_LLM_DIR/.container_passwd:/etc/passwd"
    "$USER_LLM_DIR/.container_group:/etc/group"
)

# Append user-defined bind mounts.
for bind in "${EXTRA_BINDS[@]}"; do
    BINDS+=("$bind")
done

# ----------------------------------------------------------------------
# Load Singularity
# ----------------------------------------------------------------------

if command -v module >/dev/null 2>&1; then
    module load singularity
fi

if ! command -v singularity >/dev/null 2>&1; then
    echo "ERROR: singularity command not found." >&2
    exit 1
fi

# Check architecture.
if [[ "$(uname -m)" != "x86_64" ]]; then
    echo "ERROR: This Codex image requires x86_64." >&2
    exit 1
fi

# ----------------------------------------------------------------------
# Build bind arguments
# ----------------------------------------------------------------------

SINGULARITY_BINDS=()

for bind in "${BINDS[@]}"; do
    SINGULARITY_BINDS+=(--bind "$bind")
done

# ----------------------------------------------------------------------
# Launch Codex
# ----------------------------------------------------------------------

singularity exec \
    "${SINGULARITY_BINDS[@]}" \
    --pwd "$WORKSPACE" \
    --env "PATH=/usr/local/bin:/opt/agent_env/bin:/opt/slurm/bin:/opt/slurm/sbin:$HOME/.local/bin:/usr/bin:/bin" \
    "$CODEX_SIF" \
    bash -lc 'exec codex "$@"' -- "${CODEX_ARGS[@]}"

Pripojenie SLURM na clustri Devana

Na clustri Devana je potrebné pripojiť SLURM nasledovne -- bind /etc/slurm:/etc/slurm & --env "PATH=/usr/local/bin:/opt/agent_env/bin:$HOME/.local/bin:/usr/bin:/bin"

Zodpovedné používanie agentov

Codex môže spúšťať príkazy a upravovať súbory. Príkazy spustené priamo agentom sa vykonávajú na prihlasovacom, nie výpočtovom uzle. Výpočtovo náročné kompilácie, testy a simulácie preto spúšťajte prostredníctvom Slurmu.

Agentovi môžete napríklad zadať:

Skompiluj softvér a spusti jeho testy. Kompiláciu a testy odošli cez Slurm
do CPU partície s použitím príslušného projektového účtu. Skontroluj stav
úlohy a oznám výsledok.

Čerpanie výpočtovej alokácie

Codex môže odosielať úlohy, ktoré čerpajú výpočtovú alokáciu vášho projektu. Zadajte projektový účet, partíciu, požadované zdroje a časový limit. Bežiace úlohy kontrolujte príkazom squeue -u "$USER".

Úpravy súborov

Codex vykonáva skutočné zmeny súborov. Pracujte v správnom projektovom adresári, používajte správu verzií a pred potvrdením zmien alebo spustením vygenerovaného kódu skontrolujte vykonané úpravy.

Pripojenie adresárov

Skript pripája pracovný a domovský adresár. Ak sú dostupné, pripája aj prostriedky Munge a Slurmu a voliteľné súbory s údajmi o používateľovi.

Pripojenie Účel
$WORKSPACE:$WORKSPACE Prístup k projektovému adresáru
$HOME:$HOME Trvalé uloženie autentifikácie, konfigurácie a relácií
/run/munge:/run/munge Adresár autentifikačného socketu Munge
$SLURM_CONF_DIR:/etc/slurm Konfigurácia klienta Slurm
.container_passwd:/etc/passwd Rozpoznanie používateľského účtu hostiteľa
.container_group:/etc/group Rozpoznanie skupiny hostiteľa

Ďalšie adresáre možno pripojiť opakovaným použitím voľby -B:

~/llm/codex.sh /myproject/path \
    -B /project/<account_ID>:/project/<account_ID> \
    -B /scratch/<account_ID>:/scratch/<account_ID>

Zdrojové cesty musia na hostiteľskom systéme existovať a byť prístupné. Pripojenie pracovného adresára automaticky nesprístupní ostatné adresáre mimo neho.

Riešenie problémov

Obraz kontajnera Codex sa nenašiel

Skontrolujte nastavenú cestu:

printf '%s\n' "$CODEX_SIF"
ls -lh "$CODEX_SIF"

Ak CODEX_SIF nie je nastavená, nastavte cestu k obrazu podľa postupu vyššie.

unexpected argument '--continue' found

--continue nie je priamou voľbou Codexu. Použite voľbu spúšťacieho skriptu --continue, ktorá sa prevedie na codex --no-daemon resume --last. Voľbu --continue neposielajte priamo spustiteľnému súboru Codexu.

this CLI has no complete local package

Niektoré kontajnerové obrazy obsahujú CLI, ktoré nedokáže spustiť server na pozadí. Nainštalovaná verzia môže odporučiť voľbu --no-daemon. Skript ju používa pri nových aj obnovených reláciách. Ak problém pretrváva, skontrolujte inštaláciu alebo vytvorte nový obraz s kompletným CLI.

Skontrolujte nainštalované rozhranie príkazového riadka:

apptainer exec "$CODEX_SIF" codex --help
apptainer exec "$CODEX_SIF" codex resume --help

codex: command not found

Skontrolujte spustiteľný súbor v kontajneri:

apptainer exec "$CODEX_SIF" sh -c 'command -v codex'

Ak sa spustiteľný súbor nachádza inde, upravte premennú PATH v kontajneri alebo záverečný príkaz spúšťacieho skriptu.

Príkazy Slurmu v kontajneri nefungujú

Skontrolujte dostupné prostriedky na hostiteľskom systéme:

ls -ld /run/munge "$SLURM_CONF_DIR"
ls -l ~/llm/.container_passwd ~/llm/.container_group

Overte, že klient Slurmu je dostupný v kontajneri:

apptainer exec \
    --bind /run/munge:/run/munge \
    --bind "$SLURM_CONF_DIR:/etc/slurm" \
    --env 'PATH=/opt/slurm/bin:/opt/slurm/sbin:/usr/bin:/bin' \
    "$CODEX_SIF" squeue -u "$USER"
Príznak Možná príčina
squeue: command not found Spustiteľné súbory Slurmu nie sú v PATH
Neplatný používateľ/skupina Chýbajúce alebo neaktuálne súbory s údajmi o účte
Chyba autentifikácie Munge Socket Munge nie je dostupný alebo pripojený
Nemožno kontaktovať riadiaci uzol Nesprávna konfigurácia Slurmu alebo problém so spojením
Chyba pripojenia adresára Zdrojová cesta neexistuje alebo nie je prístupná

Codex nemá prístup k projektovým súborom

Skontrolujte prístupové práva a ďalšie cesty pripojte pomocou -B:

ls -ld "$PWD"
~/llm/codex.sh "$PWD" -B /project/shared:/project/shared

Reláciu nemožno obnoviť

História relácií je uložená v domovskom adresári používateľa. Použite rovnaký unixový účet a domovský adresár ako pri vytvorení relácie. Na výber predchádzajúcej relácie spustite:

~/llm/codex.sh --resume

Relácia vytvorená bežným používateľom nemusí byť viditeľná pri spustení skriptu ako root.

Prehľad príkazov a nastavení

Úloha Príkaz
Interaktívna ponuka ~/llm/codex.sh
Obnoviť poslednú reláciu ~/llm/codex.sh --continue
Spustiť novú reláciu ~/llm/codex.sh --new
Vybrať predchádzajúcu reláciu ~/llm/codex.sh --resume
Alternatívny príkaz na výber relácie ~/llm/codex.sh --list
Iný pracovný adresár ~/llm/codex.sh ~/my-project
Pripojiť ďalší adresár ~/llm/codex.sh -B /data:/data
Pomocník Codexu ~/llm/codex.sh --new -- --help
Premenná Účel
CODEX_SIF Cesta k obrazu Singularity s Codexom
SLURM_CONF_DIR Adresár konfigurácie Slurmu na hostiteľovi

Odkazy

Created by: Marek Štekláč