• Hermes Agent๋Š” Nous Research๊ฐ€ ๋งŒ๋“  ์ž๊ฐ€ ๊ฐœ์„ (self-improving) AI ์—์ด์ „ํŠธ์ด์ž MIT ๋ผ์ด์„ ์Šค ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ์ ํŠธ
  • ๊ฒฝํ—˜์—์„œ ์Šคํ‚ฌ์„ ๋งŒ๋“ค๊ณ  ์‚ฌ์šฉ ์ค‘์— ๊ทธ ์Šคํ‚ฌ์„ ๊ฐœ์„ ํ•˜๋Š” ๋‚ด์žฅ ํ•™์Šต ๋ฃจํ”„(built-in learning loop)๋ฅผ ๊ฐ€์ง„ ์—์ด์ „ํŠธ
  • ๋…ธํŠธ๋ถ์— ๋ฌถ์ด์ง€ ์•Š๊ณ  $5 VPSยทGPU ํด๋Ÿฌ์Šคํ„ฐยท์„œ๋ฒ„๋ฆฌ์Šค ์ธํ”„๋ผ์—์„œ ์ƒ์‹œ ๋™์ž‘ํ•˜๋Š” ์…€ํ”„ ํ˜ธ์ŠคํŒ… ์ž์œจ ์—์ด์ „ํŠธ

ํ•ด๋‹น ๊ฐœ๋…์ด ํ•„์š”ํ•œ ์ด์œ 

  • ์ปจํ…์ŠคํŠธ ํ”ผ๋กœ(Context Fatigue): ์ผ๋ฐ˜ ์ฑ—๋ด‡์€ ์„ธ์…˜์ด ๋๋‚˜๋ฉด ๋‹ค ์žŠ์–ด๋ฒ„๋ ค ๋งค๋ฒˆ ์„ค๋ช…์„ ๋ฐ˜๋ณตํ•ด์•ผ ํ•จ โ†’ ์˜์† ๋ฉ”๋ชจ๋ฆฌ๋กœ ํ•ด๊ฒฐ
  • ์ง€์‹ ์†์‹ค(Knowledge Loss): ์–ด๋ ต๊ฒŒ ํ‘ผ ๋ฌธ์ œ์˜ ํ•ด๋ฒ•์ด ์‚ฌ๋ผ์ง โ†’ ์ž๋™์œผ๋กœ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์Šคํ‚ฌ ๋ฌธ์„œ(SKILL.md)๋กœ ์ €์žฅ
  • ํ”Œ๋žซํผ ํŒŒํŽธํ™”: ๋„๊ตฌ๋งˆ๋‹ค ํฉ์–ด์ง„ ๋Œ€ํ™” โ†’ TelegramยทDiscordยทSlackยทWhatsAppยทSignalยทCLI๋ฅผ ๋‹จ์ผ ๊ฒŒ์ดํŠธ์›จ์ด๋กœ ํ†ตํ•ฉ
  • ๋ชจ๋ธ ์ข…์†(Lock-in): ํŠน์ • LLM์— ๋ฌถ์ž„ โ†’ hermes model๋กœ 200+ ๋ชจ๋ธ์„ ์ฝ”๋“œ ๋ณ€๊ฒฝ ์—†์ด ๊ต์ฒด
  • ๋ฐ˜๋ณต ์ž‘์—…: ์ˆ˜๋™ ๋ฐ˜๋ณต โ†’ ์ž์—ฐ์–ด cron ์Šค์ผ€์ค„๋Ÿฌ๋กœ ๋ฌด์ธ ์ž๋™ํ™”

AS-IS (์ผ๋ฐ˜ ์ฑ—๋ด‡/์ฝ”ํŒŒ์ผ๋Ÿฟ)

sequenceDiagram
    autonumber
    participant U as ์‚ฌ์šฉ์ž
    participant Bot as ์ฑ—๋ด‡ (stateless)
    U->>Bot: ์งˆ๋ฌธ & ๋ฐฐ๊ฒฝ ์„ค๋ช…
    Bot-->>U: ๋‹ต๋ณ€
    Note over Bot: ์„ธ์…˜ ์ข…๋ฃŒ โ†’ ๊ธฐ์–ต ์†Œ๋ฉธ
    U->>Bot: ๋‹ค์Œ ์„ธ์…˜, ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ์„ค๋ช…
    Note over U,Bot: ๋…ธํŠธ๋ถ์— ๋ฌถ์ž„, ํ•™์Šต ์—†์Œ

TO-BE (Hermes Agent)

sequenceDiagram
    autonumber
    participant U as ์‚ฌ์šฉ์ž (Telegram/CLI ๋“ฑ)
    participant A as Hermes Agent (ํด๋ผ์šฐ๋“œ ์ƒ์ฃผ)
    participant M as ๋ฉ”๋ชจ๋ฆฌ / ์Šคํ‚ฌ ์ €์žฅ์†Œ
    U->>A: ์ž‘์—… ์š”์ฒญ
    A->>A: ๋„๊ตฌ ์‹คํ–‰ & ์ž‘์—… ์ˆ˜ํ–‰
    A->>M: ๊ฒฐ๊ณผ๋ฅผ ์Šคํ‚ฌ(SKILL.md)ยท๋ฉ”๋ชจ๋ฆฌ๋กœ ์ €์žฅ
    A->>M: ๊ณผ๊ฑฐ ๋Œ€ํ™” ๊ฒ€์ƒ‰(FTS5)์œผ๋กœ ๋งฅ๋ฝ ํšŒ์ˆ˜
    A-->>U: ๊ฒฐ๊ณผ (์–ด๋–ค ํ”Œ๋žซํผ์—์„œ๋„ ์ด์–ด์„œ)
    Note over A,M: ์“ธ์ˆ˜๋ก ์‚ฌ์šฉ์ž ๋ชจ๋ธ์ด ๊นŠ์–ด์ง€๋Š” ํ•™์Šต ๋ฃจํ”„

