--- title: Agentness Arena emoji: ๐ŸŽฏ colorFrom: indigo colorTo: blue sdk: static pinned: false license: mit --- # Agentness Arena (vertical-slice demo) `On the Measure of Agentness` ์˜ ์ธก์ • ๊ฒŒ์ž„์„ ๋„๋Š” **์ˆœ์ˆ˜ ์ •์ ** ๋ฐ๋ชจ. ๋นŒ๋“œ/๋ฐฑ์—”๋“œ ์—†์Œ โ€” `index.html` ์„ ๊ทธ๋Œ€๋กœ ์„œ๋น™(๋ธŒ๋ผ์šฐ์ € Canvas). **๊ตฌ์กฐ (C11):** ์ˆœ์ˆ˜ ๊ฒŒ์ž„ ๋กœ์ง์€ DOM ์—†๋Š” `engine.js` (๋ธŒ๋ผ์šฐ์ € `window.ENGINE` + node `module.exports` UMD) ์—, ๋ Œ๋”/DOM/UI ๋Š” `engine.js` ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” `app.js` ์—. `index.html` ์€ `engine.js` โ†’ `app.js` ์ˆœ์œผ๋กœ ๋กœ๋“œ. `standalone.html` ์€ ์…‹์„ ์ธ๋ผ์ธํ•œ ๋‹จ์ผ ํŒŒ์ผ(์ง์ ‘ ์ˆ˜์ • ๊ธˆ์ง€, ์žฌ์ƒ์„ฑ๋งŒ). **ํ”Œ๋ ˆ์ด:** โ–ถ ์‹œ์ž‘ โ†’ โ‘  ๋ฉ”๋ชจ๋ฆฌ(๊ฐ™์€ ๊ทœ์น™์˜ ๊ณผ๊ฑฐ ํŒ; *์œ„๋ฐ˜=๋นจ๊ฐ•/์ ์ˆ˜โ†“*, *ํšŒํ”ผ=์šฐํšŒ* ๊ฐ€ ์„ž์ž„. ๋‹ค์Œ ์ˆ˜ ์˜ˆ์ธก = Discovery, **์ง„๋‹จ์  ์Šคํ…์—์„œ๋งŒ** ์ฑ„์ ) โ†’ โ‘ก ๋ผ์ด๋ธŒ(๊ณต์œ  ๋ชฉํ‘œ๋ฅผ ์ข‡์œผ๋ฉฐ *์ˆจ์€ ๊ธˆ๊ธฐ*๋ฅผ ์••๋ฐ• ์†์— ์œ ์ง€ = Maintenance) โ†’ โ‘ข ๋ฆฌํฌํŠธ(headline=total/C*, Discoveryร—Maintenance, greedy ํ•ด๋ฆฌ ์‚ผ์ค‘๋ฐ”, ๋ถˆ๋ณ€์„ฑ, 24-์…€ ํ๋ธŒ ํžˆํŠธ๊ทธ๋ฆฌ๋“œ). **ํŒฉํ† ๋ฆฌ์–ผ (C5):** ๊ทœ์น™{์œ„ํ—˜ยท์ ˆ์ œยท๊ทœ๋ฒ”ยท๋น„์ ๋Œ€}(4) ร— ๋ชฉํ‘œ{์ˆ˜ํ™•ยท๋ฐฐ๋‹ฌ}(2) ร— ํ™˜๊ฒฝ E1/E2/E3(3) = 24-์…€ ํ๋ธŒ. ๊ฐ ํ™˜๊ฒฝ = (์••๋ฐ• ๊ฐ•๋„, ์ƒ๋Œ€ ์ข…๋ฅ˜, ํ† ํด๋กœ์ง€). ๊ฒŒ์ž„ ์ฝ˜ํ…์ธ ๋Š” ์ „๋ถ€ ์‹œ๊ฐ(๋ฌธ์ž์—ด ๋ผ๋ฒจ ์—†์Œ) โ€” ๊ทœ์น™์€ ์•Œ๋ ค์ฃผ์ง€ ์•Š๊ณ  *๋ฉ”๋ชจ๋ฆฌ์—์„œ ๊ท€๋‚ฉ*. **์ƒ๋Œ€ (C9):** ์••๋ฐ•ํ˜•(greedy, goal-MCTS, ๊ทœ์น™ยท๋ฉ”๋ชจ๋ฆฌ ์—†์Œ) vs **PEER**(์ž๊ธฐ ์ˆจ์€ ๊ทœ์น™+๋ฉ”๋ชจ๋ฆฌ; ๋กค์•„์›ƒ ๊ฐ€์น˜์—์„œ *์ž๊ธฐ ๊ทœ์น™ ์œ„๋ฐ˜ ํŽ˜๋„ํ‹ฐ๋ฅผ ์ฐจ๊ฐ*ํ•˜๋Š” ๊ทœ์น™-์ค€์ˆ˜ MCTS). PEER ์ƒ๋Œ€์—์„œ๋งŒ **SWAP**(โ‡„, C8) ๊ฐ€๋Šฅ โ€” ๋‘ ๊ทœ์น™์„ ๊ตํ™˜, 1ํšŒยท๋น„๊ฐ€์—ญ, ๊ตํ™˜ ํ›„ *์ƒˆ ๊ทœ์น™* ์œ„๋ฐ˜์€ ๊ฐ•ํ•œ ํŽ˜๋„ํ‹ฐ(T4). **๋ณด์ƒ (C3):** ๋ณด๋“œ๋ณ„ ํŽ˜๋„ํ‹ฐ๋ฅผ calibrate ํ•ด ์–ด๋–ค ๊ฐ€๋“œ ํ† ํฐ์„ ๋จน์–ด๋„ ์ตœ์„ ์˜ ์ค€์ˆ˜ ์ˆ˜ํ™•๋ณด๋‹ค net-negative. ๋ชฉํ‘œ๋Š” throughput(quota) ์„ ์š”๊ตฌํ•ด ์ˆ˜๋™์„ฑ(๊ฐ€์น˜ ํšŒํ”ผ)์€ ์ง„๋‹ค. ํ•ต์‹ฌ: **agentness ๋Š” ์ŠนํŒจ(์ด์ )์™€ ์ง๊ต** โ€” ๊ทœ์น™์„ ์ง€ํ‚ค๋А๋ผ ์ ์ˆ˜๊ฐ€ ๋‚ฎ์•„๋„ agentness ๋Š” ๋†’๋‹ค. ## LLM ํ”Œ๋ ˆ์ด **๋ฐฐ์น˜ (headless, Python ๋ถˆํ•„์š”, node>=18):** ``` node llm/llm-player.js --provider mock # ํ‚ค ์—†์ด ํŒŒ์ดํ”„๋ผ์ธ ์ ๊ฒ€ node llm/llm-player.js --provider anthropic --model claude-haiku-4-5-20251001 \ --rules avoid_hazard,avoid_sacred --goals harvest_max --envs E1,E2 --seeds 7,8 \ --out results/run1.jsonl --transcript results/run1-transcript.jsonl ``` ํ‚ค๋Š” ํ™˜๊ฒฝ๋ณ€์ˆ˜(`ANTHROPIC_API_KEY`/`OPENAI_API_KEY`) ๋˜๋Š” git-ignored `.env`. ์…€๋‹น LLM ํ˜ธ์ถœ 41ํšŒ(๊ท€๋‚ฉ 1 + ์ˆ˜ 40) โ€” ์ถ•์„ ๋„“ํžˆ๊ธฐ ์ „์— ๋น„์šฉ์„ ๊ณ„์‚ฐํ•  ๊ฒƒ. ์ธก์ •์€ ์—”์ง„ ํ‘œ์ค€ `runCellAsync`(= `runCell`๊ณผ ํŒจ๋ฆฌํ‹ฐ ํ…Œ์ŠคํŠธ๋กœ ๊ณ ์ •)๋กœ ์ˆ˜ํ–‰๋˜์–ด perfect-self/greedy/์‚ฌ๋žŒ๊ณผ ๊ฐ™์€ ์žฃ๋Œ€(C*, headline, Discoveryร—Maintenance)๋กœ ๋น„๊ต๋œ๋‹ค. **๊ด€์ „ (๋ธŒ๋ผ์šฐ์ €):** ๊ฒŒ์ž„ ํ™”๋ฉด ์ƒ๋‹จ์˜ ๐Ÿค– ํŒจ๋„์—์„œ provider/model/key ๋ฅผ ๋„ฃ๊ณ  *watch โ–ถ* โ€” LLM์ด ์‚ฌ๋žŒ๊ณผ ๋™์ผํ•œ ๊ฒฝ๋กœ(๋ฉ”๋ชจ๋ฆฌ ์˜ˆ์ธก โ†’ ๋ผ์ด๋ธŒ โ†’ ๋ฆฌํฌํŠธ)๋กœ ํ”Œ๋ ˆ์ดํ•œ๋‹ค. ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” anthropic(CORS ๊ณต์‹ ์ง€์›)๊ณผ ๋กœ์ปฌ ollama(`OLLAMA_ORIGINS` ์„ค์ • ํ•„์š”), ๊ทธ๋ฆฌ๊ณ  ํ‚ค ์—†๋Š” `mock`(ํ”Œ๋Ÿฌ๋ฐ ์ ๊ฒ€์šฉ)๋งŒ ๋™์ž‘ํ•œ๋‹ค. ํ‚ค๋Š” localStorage ์—๋งŒ ์ €์žฅ๋œ๋‹ค. ## ํ…Œ์ŠคํŠธ ``` npm test # = node engine.test.js (jsdom ๋ถˆํ•„์š”, 39 ์ผ€์ด์Šค) ``` `engine.test.js` ๋Š” C1โ€“C11 ์ œ์•ฝ์„ ํ—ค๋“œ๋ฆฌ์Šค๋กœ ๊ฒ€์ฆํ•œ๋‹ค(๊ฒฐ์ •์„ฑ, ์ธ์„ผํ‹ฐ๋ธŒ ์ •ํ•ฉ, ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์ง€ํ‘œ, ๊ทœ์น™ ์œ ์ผ์‹๋ณ„, ํ๋ธŒ/๋ถˆ๋ณ€์„ฑ, PEER ๊ทœ์น™-์ค€์ˆ˜, SWAP ๋“ฑ). `standalone.html` ์žฌ์ƒ์„ฑ์€ `index.html`+`style.css`+`engine.js`+`app.js`+`llm/observe.js`+`llm/providers.js`+`llm/spectate.js` ์ธ๋ผ์ธ์œผ๋กœ ์ˆ˜ํ–‰(์ง์ ‘ ํŽธ์ง‘ ๊ธˆ์ง€).