카카오톡 채널 개설이 법인폰 본인인증에 걸려 보류됐다. 채널이 없으면 대화창은 사장님에게 **어디에도 닿지 않는 입구**이고, 열려 있으면 "되는 기능" 으로 오해한다. - config/agent_config: AGENT_CHAT_ENABLED 신설(기본 0) - runtime.is_configured(): 스위치와 LLM 키를 둘 다 본다 — 화면을 우회해 API 를 직접 불러도 AGENT_NOT_CONFIGURED 다 - AgentChatDock · KakaoChannelCard: 조건 미충족이면 통째로 감춘다(return null). 연결 카드는 connection_enabled 가 기준이라 설정만 채우면 그대로 다시 나타난다 - ★ 코드를 지우지 않았다 — 되돌릴 때 커밋을 되짚지 않고 값 둘만 채우면 된다 ★ Threads 카드와 판단이 갈린 것이 맞다. 저쪽은 사장님이 곧 쓸 수 있는 기능이라 자리를 두고 버튼만 죽였고, 이쪽은 언제 열릴지 말해 줄 수 없다. test_agent_runtime(스위치 2건 추가)·test_kakao_link 34 passed. npm run lint 통과 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
48 lines
2.1 KiB
Python
48 lines
2.1 KiB
Python
"""사장님 에이전트 설정 — 루트 .env 하나만 읽는다(APP_ENV=test 면 .env 를 읽지 않는다).
|
|
|
|
★ SNS 게재(social_config)와 파일을 가른 이유는 도메인이 다르기 때문이다.
|
|
SNS 게재는 **되돌릴 수 없는** 대외 발화이고, 에이전트는 사장님이 자기 사이트를
|
|
고치는 창구다. 승인 강도도 보관하는 것도 다르다 — 설정이 한 파일에 섞이면
|
|
"이 값이 무엇을 여는가" 가 흐려진다.
|
|
"""
|
|
|
|
from pydantic_settings import BaseSettings
|
|
|
|
from config.config_models import _BASE
|
|
|
|
|
|
class AgentConfig(BaseSettings):
|
|
model_config = _BASE
|
|
|
|
# 카카오톡 채널 공개 ID(`_xaBcD` 형태). 사장님이 채널을 찾아 코드를 입력해야 하므로
|
|
# ★ 이 값이 없으면 연결 화면 자체를 열지 않는다 — 어디에 코드를 칠지 말해 줄 수
|
|
# 없는데 코드만 발급하면, 사장님에게는 고장난 화면이다(Threads 카드와 같은 규칙).
|
|
KAKAO_CHANNEL_PUBLIC_ID: str = ""
|
|
# 코드 수명. 사장님이 화면을 보고 카톡을 열어 치는 동작이라 짧아도 된다.
|
|
KAKAO_LINK_CODE_TTL_MIN: int = 10
|
|
# 코드가 짧아서(사람이 손으로 친다) 무차별 대입이 가능하다. 시도 수로 끊는다.
|
|
KAKAO_LINK_MAX_ATTEMPTS: int = 5
|
|
|
|
# ★ 기본 꺼짐. 카카오톡 채널 개설이 법인폰 본인인증에 걸려 보류됐고(2026-09-21),
|
|
# 채널 없이 대화창만 띄우면 사장님에게는 **어디에도 닿지 않는 입구**가 된다.
|
|
# 코드는 그대로 두고 이 값으로만 연다 — 되돌릴 때 커밋을 되짚지 않아도 된다.
|
|
AGENT_CHAT_ENABLED: str = "0"
|
|
|
|
|
|
def get(name, default=""):
|
|
return getattr(AgentConfig(), name, default) or default
|
|
|
|
|
|
def chat_enabled() -> bool:
|
|
return get("AGENT_CHAT_ENABLED", "0") == "1"
|
|
|
|
|
|
def kakao_link_enabled() -> bool:
|
|
return bool(get("KAKAO_CHANNEL_PUBLIC_ID"))
|
|
|
|
|
|
def channel_url() -> str:
|
|
"""사장님이 눌러서 채널로 가는 주소. 공개 ID 가 없으면 빈 문자열이다."""
|
|
public_id = get("KAKAO_CHANNEL_PUBLIC_ID")
|
|
return f"http://pf.kakao.com/{public_id}" if public_id else ""
|