• AG-UI Agent๋Š” ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆผ์œผ๋กœ ์‘๋‹ต์„ ์ƒ์„ฑํ•˜๋Š” AG-UI ํ”„๋กœํ† ์ฝœ์˜ ์‹คํ–‰ ๋‹จ์œ„
  • LLM/RAG/๋ฉ€ํ‹ฐ ์—์ด์ „ํŠธ ๋“ฑ ์–ด๋–ค AI ์‹œ์Šคํ…œ๋„ ๋™์ผ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ถ”์ƒํ™”ํ•˜๋Š” ๋ฒค๋” ์ค‘๋ฆฝ ์ปดํฌ๋„ŒํŠธ
  • AbstractAgent ๊ณ„์•ฝ์„ ๋”ฐ๋ฅด๋Š” ํ‘œ์ค€ํ™”๋œ ๊ตฌ์ฒด ๊ตฌํ˜„์ฒด
  • ๋ฉ”์‹œ์ง€ยท์ƒํƒœยท๋„๊ตฌยท๊ธฐ์–ตยท๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋‹จ์œ„๋กœ ๋ฌถ์€ ํ•ฉ์„ฑ ์ถ”์ƒํ™” (compound abstraction)

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

  • ๋‹ค์–‘ํ•œ AI ๋ฐฑ์—”๋“œ(LangGraph, CrewAI, Mastraโ€ฆ)๋ฅผ ๋™์ผํ•œ UI์—์„œ ์—ฐ๊ฒฐํ•  ํ‘œ์ค€ ๋‹จ์œ„ ๋ถ€์žฌ ํ•ด๊ฒฐ
  • LLM ํ˜ธ์ถœ์€ stateless์ด์ง€๋งŒ ์‹ค์ œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์€ ๋Œ€ํ™”ยท์ƒํƒœยท๋„๊ตฌยท๊ธฐ์–ต์˜ ๋ˆ„์ ์„ ์š”๊ตฌ
  • Multi-Agent, HITL, Reasoning ํ‘œ์‹œ ๋“ฑ ๊ณ ์ฐจ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ๋‹จ์ผ ํ‘œ์ค€ ๋ชจ๋ธ๋กœ ํ‘œํ˜„ ํ•„์š”

AS-IS โ€” ํŠน์ • AI ์„œ๋น„์Šค์— ์ง์ ‘ ๋ฌถ์ธ ์ฝ”๋“œ

sequenceDiagram
    autonumber
    participant UI as Frontend
    participant SVC as Specific AI Service

    UI->>SVC: ๋ฒค๋” ์ „์šฉ ์š”์ฒญ
    SVC-->>UI: ๋ฒค๋” ์ „์šฉ ์‘๋‹ต
    Note over UI,SVC: ๋ฐฑ์—”๋“œ ๊ต์ฒด ์‹œ<br/>UI ์ „์ฒด ์ˆ˜์ • ํ•„์š”<br/>๋„๊ตฌยท์ƒํƒœยท๊ธฐ์–ต ๋ณ„๋„ ๊ตฌํ˜„

TO-BE โ€” Agent ์ถ”์ƒํ™”๋กœ ์บก์Аํ™”

sequenceDiagram
    autonumber
    participant UI as Frontend
    participant Agent as "AG-UI Agent (AbstractAgent)"
    participant Any as Any AI System

    UI->>Agent: runAgent(input)
    Agent->>Any: ๋‚ด๋ถ€ ์œ„์ž„ (LLM/RAG/Multi-Agent...)
    Any-->>Agent: ๊ฒฐ๊ณผ
    Agent-->>UI: BaseEvent ์ŠคํŠธ๋ฆผ
    Note over Agent: ๋ฉ”์‹œ์ง€ยท์ƒํƒœยท๋„๊ตฌยท๊ธฐ์–ต<br/>ํ‘œ์ค€ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋…ธ์ถœ

Agent์˜ ์ •์ฒด์„ฑ โ€” ๋‹จ์ˆœ LLM ํ˜ธ์ถœ์ด ์•„๋‹Œ ์ด์œ 