ํ•ต์‹ฌ ํŠน์ง• 6๊ฐ€์ง€

  1. ์ง„์งœ ํ„ฐ๋ฏธ๋„ ์ธํ„ฐํŽ˜์ด์Šค(TUI): ๋ฉ€ํ‹ฐ๋ผ์ธ ํŽธ์ง‘, ์Šฌ๋ž˜์‹œ ๋ช…๋ น ์ž๋™์™„์„ฑ, ๋Œ€ํ™” ํžˆ์Šคํ† ๋ฆฌ, ์ž‘์—… ์ค‘๋‹จยท์žฌ์ง€์‹œ, ์ŠคํŠธ๋ฆฌ๋ฐ ๋„๊ตฌ ์ถœ๋ ฅ
  2. ์‚ฌ์šฉ์ž๊ฐ€ ์žˆ๋Š” ๊ณณ์—์„œ ๋™์ž‘: 6๊ฐœ ๋ฉ”์‹ ์ € + CLI๋ฅผ ๋‹จ์ผ ๊ฒŒ์ดํŠธ์›จ์ด ํ”„๋กœ์„ธ์Šค๋กœ. ์Œ์„ฑ ๋ฉ”๋ชจ ์ „์‚ฌ, ํ”Œ๋žซํผ ๊ฐ„ ๋Œ€ํ™” ์—ฐ์†์„ฑ
  3. ๋‹ซํžŒ ํ•™์Šต ๋ฃจํ”„(Closed Learning Loop): ์ฃผ๊ธฐ์  ๋ฉ”๋ชจ๋ฆฌ ๋ณด์กด ๋„›์ง€, ๋ณต์žกํ•œ ์ž‘์—… ํ›„ ์ž๋™ ์Šคํ‚ฌ ์ƒ์„ฑ, ์‚ฌ์šฉ ์ค‘ ์Šคํ‚ฌ ์ž๊ธฐ ๊ฐœ์„ , FTS5 ์„ธ์…˜ ๊ฒ€์ƒ‰ + LLM ์š”์•ฝ
  4. ์Šค์ผ€์ค„ ์ž๋™ํ™”: ํ”Œ๋žซํผ ์ „์†ก์ด ๊ฐ€๋Šฅํ•œ ๋‚ด์žฅ cron. ์ผ์ผ ๋ฆฌํฌํŠธยท์•ผ๊ฐ„ ๋ฐฑ์—…ยท์ฃผ๊ฐ„ ๊ฐ์‚ฌ๋ฅผ ์ž์—ฐ์–ด๋กœ
  5. ์œ„์ž„๊ณผ ๋ณ‘๋ ฌํ™”: ๊ฒฉ๋ฆฌ๋œ ์„œ๋ธŒ์—์ด์ „ํŠธ๋ฅผ ๋„์›Œ ๋ณ‘๋ ฌ ์ž‘์—…. RPC๋กœ ๋„๊ตฌ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ํŒŒ์ด์ฌ ์Šคํฌ๋ฆฝํŠธ๋กœ ๋‹ค๋‹จ๊ณ„ ํŒŒ์ดํ”„๋ผ์ธ์„ ๋ฌด๋งฅ๋ฝ ๋น„์šฉ ํ„ด์œผ๋กœ ์••์ถ•
  6. ์–ด๋””์„œ๋“  ์‹คํ–‰: 6๊ฐœ ํ„ฐ๋ฏธ๋„ ๋ฐฑ์—”๋“œ(localยทDockerยทSSHยทSingularityยทModalยทDaytona). Modal/Daytona๋Š” ์œ ํœด ์‹œ ํœด๋ฉดํ•˜๋Š” ์„œ๋ฒ„๋ฆฌ์Šค ์˜์†์„ฑ

์•„ํ‚คํ…์ฒ˜ ๊ตฌ์„ฑ์š”์†Œ

์‹ค์ œ ์ €์žฅ์†Œ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ์™€ ๋Œ€์‘ํ•œ๋‹ค.

๊ตฌ์„ฑ์š”์†Œ๋””๋ ‰ํ† ๋ฆฌ์—ญํ• 
Agent ์ฝ”์–ดrun_agent.py, agent/์˜์‚ฌ๊ฒฐ์ • ๋ฃจํ”„ + ๋„๊ตฌ ์‹คํ–‰ (AIAgent ํด๋ž˜์Šค)
Gatewaygateway/20+ ๋ฉ”์‹ ์ €๋ฅผ ์ž‡๋Š” ํ†ตํ•ฉ ๋ฉ”์‹œ์ง• ์ธํ„ฐํŽ˜์ด์Šค
CLI / TUIhermes_cli/, ui-tui/ํ„ฐ๋ฏธ๋„ ์ง„์ž…์ ๊ณผ UI
Skillsskills/, optional-skills/์ ˆ์ฐจ์  ๋ฉ”๋ชจ๋ฆฌ, agentskills.io ํ‘œ์ค€ ํ˜ธํ™˜
Toolstools/์›น ๊ฒ€์ƒ‰ยท์ด๋ฏธ์ง€ ์ƒ์„ฑยท์ฝ”๋“œ ์‹คํ–‰ยทํด๋ผ์šฐ๋“œ ๋ธŒ๋ผ์šฐ์ € ๋“ฑ 70+
Croncron/์Šค์ผ€์ค„ ์ž๋™ํ™”
Providersproviders/LLM ๊ณต๊ธ‰์ž ์ถ”์ƒํ™”(Nous Portal, OpenRouter ๋“ฑ)
Statehermes_state.pySQLite ์„ธ์…˜ ์ €์žฅ์†Œ(~/.hermes/state.db)

