• CopilotKit์€ ํ’€์Šคํƒ ์—์ด์ „ํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•œ React ๊ธฐ๋ฐ˜ ํ”„๋ก ํŠธ์—”๋“œ SDK
  • AG-UI ํ”„๋กœํ† ์ฝœ์˜ ์ฐฝ์‹œ์ž์ด์ž 1st Party ํด๋ผ์ด์–ธํŠธ โ€” AG-UI๋ฅผ ์ง์ ‘ ๋งŒ๋“  ํšŒ์‚ฌ
  • Chat UI, Generative UI, Shared State, HITL ์›Œํฌํ”Œ๋กœ๋ฅผ React ํ›…/์ปดํฌ๋„ŒํŠธ๋กœ ์ถ”์ƒํ™”ํ•˜์—ฌ ์ œ๊ณต
  • LangGraph, CrewAI, Google ADK, AWS Strands ๋“ฑ ๋ชจ๋“  AG-UI ํ˜ธํ™˜ ๋ฐฑ์—”๋“œ์™€ ์—ฐ๊ฒฐ ๊ฐ€๋Šฅํ•œ MIT ์˜คํ”ˆ์†Œ์Šค

CopilotKit์ด ํ•ด๊ฒฐํ•˜๋ ค๋Š” ๋ฌธ์ œ

์—์ด์ „ํŠธ ๋ฐฑ์—”๋“œ๋Š” ์žˆ๋Š”๋ฐ ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ์ด๋ฅผ โ€œ์ œ๋Œ€๋กœโ€ ๋ณด์—ฌ์ฃผ๊ณ  ์ œ์–ดํ•˜๋Š” ๊ฒƒ์€ ์—ฌ์ „ํžˆ ๋ณต์žกํ•˜๋‹ค:

  • ์ŠคํŠธ๋ฆฌ๋ฐ ์ฑ„ํŒ… UI, ๋„๊ตฌ ํ˜ธ์ถœ ์‹œ๊ฐํ™”, ์ƒํƒœ ๋™๊ธฐํ™”๋ฅผ ๋งค๋ฒˆ ์ง์ ‘ ๊ตฌํ˜„ํ•ด์•ผ ํ•จ
  • ์—์ด์ „ํŠธ๊ฐ€ ์ƒ์„ฑํ•œ ๊ฒฐ๊ณผ๋ฅผ React ์ปดํฌ๋„ŒํŠธ๋กœ ๋ Œ๋”๋งํ•˜๋Š” ํ‘œ์ค€ ํŒจํ„ด์ด ์—†์Œ
  • ์—์ด์ „ํŠธ ์‹คํ–‰ ์ค‘ ์‚ฌ์šฉ์ž ์Šน์ธ/ํŽธ์ง‘์ด ํ•„์š”ํ•œ HITL ์›Œํฌํ”Œ๋กœ๊ฐ€ ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ๊นŒ๋‹ค๋กœ์›€
  • ๋ฐฑ์—”๋“œ ํ”„๋ ˆ์ž„์›Œํฌ๋งˆ๋‹ค ์—ฐ๊ฒฐ ๋ฐฉ์‹์ด ๋‹ฌ๋ผ ํ”„๋ก ํŠธ์—”๋“œ ์ฝ”๋“œ๋ฅผ ์žฌ์ž‘์„ฑํ•ด์•ผ ํ•จ

