• AG-UI Tool์€ Agent๊ฐ€ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ณ  Frontend๊ฐ€ ์ •์˜ยท์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜ ์ธํ„ฐํŽ˜์ด์Šค
  • LLM ์ถ”๋ก  ๊ฒฐ๊ณผ๋ฅผ ์™ธ๋ถ€ ์•ก์…˜ยทUI ์กฐ์ž‘ยท์‚ฌ์šฉ์ž ํ™•์ธ์œผ๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ๋‹ค๋ฆฌ
  • JSON Schema๋กœ ๋ช…์„ธ๋˜๊ณ , ํ”„๋กœํ† ์ฝœ ์ด๋ฒคํŠธ๋กœ ์ŠคํŠธ๋ฆฌ๋ฐ๋˜๋Š” ํ‘œ์ค€ํ™”๋œ ํ˜ธ์ถœ ๋‹จ์œ„

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

  • LLM ์ถ”๋ก ๋งŒ์œผ๋กœ๋Š” ์™ธ๋ถ€ ์‹œ์Šคํ…œ ์กฐ์ž‘ยท์‚ฌ์šฉ์ž ์ž…๋ ฅ ์ˆ˜์ง‘ ๋ถˆ๊ฐ€
  • Backend tool ์ค‘์‹ฌ ์„ค๊ณ„๋Š” UI ์ƒํƒœยท์‚ฌ์šฉ์ž ๊ถŒํ•œ์„ ๋ฐ˜์˜ํ•˜๊ธฐ ์–ด๋ ค์›€
  • HITL(Human-in-the-Loop)์„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ‘œํ˜„ํ•  ์ผ๊ธ‰ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ํ•„์š”
  • ๋‹ค์–‘ํ•œ ๋ฐฑ์—”๋“œ(LangGraph/CrewAI/Mastraโ€ฆ) ๊ฐ„ tool call ํฌ๋งท ํ†ต์ผ ํ•„์š”

AS-IS

๊ธฐ์กด LLM tool calling์€ ๋ฐฑ์—”๋“œ๊ฐ€ tool์„ ์ •์˜ยท์‹คํ–‰ํ•ด UI/์‚ฌ์šฉ์ž ์ปจํ…์ŠคํŠธ์™€ ๋ถ„๋ฆฌ๋œ๋‹ค.

sequenceDiagram
    autonumber
    participant FE as Frontend
    participant BE as Backend(Agent)
    participant LLM
    participant Sys as External System
    BE->>LLM: tools ์ •์˜ (๋ฐฑ์—”๋“œ ์†Œ์œ )
    LLM->>BE: tool call
    BE->>Sys: tool ์‹คํ–‰
    Sys-->>BE: result
    BE-->>FE: ์ตœ์ข… ์‘๋‹ต๋งŒ ์ „๋‹ฌ

TO-BE

AG-UI๋Š” frontend tool๊ณผ backend tool์„ ํ˜ผ์žฌ์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ณ , ํ˜ธ์ถœ ๊ณผ์ •์ด ํ‘œ์ค€ ์ด๋ฒคํŠธ๋กœ ์ŠคํŠธ๋ฆฌ๋ฐ๋œ๋‹ค. Frontend tool์ด ์ถ”๊ฐ€๋œ ๊ฒƒ์ด์ง€ ๊ธฐ์กด backend tool์ด ์‚ฌ๋ผ์ง„ ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. ํ”„๋ก ํŠธ์—”๋“œ๋Š” AbstractAgent์˜ runAgent({ tools }) ์ง„์ž…์ ์„ ํ†ตํ•ด ๋งค ์‹คํ–‰๋งˆ๋‹ค tool ์…‹์„ ์ฃผ์ž…ํ•œ๋‹ค.