ํ•™์Šต ๋ฃจํ”„๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹ (๊ฐœ๋ฐœ์ž ๊ด€์ )

Hermes๊ฐ€ โ€œ์ž๊ฐ€ ๊ฐœ์„ (self-improving)โ€œ์ด๋ผ ๋ถˆ๋ฆฌ๋Š” ํ•ต์‹ฌ์ด๋‹ค. ๋‹จ์ˆœํžˆ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, ๋งค ํ„ด ํ›„ ์—์ด์ „ํŠธ๊ฐ€ ์ž๊ธฐ ์ž์‹ ์„ ํฌํฌ(fork)ํ•ด์„œ โ€œ์ด๋ฒˆ ๋Œ€ํ™”์—์„œ ๊ธฐ์–ตํ•˜๊ฑฐ๋‚˜ ์Šคํ‚ฌ๋กœ ๋งŒ๋“ค ๊ฒŒ ์žˆ๋‚˜?โ€๋ฅผ ์Šค์Šค๋กœ ํ‰๊ฐ€ํ•˜๋Š” ๊ตฌ์กฐ๋‹ค. ์•„๋ž˜ 5๊ฐœ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ๋งž๋ฌผ๋ ค ๋ˆ๋‹ค.

1. ์—์ด์ „ํŠธ ํ„ด ๋ฃจํ”„ (AIAgent.run_conversation)

๋ชจ๋“  ๊ฒƒ์˜ ์ค‘์‹ฌ์€ run_agent.py์˜ AIAgent ํด๋ž˜์Šค๋‹ค. ํ•œ ํ„ด์€ ๋‹ค์Œ ์ˆœ์„œ๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค.

run_conversation()
  1. task_id ์ƒ์„ฑ (์—†์œผ๋ฉด)
  2. ์‚ฌ์šฉ์ž ๋ฉ”์‹œ์ง€๋ฅผ ๋Œ€ํ™” ํžˆ์Šคํ† ๋ฆฌ์— ์ถ”๊ฐ€
  3. ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ ๋นŒ๋“œ ๋˜๋Š” ์บ์‹œ ์žฌ์‚ฌ์šฉ (prompt_builder.py)
  4. ํ”„๋ฆฌํ”Œ๋ผ์ดํŠธ ์••์ถ• ํ•„์š” ์—ฌ๋ถ€ ํ™•์ธ (์ปจํ…์ŠคํŠธ >50%)
  5. ๋Œ€ํ™” ํžˆ์Šคํ† ๋ฆฌ๋กœ API ๋ฉ”์‹œ์ง€ ๊ตฌ์„ฑ (api_mode๋ณ„ ๋ณ€ํ™˜)
  6. ephemeral ํ”„๋กฌํ”„ํŠธ ๋ ˆ์ด์–ด ์ฃผ์ž… (์˜ˆ์‚ฐ ๊ฒฝ๊ณ , ์ปจํ…์ŠคํŠธ ์••๋ฐ•)
  7. Anthropic์ด๋ฉด ํ”„๋กฌํ”„ํŠธ ์บ์‹ฑ ๋งˆ์ปค ์ ์šฉ
  8. ์ค‘๋‹จ ๊ฐ€๋Šฅํ•œ(interruptible) API ํ˜ธ์ถœ
  9. ์‘๋‹ต ํŒŒ์‹ฑ:
     - tool_calls ์žˆ์œผ๋ฉด โ†’ ์‹คํ–‰ ํ›„ ๊ฒฐ๊ณผ append โ†’ step 5๋กœ ๋ฃจํ”„๋ฐฑ
     - ํ…์ŠคํŠธ ์‘๋‹ต์ด๋ฉด โ†’ ์„ธ์…˜ ์˜์†ํ™”, ํ•„์š” ์‹œ ๋ฉ”๋ชจ๋ฆฌ flush, ๋ฐ˜ํ™˜

๋ฉ”์‹œ์ง€๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ํ•ญ์ƒ OpenAI ํ˜ธํ™˜ ํฌ๋งท(role/content/tool_calls)์œผ๋กœ ํ†ต์ผ๋˜๋ฉฐ, chat_completionsยทcodex_responsesยทanthropic_messages ์„ธ ๊ฐ€์ง€ API ๋ชจ๋“œ๊ฐ€ ๋ชจ๋‘ ์ด ํฌ๋งท์œผ๋กœ ์ˆ˜๋ ดํ•œ๋‹ค.

์—์ด์ „ํŠธ ๋ ˆ๋ฒจ ๋„๊ตฌ

์ผ๋ถ€ ๋„๊ตฌ๋Š” ์ผ๋ฐ˜ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ(tools/registry.py)๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  run_agent.py๊ฐ€ ์ง์ ‘ ๊ฐ€๋กœ์ฑ„์„œ ์—์ด์ „ํŠธ ์ƒํƒœ๋ฅผ ๋ฐ”๊พผ๋‹ค. ํ•™์Šต ๋ฃจํ”„์˜ ์ž…๊ตฌ๊ฐ€ ์—ฌ๊ธฐ๋‹ค.

