DOCS/_archive/gpt_docs/16_대체_인터페이스_설계안.md
happybell80 374a173e80 GPT_docs를 _archive로 이동 및 DB 테이블 활용 계획 문서 추가
- GPT_docs/ → _archive/gpt_docs/로 이동 (디렉토리 구조 정리)
- ideas/250818_conversation_logs_및_robing_stats_활용_계획.md 추가
  - conversation_logs, robing_stats, robing_settings 테이블 활용 방안
  - 현재 0개 레코드인 미사용 테이블들의 구현 가이드
  - 단계별 구현 계획 및 코드 예시 포함
2025-08-18 13:11:45 +09:00

12 KiB

Slack 외 대체 인터페이스 설계안

웹 인터페이스

Progressive Web App (PWA) 설계

// 웹 인터페이스 아키텍처
interface WebInterfaceConfig {
  components: {
    chat: ChatComponent;
    dashboard: DashboardComponent;
    visualizer: DataVisualizerComponent;
    settings: SettingsComponent;
  };
  
  features: {
    realtime: WebSocketConnection;
    offline: ServiceWorker;
    notifications: PushNotifications;
    responsive: ResponsiveDesign;
  };
}

// React 컴포넌트 예시
const RobeingWebInterface: React.FC = () => {
  return (
    <div className="robeing-container">
      <Header>
        <AgentStatus level={12} status="active" />
        <NotificationBell unread={3} />
      </Header>
      
      <MainContent>
        <ChatInterface 
          agent={currentAgent}
          enableVoice={true}
          enableVideo={false}
        />
        
        <SidePanel>
          <SkillInventory />
          <TaskQueue />
          <MemoryTimeline />
        </SidePanel>
      </MainContent>
      
      <FloatingActionButton>
        <QuickActions />
      </FloatingActionButton>
    </div>
  );
};

3D 공간 인터페이스

// Three.js 기반 3D 인터페이스
class SpatialInterface {
  constructor() {
    this.scene = new THREE.Scene();
    this.camera = new THREE.PerspectiveCamera();
    this.renderer = new THREE.WebGLRenderer();
    
    this.agentAvatar = new AgentAvatar3D();
    this.dataSpace = new DataVisualizationSpace();
    this.interactionZone = new InteractionZone();
  }
  
  createVirtualWorkspace() {
    // 가상 작업 공간 생성
    const workspace = {
      floor: new THREE.Mesh(
        new THREE.PlaneGeometry(100, 100),
        new THREE.MeshBasicMaterial({color: 0x222222})
      ),
      
      dataNodes: this.createDataNodes(),
      skillOrbs: this.createSkillOrbs(),
      memoryCloud: this.createMemoryCloud()
    };
    
    return workspace;
  }
  
  enableVRMode() {
    // WebXR API를 통한 VR 모드
    if ('xr' in navigator) {
      navigator.xr.requestSession('immersive-vr')
        .then(session => {
          this.xrSession = session;
          this.setupVRControls();
        });
    }
  }
}

모바일 앱 인터페이스

React Native 크로스플랫폼 앱

// 모바일 앱 구조
import { NavigationContainer } from '@react-navigation/native';

const RobeingMobileApp = () => {
  return (
    <NavigationContainer>
      <Stack.Navigator initialRouteName="Home">
        <Stack.Screen 
          name="Home" 
          component={HomeScreen}
          options={{
            headerRight: () => <AgentStatusIcon />
          }}
        />
        
        <Stack.Screen 
          name="Chat" 
          component={ChatScreen}
          options={{
            headerShown: false // 전체 화면 채팅
          }}
        />
        
        <Stack.Screen 
          name="Dashboard" 
          component={DashboardScreen}
        />
        
        <Stack.Screen 
          name="ARView" 
          component={ARViewScreen}
        />
      </Stack.Navigator>
    </NavigationContainer>
  );
};

