- Transport-agnostic๋ ํ๋กํ ์ฝ์ด ํน์ ์ ์ก ๋ฉ์ปค๋์ฆ์ ๊ฒฐํฉ๋์ง ์์ ์ค๊ณ ์์น
- ๋ฉ์์ง ์ ์ยท๊ตํ ๊ท์น์ **์ ์ก ๊ณ์ธต(transport layer)**๊ณผ ๋ถ๋ฆฌํ๋ ์ถ์ํ ์ ๋ต
- ๊ฐ์ ํ๋กํ ์ฝ์ SSEยทWebSocketยทstdioยทHTTPยทgRPC ๋ฑ ์ด๋ค ์ฑ๋์์๋ ์คํ ๊ฐ๋ฅํ ์ด์์ฑ
- โagnosticโ์ IT ์ฉ๋ฒ โ underlying detail์ ์์กดํ์ง ์์
์ด ์์น์ด ํ์ํ ์ด์
- transport ๋ณํ์ ๊ฐ๊ฑด โ ์ ์ ์ก ์๋จ(์: HTTP/3, QUIC, IPC)์ด ๋ํ๋๋ ๋ฉ์์ง ์ ์๋ ๊ทธ๋๋ก
- ๋ค์ค ํ๊ฒฝ ๋์ โ ๊ฐ์ ํ๋กํ ์ฝ์ด ๋ธ๋ผ์ฐ์ (SSE), ์๋ฒ(WebSocket), ๋ฐ์คํฌํฑ(stdio)์์ ๋์
- ํ ์คํธ ์ฉ์ด์ฑ โ ๋ฉ์์ง ์๋ฏธ๋ transport ์์ด ๋จ์ ํ ์คํธ ๊ฐ๋ฅ
- ๋ค์ธ์ด SDK โ transport ์ฒ๋ฆฌ๋ ์ธ์ด๋ณ ๊ด์ฉ ๋ฐฉ์์ ๋ฐ๋ฅด๋, ๋ฉ์์ง ์คํค๋ง๋ ๊ณต์
- OSI ๊ณ์ธต ๋ถ๋ฆฌ ์์น์ ์ ์ฉ โ application ์๋ฏธ์ delivery ๋ฉ์ปค๋์ฆ์ ๋ค๋ฅธ ๊ด์ฌ์ฌ
AS-IS โ transport์ ๊ฒฐํฉ๋ ์ค๊ณ
flowchart TB subgraph "๋จ์ผ ํจํค์ง" Msg["๋ฉ์์ง ํ์ "] HTTP["HTTP ํด๋ผ์ด์ธํธ"] SSE["SSE ํ์"] Logic["๋น์ฆ๋์ค ๋ก์ง"] end Msg --> HTTP Msg --> SSE HTTP --> Logic SSE --> Logic style HTTP fill:#FFCDD2 style SSE fill:#FFCDD2
๋ฌธ์ :
- ๋ฉ์์ง ์ ์๋ฅผ import ํ๋ ์๊ฐ HTTP ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊น์ง ๋๋ ค์ด
- ์ transport ์ถ๊ฐ ์ ๋ฉ์์ง ํ์ ๊น์ง ์์ ์๋ ฅ
- ๋ค๋ฅธ ์ธ์ด SDK๋ ๋ฉ์์ง ์ ์๋ฅผ ์ฒ์๋ถํฐ ๋ค์ ์์ฑํด์ผ ํจ
TO-BE โ transport ๊ฒฝ๊ณ ๋ถ๋ฆฌ (ํจํค์ง ๋ถํ )
flowchart TB subgraph CorePkg["@myproto/core (transport ๋ชจ๋ฆ)"] Schema["๋ฉ์์ง ์คํค๋ง<br/>์ด๋ฒคํธ ํ์ ์ ์"] end subgraph EncoderPkg["@myproto/encoder (HTTP ๋ชจ๋ฆ)"] Encoder["JSON/Binary ์ง๋ ฌํ<br/>media type ๋ผ์ฐํ "] end subgraph T1Pkg["@myproto/http-client"] T1["HTTP/SSE Transport"] end subgraph T2Pkg["@myproto/ws-client"] T2["WebSocket Transport"] end subgraph T3Pkg["@myproto/stdio-client"] T3["stdio Transport"] end CorePkg --> EncoderPkg EncoderPkg --> T1Pkg EncoderPkg --> T2Pkg EncoderPkg --> T3Pkg style CorePkg fill:#E3F2FD style EncoderPkg fill:#F3E5F5 style T1Pkg fill:#E0F7E9 style T2Pkg fill:#E0F7E9 style T3Pkg fill:#E0F7E9
ํต์ฌ: ์์กด์ด ํ ๋ฐฉํฅ(์๋๋ก)์ผ๋ก๋ง ํ๋ฅธ๋ค. core๋ transport๋ฅผ ๋ชจ๋ฅด๊ณ , transport๋ core๋ฅผ importํ ๋ฟ ๊ทธ ๋ฐ๋๋ ์๋ค. ์ transport๋ ์์ ํจํค์ง๋ฅผ ํ๋ ๋ ์ถ๊ฐํ๋ฉด ๋.
ํต์ฌ ์ ์ ๋น๊ต
๊ถ์ ์๋ ์ฌ์ฉ์ฒ์์ ์ด๋ป๊ฒ ์ ์ํ๋์ง ๋น๊ต:
| ์ถ์ฒ | ์ ์ |
|---|---|
| MCP (๊ณต์ ์คํ) | โThe protocol is transport-agnostic and can be implemented over any communication channel that supports bidirectional message exchange.โ |
| AG-UI (๊ณต์ docs) | โAG-UI doesnโt mandate how events are delivered, supporting various transport mechanisms including SSE, WebSockets, webhooks, etc.โ |
| gRPC (๊ณต์ ์๊ฐ) | โtransport-agnostic RPC frameworkโ โ HTTP/2๊ฐ ๊ธฐ๋ณธ์ด์ง๋ง ์ถ์์์ผ๋ก transport ๋ ๋ฆฝ |
| NVM Express | NVMe ๋ช ๋ น ์งํฉ๊ณผ transport(PCIeยทTCPยทRDMA)๋ฅผ ๋ถ๋ฆฌ โ ๊ฐ์ ๋ช ๋ น์ด ๋ค๋ฅธ transport ์์์ ๋์ |
๊ณตํต ํจํด: โX (๋ฉ์์ง/์ด๋ฒคํธ/๋ช ๋ น)์ ์ ์๋์ด ์๊ณ , ์ด๋ป๊ฒ ์ ๋ฌํ ์ง๋ ๋ณ๊ฐโ.
๋ฌด์์ด transport์ธ๊ฐ
OSI 7๊ณ์ธต ์ค transport๋ 4๊ณ์ธต(TCP/UDP)์ด์ง๋ง, โtransport-agnosticโ์ transport๋ ๋ ๋์ ์๋ฏธ๋ค โ ๋ฉ์์ง๋ฅผ ์ ๋์ ์ฌ์ด์ ์ค์ด ๋๋ฅด๋ ๋ชจ๋ ์ฑ๋.
| ๋ถ๋ฅ | ์์ |
|---|---|
| ๋คํธ์ํฌ ๊ธฐ๋ฐ | HTTP/1.1, HTTP/2, HTTP/3, WebSocket, gRPC, QUIC |
| ์คํธ๋ฆฌ๋ฐ ์๋ฏธ | Server-Sent Events (SSE), Long-polling |
| ๋ก์ปฌ IPC | stdio, Unix socket, Named pipe |
| ๋ฉ์์ง ํ | Kafka, RabbitMQ, NATS |
| RPC ์ฑ๋ | gRPC, Apache Thrift |
transport-agnostic ํ๋กํ ์ฝ์ ์ด ์ค ์ด๋ค ๊ฒ์ ๊ณจ๋ผ ์จ๋ ๋ฉ์์ง ์๋ฏธ๊ฐ ๋ณด์กด๋์ด์ผ ํ๋ค.
์๋งค ์ฉ์ด โ ๋ฌด์๊ณผ ๋ฌด์์ด ๋ ๋ฆฝ์ธ๊ฐ
โagnosticโ์ ํญ์ ๋ฌด์์ ๋ํ agnostic์ธ์ง๊ฐ ํต์ฌ์ด๋ค. ๋ค๋ฅธ ์ถ์ ๋ ๋ฆฝ์ฑ๊ณผ ๋น๊ต:
| ์ฉ์ด | ๋ ๋ฆฝ ๋์ | ์์ |
|---|---|---|
| Transport-agnostic | ์ ์ก ์ฑ๋ | gRPC, MCP, AG-UI |
| Protocol-agnostic | application ํ๋กํ ์ฝ ์์ฒด | PASTE ์ฐ๊ตฌ, ๋ค์ค ํ๋กํ ์ฝ ๊ฒ์ดํธ์จ์ด |
| Wire-format-agnostic | ์ง๋ ฌํ ํ์ (JSON/Protobuf/Avro) | OpenAPI, Apache Avro |
| Language-agnostic | ํ๋ก๊ทธ๋๋ฐ ์ธ์ด | Protocol Buffers .proto |
| Cloud-agnostic | ํด๋ผ์ฐ๋ ํ๋ก๋ฐ์ด๋ | Terraform, Kubernetes |
| Vendor-agnostic | ํน์ ๋ฒค๋ ์ ํ | OpenTelemetry vs APM ๋ฒค๋ |
transport-agnostic์ ์ด ์ค delivery ์ฑ๋๋ง ์ถ์ํํ๋ค โ ๋ฉ์์ง ํ์์ด๋ ์๋ฏธ๋ ์ฌ์ ํ ๊ฐํ๊ฒ ์ ์๋์ด ์๋ค.
์ค์ ์ ์ฉ ์ฌ๋ก โ ์ ์ฉ ์ /ํ ๋น๊ต
์ค์ํ ์ ์ : transport-agnostic์ ์ด๋ค ๋จ์๋ก ๋ถ๋ฆฌํ๋๊ฐ๊ฐ ์๋๋ผ ๋ถ๋ฆฌ๋์๋๊ฐ๊ฐ ํต์ฌ์ด๋ค. ํ์ผ/๋ชจ๋ ๋ถ๋ฆฌ๋ง์ผ๋ก๋ ์ถฉ๋ถํ ์ ์ฉ๋ ์ํ์ด๋ฉฐ, ํจํค์งยท์ ์ฅ์ ๋ถ๋ฆฌ๋ ๊ฐ์ ๋ ฅ์ด ๋ ๊ฐํ ํํ์ผ ๋ฟ์ด๋ค. ์๋ ๋ ์ฌ๋ก๋ ๊ฐ์ ์์น์ ๋ค๋ฅธ ๊ฐ๋๋ก ์ ์ฉํ ์์๋ค.
1. MCP ์คํ์ผ โ ํ ํจํค์ง ์์์ ํ์ผ/ํด๋์ค ๋ถ๋ฆฌ
๋จ์: ํ์ผยทํด๋์ค (๋จ์ผ ํจํค์ง
mcp-sdk์์์ ๋ถ๋ฆฌ)
์ ์ฉ ์ โ ํ ํ์ผ์ ๋ชจ๋ ์ฑ ์์ด ๋ญ์ณ ์์
mcp-sdk/ โ ํจํค์ง 1๊ฐ
โโโ mcp_client.py โ ํ์ผ 1๊ฐ
# ๐ฆ mcp-sdk / ๐ mcp_client.py
import json, subprocess
class MCPClient:
def __init__(self, server_command):
self.process = subprocess.Popen(server_command, ...)
def call_tool(self, name, args):
msg = {"jsonrpc": "2.0", "method": "tools/call", "params": {...}}
# โ stdio ํธ์ถ์ด ๋ฉ์์ง ๋น๋์ ๋ค์ํด
self.process.stdin.write(json.dumps(msg).encode() + b"\n")
line = self.process.stdout.readline()
return json.loads(line)๋ฌธ์ : HTTP ์๋ฒ์ ์ฐ๊ฒฐํ๋ ค๋ฉด MCPClient ์ ์ฒด๋ฅผ ๋ณต์ ํด์ผ ํจ. JSON-RPC ๋น๋ ๋ก์ง์ด stdio ํธ์ถ๊ณผ ํ ๋ฉ์๋์ ์์ฌ ์๋ค.
์ ์ฉ ํ โ ๊ฐ์ ํจํค์ง ์์์ ํ์ผ๋ก ์ฑ ์ ๋ถ๋ฆฌ
mcp-sdk/ โ ์ฌ์ ํ ํจํค์ง 1๊ฐ
โโโ mcp/
โ โโโ protocol.py โ transport ๋ชจ๋ฆ
โ โโโ transport.py โ ์ถ์ ์ธํฐํ์ด์ค
โ โโโ client.py โ transport ์ฃผ์
๋ฐ์
โ โโโ transports/
โ โโโ stdio.py โ Transport ๊ตฌํ์ฒด
โ โโโ http.py โ Transport ๊ตฌํ์ฒด
# ๐ฆ mcp-sdk / ๐ mcp/protocol.py โ transport ๋ชจ๋ฆ
@dataclass
class JSONRPCRequest:
method: str
params: dict
id: int
def build_tool_call(name: str, args: dict) -> JSONRPCRequest: ...
def parse_response(raw: bytes) -> dict: ...# ๐ฆ mcp-sdk / ๐ mcp/transport.py โ ์ถ์ ์ธํฐํ์ด์ค
class Transport(Protocol):
async def send(self, msg: bytes) -> None: ...
async def receive(self) -> bytes: ...# ๐ฆ mcp-sdk / ๐ mcp/transports/stdio.py
from mcp.transport import Transport
class StdioTransport(Transport):
def __init__(self, cmd): self.proc = subprocess.Popen(cmd, ...)
async def send(self, msg): self.proc.stdin.write(msg + b"\n")
async def receive(self): return self.proc.stdout.readline()# ๐ฆ mcp-sdk / ๐ mcp/transports/http.py
from mcp.transport import Transport
class StreamableHTTPTransport(Transport):
def __init__(self, url): self.url = url
async def send(self, msg): await httpx.post(self.url, content=msg)
async def receive(self): ... # SSE ํ์ฑ# ๐ฆ mcp-sdk / ๐ mcp/client.py โ transport ์ฃผ์
from mcp.protocol import build_tool_call, parse_response
from mcp.transport import Transport
class MCPClient:
def __init__(self, transport: Transport):
self.transport = transport
async def call_tool(self, name, args):
req = build_tool_call(name, args) # protocol layer
await self.transport.send(serialize(req)) # transport layer
return parse_response(await self.transport.receive())# ์ฌ์ฉ์ ์ฝ๋ โ transport๋ง ๊ฐ์๋ผ์
from mcp.client import MCPClient
from mcp.transports.stdio import StdioTransport
from mcp.transports.http import StreamableHTTPTransport
client = MCPClient(StdioTransport(["uvx", "mcp-server-git"]))
client = MCPClient(StreamableHTTPTransport("https://example.com/mcp"))ํต์ฌ: ๋ชจ๋ ๊ฐ์ mcp-sdk ํจํค์ง ์์ ํ์ผ ๋ถ๋ฆฌ๋ค. ํจํค์ง๋ฅผ ์ชผ๊ฐ์ง ์์์ด๋ transport-agnostic์ ์ด๋ฏธ ์ ์ฉ๋๋ค. ์ transport ์ถ๊ฐ = mcp/transports/ ๋๋ ํ ๋ฆฌ์ ํ์ผ ํ๋ ์ถ๊ฐ.
2. AG-UI ์คํ์ผ โ ์ฌ๋ฌ ํจํค์ง๋ก ๋ถ๋ฆฌ
๋จ์: npm ํจํค์ง (
@ag-ui/core,@ag-ui/proto,@ag-ui/encoder,@ag-ui/client)
MCP ์ฌ๋ก๊ฐ ํ ํจํค์ง ์์์ ํ์ผ๋ก ๋ถ๋ฆฌํ๋ค๋ฉด, AG-UI๋ ํ ๋จ๊ณ ๋ ๊ฐํ๊ฒ ๋ณ๋ npm ํจํค์ง๋ก ๋ถ๋ฆฌํด์ ์์กด์ฑ ๊ทธ๋ํ ์์ฒด๋ก ์๋ชป๋ import๋ฅผ ์ฐจ๋จํ๋ค.
์ ์ฉ ์ โ ๋จ์ผ ํจํค์ง์ ๋ชจ๋ ์ฝ๋
ag-ui/ โ ๊ฐ์์ ๋จ์ผ ํจํค์ง
โโโ package.json
โโโ src/
โโโ events.ts โ ํ์
์ ์
โโโ proto.ts โ Protobuf ์ธ์ฝ๋ฉ
โโโ encoder.ts โ SSE/binary ๋ผ์ฐํ
โโโ http-agent.ts โ HTTP + RxJS
// ๐ฆ ag-ui / ๐ package.json
{
"name": "ag-ui",
"dependencies": {
"zod": "^3",
"rxjs": "^7",
"@bufbuild/protobuf": "^1",
"fast-json-patch": "^3"
}
}// ๐ฆ ag-ui / ๐ ์ฌ์ฉ์ ์ฝ๋
import { Event, HttpAgent } from "ag-ui";
// โ Event ํ์
ํ๋๋ง import ํด๋ RxJSยทprotobuf ๋ชจ๋ ๋ฒ๋ค์ ํฌํจ๋ฌธ์ :
- ๋ธ๋ผ์ฐ์ ์์ ํ์ ๋ง ์ฐ๋ ค ํด๋ ๋ชจ๋ ์์กด์ฑ ํธ๋ฆฌ ๋๋ด
- ๋ค๋ฅธ ์ธ์ด(Python) SDK๊ฐ
.proto๋ฅผ ์ฌ์ฌ์ฉํ๋ ค ํด๋ TS ์ฝ๋๊ฐ ๋ฐ๋ผ์ด - WebSocket transport๋ฅผ ์ถ๊ฐํ๋ ค๋ฉด ํจํค์ง ์ ์ฒด ์์กด์ฑ์ ์ํฅ
์ ์ฉ ํ โ 4๊ฐ ํจํค์ง๋ก ๋ถํ (AG-UI ์ค์ ๊ตฌ์กฐ)
sdks/typescript/packages/
โโโ core/ โ ๐ฆ @ag-ui/core
โ โโโ package.json
โ โโโ src/
โ โโโ events.ts โ ์ด๋ฒคํธ ํ์
โ โโโ types.ts โ ๋ฉ์์ง ํ์
โ โโโ capabilities.ts โ capability ํ์
โ
โโโ proto/ โ ๐ฆ @ag-ui/proto
โ โโโ package.json
โ โโโ src/
โ โโโ proto/*.proto โ ์ธ์ด ์ค๋ฆฝ ์คํค๋ง
โ โโโ proto.ts โ encode/decode
โ
โโโ encoder/ โ ๐ฆ @ag-ui/encoder
โ โโโ package.json
โ โโโ src/
โ โโโ encoder.ts โ SSE/binary ๋ผ์ฐํฐ
โ โโโ media-type.ts
โ
โโโ client/ โ ๐ฆ @ag-ui/client
โโโ package.json
โโโ src/
โโโ agent/HttpAgent.ts โ HTTP transport
โโโ run/ โ RxJS streaming
// ๐ฆ @ag-ui/core / ๐ package.json
{
"name": "@ag-ui/core",
"dependencies": { "zod": "^3" } // โ
zod๋ง โ transportยทHTTPยทRxJS ์์
}// ๐ฆ @ag-ui/proto / ๐ package.json
{
"name": "@ag-ui/proto",
"dependencies": {
"@ag-ui/core": "*",
"@bufbuild/protobuf": "^1" // โ
binary ์ธ์ฝ๋ฉ๋ง
}
}// ๐ฆ @ag-ui/encoder / ๐ package.json
{
"name": "@ag-ui/encoder",
"dependencies": {
"@ag-ui/core": "*",
"@ag-ui/proto": "*" // โ
HTTPยทRxJS ์ฌ์ ํ ์์
}
}// ๐ฆ @ag-ui/client / ๐ package.json
{
"name": "@ag-ui/client",
"dependencies": {
"@ag-ui/core": "*",
"@ag-ui/encoder": "*",
"rxjs": "^7", // โ
HTTPยทRxJS๋ ์ด ํจํค์ง์์๋ง
"fast-json-patch": "^3"
}
}// ๐ฆ ์ฌ์ฉ์ ์ฑ / ๐ client.ts
import type { Event } from "@ag-ui/core";
// โ zod๋ง ๋๋ ค์ด. RxJSยทprotobuf ํธ๋ฆฌ์์ดํน์ผ๋ก ์ ๊ฑฐ๋จ
import { HttpAgent } from "@ag-ui/client";
// โ HTTP๊ฐ ํ์ํ ๋๋ง ๋ช
์์ ์ผ๋ก import์ transport ์ถ๊ฐ ์๋๋ฆฌ์ค:
+ packages/ws-client/ โ ๐ฆ @ag-ui/ws-client (์ ํจํค์ง)
+ โโโ package.json: dependencies = {
+ โ "@ag-ui/core": "*", โ ๋ฉ์์ง ์ ์ ์ฌ์ฌ์ฉ
+ โ "@ag-ui/encoder": "*" โ ์ธ์ฝ๋ ์ฌ์ฌ์ฉ
+ โ } โ @ag-ui/client๋ importํ์ง ์์
+ โโโ src/agent/WsAgent.ts
๊ธฐ์กด @ag-ui/client ํจํค์ง๋ ํ ์ค๋ ์์ ํ์ง ์๋๋ค.
MCP ์คํ์ผ๊ณผ์ ์ฐจ์ด:
| ์ถ | MCP ์คํ์ผ (ํ์ผ ๋ถ๋ฆฌ) | AG-UI ์คํ์ผ (ํจํค์ง ๋ถ๋ฆฌ) |
|---|---|---|
| ๋ถ๋ฆฌ ๋จ์ | ํ ํจํค์ง ์์ ํ์ผยทํด๋์ค | ๋ณ๋ npm ํจํค์ง |
| ๊ฐ์ ๋ ฅ | ์ฝํจ (์๋ชป import ํด๋ ๋์) | ๊ฐํจ (์์กด์ฑ ๊ทธ๋ํ๋ก ์ฐจ๋จ) |
| ๋ฒ๋ค ์ต์ ํ | ํธ๋ฆฌ์์ดํน์ ์์กด | ํจํค์ง ๋จ์๋ก ๋ช ํํ ๋ถ๋ฆฌ |
| ๋ค์ธ์ด ๊ณต์ | ์ด๋ ค์ (์คํค๋ง ์ถ์ถ ํ์) | ์ฌ์ (.proto๊ฐ ์ด๋ฏธ ๋ณ๋ ํจํค์ง) |
| ์ ํฉ ์ํฉ | ๋จ์ผ ์ธ์ด SDK, ์์ ๊ท๋ชจ | ๋ค์ธ์ด + ๋ธ๋ผ์ฐ์ ๋ฒ๋ค ์ต์ ํ ํ์ |
3. libp2p โ multi-address๋ก transport ์ ๋ณด๋ฅผ ์ฃผ์์ ์บก์ํ
/ip4/192.168.1.1/tcp/8080/ws/p2p/QmPeer... ๊ฐ์ด transport์ ํ๋กํ ์ฝ์ ์ฃผ์ ์์ฒด์ ๋ช
์ํ๋ multi-address ํ์. โ์ด peer๋ WebSocket์ผ๋ก ์ฐ๊ฒฐํด๋ผโ๊ฐ ์ฃผ์ ํ ์ค์ ํํ๋๋ค โ transport ์ ํ ์์ฒด๋ฅผ ๋ฐ์ดํฐ๋ก ๋ค๋ฃฌ๋ค.
ํจํด ์ ๋ฆฌ โ ์ด๋ ์์ค๊น์ง ๊ฐ ๊ฒ์ธ๊ฐ
| ์์ค | ๋ถ๋ฆฌ ๋ฐฉ์ | ์ธ์ ์ถฉ๋ถํ๊ฐ |
|---|---|---|
| ํด๋์ค ๋ถ๋ฆฌ | Transport ์ถ์ ํด๋์ค/์ธํฐํ์ด์ค + ๊ตฌํ์ฒด | ๋จ์ผ ์ธ์ด, ๋จ์ผ ํจํค์ง๋ก ์ถฉ๋ถํ ์์ SDK |
| ๋ชจ๋ ๋ถ๋ฆฌ | ๊ฐ์ ํจํค์ง ์์์ ๋๋ ํ ๋ฆฌ(transports/)๋ก ๊ฒฉ๋ฆฌ | ์์กด์ฑ ๋ถํ๋ฆผ์ด ์์ง ๋ฌธ์ ๋ ์๋ ๋จ๊ณ |
| ํจํค์ง ๋ถ๋ฆฌ | npm/PyPI ํจํค์ง๋ฅผ 4-layer๋ก ์ชผ๊ฐฌ | ๋ธ๋ผ์ฐ์ ๋ฒ๋คยท๋ค์ธ์ด SDKยท์๋ํํฐ transport ํ์ฅ ํ์ |
| ์ ์ฅ์ ๋ถ๋ฆฌ | .proto/์คํค๋ง๋ฅผ ๋ณ๋ repo๋ก | ์ฌ๋ฌ ํ/ํ์ฌ๊ฐ ๊ฐ์ ํ๋กํ ์ฝ์ ๊ตฌํํ ๋ |
๋๋ถ๋ถ ํด๋์ค ๋ถ๋ฆฌ๋ถํฐ ์์ํ๊ณ , ์์กด์ฑ์ด๋ ๋ค์ธ์ด ์๊ตฌ๊ฐ ์๊ธฐ๋ฉด ํจํค์ง ๋ถ๋ฆฌ๋ก ๊ฒฉ์ํ๋ ๊ฒ์ด ํ์ค์ ์ด๋ค.
ํํ ํ๋ ์คํด
์คํด 1. โtransport-agnosticโ = โ์ด๋ค transport๋ ์ค์๊ฐ streaming ๊ฐ๋ฅโ
์๋๋ค. transport๋ง๋ค ๋ฅ๋ ฅ์ด ๋ค๋ฅด๋ฏ๋ก (์: ๋จ๋ฐฉํฅ SSE vs ์๋ฐฉํฅ WebSocket), ํ๋กํ ์ฝ์ ์ต์๊ณตํต๋ถ๋ชจ์ ๋ง์ถฐ ์ค๊ณ๋๊ฑฐ๋, capability negotiation์ผ๋ก ๋ฅ๋ ฅ์ ํ์ํ๋ค. AG-UI์ TransportCapabilities๊ฐ ๊ทธ ์์๋ค.
์คํด 2. โtransport-agnosticโ = โ์ด๋ค transport๋ ๋๋ฑํ ์ฑ๋ฅโ
์๋๋ค. transport๋ง๋ค latencyยทthroughputยทํค๋ ์ค๋ฒํค๋๊ฐ ๋ค๋ฅด๋ค. agnostic์ ์๋ฏธ ๋ณด์กด์ด์ง ์ฑ๋ฅ ๋๋ฑ์ด ์๋๋ค.
์คํด 3. โtransport-agnosticโ์ด๋ฉด โwire format๋ ์์ ๋กญ๊ฒ ๋ฐ๊ฟ ์ ์๋คโ
wire format: ๋ฉ์์ง๊ฐ ์ฑ๋์ ๋ฐ๋ผ ํ๋ฅผ ๋์ ๋ฐ์ดํธ ํํ ๊ท์ฝ โ ์ง๋ ฌํ ํ์(JSON, Protobuf, MessagePack, Avro ๋ฑ). โtransport๋ ์ด๋๋ก ํ๋ฅด๋โ๋ผ๋ฉด, โwire format์ ๋ฌด์์ด ํ๋ฅด๋โ.
๋ณ๊ฐ ์ฐจ์์ด๋ค. transport-agnostic์ด๋ฉด์ wire format์ ๊ณ ์ ์ธ ํ๋กํ ์ฝ๋ ๋ง๋ค (gRPC๋ transport๋ ์ ์ฐํ์ง๋ง wire format์ Protobuf ๊ฐ์ ).
์ค๊ณ ์ ์ฒดํฌ๋ฆฌ์คํธ
์ ํ๋กํ ์ฝ์ transport-agnostic์ผ๋ก ์ค๊ณํ๋ ค ํ ๋:
- ๋ฉ์์ง ์ ์์ transport ์ดํ๊ฐ ์์ด์ง ์์๋๊ฐ (HTTP status code, WebSocket frame ๊ฐ์ ๋จ์ด๊ฐ ๋ฉ์์ง ํ๋์ ๋ฑ์ฅํ๋ฉด ์ํ)
- streaming ์๋ฏธ๊ฐ transport์ ์์กดํ์ง ์๋๊ฐ (์ด๋ฒคํธ ์ํ์ค๋ฅผ transport์ ๋ฌด๊ดํ๊ฒ ์ ์)
- bidirectional์ด ํ์ํ๋ฉด ๋ช ์ํ๋๊ฐ (๋จ๋ฐฉํฅ transport์์ fallback ์ ๋ต)
- capability negotiation์ด ์๋๊ฐ (transport๋ณ ๋ฅ๋ ฅ ์ฐจ์ด๋ฅผ ๋ฐํ์์ ํ์)
- ํจํค์ง/๋ชจ๋ ๊ฒฝ๊ณ๋ก ๊ฐ์ ํ๋๊ฐ (๋ง์ด ์๋ ์์กด์ฑ ๊ทธ๋ํ๋ก)
์ฐธ๊ณ ๋ฌธ์
- Model Context Protocol โ Transports (๊ณต์ ์คํ) โ
"The protocol is transport-agnostic..."๋ช ์ - AG-UI Architecture (๊ณต์ docs) โ Core Design Principles ์ค Transport Agnostic ํญ๋ชฉ
- The Case for Transport-Agnostic Congestion Control (arXiv:2209.04729) โ SDN ํ๊ฒฝ์์ transport-agnostic ํผ์ก ์ ์ด ๋ ผ์
- What is Agnostic in an IT Context? โ TechTarget โ IT์์ agnostic ์ผ๋ฐ ์ฉ๋ฒ
- PASTE: Protocol-agnostic Services & Transport Enrichment (IEEE) โ ์๋งค ์ฉ์ด protocol-agnostic ์ฌ๋ก