Show HN: 에이전트 모델 역전 (앱은 클라이언트로, 채팅은 서버로, 그리고 성찰)
요약
RAIL(Remote Agent Invocation Layer)은 기존 애플리케이션을 LLM과 연결하여 AI가 직접 메서드를 호출할 수 있게 만드는 범용 브리지 프로토콜입니다. 단 한 줄의 코드로 C#, C++, Python 등 다양한 언어의 앱을 에이전트 환경으로 전환할 수 있는 아키텍처를 제공합니다.
핵심 포인트
- 단 한 줄의 코드로 기존 앱을 AI 제어 가능 상태로 전환
- Named Pipe와 Native AOT를 활용한 언어 간 통신 구현
- ReAct 에이전트 루프를 통한 다단계 추론 지원
- C#, C++, Python, Node.js 등 다양한 환경 지원
RAIL (Remote Agent Invocation Layer) 프로토콜 - 프로젝트 아키텍처
어떤 애플리케이션이든 AI 제어가 가능하게 만드는 단 한 줄의 코드
1. RAIL이란 무엇인가?
RAIL은 모든 애플리케이션(C#, C++, Python, Node.js)을 모든 LLM(GPT, Claude, Gemini)에 연결하는 **범용 브리지 (universal bridge)**입니다. 애플리케이션을 새로 작성할 필요 없이, 단 한 줄의 코드만 추가하면 AI가 귀하의 메서드를 직접 호출할 수 있습니다.
2. 프로젝트 개요
| 프로젝트 | 목적 | 언어 |
|---|---|---|
| RailOrchestrator | 메인 AI 애플리케이션 (UI + LLM 라우팅) | C# / WPF |
| ... |
3. 프로젝트 상세 정보
RailOrchestrator
두뇌 (The Brain) - 사용자가 상호작용하는 메인 애플리케이션입니다.
- WPF 데스크톱 애플리케이션 (.NET 9)
- LLM (Gemini, OpenAI, Anthropic, Claude) 연결
- 다단계 추론을 위한 ReAct 에이전트 루프 (agent loop)
- 클라이언트 연결을 위한 Named Pipe 서버 호스팅
- 에셋 (Chips) 및 도구 라우팅 관리
주요 파일:
Services/Host/HostService.cs- Named Pipe 서버Services/LLMService.cs- LLM API 통합Services/ReAct/ReActOrchestrator.cs- 에이전트 루프
RailBridge.Native
브리지 (The Bridge) - 언어 간 통신을 가능하게 하는 네이티브 DLL입니다.
- C-ABI 호환성을 위해 Native AOT로 컴파일됨
- 모든 언어에서 호출 가능한 함수 노출:
RAIL_Ignite()- 호스트에 연결
- IPC를 위해 Named Pipes 사용
대상: Python, C++, Node.js, Rust, Go
RailSDK.Universal
** .NET SDK** - C# 애플리케이션을 위한 클라이언트 라이브러리입니다.
- .NET Standard 2.0 (.NET Framework 4.6.1+와 호환)
- 간단한 API:
RailEngine.Ignite(this) - 리플렉션 (reflection)을 통한 메서드 자동 검색
- 통신을 위해
RailBridge.dll로드
사용법:
// App.xaml.cs 에서
RailEngine.Ignite(this);
RailSDK (RailFactory.Core)
툴킷 (The Toolkit) - 어셈블리 스캐닝 (assembly scanning) 및 매니페스트 생성.
포함 내용:
RuntimeRegistry- .NET / Native 바이너리 감지AssemblyScanner- DLL에서 메서드 추출CompositeManifest- 멀티 모듈 매니페스트 (manifest) 형식DependencyAnalyzer- 프로젝트 의존성 분석SolutionScanner- 전체 .sln 솔루션 스캔
사용처: RailStudio, RailOrchestrator
RailSDK-Cpp
C++ SDK - C++ 애플리케이션의 연결을 지원합니다.
- CMake 기반 빌드 시스템
LoadLibrary를 통한RailBridge.dll로드- 콜백 (Callback) 기반 명령 실행
- x64 및 x86 빌드 모두 지원
빌드 (Build):
build_x64.bat # 64비트
build_x86.bat # 32비트 (레거시 앱)
사용법 (Usage):
Rail::ignite("MyApp", manifestJson, onCommand);
RailSDK-Python
Python SDK - Python 스크립트의 연결을 지원합니다.
ctypes를 사용하여RailBridge.dll로드- 데코레이터 (Decorator) 기반 메서드 등록
- 다른 SDK와 일치하는 단순한 API
사용법 (Usage):
from rail import RailEngine
engine = RailEngine()
...
RailSDK-Node (테스트되지 않음)
Node.js SDK - TypeScript/JavaScript 애플리케이션의 연결을 지원합니다.
- 네이티브 브리지 (native bridge) 액세스를 위해
ffi-napi사용 - TypeScript 타입 포함
- 프로미스 (Promise) 기반 API
사용법 (Usage):
import { RailEngine } from 'rail-sdk';
engine.ignite([new MyService()]);
RailStudio
시각적 도구 (Visual Tool) - 애플리케이션을 스캔하고 분석합니다.
- EXE/DLL을 분석기로 전송
rail.manifest.json자동 생성- 의존성 시각화
- 솔루션 전체 스캔
사용 사례: Rail 통합을 위한 레거시 앱 준비
ConvertedProjectExample
SDK 통합을 보여주는 예제 애플리케이션입니다.
| 예제 | 설명 |
|---|---|
AgentTest | 고객 데이터베이스가 포함된 간단한 WPF 앱 |
WorkflowDemo | 워크플로 자동화 예제 |
매니페스트 (Manifest) 여기에서 이 예제 애플리케이션을 위해 이미 생성된 모든 "rail.manifest.json"이 포함된 Manifest 폴더를 찾을 수 있습니다.
4. 개발자를 위한 SDK 요구 사항
애플리케이션을 AI 제어 가능 (AI-controllable) 상태로 전환할 때, 정확히 필요한 사항은 다음과 같습니다:
언어별 요구 사항
| 언어 | 추가할 항목 | 자동 포함 항목 | 비고 |
|---|---|---|---|
| C# (.NET) | RailSDK.Universal.dll | RailBridge.dll (자동 복사됨) | 참조 하나로 모든 기능 포함 |
| ... |
C# 개발자: 참조 하나로 모든 것을 해결
RailSDK.Universal을 추가하면, 네이티브 브릿지 (native bridge)가 출력 디렉터리로 자동 복사됩니다:
📁 bin/Debug/net8.0/
├── YourApp.exe
├── RailSDK.Universal.dll ← 이 참조를 추가합니다
...
추가 방법:
<PackageReference Include="RailSDK.Universal" Version="2.0.0" />
C++ 개발자: 두 가지 옵션
C++은 코드베이스에 따라 **두 가지 통합 모드 (integration modes)**를 제공합니다:
옵션 A: RTTR을 사용하는 현대적 C++ (자동 리플렉션 (Automatic Reflection))
새로운 애플리케이션 또는 C++17을 지원하는 코드베이스의 경우:
// RTTR 매크로를 사용하여 클래스를 등록합니다
RTTR_REGISTRATION {
rttr::registration::class_<OrderManager>("OrderManager")
...
필요한 파일:
📁 YourApp/
├── YourApp.exe
├── rail_sdk.dll ← C++ 래퍼 (RTTR 포함)
...
옵션 B: 커스텀 디스패처 (Custom Dispatcher)를 사용하는 레거시 C++ (수동 라우팅 (Manual Routing))
C++17 또는 RTTR을 사용할 수 없는 레거시 애플리케이션 (예: 게임, 오래된 코드베이스)의 경우:
#define RAIL_NO_RTTR // RTTR 비활성화
// 자체 명령 라우터 (command router)를 정의합니다
...
필요한 파일:
📁 YourApp/
├── YourApp.exe
├── rail_sdk.dll ← C++ 래퍼 (RTTR 미포함)
...
실제 사례: Notepad++와 Doom은 코드베이스가 RTTR을 지원할 수 없었기 때문에 옵션 B (커스텀 디스패처)를 사용하여 통합되었습니다.
Python/Node.js 개발자
📁 YourProject/
├── main.py (또는 index.ts)
├── RailBridge.dll ← 수동으로 복사
...
ctypes/ffi 호출을 대신 처리해 주는 래퍼 (wrapper) 패키지를 설치하세요.
5. 프로젝트가 연결되는 방식
<p align="center"> <img src="Docs/Architecture_overview.jpg" alt="아키텍처 개요" width="800"/> </p>아키텍처 워크플로우 (Architecture Workflow)
<p align="center"> <img src="Docs/Architecture_workflow.png" alt="아키텍처 워크플로우" width="800"/> </p>┌─────────────────────────────────────────────────────────────┐
│ RailOrchestrator │
│ (메인 AI 애플리케이션) │
...
의존성 흐름 (Dependency Flow):
RailOrchestrator
└── uses → RailSDK (RailFactory.Core) for manifest parsing
...
6. 사용 예시 (Usage Examples)
예시 1: C# 앱을 AI 제어 가능하게 만들기
// 서비스를 생성합니다.
public class CustomerService
{
...
예시 2: C++ 애플리케이션 제어하기
// 콜백 함수를 정의합니다.
const char* OnCommand(const char* json) {
auto cmd = ParseJson(json);
...
예시 3: Python 스크립트 통합
class DataProcessor:
def analyze_data(self, file_path: str) -> dict:
return {"rows": 1000, "status": "processed"}
...
예시 4: AI에게 실행 요청하기
앱을 연결한 후, 자연어로 질문합니다:
"john@example.com 이메일을 가진 John Smith라는 고객을 생성해줘"
→ AI가 CustomerService.CreateCustomer("John Smith", "john@example.com") 호출
...
빠른 시작 (Quick Start)
- RailOrchestrator 실행 - 메인 AI 인터페이스
- 앱 연결 - SDK를 추가하고
Ignite()를 호출합니다. - AI에게 요청 - 자연어 명령이 코드를 실행합니다.
<p align="center"> <b>RAIL 프로토콜</b> - 레거시 애플리케이션과 AI 연결 (Bridging Legacy Applications and AI) </p>
AI 자동 생성 콘텐츠
본 콘텐츠는 HN Claude Code Search의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기