// 증강현실 인터페이스
const ARViewScreen = () => {
  return (
    <ViroARSceneNavigator
      initialScene={{
        scene: () => (
          <ViroARScene>
            <ViroARImageMarker target="robeingMarker">
              <AgentHologram />
            </ViroARImageMarker>
            
            <ViroARPlaneSelector>
              <DataVisualizationAR />
            </ViroARPlaneSelector>
          </ViroARScene>
        )
      }}
    />
  );
};

위젯 시스템

// Android 홈 화면 위젯
class RobeingWidget : AppWidgetProvider() {
    override fun onUpdate(
        context: Context,
        appWidgetManager: AppWidgetManager,
        appWidgetIds: IntArray
    ) {
        appWidgetIds.forEach { appWidgetId ->
            val views = RemoteViews(
                context.packageName,
                R.layout.robeing_widget
            ).apply {
                // 에이전트 상태 표시
                setTextViewText(R.id.agent_status, "Active")
                setTextViewText(R.id.pending_tasks, "3 tasks")
                
                // 클릭 액션
                setOnClickPendingIntent(
                    R.id.quick_chat,
                    getQuickChatIntent(context)
                )
            }
            
            appWidgetManager.updateAppWidget(appWidgetId, views)
        }
    }
}

음성 인터페이스

음성 어시스턴트 통합

class VoiceInterface:
    def __init__(self):
        self.speech_recognizer = SpeechRecognition()
        self.text_to_speech = TextToSpeech()
        self.wake_word = "Hey Robeing"
        
    async def voice_interaction_loop(self):
        """음성 상호작용 루프"""
        
        while True:
            # 웨이크 워드 감지
            if await self.detect_wake_word():
                # 음성 입력 시작
                audio = await self.record_audio()
                
                # 음성을 텍스트로 변환
                text = await self.speech_to_text(audio)
                
                # 에이전트 처리
                response = await self.agent.process(text)
                
                # 텍스트를 음성으로 변환
                audio_response = await self.text_to_speech(response)
                
                # 재생
                await self.play_audio(audio_response)
    
    def integrate_with_alexa(self):
        """Alexa 스킬 통합"""
        
        @ask.launch
        def launch():
            return statement("로빙 에이전트가 활성화되었습니다")
        
        @ask.intent("AskRobeing")
        def ask_robeing(question):
            response = self.agent.process(question)
            return statement(response)

명령줄 인터페이스 (CLI)

터미널 기반 상호작용

class RobeingCLI:
    def __init__(self):
        self.parser = argparse.ArgumentParser(description='Robeing CLI')
        self.setup_commands()
        
    def setup_commands(self):
        """CLI 명령어 설정"""
        
        subparsers = self.parser.add_subparsers()
        
        # 대화 명령
        chat_parser = subparsers.add_parser('chat')
        chat_parser.add_argument('message', type=str)
        
        # 상태 확인
        status_parser = subparsers.add_parser('status')
        status_parser.add_argument('--verbose', '-v', action='store_true')
        
        # 작업 관리
        task_parser = subparsers.add_parser('task')
        task_parser.add_argument('action', choices=['list', 'add', 'complete'])
        
        # 스킬 관리
        skill_parser = subparsers.add_parser('skill')
        skill_parser.add_argument('action', choices=['list', 'equip', 'unequip'])

임베디드 인터페이스

다른 앱에 임베드

// 임베드 가능한 위젯
class RobeingEmbedWidget {
  constructor(config) {
    this.containerId = config.containerId;
    this.apiKey = config.apiKey;
    this.theme = config.theme || 'light';
    this.position = config.position || 'bottom-right';
  }
  
