- stock-lab: POST /api/stock/news/summarize 추가 (Ollama /api/generate 호출, 토큰/duration 추적)
- agent-office: telegram 패키지 분해 (client/formatter/messaging/webhook/router/agent_registry)
- send_agent_message 통합 API로 에이전트 중립 메시지 포맷 표준화
- 텔레그램 → 에이전트 명령 라우터 (/status, /stock news, /music credits 등)
- 토큰 사용량 집계 API 및 GET /agents/{id}/token-usage
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
47 lines
1.6 KiB
Python
47 lines
1.6 KiB
Python
import httpx
|
|
from typing import Any, Dict, List, Optional
|
|
|
|
from .config import STOCK_LAB_URL, MUSIC_LAB_URL
|
|
|
|
_client = httpx.AsyncClient(timeout=30.0)
|
|
|
|
async def fetch_stock_news(limit: int = 10, category: str = None) -> List[Dict[str, Any]]:
|
|
params = {"limit": limit}
|
|
if category:
|
|
params["category"] = category
|
|
resp = await _client.get(f"{STOCK_LAB_URL}/api/stock/news", params=params)
|
|
resp.raise_for_status()
|
|
return resp.json()
|
|
|
|
async def fetch_stock_indices() -> Dict[str, Any]:
|
|
resp = await _client.get(f"{STOCK_LAB_URL}/api/stock/indices")
|
|
resp.raise_for_status()
|
|
return resp.json()
|
|
|
|
async def summarize_stock_news(limit: int = 15) -> Dict[str, Any]:
|
|
"""stock-lab의 AI 요약 엔드포인트 호출.
|
|
반환: {"summary": str, "tokens": {...}, "model": str, "duration_ms": int, "article_count": int}
|
|
"""
|
|
async with httpx.AsyncClient(timeout=90.0) as client:
|
|
resp = await client.post(
|
|
f"{STOCK_LAB_URL}/api/stock/news/summarize",
|
|
json={"limit": limit},
|
|
)
|
|
resp.raise_for_status()
|
|
return resp.json()
|
|
|
|
async def generate_music(payload: dict) -> Dict[str, Any]:
|
|
resp = await _client.post(f"{MUSIC_LAB_URL}/api/music/generate", json=payload)
|
|
resp.raise_for_status()
|
|
return resp.json()
|
|
|
|
async def get_music_status(task_id: str) -> Dict[str, Any]:
|
|
resp = await _client.get(f"{MUSIC_LAB_URL}/api/music/status/{task_id}")
|
|
resp.raise_for_status()
|
|
return resp.json()
|
|
|
|
async def get_music_credits() -> Dict[str, Any]:
|
|
resp = await _client.get(f"{MUSIC_LAB_URL}/api/music/credits")
|
|
resp.raise_for_status()
|
|
return resp.json()
|