Agent Runtime ๐Ÿค–

OpenClaw๋Š” p-mono์—์„œ ํŒŒ์ƒ๋œ ๋‹จ์ผ ์ž„๋ฒ ๋””๋“œ agent ๋Ÿฐํƒ€์ž„์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Workspace (ํ•„์ˆ˜)

OpenClaw๋Š” ๋‹จ์ผ agent workspace ๋””๋ ‰ํ† ๋ฆฌ(agents.defaults.workspace)๋ฅผ tool ๋ฐ ์ปจํ…์ŠคํŠธ๋ฅผ ์œ„ํ•œ agent์˜ ์œ ์ผํ•œ ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ(cwd)๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ถŒ์žฅ: openclaw setup์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ˆ„๋ฝ๋œ ๊ฒฝ์šฐ ~/.openclaw/openclaw.json์„ ์ƒ์„ฑํ•˜๊ณ  workspace ํŒŒ์ผ์„ ์ดˆ๊ธฐํ™”ํ•˜์„ธ์š”.

์ „์ฒด workspace ๋ ˆ์ด์•„์›ƒ + ๋ฐฑ์—… ๊ฐ€์ด๋“œ: Agent workspace

agents.defaults.sandbox๊ฐ€ ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ, ๋น„ main session์€ agents.defaults.sandbox.workspaceRoot ์•„๋ž˜์˜ session๋ณ„ workspace๋กœ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (Gateway configuration ์ฐธ์กฐ).

Bootstrap ํŒŒ์ผ (์ฃผ์ž…๋จ)

agents.defaults.workspace ๋‚ด๋ถ€์—์„œ OpenClaw๋Š” ๋‹ค์Œ ์‚ฌ์šฉ์ž ํŽธ์ง‘ ๊ฐ€๋Šฅํ•œ ํŒŒ์ผ์„ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค:

  • AGENTS.md โ€” ์ž‘๋™ ์ง€์นจ + "๋ฉ”๋ชจ๋ฆฌ"
  • SOUL.md โ€” ํŽ˜๋ฅด์†Œ๋‚˜, ๊ฒฝ๊ณ„, ํ†ค
  • TOOLS.md โ€” ์‚ฌ์šฉ์ž ์œ ์ง€ ๊ด€๋ฆฌ tool ๋…ธํŠธ (์˜ˆ: imsg, sag, ๊ทœ์น™)
  • BOOTSTRAP.md โ€” ์ผํšŒ์„ฑ ์ฒซ ์‹คํ–‰ ์˜์‹ (์™„๋ฃŒ ํ›„ ์‚ญ์ œ๋จ)
  • IDENTITY.md โ€” agent ์ด๋ฆ„/๋ถ„์œ„๊ธฐ/์ด๋ชจ์ง€
  • USER.md โ€” ์‚ฌ์šฉ์ž ํ”„๋กœํ•„ + ์„ ํ˜ธํ•˜๋Š” ํ˜ธ์นญ

์ƒˆ session์˜ ์ฒซ ๋ฒˆ์งธ ํ„ด์—์„œ OpenClaw๋Š” ์ด๋Ÿฌํ•œ ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ agent ์ปจํ…์ŠคํŠธ์— ์ง์ ‘ ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค.

๋นˆ ํŒŒ์ผ์€ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค. ํฐ ํŒŒ์ผ์€ ํ”„๋กฌํ”„ํŠธ๊ฐ€ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์œ ์ง€๋˜๋„๋ก ์ž˜๋ฆฌ๊ณ  ๋งˆ์ปค๋กœ ์ž˜๋ฆฝ๋‹ˆ๋‹ค (์ „์ฒด ๋‚ด์šฉ์„ ๋ณด๋ ค๋ฉด ํŒŒ์ผ์„ ์ฝ์œผ์„ธ์š”).

ํŒŒ์ผ์ด ๋ˆ„๋ฝ๋œ ๊ฒฝ์šฐ, OpenClaw๋Š” ๋‹จ์ผ "๋ˆ„๋ฝ๋œ ํŒŒ์ผ" ๋งˆ์ปค ๋ผ์ธ์„ ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค (๊ทธ๋ฆฌ๊ณ  openclaw setup์€ ์•ˆ์ „ํ•œ ๊ธฐ๋ณธ ํ…œํ”Œ๋ฆฟ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค).

