Skip to content

Latest commit

ย 

History

History
525 lines (421 loc) ยท 30.4 KB

getting-started.md

File metadata and controls

525 lines (421 loc) ยท 30.4 KB

XGEN ์„ค์น˜์™€ ์ฒซ ์‹คํ–‰

์ด ๋ฌธ์„œ๋Š” Developer Preview v0.1.0-rc.3 release artifact๊ฐ€ ๊ฒŒ์‹œ๋œ ๋’ค binary ํ•˜๋‚˜๋ฅผ ์„ค์น˜ํ•˜๊ณ  OpenAI-compatible model์— ์—ฐ๊ฒฐํ•ด ํŒŒ์ผ ์ฝ๊ธฐ๋ถ€ํ„ฐ ํ”„๋กœ์ ํŠธ ํƒ์ƒ‰ยท์ˆ˜์ •ยทtest/build๊นŒ์ง€ ์‹คํ–‰ํ•˜๋Š” ์ตœ์†Œ ์ ˆ์ฐจ๋‹ค. RC3 ํ›„๋ณด๋Š” exact --allow-file, --allow-dir workspace discovery, atomic write/patch์™€ host-catalogued shell-free process ์‹คํ–‰์„ ํฌํ•จํ•œ๋‹ค. Native installer ๊ฒฝ๋กœ๋Š” ์†Œ์Šค ๊ฐœ๋ฐœ ์ ˆ์ฐจ์™€ ๋‹ฌ๋ฆฌ Rust, C compiler, Python, Node.js, SQLite ์‹คํ–‰ ํŒŒ์ผ, Docker ๋˜๋Š” XGEN state์šฉ ๋ณ„๋„ daemon์ด ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค. npm ๊ฒฝ๋กœ๋งŒ launcher์šฉ Node.js 22.14 ์ด์ƒ์ด ํ•„์š”ํ•˜๋‹ค. ์‚ฌ์šฉํ•  model endpoint ์ž์ฒด๋Š” ๋กœ์ปฌ ๋˜๋Š” ์›๊ฒฉ์— ๋ณ„๋„๋กœ ์‹คํ–‰ ์ค‘์ด์–ด์•ผ ํ•œ๋‹ค.

5๋ถ„ ๋น ๋ฅธ ์‹œ์ž‘

๋จผ์ € ์‚ฌ์šฉํ•  OpenAI-compatible endpoint URL, served model ID์™€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ API key๋ฅผ ์ค€๋น„ํ•œ๋‹ค. Node.js 22.14 ์ด์ƒ์ด ์žˆ๋Š” ์ง€์› OS์—์„œ๋Š” ์•„๋ž˜ ์ˆœ์„œ๊ฐ€ ๊ฐ€์žฅ ์งง๋‹ค.

npm install --global --include=optional @xgen-ai/cli@0.1.0-rc.3
xgen --version
xgen model setup
xgen model check --compatibility
cd my-project
xgen

๋Œ€ํ™”ํ˜• ํ™”๋ฉด์—์„œ /status๋กœ ์„ ํƒ model๊ณผ idle ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๊ณ , ์ž‘์€ ์ฝ๊ธฐ ์ „์šฉ ์ž‘์—…์œผ๋กœ ์ฒซ ์Šน์ธ์„ ํ™•์ธํ•œ ๋’ค /exit์œผ๋กœ ์ข…๋ฃŒํ•œ๋‹ค. Model egress์™€ file read๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ์Šน์ธ์ด๋‹ค. Node.js๋ฅผ ์„ค์น˜ํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด ์•„๋ž˜ checksum installer๋ฅผ ์‚ฌ์šฉํ•œ ๋’ค xgen model setup๋ถ€ํ„ฐ ๊ฐ™์€ ์ˆœ์„œ๋กœ ์ง„ํ–‰ํ•œ๋‹ค. API key๋ฅผ ๋ช…๋ นํ–‰ ์ธ์ž, shell history ๋˜๋Š” ์ผ๋ฐ˜ ์„ค์ • ํŒŒ์ผ์— ๋„ฃ์ง€ ์•Š๋Š”๋‹ค.

์ž‘์—… ๋’ค /usage๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์ถ”๊ฐ€ API ํ˜ธ์ถœ ์—†์ด ์ž…๋ ฅยท์ถœ๋ ฅยทcached input ํ† ํฐ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. xgen usage RUN_ID๋Š” ๋ณ„๋„ ํ„ฐ๋ฏธ๋„์—์„œ๋„ ์ƒ์„ธ JSON์„ ์ถœ๋ ฅํ•œ๋‹ค. ์‚ฌ์šฉ๋Ÿ‰ ๊ธฐ๋ก์ด ์—†๋Š” ์ด์ „ Run์ด๋‚˜ provider๊ฐ€ ์ˆ˜์น˜๋ฅผ ๋ณด๋‚ด์ง€ ์•Š์€ ํ˜ธ์ถœ์€ ๋ฏธ์ƒ์ด๋ฉฐ, ๋ถ€๋ถ„ ํ•ฉ๊ณ„๋Š” ์‹ค์ œ ์ด๋น„์šฉ์œผ๋กœ ํ•ด์„ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋ณ„๋„ ์‚ฌ์šฉ๋Ÿ‰ ์„ค์ •์€ ํ•„์š” ์—†๋‹ค. ๋น„์šฉ์„ ์ถ”์ •ํ•  ๋•Œ๋งŒ ํ˜„์žฌ ๊ณ„์•ฝ์˜ USD/๋ฐฑ๋งŒ ํ† ํฐ ๋‹จ๊ฐ€๋ฅผ --input-price, --cached-input-price, --output-price ์„ธ ์˜ต์…˜์œผ๋กœ ํ•จ๊ป˜ ์ง€์ •ํ•œ๋‹ค.

๊ฒŒ์‹œ target๊ณผ CI ๊ฒ€์ฆ OS

CI runner OS Architecture Release asset
Ubuntu 24.04 x86-64 xgen-x86_64-unknown-linux-musl
Ubuntu 24.04 ARM (public preview runner) ARM64 xgen-aarch64-unknown-linux-musl
macOS 15 Intel xgen-x86_64-apple-darwin
macOS 15 Apple Silicon xgen-aarch64-apple-darwin
Windows Server 2025 + Visual Studio 2026 x86-64 xgen-x86_64-pc-windows-msvc.exe

Linux binary๋Š” musl target, Windows binary๋Š” static CRT๋กœ ๋นŒ๋“œํ•œ๋‹ค. macOS์™€ Windows artifact๋Š” ํ˜„์žฌ prototype ๋‹จ๊ณ„์—์„œ OS code signing/notarization์ด ์—†์œผ๋ฏ€๋กœ Gatekeeper ๋˜๋Š” SmartScreen ๊ฒฝ๊ณ ๊ฐ€ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ๋‹ค. GitHub build attestation์€ build provenance๋ฅผ ๊ฒ€์ฆํ•˜์ง€๋งŒ OS code signing์„ ๋Œ€์‹ ํ•˜์ง€ ์•Š๋Š”๋‹ค. ํ‘œ๋ณด๋‹ค ์˜ค๋ž˜๋œ OS version์€ ์•„์ง ์„ค์น˜ E2E๋ฅผ ํ†ต๊ณผํ–ˆ๋‹ค๊ณ  ์ฃผ์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.

์„ค์น˜

Node.js 22.14 ์ด์ƒ์ด ์ด๋ฏธ ์žˆ๋Š” ๊ฐœ๋ฐœ์ž๋Š” RC3๊ฐ€ npm์— ๊ฒŒ์‹œ๋œ ๋’ค ๋‹ค์Œ์ฒ˜๋Ÿผ exact version์„ ์„ค์น˜ํ•œ๋‹ค. @xgen-ai/cli์—๋Š” lifecycle script๊ฐ€ ์—†๊ณ  ํ˜„์žฌ OS/CPU์šฉ native optional package ํ•˜๋‚˜๋ฅผ registry์—์„œ ํ•จ๊ป˜ ์„ค์น˜ํ•œ๋‹ค. ์„ค์น˜ ์ค‘ GitHub download๋‚˜ source compile์„ ํ•˜์ง€ ์•Š๋Š”๋‹ค.

npm install --global @xgen-ai/cli@0.1.0-rc.3
xgen --version
xgen licenses

