feat(agent-office): LottoAgent 등록 + seed + 텔레그램 메타

This commit is contained in:
2026-04-15 08:28:10 +09:00
parent cc17c29266
commit 7c4d7b4534
4 changed files with 51 additions and 0 deletions

View File

@@ -2,6 +2,7 @@ from .stock import StockAgent
from .music import MusicAgent from .music import MusicAgent
from .blog import BlogAgent from .blog import BlogAgent
from .realestate import RealestateAgent from .realestate import RealestateAgent
from .lotto import LottoAgent
AGENT_REGISTRY = {} AGENT_REGISTRY = {}
@@ -10,6 +11,7 @@ def init_agents():
AGENT_REGISTRY["music"] = MusicAgent() AGENT_REGISTRY["music"] = MusicAgent()
AGENT_REGISTRY["blog"] = BlogAgent() AGENT_REGISTRY["blog"] = BlogAgent()
AGENT_REGISTRY["realestate"] = RealestateAgent() AGENT_REGISTRY["realestate"] = RealestateAgent()
AGENT_REGISTRY["lotto"] = LottoAgent()
def get_agent(agent_id: str): def get_agent(agent_id: str):
return AGENT_REGISTRY.get(agent_id) return AGENT_REGISTRY.get(agent_id)

View File

@@ -0,0 +1,44 @@
from .base import BaseAgent
from ..db import create_task, update_task_status, add_log
from ..curator.pipeline import curate_weekly, CuratorError
class LottoAgent(BaseAgent):
agent_id = "lotto"
display_name = "로또 큐레이터"
async def on_schedule(self) -> None:
if self.state not in ("idle", "break"):
return
await self._run(source="auto")
async def on_command(self, action: str, params: dict) -> dict:
if action in ("curate_now", "curate_weekly"):
return await self._run(source="manual")
if action == "status":
return {"ok": True, "message": f"{self.state}: {self.state_detail}"}
return {"ok": False, "message": f"unknown action: {action}"}
async def on_approval(self, task_id: str, approved: bool, feedback: str = "") -> None:
pass
async def _run(self, source: str) -> dict:
task_id = create_task(self.agent_id, "curate_weekly", {"source": source})
await self.transition("working", "후보 수집 및 AI 큐레이션 중...", task_id)
try:
result = await curate_weekly(source=source)
update_task_status(task_id, "succeeded", result_data=result)
await self.transition("reporting", f"#{result['draw_no']} 브리핑 저장 완료")
add_log(self.agent_id, f"큐레이션 완료: #{result['draw_no']} conf={result['confidence']}", task_id=task_id)
await self.transition("idle", "대기 중")
return {"ok": True, **result}
except CuratorError as e:
update_task_status(task_id, "failed", result_data={"error": str(e)})
add_log(self.agent_id, f"큐레이션 실패: {e}", level="error", task_id=task_id)
await self.transition("idle", "오류")
return {"ok": False, "message": str(e)}
except Exception as e:
update_task_status(task_id, "failed", result_data={"error": str(e)})
add_log(self.agent_id, f"큐레이션 예외: {e}", level="error", task_id=task_id)
await self.transition("idle", "오류")
return {"ok": False, "message": f"{type(e).__name__}: {e}"}

View File

@@ -92,6 +92,7 @@ def init_db() -> None:
("music", "음악 프로듀서"), ("music", "음악 프로듀서"),
("blog", "블로그 마케터"), ("blog", "블로그 마케터"),
("realestate", "청약 애널리스트"), ("realestate", "청약 애널리스트"),
("lotto", "로또 큐레이터"),
]: ]:
conn.execute( conn.execute(
"INSERT OR IGNORE INTO agent_config(agent_id, display_name) VALUES(?,?)", "INSERT OR IGNORE INTO agent_config(agent_id, display_name) VALUES(?,?)",

View File

@@ -11,6 +11,10 @@ AGENT_META = {
"emoji": "🎵", "emoji": "🎵",
"color": "#44aa88", "color": "#44aa88",
}, },
"lotto": {
"emoji": "🎱",
"display_name": "로또 큐레이터",
},
} }