BOOTSTRAP.md๋Š” ์™„์ „ํžˆ ์ƒˆ๋กœ์šด workspace์—๋งŒ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค (๋‹ค๋ฅธ bootstrap ํŒŒ์ผ์ด ์—†๋Š” ๊ฒฝ์šฐ). ์˜์‹์„ ์™„๋ฃŒํ•œ ํ›„ ์‚ญ์ œํ•˜๋ฉด ์ดํ›„ ์žฌ์‹œ์ž‘ ์‹œ ์žฌ์ƒ์„ฑ๋˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

bootstrap ํŒŒ์ผ ์ƒ์„ฑ์„ ์™„์ „ํžˆ ๋น„ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด (์‚ฌ์ „ ์‹œ๋“œ๋œ workspace์˜ ๊ฒฝ์šฐ), ๋‹ค์Œ์„ ์„ค์ •ํ•˜์„ธ์š”:

{ agent: { skipBootstrap: true } }

๋‚ด์žฅ tool

ํ•ต์‹ฌ tool(read/exec/edit/write ๋ฐ ๊ด€๋ จ ์‹œ์Šคํ…œ tool)์€ tool policy์— ๋”ฐ๋ผ ํ•ญ์ƒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. apply_patch๋Š” ์„ ํƒ ์‚ฌํ•ญ์ด๋ฉฐ tools.exec.applyPatch์— ์˜ํ•ด ์ œ์–ด๋ฉ๋‹ˆ๋‹ค. TOOLS.md๋Š” ์–ด๋–ค tool์ด ์กด์žฌํ•˜๋Š”์ง€ ์ œ์–ดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค; ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ง€์นจ์ž…๋‹ˆ๋‹ค.

Skill

OpenClaw๋Š” ์„ธ ์œ„์น˜์—์„œ skill์„ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค (์ด๋ฆ„ ์ถฉ๋Œ ์‹œ workspace๊ฐ€ ์šฐ์„ ):

  • ๋ฒˆ๋“ค (์„ค์น˜์™€ ํ•จ๊ป˜ ์ œ๊ณต๋จ)
  • ๊ด€๋ฆฌํ˜•/๋กœ์ปฌ: ~/.openclaw/skills
  • Workspace: <workspace>/skills

Skill์€ config/env์— ์˜ํ•ด ์ œ์–ด๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (Gateway configuration์˜ skills ์ฐธ์กฐ).

p-mono ํ†ตํ•ฉ

OpenClaw๋Š” p-mono ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ์กฐ๊ฐ(model/tool)์„ ์žฌ์‚ฌ์šฉํ•˜์ง€๋งŒ session ๊ด€๋ฆฌ, ๊ฒ€์ƒ‰ ๋ฐ tool ์—ฐ๊ฒฐ์€ OpenClaw๊ฐ€ ์†Œ์œ ํ•ฉ๋‹ˆ๋‹ค.

  • p-coding agent ๋Ÿฐํƒ€์ž„ ์—†์Œ.
  • ~/.pi/agent ๋˜๋Š” <workspace>/.pi ์„ค์ •์€ ์ฐธ์กฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Session

Session transcript๋Š” ๋‹ค์Œ ์œ„์น˜์— JSONL๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค:

  • ~/.openclaw/agents/<agentId>/sessions/<SessionId>.jsonl

Session ID๋Š” ์•ˆ์ •์ ์ด๋ฉฐ OpenClaw๊ฐ€ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๋ ˆ๊ฑฐ์‹œ Pi/Tau session ํด๋”๋Š” ์ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ŠคํŠธ๋ฆฌ๋ฐ ์ค‘ ์กฐํ–ฅ

Queue mode๊ฐ€ steer์ธ ๊ฒฝ์šฐ, ์ธ๋ฐ”์šด๋“œ ๋ฉ”์‹œ์ง€๊ฐ€ ํ˜„์žฌ ์‹คํ–‰์— ์ฃผ์ž…๋ฉ๋‹ˆ๋‹ค. Queue๋Š” ๊ฐ tool ํ˜ธ์ถœ ํ›„์— ํ™•์ธ๋ฉ๋‹ˆ๋‹ค; ํ์— ์žˆ๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ์žˆ์œผ๋ฉด ํ˜„์žฌ assistant ๋ฉ”์‹œ์ง€์˜ ๋‚˜๋จธ์ง€ tool ํ˜ธ์ถœ์ด ๊ฑด๋„ˆ๋›ฐ์–ด์ง‘๋‹ˆ๋‹ค ("Skipped due to queued user message."๋กœ ์˜ค๋ฅ˜ tool ๊ฒฐ๊ณผ), ๊ทธ๋Ÿฐ ๋‹ค์Œ ํ์— ์žˆ๋Š” ์‚ฌ์šฉ์ž ๋ฉ”์‹œ์ง€๊ฐ€ ๋‹ค์Œ assistant ์‘๋‹ต ์ „์— ์ฃผ์ž…๋ฉ๋‹ˆ๋‹ค.