Agent๋Š” LLM ํ˜ธ์ถœ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ ์—ฌ๋Ÿฌ ๋Šฅ๋ ฅ์„ ๋ฌถ์€ ํ•ฉ์„ฑ ์ถ”์ƒํ™”๋‹ค.

์ฐจ์›LLM ํ˜ธ์ถœAG-UI Agent
์ž…์ถœ๋ ฅprompt โ†’ completionAG-UI Event ์ŠคํŠธ๋ฆผ โ†” ์–‘๋ฐฉํ–ฅ
์ƒํƒœstatelessAG-UI State Management ๋ณด์œ 
๊ธฐ์–ต๋งค๋ฒˆ ์žฌ๊ตฌ์„ฑAG-UI Messages ์ž๋™ ๋ˆ„์ 
๋„๊ตฌํ˜ธ์ถœ์ž๊ฐ€ ๋งค๋ฒˆ ๊ฒฐํ•ฉAG-UI Tools ํ‘œ์ค€ ์ฑ„๋„
์‹๋ณ„์—†์ŒagentId, threadId, runId

Agent Type 3๊ฐ€์ง€

1. AbstractAgent โ€” ์ถ”์ƒ ๋ฒ ์ด์Šค

AbstractAgent๋Š” ๋ชจ๋“  ์—์ด์ „ํŠธ๊ฐ€ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ์ถ”์ƒ ํด๋ž˜์Šค๋กœ, run(input) โ†’ Observable<BaseEvent> ๋‹จ ํ•˜๋‚˜์˜ ๊ณ„์•ฝ๋งŒ ๊ฐ•์ œํ•œ๋‹ค. ์ƒํƒœยท๋ฉ”์‹œ์ง€ยท์ด๋ฒคํŠธ ๊ฒ€์ฆยท๋ฏธ๋“ค์›จ์–ดยท๊ตฌ๋…์ž ์•Œ๋ฆผ์€ ๋ฒ ์ด์Šค ํด๋ž˜์Šค๊ฐ€ ์ž๋™ ์ฒ˜๋ฆฌํ•œ๋‹ค.

2. HttpAgent โ€” ํ‘œ์ค€ HTTP ๊ตฌํ˜„์ฒด

AbstractAgent๋ฅผ ์ƒ์†ํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ ์ธก ๊ตฌ์ฒด ๊ตฌํ˜„์œผ๋กœ, ์›๊ฒฉ AG-UI ํ˜ธํ™˜ ์—”๋“œํฌ์ธํŠธ์™€ SSE/Binary ํ”„๋กœํ† ์ฝœ๋กœ ํ†ต์‹ ํ•œ๋‹ค. Frontend์—์„œ ๊ฐ€์žฅ ํ”ํžˆ ์‚ฌ์šฉ๋œ๋‹ค.

const agent = new HttpAgent({
  url: "https://your-agent-endpoint.com/agent",
  headers: { Authorization: "Bearer your-api-key" },
})

3. Custom Agent โ€” ์ง์ ‘ ๊ตฌํ˜„

AbstractAgent๋ฅผ ์ƒ์†ํ•ด ์ž„์˜์˜ AI ์‹œ์Šคํ…œ(์ž์ฒด LLM, RAG ํŒŒ์ดํ”„๋ผ์ธ, ๋ฉ€ํ‹ฐ ์—์ด์ „ํŠธ ์ปจํŠธ๋กค๋Ÿฌ)๊ณผ ๊ฒฐํ•ฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

Agent Capabilities 7๊ฐ€์ง€

๊ณต์‹ ๋ฌธ์„œ๊ฐ€ ์ •์˜ํ•˜๋Š” Agent์˜ 7๊ฐ€์ง€ ๋Šฅ๋ ฅ ์นดํƒˆ๋กœ๊ทธ. ๊ฐ ๋Šฅ๋ ฅ์€ ๋ณ„๋„ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ„ํ•ด๋œ๋‹ค.

1. Interactive Communication