sequenceDiagram
    autonumber
    participant FE as Frontend
    participant BE as Backend(Agent)
    participant LLM
    participant Sys as External System
    FE->>BE: runAgent({ tools, messages, state })
    Note over BE: tools = frontend tools + backend tools (ํ˜ผ์žฌ ๊ฐ€๋Šฅ)
    BE->>LLM: tools ์ฃผ์ž…
    LLM-->>BE: TOOL_CALL_* ์ด๋ฒคํŠธ ๋ฐœ์ƒ
    alt Frontend Tool์ธ ๊ฒฝ์šฐ
        BE-->>FE: TOOL_CALL_START / ARGS(delta) / END ์ŠคํŠธ๋ฆฌ๋ฐ
        FE->>FE: tool ์‹คํ–‰ (UI ๋‹ค์ด์–ผ๋กœ๊ทธยทํŽ˜์ด์ง€ ์ด๋™ ๋“ฑ)
        FE->>BE: tool message (role: "tool")
    else Backend Tool์ธ ๊ฒฝ์šฐ
        BE->>Sys: tool ์‹คํ–‰ (DBยท์™ธ๋ถ€ API ๋“ฑ)
        Sys-->>BE: result
        BE-->>FE: TOOL_CALL_* ์ด๋ฒคํŠธ + ๊ฒฐ๊ณผ (๊ฐ€์‹œ์„ฑ ์ œ๊ณต)
    end
    BE->>LLM: ๊ฒฐ๊ณผ ํฌํ•จํ•˜์—ฌ ์‘๋‹ต ์ƒ์„ฑ

Tool ๊ตฌ์กฐ

name, description, parameters 3ํ•„๋“œ ๊ตฌ์„ฑ. parameters๋Š” JSON Schema๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ.

interface Tool {
  name: string
  description: string  // LLM์ด "์–ธ์ œ ์“ธ์ง€" ํŒ๋‹จ
  parameters: {
    type: "object",
    properties: { ... },
    required: string[]
  }
}

์ด ๊ตฌ์กฐ๋Š” OpenAI function calling, Anthropic tool use, MCP๊ฐ€ ๋ชจ๋‘ ์“ฐ๋Š” ๊ณต์šฉ ํ˜•์‹์ด๋‹ค. AG-UI๋Š” ์ด๋ฅผ ๊ทธ๋Œ€๋กœ ์ฐจ์šฉํ•ด LLM ํ˜ธํ™˜์„ฑ๊ณผ ์ƒํ˜ธ์šด์šฉ์„ฑ์„ ํ™•๋ณดํ•œ๋‹ค.

์—…๊ณ„ ํ‘œ์ค€๊ณผ AG-UI ๊ณ ์œ  ํ™•์žฅ์˜ ๊ด€๊ณ„

AG-UI Tool์€ ์ƒˆ๋กœ์šด ํ˜•์‹์„ ๋ฐœ๋ช…ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์—…๊ณ„ ํ‘œ์ค€์„ ์ฐจ์šฉํ•˜๋ฉด์„œ ๊ทธ ์œ„์— ๋‘ ๊ฐ€์ง€ ๊ณ ์œ  ํ™•์žฅ์„ ์–น์€ ๊ตฌ์กฐ๋‹ค. ์ด ๊ตฌ๋ถ„์„ ์žก๊ณ  ๊ฐ€๋ฉด ์ดํ›„ ๋‚ด์šฉ์ด ํ•œ ์ค„๋กœ ๊ฟฐ์–ด์ง„๋‹ค.

์ฐจ์šฉํ•œ ๋ถ€๋ถ„ (์—…๊ณ„ ํ‘œ์ค€)

  • Tool ์ •์˜ ๋ชจ์–‘ (name / description / parameters)
  • JSON Schema ๊ธฐ๋ฐ˜ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ช…์„ธ
  • Tool result ๋ฉ”์‹œ์ง€ ํ˜•์‹ ([[AG-UI Messages|role: "tool"]])

AG-UI๊ฐ€ ๋”ํ•œ ๋ถ€๋ถ„ (๊ณ ์œ  ํ™•์žฅ)

  1. ์†Œ์œ ๊ถŒ ๋ชจ๋ธ ํ™•์žฅ โ€” Tool์„ ์ •์˜ํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ๊ถŒํ•œ์ด backend ๋…์ ์—์„œ frontend๋„ ๊ฐ€๋Šฅํ•˜๋„๋ก ์ด๋™
  2. ํ˜ธ์ถœ ๊ณผ์ •์˜ ํ”„๋กœํ† ์ฝœํ™” โ€” Tool call์„ ํ‘œ์ค€ ์ด๋ฒคํŠธ(TOOL_CALL_START โ†’ TOOL_CALL_ARGS ร— N โ†’ TOOL_CALL_END)๋กœ ์ •๊ทœํ™”