Prerelease ์ตœ์‹  ์ฑ„๋„์€ @xgen-ai/cli@next, stable์€ @xgen-ai/cli@latest์ง€๋งŒ ์žฌํ˜„ ๊ฐ€๋Šฅํ•œ ์„ค์น˜์™€ ๊ฒ€์ฆ์—๋Š” exact version์„ ์‚ฌ์šฉํ•œ๋‹ค. npm install --omit=optional์€ ์‹คํ–‰ binary package๋ฅผ ์ œ๊ฑฐํ•˜๋ฏ€๋กœ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค. npm ๊ฒฝ๋กœ์—์„œ platform package๋ฅผ ์ฐพ์ง€ ๋ชปํ•˜๋ฉด launcher๋Š” ๋‹ค๋ฅธ binary๋ฅผ ๋‚ด๋ ค๋ฐ›์ง€ ์•Š๊ณ  ์ข…๋ฃŒํ•œ๋‹ค.

Node.js๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์‹ถ์ง€ ์•Š๊ฑฐ๋‚˜ GitHub attestation๊นŒ์ง€ ์ง์ ‘ ํ™•์ธํ•˜๋ ค๋ฉด ์•„๋ž˜ checksum installer ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

Installer๋ฅผ ๋จผ์ € ํŒŒ์ผ๋กœ ๋ฐ›์€ ๋’ค ๊ฒ€ํ† ยท์‹คํ–‰ํ•œ๋‹ค. Installer๋Š” shell profile์ด๋‚˜ user PATH๋ฅผ ์ž๋™์œผ๋กœ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ๊ด€๋ฆฌ์ž ๊ถŒํ•œ์„ ์š”์ฒญํ•˜์ง€ ์•Š๋Š”๋‹ค. RC3๋Š” prerelease์ด๋ฏ€๋กœ stable release๋งŒ ๊ฐ€๋ฆฌํ‚ค๋Š” releases/latest ๋Œ€์‹  ์•„๋ž˜ exact tag๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ํ›„๋ณด version PR์˜ merge๋งŒ์œผ๋กœ artifact๊ฐ€ ์ƒ๊ธฐ์ง€๋Š” ์•Š์œผ๋ฏ€๋กœ GitHub Release์— v0.1.0-rc.3์ด ๊ฒŒ์‹œ๋œ ๊ฒƒ์„ ํ™•์ธํ•œ ๋’ค ์‹คํ–‰ํ•œ๋‹ค.

Linux/macOS:

installer=$(mktemp "${TMPDIR:-/tmp}/xgen-installer.XXXXXX")
curl -q --proto '=https' --proto-redir '=https' --tlsv1.2 \
  --connect-timeout 15 --max-time 60 --max-filesize 1048576 -fsSLo "$installer" \
  https://github.com/PlateerLab/xgen-cli/releases/download/v0.1.0-rc.3/xgen-installer.sh
sh "$installer" --version v0.1.0-rc.3
rm -f "$installer"
export PATH="$HOME/.local/bin:$PATH"

Windows PowerShell:

$installer = Join-Path ([System.IO.Path]::GetTempPath()) "xgen-installer-$([Guid]::NewGuid().ToString('N')).ps1"
curl.exe -q --proto "=https" --proto-redir "=https" --tlsv1.2 --connect-timeout 15 --max-time 60 --max-filesize 1048576 -fsSLo $installer "https://github.com/PlateerLab/xgen-cli/releases/download/v0.1.0-rc.3/xgen-installer.ps1"
if ($LASTEXITCODE -ne 0) { throw "XGEN installer download failed" }
& $installer -Version v0.1.0-rc.3
Remove-Item -LiteralPath $installer
$env:Path = "$env:LOCALAPPDATA\XGEN\bin;$env:Path"

Windows client์˜ effective execution policy๊ฐ€ Restricted๋ฉด & $installer๊ฐ€ ์ฐจ๋‹จ๋  ์ˆ˜ ์žˆ๋‹ค. ๋‚ด์šฉ์„ ๊ฒ€ํ† ํ•œ ๋’ค์—๋งŒ ํ˜„์žฌ process ํ•œ์ •์œผ๋กœ powershell.exe -NoProfile -ExecutionPolicy Bypass -File $installer๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์„œ๋ช…๋œ installer/winget ๊ฒฝ๋กœ๋Š” prototype ์ดํ›„ ๋ฒ”์œ„๋‹ค.

๊ธฐ๋ณธ ์œ„์น˜๋Š” Linux/macOS์˜ $HOME/.local/bin/xgen, Windows์˜ %LOCALAPPDATA%\XGEN\bin\xgen.exe๋‹ค. ๋‹ค๋ฅธ user-owned ์œ„์น˜๋Š” ๊ฐ๊ฐ --install-dir ๋˜๋Š” -InstallDir๋กœ ์ง€์ •ํ•œ๋‹ค. ์„ค์น˜๊ธฐ๋Š” ๋‹ค์Œ ์ˆœ์„œ๋ฅผ fail-closed๋กœ ์ˆ˜ํ–‰ํ•œ๋‹ค.

  1. OS์™€ architecture์— ๋งž๋Š” raw binary ํ•˜๋‚˜ ๋ฐ checksums.sha256์„ ๊ฐ™์€ exact release์—์„œ ๋ฐ›๋Š”๋‹ค.
  2. SHA-256์ด ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
  3. ๋ฐ›์€ binary์˜ --version์ด ์š”์ฒญ tag์™€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
  4. xgen protocol check๋ฅผ ์™ธ๋ถ€ network ์—†์ด ์‹คํ–‰ํ•œ๋‹ค.
  5. symbolic link/reparse point๊ฐ€ ์•„๋‹Œ regular destination์— ๊ฐ™์€-directory rename์œผ๋กœ ์„ค์น˜ํ•œ๋‹ค.

Project, Cargo dependency, Rust standard library, Linux musl๊ณผ LLVM libunwind์˜ ๊ณ ์ง€๋Š” ์„ค์น˜๋œ binary์— ํฌํ•จ๋œ๋‹ค. ํ™•์ธ ๋ช…๋ น์€ runtime state๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ network๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

xgen licenses

์žฌํ˜„ ๊ฐ€๋Šฅํ•œ ์„ค์น˜์—๋Š” latest ๋Œ€์‹  exact tag๋ฅผ ์ง€์ •ํ•œ๋‹ค.

installer=$(mktemp "${TMPDIR:-/tmp}/xgen-installer.XXXXXX")
curl -q --proto '=https' --proto-redir '=https' --tlsv1.2 \
  --connect-timeout 15 --max-time 60 --max-filesize 1048576 -fsSLo "$installer" \
  https://github.com/PlateerLab/xgen-cli/releases/download/v0.1.0-rc.3/xgen-installer.sh
sh "$installer" --version v0.1.0-rc.3
rm -f "$installer"
$installer = Join-Path ([System.IO.Path]::GetTempPath()) "xgen-installer-$([Guid]::NewGuid().ToString('N')).ps1"
curl.exe -q --proto "=https" --proto-redir "=https" --tlsv1.2 --connect-timeout 15 --max-time 60 --max-filesize 1048576 -fsSLo $installer "https://github.com/PlateerLab/xgen-cli/releases/download/v0.1.0-rc.3/xgen-installer.ps1"
if ($LASTEXITCODE -ne 0) { throw "XGEN installer download failed" }
& $installer -Version v0.1.0-rc.3
Remove-Item -LiteralPath $installer

Release asset์„ ์ง์ ‘ ๋ฐ›์€ ๊ฒฝ์šฐ GitHub CLI๋กœ build provenance๋ฅผ ์ถ”๊ฐ€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

gh attestation verify ./xgen-x86_64-unknown-linux-musl \
  --repo PlateerLab/xgen-cli

Checksum์€ ์ „์†ก ์†์ƒ์„ ํƒ์ง€ํ•˜์ง€๋งŒ ๊ฐ™์€ release publisher ์ž์ฒด๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ์ธ์ฆํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค. ์ž๋™ update์™€ silent downgrade๋Š” ํ˜„์žฌ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋กœ์ปฌ ๋ชจ๋ธ ์—ฐ๊ฒฐ