Queue mode๊ฐ€ followup ๋˜๋Š” collect์ธ ๊ฒฝ์šฐ, ์ธ๋ฐ”์šด๋“œ ๋ฉ”์‹œ์ง€๋Š” ํ˜„์žฌ ํ„ด์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ๋ณด๋ฅ˜๋œ ๋‹ค์Œ ํ์— ์žˆ๋Š” payload๋กœ ์ƒˆ agent ํ„ด์ด ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. mode + debounce/cap ๋™์ž‘์€ Queue ์ฐธ์กฐ.

Block ์ŠคํŠธ๋ฆฌ๋ฐ์€ ์™„๋ฃŒ๋œ assistant block์„ ์™„๋ฃŒ๋˜๋Š” ์ฆ‰์‹œ ์ „์†กํ•ฉ๋‹ˆ๋‹ค; ๊ธฐ๋ณธ์ ์œผ๋กœ ๊บผ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค (agents.defaults.blockStreamingDefault: "off"). ๊ฒฝ๊ณ„๋Š” agents.defaults.blockStreamingBreak๋ฅผ ํ†ตํ•ด ์กฐ์ •ํ•˜์„ธ์š” (text_end vs message_end; ๊ธฐ๋ณธ๊ฐ’ text_end). ์†Œํ”„ํŠธ block ์ฒญํ‚น์€ agents.defaults.blockStreamingChunk๋กœ ์ œ์–ดํ•˜์„ธ์š” (๊ธฐ๋ณธ๊ฐ’ 800โ€“1200์ž; ๋‹จ๋ฝ ๊ตฌ๋ถ„ ์„ ํ˜ธ, ๊ทธ ๋‹ค์Œ ์ค„๋ฐ”๊ฟˆ; ๋ฌธ์žฅ ๋งˆ์ง€๋ง‰). ์ŠคํŠธ๋ฆฌ๋ฐ๋œ ์ฒญํฌ๋ฅผ agents.defaults.blockStreamingCoalesce๋กœ ๋ณ‘ํ•ฉํ•˜์—ฌ ๋‹จ์ผ ๋ผ์ธ ์ŠคํŒธ์„ ์ค„์ด์„ธ์š” (์ „์†ก ์ „ idle ๊ธฐ๋ฐ˜ ๋ณ‘ํ•ฉ). ๋น„ Telegram channel์€ block ์‘๋‹ต์„ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด ๋ช…์‹œ์ ์œผ๋กœ *.blockStreaming: true๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. Verbose tool ์š”์•ฝ์€ tool ์‹œ์ž‘ ์‹œ ๋ฐœํ–‰๋ฉ๋‹ˆ๋‹ค (debounce ์—†์Œ); Control UI๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ agent event๋ฅผ ํ†ตํ•ด tool ์ถœ๋ ฅ์„ ์ŠคํŠธ๋ฆฌ๋ฐํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ: Streaming + chunking.

Model ref

config์˜ model ref(์˜ˆ: agents.defaults.model ๋ฐ agents.defaults.models)๋Š” ์ฒซ ๋ฒˆ์งธ /๋กœ ๋ถ„ํ• ํ•˜์—ฌ ํŒŒ์‹ฑ๋ฉ๋‹ˆ๋‹ค.

  • model์„ ๊ตฌ์„ฑํ•  ๋•Œ provider/model์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • model ID ์ž์ฒด์— /๊ฐ€ ํฌํ•จ๋œ ๊ฒฝ์šฐ(OpenRouter ์Šคํƒ€์ผ), provider ์ ‘๋‘์‚ฌ๋ฅผ ํฌํ•จํ•˜์„ธ์š” (์˜ˆ: openrouter/moonshotai/kimi-k2).
  • provider๋ฅผ ์ƒ๋žตํ•˜๋ฉด OpenClaw๋Š” ์ž…๋ ฅ์„ alias ๋˜๋Š” ๊ธฐ๋ณธ provider์˜ model๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค (model ID์— /๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ž‘๋™).

๊ตฌ์„ฑ (์ตœ์†Œ)

์ตœ์†Œํ•œ ๋‹ค์Œ์„ ์„ค์ •ํ•˜์„ธ์š”:

  • agents.defaults.workspace
  • channels.whatsapp.allowFrom (๊ฐ•๋ ฅ ๊ถŒ์žฅ)

๋‹ค์Œ: Group Chats ๐Ÿฆž