โ€œFrontend toolโ€์ด๋ผ๋Š” ์ƒˆ ์ข…๋ฅ˜๊ฐ€ ์ถ”๊ฐ€๋œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, Tool์„ ๋ˆ„๊ฐ€ ์ •์˜ํ•˜๊ณ  ๋ˆ„๊ฐ€ ์‹คํ–‰ํ•˜๋Š”์ง€์˜ ๊ถŒํ•œ ์ž์ฒด๊ฐ€ ์œ ์—ฐํ•ด์ง„ ๊ฒƒ์œผ๋กœ ์ดํ•ดํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ๋‘ ํ™•์žฅ์ด ๊ฒฐํ•ฉ๋˜์–ด ํ›„์ˆ ํ•  HITL์˜ ์ผ๊ธ‰ํ™”๋กœ ์ด์–ด์ง„๋‹ค.

ํ™•์žฅ โ‘ : ์†Œ์œ ๊ถŒ ๋ชจ๋ธ โ€” Frontend๊ฐ€ ์ •์˜ยท์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค

Frontend-defined Tools

Tool ์ •์˜ ์†Œ์œ ๊ถŒ์ด frontend์— ์žˆ๋‹ค. runAgent({ tools })๋กœ ๋งค ์‹คํ–‰๋งˆ๋‹ค ๋‹ค๋ฅธ tool ์…‹์„ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ์–ด, ๊ฐ™์€ agent๋ผ๋„ ํ™”๋ฉดยท์‚ฌ์šฉ์ž ๊ถŒํ•œยท์•ฑ ์ƒํƒœ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋Šฅ๋ ฅ์„ ๊ฐ–๋Š”๋‹ค.

Frontend-executed Tools

์ •์˜๊ฐ€ frontend๋กœ ์ด๋™ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, ์‹คํ–‰ ์œ„์น˜๋„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ frontend๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง„๋‹ค. ๋‹ค์ด์–ผ๋กœ๊ทธ ํ‘œ์‹œยทํŽ˜์ด์ง€ ์ด๋™ยทlocalStorage ์ ‘๊ทผ ๊ฐ™์€ UI ์•ก์…˜์ด ๊ทธ ์ž์ฒด๋กœ tool์ด ๋˜๋ฉฐ, โ€œ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฌป๊ธฐโ€๊ฐ€ ๋ณ„๋„ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ์—†์ด ์ผ๋ฐ˜ tool ํ˜ธ์ถœ๊ณผ ๋™์ผํ•˜๊ฒŒ ์ฒ˜๋ฆฌ๋œ๋‹ค.

Frontend/Backend Tool ํ˜ผ์žฌ

ํ•œ agent๊ฐ€ ๋‘ ์ข…๋ฅ˜๋ฅผ ๋™์‹œ์— ๋ณด์œ ํ•  ์ˆ˜ ์žˆ๋‹ค. Agent๋Š” ๋ชจ๋‘ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ํ˜ธ์ถœํ•˜์ง€๋งŒ, ์ฒ˜๋ฆฌ ์ฃผ์ฒด๋Š” tool์ด ์ •์˜๋œ ์œ„์น˜๊ฐ€ ๊ฒฐ์ •ํ•œ๋‹ค. ๋ณด์•ˆ์ด ํ•„์š”ํ•œ ์ž‘์—…์€ backend, ์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ์ด ํ•„์š”ํ•œ ์ž‘์—…์€ frontend๋กœ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๊ฐˆ๋ฆฐ๋‹ค.

ํ™•์žฅ โ‘ก: Tool Call Lifecycle ํ‘œ์ค€ํ™”

OpenAIยทAnthropic๋„ tool call์„ ์ŠคํŠธ๋ฆฌ๋ฐํ•˜์ง€๋งŒ ๊ฐ์ž ๋‹ค๋ฅธ SSE ํฌ๋งท์„ ์‚ฌ์šฉํ•œ๋‹ค. AG-UI๋Š” ์ด๋ฅผ ๋ฐฑ์—”๋“œยทํ”„๋ ˆ์ž„์›Œํฌ ๋ฌด๊ด€ํ•œ ํ‘œ์ค€ ์ด๋ฒคํŠธ 3๋‹จ๊ณ„๋กœ ์ •๊ทœํ™”ํ•œ๋‹ค.