ํ˜„์žฌ ๊ฒ€์ฆ๋œ ๊ธฐ์ค€์€ vLLM์˜ OpenAI-compatible Chat Completions endpoint๋‹ค. ๋‹ค์Œ ์กฐ๊ฑด์„ ๋ชจ๋‘ ๋งŒ์กฑํ•ด์•ผ ์‹ค์ œ planner call์ด ํ†ต๊ณผํ•œ๋‹ค.

  • base URL์ด bare host๊ฐ€ ์•„๋‹ˆ๋ผ API root๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ๋Œ€๋ถ€๋ถ„ /v1์ด์ง€๋งŒ provider๊ฐ€ ์ž๊ธฐ API๋ฅผ ๋‹ค๋ฅด๊ฒŒ ๋ฒˆํ˜ธ ๋ถ™์ด๋ฉด ๊ทธ ๊ฒฝ๋กœ๋ฅผ ์“ด๋‹ค(์˜ˆ: /api/paas/v4). ๋์— /๊ฐ€ ๋ถ™์–ด๋„ ๊ฐ™๊ฒŒ ์ทจ๊ธ‰ํ•œ๋‹ค.
  • plaintext HTTP๋Š” 127.0.0.1 ๋˜๋Š” ::1 literal loopback๋งŒ ์‚ฌ์šฉํ•œ๋‹ค.
  • server๊ฐ€ strict JSON Schema response format์„ ์ง€์›ํ•œ๋‹ค.
  • response์˜ model ๋ฌธ์ž์—ด์ด ์„ค์ •ํ•œ served model ID์™€ ์ •ํ™•ํžˆ ๊ฐ™๋‹ค.
  • custom CA, ambient proxy, redirect์™€ ์ž๋™ retry์— ์˜์กดํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ผ๋ฐ˜ ์‚ฌ์šฉ์ž๋Š” ๋Œ€ํ™”ํ˜• ์˜จ๋ณด๋”ฉ์„ ํ•œ ๋ฒˆ ์‹คํ–‰ํ•œ๋‹ค. ๋ˆ„๋ฝ๋œ URL๊ณผ API key๋ฅผ ๋ฌป๊ณ  catalog์—์„œ model์„ ์„ ํƒํ•œ๋‹ค. API key๋Š” ์ˆจ๊น€ ์ž…๋ ฅ์ด๋ฉฐ ์ผ๋ฐ˜ config๋‚˜ SQLite๊ฐ€ ์•„๋‹ˆ๋ผ OS ๋ณด์•ˆ ์ €์žฅ์†Œ์—๋งŒ ๋ณด๊ด€ํ•œ๋‹ค.

xgen model setup
xgen model list
xgen model check --compatibility

model setup์ด provider๋ฅผ ๋ฌผ์„ ๋•Œ ๊ณ ๋ฅด๋Š” preset์€ base URL๊ณผ wire ์„ค์ •๋งŒ ์ฑ„์›Œ ์ฃผ๋Š” ๊ธฐ๋ณธ๊ฐ’์ด๋‹ค. ๋ช…์‹œํ•œ option, XGEN_OPENAI_* ํ™˜๊ฒฝ๋ณ€์ˆ˜, ์ด๋ฏธ ์žˆ๋Š” ๊ฐ™์€ ์ด๋ฆ„์˜ profile์ด preset๋ณด๋‹ค ์šฐ์„ ํ•œ๋‹ค. --provider <id>๋กœ ๋Œ€ํ™” ์—†์ด ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

id provider base URL ๊ฒ€์ฆ
deepseek DeepSeek https://api.deepseek.com/v1 ์‹ค์ œ ํ˜ธ์ถœ๋กœ ํ™•์ธ
openai OpenAI https://api.openai.com/v1 ๋ฏธํ™•์ธ, provider ๋ฌธ์„œ ๊ธฐ์ค€
openrouter OpenRouter https://openrouter.ai/api/v1 ๋ฏธํ™•์ธ, provider ๋ฌธ์„œ ๊ธฐ์ค€
glm GLM / Zhipu (z.ai) https://api.z.ai/api/paas/v4 ๋ฏธํ™•์ธ, provider ๋ฌธ์„œ ๊ธฐ์ค€. Coding Plan ๊ณ„์ •์€ https://api.z.ai/api/coding/paas/v4์ด๋ฏ€๋กœ --base-url๋กœ ์ง€์ •ํ•œ๋‹ค
local ๋กœ์ปฌ model (Ollama ๊ธฐ๋ณธ port) http://127.0.0.1:11434/v1 loopback fixture๋กœ ํ™•์ธ
custom ๊ทธ ๋ฐ–์˜ OpenAI-compatible endpoint ์ง์ ‘ ์ž…๋ ฅ โ€”

preset์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฐ’์€ response_format์ด๋‹ค. planner๋Š” ๊ตฌ์กฐํ™”๋œ JSON์œผ๋กœ ๋‹ตํ•˜๋ฏ€๋กœ ์ด ์„ค์ •์„ ๋ฌด์‹œํ•˜๋Š” provider๋Š” model setup์€ ํ†ต๊ณผํ•˜๊ณ  Run์€ ์ „๋ถ€ ์‹คํŒจํ•œ๋‹ค. ๊ทธ๋ž˜์„œ Anthropic Claude๋Š” preset์— ์—†๋‹ค. Claude์˜ OpenAI ํ˜ธํ™˜ layer๋Š” response_format์„ ๋ฌด์‹œํ•œ๋‹ค๊ณ  ๋ฌธ์„œ์— ์ ํ˜€ ์žˆ์–ด์„œ, preset์œผ๋กœ ๋„ฃ์œผ๋ฉด ์„ค์ •์€ ๊นจ๋—ํ•˜๊ฒŒ ๋๋‚˜๊ณ  ๋งค ํ„ด์ด ๊นจ์ง„๋‹ค. ์ด ์„ค์ •์„ ์ง€ํ‚ค๋Š” gateway(์˜ˆ: OpenRouter) ๋ฅผ ํ†ตํ•˜๋ฉด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ธ์ฆ ์—†๋Š” loopback vLLM์„ non-interactiveํ•˜๊ฒŒ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. Tokenizer๋ฅผ ์ƒ๋žตํ•˜๋ฉด model ID๋ฅผ tokenizer/profile identity๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

xgen model setup \
  --base-url http://127.0.0.1:8000/v1 \
  --model qwen3.8-27b \
  --tokenizer Qwen/Qwen3.8-27B-FP8

Loopback HTTP์—๋Š” ambient XGEN_OPENAI_API_KEY๊ฐ€ ์žˆ๋”๋ผ๋„ ์ „์†กํ•˜์ง€ ์•Š๋Š”๋‹ค.

Planner ํ˜ธ์ถœ์˜ wall-clock ์˜ˆ์‚ฐ๊ณผ ์ถœ๋ ฅ token ์˜ˆ์‚ฐ์€ ํ”„๋กœํ•„ ์„ค์ •์ด๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 300์ดˆ์™€ 1024 token์ด๋ฉฐ --inference-timeout <์ดˆ>, --max-output-tokens <ํ† ํฐ> ๋˜๋Š” XGEN_OPENAI_INFERENCE_TIMEOUT, XGEN_OPENAI_MAX_OUTPUT_TOKENS๋กœ ๋ฐ”๊พผ๋‹ค. ๋กœ์ปฌ 27B ๊ธ‰ model์€ planning context prefill๋งŒ 30์ดˆ ์ด์ƒ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ timeout์„ ์ค„์ผ ๋•Œ๋Š” model_call_unknown์ด ๋Š˜์–ด๋‚œ๋‹ค. ๋‘ ๊ฐ’์€ Run์˜ request profile์— ๋ฌถ์ด๋ฏ€๋กœ Run ์‹œ์ž‘ ๋’ค ํ”„๋กœํ•„์—์„œ ๋ฐ”๊พธ๋ฉด ๊ทธ Run์˜ resume์€ configuration_mismatch๋กœ ๋‹ซํžŒ๋‹ค.

xgen model setup --name qwen38 --base-url http://127.0.0.1:11434/v1 \
  --model qwen3.8:27b-q4_K_M --inference-timeout 300 --max-output-tokens 1024

์›๊ฒฉ provider๋Š” HTTPS๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. Interactive setup์€ macOS Keychain, Windows Credential Manager ๋˜๋Š” Linux Secret Service์— key๋ฅผ ์ €์žฅํ•œ๋‹ค. Headless/CI๋Š” secret manager ์ถœ๋ ฅ์„ stdin์œผ๋กœ ์ „๋‹ฌํ•œ๋‹ค. --store-token์„ ์ƒ๋žตํ•˜๋ฉด ํ˜„์žฌ setup ๊ฒ€์ฆ์—๋งŒ ์‚ฌ์šฉํ•˜๊ณ  ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.

secret-manager-command | xgen model setup \
  --name qwen-xgen \
  --base-url https://provider.example/v1 \
  --model served-model-id \
  --token-stdin \
  --store-token

OS ๋ณด์•ˆ ์ €์žฅ์†Œ๊ฐ€ ์—†๋Š” Linux server์—์„œ๋Š” ํ‰๋ฌธ ํŒŒ์ผ๋กœ fallbackํ•˜์ง€ ์•Š๊ณ  credential_store_unavailable๋กœ ์‹คํŒจํ•œ๋‹ค. ์ด ๊ฒฝ์šฐ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋‚˜ stdin์„ ๋งค ์‹คํ–‰์— ์ฃผ์ž…ํ•œ๋‹ค.