๋„๊ตฌ์—ญํ• 
memory์˜์† ๋ฉ”๋ชจ๋ฆฌ ํŒŒ์ผ์— ๊ธ€์ž ์ˆ˜ ์ œํ•œ๊ณผ ํ•จ๊ป˜ ๊ธฐ๋ก
session_search์„ธ์…˜ DB์—์„œ ๊ณผ๊ฑฐ ๋Œ€ํ™” ๊ฒ€์ƒ‰
delegate_task๊ฒฉ๋ฆฌ๋œ ์ปจํ…์ŠคํŠธ๋กœ ์„œ๋ธŒ์—์ด์ „ํŠธ ์Šคํฐ
todo์—์ด์ „ํŠธ ๋กœ์ปฌ ์ž‘์—… ์ƒํƒœ

2. ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž๊ฐ€ ๊ฐœ์„  ๋ฆฌ๋ทฐ (agent/background_review.py) โ€” ๋ฃจํ”„์˜ ์‹ฌ์žฅ

ํ„ด์ด ๋๋‚˜๋ฉด run_conversation์ด spawn_background_review_thread๋ฅผ ํ˜ธ์ถœํ•ด ๋ฐ๋ชฌ ์Šค๋ ˆ๋“œ๋ฅผ ๋„์šด๋‹ค. ์ด ์Šค๋ ˆ๋“œ์˜ ๋™์ž‘์ด Hermes ํ•™์Šต ๋ฃจํ”„์˜ ๋ณธ์งˆ์ด๋‹ค.

  • ๋Œ€ํ™” ์Šค๋ƒ…์ƒท์„ **ํฌํฌ๋œ AIAgent**์—์„œ **์žฌ์ƒ(replay)**ํ•˜๋ฉฐ ์Šค์Šค๋กœ์—๊ฒŒ ๋ฌป๋Š”๋‹ค: โ€œ์ €์žฅํ•˜๊ฑฐ๋‚˜ ๊ฐฑ์‹ ํ•  ์Šคํ‚ฌ/๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์žˆ๋Š”๊ฐ€?โ€
  • ์ด ํฌํฌ๋Š” ๋ฉ”๋ชจ๋ฆฌยท์Šคํ‚ฌ ๊ด€๋ฆฌ ๋„๊ตฌ๋งŒ ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ๋กœ ํ—ˆ์šฉํ•œ๋‹ค. ๊ทธ ์™ธ ๋ชจ๋“  ๋„๊ตฌ๋Š” ๋Ÿฐํƒ€์ž„์—์„œ ๊ฑฐ๋ถ€๋œ๋‹ค (์•ˆ์ „์žฅ์น˜).
  • ๊ฒฐ๊ณผ ์“ฐ๊ธฐ๋Š” ๋ฉ”๋ชจ๋ฆฌยท์Šคํ‚ฌ ์ €์žฅ์†Œ๋กœ ์งํ–‰ํ•œ๋‹ค.
  • ๋ฉ”์ธ ๋Œ€ํ™”์™€ ํ”„๋กฌํ”„ํŠธ ์บ์‹œ๋Š” ์ ˆ๋Œ€ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค โ€” ์‚ฌ์šฉ์ž ํ–ฅ ์‘๋‹ต ์†๋„์™€ ์บ์‹œ ์ ์ค‘๋ฅ ์„ ๋ณด์กดํ•˜๊ธฐ ์œ„ํ•œ ํ•ต์‹ฌ ๋ถˆ๋ณ€์‹(invariant)์ด๋‹ค.
  • ํฌํฌ๋Š” ๋ถ€๋ชจ์˜ ๋Ÿฐํƒ€์ž„(providerยทmodelยทbase_urlยทcredentialsยท์บ์‹œ๋œ ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ)์„ ๊ทธ๋Œ€๋กœ ์ƒ์† โ†’ ๋™์ผํ•œ prefix ์บ์‹œ์— ์ ์ค‘ โ†’ ์ €๋ ดํ•œ ์บ์‹œ ์ฝ๊ธฐ.
  • auxiliary.background_review.{provider,model}๋กœ ๋” ์‹ผ ๋ชจ๋ธ์— ๋ฆฌ๋ทฐ๋ฅผ ์œ„์ž„ํ•  ์ˆ˜ ์žˆ๋‹ค(๋ฒค์น˜๋งˆํฌ ~3โ€“5ร— ์ ˆ๊ฐ). ๋‹ค๋ฅธ ๋ชจ๋ธ์€ ๋ฉ”์ธ ์บ์‹œ๋ฅผ ๋ชป ์“ฐ๋ฏ€๋กœ, ์ „์ฒด ํŠธ๋žœ์Šคํฌ๋ฆฝํŠธ ๋Œ€์‹  ์••์ถ• digest(์ตœ๊ทผ ํ„ด ์›๋ฌธ + ์˜› ํ„ด ์š”์•ฝ)๋ฅผ ์žฌ์ƒํ•œ๋‹ค.
