- AG-UI TypeScript SDK ํจํค์ง ๊ตฌ์กฐ๋ ์ ํ ์์กด์ฑ์ ๊ฐ์ง 4๊ฐ ํ๋กํ ์ฝ ํจํค์ง + 1๊ฐ CLI ๋๊ตฌ
- core โ proto โ encoder โ client ๋จ๋ฐฉํฅ ์์กด ์ฒด์ธ
- ๊ฐ layer๊ฐ ๋จ์ผ ์ฑ ์ ์์น์ ๋ฐ๋ฅด๋ ๋ถ๋ฆฌ ์ค๊ณ
- Transport-Agnostic ์์น์ ํจํค์ง ๊ฒฝ๊ณ๋ก ๊ฐ์ ํ๋ ๊ตฌ์กฐ
์ด ๊ตฌ์กฐ๊ฐ ํ์ํ ์ด์
- ์ธ์ด ์ค๋ฆฝ ์คํค๋ง ๊ฒฉ๋ฆฌ:
.protoํ์ผ์ ๋ณ๋ ํจํค์ง์ ๋์ด, ๋ค๋ฅธ ์ธ์ด SDK๊ฐ ๋์ผ ์คํค๋ง๋ฅผ ๊ฐ์ ธ๋ค ์ธ ์ ์๋ ํํ๋ก ์ ์ - Transport-Agnostic ๋ณด์กด: core๊ฐ HTTPยทObservable์ ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ transport(WebSocket ๋ฑ) ์ถ๊ฐ๊ฐ ์ฌ์
- ๋ฒ๋ค ํฌ๊ธฐ ์ต์ ํ: ๋ธ๋ผ์ฐ์ ์ฑ์ด binary ํ์์ ์ ์ฐ๋ฉด protoยทprotobuf ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํธ๋ฆฌ์์ดํน์ผ๋ก ์ ๊ฑฐ ๊ฐ๋ฅ
- ํ ์คํธ ์ฉ์ด์ฑ: core๋ ์์ ํจ์์ฒ๋ผ ๊ฒ์ฆ ๊ฐ๋ฅ, encoder๋ HTTP ์์ด ๋จ์ ํ ์คํธ ๊ฐ๋ฅ
- ํ์ฅ ์ง์ ๋ ธ์ถ: ๋๊ตฌ๋ core ์์ ์ client(e.g. WebSocketAgent)๋ฅผ ๋ง๋ค ์ ์์
AS-IS โ ๋ง์ฝ ํ ํจํค์ง์๋ค๋ฉด
flowchart TB subgraph "ag-ui (๋จ์ผ ํจํค์ง)" Types["ํ์ ์ ์"] Events["์ด๋ฒคํธ ์คํค๋ง"] Proto["Protobuf ์ง๋ ฌํ"] SSE["SSE ์ง๋ ฌํ"] HTTP["HttpAgent (RxJS)"] StatePatch["JSON Patch ์ ์ฉ"] end Types --> Events Events --> Proto Events --> SSE Proto --> HTTP SSE --> HTTP HTTP --> StatePatch
๋ฌธ์ :
- ๋ธ๋ผ์ฐ์ ์์ ๋จ์ํ ํ์ ๋ง import ํ๋ ค ํด๋ RxJSยทprotobufยทuuid ๊ฐ ๋๋ ค์ด
- ๋ค๋ฅธ ์ธ์ด SDK์ ์คํค๋ง ๊ณต์ ๋ถ๊ฐ โ ๋ณ๋ ์ ์ ํ์
- HTTP ์ธ transport ์ถ๊ฐ ์ ํจํค์ง ์ ์ฒด ์์กด์ฑ์ ์ํฅ
TO-BE โ 4-layer ๋ถ๋ฆฌ
flowchart TB Core["@ag-ui/core<br/>ํ์ ยท์ด๋ฒคํธยทZod ์คํค๋ง"] Proto["@ag-ui/proto<br/>Protobuf ๋ฐ์ด๋๋ฆฌ ์ธ์ฝ๋ฉ"] Encoder["@ag-ui/encoder<br/>SSE/Binary ์ ํ"] Client["@ag-ui/client<br/>HttpAgent + ๋ฐํ์"] Core --> Proto Core --> Encoder Core --> Client Proto --> Encoder Proto --> Client Encoder --> Client style Core fill:#E3F2FD style Proto fill:#FFF3E0 style Encoder fill:#F3E5F5 style Client fill:#E0F7E9
๊ฐ layer๊ฐ ์๋ layer๋ง ์์กด โ ์์กด์ด ์๋ก ํ๋ฅด์ง ์์.
4๊ฐ ํ๋กํ ์ฝ ํจํค์ง์ ์ญํ ๋ถ๋ด
1. core โ ํ์ ๊ณผ ์คํค๋ง์ ๊ธฐ์ค์
src/
โโโ types.ts # ๋ฉ์์งยท๋๊ตฌยท๋ฐํ์ ์
๋ ฅ ํ์
โโโ events.ts # 16์ข
BaseEvent ์ ์
โโโ capabilities.ts # Agent capability negotiation
โโโ event-factories.ts
์ธ๋ถ ์์กด: zod ํ๋.
transportยทIO ์์. ๋ค๋ฅธ ๋ชจ๋ ํจํค์ง์ ์ง๋ฆฌ ์์ฒ.
2. proto โ ๋ฐ์ด๋๋ฆฌ ์ง๋ ฌํ ์ฑ๋
src/
โโโ proto/*.proto # ์ธ์ด ์ค๋ฆฝ ์คํค๋ง
โโโ proto.ts # encode/decode ํจ์
ํต์ฌ export: encode, decode, AGUI_MEDIA_TYPE = "application/vnd.ag-ui.event+proto"
์์กด: core, @bufbuild/protobuf.
์ ๋ถ๋ฆฌ๋์๋ โ .proto ํ์ผ์ Protocol Buffers์ ํ์ค ํฌ๋งท์ผ๋ก, protoc ์ปดํ์ผ๋ฌ๋ ๊ณต์์ ์ผ๋ก C++, Java, Kotlin, Python ๋ฑ 8๊ฐ ์ธ์ด์ ๋ํด ์ฝ๋๋ฅผ ์๋ ์์ฑํ๊ณ GoยทDart๋ ํ๋ฌ๊ทธ์ธ์ผ๋ก ์ง์ํ๋ค. ์ฆ ์ด ํจํค์ง์ .proto๋ ๋จ์ง TS ๋ฐ์ด๋๋ฆฌ ์ธ์ฝ๋ฉ์ฉ์ด ์๋๋ผ, ๋๊ตฌ๋ ๋ค๋ฅธ ์ธ์ด SDK๋ฅผ ๋ง๋ค ๋ ๊ฐ์ ธ๋ค ์ธ ์ ์๋ ์ธ์ด ์ค๋ฆฝ ์คํค๋ง ์์ฒ์ด๋ค. ๋ณ๋ ํจํค์ง๋ก ๋ ๋๋ถ์ ์ฝ๋ ์์ฑ ์ํฌํ๋ก(pnpm generate)๋ ๊น๋ํ๊ฒ ๋ถ๋ฆฌ๋๋ค.
(์ฐธ๊ณ : ํ์ฌ AG-UI Python SDK๋ protobuf ์ฝ๋ ์์ฑ์ ์ฌ์ฉํ์ง ์๊ณ ๋ณ๋ ํ์
์ ์๋ก ์ด์ ์ค. ํ์ง๋ง .proto๊ฐ ์ด๋ฏธ ๋ถ๋ฆฌ๋์ด ์์ผ๋ฏ๋ก ์ธ์ ๋ ๋ค์ธ์ด ๊ณต์ ๋ก ์ ํ ๊ฐ๋ฅํ ๊ตฌ์กฐ.)
3. encoder โ ์ง๋ ฌํ ์ค์ผ์คํธ๋ ์ดํฐ
src/
โโโ encoder.ts
โโโ media-type.ts
์์กด: core, proto. ์์ wrapping layer.
SSE(ํ
์คํธ) vs proto(๋ฐ์ด๋๋ฆฌ)๋ฅผ media type์ผ๋ก ์ ํํด์ฃผ๋ ๋ผ์ฐํฐ ์ญํ .
HTTP๋ฅผ ๋ชจ๋ฆ โ ๋จ์ง ๋ฐ์ดํธ/ํ
์คํธ๋ก์ ๋ณํ๋ง ๋ด๋น.
4. client โ ๋ฐํ์ ํตํฉ
src/
โโโ agent/ # HttpAgent
โโโ run/ # run loop
โโโ apply/ # JSON Patch ์ํ ์ ์ฉ
โโโ verify/ # ์ด๋ฒคํธ ์ํ์ค ๊ฒ์ฆ
โโโ transform/ # ์ด๋ฒคํธ ๋ณํ
โโโ chunks/ # streaming chunk ์ฒ๋ฆฌ
โโโ compact/ # ๋ฉ์์ง ์์ถ
โโโ middleware/ # ๋ฏธ๋ค์จ์ด ์ฒด์ธ
โโโ legacy/ # ๊ตฌ๋ฒ์ ํธํ
์์กด: core, encoder, proto, rxjs, fast-json-patch, uuid.
์ฒ์์ผ๋ก RxJS์ HTTP๊ฐ ๋ฑ์ฅํ๋ layer.
์ด layer๋ง ํ๊ฒฝ ์์กด์ (๋ธ๋ผ์ฐ์ /Node ๋ ๋ค ๋์ํ์ง๋ง streaming ๋ชจ๋ธ์ RxJS).
CLI ํจํค์ง์ ์์น
create-ag-ui-app (cli)์ ํ๋กํ ์ฝ ์คํ๊ณผ ๋ฌด๊ดํ ์ค์บํด๋ฉ ๋๊ตฌ. inquirer, commander, giget ๋ง ์์กด โ core๋ฅผ import ํ์ง ์์.
โ์ 4๊ฐ๋โ๊ณ ๋งํ ๋ cli๋ฅผ ๋นผ๊ณ ์ธ๋ ์ด์ .
์์กด์ฑ ๊ทธ๋ํ๊ฐ ์๋ ค์ฃผ๋ ์ค๊ณ ์์น
์์กด์ ํ ๋ฐฉํฅ์ผ๋ก๋ง ํ๋ฅธ๋ค
client๋ฅผ ์์ ํด๋ core๋ ์์ . ๋ฐ๋๋ก core ์์ ์ ๋ชจ๋ layer์ ํ๊ธ.
โ ๋ณํ์ ์ํฅ ๋ฐ๊ฒฝ์ด ํจํค์ง layer๋ก ๋ช
์์ ์ผ๋ก ํํ๋จ.
proto์ encoder๋ฅผ ๋ถ๋ฆฌํ ์ด์
proto: ์ธ์ด ์ค๋ฆฝ โ.protoํ์ผ์ ์ด๋ค ์ธ์ด์์๋ protoc๋ก ์ฝ๋ ์์ฑ ๊ฐ๋ฅencoder: TS ์ ์ฉ โ SSE ๋ถ๊ธฐ์ media type ์ฒ๋ฆฌ
๋ง์ฝ ํ ํจํค์ง๋ก ๋ฌถ์๋ค๋ฉด, ๋ค๋ฅธ ์ธ์ด SDK๊ฐ .proto๋ฅผ ์ฌ์ฌ์ฉํ๋ ค ํ ๋ TS ์ ์ฉ SSE ์ฝ๋๊น์ง ํจ๊ป ๋๊ณ ์์ผ ํ๋ ๋ถ์กฐํ๊ฐ ์๊ธด๋ค.
client์๋ง rxjs๊ฐ ์๋ค
โ โ๋ค๋ฅธ streaming ๋ชจ๋ธโ์ด ๊ฐ๋ฅํ๋ค๋ ๋ป.
์: Python SDK๋ Observable ๋์ async iterator. core ํ์
์ ๊ทธ๋๋ก ์ฌ์ฌ์ฉ.
๋ธ๋ก๊ทธ 1ํธ ํต์ฌ ๋ฉ์์ง
ํจํค์ง ๊ฒฝ๊ณ๋ ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ๊ฐ ์๋๋ผ ์์กด์ฑ ํ๋ฆ์ ๋ฐฉ๋ฒฝ์ด๋ค. AG-UI๋ โtransport-agnosticโ์ด๋ผ๋ ์ถ์ ์์น์ 4๊ฐ์ ํจํค์ง ๊ฒฝ๊ณ๋ก ๋ฌผ๋ฆฌ์ ์ผ๋ก ๊ฐ์ ํ๋ค. ๊ทธ๋์ ๋ค์ ํธ(AbstractAgent)๋ถํฐ ๋ณด๊ฒ ๋ ์ฝ๋๋ ํญ์ โ์ด ์ฝ๋๊ฐ ์ด๋ layer์ ์๋๊ฐโ๋ฅผ ๋จผ์ ๋ฌป๊ฒ ๋๋ค.