XGEN_OPENAI_API_KEY="$(secret-manager-command)" xgen model check --compatibility

์ผ๋ฐ˜ ์„ค์ • ์šฐ์„ ์ˆœ์œ„๋Š” ๋ช…์‹œ์  option, XGEN_OPENAI_* ํ™˜๊ฒฝ๋ณ€์ˆ˜, selected/active profile ์ˆœ์„œ๋‹ค. Credential์€ --token-stdin, XGEN_OPENAI_API_KEY, profile secure store ์ˆœ์„œ๋‹ค. Stored credential์€ profile URL๊ณผ ์ตœ์ข… URL์ด ์ •ํ™•ํžˆ ๊ฐ™์„ ๋•Œ๋งŒ ์“ด๋‹ค.

xgen model setup์€ bounded GET /v1/models ๋’ค ์‹ค์ œ strict JSON Schema POST /v1/chat/completions๋ฅผ ๋ณด๋‚ด ๋‘ ์š”์ฒญ์ด ๋ชจ๋‘ ์„ฑ๊ณตํ•œ profile๋งŒ commitํ•œ๋‹ค. Workspace, SQLite ๋˜๋Š” Run state๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค. model check ๊ธฐ๋ณธํ˜•์€ ๊ธฐ์กด ์ž๋™ํ™” ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด catalog GET๋งŒ ์ˆ˜ํ–‰ํ•˜๊ณ , --compatibility๋ฅผ ์ง€์ •ํ•˜๋ฉด ๊ฐ™์€ inference probe๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. Redirect, retry์™€ ambient proxy๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ผ๋ถ€ compatible server๋Š” catalog๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ alias๋ฅผ ๋‹ค๋ฅด๊ฒŒ ๊ด‘๊ณ ํ•˜๋ฏ€๋กœ model_not_advertised๋Š” catalog์—์„œ ํ™•์ธ๋˜์ง€ ์•Š์•˜๋‹ค๋Š” ๋œป์ด๋‹ค. Setup probe ํ†ต๊ณผ๋„ ์ „์ฒด coding loop ํ’ˆ์งˆ์„ ๋ณด์žฅํ•˜์ง€๋Š” ์•Š์œผ๋ฉฐ ์‹ค์ œ workspace E2E๋Š” ๋ณ„๋„ release gate๋‹ค.

Profile ๊ด€๋ฆฌ๋Š” ๋‹ค์Œ ๋ช…๋ น์œผ๋กœ ํ•œ๋‹ค.

xgen model list
xgen model use qwen-xgen
xgen model logout qwen-xgen
xgen model remove qwen-xgen

์„ธ๋ถ€ ๋ณด์•ˆยทheadless ๋™์ž‘์€ ๋ชจ๋ธ ํ”„๋กœํ•„๊ณผ ์ตœ์ดˆ ์˜จ๋ณด๋”ฉ์„ ๋”ฐ๋ฅธ๋‹ค. ์ „์†ก ์—ฌ๋ถ€๊ฐ€ ๋ถˆํ™•์ •ํ•œ inference transport ์‹คํŒจ๋Š” ์ž๋™ ์žฌ์‹œ๋„ํ•˜์ง€ ์•Š๊ณ  ํ•ด๋‹น Run์„ model_call_unknown recovery ์ƒํƒœ๋กœ ๋‚จ๊ธธ ์ˆ˜ ์žˆ๋‹ค.

๊ธฐ๋ณธ ๋Œ€ํ™”ํ˜• ์‚ฌ์šฉ

ํ”„๋กœ์ ํŠธ root์—์„œ xgen๋งŒ ์‹คํ–‰ํ•˜๋ฉด ๊ฐ€๋ฒผ์šด REPL์ด ์—ด๋ฆฐ๋‹ค. TTY์—์„œ active profile์ด ์—†์œผ๋ฉด URL, ์ˆจ๊น€ API key์™€ model ์„ ํƒ ์˜จ๋ณด๋”ฉ์„ ๋จผ์ € ์ˆ˜ํ–‰ํ•œ๋‹ค. Pipe/headless ์ž…๋ ฅ์—์„œ๋Š” prompt๋ฅผ ์ž๋™์œผ๋กœ ์—ด์ง€ ์•Š๋Š”๋‹ค.

cd my-project
xgen

๊ธฐ๋ณธ๊ฐ’์€ model egress, read, write, execute๋ฅผ ๊ฐ๊ฐ ask๋กœ ๋ฌป๋Š”๋‹ค. ํ˜„์žฌ directory๋Š” ํƒ์ƒ‰ ๊ฐ€๋Šฅํ•œ workspace scope์ง€๋งŒ ์Šน์ธ์ด ์—†์œผ๋ฉด ์‹ค์ œ I/O๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค. PATH์—์„œ ๊ณ ์ • allowlist์— ํ•ด๋‹นํ•˜๋Š” ๊ณตํ†ต ๊ฐœ๋ฐœ executable์„ logical catalog๋กœ ๋ฐœ๊ฒฌํ•˜๋˜ catalog ๋“ฑ๋ก์€ ์‹คํ–‰ ์Šน์ธ์ด ์•„๋‹ˆ๋‹ค.

xgen> ํ”„๋กœ์ ํŠธ๋ฅผ ํƒ์ƒ‰ํ•˜๊ณ  ์‹คํŒจํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜์ •ํ•ด์ค˜.
Allow sending the goal, session context, and tool observations to the model? [y/N] y
progress: model_call_starting

๋ช…๋ น์€ /model, /status, /permissions, /resume, /clear, /exit์ด๋‹ค. ์ค„ ๋ \๋Š” multiline continuation์ด๋‹ค. ์ง์ „ durable completion summary๋งŒ ๋‹ค์Œ goal์— ๋น„์‹ ๋ขฐ context๋กœ ์ด์–ด์ง€๋ฉฐ /clear๋Š” ์—ฐ๊ฒฐ์„ ์ œ๊ฑฐํ•˜์ง€๋งŒ Run state๋ฅผ ์‚ญ์ œํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ƒ์„ธ ๋™์ž‘๊ณผ Ctrl+C ๋ณต๊ตฌ ์˜๋ฏธ๋Š” ๋Œ€ํ™”ํ˜• REPL์„ ๋”ฐ๋ฅธ๋‹ค.

๋ชจ๋ธ ์‘๋‹ต ๊ฑฐ์ ˆ ๋’ค /resume RUN_ID๊ฐ€ configuration_mismatch๋กœ ๋ง‰ํžˆ๋ฉด ์ถ”๊ฐ€๋กœ ํ‘œ์‹œ๋˜๋Š” configuration๊ณผ changed_items๋ฅผ ํ™•์ธํ•œ๋‹ค. workspace๋Š” ์›๋ž˜ ๋””๋ ‰ํ„ฐ๋ฆฌ, file_catalog๋Š” ์›๋ž˜ --allow-file/--allow-dir, model_profile์€ ์›๋ž˜ ๋ชจ๋ธยท์ถ”๋ก  ์˜ต์…˜์„ ๋ณต์›ํ•ด์•ผ ํ•œ๋‹ค. execution_profile์—์„œ environment:LANG ๊ฐ™์€ ํ•ญ๋ชฉ์€ ์›๋ž˜ ์…ธ ํ™˜๊ฒฝ์„, executable:git ๊ฐ™์€ ํ•ญ๋ชฉ์€ ์›๋ž˜ ์‹คํ–‰ ํŒŒ์ผ ์„ ํƒยท๊ฒฝ๋กœยท๋‚ด์šฉ์„ ๋ณต์›ํ•œ๋‹ค. ๊ฐ’ยท๊ฒฝ๋กœ๋Š” ์ถœ๋ ฅํ•˜์ง€ ์•Š์œผ๋ฉฐ binding์„ ๋ฌด์‹œํ•˜๋Š” ๊ฐ•์ œ ์žฌ๊ฐœ๋Š” ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ƒˆ Run์—๋Š” ํ•ญ๋ชฉ๋ณ„ fingerprint๋ฅผ ์ €์žฅํ•œ๋‹ค. ๊ธฐ์กด Run์— ์ด ์ •๋ณด๊ฐ€ ์—†๊ฑฐ๋‚˜ ์‹คํ–‰ profile ์ •์˜ ์ž์ฒด๊ฐ€ ๋‹ฌ๋ผ์กŒ๋‹ค๋ฉด ํ•ญ๋ชฉ ์ด๋ฆ„๊นŒ์ง€๋Š” ์•Œ ์ˆ˜ ์—†๊ณ  ์„ค์ • ์ข…๋ฅ˜๋งŒ ์•ˆ๋‚ดํ•œ๋‹ค. ์ด๋ฏธ ์™„๋ฃŒํ•œ Run์˜ ์ตœ์ข… ์‘๋‹ต replay์—๋Š” ์ด ์„ค์ • ๋ณต์›์ด ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค.

