# Componentes de LangGraph

Para crear aplicaciones con LangGraph necesitas conocer sus elementos principales. Exploremos los componentes fundamentales que conforman una aplicacion con LangGraph.

Una aplicación en LangGraph empieza con una  **entrada**, y dependiendo de la ejecución, el flujo puede ir a una función o a otra hasta que llega al FINAL.

## 1. Estado(State)
**Estado(State)** es un concepto central en LangGraphh. Representa toda la información que fluye a traves de la aplicación. 

```python
from typing_extensions import TypedDict

class State(TypedDict):
    graph_state: str
```

El estado es **definido por el usuario**, es por eso que los campos deben contruirse cuidadosamente para contener toda la información necesaria para el proceso de toma de decisiones!

> 💡 **Tip:** Piensa cuidadosamente que información necesita tu aplicación para rastrear entre pasos.

## 2. Nodos(Nodes)

**Nodos(Nodes)** son funciones de python. Cada nodo:
- Toma el estado como entrada
- Realiza alguna operación
- Regresa actualizaciones al estado

```python
def node_1(state):
    print("---Node 1---")
    return {"graph_state": state['graph_state'] +" Yo estoy"}

def node_2(state):
    print("---Node 2---")
    return {"graph_state": state['graph_state'] +" feliz!"}

def node_3(state):
    print("---Node 3---")
    return {"graph_state": state['graph_state'] +" triste!"}
```

Por ejemplo, los nodos pueden contener:
- **llamadas a LLM**: Generar texto o tomar decisiones
- **llamadas a Tool**: Interactuar con sistemas externos
- **Lógica Condicional**: Determinar los siguientes pasos
- **Intervención Humana**: Obtener datos del usuario

> 💡 **Info:** Algunos nodos necesarios para el flujo completo como START y END existen directamente desde langGraph.

## 3. Aristas (Edges)

**Aristas (Edges)** conectan nodos y definen los posibles caminos a través de tu grafo:

```python
import random
from typing import Literal

def decide_mood(state) -> Literal["node_2", "node_3"]:
    
    # A menudo, usaremos el estado para decidir el próximo nodo a visitar
    usuario_entrada = state['graph_state'] 

    # Aquí, hagamos simplemente una división 50 / 50 entre los nodos 2, 3
    if random.random() 

Pero lo más importante, invocado::
```python
graph.invoke({"graph_state" : "Hola, soy Lance."})
```
output :
```
---Node 1---
---Node 3---
{'graph_state': 'Hola, soy Lance. ¡Estoy triste!'}
```

## ¿Qué sigue?

En la siguiente sección, pondremos estos conceptos en práctica construyendo nuestro primer grafo. Este grafo permite a Alfred recibir tus correos electrónicos, clasificarlos y elaborar una respuesta preliminar si son genuinos.