์‹ค์‹œ๊ฐ„ ์–‘๋ฐฉํ–ฅ ์ŠคํŠธ๋ฆผ. ์ƒ์„ธ๋Š” AG-UI Event ์ฐธ์กฐ.

2. Tool Usage

Frontend๊ฐ€ ์ •์˜ํ•˜๊ณ  Agent๊ฐ€ ํ˜ธ์ถœํ•˜๋Š” ํ‘œ์ค€ ํ•จ์ˆ˜ ์ธํ„ฐํŽ˜์ด์Šค. ์ƒ์„ธ๋Š” AG-UI Tools ์ฐธ์กฐ. CopilotKit์˜ useCopilotAction ํ›…์ด React์—์„œ ์ด ํŒจํ„ด์„ ๋‹จ์ˆœํ™”ํ•œ ๋Œ€ํ‘œ ์‚ฌ๋ก€.

3. State Management

๊ตฌ์กฐํ™”๋œ ๊ณต์œ  ์ƒํƒœ๋ฅผ STATE_SNAPSHOT / STATE_DELTA๋กœ ๋™๊ธฐํ™”. ์ƒ์„ธ๋Š” AG-UI State Management ์ฐธ์กฐ.

4. Multi-Agent Collaboration

Agent ๊ฐ„ ์ž‘์—… ์œ„์ž„(handoff)ยทํ˜‘์—…์ด ํ”„๋กœํ† ์ฝœ ์ฐจ์›์—์„œ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋‹จ, ๋ˆ„๊ฐ€ ๋ผ์šฐํŒ…์„ ๊ฒฐ์ •ํ•˜๋Š”๊ฐ€(=orchestration ์ฃผ์ฒด)๋Š” AG-UI๊ฐ€ ๊ฐ•์ œํ•˜์ง€ ์•Š๋Š”๋‹ค. ํ”„๋กœํ† ์ฝœ์€ ๊ฒฐ๊ณผ ์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆผ ํฌ๋งท๋งŒ ํ‘œ์ค€ํ™”ํ•˜๊ณ , orchestration์€ ์‚ฌ์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋”ฐ๋ผ 4๊ฐ€์ง€ ํŒจํ„ด ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋‹ด๋‹นํ•œ๋‹ค.

Orchestration ํŒจํ„ด์ฃผ์ฒด๋Œ€ํ‘œ ์‚ฌ๋ก€
Supervisor Agent๊ฐ๋… ์—ญํ• ์˜ ์—์ด์ „ํŠธ๊ฐ€ ํ•˜์œ„ ์—์ด์ „ํŠธ๋ฅผ ๋ผ์šฐํŒ…LangGraph supervisor, CrewAI manager
Workflow Engineํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์ •์˜ํ•œ ๊ทธ๋ž˜ํ”„/DAG๊ฐ€ ์ž๋™ ์ „์ดLangGraph state graph
Frontend RouterUI๊ฐ€ ์˜๋„ยท๋„๋ฉ”์ธ์„ ๋ถ„์„ํ•ด ์ ์ ˆํ•œ ์—์ด์ „ํŠธ ์„ ํƒCopilotKit selfManagedAgents ๋ถ„๊ธฐ
Peer-to-peer Handoff์—์ด์ „ํŠธ๊ฐ€ ์ง์ ‘ ๋‹ค๋ฅธ ์—์ด์ „ํŠธ๋กœ ์œ„์ž„OpenAI Swarm ์Šคํƒ€์ผ ์ง์ ‘ handoff

3๊ฐœ ์—์ด์ „ํŠธ๊ฐ€ ํ˜‘์—…ํ•˜๋Š” Supervisor ํŒจํ„ด ์˜ˆ์‹œ:

