From 257adc7ae665531225580e482c91522d6b8b6c00 Mon Sep 17 00:00:00 2001 From: dohyun-2 Date: Sat, 31 Jan 2026 15:37:47 +0900 Subject: [PATCH] proposal: prototype file add --- prototype/gemini.zip | Bin 0 -> 28075 bytes prototype/opus.jsx | 1720 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 1720 insertions(+) create mode 100644 prototype/gemini.zip create mode 100644 prototype/opus.jsx diff --git a/prototype/gemini.zip b/prototype/gemini.zip new file mode 100644 index 0000000000000000000000000000000000000000..964b143374c1cebbaf3dde908ea51672400bf34a GIT binary patch literal 28075 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 literal 0 HcmV?d00001 diff --git a/prototype/opus.jsx b/prototype/opus.jsx new file mode 100644 index 0000000..3909d74 --- /dev/null +++ b/prototype/opus.jsx @@ -0,0 +1,1720 @@ +import React, { useState, useEffect } from 'react'; + +const MacroEconomicSimulator = () => { + const [currentStep, setCurrentStep] = useState(1); + const [inputMode, setInputMode] = useState('slider'); + const [naturalInput, setNaturalInput] = useState(''); + const [isAnalyzing, setIsAnalyzing] = useState(false); + const [activeAgent, setActiveAgent] = useState(null); + const [showConsensus, setShowConsensus] = useState(false); + + // 현재 실제 경제 지표 (API에서 가져온 것처럼) + const currentIndicators = { + exchangeRate: { value: 1380, unit: '₩/$', name: '원/달러 환율', trend: 'up' }, + baseRate: { value: 3.50, unit: '%', name: '기준금리', trend: 'stable' }, + cpi: { value: 3.2, unit: '%', name: '소비자물가 상승률', trend: 'down' }, + gdpGrowth: { value: 2.1, unit: '%', name: 'GDP 성장률', trend: 'up' }, + unemployment: { value: 3.7, unit: '%', name: '실업률', trend: 'stable' }, + oilPrice: { value: 78, unit: '$', name: '국제유가 (WTI)', trend: 'up' } + }; + + // 사용자가 설정한 시뮬레이션 값 + const [simValues, setSimValues] = useState({ + exchangeRate: 1380, + baseRate: 3.50, + cpi: 3.2, + gdpGrowth: 2.1, + unemployment: 3.7, + oilPrice: 78 + }); + + const indicatorRanges = { + exchangeRate: { min: 1100, max: 1600, step: 10 }, + baseRate: { min: 0, max: 7, step: 0.25 }, + cpi: { min: -1, max: 10, step: 0.1 }, + gdpGrowth: { min: -5, max: 10, step: 0.1 }, + unemployment: { min: 1, max: 15, step: 0.1 }, + oilPrice: { min: 30, max: 150, step: 1 } + }; + + const agents = [ + { + id: 'consumer', + name: '소비자', + role: 'Consumer Representative', + color: '#10b981', + icon: '👤', + perspective: '가계 경제 관점', + thinking: '환율 상승으로 인해 수입품 가격이 오르고, 해외여행 비용이 증가합니다. 특히 에너지와 식료품 가격 상승이 실질 구매력을 약화시킬 것으로 보입니다. 다만 금리 인상 시 예금 이자 수익은 증가할 수 있습니다.', + position: '소비 위축 우려' + }, + { + id: 'business', + name: '기업', + role: 'Corporate Sector', + color: '#3b82f6', + icon: '🏢', + perspective: '기업 경영 관점', + thinking: '수출 기업에게 환율 상승은 가격 경쟁력 제고의 기회입니다. 그러나 원자재 수입 비용 증가와 금리 인상에 따른 자금 조달 비용 상승은 부담 요인입니다. 업종별로 명암이 갈릴 것으로 예상됩니다.', + position: '업종별 차별화' + }, + { + id: 'government', + name: '정부', + role: 'Fiscal Authority', + color: '#8b5cf6', + icon: '🏛', + perspective: '재정 정책 관점', + thinking: '물가 안정과 경기 부양 사이의 균형이 필요합니다. 취약계층 지원을 위한 선별적 재정 지출을 검토하되, 재정 건전성도 고려해야 합니다. 환율 급등 시 외환시장 안정화 조치를 준비하고 있습니다.', + position: '선별적 재정 대응' + }, + { + id: 'centralbank', + name: '중앙은행', + role: 'Monetary Authority', + color: '#f59e0b', + icon: '🏦', + perspective: '통화 정책 관점', + thinking: '환율 상승에 따른 수입 물가 상승은 인플레이션 압력을 높입니다. 물가 안정 목표(2%)를 고려할 때 기준금리 인상 압력이 존재하나, 경기 둔화 우려도 함께 살펴야 합니다. 금융 안정에도 주의를 기울이고 있습니다.', + position: '긴축 기조 유지' + }, + { + id: 'bank', + name: '시중은행', + role: 'Commercial Banking', + color: '#ec4899', + icon: '💳', + perspective: '금융 중개 관점', + thinking: '기준금리 인상은 예대마진 확대로 이어질 수 있으나, 대출 수요 감소와 부실 위험 증가를 동반합니다. 가계부채 연착륙을 위한 리스크 관리가 중요하며, 기업 대출 심사도 강화할 필요가 있습니다.', + position: '리스크 관리 강화' + } + ]; + + const getDelta = (key) => { + const current = currentIndicators[key].value; + const sim = simValues[key]; + const delta = sim - current; + return delta; + }; + + const formatDelta = (key) => { + const delta = getDelta(key); + if (delta === 0) return null; + const sign = delta > 0 ? '+' : ''; + const decimals = key === 'exchangeRate' || key === 'oilPrice' ? 0 : 1; + return `${sign}${delta.toFixed(decimals)}`; + }; + + const handleStartSimulation = () => { + setCurrentStep(3); + setIsAnalyzing(true); + + // 에이전트별로 순차적으로 분석 + agents.forEach((agent, idx) => { + setTimeout(() => { + setActiveAgent(agent.id); + }, idx * 1200); + }); + + // 모든 분석 완료 후 합의 도출 + setTimeout(() => { + setIsAnalyzing(false); + setShowConsensus(true); + }, agents.length * 1200 + 800); + }; + + return ( +
+ {/* Subtle Grid Background */} +
+ + {/* Navigation */} + + +
+ {/* Step 1: Current Economic Situation */} + {currentStep === 1 && ( +
+
+
+

STEP 01

+

현재 경제 상황

+

+ 실시간 경제 지표를 확인하고 시뮬레이션을 시작하세요 +

+
+
+ + Live Data +
+
+ +
+ {Object.entries(currentIndicators).map(([key, data], idx) => ( +
+
+ {data.name} + + {data.trend === 'up' ? '↑' : data.trend === 'down' ? '↓' : '→'} + +
+
+ {data.value.toLocaleString()} + {data.unit} +
+
+ ))} +
+ +
+ +
+
+ )} + + {/* Step 2: Scenario Setting */} + {currentStep === 2 && ( +
+
+
+

STEP 02

+

시나리오 설정

+

+ 경제 지표를 조정하여 가상의 시나리오를 만들어보세요 +

+
+
+ + {/* Input Mode Toggle */} +
+
+ + +
+
+ + {inputMode === 'slider' ? ( +
+ {Object.entries(currentIndicators).map(([key, data], idx) => { + const range = indicatorRanges[key]; + const delta = getDelta(key); + const deltaFormatted = formatDelta(key); + const percentage = ((simValues[key] - range.min) / (range.max - range.min)) * 100; + + return ( +
+
+ {data.name} + {deltaFormatted && ( + 0 ? 'rgba(239, 68, 68, 0.1)' : 'rgba(16, 185, 129, 0.1)', + color: delta > 0 ? '#ef4444' : '#10b981' + }}> + {deltaFormatted} {data.unit} + + )} +
+ +
+
+ 현재 + {data.value.toLocaleString()} +
+ + + +
+ 시뮬레이션 + + {simValues[key].toLocaleString()} + {data.unit} + +
+
+ +
+
+
+ {/* Current value marker */} +
+
+ 현재 +
+
+ setSimValues({ + ...simValues, + [key]: parseFloat(e.target.value) + })} + style={styles.sliderInput} + /> +
+ +
+ {range.min.toLocaleString()} + {range.max.toLocaleString()} +
+
+ ); + })} +
+ ) : ( +
+
+