CopilotKit์€ ์ด ๋ฌธ์ œ๋ฅผ AG-UI ํ”„๋กœํ† ์ฝœ ์œ„์— React SDK๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐํ•œ๋‹ค.

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

  • AG-UI๊ฐ€ ํ”„๋กœํ† ์ฝœ(์ด๋ฒคํŠธ ํ‘œ์ค€)์ด๋ผ๋ฉด, CopilotKit์€ ๊ทธ ํ”„๋กœํ† ์ฝœ ์œ„์— ๊ตฌ์ถ•๋œ ๊ตฌํ˜„์ฒด(React SDK + Runtime)
  • AG-UI๋งŒ์œผ๋กœ๋Š” ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ ๋ฐ‘๋ฐ”๋‹ฅ๋ถ€ํ„ฐ ๋งŒ๋“ค์–ด์•ผ ํ•˜์ง€๋งŒ, CopilotKit์€ ์ฆ‰์‹œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ UI ์ปดํฌ๋„ŒํŠธ์™€ ํ›…์„ ์ œ๊ณต
  • ํ”„๋กœํ† ์ฝœ๊ณผ ๊ตฌํ˜„์ฒด์˜ ๊ด€๊ณ„๋ฅผ ์ดํ•ดํ•ด์•ผ ์—์ด์ „ํŠธ ์•ฑ ์„ค๊ณ„ ์‹œ ์˜ฌ๋ฐ”๋ฅธ ๋ ˆ์ด์–ด๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Œ

AS-IS: AG-UI ํ”„๋กœํ† ์ฝœ๋งŒ์œผ๋กœ ์ง์ ‘ ๊ตฌํ˜„

sequenceDiagram
    autonumber
    participant Dev as ๊ฐœ๋ฐœ์ž
    participant FE as React Frontend
    participant AGUI as AG-UI Client
    participant Agent as AI Agent

    Dev->>FE: ์ฑ„ํŒ… UI ์ง์ ‘ ๊ตฌํ˜„
    Dev->>FE: ์ŠคํŠธ๋ฆฌ๋ฐ ํŒŒ์‹ฑ ๋กœ์ง ๊ตฌํ˜„
    Dev->>FE: ์ƒํƒœ ๋™๊ธฐํ™” ๋กœ์ง ๊ตฌํ˜„
    Dev->>FE: ๋„๊ตฌ ํ˜ธ์ถœ ๋ Œ๋”๋ง ๊ตฌํ˜„
    Dev->>FE: HITL ์Šน์ธ UI ๊ตฌํ˜„
    FE->>AGUI: HttpAgent ์ง์ ‘ ์—ฐ๊ฒฐ
    AGUI->>Agent: runAgent(input)
    Agent-->>AGUI: BaseEvent stream
    AGUI-->>FE: ์ด๋ฒคํŠธ ์ˆ˜๋™ ์ฒ˜๋ฆฌ
    Note over Dev,FE: ๋ชจ๋“  UI/๋กœ์ง์„<br/>๋ฐ‘๋ฐ”๋‹ฅ๋ถ€ํ„ฐ ๊ตฌํ˜„

TO-BE: CopilotKit SDK ์‚ฌ์šฉ

sequenceDiagram
    autonumber
    participant Dev as ๊ฐœ๋ฐœ์ž
    participant CK as CopilotKit
    participant RT as Copilot Runtime
    participant Agent as AI Agent

    Dev->>CK: CopilotSidebar + useAgent
    Note over Dev,CK: 3์ค„๋กœ ์ฑ„ํŒ… UI ์™„์„ฑ
    CK->>RT: AG-UI ์ด๋ฒคํŠธ (์ž๋™)
    RT->>Agent: ๋ผ์šฐํŒ… + ์ธ์ฆ + ๋ฏธ๋“ค์›จ์–ด
    Agent-->>RT: ๋„ค์ดํ‹ฐ๋ธŒ ์ด๋ฒคํŠธ
    RT-->>CK: AG-UI ํ‘œ์ค€ ์ด๋ฒคํŠธ
    CK-->>CK: ์ž๋™ ์ŠคํŠธ๋ฆฌ๋ฐ ๋ Œ๋”๋ง
    CK-->>CK: Generative UI ์ž๋™ ๋งˆ์šดํŠธ
    CK-->>CK: Shared State ๋™๊ธฐํ™”
    Note over Dev,CK: UI/์ƒํƒœ/์ธ์ฆ์„<br/>SDK๊ฐ€ ์ฒ˜๋ฆฌ

์•„ํ‚คํ…์ฒ˜