sequenceDiagram
    autonumber
    participant UI as Frontend
    participant SUP as Supervisor Agent<br/>(orchestrator)
    participant CA as Coding Agent
    participant RA as Research Agent
    participant DOC as Doc Writer Agent

    UI->>SUP: "์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์กฐ์‚ฌ ํ›„<br/>์ƒ˜ํ”Œ ์ฝ”๋“œ ์งœ๊ณ  ๋ฌธ์„œํ™”ํ•ด์ค˜"
    Note over SUP: ์˜๋„ ๋ถ„์„ โ†’ ์ž‘์—… ๋ถ„ํ•ด<br/>์‹คํ–‰ ๊ณ„ํš ์ˆ˜๋ฆฝ
    SUP->>RA: ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์กฐ์‚ฌ ์œ„์ž„ (state + messages)
    RA-->>SUP: ์กฐ์‚ฌ ๊ฒฐ๊ณผ (state ๊ฐฑ์‹ )
    SUP->>CA: ์ƒ˜ํ”Œ ์ฝ”๋“œ ์ž‘์„ฑ ์œ„์ž„ (์กฐ์‚ฌ ๊ฒฐ๊ณผ ์ปจํ…์ŠคํŠธ ํฌํ•จ)
    CA-->>SUP: ์ฝ”๋“œ + tool call ๊ฒฐ๊ณผ
    SUP->>DOC: ๋ฌธ์„œํ™” ์œ„์ž„ (์ฝ”๋“œ + ์กฐ์‚ฌ ๊ฒฐ๊ณผ)
    DOC-->>UI: TEXT_MESSAGE ์ŠคํŠธ๋ฆผ
    Note over UI: ์—์ด์ „ํŠธ ์ „ํ™˜์€ ํˆฌ๋ช…<br/>๋Œ€ํ™”ยท์ƒํƒœ ์—ฐ์†์„ฑ ์œ ์ง€

ํ•ต์‹ฌ ์†์„ฑ:

  • ์ž‘์—…์„ ์ „๋ฌธ ์—์ด์ „ํŠธ๋กœ ์œ„์ž„ ๊ฐ€๋Šฅ (์—ญํ•  ๋ถ„๋ฆฌ)
  • ์ƒํƒœ์™€ ์ปจํ…์ŠคํŠธ๊ฐ€ ์—์ด์ „ํŠธ ๊ฐ„ ์ด์ „๋จ (handoff)
  • Orchestration ์ฃผ์ฒด๋Š” ํ”„๋กœํ† ์ฝœ ์™ธ๋ถ€์—์„œ ๊ฒฐ์ • (AG-UI๋Š” ๊ฒฐ๊ณผ ์ŠคํŠธ๋ฆผ๋งŒ ๊ทœ์ •)
  • Frontend๋Š” ์—์ด์ „ํŠธ ์ „ํ™˜ ์ค‘์—๋„ ์ผ๊ด€๋œ ๊ฒฝํ—˜ ์ œ๊ณต

5. Human-in-the-Loop

์‹คํ–‰ ์ค‘ ์‚ฌ์šฉ์ž ๊ฐœ์ž…(์Šน์ธยท์ˆ˜์ •ยท๊ฑฐ์ ˆ). ์ƒ์„ธ๋Š” Human-in-the-Loop ์ฐธ์กฐ.

6. Conversational Memory

๋Œ€ํ™” ์ด๋ ฅ์˜ ์ž๋™ ๋ˆ„์ ยท๋™๊ธฐํ™”. ์ƒ์„ธ๋Š” AG-UI Messages ์ฐธ์กฐ.

7. Metadata & Instrumentation

Agent๊ฐ€ ์ž์‹ ์˜ ๋‚ด๋ถ€ ์ฒ˜๋ฆฌ ๊ณผ์ •์— ๋Œ€ํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ emitํ•ด Frontend๊ฐ€ ํˆฌ๋ช…์„ฑ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

