데이터 출력 확인

db-migration
jaehwang 2026-06-04 16:50:34 +09:00
parent 9919529a88
commit 5baea01ae1
6 changed files with 38 additions and 14 deletions

View File

@ -16,8 +16,8 @@ class PlanInput(BaseModel):
market_trend: str | None = None market_trend: str | None = None
market_target_audience: str | None = None market_target_audience: str | None = None
tiktok: str | None = None tiktok: str | None = None
instagram_en: str | None = None instagram: str | None = None
facebook_en: str | None = None facebook: str | None = None
naver_blog: str | None = None naver_blog: str | None = None
naver_cafe: str | None = None naver_cafe: str | None = None
kakao_talk: str | None = None kakao_talk: str | None = None

View File

@ -26,6 +26,26 @@ async def generate_plan(analysis_run_id: str) -> PlanOutput:
report = await select_run_report_data(analysis_run_id) report = await select_run_report_data(analysis_run_id)
market = await select_market(analysis_run_id) market = await select_market(analysis_run_id)
mainpage = raw.get(SourceType.MAINPAGE) or []
mainpage = mainpage[0]["raw_data"] # 유일
branding = raw.get(SourceType.BRANDING) or []
branding = branding[0]["raw_data"] # 유일
instagram = raw.get(SourceType.INSTAGRAM) or []
facebook = raw.get(SourceType.FACEBOOK) or []
youtube = raw.get(SourceType.YOUTUBE) or []
youtube = youtube[0]["raw_data"] if youtube else None # 유일 (기획상)
gangnam_unni = raw.get(SourceType.GANGNAM_UNNI) or []
gangnam_unni = gangnam_unni[0]["raw_data"] if gangnam_unni else None# 유일 (기획상)
naver_blog = raw.get(SourceType.NAVER_BLOG) or []
naver_blog = naver_blog[0]["raw_data"] if naver_blog else None# 유일 (기획상)
tiktok = raw.get(SourceType.TIKTOK) or []
tiktok = tiktok[0]["raw_data"] if tiktok else None# 유일 (기획상)
naver_cafe = raw.get(SourceType.NAVER_CAFE) or []
naver_cafe = naver_cafe[0]["raw_data"] if naver_cafe else None# 유일 (기획상)
kakaotalk = raw.get(SourceType.KAKAOTALK) or []
kakaotalk = kakaotalk[0]["raw_data"] if kakaotalk else None# 유일 (기획상)
def _json(v) -> str | None: def _json(v) -> str | None:
return json.dumps(v, ensure_ascii=False) if v else None return json.dumps(v, ensure_ascii=False) if v else None
@ -42,12 +62,12 @@ async def generate_plan(analysis_run_id: str) -> PlanOutput:
"market_keywords": _json(market.get("keywords")), "market_keywords": _json(market.get("keywords")),
"market_trend": _json(market.get("trend")), "market_trend": _json(market.get("trend")),
"market_target_audience": _json(market.get("target_audience")), "market_target_audience": _json(market.get("target_audience")),
"tiktok": _json(raw.get(SourceType.TIKTOK)), "tiktok": _json(tiktok),
"instagram_en": _json(raw.get(SourceType.INSTAGRAM)), "instagram": _json(instagram),
"facebook_en": _json(raw.get(SourceType.FACEBOOK)), "facebook": _json(facebook),
"naver_blog": _json(_naver_blog_summary(raw.get(SourceType.NAVER_BLOG))), "naver_blog": _json(_naver_blog_summary(naver_blog)),
"naver_cafe": _json(raw.get(SourceType.NAVER_CAFE)), "naver_cafe": _json(naver_cafe),
"kakao_talk": _json(raw.get(SourceType.KAKAOTALK)), "kakao_talk": _json(kakaotalk),
"channel_logos": _json(branding.get("channelLogos")), "channel_logos": _json(branding.get("channelLogos")),
"brand_assets": _json(branding.get("brandAssets")), "brand_assets": _json(branding.get("brandAssets")),
} }
@ -200,7 +220,7 @@ async def _build_other_channels(raw: dict) -> list[dict]:
result: OtherChannelsOutput = await LLMService(provider="perplexity").generate( result: OtherChannelsOutput = await LLMService(provider="perplexity").generate(
other_channels_prompt, other_channels_prompt,
{ {
"clinic_name": (raw.get(SourceType.MAINPAGE) or [{}])[0].get("clinicName"), "clinic_name": (raw.get(SourceType.MAINPAGE) or [{}])[0]["raw_data"].get("clinicName"),
"tiktok": json.dumps(raw.get(SourceType.TIKTOK), ensure_ascii=False), "tiktok": json.dumps(raw.get(SourceType.TIKTOK), ensure_ascii=False),
"kakao_talk": json.dumps(raw.get(SourceType.KAKAOTALK), ensure_ascii=False), "kakao_talk": json.dumps(raw.get(SourceType.KAKAOTALK), ensure_ascii=False),
"naver_cafe": json.dumps(raw.get(SourceType.NAVER_CAFE), ensure_ascii=False), "naver_cafe": json.dumps(raw.get(SourceType.NAVER_CAFE), ensure_ascii=False),

View File

@ -16,7 +16,7 @@ async def _describe_logo(analysis_run_id: str, info_id: int, vc: VisionClient) -
"""공식 로고 정성 묘사. branding raw_info["brandAssets"] 머지. """공식 로고 정성 묘사. branding raw_info["brandAssets"] 머지.
호출 우선순위: raw_info.logo_url 컬럼 (HTML parser canonical) firecrawl 메타 fallback.""" 호출 우선순위: raw_info.logo_url 컬럼 (HTML parser canonical) firecrawl 메타 fallback."""
raw = await select_run_raw_data(analysis_run_id) raw = await select_run_raw_data(analysis_run_id)
mainpage = raw.get("mainpage") or {} mainpage = ((raw.get("mainpage") or [{}])[0].get("raw_data")) or {}
homepage_url = mainpage.get("sourceUrl") or "" homepage_url = mainpage.get("sourceUrl") or ""
branding_meta = mainpage.get("branding") or {} branding_meta = mainpage.get("branding") or {}
column_logo = await select_mainpage_logo_url(analysis_run_id) column_logo = await select_mainpage_logo_url(analysis_run_id)
@ -57,7 +57,7 @@ async def _describe_channel_logos(analysis_run_id: str, info_id: int, vc: Vision
} }
logos = [{"channel": label, "url": img} logos = [{"channel": label, "url": img}
for key, label in _label.items() for key, label in _label.items()
if (img := (raw.get(key) or {}).get("_logo_url"))] if (img := (raw.get(key) or [{}])[0].get("logo_url"))]
if not logos: if not logos:
logger.info("[channel_logos] skip — no channel profileImages") logger.info("[channel_logos] skip — no channel profileImages")
return return

View File

@ -156,7 +156,7 @@ async def collect_kakaotalk(analysis_run_id: str, info_id: int, url: str) -> Non
async def collect_brand_basics(analysis_run_id: str, info_id: int) -> None: async def collect_brand_basics(analysis_run_id: str, info_id: int) -> None:
logger.info("[brand_basics] start run=%s info=%s", analysis_run_id, info_id) logger.info("[brand_basics] start run=%s info=%s", analysis_run_id, info_id)
raw = await select_run_raw_data(analysis_run_id) raw = await select_run_raw_data(analysis_run_id)
mainpage = raw.get("mainpage") or {} mainpage = ((raw.get("mainpage") or [{}])[0].get("raw_data")) or {}
homepage_url = mainpage.get("sourceUrl") or "" homepage_url = mainpage.get("sourceUrl") or ""
branding_meta = mainpage.get("branding") or {} branding_meta = mainpage.get("branding") or {}

View File

@ -82,7 +82,11 @@ def _logo_data(channel_logos: dict, channel: str) -> dict:
for c in (channel_logos or {}).get("channel_logos", []): for c in (channel_logos or {}).get("channel_logos", []):
if c.get("channel") == channel: if c.get("channel") == channel:
return c return c
return {} print("channel_logos NOT FOUND : ", channel_logos)
return {
"is_official" : False,
"logo_description" : "로고 찾지 못함"
}
def _page_patch(item: dict, channel_logos) -> dict: def _page_patch(item: dict, channel_logos) -> dict:
p: dict = {} p: dict = {}

View File

@ -31,7 +31,7 @@ async def run_market_analysis(analysis_run_id: str) -> None:
run = await select_run(analysis_run_id) run = await select_run(analysis_run_id)
clinic = await select_hospital(run["hospital_id"]) clinic = await select_hospital(run["hospital_id"])
raw = await select_run_raw_data(analysis_run_id) raw = await select_run_raw_data(analysis_run_id)
mainpage = raw.get("mainpage") or {} mainpage = ((raw.get("mainpage") or [{}])[0].get("raw_data")) or {}
clinic_name = (clinic or {}).get("hospital_name") or "" clinic_name = (clinic or {}).get("hospital_name") or ""
address = (clinic or {}).get("road_address") or "" address = (clinic or {}).get("road_address") or ""