"""감성 분석 Feature Plugin. API: /api/v1/sentiment """ import streamlit as st from . import run, overview, in_house, competitor, keyword_analysis, feedback, summary from .data import load_sentiment_data FEATURE_CONFIG = { "key": "sentiment", "name": "감성 분석", "icon": "📊", "description": "AI 플랫폼의 브랜드 감성 분석 결과", "api_base": "/api/v1/sentiment", "order": 1, } def render(base_ctx): """감성 분석 feature 렌더링.""" with st.spinner("감성 분석 데이터 로딩 중..."): data = load_sentiment_data( base_ctx.get("api_key") or "", base_ctx["campaign_id"], access_token=base_ctx.get("access_token") or "", ) if data is None: st.error("감성 분석 데이터 로딩 실패") return # Inject base_ctx fields into data data["campaign_name"] = base_ctx.get("campaign_name", "") # 1. Feature summary summary.render_summary(data) # 2. Sub-tabs tabs = st.tabs([ "🚀 실행요청", "📊 오버뷰", "🏠 자사 브랜드", "🏢 경쟁사", "🔍 키워드 분석", ]) tab_renderers = [ ("실행요청", run.render), ("오버뷰", overview.render), ("자사 브랜드", in_house.render), ("경쟁사", competitor.render), ("키워드 분석", keyword_analysis.render), ] for tab, (label, renderer) in zip(tabs, tab_renderers): with tab: try: renderer(data) except Exception as e: st.error(f"{label} 로딩 실패: {e}") # 3. Feedback (below tabs) feedback.render_feedback_stats(data.get("feedback_stats", {}))