SAP-ERP-AI-Agent / src /graph /state.py
daisysooyeon's picture
deploy: SAP ERP AI Agent (HF Spaces docker)
50efdc6
Raw
History Blame Contribute Delete
1.96 kB
"""
src/graph/state.py
AgentState ๋ฐ ERPAction TypedDict ์ •์˜
"""
import operator
from typing import Annotated, TypedDict, Literal, Optional, List, Any
class ERPAction(TypedDict):
"""ERP ์ˆ˜์ • ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ"""
order_id: str # ์˜์—… ์˜ค๋” ๋ฒˆํ˜ธ (VBELN, 10์ž๋ฆฌ)
item_no: str # ์•„์ดํ…œ ๋ฒˆํ˜ธ (POSNR, 6์ž๋ฆฌ)
field: str # ๋ณ€๊ฒฝ ํ•„๋“œ (์˜ˆ: KWMENG, EDATU)
new_value: Any # ๋ณ€๊ฒฝ ๊ฐ’
reason: str # ๋ณ€๊ฒฝ ์‚ฌ์œ 
class AgentState(TypedDict):
"""LangGraph ๊ทธ๋ž˜ํ”„ ์ „์ฒด๊ฐ€ ๊ณต์œ ํ•˜๋Š” ์ƒํƒœ ๊ฐ์ฒด"""
# ์ž…๋ ฅ
user_input: str
# ์ „์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ (LangGraph ์ง„์ž… ์ „ entry point์—์„œ ์ฑ„์›Œ์ง)
# ์ž์—ฐ์–ด ์ด๋ฉ”์ผ์„ ๊ตฌ์กฐํ™”ํ•œ EmailContext์˜ .model_dump() ๊ฒฐ๊ณผ โ€” ๋‹ค์Œ ํ•„๋“œ ํฌํ•จ:
# sender_name / sender_email / sender_company / recipient / subject / language
# cleaned_body / request_summary / question_summary
# mentions_action / mentions_question
# order_ids / item_nos
# preprocess_ok / error
# ์—†์œผ๋ฉด(None) ๋‹ค์šด์ŠคํŠธ๋ฆผ ๋…ธ๋“œ๋Š” ์›๋ณธ user_input์„ ์ง์ ‘ ํŒŒ์‹ฑํ•˜๋Š” ๊ธฐ์กด ๋™์ž‘์œผ๋กœ ํด๋ฐฑ.
email_context: Optional[dict]
# ๋ผ์šฐํ„ฐ ์ถœ๋ ฅ
intent: Optional[Literal["ACTION_ONLY", "QA_ONLY", "BOTH"]]
# Worker A
erp_action: Optional[ERPAction]
erp_validation_result: Optional[dict]
erp_action_status: Optional[str] # PENDING_APPROVAL / BLOCKED_* / SUCCESS / REJECTED
odata_response: Optional[dict]
rejection_reason: Optional[str] # ์Šน์ธ์ž๊ฐ€ Slack์—์„œ ์ž…๋ ฅํ•œ ๊ฑฐ์ ˆ ์‚ฌ์œ  (REJECTED ์‹œ)
# Worker B
rag_query: Optional[str]
rag_queries: Optional[List[str]]
retrieved_docs: Optional[List[dict]]
rag_answer: Optional[str]
# ์ตœ์ข… ์ถœ๋ ฅ
final_response: Optional[str]
# ๋ฉ”ํƒ€
error_messages: Annotated[List[str], operator.add]
requires_human_approval: bool
human_approved: Optional[bool]