| """ |
| graph/state.py — Merkezi Konuşma Durumu (State Machine Pattern) |
| |
| AGENTIC PATTERN: State Machine |
| ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ |
| LangGraph'ta her şey bir "state" etrafında döner. Bu TypedDict: |
| - Konuşmanın hangi adımında olduğumuzu (current_step) |
| - Hangi slot'ların dolu olduğunu (invoice_amount, vehicle_model vb.) |
| - Konuşma geçmişini (messages) |
| - Hata ve meta bilgilerini |
| tüm agent'lar arasında paylaşılan tek gerçek kaynaktır. |
| |
| Her node bu state'i okur, değiştirir ve geri yazar. |
| LangGraph, iki çağrı arasında state'i otomatik saklar (MemorySaver ile). |
| """ |
| from __future__ import annotations |
| from typing import Literal, Optional |
| from typing_extensions import TypedDict |
| from langchain_core.messages import BaseMessage |
|
|
|
|
| class ConversationState(TypedDict): |
| """ |
| Bir oturumun tüm bilgisini taşıyan merkezi veri yapısı. |
| |
| LangGraph bu TypedDict'i her node çağrısında günceller ve |
| bir sonraki node'a aktarır. Siz node fonksiyonlarında |
| sadece değişen alanları döndürmeniz yeterlidir. |
| """ |
|
|
| |
| session_id: str |
| current_step: str |
|
|
| |
| vehicle_type: Optional[Literal["new", "used"]] |
|
|
| |
| invoice_amount: Optional[float] |
| vehicle_model: Optional[str] |
| vehicle_model_type: Optional[Literal["binek", "ticari"]] |
| requested_amount_new: Optional[float] |
| guarantor_tckn: Optional[str] |
| kefil_required: bool |
|
|
| |
| kasko_value: Optional[float] |
| vehicle_age: Optional[int] |
| requested_amount_used: Optional[float] |
| seller_tckn: Optional[str] |
|
|
| |
| messages: list[BaseMessage] |
|
|
| |
| application_id: Optional[str] |
| hgs_consent: Optional[bool] |
| errors: list[str] |
| flow_ended: bool |
|
|
| |
| |
| |
| faq_snapshot: Optional[dict] |
|
|
| |
| recap_confirmed: bool |
| edit_target_slot: Optional[str] |
|
|
| |
| |
| |
| |
| awaited_slot: Optional[str] |
|
|
|
|
| def create_initial_state(session_id: str) -> ConversationState: |
| """ |
| Yeni bir oturum için boş başlangıç state'i döndürür. |
| Tüm slot'lar None, tüm listeler boş, bool'lar False. |
| """ |
| return ConversationState( |
| session_id=session_id, |
| current_step="start", |
| vehicle_type=None, |
| invoice_amount=None, |
| vehicle_model=None, |
| vehicle_model_type=None, |
| requested_amount_new=None, |
| guarantor_tckn=None, |
| kefil_required=False, |
| kasko_value=None, |
| vehicle_age=None, |
| requested_amount_used=None, |
| seller_tckn=None, |
| messages=[], |
| application_id=None, |
| hgs_consent=None, |
| errors=[], |
| flow_ended=False, |
| faq_snapshot=None, |
| recap_confirmed=False, |
| edit_target_slot=None, |
| awaited_slot=None, |
| ) |
|
|