graph TB
    subgraph "Frontend - React"
        A["CopilotKit Provider"]
        B["CopilotSidebar / CopilotPopup"]
        C["useAgent / useCoAgent"]
        D["useCopilotAction (Frontend Tools)"]
        E["Generative UI Components"]
    end

    subgraph "Backend"
        F["Copilot Runtime"]
        G["AG-UI Middleware"]
        H["Agent Router"]
    end

    subgraph "Agent Backends"
        I["LangGraph"]
        J["CrewAI"]
        K["Google ADK"]
        L["Built-in Agent"]
    end

    A --> B
    A --> C
    A --> D
    A --> E
    B --> F
    C --> F
    F --> G
    G --> H
    H --> I
    H --> J
    H --> K
    H --> L

ํ•ต์‹ฌ ๊ตฌ์„ฑ ์š”์†Œ

๋ ˆ์ด์–ด๊ตฌ์„ฑ ์š”์†Œ์—ญํ• 
Provider<CopilotKit>์ตœ์ƒ์œ„ ์ปจํ…์ŠคํŠธ. runtimeUrl๋กœ Runtime ์—ฐ๊ฒฐ
Prebuilt UI<CopilotSidebar>, <CopilotPopup>์ฆ‰์‹œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ฑ„ํŒ… ์ปดํฌ๋„ŒํŠธ
HooksuseAgent, useCoAgent์—์ด์ „ํŠธ ์ƒํƒœ ์ ‘๊ทผยท์ œ์–ด. AG-UI ์œ„์— ์ง์ ‘ ์œ„์น˜
Frontend ToolsuseCopilotAction์—์ด์ „ํŠธ โ†’ ํ”„๋ก ํŠธ์—”๋“œ ์•ก์…˜ ํ•ธ๋“œ์˜คํ”„
Generative UITool Rendering, State Rendering์—์ด์ „ํŠธ ์ถœ๋ ฅ์„ React ์ปดํฌ๋„ŒํŠธ๋กœ ๋ Œ๋”๋ง
RuntimeCopilotRuntime์„œ๋ฒ„์‚ฌ์ด๋“œ ์—”๋“œํฌ์ธํŠธ. ์ธ์ฆ, ๋ผ์šฐํŒ…, ๋ฏธ๋“ค์›จ์–ด

์ฃผ์š” ๊ธฐ๋Šฅ

1. Chat UI (ํ”„๋ฆฌ๋นŒํŠธ ์ปดํฌ๋„ŒํŠธ)

import { CopilotKit } from "@copilotkit/react-core";
import { CopilotSidebar } from "@copilotkit/react-core/v2";
import "@copilotkit/react-ui/v2/styles.css";
 
export default function App() {
  return (
    <CopilotKit runtimeUrl="/api/copilotkit">
      <YourApp />
      <CopilotSidebar />
    </CopilotKit>
  );
}

์ŠคํŠธ๋ฆฌ๋ฐ, ๋„๊ตฌ ํ˜ธ์ถœ, ์—์ด์ „ํŠธ ์‘๋‹ต์„ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ์™„์„ฑํ˜• ์ฑ„ํŒ… UI.

1-1. Headless UI ๋ชจ๋“œ

ํ”„๋ฆฌ๋นŒํŠธ ์ปดํฌ๋„ŒํŠธ(<CopilotSidebar>)๊ฐ€ ์ œ๊ณตํ•˜๋Š” UI ๋Œ€์‹  ๋กœ์ง(์—์ด์ „ํŠธ ํ†ต์‹ , ๋ฉ”์‹œ์ง€ ๊ด€๋ฆฌ, ์ŠคํŠธ๋ฆฌ๋ฐ)๋งŒ ํ›…์œผ๋กœ ๋ฐ›์•„์„œ UI๋ฅผ 100% ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ๋ ˆ์ด์•„์›ƒ์ด ์™„์ „ํžˆ ๋‹ค๋ฅด๊ฑฐ๋‚˜, ๊ธฐ์กด UI์— ์ฑ„ํŒ…์„ ์ž„๋ฒ ๋“œํ•˜๊ฑฐ๋‚˜, ์ฑ„ํŒ…์ด ์•„๋‹Œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

import { useAgent, useCopilotKit } from "@copilotkit/react-core/v2";
 
