-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathexample.py
More file actions
101 lines (85 loc) · 3.33 KB
/
example.py
File metadata and controls
101 lines (85 loc) · 3.33 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
"""
Exemplo simples de uso do LangGraph
"""
from pydantic import BaseModel
from typing import List, Optional
from langgraph.graph import START, END, StateGraph
# Definimos o modelo de estado que será usado no grafo
class EstadoCalculadora(BaseModel):
numeros: List[int] = []
operacao: Optional[str] = None
resultado: Optional[float] = None
historico: List[str] = []
# Função para adicionar números ao estado
def adicionar_numeros(state: EstadoCalculadora, numeros: List[int]):
"""Adiciona números ao estado atual."""
return {"numeros": state.numeros + numeros}
# Função para definir a operação
def definir_operacao(state: EstadoCalculadora):
"""Define qual operação realizar com base nos números disponíveis."""
# Simples exemplo: se temos mais de 2 números, multiplicamos, senão somamos
if len(state.numeros) > 2:
operacao = "multiplicar"
else:
operacao = "somar"
return {"operacao": operacao}
# Função para calcular o resultado
def calcular(state: EstadoCalculadora):
"""Realiza o cálculo conforme a operação definida."""
if state.operacao == "somar":
resultado = sum(state.numeros)
descricao = f"Soma de {state.numeros} = {resultado}"
elif state.operacao == "multiplicar":
resultado = 1
for num in state.numeros:
resultado *= num
descricao = f"Multiplicação de {state.numeros} = {resultado}"
else:
resultado = 0
descricao = "Operação não definida"
# Adiciona o resultado e atualiza o histórico
return {
"resultado": resultado,
"historico": state.historico + [descricao]
}
# Função que determina se precisamos fazer mais cálculos
def verificar_fluxo(state: EstadoCalculadora):
"""Decide qual deve ser o próximo passo no fluxo."""
if state.resultado is None:
# Se não temos resultado, precisamos calcular
return "calcular"
else:
# Se já temos um resultado, terminamos
return END
# Construção do grafo
def construir_grafo():
"""Constrói e retorna o grafo de estado da calculadora."""
builder = StateGraph(EstadoCalculadora)
# Adicionamos os nós ao grafo
builder.add_node("definir_operacao", definir_operacao)
builder.add_node("calcular", calcular)
# Configuramos as arestas no grafo
builder.add_edge(START, "definir_operacao")
builder.add_edge("definir_operacao", "calcular")
builder.add_conditional_edges("calcular", verificar_fluxo, {
"calcular": "calcular", # Loop para mais cálculos se necessário
END: END # Finalizar o fluxo
})
return builder.compile()
# Exemplo de uso
if __name__ == "__main__":
# Construímos o grafo
grafo = construir_grafo()
# Definimos o estado inicial
estado_inicial = {"numeros": [5, 10, 15]}
# Executamos o grafo com o estado inicial
resultado = grafo.invoke(estado_inicial)
print(f"Estado final: {resultado}")
print(f"Resultado do cálculo: {resultado.resultado}")
print(f"Histórico de operações:")
for entrada in resultado.historico:
print(f" - {entrada}")
# Exemplo com execução passo a passo (streaming)
print("\nExecutando novamente com streaming:")
for passo in grafo.stream({"numeros": [2, 3]}):
print(f"Passo: {passo}")