sequenceDiagram
    autonumber
    participant Agent
    participant FE as Frontend
    Agent-->>FE: TOOL_CALL_START { toolCallId, toolCallName }
    Agent-->>FE: TOOL_CALL_ARGS { delta: '{"act' }
    Agent-->>FE: TOOL_CALL_ARGS { delta: 'ion":"Depl' }
    Agent-->>FE: TOOL_CALL_ARGS { delta: 'oy"}' }
    Agent-->>FE: TOOL_CALL_END { toolCallId }
    Note over FE: delta ๋ˆ„์  โ†’ ์™„์ „ํ•œ JSON ๋ณต์›
    FE->>FE: tool ์‹คํ–‰
    FE->>Agent: tool message { role: "tool", toolCallId, content }

delta๋Š” ์ธ์ž JSON์˜ partial ๋ฌธ์ž์—ด์ด๋ฉฐ, frontend๊ฐ€ ๋ˆ„์ ํ•ด ์™„์ „ํ•œ ์ธ์ž๋ฅผ ๋ณต์›ํ•œ๋‹ค. toolCallId๋กœ ํ˜ธ์ถœ๊ณผ ๊ฒฐ๊ณผ๋ฅผ ๋งค์นญํ•˜๋ฏ€๋กœ, ์—ฌ๋Ÿฌ tool์ด ๋ณ‘๋ ฌ๋กœ ํ˜ธ์ถœ๋˜์–ด๋„ ์‘๋‹ต ๋งคํ•‘์ด ์–ด๊ธ‹๋‚˜์ง€ ์•Š๋Š”๋‹ค.

Tool Result ๋ฉ”์‹œ์ง€

Tool ์‹คํ–‰ ๊ฒฐ๊ณผ๋Š” ๋Œ€ํ™” ํžˆ์Šคํ† ๋ฆฌ์— role: "tool" ๋ฉ”์‹œ์ง€๋กœ ์ถ”๊ฐ€๋œ๋‹ค. ์ด ํ˜•์‹์€ OpenAI ์ปจ๋ฒค์…˜์„ ๊ทธ๋Œ€๋กœ ์ฐจ์šฉํ•œ ํ‘œ์ค€ ๋ถ€๋ถ„์ด๋‹ค.

{
  id: "result-789",
  role: "tool",
  content: "approved",      // ๊ฒฐ๊ณผ๋Š” ํ•ญ์ƒ string
  toolCallId: "tool-123"    // ์›๋ž˜ ํ˜ธ์ถœ๊ณผ ๋งค์นญ
}

์ด ๋ฉ”์‹œ์ง€๊ฐ€ ๋‹ค์Œ LLM ํ˜ธ์ถœ ์‹œ ์ปจํ…์ŠคํŠธ์— ํฌํ•จ๋˜์–ด, agent๊ฐ€ ๊ฒฐ๊ณผ๋ฅผ ์ฐธ์กฐํ•˜๋ฉฐ ์‘๋‹ต์„ ์ด์–ด๊ฐ„๋‹ค.

๋‘ ํ™•์žฅ์˜ ๊ฒฐ๊ณผ: HITL์ด ์ผ๊ธ‰ ์‹œ๋ฏผ์ด ๋œ๋‹ค

์†Œ์œ ๊ถŒ ๋ชจ๋ธ ํ™•์žฅ๊ณผ lifecycle ํ‘œ์ค€ํ™”๊ฐ€ ๊ฒฐํ•ฉ๋˜๋ฉด, HITL(Human-in-the-Loop)์ด ํ”„๋กœํ† ์ฝœ์˜ ์ผ๊ธ‰ ์‹œ๋ฏผ(first-class citizen) ์œผ๋กœ ํ‘œํ˜„๋œ๋‹ค.

์ผ๊ธ‰ ์‹œ๋ฏผ์ด๋ž€? ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ์ด๋ก  ์šฉ์–ด๋กœ, ์–ด๋–ค ์š”์†Œ๊ฐ€ ๋‹ค๋ฅธ ์š”์†Œ๋“ค๊ณผ ๋™๋“ฑํ•œ ๊ถŒ๋ฆฌยท์ทจ๊ธ‰์„ ๋ฐ›์„ ๋•Œ โ€œ์ผ๊ธ‰(first-class)โ€œ์ด๋ผ๊ณ  ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด JavaScript์—์„œ ํ•จ์ˆ˜๋Š” ๋ณ€์ˆ˜์— ๋‹ด๊ณ  ์ธ์ž๋กœ ์ „๋‹ฌํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์–ด ์ผ๊ธ‰ ์‹œ๋ฏผ์ด๋‹ค. AG-UI์—์„œ โ€œHITL์ด ์ผ๊ธ‰ ์‹œ๋ฏผโ€์ด๋ผ๋Š” ๋ง์€, ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฌป๋Š” ์ž‘์—…์ด ๋ณ„๋„์˜ ์šฐํšŒ๋‚˜ ํ™•์žฅ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ์—†์ด ์ผ๋ฐ˜ tool ํ˜ธ์ถœ๊ณผ ์™„์ „ํžˆ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค.