export function CustomChat() {
  const { agent } = useAgent();
  const { copilotkit } = useCopilotKit();
 
  const sendMessage = async (content: string) => {
    agent.addMessage({ id: crypto.randomUUID(), role: "user", content });
    await copilotkit.runAgent({ agent });
  };
 
  return (
    <MyCustomLayout>
      {agent.messages.map(msg => (
        <MyBubble key={msg.id}>{msg.content}</MyBubble>
      ))}
      <MyInput onSubmit={sendMessage} />
    </MyCustomLayout>
  );
}
๋ฐฉ์‹CopilotKit์ด ์ œ๊ณต๊ฐœ๋ฐœ์ž๊ฐ€ ๊ตฌํ˜„
Prebuilt (<CopilotSidebar>)๋กœ์ง + ์™„์„ฑ๋œ UI์—†์Œ
Headless (useAgent ํ›…)๋กœ์ง๋งŒ (๋ฉ”์‹œ์ง€, ์ŠคํŠธ๋ฆฌ๋ฐ, ์—์ด์ „ํŠธ ํ†ต์‹ )UI ์ „์ฒด

2. useAgent ํ›…

const { agent } = useAgent({ agentId: "my_agent" });
 
// ์—์ด์ „ํŠธ ์ƒํƒœ ์ฝ๊ธฐ/์“ฐ๊ธฐ
return (
  <div>
    <h1>{agent.state.city}</h1>
    <button onClick={() => agent.setState({ city: "NYC" })}>
      Set City
    </button>
  </div>
);

useCoAgent์˜ ์ƒ์œ„ ํ˜ธํ™˜. AG-UI ์œ„์— ์ง์ ‘ ์œ„์น˜ํ•˜์—ฌ ์—์ด์ „ํŠธ ์—ฐ๊ฒฐ์„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ์ œ์–ด.

3. Generative UI

์—์ด์ „ํŠธ๊ฐ€ ๋Œ€ํ™” ๋งฅ๋ฝ์— ๋”ฐ๋ผ ์–ด๋–ค React ์ปดํฌ๋„ŒํŠธ๋ฅผ ์–ธ์ œ ๋ณด์—ฌ์ค„์ง€ ๋™์ ์œผ๋กœ ๊ฒฐ์ •ํ•˜๋Š” ํŒจํ„ด์ด๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ โ€œ๋„๊ตฌ(tool)โ€œ๋กœ ๋“ฑ๋ก๋งŒ ํ•ด๋‘๊ณ , ์—์ด์ „ํŠธ๊ฐ€ ํ•„์š”ํ•  ๋•Œ ํ˜ธ์ถœํ•˜์—ฌ ์ฑ„ํŒ…์— ๋ Œ๋”๋งํ•œ๋‹ค.

// ๊ฐœ๋ฐœ์ž: WeatherCard ์ปดํฌ๋„ŒํŠธ๋ฅผ "๋„๊ตฌ"๋กœ ๋“ฑ๋ก๋งŒ ํ•ด๋‘ 
useComponent({
  name: "showWeatherCard",
  description: "๋‚ ์”จ ์นด๋“œ๋ฅผ ์ฑ„ํŒ…์— ํ‘œ์‹œ",
  parameters: z.object({ city: z.string() }),
  render: WeatherCard,
});
// โ†’ ์—์ด์ „ํŠธ๊ฐ€ "์„œ์šธ ๋‚ ์”จ๋ฅผ ๋ณด์—ฌ์ค˜์•ผ๊ฒ ๋‹ค"๊ณ  ํŒ๋‹จํ•˜๋ฉด
//   showWeatherCard({ city: "์„œ์šธ" })๋ฅผ ํ˜ธ์ถœ
//   โ†’ WeatherCard๊ฐ€ ์ฑ„ํŒ…์— ๋ Œ๋”๋ง๋จ

Headless UI์™€ Generative UI ๋น„๊ต โ€” โ€œ๋ˆ„๊ฐ€ UI๋ฅผ ๊ฒฐ์ •ํ•˜๋Š”๊ฐ€โ€