์ฒซ ์‹คํ–‰๊ณผ ์žฌ๊ฐœ

ํ˜„์žฌ directory๋ฅผ workspace๋กœ ์—ด๊ณ  model์ด ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ์ƒ๋Œ€ ํŒŒ์ผ์„ ๋ช…์‹œํ•œ๋‹ค. Model egress์™€ ์‹ค์ œ file read๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋™์˜๋‹ค.

xgen run \
  --allow-file README.md \
  --allow-remote-model-egress \
  --allow-read \
  'README๋ฅผ ์ฝ๊ณ  ํ•ต์‹ฌ์„ ์š”์•ฝํ•ด์ค˜.'

Windows PowerShell์—์„œ๋„ active profile์„ ์‚ฌ์šฉํ•ด ๊ฐ™์€ ๋ช…๋ น์„ ์‹คํ–‰ํ•œ๋‹ค.

xgen run `
  --allow-file README.md `
  --allow-remote-model-egress `
  --allow-read `
  "README๋ฅผ ์ฝ๊ณ  ํ•ต์‹ฌ์„ ์š”์•ฝํ•ด์ค˜."

RC3์—์„œ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ํŒŒ์ผ๋ช…์„ ๋ฏธ๋ฆฌ ๋‚˜์—ดํ•˜์ง€ ์•Š๊ณ  ์„ ํƒํ•œ workspace directory๋ฅผ ํƒ์ƒ‰ํ•˜๊ณ  ๋ณ„๋„ ์Šน์ธ ์•„๋ž˜ atomic writeํ•  ์ˆ˜ ์žˆ๋‹ค.

xgen run \
  --workspace . \
  --allow-dir . \
  --allow-remote-model-egress \
  --allow-read \
  --allow-write \
  'ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๋ฅผ ํ™•์ธํ•˜๊ณ  ํ•„์š”ํ•œ ํŒŒ์ผ์„ ์•ˆ์ „ํ•˜๊ฒŒ ์ˆ˜์ •ํ•ด์ค˜.'

์ด mode๋Š” list-directory, stat, case-sensitive literal search-text, bounded UTF-8 read-text, write-atomic, apply-patch๋ฅผ ์ œ๊ณตํ•œ๋‹ค. --allow-write๋Š” read/model egress์™€ ๋…๋ฆฝ๋œ ๋™์˜๋‹ค. ๋” ์ข๊ฒŒ ํ—ˆ์šฉํ•˜๋ ค๋ฉด --allow-dir src --allow-dir tests์ฒ˜๋Ÿผ ๋ฐ˜๋ณตํ•˜๊ณ , directory ๋ฐ–์˜ exact file๋งŒ --allow-file Cargo.toml๋กœ ์ถ”๊ฐ€ํ•œ๋‹ค. ๋ฏธ์™„๋ฃŒ ์žฌ๊ฐœ์—๋Š” ์›๋ž˜์™€ ๋™์ผํ•œ --allow-dir/--allow-file ์ง‘ํ•ฉ์„ ๋‹ค์‹œ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค.

RC3์—์„œ๋Š” test/build์šฉ executable๋„ absolute path๋กœ ๋ช…์‹œํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฒฝ๋กœ๋ฅผ model์— ๋ณด๋‚ด์ง€๋Š” ์•Š์œผ๋ฉฐ logical ID๋งŒ planning constraint์— ๋…ธ์ถœํ•œ๋‹ค.

xgen run \
  --workspace . \
  --allow-dir . \
  --allow-executable cargo="$(command -v cargo)" \
  --allow-remote-model-egress \
  --allow-read \
  --allow-write \
  'ํ”„๋กœ์ ํŠธ๋ฅผ ํƒ์ƒ‰ํ•˜๊ณ  ์ˆ˜์ •ํ•œ ๋’ค ํ…Œ์ŠคํŠธํ•ด์ค˜.'

Process ์‹คํ–‰์€ file read/write์™€ ๋ณ„๋„ ์Šน์ธ์ด๋‹ค. --allow-execute๊ฐ€ ์—†์œผ๋ฉด ์‹ค์ œ ์‹คํ–‰ ์ „์— execute_approval_required๋กœ pauseํ•˜๋ฉฐ, ๋™์ผํ•œ scope์™€ executable catalog๋ฅผ ๋‹ค์‹œ ์ œ๊ณตํ•ด ์Šน์ธํ•œ๋‹ค.

xgen resume run-0123456789abcdef0123456789abcdef \
  --workspace . \
  --allow-dir . \
  --allow-executable cargo="$(command -v cargo)" \
  --allow-read \
  --allow-write \
  --allow-execute

๋งค๋ฒˆ ๊ฒฝ๋กœ๋ฅผ ์ ์ง€ ์•Š์œผ๋ ค๋ฉด --allow-path-executables๋กœ PATH์—์„œ ์ฐพ์€ ๊ฐœ๋ฐœ ๋„๊ตฌ(git, cargo, node, npm, python3, go, make, java ๋“ฑ)๋ฅผ ํ•œ ๋ฒˆ์— catalog์— ๋„ฃ๋Š”๋‹ค. ๋Œ€ํ™”ํ˜• REPL์€ ๋งค ์„ธ์…˜ ์ด๋ ‡๊ฒŒ ๋™์ž‘ํ•˜์ง€๋งŒ run์€ ๊ธฐ๋ณธ๊ฐ’์ด ์•„๋‹ˆ๋‹ค. ๋ฐœ๊ฒฌ ๊ฒฐ๊ณผ๋Š” ๊ทธ ์‹คํ–‰์˜ PATH์— ๋‹ฌ๋ ค ์žˆ์–ด์„œ Run์˜ execution profile์ด ๋จธ์‹ ๋งˆ๋‹ค ๋‹ฌ๋ผ์ง€๊ณ , ๊ทธ๋Ÿฌ๋ฉด resume์ด ํ”„๋กœํ•„ ๋ถˆ์ผ์น˜๋กœ ๋‹ซํžŒ๋‹ค. ๊ทธ๋ž˜์„œ opt-in์ด๊ณ , resume์—๋„ ๊ฐ™์€ ํ”Œ๋ž˜๊ทธ๋ฅผ ๋‹ค์‹œ ์ค˜์•ผ ํ•œ๋‹ค. --allow-executable๋กœ ์ ์€ ํ•ญ๋ชฉ์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€๋˜๋ฉฐ ์ด๋ฆ„์ด ๊ฒน์น˜๋ฉด ์ด๊ธด๋‹ค.

xgen run \
  --workspace . \
  --allow-dir . \
  --allow-path-executables \
  --allow-remote-model-egress \
  --allow-read \
  --allow-write \
  --allow-execute \
  'ํ…Œ์ŠคํŠธ๋ฅผ ๋Œ๋ฆฌ๊ณ  ์‹คํŒจ๋ฅผ ๊ณ ์ณ์ค˜.'

์ž๋™ ๋ฐœ๊ฒฌ์€ shell์„ catalog์— ๋„ฃ์ง€ ์•Š๋Š”๋‹ค. ํ•ญ๋ชฉ ํ•˜๋‚˜๊ฐ€ executable ํ•˜๋‚˜์ด๋ฏ€๋กœ Receipt์— ์‹ค์ œ๋กœ ์‹คํ–‰๋œ ๊ฒƒ์ด ๋‚จ๋Š”๋‹ค(ADR-0049). sh -c "<๋ช…๋ น>"์€ ์‹ค์ œ ๋ช…๋ น์„ argument ์•ˆ์— ์ˆจ๊ธฐ๋ฏ€๋กœ, shell์ด ํ•„์š”ํ•œ host๋Š” --allow-executable sh=/bin/sh์ฒ˜๋Ÿผ ์ด๋ฆ„์„ ์ง์ ‘ ์ ์–ด ํ•จ๊ป˜ ๋„ฃ๋Š”๋‹ค.

--allow-execute๋Š” ์Šน์ธ์ด๊ณ  catalog๋Š” ๋‚˜๋จธ์ง€ ํ•œ์ชฝ์ด๋‹ค. catalog ์—†์ด --allow-execute๋งŒ ์ฃผ๋ฉด configuration_mismatch๋กœ ๋‹ซํžˆ๋ฉฐ, ์–ด๋А ์ชฝ์ด ๋น ์กŒ๊ณ  ์–ด๋–ป๊ฒŒ ์ฑ„์šฐ๋Š”์ง€ ํ•จ๊ป˜ ์ถœ๋ ฅํ•œ๋‹ค.

