GitHub Action
Sync from GitHub
ef78361
Raw
History Blame Contribute Delete
1.76 kB
"""감성 뢄석 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", {}))