sequenceDiagram
    autonumber
    participant U as ์‚ฌ์šฉ์ž
    participant Main as ๋ฉ”์ธ AIAgent
    participant Fork as ํฌํฌ AIAgent (๋ฐ๋ชฌ ์Šค๋ ˆ๋“œ)
    participant Store as ๋ฉ”๋ชจ๋ฆฌ/์Šคํ‚ฌ ์ €์žฅ์†Œ
    U->>Main: ๋ฉ”์‹œ์ง€
    Main->>Main: ๋„๊ตฌ ์‹คํ–‰ & ์‘๋‹ต ์ƒ์„ฑ
    Main-->>U: ์‘๋‹ต (์ฆ‰์‹œ)
    Main->>Fork: spawn_background_review_thread(๋Œ€ํ™” ์Šค๋ƒ…์ƒท)
    Note over Fork: ๋„๊ตฌ ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ<br/>= memory + skill ๊ด€๋ฆฌ ์ „์šฉ
    Fork->>Fork: ๋Œ€ํ™” ์žฌ์ƒ โ†’ "๊ธฐ์–ต/์Šคํ‚ฌ๋กœ ๋งŒ๋“ค ๊ฒŒ ์žˆ๋‚˜?"
    Fork->>Store: memory.add / skill_manage.createยทpatch
    Note over Main,Fork: ๋ฉ”์ธ ๋Œ€ํ™”ยทํ”„๋กฌํ”„ํŠธ ์บ์‹œ๋Š”<br/>์ ˆ๋Œ€ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š์Œ

์ด ๋ฆฌ๋ทฐ๊ฐ€ ๋งŒ๋“  ๋ฉ”๋ชจ๋ฆฌ/์Šคํ‚ฌ์€ ๋‹ค์Œ ์„ธ์…˜์˜ ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ๋กœ ํ˜๋Ÿฌ ๋“ค์–ด๊ฐ€ ๋‹ค์Œ ๋Œ€ํ™”๋ฅผ ๋” ๋˜‘๋˜‘ํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค. ์ด๊ฒƒ์ด โ€œ๋‹ซํžŒ ๋ฃจํ”„โ€๊ฐ€ ๋‹ซํžˆ๋Š” ์ง€์ ์ด๋‹ค.

3. ๋ฉ”๋ชจ๋ฆฌ: frozen snapshot ํŒจํ„ด

์˜์† ๋ฉ”๋ชจ๋ฆฌ๋Š” ~/.hermes/memories/์˜ ๋งˆํฌ๋‹ค์šด ๋‘ ํŒŒ์ผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

ํŒŒ์ผ์šฉ๋„๊ธ€์ž ์ œํ•œ
MEMORY.md์—์ด์ „ํŠธ์˜ ๊ฐœ์ธ ๋…ธํŠธ โ€” ํ™˜๊ฒฝ ์‚ฌ์‹ค, ์ปจ๋ฒค์…˜, ํ•™์Šตํ•œ ๊ฒƒ2,200์ž (~800 ํ† ํฐ)
USER.md์‚ฌ์šฉ์ž ํ”„๋กœํ•„ โ€” ์„ ํ˜ธ, ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ์Šคํƒ€์ผ, ๊ธฐ๋Œ€1,375์ž (~500 ํ† ํฐ)

ํ•ต์‹ฌ์€ frozen snapshot ํŒจํ„ด์ด๋‹ค.

  • ์„ธ์…˜ ์‹œ์ž‘ ์‹œ ๋””์Šคํฌ์—์„œ ๋กœ๋“œ๋˜์–ด ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ์— ๊ณ ์ • ๋ธ”๋ก์œผ๋กœ ์ฃผ์ž…๋œ๋‹ค (๊ฐ ํ•ญ๋ชฉ์€ ยง๋กœ ๊ตฌ๋ถ„).
  • ์„ธ์…˜ ๋„์ค‘ memory ๋„๊ตฌ๋กœ ์ถ”๊ฐ€/๊ต์ฒด/์‚ญ์ œํ•˜๋ฉด ๋””์Šคํฌ์—๋Š” ์ฆ‰์‹œ ๋ฐ˜์˜๋˜์ง€๋งŒ, ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ์—๋Š” ๋‹ค์Œ ์„ธ์…˜๋ถ€ํ„ฐ ๋‚˜ํƒ€๋‚œ๋‹ค. โ†’ LLM prefix ์บ์‹œ๋ฅผ ๊นจ์ง€ ์•Š๊ธฐ ์œ„ํ•จ.
  • memory ๋„๊ตฌ ์•ก์…˜: add / replace / remove (์ฝ๊ธฐ ์•ก์…˜์€ ์—†์Œ โ€” ์ด๋ฏธ ํ”„๋กฌํ”„ํŠธ์— ์žˆ์œผ๋ฏ€๋กœ). replaceยทremove๋Š” ์งง์€ ๊ณ ์œ  substring ๋งค์นญ ์‚ฌ์šฉ.
  • ๊ธ€์ž ์ œํ•œ์„ ๋„˜๊ธฐ๋ฉด ์กฐ์šฉํžˆ ๋ฒ„๋ฆฌ์ง€ ์•Š๊ณ  ์—๋Ÿฌ๋ฅผ ๋ฐ˜ํ™˜ โ†’ ์—์ด์ „ํŠธ๊ฐ€ ๊ฐ™์€ ํ„ด์—์„œ ํ•ญ๋ชฉ์„ ํ†ตํ•ฉยท์‚ญ์ œํ•œ ๋’ค ์žฌ์‹œ๋„.
  • ์ฃผ์ž… ์ „ ๋ณด์•ˆ ์Šค์บ”(ํ”„๋กฌํ”„ํŠธ ์ธ์ ์…˜ยท์ž๊ฒฉ์ฆ๋ช… ํƒˆ์ทจยทinvisible Unicode)์„ ๊ฑฐ์นœ๋‹ค.

4. ์Šคํ‚ฌ: progressive disclosure