์ข…๋ฅ˜์šฉ๋„ํ‘œ์‹œ ์˜ˆ์‹œ
Reasoning steps์‚ฌ๊ณ  ํ๋ฆ„ ๋…ธ์ถœโ€Thinkingโ€ฆโ€ ํŒจ๋„
Performance metrics์‹คํ–‰ ์‹œ๊ฐ„/ํ† ํฐ ์‚ฌ์šฉ๋Ÿ‰๋””๋ฒ„๊ทธ ์˜ค๋ฒ„๋ ˆ์ด
Source citations์ฐธ์กฐ ๋ฌธํ—Œยท์ถœ์ฒ˜์ธ๋ผ์ธ ๊ฐ์ฃผ
Confidence scores์‘๋‹ต๋ณ„ ํ™•์‹ ๋„์ƒ‰์ƒ ๊ฐ•๋„
sequenceDiagram
    autonumber
    participant Agent
    participant UI

    Agent-->>UI: REASONING_START
    Agent-->>UI: REASONING_CONTENT (์‚ฌ๊ณ  ๊ณผ์ • ํ…์ŠคํŠธ)
    Agent-->>UI: REASONING_END
    Agent-->>UI: TEXT_MESSAGE_START
    Agent-->>UI: TEXT_MESSAGE_CONTENT (citation ๋ฉ”ํƒ€ ํฌํ•จ)
    Agent-->>UI: TEXT_MESSAGE_END
    Note over UI: ์‚ฌ๊ณ  ๊ณผ์ •๊ณผ ์ตœ์ข… ๋‹ต๋ณ€์„<br/>๋ถ„๋ฆฌํ•ด ๋ Œ๋”

Agent Configuration

Agent ์ธ์Šคํ„ด์Šค๋Š” AgentConfig๋ฅผ ํ†ตํ•ด ์ •์ฒด์„ฑยท์ดˆ๊ธฐ ์ƒํƒœ๋ฅผ ์ฃผ์ž…๋ฐ›๋Š”๋‹ค.

interface AgentConfig {
  agentId?: string             // ์—์ด์ „ํŠธ ์‹๋ณ„์ž
  description?: string         // ์‚ฌ๋žŒ์ด ์ฝ๋Š” ์„ค๋ช… (multi-agent ๋ผ์šฐํŒ…์— ํ™œ์šฉ)
  threadId?: string            // ๋Œ€ํ™” ์„ธ์…˜ ์‹๋ณ„์ž
  initialMessages?: Message[]  // ์ดˆ๊ธฐ ๋ฉ”์‹œ์ง€ (system prompt ๋“ฑ)
  initialState?: State         // ์ดˆ๊ธฐ ๊ณต์œ  ์ƒํƒœ
}
 
const agent = new HttpAgent({
  agentId: "my-agent-123",
  description: "A helpful assistant",
  threadId: "thread-456",
  initialMessages: [
    { id: "1", role: "system", content: "You are a helpful assistant." },
  ],
  initialState: { preferredLanguage: "English" },
})

์„ค์ • ํ•„๋“œ์˜ ์—ญํ•  ๋ถ„๋‹ด:

ํ•„๋“œ์—ญํ• ๋น„๊ณ 
agentId์—์ด์ „ํŠธ ์‹๋ณ„Multi-agent ๋ผ์šฐํŒ… ํ‚ค
description๋Šฅ๋ ฅยท์—ญํ•  ๋ฉ”ํƒ€์ •๋ณดHandoff ๊ฒฐ์ •์— ํ™œ์šฉ
threadId๋Œ€ํ™” ์„ธ์…˜ ์‹๋ณ„AbstractAgent์—์„œ ์ž๋™ ์ƒ์„ฑ๋„ ๊ฐ€๋Šฅ
initialMessagessystem promptยทfew-shotAG-UI Messages ๋ˆ„์ ์˜ ์‹œ๋“œ
initialState๊ณต์œ  ์ƒํƒœ ์‹œ๋“œAG-UI State Management ์ดˆ๊ธฐ๊ฐ’

agent.clone()์œผ๋กœ ์ƒํƒœ๋ฅผ ๋ณต์ œํ•œ ๋ถ„๊ธฐ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด, ์‹œ๋ฎฌ๋ ˆ์ด์…˜ยทwhat-if ๋ถ„์„์—๋„ ํ™œ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

์ฐธ๊ณ  ๋ฌธ์„œ