์‹คํ–‰์€ shell์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์ง€๋งŒ OS sandbox๋„ ์•„๋‹ˆ๋‹ค. ํ—ˆ์šฉํ•œ compiler, package manager, interpreter์™€ ๊ทธ ํ•˜์œ„ process๋Š” ํ˜„์žฌ ์‚ฌ์šฉ์ž ๊ถŒํ•œ์œผ๋กœ project code๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. CLI๋Š” ambient ํ™˜๊ฒฝ ์ „์ฒด๋ฅผ ์ƒ์†ํ•˜์ง€ ์•Š๊ณ  ์ œํ•œ๋œ host ํ™˜๊ฒฝ๋งŒ ์ „๋‹ฌํ•˜๋ฉฐ API key์™€ proxy/ํด๋ผ์šฐ๋“œ credential์€ child์— ์ „๋‹ฌํ•˜์ง€ ์•Š๋Š”๋‹ค. Top-level executable catalog๋Š” ํ•ด๋‹น ๋„๊ตฌ๊ฐ€ ์‹คํ–‰ํ•˜๋Š” ํ•˜์œ„ ํ”„๋กœ๊ทธ๋žจ์˜ allow-list๊ฐ€ ์•„๋‹ˆ๋‹ค. ๋ฏธ์™„๋ฃŒ ์žฌ๊ฐœ ์‹œ executable ๋‚ด์šฉ, workspace ๋˜๋Š” safe environment binding์ด ๋‹ฌ๋ผ์ง€๋ฉด ์ž๋™ ๋Œ€์ฒด๋‚˜ ์žฌ์‹คํ–‰ ์—†์ด configuration_mismatch๋กœ ๋‹ซ๋Š”๋‹ค.

์ƒํƒœ๊ฐ€ pause๋˜๋ฉด stderr์˜ run_id๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๋ฏธ์™„๋ฃŒ Run์€ workspace์™€ ์›๋ž˜ ์‚ฌ์šฉํ•œ ๋™์ผํ•œ allow-file/allow-dir catalog๋ฅผ ๋‹ค์‹œ ์ œ๊ณตํ•˜๊ณ  ํ•„์š”ํ•œ ๋™์˜๋ฅผ ๋ช…์‹œํ•œ๋‹ค. Base URL์€ ์œ„ environment์—์„œ ๋‹ค์‹œ ์ฝ๋Š”๋‹ค.

xgen resume run-0123456789abcdef0123456789abcdef \
  --workspace . \
  --allow-file README.md \
  --allow-remote-model-egress \
  --allow-read

์™„๋ฃŒ๋œ Run๋งŒ model๊ณผ workspace ์—†์ด ๋‹ค์Œ์ฒ˜๋Ÿผ offline replayํ•  ์ˆ˜ ์žˆ๋‹ค.

xgen resume run-0123456789abcdef0123456789abcdef

์ƒ์„ธ ์žฌ๊ฐœ ์ ˆ์ฐจ๋Š” Public local run/resume prototype์„ ๋”ฐ๋ฅธ๋‹ค. RC3๋Š” workspace discovery, bounded atomic text write/patch์™€ ๋ช…์‹œ์  shell-free process ์‹คํ–‰์„ ์ œ๊ณตํ•œ๋‹ค. Browser์™€ MCP๋Š” ํ›„์† ๋ฒ”์œ„์ด๋ฏ€๋กœ ํ˜„ ์ƒํƒœ๋ฅผ Claude Code/Codex ์ „์ฒด ๊ธฐ๋Šฅ๊ณผ ๋™์ผํ•˜๋‹ค๊ณ  ํ•ด์„ํ•˜์ง€ ์•Š๋Š”๋‹ค. Discovery ๊ฒฝ๊ณ„๋Š” Workspace filesystem discovery, write ๊ฒฝ๊ณ„๋Š” Workspace atomic write๋ฅผ ๋”ฐ๋ฅธ๋‹ค.

์—…๋ฐ์ดํŠธ์™€ RC2 rollback

npm ์„ค์น˜๋ณธ์€ ์ƒˆ exact version์„ ๋‹ค์‹œ ์„ค์น˜ํ•ด ์—…๋ฐ์ดํŠธํ•œ๋‹ค. next๋Š” ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด ๋‹ค๋ฅธ prerelease๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํŒŒ์ผ๋Ÿฟ๊ณผ ์žฅ์•  ์žฌํ˜„์—๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

npm install --global --include=optional @xgen-ai/cli@0.1.0-rc.3
xgen --version

Native ์„ค์น˜๋ณธ์€ ์œ„ installer๋ฅผ ๊ฐ™์€ install directory์— exact tag๋กœ ๋‹ค์‹œ ์‹คํ–‰ํ•œ๋‹ค. Installer๋Š” ์ƒˆ binary์˜ checksum, version๊ณผ protocol์„ ๋จผ์ € ํ™•์ธํ•˜๊ณ  ์„ฑ๊ณตํ•œ ํŒŒ์ผ๋งŒ ๊ฐ™์€ directory rename์œผ๋กœ ๊ต์ฒดํ•œ๋‹ค. ์‹คํ–‰ ์ค‘์ธ xgen๋ฅผ ๊ต์ฒดํ•˜์ง€ ๋ง๊ณ  ๋ชจ๋“  session์„ ์ข…๋ฃŒํ•œ ๋’ค ์—…๋ฐ์ดํŠธํ•œ๋‹ค.

RC3 npm package๋งŒ ๋ฌธ์ œ๊ฐ€ ์žˆ๊ณ  ๊ฐ™์€ RC3 GitHub Release๊ฐ€ ์ •์ƒ์ด๋ผ๋ฉด npm ์„ค์น˜๋ณธ์„ ์ œ๊ฑฐํ•˜๊ณ  exact RC3 native installer๋กœ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‘ ์ฑ„๋„์€ ๊ฐ™์€ release binary๋ฅผ ๋‹ด์œผ๋ฏ€๋กœ ์ด๋Š” ์ œํ’ˆ version rollback์ด ์•„๋‹ˆ๋ผ ์„ค์น˜ ์ฑ„๋„ ์ „ํ™˜์ด๋‹ค.

์ œํ’ˆ version์„ RC2๋กœ ๋˜๋Œ๋ ค์•ผ ํ•˜๋ฉด ๊ธฐ์กด RC3 binary์™€ state๋ฅผ ์ง€์šฐ๊ฑฐ๋‚˜ ๋ฎ์–ด์“ฐ์ง€ ๋ง๊ณ  RC2๋ฅผ ๋ณ„๋„ user-owned directory์— ์„ค์น˜ํ•œ๋‹ค. RC3๊ฐ€ ๋งŒ๋“  Run์„ RC2๋กœ ์—ด๊ฑฐ๋‚˜ resumeํ•˜๋Š” ๊ฒƒ์€ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค. RC2์—์„œ ์‹œ์ž‘ํ•ด ์•„์ง model egress๊ฐ€ ํ•„์š”ํ•œ Run์€ ์›๋ž˜ RC2 binary๋กœ ๋งˆ์น˜๊ณ , ์ƒˆ ์ž‘์—…์€ RC3์—์„œ ์ƒˆ Run์œผ๋กœ ์‹œ์ž‘ํ•œ๋‹ค. ์™„๋ฃŒ๋œ RC2 Run์€ RC3์—์„œ offline replayํ•  ์ˆ˜ ์žˆ๋‹ค.

RC2๋Š” ์ด๋ฆ„ ๋ณ€๊ฒฝ ์ „ release์ด๋ฏ€๋กœ ์•„๋ž˜ historical installer์™€ ์‹คํ–‰ ํŒŒ์ผ์€ xgeny ์ด๋ฆ„์„ ์‚ฌ์šฉํ•œ๋‹ค.

rollback_dir="$HOME/.local/xgen-rc2/bin"
installer=$(mktemp "${TMPDIR:-/tmp}/xgen-installer.XXXXXX")
curl -q --proto '=https' --proto-redir '=https' --tlsv1.2 \
  --connect-timeout 15 --max-time 60 --max-filesize 1048576 -fsSLo "$installer" \
  https://github.com/PlateerLab/xgen-cli/releases/download/v0.1.0-rc.2/xgeny-installer.sh