์Šคํ‚ฌ์€ ~/.hermes/skills/์— SKILL.md(YAML frontmatter + ๋งˆํฌ๋‹ค์šด)๋กœ ์ €์žฅ๋˜๋ฉฐ, agentskills.io ์˜คํ”ˆ ํ‘œ์ค€๊ณผ ํ˜ธํ™˜๋œ๋‹ค. ํ† ํฐ ์ ˆ์•ฝ์„ ์œ„ํ•ด **์ ์ง„์  ๊ณต๊ฐœ(progressive disclosure)**๋กœ ๋กœ๋“œํ•œ๋‹ค.

Level 0: skills_list()           โ†’ [{name, description, category}, ...]  (~3k ํ† ํฐ)
Level 1: skill_view(name)        โ†’ ์ „์ฒด ๋‚ด์šฉ + ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ
Level 2: skill_view(name, path)  โ†’ ํŠน์ • reference ํŒŒ์ผ
  • ์ž๋™ ์ƒ์„ฑ: ๋ณต์žกํ•œ ์ž‘์—…(5+ ๋„๊ตฌ ํ˜ธ์ถœ), ์—๋Ÿฌ ๋ฐœ์ƒ, ๋น„์ž๋ช…ํ•œ ์›Œํฌํ”Œ๋กœ ๋ฐœ๊ฒฌ ํ›„ skill_manage ๋„๊ตฌ๋กœ ์ƒ์„ฑ. ์•ก์…˜์€ create/patch/edit/delete/write_file.
  • ์กฐ๊ฑด๋ถ€ ํ™œ์„ฑํ™”: fallback_for_toolsets(ํ•ด๋‹น toolset ์—†์„ ๋•Œ๋งŒ ๋…ธ์ถœ), requires_toolsets(์žˆ์„ ๋•Œ๋งŒ ๋…ธ์ถœ).
  • ์ž๊ธฐ ๊ฐœ์„ : ์‚ฌ์šฉ ์ค‘ ๋ฐœ๊ฒฌํ•œ ๊ฐœ์„ ์ ์„ patch๋กœ ๋ฐ˜์˜(ํ† ํฐ ํšจ์œจ์ ).
  • ๋ชจ๋“  ์Šฌ๋ž˜์‹œ ๋ช…๋ น(/skill-name)์œผ๋กœ ํ˜ธ์ถœ ๊ฐ€๋Šฅ. ์„ค์น˜ ์Šคํ‚ฌ์€ ๋ณด์•ˆ ์Šค์บ” + ์‹ ๋ขฐ ๋ ˆ๋ฒจ(builtin/official/trusted/community) ๋ถ€์—ฌ.

5. ์„ธ์…˜ ๊ฒ€์ƒ‰ (FTS5)

๋ฉ”๋ชจ๋ฆฌ๊ฐ€ โ€œํ•ญ์ƒ ๋“ค๊ณ  ๋‹ค๋‹ˆ๋Š” ํ•ต์‹ฌ ์‚ฌ์‹คโ€์ด๋ผ๋ฉด, ์„ธ์…˜ ๊ฒ€์ƒ‰์€ โ€œ์ง€๋‚œ์ฃผ์— ๊ทธ๊ฑฐ ์–˜๊ธฐํ–ˆ์—ˆ๋‚˜?โ€๋ฅผ ์œ„ํ•œ ๋„๊ตฌ๋‹ค.

  • ๋ชจ๋“  CLIยท๋ฉ”์‹ ์ € ์„ธ์…˜์ด SQLite(~/.hermes/state.db)์— ์ €์žฅ๋˜๊ณ , messages_fts ๊ฐ€์ƒ ํ…Œ์ด๋ธ”๋กœ FTS5 ์ „๋ฌธ ๊ฒ€์ƒ‰.
  • session_search ๋„๊ตฌ๋Š” ์‹ค์ œ ๋ฉ”์‹œ์ง€๋ฅผ ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜ โ€” LLM ์š”์•ฝยทtruncation ์—†์Œ.
  • ~20ms, LLM ํ˜ธ์ถœ 0ํšŒ(๋ฌด๋ฃŒ), ์šฉ๋Ÿ‰ ๋ฌด์ œํ•œ. ๋ฉ”์ธ ์ปจํ…์ŠคํŠธ๋ฅผ ์†Œ๋น„ํ•˜์ง€ ์•Š๊ณ  ๊ณผ๊ฑฐ๋ฅผ ํšŒ์ˆ˜.
๋น„๊ต์˜์† ๋ฉ”๋ชจ๋ฆฌ์„ธ์…˜ ๊ฒ€์ƒ‰
์šฉ๋Ÿ‰~1,300 ํ† ํฐ๋ฌด์ œํ•œ
์†๋„์ฆ‰์‹œ(ํ”„๋กฌํ”„ํŠธ ๋‚ด)~20ms FTS5
๋น„์šฉ๋งค ํ”„๋กฌํ”„ํŠธ ํ† ํฐ๋ฌด๋ฃŒ
๊ด€๋ฆฌ์—์ด์ „ํŠธ๊ฐ€ ํ๋ ˆ์ด์…˜์ž๋™(์ „ ์„ธ์…˜ ์ €์žฅ)

๋™์˜ ๊ฒŒ์ดํŠธ (write_approval)

๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋ฆฌ๋ทฐ์˜ ์ž๋™ ์“ฐ๊ธฐ๊ฐ€ ๋ถ€๋‹ด์Šค๋Ÿฝ๋‹ค๋ฉด memory.write_approval: true / skills.write_approval: true๋กœ ์ผค ์ˆ˜ ์žˆ๋‹ค. ์ผœ๋ฉด ํฌ๊ทธ๋ผ์šด๋“œ/๋ฐฑ๊ทธ๋ผ์šด๋“œ ์“ฐ๊ธฐ๊ฐ€ ๋ชจ๋‘ ์Šคํ…Œ์ด์ง•๋˜์–ด /memory pendingยท/skills pending์—์„œ ์Šน์ธ ํ›„์—๋งŒ ๋ฐ˜์˜๋œ๋‹ค. ๊ฒŒ์ดํŠธ์›จ์ด ์ฑ„ํŒ…์—๋Š” ๐Ÿ’พ Memory updated ๊ฐ™์€ ์•Œ๋ฆผ์ด ๋œฌ๋‹ค(display.memory_notifications๋กœ ์ œ์–ด).


Gateway / ๋ฉ€ํ‹ฐํ”Œ๋žซํผ (์‹ฌํ™”)

๊ฒŒ์ดํŠธ์›จ์ด๋Š” Hermes๋ฅผ 20+ ์™ธ๋ถ€ ๋ฉ”์‹œ์ง• ํ”Œ๋žซํผ์— ์ž‡๋Š” ์žฅ๊ธฐ ์‹คํ–‰ ํ”„๋กœ์„ธ์Šค๋‹ค. ๋ณธ์งˆ์€ ๋ฉ€ํ‹ฐ ์–ด๋Œ‘ํ„ฐ ๋ผ์šฐํ„ฐ(multi-adapter router) โ€” ์ œ๊ฐ๊ฐ์ธ ํ”Œ๋žซํผ API๋ฅผ ๋‹จ์ผ ์—์ด์ „ํŠธ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ •๊ทœํ™”ํ•œ๋‹ค. ํ•ต์‹ฌ ์„ค๊ณ„๋Š” ํ•˜๋‚˜์˜ AIAgent ํด๋ž˜์Šค๊ฐ€ CLIยทgatewayยทACPยทbatchยทAPI๋ฅผ ๋ชจ๋‘ ์ฒ˜๋ฆฌํ•˜๊ณ , ํ”Œ๋žซํผ ์ฐจ์ด๋Š” ์ง„์ž…์ (์–ด๋Œ‘ํ„ฐ)์—๋งŒ ๊ฐ€๋‘”๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

sequenceDiagram
    autonumber
    participant P as ํ”Œ๋žซํผ (Telegram ๋“ฑ)
    participant Ad as Platform Adapter
    participant GR as GatewayRunner._handle_message
    participant SS as SessionStore (SQLite)
    participant A as AIAgent
    P->>Ad: raw event
    Ad->>Ad: MessageEvent๋กœ ์ •๊ทœํ™” + ํ™œ์„ฑ ์„ธ์…˜ ๊ฐ€๋“œ ํ™•์ธ
    Ad->>GR: ์ด๋ฒคํŠธ ์ „๋‹ฌ
    GR->>GR: ์„ธ์…˜ ํ‚ค ์ƒ์„ฑ + ์ธ๊ฐ€(authorization) ํ™•์ธ
    alt ์Šฌ๋ž˜์‹œ ๋ช…๋ น
        GR->>GR: ์ปค๋งจ๋“œ ํ•ธ๋“ค๋Ÿฌ๋กœ ๋””์ŠคํŒจ์น˜
    else ์ผ๋ฐ˜ ๋ฉ”์‹œ์ง€
        GR->>A: AIAgent ์ƒ์„ฑ ํ›„ run_conversation
        A->>SS: ๋Œ€ํ™” ์˜์†ํ™”
        A-->>GR: ์‘๋‹ต
    end
    GR->>Ad: send_message
    Ad-->>P: ์‘๋‹ต ์ „์†ก

๋ฉ”์‹œ์ง€ ํ๋ฆ„๊ณผ ๋Œ€ํ™” ์—ฐ์†์„ฑ

  1. ํ”Œ๋žซํผ ์–ด๋Œ‘ํ„ฐ๊ฐ€ raw ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›์•„ MessageEvent๋กœ ์ •๊ทœํ™” (on_message()).
  2. ์„ธ์…˜ ํ‚ค๋กœ ๋ผ์šฐํŒ… ์ปจํ…์ŠคํŠธ๋ฅผ ์ธ์ฝ”๋”ฉ: agent:main:{platform}:{chat_type}:{chat_id} (์˜ˆ: agent:main:telegram:private:123456789). ํ‚ค๋Š” ๋ฐ˜๋“œ์‹œ build_session_key()๋กœ ์ƒ์„ฑ. ์ด per-chat ์„ธ์…˜ ์Šคํ† ์–ด ๋•๋ถ„์— ๋ฉ”์‹œ์ง€๋ฅผ ๋„˜์–ด ๋Œ€ํ™”๊ฐ€ ์ด์–ด์ง„๋‹ค(์ผ์ผ ์‹œ๊ฐ ๋˜๋Š” idle ํƒ€์ž„์•„์›ƒ ์ •์ฑ… ์ „๊นŒ์ง€).
  3. ์ธ๊ฐ€: per-platform allow-all โ†’ ํ”Œ๋žซํผ allowlist โ†’ DM ํŽ˜์–ด๋ง โ†’ ๊ธ€๋กœ๋ฒŒ allow-all โ†’ ๊ธฐ๋ณธ ๊ฑฐ๋ถ€ ์ˆœ์œผ๋กœ ํ‰๊ฐ€.
  4. ์Šฌ๋ž˜์‹œ ๋ช…๋ น์ด๋ฉด ์ปค๋งจ๋“œ ํ•ธ๋“ค๋Ÿฌ๋กœ, ์•„๋‹ˆ๋ฉด AIAgent ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์–ด ๋Œ€ํ™” ์‹คํ–‰.

