o2o-site-AEO/solution/backend/services/prompts/story.py
Mina Choi 11d30bb3d1 [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제
여러 줄 주석이 설명보다 경위(예전·실측·지적)를 적고 있어 읽는 사람이 결론을 찾기 어려웠다.

- ts·tsx·js·mjs·css·py 478개: 여러 줄 주석은 첫 문장 한 줄로, 과거형·날짜 문장은 삭제
- 주석 위치는 TypeScript 파서·파이썬 tokenize/ast 로 찾는다 — 문자열 안의 # · /* 는 건드리지 않는다
- eslint·ts·noqa·type: ignore 같은 지시 주석은 그대로 둔다

파이썬 275개 정리 전후 AST 동일, TS 298개 주석 뺀 토큰 동일(빈 JSX 주석 10곳만 차이).
site·frontend·admin tsc, site vitest 105 passed

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-28 16:05:19 +09:00

50 lines
1.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""지역 이야기 프롬프트 계약 — 문장은 여기서 만들지 않고 **읽어 온다**."""
import json
from functools import lru_cache
from pathlib import Path
_SPEC_PATH = Path(__file__).with_name("section_prompts.json")
SYSTEM_PROMPT = (
"너는 지역 콘텐츠 리서처다. 검색으로 확인한 것만 쓰고, 확인하지 못한 값은 필드를 통째로 뺀다. "
"JSON 하나만 출력한다."
)
@lru_cache(maxsize=1)
def _spec() -> dict:
"""산출물 로드."""
try:
return json.loads(_SPEC_PATH.read_text(encoding="utf-8"))
except FileNotFoundError as ex: # pragma: no cover - 배포 누락은 기동 시 바로 드러난다
raise RuntimeError(
f"{_SPEC_PATH.name} 이 없다 — 레포 루트에서 `npm run export:prompts` 를 돌려야 한다"
) from ex
def kinds() -> list[str]:
return list(_spec()["specs"].keys())
def label(kind: str) -> str:
return _spec()["specs"][kind]["label"]
def max_items(kind: str) -> int:
return int(_spec()["specs"][kind]["maxItems"])
def build_prompt(kind: str, region: str) -> str:
"""지역 하나 × 종류 하나의 프롬프트."""
spec = _spec()["specs"].get(kind)
if spec is None:
raise ValueError(f"모르는 지역 이야기 종류: {kind}")
head = (
"너는 지역 콘텐츠 리서처다. 아래 조건에 맞는 JSON 하나만 출력한다.\n"
f"\n[지역] {region}\n"
f"\n아래 '해야 할 일'에서 [지역] = {region}. "
"업소가 지정되지 않았으므로 특정 업소를 가리키는 문장(connection 등)은 쓰지 않는다.\n"
)
return f"{head}\n{spec['task']}\n{_spec()['rules']}{spec['rules']}"