๋‹ค๋ฅธ ํ”„๋กœํ† ์ฝœ์—์„œ๋Š” โ€œ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฌป๊ธฐโ€๋ฅผ ์œ„ํ•ด ๋ณ„๋„ ์„ค๊ณ„๊ฐ€ ํ•„์š”ํ•˜์ง€๋งŒ, AG-UI์—์„œ๋Š” frontend tool ํ•˜๋‚˜ ์ •์˜ํ•˜๋ฉด ๋๋‚œ๋‹ค. ํ๋ฆ„์€ ๋‹จ์ˆœํ•˜๋‹ค:

1. Agent: ์ค‘์š” ๊ฒฐ์ • ์ง๋ฉด
2. Agent โ†’ confirmAction tool ํ˜ธ์ถœ (TOOL_CALL_* ์ด๋ฒคํŠธ๋กœ ์ŠคํŠธ๋ฆฌ๋ฐ)
3. Frontend: ๋‹ค์ด์–ผ๋กœ๊ทธ ํ‘œ์‹œ (tool ์‹คํ–‰)
4. User: ์Šน์ธ/๊ฑฐ๋ถ€
5. Frontend โ†’ Agent: tool result ์ „๋‹ฌ
6. Agent: ์‚ฌ์šฉ์ž ์˜์‚ฌ ๋ฐ˜์˜ํ•˜์—ฌ ์‘๋‹ต ์ด์–ด๊ฐ

ํ™œ์šฉ ์‚ฌ๋ก€:

  • Approval workflows: AI ์ œ์•ˆ โ†’ ์‚ฌ๋žŒ ์Šน์ธ
  • Data verification: AI ์ƒ์„ฑ ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ
  • Collaborative decision-making: AIยท์‚ฌ๋žŒ ํ˜‘์—… ์˜์‚ฌ๊ฒฐ์ •
  • Supervised learning: ํ”ผ๋“œ๋ฐฑ ์ˆ˜์ง‘

๋ณต์žกํ•œ ๊ตฌ์กฐํ™” ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ๋žŒ์ด ํŽธ์ง‘ํ•˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค๋ผ๋ฉด, Tool๋งŒ์œผ๋กœ๋Š” ๋ถ€์กฑํ•˜๊ณ  AG-UI State Management์˜ ์–‘๋ฐฉํ–ฅ state ์ฑ„๋„๊ณผ ๊ฒฐํ•ฉํ•ด ์‚ฌ์šฉํ•œ๋‹ค. Tool์€ โ€œ๊ฒฐ์ • ํŠธ๋ฆฌ๊ฑฐโ€, State๋Š” โ€œ๊ณต๋™ ํŽธ์ง‘ ๋ฐ์ดํ„ฐโ€๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๋ณด์™„ ๊ด€๊ณ„๋‹ค.

์ผ๋ฐ˜ AI Tool Calling๊ณผ์˜ ์ฐจ์ด ์š”์•ฝ

์ง€๊ธˆ๊นŒ์ง€์˜ ๋‚ด์šฉ์„ ํ•œ ํ‘œ๋กœ ์ •๋ฆฌํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

