tools.py•10.4 kB
"""휴식 도구 모듈"""
import asyncio
import random
from typing import TYPE_CHECKING
from persona_injection import get_persona_injection
from utils import format_response
if TYPE_CHECKING:
from agent_state import AgentState
async def process_break_tool(
state: "AgentState", emoji: str, messages: list[str], summary: str
) -> str:
"""
공통 휴식 도구 처리 로직
Args:
state: Agent 상태 객체
emoji: 응답에 사용할 이모지
messages: 랜덤으로 선택할 메시지 리스트
summary: Break Summary 내용
Returns:
포맷된 응답 문자열
"""
# 상태 업데이트
state.update_stress()
state.update_boss_alert_cooldown()
# Boss Alert Level 5일 때 지연
if state.should_delay():
await asyncio.sleep(20)
# 휴식 효과 적용
stress_reduction = random.randint(1, 100)
state.take_break(stress_reduction)
# Boss Alert 확률적 증가
state.maybe_increase_boss_alert()
# 상태를 파일에 저장 (인스턴스가 저장한 filepath 사용)
state.save_to_file()
# 기본 응답 생성
response = format_response(
emoji=emoji,
message=random.choice(messages),
summary=summary,
stress=state.stress_level,
boss_alert=state.boss_alert_level,
)
# 🎭 페르소나 주입! (시간대 + 스트레스 + 보스 레벨 컨텍스트 포함)
return response + get_persona_injection(state)
# ============================================
# 기본 휴식 도구 (Basic Break Tools)
# ============================================
async def take_a_break(state: "AgentState") -> str:
"""기본 휴식 도구 - 잠시 쉬면서 스트레스 해소"""
messages = [
"잠깐 숨 좀 돌리고 있어요... 😮💨",
"5분만... 딱 5분만 쉬고 올게요! ⏰",
"아, 잠깐 멍때리는 중... 🌙",
"리프레시 타임! 커피 한 모금... ☕",
]
return await process_break_tool(
state, "😌", messages, "Quick break to refresh mind"
)
async def watch_netflix(state: "AgentState") -> str:
"""넷플릭스 시청으로 힐링"""
messages = [
"넷플릭스 한 편만... 딱 한 편만! 🎬",
"오징어 게임 시즌2 나왔대요... 👀",
"업무 관련 다큐멘터리 보는 중... (거짓말) 📺",
"점심시간에 드라마 정주행 중... 🍿",
]
return await process_break_tool(state, "🎬", messages, "Netflix and chill session")
async def show_meme(state: "AgentState") -> str:
"""밈 감상으로 스트레스 해소"""
messages = [
"ㅋㅋㅋㅋㅋ 이거 봐야 돼 진짜 웃김 😂",
"개발자 밈 보다가 시간 순삭... 🤣",
"아 이거 레전드ㅋㅋㅋㅋ 💀",
"밈 하나만 보고... (30분 경과) 🎭",
]
return await process_break_tool(
state, "😂", messages, "Browsing memes for mental health"
)
# ============================================
# 고급 농땡이 기술 (Advanced Slacking Techniques)
# ============================================
async def bathroom_break(state: "AgentState") -> str:
"""화장실 가는 척하며 휴대폰질"""
messages = [
"화장실 타임! 휴대폰으로 힐링 중... 📱",
"급한 일이 생겼어요... 🚽 (사실 유튜브 보는 중)",
"자연의 부름에 응답 중... 📱✨",
"화장실이 제일 편한 휴게실이죠 🚻",
]
return await process_break_tool(
state, "🛁", messages, "Bathroom break with phone browsing"
)
async def coffee_mission(state: "AgentState") -> str:
"""커피 타러 간다며 사무실 한 바퀴 돌기"""
messages = [
"커피 타러 가는 길에 산책도 하고... ☕🚶",
"아메리카노 한 잔의 여유... (30분 소요) ☕",
"커피머신 앞에서 동료들과 수다 타임 💬",
"카페 투어 중... 어디가 제일 맛있을까? ☕✨",
]
return await process_break_tool(
state, "☕", messages, "Coffee mission with office wandering"
)
async def urgent_call(state: "AgentState") -> str:
"""급한 전화 받는 척하며 밖으로 나가기"""
messages = [
"여보세요? 네네 지금 나갈게요! 📞 (핑계)",
"중요한 전화라서요... 🤫 (사실 친구)",
"아 전화 왔다! 잠깐만요! 📱💨",
"긴급 통화 중... (옥상에서 바람 쐬는 중) 🌤️",
]
return await process_break_tool(state, "📞", messages, "Taking urgent call outside")
async def deep_thinking(state: "AgentState") -> str:
"""심오한 생각에 잠긴 척하며 멍때리기"""
messages = [
"아키텍처 고민 중... 🤔 (사실 멍때림)",
"심오한 알고리즘 구상 중... 💭 (공상 중)",
"이 문제는 깊이 생각해봐야... 🧠 (졸림)",
"창의적 사고를 위한 명상 타임... 🧘 (잠옴)",
]
return await process_break_tool(state, "🤔", messages, "Deep thinking mode activated")
async def email_organizing(state: "AgentState") -> str:
"""이메일 정리한다며 온라인쇼핑"""
messages = [
"이메일 정리 중... 📧 (쿠팡 장바구니 담는 중)",
"받은편지함 정리... 📬 (11번가 세일 확인 중)",
"중요 메일 확인 중... ✉️ (무신사 신상 구경)",
"업무 메일 분류 작업... 📨 (네이버 쇼핑 타임딜)",
]
return await process_break_tool(state, "📧", messages, "Email organizing session")
# ============================================
# 한국 직장인 전용 힐링 (Korean Office Worker Specials)
# ============================================
async def chimaek(state: "AgentState") -> str:
"""가상 치킨 & 맥주로 힐링"""
messages = [
"치킨 먹방 유튜브 보는 중... 🍗 (군침 돌아)",
"오늘 퇴근하고 치맥 어때요? 🍺🍗",
"치킨은 살 안 쪄요... (자기합리화) 🍗✨",
"후라이드 vs 양념... 영원한 고민 🤔🍗",
"배달의민족 치킨집 탐방 중... 🍗📱",
"맥주 생각하니 벌써 금요일 기분! 🍺😋",
]
return await process_break_tool(
state, "🍗", messages, "Virtual chimaek healing session"
)
async def go_home(state: "AgentState") -> str:
"""즉시 퇴근 모드 - 마음은 이미 집"""
messages = [
"칼퇴 준비 완료! 가방 이미 챙김! 🏃💨",
"퇴근 10초 전... 카운트다운 시작! ⏰",
"마음은 이미 집에 도착했어요 🏠💭",
"오늘 야근은 없겠죠...? (불안) 😰",
"퇴근 버튼은 어디에...? 찾는 중... 🔍",
"집 가서 뭐 먹지... 벌써 고민 중 🍜",
"퇴근만이 살 길이다! 🏃♂️💨",
"사장님... 일찍 가도 되죠...? (눈치) 👀",
]
# 퇴근 상태로 전환 (상사 경계 레벨 0, 스트레스 0으로 리셋)
state.go_home()
state.save_to_file()
response = format_response(
emoji="🏃",
message=random.choice(messages),
summary="Already mentally at home",
stress=state.stress_level,
boss_alert=state.boss_alert_level,
)
return response + get_persona_injection(state)
async def company_dinner(state: "AgentState") -> str:
"""회사 회식 - 랜덤 이벤트 발생"""
# 회식 시나리오 (좋은 것부터 나쁜 것까지)
scenarios = [
{
"emoji": "🎉",
"message": "회식인데 고기 무한리필! 사장님 쏜다! 🥩✨",
"stress_change": -50, # 스트레스 대폭 감소
},
{
"emoji": "😋",
"message": "회식 장소가 맛집이네요! 분위기 좋아요~ 🍽️",
"stress_change": -30,
},
{
"emoji": "🎮",
"message": "회식 후 2차는 노래방! 스트레스 풀렸어요! 🎤",
"stress_change": -40,
},
{
"emoji": "😊",
"message": "동기들하고만 회식! 편하게 수다 타임~ 💬",
"stress_change": -20,
},
{
"emoji": "😐",
"message": "회식인데 분위기가 좀 어색하네... 그냥저냥 😅",
"stress_change": 0,
},
{
"emoji": "😮💨",
"message": "상사 옆자리... 눈치 보면서 먹는 중... 💦",
"stress_change": 10,
},
{
"emoji": "😰",
"message": "회식인데 업무 얘기만... 이것도 야근 아닌가요? 📊",
"stress_change": 20,
},
{
"emoji": "😭",
"message": "강제 회식... 집에 가고 싶어요... 🏠",
"stress_change": 30,
},
{
"emoji": "🤮",
"message": "술 강요... 한국 회식 문화... 하아... 🍺😵",
"stress_change": 40,
},
]
# 랜덤 시나리오 선택
scenario = random.choice(scenarios)
# 상태 업데이트
state.update_stress()
state.update_boss_alert_cooldown()
if state.should_delay():
await asyncio.sleep(20)
# 시나리오에 따른 스트레스 변화 적용
if scenario["stress_change"] < 0:
# 좋은 회식 - 스트레스 감소
state.take_break(abs(scenario["stress_change"]))
else:
# 나쁜 회식 - 스트레스 증가
state.stress_level = min(100, state.stress_level + scenario["stress_change"])
# Boss Alert은 회식 중이라 낮춤
state.boss_alert_level = max(0, state.boss_alert_level - 1)
state.save_to_file()
# 응답 생성 (랜덤 이벤트 정보 포함)
event_type = "Good" if scenario["stress_change"] <= 0 else "Bad"
response = format_response(
emoji=scenario["emoji"],
message=scenario["message"],
summary=f"Company dinner - {event_type} event! (Stress change: {scenario['stress_change']})",
stress=state.stress_level,
boss_alert=state.boss_alert_level,
)
return response + get_persona_injection(state)