๋‘ ๋ฐฉ์‹ ๋ชจ๋‘ ๊ฐœ๋ฐœ์ž๊ฐ€ React ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค. ์ฐจ์ด๋Š” **โ€œ๊ทธ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚˜๋Š” ์‹œ์ ๊ณผ ์กฐ๊ฑด์„ ๋ˆ„๊ฐ€ ๊ฒฐ์ •ํ•˜๋А๋ƒโ€**์ด๋‹ค:

Headless UIGenerative UI
UI๋ฅผ ๋ˆ„๊ฐ€ ๊ฒฐ์ •?๊ฐœ๋ฐœ์ž (์ฝ”๋“œ์— ํ•˜๋“œ์ฝ”๋”ฉ)AI ์—์ด์ „ํŠธ (๋Œ€ํ™” ๋งฅ๋ฝ์— ๋”ฐ๋ผ ๋™์ ์œผ๋กœ)
CopilotKit์ด ์ฃผ๋Š” ๊ฒƒ๋กœ์ง๋งŒ (ํ›…)์ปดํฌ๋„ŒํŠธ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋„๊ตฌ(tool) ์‹œ์Šคํ…œ
์‚ฌ์šฉ ์‹œ์ ์™„์ „ํžˆ ์ปค์Šคํ…€ํ•œ ๋ ˆ์ด์•„์›ƒ์ด ํ•„์š”ํ•  ๋•Œ์—์ด์ „ํŠธ๊ฐ€ ์ƒํ™ฉ์— ๋งž๋Š” UI๋ฅผ ๋™์  ์ƒ์„ฑํ•  ๋•Œ
โ† ๊ฐœ๋ฐœ์ž ์ œ์–ด๊ถŒ ๋†’์Œ                        AI ์ œ์–ด๊ถŒ ๋†’์Œ โ†’

  Headless UI          Prebuilt UI          Generative UI
  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
  ๊ฐœ๋ฐœ์ž๊ฐ€ UI ์ „์ฒด      CopilotKit์ด          ์—์ด์ „ํŠธ๊ฐ€ ์–ด๋–ค
  ์ง์ ‘ ๊ตฌํ˜„             ์™„์„ฑ๋œ UI ์ œ๊ณต         ์ปดํฌ๋„ŒํŠธ๋ฅผ ์–ธ์ œ
                                             ๋ณด์—ฌ์ค„์ง€ ๊ฒฐ์ •

ํ›… ์˜์กด ๊ด€๊ณ„ (์ฝ”๋“œ ๋ ˆ๋ฒจ ๊ฒ€์ฆ)

์†Œ์Šค ์ฝ”๋“œ ๋ถ„์„์œผ๋กœ ํ™•์ธํ•œ ์‹ค์ œ ๊ด€๊ณ„:

useComponent (v2)                          โ† UI ๋ Œ๋”๋ง ํŠนํ™” (handler ์—†์Œ)
    โ”‚  ๋‚ด๋ถ€์—์„œ useFrontendTool ํ˜ธ์ถœ
    โ†“
useFrontendTool (v2)                       โ† ๊ธฐ๋ฐ˜ ๊ตฌํ˜„ (handler + render)
    โ””โ”€โ†’ copilotkit.addTool() ์ง์ ‘ ํ˜ธ์ถœ

useCopilotAction (v1, legacy)              โ† ํ•˜์œ„ ํ˜ธํ™˜์šฉ
    โ””โ”€โ†’ useFrontendTool (v1 ๋ธŒ๋ฆฟ์ง€)
            โ””โ”€โ†’ useFrontendTool (v2)       โ† ๋™์ผํ•œ ๊ธฐ๋ฐ˜ ๊ตฌํ˜„์œผ๋กœ ์œ„์ž„
  • useComponent๋Š” useFrontendTool์˜ ๊ธฐ๋Šฅ์„ ์ค„์ธ ํŽธ์˜ ๋ž˜ํผ โ€” handler๋ฅผ ๋นผ๊ณ  render๋งŒ ๋‚จ๊น€
  • useFrontendTool (v2)๊ฐ€ ๋…๋ฆฝ์ ์ธ ๊ธฐ๋ฐ˜ ๊ตฌํ˜„ โ€” copilotkit.addTool()์„ ์ง์ ‘ ํ˜ธ์ถœ
  • useCopilotAction (v1)์€ deprecated๋Š” ์•„๋‹ˆ์ง€๋งŒ **โ€œlegacy for backwards compatibilityโ€**๋กœ ๋ช…์‹œ โ€” ๋‚ด๋ถ€์—์„œ v2 useFrontendTool๋กœ ์œ„์ž„