sh "$installer" --version v0.1.0-rc.2 --install-dir "$rollback_dir"
rm -f "$installer"
"$rollback_dir/xgeny" --version

Immutable GitHub Release๋‚˜ npm version์— ์น˜๋ช…์  ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋ฉด ๊ธฐ์กด tag๋‚˜ package๋ฅผ ์ด๋™ยท๊ต์ฒดยท์žฌ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ˆ˜์ •์€ ๋” ๋†’์€ ์ƒˆ version์œผ๋กœ ๊ฒŒ์‹œํ•˜๊ณ , ์˜ํ–ฅ์„ ๋ฐ›์€ exact version๊ณผ ์šฐํšŒ ๋ฐฉ๋ฒ•์„ release note์— ๋‚จ๊ธด๋‹ค.

์‚ญ์ œ

npm ์„ค์น˜๋ณธ์€ launcher์™€ ํ˜„์žฌ platform package๋ฅผ ํ•จ๊ป˜ ์ œ๊ฑฐํ•œ๋‹ค.

npm uninstall --global @xgen-ai/cli

Native installer๋Š” runtime state๋ฅผ ์‚ญ์ œํ•˜์ง€ ์•Š๋Š”๋‹ค. Binary๋งŒ ์ œ๊ฑฐํ•˜๋ ค๋ฉด ์„ค์น˜ํ•œ exact regular file์„ ์ง€์šด๋‹ค.

rm "$HOME/.local/bin/xgen"
Remove-Item -LiteralPath "$env:LOCALAPPDATA\XGEN\bin\xgen.exe"

Run state๋Š” ๋ณ„๋„๋กœ ๋ณด์กด๋œ๋‹ค. Linux๋Š” $XDG_STATE_HOME/xgen-cli ๋˜๋Š” $HOME/.local/state/xgen-cli, macOS๋Š” $HOME/Library/Application Support/XGEN CLI, Windows๋Š” %LOCALAPPDATA%\XGEN CLI๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. State ์‚ญ์ œ๋Š” Run ๊ธฐ๋ก๊ณผ durable recovery ์ •๋ณด๋ฅผ ์žƒ์œผ๋ฏ€๋กœ uninstall์— ์ž๋™ ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค.

Model profile ์„ค์ • ํŒŒ์ผ(model-profiles.json)๋„ ๋‚จ๋Š”๋‹ค. ์œ„์น˜๋Š” platform config directory๋กœ, Linux๋Š” $XDG_CONFIG_HOME/xgen-cli ๋˜๋Š” $HOME/.config/xgen-cli, macOS๋Š” $HOME/Library/Application Support/XGEN CLI, Windows๋Š” %APPDATA%\XGEN CLI๋‹ค. XGEN_STATE_HOME์€ Run state๋งŒ ์˜ฎ๊ธฐ๊ณ  profile ์œ„์น˜๋Š” ๋ฐ”๊พธ์ง€ ์•Š์œผ๋ฉฐ, profile ์ €์žฅ์†Œ๋ฅผ ๊ฒฉ๋ฆฌํ•˜๋ ค๋ฉด XGEN_CONFIG_HOME์„ ๋”ฐ๋กœ ์„ค์ •ํ•œ๋‹ค. OS ๋ณด์•ˆ ์ €์žฅ์†Œ์˜ credential๊นŒ์ง€ ์ง€์šฐ๋ ค๋ฉด ์‚ญ์ œ ์ „์— xgen model remove <name>์„ ์‹คํ–‰ํ•œ๋‹ค.

๋ฌธ์ œ ํ•ด๊ฒฐ๊ณผ ์ง€์› ์ •๋ณด