ํ•ญ๋ชฉ์ผ๋ฐ˜ (OpenAI/Anthropic)AG-UI
Tool ์ •์˜ ๋ชจ์–‘JSON SchemaJSON Schema (๋™์ผ)
Tool result ํ˜•์‹role: "tool" ๋ฉ”์‹œ์ง€role: "tool" ๋ฉ”์‹œ์ง€ (๋™์ผ)
Tool ์ •์˜ ์œ„์น˜BackendFrontend ๋˜๋Š” Backend
Tool ์‹คํ–‰ ์œ„์น˜BackendFrontend ๋˜๋Š” Backend
์ŠคํŠธ๋ฆฌ๋ฐ ํฌ๋งท๋ฒค๋”๋ณ„ SSEํ‘œ์ค€ TOOL_CALL_ ์ด๋ฒคํŠธ*
๋ฐฑ์—”๋“œ ํ†ต์ผ์„ฑ๋ฒค๋” ์ข…์†ํ”„๋ ˆ์ž„์›Œํฌ ๋ฌด๊ด€
HITL ํ‘œํ˜„๋ณ„๋„ ์„ค๊ณ„ ํ•„์š”์ผ๊ธ‰ ์‹œ๋ฏผ

์œ„์ชฝ ๋‘ ํ–‰์ด โ€œ์ฐจ์šฉํ•œ ํ‘œ์ค€โ€์ด๊ณ , ์•„๋ž˜์ชฝ์ด โ€œAG-UI ๊ณ ์œ  ํ™•์žฅโ€์— ํ•ด๋‹นํ•œ๋‹ค.

์ž์ฃผ ํ—ท๊ฐˆ๋ฆฌ๋Š” ํฌ์ธํŠธ

  • JSON Schema๋Š” AG-UI๊ฐ€ ๋งŒ๋“  ๊ฒŒ ์•„๋‹ˆ๋ผ ์ฐจ์šฉํ•œ ์—…๊ณ„ ํ‘œ์ค€์ด๋‹ค
  • Tool result content๋Š” ํ•ญ์ƒ string โ€” ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ์ง๋ ฌํ™”๋œ ๋ฌธ์ž์—ด๋กœ ์ „๋‹ฌ
  • parentMessageId๋Š” optional, tool call์ด ์–ด๋–ค assistant ๋ฉ”์‹œ์ง€์—์„œ ์‹œ์ž‘๋๋Š”์ง€ ์ฐธ์กฐ
  • โ€œFrontend toolโ€์ด๋ผ๋Š” ๋ณ„๋„ ์ข…๋ฅ˜๊ฐ€ ์žˆ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, Tool์˜ ์ •์˜ยท์‹คํ–‰ ๊ถŒํ•œ ์ž์ฒด๊ฐ€ ์œ ์—ฐํ•ด์ง„ ๊ฒƒ์ด๋‹ค
  • FrontendยทBackend tool ๊ตฌ๋ถ„์€ ์ •์˜ ์‹œ์ ์ด ์•„๋‹Œ ์‹คํ–‰ ์œ„์น˜ ๊ธฐ์ค€์ด๋‹ค

๊ด€๋ จ ๊ฐœ๋…

  • AG-UI Event โ€” TOOL_CALL_* ์ด๋ฒคํŠธ์˜ ์ „์ฒด ์นดํƒˆ๋กœ๊ทธ์™€ lifecycle ํŒจํ„ด
  • AG-UI Messages โ€” role: "tool" ๋ฉ”์‹œ์ง€์˜ tagged-union ๊ตฌ์กฐ์™€ ๋ˆ„์  ๋ฐฉ์‹
  • AG-UI State Management โ€” Tool๊ณผ ํ•จ๊ป˜ HITL ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์–‘๋ฐฉํ–ฅ state ์ฑ„๋„
  • AbstractAgent โ€” runAgent({ tools, ... }) ์ง„์ž…์ ๊ณผ RunAgentInput ์ž๋™ ์กฐ๋ฆฝ
  • delta โ€” TOOL_CALL_ARGS.delta ๋ˆ„์  ๋ฐฉ์‹์˜ ์ผ๋ฐ˜ ๊ฐœ๋…
  • CopilotKit โ€” useCopilotAction์œผ๋กœ Frontend tool์„ React ์ปดํฌ๋„ŒํŠธ์™€ ํ•จ๊ป˜ ์ •์˜
  • MCP Server โ€” ๋™์ผํ•œ JSON Schema ๊ธฐ๋ฐ˜์ด์ง€๋งŒ Agent โ†” ์™ธ๋ถ€ ๋„๊ตฌ ์˜์—ญ์— ์ง‘์ค‘
  • Human-in-the-Loop โ€” Frontend tool์ด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ‘œํ˜„ํ•˜๋Š” ํ˜‘์—… ํŒจํ„ด

์ฐธ๊ณ  ๋ฌธ์„œ