ํ›…๋ฒ„์ „handler (์•ก์…˜)render (UI)์šฉ๋„
useFrontendToolv2โœ… ํ•„์ˆ˜โœ… ์„ ํƒ์ ์•ก์…˜ ์‹คํ–‰ + UI (๋ฒ”์šฉ)
useComponentv2โŒ ์—†์Œโœ… ํ•„์ˆ˜UI ๋ Œ๋”๋ง๋งŒ (Generative UI)
useCopilotActionv1โœ…โœ… ์„ ํƒ์ legacy โ€” v2์—์„œ๋Š” useFrontendTool ์‚ฌ์šฉ
// useFrontendTool โ€” ์•ก์…˜ ์‹คํ–‰ + UI ํ‘œ์‹œ (๋‘˜ ๋‹ค ๊ฐ€๋Šฅ)
useFrontendTool({
  name: "addToCart",
  parameters: z.object({ productId: z.string() }),
  handler: async ({ productId }) => {     // โ† ์•ก์…˜ ์‹คํ–‰
    await api.addToCart(productId);
    return "์ถ”๊ฐ€ ์™„๋ฃŒ";
  },
  render: ({ status, args }) => (          // โ† UI ํ‘œ์‹œ (์„ ํƒ์ )
    <CartConfirmation status={status} product={args.productId} />
  ),
});
 
// useComponent โ€” UI ํ‘œ์‹œ๋งŒ (handler ์—†์Œ)
useComponent({
  name: "showWeatherCard",
  parameters: z.object({ city: z.string() }),
  render: WeatherCard,                     // โ† ์ด๊ฒƒ๋งŒ
});

UI ๋ชจ๋“œ์™€ ํ›…์˜ ์—ฐ๊ฒฐ

UI ๋ชจ๋“œ์‚ฌ์šฉํ•˜๋Š” ํ›…๊ฐœ๋ฐœ์ž์˜ ์—ญํ• ์—์ด์ „ํŠธ์˜ ์—ญํ• 
HeadlessuseAgent, useCopilotKit๋ ˆ์ด์•„์›ƒ + ์ปดํฌ๋„ŒํŠธ ์ „๋ถ€ ๊ตฌํ˜„๋กœ์ง๋งŒ (๋ฉ”์‹œ์ง€, ์ƒํƒœ)
Prebuilt<CopilotSidebar> ๋“ฑ์—†์Œ (๋ฐ”๋กœ ์‚ฌ์šฉ)์ฑ„ํŒ…์— ํ…์ŠคํŠธ ์‘๋‹ต
GenerativeuseFrontendTool, useComponent์ปดํฌ๋„ŒํŠธ๋ฅผ ๋„๊ตฌ๋กœ ๋“ฑ๋ก์–ด๋–ค ์ปดํฌ๋„ŒํŠธ๋ฅผ ์–ธ์ œ ๋ณด์—ฌ์ค„์ง€ ๊ฒฐ์ •

Generative UI 3๊ฐ€์ง€ ํƒ€์ž…

ํƒ€์ž…์„ค๋ช…ํ”„๋กœํ† ์ฝœ
Static์•ฑ์ด ์ œ์–ดํ•˜๋Š” ์•ˆ์ •์  ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋งAG-UI
Declarative์—์ด์ „ํŠธ๊ฐ€ UI ํŠธ๋ฆฌ ์ œ์•ˆ, ์•ฑ์ด ๊ฒ€์ฆยท๋งˆ์šดํŠธA2UI
Open-EndedMCP Apps, Open JSON UIMCP

