umyunsang's picture
Upload folder using huggingface_hub
90dad19 verified
"""GovOn LangGraph state schema.
v4 ์•„ํ‚คํ…์ฒ˜: ReAct ๊ธฐ๋ฐ˜ messages-only state.
๋ชจ๋“  ๋„๊ตฌ ๊ฒฐ๊ณผ๋Š” messages(ToolMessage)๋กœ ๋™์  ๋ˆ„์ ๋˜๋ฉฐ,
ํŠน์ • ๋„๊ตฌ๋ช…์„ state์— ํ•˜๋“œ์ฝ”๋”ฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
"""
from __future__ import annotations
from enum import Enum
from typing import Annotated, Any, Dict, List, Optional, Sequence
from langchain_core.messages import AnyMessage
from langgraph.graph.message import add_messages
from typing_extensions import TypedDict
def _merge_dicts(a: Dict[str, Any], b: Dict[str, Any]) -> Dict[str, Any]:
"""๋‘ dict๋ฅผ ๋ณ‘ํ•ฉํ•˜๋Š” reducer.
LangGraph state์—์„œ ์—ฌ๋Ÿฌ ๋…ธ๋“œ๊ฐ€ ๋™์ผ ํ‚ค์— ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
ํ›„ํ–‰ dict(b)์˜ ๊ฐ’์ด ์„ ํ–‰ dict(a)๋ฅผ ๋ฎ์–ด์“ด๋‹ค.
"""
merged = dict(a) if a else {}
if b:
merged.update(b)
return merged
def _append_list(a: List, b: List) -> List:
"""๋ฆฌ์ŠคํŠธ๋ฅผ appendํ•˜๋Š” reducer (๊ธฐ์กด ํ•ญ๋ชฉ ๋ณด์กด)."""
return (a or []) + (b or [])
class ApprovalStatus(str, Enum):
"""human-in-the-loop ์Šน์ธ ์ƒํƒœ."""
PENDING = "pending"
APPROVED = "approved"
REJECTED = "rejected"
class GovOnGraphState(TypedDict, total=False):
"""GovOn LangGraph graph state (v4).
ReAct ๋ฃจํ”„ ๊ธฐ๋ฐ˜. ๋ชจ๋“  ๋„๊ตฌ ํ˜ธ์ถœ/๊ฒฐ๊ณผ๋Š” messages์— ๋ˆ„์ ๋œ๋‹ค.
"""
# --- ์„ธ์…˜ ์‹๋ณ„ ---
session_id: str
request_id: str
# --- LangGraph ํ•ต์‹ฌ: messages ๋ˆ„์  (ReAct ๋ฃจํ”„) ---
messages: Annotated[Sequence[AnyMessage], add_messages]
# --- Human-in-the-Loop ---
approval_status: str # ApprovalStatus.value
# --- ์ตœ์ข… ์ถœ๋ ฅ ---
final_text: str
evidence_items: List[Dict[str, Any]]
# --- ์—๋Ÿฌ/์ธํ„ฐ๋ŸฝํŠธ ---
error: Optional[str]
interrupt_reason: Optional[str]
# --- ๋ ˆ์ดํ„ด์‹œ ๊ณ„์ธก ---
node_latencies: Annotated[Dict[str, float], _merge_dicts]
# --- ReAct v3 ๋ฃจํ”„ ์ œ์–ด ---
iteration_count: int # ํ˜„์žฌ agentโ†’tools ์‚ฌ์ดํด ํšŸ์ˆ˜ (0๋ถ€ํ„ฐ ์‹œ์ž‘)
max_iterations: int # ์ตœ๋Œ€ ํ—ˆ์šฉ iteration ์ˆ˜ (๊ธฐ๋ณธ 10)
# --- v3 ๋„๊ตฌ ํ˜ธ์ถœ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ---
tool_call_history: Annotated[List[Dict[str, Any]], _append_list]
# ๊ฐ ํ•ญ๋ชฉ: {"iteration": int, "tool": str, "latency_ms": float, "success": bool, "timestamp": str}
# --- v3 ์œ„ํ—˜๋„ ๊ธฐ๋ฐ˜ ์Šน์ธ ์ •์ฑ… ---
pending_tool_calls: List[Dict[str, Any]] # agent๊ฐ€ ์ƒ์„ฑํ•œ tool_calls (OpenAI format)