2๋‹จ๊ณ„ ๋ฉ”์‹œ์ง€ ๊ฐ€๋“œ (์ค‘๋‹จยท์žฌ์ง€์‹œ)

์—์ด์ „ํŠธ๊ฐ€ ์‹คํ–‰ ์ค‘์ผ ๋•Œ ๋“ค์–ด์˜ค๋Š” ๋ฉ”์‹œ์ง€๋Š” ๋‘ ๋‹จ๊ณ„ ๊ฐ€๋“œ๋ฅผ ๊ฑฐ์นœ๋‹ค.

  • Level 1 โ€” ๋ฒ ์ด์Šค ์–ด๋Œ‘ํ„ฐ(gateway/platforms/base.py): _active_sessions ํ™•์ธ. ํ™œ์„ฑ์ด๋ฉด _pending_messages์— ํ์ž‰ํ•˜๊ณ  interrupt ์ด๋ฒคํŠธ set โ†’ ๊ฒŒ์ดํŠธ์›จ์ด ๋Ÿฌ๋„ˆ ๋„๋‹ฌ ์ „์— ์žก์Œ.
  • Level 2 โ€” ๊ฒŒ์ดํŠธ์›จ์ด ๋Ÿฌ๋„ˆ(gateway/run.py): _running_agents ํ™•์ธ. /stopยท/newยท/queueยท/statusยท/approveยท/deny๋Š” ํŠน์ˆ˜ ์ฒ˜๋ฆฌ, ๊ทธ ์™ธ๋Š” interrupt() ํŠธ๋ฆฌ๊ฑฐ. /approve ๋“ฑ์€ race๋ฅผ ํ”ผํ•˜๋ ค ์ธ๋ผ์ธ ๋””์ŠคํŒจ์น˜.

์–ด๋Œ‘ํ„ฐ ๊ตฌ์กฐ์™€ ๋ถ€๊ฐ€ ๋ฉ”์ปค๋‹ˆ์ฆ˜

  • ๋Œ€๋ถ€๋ถ„์˜ ํ”Œ๋žซํผ์€ plugins/platforms/<name>/adapter.py ํ”Œ๋Ÿฌ๊ทธ์ธ ์–ด๋Œ‘ํ„ฐ, ์ผ๋ถ€ ๋ ˆ๊ฑฐ์‹œ๋Š” gateway/platforms/์— ์ง์ ‘. ๋ชจ๋‘ BasePlatformAdapter๋ฅผ ์ƒ์†ํ•˜๊ณ  connect()/disconnect()/send_message()/on_message()๋ฅผ ๊ตฌํ˜„.
  • ํ† ํฐ ๋ฝ(acquire_scoped_lock): ๋‘ ํ”„๋กœํ•„์ด ๊ฐ™์€ ๋ด‡ ํ† ํฐ์„ ๋™์‹œ์— ์“ฐ์ง€ ๋ชปํ•˜๊ฒŒ ๋ง‰์Œ.
  • Silence ํ† ํฐ: ์‘๋‹ต์ด ์ •ํ™•ํžˆ [SILENT]/SILENT/NO_REPLY๋ฉด ์ „์†ก์„ ์–ต์ œํ•˜๋˜ ํ„ด์€ ์„ธ์…˜ ํžˆ์Šคํ† ๋ฆฌ์— ๋ณด์กด.
  • ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์œ ์ง€๋ณด์ˆ˜: cron ํ‹ฑ(์Šค์ผ€์ค„ ์ ๊ฒ€), ์„ธ์…˜ ๋งŒ๋ฃŒ ์ •๋ฆฌ, ๋งŒ๋ฃŒ ์ „ ๋ฉ”๋ชจ๋ฆฌ flush, ๋ชจ๋ธ ๋ชฉ๋ก ์บ์‹œ ๊ฐฑ์‹ .
  • ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ: ์žฅ๊ธฐ ์‹คํ–‰ ํ”„๋กœ์„ธ์Šค๋กœ systemd(Linux)/launchd(macOS) ์„œ๋น„์Šค ๋“ฑ๋ก, PID ํŒŒ์ผ(~/.hermes/gateway.pid)์€ ํ”„๋กœํ•„ ์Šค์ฝ”ํ”„.

์‹œ์ž‘ํ•˜๊ธฐ

# ์„ค์น˜ (Linux/macOS/WSL2/Termux)
curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash
 
hermes              # ๋Œ€ํ™”ํ˜• CLI ์‹œ์ž‘
hermes model        # LLM ๊ณต๊ธ‰์žยท๋ชจ๋ธ ์„ ํƒ
hermes tools        # ํ™œ์„ฑํ™”ํ•  ๋„๊ตฌ ์„ค์ •
hermes gateway      # ๋ฉ”์‹ ์ € ๊ฒŒ์ดํŠธ์›จ์ด ์‹œ์ž‘ (Telegram, Discord ๋“ฑ)
hermes setup        # ์ „์ฒด ์„ค์ • ๋งˆ๋ฒ•์‚ฌ
hermes doctor       # ๋ฌธ์ œ ์ง„๋‹จ

์ฐธ๊ณ  ๋ฌธ์„œ