4. Copilot Runtime

์„œ๋ฒ„์‚ฌ์ด๋“œ ๋ฐฑ์—”๋“œ ๋ ˆ์ด์–ด:

  • ์ธ์ฆ/๋ณด์•ˆ: API ํ‚ค๋ฅผ ์„œ๋ฒ„์— ๋ณด๊ด€, ํด๋ผ์ด์–ธํŠธ ๋…ธ์ถœ ๋ฐฉ์ง€
  • Agent Routing: ๋ณต์ˆ˜ ์—์ด์ „ํŠธ ์ž๋™ ํƒ์ƒ‰ยท๋ผ์šฐํŒ… ("default" ์—์ด์ „ํŠธ ์ง€์›)
  • AG-UI Middleware: ๋กœ๊น…, ๊ฐ€๋“œ๋ ˆ์ผ, ์š”์ฒญ ๋ณ€ํ™˜์„ ์„œ๋ฒ„์—์„œ ์‹คํ–‰
  • Built-in Middleware: A2UI, MCP Apps๋ฅผ ์„ค์ • ํ•œ ์ค„๋กœ ํ™œ์„ฑํ™”
const runtime = new CopilotRuntime({
  agents: {
    "default": new HttpAgent({ url: "https://my-agent.example.com" }),
  },
  a2ui: {},         // A2UI ์ž๋™ ํ™œ์„ฑํ™”
  mcpApps: {        // MCP ์„œ๋ฒ„ ์—ฐ๊ฒฐ
    servers: [
      { type: "http", url: "http://localhost:3108/mcp", serverId: "my-server" },
    ],
  },
});

AG-UI์™€์˜ ๊ด€๊ณ„

AG-UI Protocol (ํ‘œ์ค€)
  โ””โ”€โ”€ CopilotKit (๊ตฌํ˜„์ฒด, 1st Party Client)
        โ”œโ”€โ”€ React SDK (ํ”„๋ก ํŠธ์—”๋“œ ํ›…/์ปดํฌ๋„ŒํŠธ)
        โ”œโ”€โ”€ Copilot Runtime (๋ฐฑ์—”๋“œ ๋ฏธ๋“ค์›จ์–ด/๋ผ์šฐํŒ…)
        โ””โ”€โ”€ Copilot Cloud (ํ”„๋ฆฌ๋ฏธ์—„: observability, threads)
  • AG-UI๋Š” ํ”„๋กœํ† ์ฝœ ์ŠคํŽ™ โ€” ์ด๋ฒคํŠธ ํƒ€์ž…, ํ๋ฆ„ ํŒจํ„ด, ์ „์†ก ๊ทœ๊ฒฉ์„ ์ •์˜
  • CopilotKit์€ AG-UI ์œ„์˜ SDK โ€” ํ”„๋กœํ† ์ฝœ์„ React ์ปดํฌ๋„ŒํŠธ์™€ ์„œ๋ฒ„ ๋Ÿฐํƒ€์ž„์œผ๋กœ ๊ตฌํ˜„
  • AG-UI ํ”„๋กœํ† ์ฝœ ์ž์ฒด๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ(HttpAgent ์ง์ ‘ ์—ฐ๊ฒฐ), CopilotKit ์—†์ด๋Š” ์ธ์ฆ, ๋ผ์šฐํŒ…, UI ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ชจ๋‘ ์ง์ ‘ ๊ตฌํ˜„ํ•ด์•ผ ํ•จ

์ง€์› ํ”„๋ ˆ์ž„์›Œํฌ

ํ”„๋ ˆ์ž„์›Œํฌ์ƒํƒœ
Built-in Agentโœ… (ํ”„๋ ˆ์ž„์›Œํฌ ๋ถˆํ•„์š”)
LangGraphโœ…
Google ADKโœ…
Microsoft Agent Frameworkโœ…
AWS Strandsโœ…
Mastraโœ…
Pydantic AIโœ…
CrewAI Flowsโœ…
Agno, AG2, LlamaIndexโœ…

์ฐธ๊ณ  ๋ฌธ์„œ