์ฆ์ƒ ํ™•์ธ๊ณผ ์กฐ์น˜
xgen: command not found npm global bin ๋˜๋Š” native install directory๊ฐ€ ํ˜„์žฌ PATH์— ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์ƒˆ terminal์—์„œ ๋‹ค์‹œ ์‹คํ–‰ํ•œ๋‹ค.
unsupported_platform ๋˜๋Š” platform package ์—†์Œ ์ง€์› OS/architecture์™€ Node.js version์„ ํ™•์ธํ•˜๊ณ  --omit=optional ์—†์ด exact package๋ฅผ ์žฌ์„ค์น˜ํ•œ๋‹ค.
Installer๊ฐ€ destination์„ ๊ฑฐ๋ถ€ ๊ด€๋ฆฌ์ž ๊ณต์šฉ ๊ฒฝ๋กœ ๋Œ€์‹  user-owned directory๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  symbolic link/reparse point๋‚˜ broadly writable directory๋ฅผ ์ œ๊ฑฐํ•˜์ง€ ๋ง๊ณ  ๋‹ค๋ฅธ ๋นˆ ๊ฒฝ๋กœ๋ฅผ ์„ ํƒํ•œ๋‹ค.
PowerShell์—์„œ installer ์ฐจ๋‹จ Script๋ฅผ ๋จผ์ € ๊ฒ€ํ† ํ•œ๋‹ค. ํ˜„์žฌ process ํ•œ์ • execution-policy ์˜ˆ์™ธ๋Š” ์กฐ์ง ์ •์ฑ…์ด ํ—ˆ์šฉํ•  ๋•Œ๋งŒ ์‚ฌ์šฉํ•œ๋‹ค. SmartScreen ๊ฒฝ๊ณ ๋Š” RC3์— Authenticode๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
base_url_must_name_the_api_root base URL์ด host๋งŒ ์žˆ๊ณ  ๊ฒฝ๋กœ๊ฐ€ ์—†๋‹ค. https://api.openai.com์ด ์•„๋‹ˆ๋ผ https://api.openai.com/v1์ฒ˜๋Ÿผ API root๊นŒ์ง€ ์ ๋Š”๋‹ค. ์–ด๋–ค ๊ฒฝ๋กœ์ธ์ง€๋Š” provider ๋ฌธ์„œ๊ฐ€ ์ •ํ•œ๋‹ค.
credential_store_unavailable ํ‰๋ฌธ ์ €์žฅ fallback์€ ์—†๋‹ค. Secret manager ์ถœ๋ ฅ์„ --token-stdin์ด๋‚˜ ํ˜„์žฌ process์˜ XGEN_OPENAI_API_KEY๋กœ ์ „๋‹ฌํ•œ๋‹ค.
chat_completions_incompatible Provider๊ฐ€ strict JSON Schema ์š”์ฒญ์„ ๋ฐ›์•„๋“ค์˜€์ง€๋งŒ ์‹ค์ œ๋กœ ๊ฐ•์ œํ•˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜ envelope ๋ฐ–์œผ๋กœ ๋‹ตํ–ˆ๋‹ค. Probe๋Š” production planner์™€ ๊ฐ™์€ proposal schema๋ฅผ ๋ณด๋‚ด๊ณ  schema ๋ฐ– field๋ฅผ ํ•˜๋‚˜ ๋” ์š”๊ตฌํ•˜๋ฏ€๋กœ, ๋ฌธ๋ฒ•์„ ๊ฐ•์ œํ•˜์ง€ ๋ชปํ•˜๋Š” ์„œ๋ฒ„๋Š” planner call ๋Œ€์‹  model setup์—์„œ ์—ฌ๊ธฐ์„œ ๋‹ซํžŒ๋‹ค. ์ด๋Š” ์˜๋„๋œ ๋™์ž‘์ด๋‹ค. Probe ์Šคํ‚ค๋งˆ๋Š” ๊ตฌ์กฐ๋งŒ ๊ฐ•์ œํ•˜๋ฏ€๋กœ(ADR-0037) additionalProperties, required, enum, const๋ฅผ ๊ฐ•์ œํ•˜์ง€ ๋ชปํ•˜๋Š” provider๊ฐ€ ์—ฌ๊ธฐ์„œ ๊ฑธ๋ฆฐ๋‹ค.
model_not_advertised ๋˜๋Š” compatibility ์‹คํŒจ URL์ด bare host๊ฐ€ ์•„๋‹ˆ๋ผ provider์˜ API root์ธ์ง€, exact served model ID์™€ strict JSON Schema Chat Completions ์ง€์›์„ ํ™•์ธํ•œ๋‹ค. Redirect๋‚˜ ์ž๋™ retry์— ์˜์กดํ•˜์ง€ ์•Š๋Š”๋‹ค.
model setup/model check์˜ timeout Inference probe๋Š” production planner์™€ ๊ฐ™์€ wall-clock ์˜ˆ์‚ฐ์„ ์“ด๋‹ค. ๋กœ์ปฌ model์€ ์ฒซ ๋กœ๋“œ๊ฐ€ ํฌ๊ธฐ์™€ disk cache ์ƒํƒœ์— ๋”ฐ๋ผ ์ˆ˜์‹ญ ์ดˆ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ endpoint์—์„œ model์„ ํ•œ ๋ฒˆ warm-upํ•œ ๋’ค ์žฌ์‹œ๋„ํ•œ๋‹ค.
provider_output_truncated Probe๋‚˜ planner ์‘๋‹ต์ด ์ถœ๋ ฅ token ์˜ˆ์‚ฐ์—์„œ ์ž˜๋ ธ๋‹ค. Reasoning์„ ๋งŽ์ด ์“ฐ๋Š” model์€ ์ตœ์ข… JSON ์ „์— ์˜ˆ์‚ฐ์„ ์†Œ์ง„ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ model์˜ thinking ์„ค์ •์ด๋‚˜ profile์˜ ์ถœ๋ ฅ ์˜ˆ์‚ฐ์„ ์กฐ์ •ํ•œ๋‹ค. Rate limit์ด ์•„๋‹ˆ๋ฏ€๋กœ ์žฌ์‹œ๋„๋กœ ํ•ด๊ฒฐ๋˜์ง€ ์•Š๋Š”๋‹ค.
proposal_rejected.* ๋’ค์˜ class๊ฐ€ Core๊ฐ€ ์ œ์•ˆ์„ ๊ฑฐ๋ถ€ํ•œ ์ด์œ ๋‹ค. capability_unavailable/capability_unsupported๋Š” ํ—ˆ์šฉํ•˜์ง€ ์•Š์€ capability ์„ ํƒ, invocation_invalid๋Š” scope ๋ฐ– ์ธ์ž๋‚˜ ์Šคํ‚ค๋งˆ ์œ„๋ฐ˜, tool_call_budget_exhausted๋Š” ์˜ˆ์‚ฐ ์†Œ์ง„์ด๋‹ค. Class๋Š” Core ํŒ์ •์ด๋ฉฐ model ์ถœ๋ ฅ ์›๋ฌธ์ด ์•„๋‹ˆ๋‹ค.
model_rejected.* ๋’ค์˜ class๋Š” journal์˜ model call settlement์™€ ๊ฐ™์€ ๊ฐ’์ด๋‹ค. planner_invalid_response๋Š” provider๊ฐ€ strict JSON Schema๋ฅผ ์ง€ํ‚ค์ง€ ์•Š์€ ์‘๋‹ต(๋ฌธ๋ฒ• ๋ฏธ์ง€์›ยท๋ฏธ์ ์šฉ), provider_limit์€ ์ถœ๋ ฅ ์˜ˆ์‚ฐยท์š”์ฒญ ํฌ๊ธฐ ์ดˆ๊ณผ, provider_rejected๋Š” 4xx ๊ฑฐ๋ถ€๋‹ค. Class๋Š” Core ํŒ์ •์ด๋ฉฐ model ์ถœ๋ ฅ ์›๋ฌธ์ด ์•„๋‹ˆ๋‹ค.
configuration_mismatch ์›๋ž˜ workspace, file/directory scope, executable์™€ model profile binding(inference timeoutยท์ถœ๋ ฅ ์˜ˆ์‚ฐ ํฌํ•จ)์œผ๋กœ resumeํ•œ๋‹ค. ์ž๋™ ๋Œ€์ฒดํ•˜์ง€ ๋ง๊ณ  ํ•„์š”ํ•˜๋ฉด ์ƒˆ Run์„ ์‹œ์ž‘ํ•œ๋‹ค.
model_call_unknown.timeout์ด planner ํ˜ธ์ถœ๋งˆ๋‹ค ๋ฐ˜๋ณต ํ”„๋กœํ•„์˜ inference timeout์ด modelยทhardware์— ๋น„ํ•ด ์งง๋‹ค. ๋กœ์ปฌ 27B๋Š” ํ˜ธ์ถœ๋‹น 60์ดˆ ์•ˆํŒŽ์ด ๊ฑธ๋ฆฌ๋ฏ€๋กœ --inference-timeout์„ ์˜ฌ๋ฆฐ๋‹ค.
model_call_unknown.transport_unavailable / .interrupted ์š”์ฒญ์ด ์ „์†ก๋์„ ์ˆ˜ ์žˆ์œผ๋‚˜ ๊ฒฐ๊ณผ๋ฅผ ๋ชป ๋ฐ›์•˜๋‹ค(์—ฐ๊ฒฐ ๋Š๊น€) ๋˜๋Š” process๊ฐ€ ์‘๋‹ต ์ „์— ๋๋‚ฌ๋‹ค. ์ž๋™ replayํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ endpoint ์ƒํƒœ๋ฅผ ํ™•์ธํ•œ ๋’ค resumeํ•œ๋‹ค.
model_call_unknown.* ๋˜๋Š” effect_outcome_unknown ๋ถˆํ™•์ • ์ž‘์—…์„ ์ž๋™ ๋ฐ˜๋ณตํ•˜์ง€ ์•Š๋Š”๋‹ค. /status์™€ /resume์˜ ๊ณ ์ • ์ง„๋‹จ์„ ํ™•์ธํ•˜๊ณ  ์™ธ๋ถ€ ์ƒํƒœ๋ฅผ ๋ณ„๋„๋กœ ๊ฒ€์ฆํ•œ๋‹ค.

์ง€์› ์š”์ฒญ์—๋Š” xgen --version, OS/architecture, ์„ค์น˜ ์ฑ„๋„, ์ข…๋ฃŒ ์ฝ”๋“œ์™€ ๊ณ ์ •๋œ ์˜ค๋ฅ˜ ์ฝ”๋“œ๋งŒ ์šฐ์„  ์ œ๊ณตํ•œ๋‹ค. API key, endpoint ์ „์ฒด URL, prompt, model ์›๋ฌธ ์‘๋‹ต, source, process stdout/stderr, state DB์™€ Run ID๋Š” ๊ณต๊ฐœ issue์— ์ฒจ๋ถ€ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ผ๋ฐ˜ ๋ฒ„๊ทธ๋Š” GitHub Issues, ๋ณด์•ˆ ์ทจ์•ฝ์ ์€ ๊ณต๊ฐœ issue๊ฐ€ ์•„๋‹Œ ๋น„๊ณต๊ฐœ ์ทจ์•ฝ์  ์‹ ๊ณ ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์žฌํ˜„์šฉ project๋Š” ๋ฏผ๊ฐ์ •๋ณด๊ฐ€ ์—†๋Š” ์ตœ์†Œ fixture๋กœ ์ƒˆ๋กœ ๋งŒ๋“ ๋‹ค. ์„ธ๋ถ€ ๋ฒ”์œ„๋Š” ๋ณด์•ˆ ์ •์ฑ…์„ ๋”ฐ๋ฅธ๋‹ค.

๋ณด์•ˆ ๊ฒฝ๊ณ„

  • XGEN๋Š” model egress, read, write์™€ execute๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ์Šน์ธํ•œ๋‹ค. ํ•œ ์Šน์ธ์ด ๋‹ค๋ฅธ ๊ถŒํ•œ์„ ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • process.execute๋Š” shell injection์„ ์ค„์ด์ง€๋งŒ OS sandbox๊ฐ€ ์•„๋‹ˆ๋‹ค. ํ—ˆ์šฉํ•œ compiler, package manager์™€ child process๋Š” ํ˜„์žฌ ์‚ฌ์šฉ์ž ๊ถŒํ•œ์œผ๋กœ project code๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
  • Run state์—๋Š” goal๊ณผ bounded tool output์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ state root ์ „์ฒด๋ฅผ ๋ฏผ๊ฐ ๋ฐ์ดํ„ฐ๋กœ ์ทจ๊ธ‰ํ•œ๋‹ค.
  • SQLite๋Š” binary์— ๋‚ด์žฅ๋œ local library๋‹ค. SQLite server๋‚˜ ๋ณ„๋„ database ์„ค์น˜๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค.
  • ์ „์†ก ์—ฌ๋ถ€๊ฐ€ ๋ถˆํ™•์ •ํ•œ model/effect๋Š” Unknown์œผ๋กœ ๋ณด์กดํ•˜๋ฉฐ ์ž๋™ replayํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • macOS/Windows RC3 binary์—๋Š” OS code signing/notarization์ด ์—†๋‹ค. Checksum๊ณผ GitHub attestation์€ ์ „์†ก ๋ฌด๊ฒฐ์„ฑ๊ณผ build provenance๋ฅผ ํ™•์ธํ•˜์ง€๋งŒ OS publisher ์„œ๋ช…์„ ๋Œ€์‹ ํ•˜์ง€ ์•Š๋Š”๋‹ค.