  init() {
    // 컨테이너에 위젯 삽입
    const container = document.getElementById(this.containerId);
    
    const widget = document.createElement('div');
    widget.className = 'robeing-embed-widget';
    widget.innerHTML = `
      <div class="robeing-bubble" onclick="robeingWidget.toggle()">
        <img src="robeing-icon.svg" alt="Robeing" />
        <span class="notification-badge">3</span>
      </div>
      
      <div class="robeing-chat-window" style="display: none;">
        <div class="chat-header">
          <span>Robeing Assistant</span>
          <button onclick="robeingWidget.minimize()">_</button>
        </div>
        <div class="chat-messages"></div>
        <input type="text" placeholder="Type a message..." />
      </div>
    `;
    
    container.appendChild(widget);
    this.attachEventListeners();
  }
}

// 사용 예시
const robeingWidget = new RobeingEmbedWidget({
  containerId: 'robeing-container',
  apiKey: 'your-api-key',
  theme: 'dark',
  position: 'bottom-right'
});

robeingWidget.init();

브라우저 확장 프로그램

Chrome Extension

// manifest.json
{
  "manifest_version": 3,
  "name": "Robeing Assistant",
  "version": "1.0.0",
  "description": "Your AI agent in the browser",
  
  "permissions": [
    "activeTab",
    "storage",
    "notifications"
  ],
  
  "action": {
    "default_popup": "popup.html",
    "default_icon": "robeing-icon.png"
  },
  
  "background": {
    "service_worker": "background.js"
  },
  
  "content_scripts": [{
    "matches": ["<all_urls>"],
    "js": ["content.js"]
  }]
}

// background.js
chrome.runtime.onInstalled.addListener(() => {
  // 컨텍스트 메뉴 추가
  chrome.contextMenus.create({
    id: "askRobeing",
    title: "Ask Robeing about this",
    contexts: ["selection"]
  });
});

chrome.contextMenus.onClicked.addListener((info, tab) => {
  if (info.menuItemId === "askRobeing") {
    // 선택된 텍스트를 로빙에게 전송
    sendToRobeing(info.selectionText);
  }
});

스마트워치 인터페이스

WearOS / Apple Watch 앱

// Apple Watch 인터페이스
import WatchKit

class InterfaceController: WKInterfaceController {
    @IBOutlet weak var statusLabel: WKInterfaceLabel!
    @IBOutlet weak var taskTable: WKInterfaceTable!
    
    override func awake(withContext context: Any?) {
        super.awake(withContext: context)
        
        // 에이전트 상태 표시
        updateAgentStatus()
        
        // 컴플리케이션 업데이트
        updateComplications()
    }
    
    @IBAction func quickReply() {
        // 음성 입력으로 빠른 응답
        presentTextInputController(
            withSuggestions: [
                "What's next?",
                "Show summary",
                "Complete task"
            ],
            allowedInputMode: .allowEmoji
        ) { results in
            if let text = results?.first as? String {
                self.sendToRobeing(text)
            }
        }
    }
}

통합 인터페이스 매니저

모든 인터페이스 통합 관리

class UnifiedInterfaceManager:
    def __init__(self):
        self.interfaces = {
            'web': WebInterface(),
            'mobile': MobileInterface(),
            'voice': VoiceInterface(),
            'cli': CLIInterface(),
            'slack': SlackInterface(),
            'embed': EmbedInterface()
        }
        
        self.active_sessions = {}
        
    async def route_message(self, message, source):
        """메시지를 적절한 인터페이스로 라우팅"""
        
        # 소스별 처리
        response = await self.agent.process(message)
        
        # 응답 포맷팅
        formatted_response = self.format_for_interface(
            response,
            source
        )
        
        # 모든 활성 인터페이스에 동기화
        await self.sync_across_interfaces(formatted_response)
        
        return formatted_response
    
    def format_for_interface(self, response, interface_type):
        """인터페이스별 응답 포맷팅"""
        
        formatters = {
            'web': self.format_for_web,
            'mobile': self.format_for_mobile,
            'voice': self.format_for_voice,
            'cli': self.format_for_cli,
            'slack': self.format_for_slack
        }
        
        return formatters[interface_type](response)