- GPT_docs/ → _archive/gpt_docs/로 이동 (디렉토리 구조 정리) - ideas/250818_conversation_logs_및_robing_stats_활용_계획.md 추가 - conversation_logs, robing_stats, robing_settings 테이블 활용 방안 - 현재 0개 레코드인 미사용 테이블들의 구현 가이드 - 단계별 구현 계획 및 코드 예시 포함
12 KiB
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)