Spaces:
Sleeping
Sleeping
File size: 1,760 Bytes
ef78361 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | """κ°μ± λΆμ 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", {}))
|