Exemplos práticos
Configuração inicial
Para iniciar o uso do SDK PLDPro, você precisa configurar o cliente com as informações de conexão e autenticação. Veja um exemplo básico de como fazer isso:
from pldpro_sdk import SDKConfig, PLDProClient
client = PLDProClient(
SDKConfig(host="https://server-pldpro-api/v1", retries=3),
tenant_code="tenant_Code",
api_key="api_key"
)
O tenant_code é um parâmetro obrigatório que identifica a empresa do usuário; caso não seja informado, o SDK retornará um erro. Por exemplo, se você trabalha no CEPEL, seu tenant_code seria "cepel". Esse mesmo raciocínio se aplica aos demais clientes.
Boas práticas
Para casos em que há somente a necessidade de configurar um cliente simples, é recomendado utilizar variáveis de ambiente para armazenar informações sensíveis, como a chave de API. Isso evita que essas informações fiquem expostas diretamente no código-fonte.
Crie um arquivo .env na raiz do seu projeto com o seguinte conteúdo:
API_KEY=api_209
HOST=http://localhost:8080/v1
RETRIES=3
Em seguida, você pode criar uma função para carregar essas variáveis e configurar o cliente:
import os
from pldpro_sdk import SDKConfig, PLDProClient
from dotenv import load_dotenv
load_dotenv()
def create_client_from_env():
api_key = os.getenv("API_KEY")
host = os.getenv("HOST", "http://localhost:8080/v1")
retries = int(os.getenv("RETRIES", "3"))
if not api_key:
raise ValueError("A variável de ambiente 'API_KEY' não está definida.")
return PLDProClient(SDKConfig(host=host, retries=retries), api_key)
Por fim o usuário pode criar o cliente chamando a função create_client_from_env():
client = create_client_from_env()
Cadastro de Node
Após o cliente estar configurado, você pode cadastrar um novo node na plataforma PLDPro. O exemplo abaixo demonstra como garantir que um node seja criado.
from pldpro_sdk import SDKConfig, PLDProClient
from pldpro_sdk.api_client.models import (NodeRequest)
from pldpro_sdk.api_client.models.execution_mode import ExecutionMode
def create_client_from_env():
api_key = os.getenv("API_KEY")
host = os.getenv("HOST")
retries = int(os.getenv("RETRIES"))
if not api_key:
raise ValueError("A variável de ambiente 'API_KEY' não está definida.")
return PLDProClient(SDKConfig(host=host, retries=retries), api_key)
client = create_client_from_env()
node_request = NodeRequest(
nome="Node Example",
ip="",
dns="node.example.br",
porta=22,
modoExecucao=ExecutionMode.CONTAINER)
node = client.nodes.register(node_request)
Para listar todos os host cadastrados, você pode usar o seguinte código:
nodes = client.nodes.list_nodes()
for n in nodes:
print(f"Node UUID: {n.uuid}, Nome: {n.nome}, DNS: {n.dns}, IP: {n.ip}, Porta: {n.porta}")
Boas Práticas
Para garantir que na criação de um novo node não seja duplicado, você pode implementar uma lógica para verificar se um node com a mesma combinação de (IP/DNS + porta) já existe antes de tentar cadastrá-lo. O exemplo completo está disponível abaixo:
def get_or_create_node(client: PLDProClient, node_request: NodeRequest):
"""
Garante que exista um node com a mesma combinação de (IP/DNS + porta).
Se existir, retorna o existente; se não, cria um novo.
Essa lógica segue a mesma regra de unicidade aplicada pelo backend.
"""
nodes = client.nodes.list_nodes()
for n in nodes:
same_dns = (n.dns or "") and (n.dns == (node_request.dns or ""))
same_ip = (n.ip or "") and (n.ip == (node_request.ip or ""))
same_port = n.porta == node_request.porta
if same_port and (same_dns or same_ip):
logger.info(
f"Node existente encontrado pela combinação IP/DNS+porta: "
f"{n.nome} (UUID: {n.uuid})"
)
return n
logger.info("Node não encontrado pela combinação IP/DNS+porta. Cadastrando novo...")
new_node = client.nodes.register(node_request)
if not new_node:
raise RuntimeError("Falha ao cadastrar node.")
logger.info(f"Node cadastrado: {new_node.nome} (UUID: {new_node.uuid})")
return new_node
Cadastro AuthNode
Para iniciar a execução de casos em um node, é necessário cadastrar um AuthNode para autenticação, para mais informações acesse Funcionalidades -> Nodes. O SDK tem duas funções que realizam o cadastro, o primeiro modo é passando usuário e senha para que a própria API crie a comunicação e faça a troca de chaves que são criadas, o outro modo é passando somente o usuário o retorno é a chave pública gerada pela API para que o próprio usuário possa cadastra-la no servidor de execução.
O exemplo abaixo demonstra como garantir que um AuthNode seja criado, a partir do usuário e senha, para o usuário 'user' em um node específico.
Info
Vale ressaltar que o workir passado é o diretório no Node onde os casos serão armazenados e executados, ou seja, é necessário que o caminho exista no Node para que a execução funcione corretamente.
from pldpro_sdk import SDKConfig, PLDProClient
from pldpro_sdk.api_client.models import (NodeRequest)
from pldpro_sdk.api_client.models.execution_mode import ExecutionMode
from pldpro_sdk.core.helpers import logger
def create_client_from_env():
api_key = os.getenv("API_KEY")
host = os.getenv("HOST")
retries = int(os.getenv("RETRIES"))
if not api_key:
raise ValueError("A variável de ambiente 'API_KEY' não está definida.")
return PLDProClient(SDKConfig(host=host, retries=retries), api_key)
USERNAME = "user"
client = create_client_from_env()
nodes = client.nodes.list_nodes()
node_uuid = nodes[0].uuid
workdir = "/home/user/workdir"
password = "sua_senha_aqui"
auth_node = client.nodes.create_auth_node(
node_uuid,
USERNAME,
workdir,
password,
)
print(auth_node)
O exemplo abaixo demonstra como garantir que um AuthNode seja criado, a partir do usuário, para o usuário 'user' em um node específico.
from pldpro_sdk import SDKConfig, PLDProClient
from pldpro_sdk.api_client.models import (NodeRequest)
from pldpro_sdk.api_client.models.execution_mode import ExecutionMode
from pldpro_sdk.core.helpers import logger
def create_client_from_env():
api_key = os.getenv("API_KEY")
host = os.getenv("HOST")
retries = int(os.getenv("RETRIES"))
if not api_key:
raise ValueError("A variável de ambiente 'API_KEY' não está definida.")
return PLDProClient(SDKConfig(host=host, retries=retries), api_key)
USERNAME = "user"
client = create_client_from_env()
output = "/home/user/downloads"
workdir = "/home/user/workdir"
auth_node = client.nodes.create_auth_node(
node_uuid, # UUID do Node
USERNAME,
workdir,
output,
)
output.
Para listar todos os AuthNodes cadastrados em um node específico, você pode usar o seguinte código:
auth_nodes = client.nodes.list_auth_nodes(node_uuid)
for auth in auth_nodes:
print(f"AuthNode UUID: {auth.uuid}, Usuário: {auth.usuario}, Workdir: {auth.path_workdir}")
Boas Práticas
Para garantir que o AuthNode não seja duplicado para o mesmo usuário em um node, você pode implementar uma lógica para verificar se um AuthNode com a mesma combinação de (node_uuid + username) já existe antes de tentar cadastrá-lo. O exemplo completo está disponível abaixo:
def get_or_create_auth_node_for_user(
client: PLDProClient,
node_uuid,
workdir: str,
password: str,
):
"""
Garante que exista um AuthNode para o usuário 'user' no node informado.
Se existir (mesmo com outro workdir), retorna o existente.
Se não existir, cria um novo.
"""
USERNAME = "user"
auth_nodes = client.nodes.list_auth_nodes(node_uuid)
for auth in auth_nodes:
if auth.usuario == USERNAME:
logger.info(
f"AuthNode existente encontrado para usuário {USERNAME}: {auth.uuid}"
)
existing_workdir = getattr(auth, "path_workdir", None) or ""
desired_workdir = workdir or ""
if existing_workdir != desired_workdir:
logger.warning(
f"Workdir diferente do desejado para o AuthNode {auth.uuid}. "
f"Existente='{existing_workdir}', Desejado='{desired_workdir}'"
)
return auth
logger.info(f"AuthNode para usuário {USERNAME} não encontrado. Cadastrando novo...")
new_auth = client.nodes.create_auth_node(
node_uuid,
USERNAME,
workdir,
password,
)
if not new_auth:
raise RuntimeError(f"Falha ao cadastrar AuthNode para o usuário {USERNAME}.")
logger.info(
f"AuthNode cadastrado para {USERNAME}: {new_auth.uuid}"
)
return new_auth
Cadastro de Caso
Para o cadastro de um caso na plataforma PLDPro, você pode utilizar o seguinte exemplo de código. Este exemplo demonstra como criar um novo caso associado a um AuthNode específico. É necessário entender que para a criação de um caso você precisa ter um AuthNode previamente cadastrado e sinalizar onde o caminho do caso que será feito o upload dos dados.
Caso com upload de dados local
Se o script precisar carregar os dados de um caso que estão armazenados localmente, a API irá criar uma pasta no workdir definido no AuthNode e fazer o upload dos dados para essa pasta. O exemplo abaixo demonstra como fazer isso:
from uuid import UUID
from pldpro_sdk import PLDProClient, SDKConfig
from pldpro_sdk.use_cases.helpers.case_helpers import create_caso
def create_client_from_env():
api_key = os.getenv("API_KEY")
host = os.getenv("HOST")
retries = int(os.getenv("RETRIES"))
if not api_key:
raise ValueError("A variável de ambiente 'API_KEY' não está definida.")
return PLDProClient(SDKConfig(host=host, retries=retries), api_key)
# Caminho onde o caso esta localmente para o upload
file_path_origin = "home/cases/examples/case_1"
auth_nodes = client.nodes.list_auth_nodes(node_uuid)
auth_node_uuid = auth_nodes[0].uuid
client = create_client_from_env()
caso = create_caso(client, file_path_origin, auth_node_uuid)
print(caso)
Caso com associação remota
Se o caso já existir no node de execução, você pode associá-lo diretamente sem a necessidade de upload dos dados. O exemplo abaixo demonstra como fazer isso:
from pldpro_sdk import PLDProClient, CasoRequest
def create_client_from_env():
api_key = os.getenv("API_KEY")
host = os.getenv("HOST")
retries = int(os.getenv("RETRIES"))
if not api_key:
raise ValueError("A variável de ambiente 'API_KEY' não está definida.")
return PLDProClient(SDKConfig(host=host, retries=retries), api_key)
client = create_client_from_env()
auth_nodes = client.nodes.list_auth_nodes(node_uuid)
auth_node_uuid = auth_nodes[0].uuid
pathRemote = "/home/user/workdir/cases/case_remoto_exemplo"
caso_request = CasoRequest(
nome=f"Caso_Remoto_Exemplo",
pathRemote=pathRemote,
uuidAuthNode=auth_node_uuid,
)
caso = client.casos.create_case(caso_request)
Licenças
Para a execução dos modelos do PLDPro, é necessário que o usuário possua licenças válidas e carregue para o sistema . Assim , na execução de um caso pelo SDK o sistema irá manipular as devidas licenças para garantir que a execução seja realizada com sucesso. Abaixo segue um exemplo para o cadastro das licenças pelo SDK:
license = client.license.create_license(
file="/home/user/licencas/gevazp.lic",
license_request=LicenseRequest(
modelType=ModelTypeEnum.GEVAZP,
licenseType=LicenseTypeEnum.MODELOS_ENERGETICOS,
active=True,
startAt="2026-01-01T00:00:00",
endAt="2026-12-31T23:59:59"
)
)
print(f"License: {license.uuid} - Modelo: {license.model_type} - Tipo: {license.license_type} - Ativa: {license.active}")
Também são disponibilizadas funções para consultas das licenças cadastradas e ativas. Abaixo segue um exemplo para obter todas as licenças, verificar uma licença específica e listar as licenças ativas para um modelo específico:
def get_license(client:PLDProClient):
active_licenses = client.license.get_all_licenses()
for license in active_licenses:
print(f"License: {license.uuid} - Modelo: {license.model_type} - Tipo: {license.license_type} - Ativa: {license.active}")
def get_ative_license(client:PLDProClient):
active_licenses = client.license.get_all_valid_licenses()
for license in active_licenses:
print(f"License: {license.uuid} - Modelo: {license.model_type} - Tipo: {license.license_type} - Ativa: {license.active}")
client = create_client_from_env()
print("Licenses do Tenant")
get_license(client)
print("Licenses Ativas")
get_ative_license(client)
print("Verificando disponibilidade de licenca para modelo newave...")
print(client.license.check_valide_license(model_type=ModelTypeEnum.NEWAVE))
print("Pegando detalhes da licenca ativa para newave...")
license_newave = client.license.get_license_by_model_type(model_type=ModelTypeEnum.NEWAVE)
if license_newave:
print(f"Licenca: {license_newave.uuid} - Modelo: {license_newave.model_type} - Tipo: {license_newave.license_type} - Ativa: {license_newave.active}")
Warning
O gerenciamento de licenças é uma parte crucial para garantir a execução bem-sucedida dos casos no PLDPro. Certifique-se de que as licenças estejam ativas e válidas para os modelos que você pretende utilizar. O SDK facilita o processo de carregamento e verificação das licenças, mas é responsabilidade do usuário garantir que as licenças corretas estejam em vigor para evitar falhas na execução dos casos. O usuário verá somente as licenças ativas pela sua empresa (tenant).
Configuracao das Informacoes Iniciais do Caso
Apos criar um caso e, quando necessario, realizar o upload dos arquivos de entrada, e possivel configurar as informacoes iniciais da execucao usando o metodo config_informacoes_iniciais.
Esse metodo recebe o UUID do caso e um objeto CasoInitialDataRequest, que contem dados como periodo inicial e final, revisao inicial, encadeamento semanal, horizonte NEWAVE e nome do caso.
O metodo retorna True quando a configuracao e realizada com sucesso e False caso ocorra algum erro.
Info
O parametro caso_uuid pode ser informado como str ou UUID. Internamente, o SDK converte strings validas para UUID antes de chamar a API.
import os
from pldpro_sdk import SDKConfig, PLDProClient
from pldpro_sdk.api_client.models.caso_initial_data_request import CasoInitialDataRequest
from pldpro_sdk.api_client.models.tipo_encadeamento_semanal import (
TipoEncadeamentoSemanal,
)
def create_client_from_env():
api_key = os.getenv("API_KEY")
host = os.getenv("HOST")
retries = int(os.getenv("RETRIES"))
if not api_key:
raise ValueError("A variavel de ambiente 'API_KEY' nao esta definida.")
return PLDProClient(SDKConfig(host=host, retries=retries), api_key)
client = create_client_from_env()
caso_uuid = "uuid-do-caso"
initial_info = CasoInitialDataRequest(
anoInicial=2025,
mesInicial=8,
anoFinal=2025,
mesFinal=12,
tipoEncadeamentoSemanal=TipoEncadeamentoSemanal.SEMANAL,
mesFinalSemanal=12,
anoFinalSemanal=2025,
revisaoFinalSemanal=3,
revisaoInicial=2,
horizonteAnosNw=[2025, 2026],
nomeCaso="caso_exemplo",
)
is_configured = client.casos.config_informacoes_iniciais(
caso_uuid,
initial_info,
)
if not is_configured:
raise RuntimeError("Falha ao configurar as informacoes iniciais do caso.")
print("Informacoes iniciais configuradas com sucesso.")
Campos principais
| Campo | Descricao |
|---|---|
anoInicial |
Ano inicial do caso. |
mesInicial |
Mes inicial do caso. |
anoFinal |
Ano final do caso. |
mesFinal |
Mes final do caso. |
tipoEncadeamentoSemanal |
Tipo de encadeamento semanal. Pode ser TipoEncadeamentoSemanal.SEMANAL ou TipoEncadeamentoSemanal.MENSAL. |
mesFinalSemanal |
Mes final da etapa semanal. |
anoFinalSemanal |
Ano final da etapa semanal. |
revisaoFinalSemanal |
Revisao final semanal. |
revisaoInicial |
Revisao inicial do caso. |
horizonteAnosNw |
Lista de anos do horizonte NEWAVE prospectivo. |
nomeCaso |
Nome do caso a ser configurado. |
Boas Praticas
Para garantir que a configuracao foi aplicada corretamente, recomenda-se encapsular a chamada em uma funcao que valide o retorno do metodo:
from uuid import UUID
from pldpro_sdk import PLDProClient
from pldpro_sdk.api_client.models.caso_initial_data_request import CasoInitialDataRequest
from pldpro_sdk.api_client.models.tipo_encadeamento_semanal import (
TipoEncadeamentoSemanal,
)
def configure_initial_info(
client: PLDProClient,
caso_uuid: UUID,
):
initial_info = CasoInitialDataRequest(
anoInicial=2025,
mesInicial=8,
anoFinal=2025,
mesFinal=12,
tipoEncadeamentoSemanal=TipoEncadeamentoSemanal.SEMANAL,
mesFinalSemanal=12,
anoFinalSemanal=2025,
revisaoFinalSemanal=3,
revisaoInicial=2,
horizonteAnosNw=None,
nomeCaso=f"caso_auto_{caso_uuid}",
)
ok = client.casos.config_informacoes_iniciais(caso_uuid, initial_info)
if not ok:
raise RuntimeError("Falha ao configurar informacoes iniciais do caso.")
return ok
Esse metodo e util principalmente antes da etapa de execucao do caso, pois garante que os parametros basicos de periodo, revisao e encadeamento estejam configurados na API.
Execução de um Caso
Para executar um caso no SDK do PLDPro, você pode seguir o exemplo abaixo. Este exemplo demonstra como iniciar a execução de um caso previamente cadastrado na plataforma.
Execução em DATACENTER e CLOUD
A documentação detalhada dos cenários de execução, incluindo o fluxo SDK -> API, o uso de optionsExecutaModelo e exemplos completos para DATACENTER e CLOUD, está em Funcionalidades -> Execução Remota.
from pldpro_sdk import PLDProClient, CasoRequest
def create_client_from_env():
api_key = os.getenv("API_KEY")
host = os.getenv("HOST")
retries = int(os.getenv("RETRIES"))
if not api_key:
raise ValueError("A variável de ambiente 'API_KEY' não está definida.")
return PLDProClient(SDKConfig(host=host, retries=retries), api_key)
client = create_client_from_env()
auth_nodes = client.nodes.list_auth_nodes(node_uuid)
auth_node_uuid = auth_nodes[0].uuid
client = create_client_from_env()
caso = create_caso(client, file_path_origin, auth_node_uuid)
start(client, caso.uuid, ExecucaoStartRequest(version="7.0.0", tipoEntrada="DEFAULT"))
start define o payload de execução enviado para a API. Se os dados do usuário estiverem no formato padrão do PLDPro, o tipo deverá ser DEFAULT. Caso precise converter os dados da planilha Excel para o formato PLDPro, o tipo de entrada é CONVERSOR.
Quando for necessário controlar explicitamente o destino da execução, utilize ExecucaoStartRequest.optionsExecutaModelo com localExecution=DATACENTER ou localExecution=CLOUD, conforme detalhado na documentação de Execução Remota.
Warning
A função de start tem como objetivo iniciar a execução do PLDPro, seja ela com o conversor ou não. Não é possivel chamar somente o conversor pelo SDK.
Boas Práticas
Para facilitar o uso do SDK, é recomendável definir os parâmetros como nome do node e auth_node_user em variáveis. Isso torna o código mais legível e fácil de manter e facilita as chamadas que precisam de um auth_node. O Exemplo abaixo, demostra como obter o UUID do AuthNode a partir do nome do node e do usuário, criar um caso e executar.
from pldpro_sdk import PLDProClient, CasoRequest
from pldpro_sdk.use_cases.helpers.auth_node_helpers import get_auth_node_uuid_for_node_name_and_user
def create_client_from_env():
api_key = os.getenv("API_KEY")
host = os.getenv("HOST")
retries = int(os.getenv("RETRIES"))
if not api_key:
raise ValueError("A variável de ambiente 'API_KEY' não está definida.")
return PLDProClient(SDKConfig(host=host, retries=retries), api_key)
NODE_NAME = "Node Example"
AUTH_NODE_USER = "user"
file_path_origin = "home/cases/examples/case_1"
client = create_client_from_env()
auth_node_uuid = get_auth_node_uuid_for_node_name_and_user(client, NODE_NAME, AUTH_NODE_USER)
caso = create_caso(client, file_path_origin, auth_node_uuid)
start(client, caso.uuid, ExecucaoStartRequest(version="7.0.0", tipoEntrada="DEFAULT"))
Monitoramento de Casos em execução
Para monitorar os casos que estão executando em um node específico, você pode utilizar o seguinte exemplo de código. Este exemplo demonstra como obter o UUID do AuthNode a partir do nome do node e do usuário, e listar as execuções associadas a esse AuthNode.
from pldpro_sdk import PLDProClient, SDKConfig
from dotenv import load_dotenv
from pldpro_sdk.use_cases.helpers.auth_node_helpers import get_auth_node_uuid_for_node_name_and_user
load_dotenv()
NODE_NAME = "Node Example"
AUTH_NODE_USER = "user"
def create_client_from_env():
api_key = os.getenv("API_KEY")
host = os.getenv("HOST")
retries = int(os.getenv("RETRIES"))
if not api_key:
raise ValueError("A variável de ambiente 'API_KEY' não está definida.")
return PLDProClient(SDKConfig(host=host, retries=retries), api_key)
client = create_client_from_env()
auth_node_uuid = get_auth_node_uuid_for_node_name_and_user(client, NODE_NAME, AUTH_NODE_USER)
execucoes = client.execucoes.list_executions(auth_node_uuid) or []
for s in statuses:
print(f"{s.caso_uuid} -> {s.status.value}")
Listar todos os casos existentes
from pldpro_sdk import PLDProClient, SDKConfig
from dotenv import load_dotenv
rom pprint import pprint
from uuid import UUID
load_dotenv()
def create_client_from_env():
api_key = os.getenv("API_KEY")
host = os.getenv("HOST")
retries = int(os.getenv("RETRIES"))
if not api_key:
raise ValueError("A variável de ambiente 'API_KEY' não está definida.")
return PLDProClient(SDKConfig(host=host, retries=retries), api_key)
client = create_client_from_env()
casos = client.casos.list_casos()
for caso in casos.elements:
print(caso)
print("----------------")
Informações de um caso
Para obter informações detalhadas sobre um caso específico, você pode utilizar o seguinte exemplo de código. Este exemplo demonstra como buscar um caso pelo seu UUID e exibir suas informações principais.
from pldpro_sdk import PLDProClient, SDKConfig
from dotenv import load_dotenv
rom pprint import pprint
from uuid import UUID
load_dotenv()
def create_client_from_env():
api_key = os.getenv("API_KEY")
host = os.getenv("HOST")
retries = int(os.getenv("RETRIES"))
if not api_key:
raise ValueError("A variável de ambiente 'API_KEY' não está definida.")
return PLDProClient(SDKConfig(host=host, retries=retries), api_key)
client = create_client_from_env()
execucoes = client.execucoes.list_executions(auth_node_uuid) or []
#Mudar a posição
print(client.casos.get_caso(execucoes[0].caso_uuid))
Troca de arquivos
Para registrar trocas de arquivos associadas ao entrada.txt de um caso, o SDK disponibiliza builders específicos para NEWAVE e DECOMP. Com isso, o consumidor informa apenas os metadados de cada troca e o caminho do arquivo correspondente, enquanto a API valida os itens, vincula cada arquivo ao seu respectivo registro e gera automaticamente os registros de controle e detalhe no entrada.txt.
Troca de arquivos do NEWAVE
from uuid import UUID
from pldpro_sdk import PLDProClient, SDKConfig
from pldpro_sdk.models.change_files import NewaveChangeFilesBuilder
def create_client_from_env():
api_key = os.getenv("API_KEY")
host = os.getenv("HOST")
retries = int(os.getenv("RETRIES"))
if not api_key:
raise ValueError("A variável de ambiente 'API_KEY' não está definida.")
return PLDProClient(SDKConfig(host=host, retries=retries), api_key)
client = create_client_from_env()
caso_uuid = UUID("00000000-0000-0000-0000-000000000000")
builder = (
NewaveChangeFilesBuilder()
.add_file(
"/tmp/pldpro-sdk/change-files/newave/clast-6-2026.dat",
mes=6,
ano=2026,
nome_arquivo="clast",
extensao="dat",
)
.add_file(
"/tmp/pldpro-sdk/change-files/newave/clast-7-2026.dat",
mes=7,
ano=2026,
nome_arquivo="clast",
extensao="dat",
)
)
response = client.casos.change_files_newave(caso_uuid, builder)
print(response)
Troca de arquivos do DECOMP
from uuid import UUID
from pldpro_sdk import PLDProClient, SDKConfig
from pldpro_sdk.models.change_files import DecompChangeFilesBuilder
def create_client_from_env():
api_key = os.getenv("API_KEY")
host = os.getenv("HOST")
retries = int(os.getenv("RETRIES"))
if not api_key:
raise ValueError("A variável de ambiente 'API_KEY' não está definida.")
return PLDProClient(SDKConfig(host=host, retries=retries), api_key)
client = create_client_from_env()
caso_uuid = UUID("00000000-0000-0000-0000-000000000000")
builder = (
DecompChangeFilesBuilder()
.add_file(
"/tmp/pldpro-sdk/change-files/decomp/dadger-12-2025.rv0",
mes=12,
ano=2025,
nome_arquivo="dadger",
extensao="rv0",
)
.add_file(
"/tmp/pldpro-sdk/change-files/decomp/renovaveis-3-2026-rv0.csv",
mes=3,
ano=2026,
nome_arquivo="renovaveis",
extensao="csv",
revisao=0,
)
)
response = client.casos.change_files_decomp(caso_uuid, builder)
print(response)
Boas práticas
- Utilize o builder correspondente ao tipo de troca:
NewaveChangeFilesBuilderpara NEWAVE eDecompChangeFilesBuilderpara DECOMP. - Garanta que cada item adicionado possua um arquivo físico correspondente no caminho informado.
- Evite duplicidade de competência para o mesmo tipo de troca, isto é, não envie dois itens com o mesmo
mêseanopara o mesmo grupo. - Deixe a ordenação cronológica por conta da API. O ideal é focar em enviar os dados corretos, sem depender da ordem de inserção no cliente.
Parar a execução de um caso
Para parar a execução de um caso específico, você pode utilizar o seguinte exemplo de código. Este exemplo demonstra como interromper uma execução pelo UUID do caso.
import os
from dotenv import load_dotenv
from pldpro_sdk import PLDProClient, SDKConfig
from pldpro_sdk.use_cases.helpers.auth_node_helpers import get_auth_node_uuid_for_node_name_and_user
load_dotenv()
def create_client_from_env():
api_key = os.getenv("API_KEY")
host = os.getenv("HOST")
retries = int(os.getenv("RETRIES"))
if not api_key:
raise ValueError("A variável de ambiente 'API_KEY' não está definida.")
return PLDProClient(SDKConfig(host=host, retries=retries), api_key)
NODE_NAME = "datacenter_ampere"
AUTH_NODE_USER = "xlibs"
client = create_client_from_env()
auth_node_uuid = get_auth_node_uuid_for_node_name_and_user(client, NODE_NAME, AUTH_NODE_USER)
execucoes = client.execucoes.list_executions(auth_node_uuid) or []
client.execucoes.stop_execution(execucoes[0].caso_uuid)
Troca de versões
Para registrar trocas de versão dos modelos ao longo do horizonte do prospectivo, o SDK disponibiliza builders específicos para NEWAVE, DECOMP e GEVAZP. A API gera automaticamente os registros de controle e detalhe no entrada.txt, sem que o consumidor precise conhecer os cards do entrada.
Troca de versões do NEWAVE
from uuid import UUID
from pldpro_sdk import PLDProClient, SDKConfig
from pldpro_sdk.models import NewaveChangeVersionsBuilder
client = create_client_from_env()
caso_uuid = UUID("00000000-0000-0000-0000-000000000000")
builder = (
NewaveChangeVersionsBuilder()
.add_version(mes=1, ano=2025, versao="newave_v1")
.add_version(mes=3, ano=2025, versao="newave_v2")
)
response = client.casos.change_versions_newave(caso_uuid, builder)
print(response)
Troca de versões do DECOMP
from pldpro_sdk.models import DecompChangeVersionsBuilder
builder = (
DecompChangeVersionsBuilder()
.add_version(mes=2, ano=2025, versao="decomp_v1")
.add_version(mes=4, ano=2025, versao="decomp_v2")
)
response = client.casos.change_versions_decomp(caso_uuid, builder)
print(response)
Troca de versões do GEVAZP
from pldpro_sdk.models import GevazpChangeVersionsBuilder
builder = (
GevazpChangeVersionsBuilder()
.add_version(mes=1, ano=2025, versao="gevazp_v1")
.add_version(mes=5, ano=2025, versao="gevazp_v2")
)
response = client.casos.change_versions_gevazp(caso_uuid, builder)
print(response)
Remover trocas existentes
Para remover todas as trocas de versão de um modelo, basta passar um builder vazio. A API gera o card com indicativo de ausência (n).
response = client.casos.change_versions_newave(caso_uuid, NewaveChangeVersionsBuilder())
print(response)
Boas práticas
- Utilize o builder correspondente ao modelo:
NewaveChangeVersionsBuilder,DecompChangeVersionsBuilderouGevazpChangeVersionsBuilder. - A ordem de inserção não importa — a API sempre ordena cronologicamente por ano e mês.
- Não envie dois itens com o mesmo
mêseanopara o mesmo modelo. - A operação atualiza o
entrada.txtno servidor da API. O arquivo local do deck não é modificado.
Número de processadores dos modelos
Para registrar o número de processadores dos modelos NEWAVE e DECOMP, o SDK disponibiliza métodos de alto nível que recebem apenas a quantidade de processadores. A API valida o valor informado e atualiza automaticamente os registros correspondentes no entrada.txt, sem que o consumidor precise conhecer os cards do entrada.txt.
Número de processadores do NEWAVE
from uuid import UUID
from pldpro_sdk import PLDProClient, SDKConfig
client = create_client_from_env()
caso_uuid = UUID("00000000-0000-0000-0000-000000000000")
response = client.casos.change_processors_newave(caso_uuid, 8)
if response is not None:
print(response.tipo)
print(response.quantidade_processadores)
print(response.entrada_atualizada)
Número de processadores do DECOMP
from uuid import UUID
from pldpro_sdk import PLDProClient, SDKConfig
client = create_client_from_env()
caso_uuid = UUID("00000000-0000-0000-0000-000000000000")
response = client.casos.change_processors_decomp(caso_uuid, 12)
if response is not None:
print(response.tipo)
print(response.quantidade_processadores)
print(response.entrada_atualizada)
Boas práticas
- Informe sempre um valor inteiro e não negativo.
- Para o NEWAVE, utilize valores entre
0e999. - Para o DECOMP, utilize valores entre
0e99. - O SDK abstrai os cards, enquanto a API reflete automaticamente os valores em
NUMPROCSNWeNWNUMPROCSREpara NEWAVE, e emNUMPROCSDCeDCNUMPROCSREpara DECOMP. - A leitura do
entrada.txtcontinua considerando apenas os cards locais como fonte de verdade:NUMPROCSNWpara NEWAVE eNUMPROCSDCpara DECOMP.
Configuração de geração e seleção de registros do DADGER
Para configurar a geração do DADGER e selecionar quais registros deverão ser modificados, utilize o DadgerConfigBuilder. O SDK recebe uma intenção de configuração e a API reflete os valores necessários no entrada.txt, sem exigir que o consumidor conheça os cards.
from uuid import UUID
from pldpro_sdk import PLDProClient, SDKConfig
from pldpro_sdk.models import DadgerConfigBuilder, DadgerGenerationType, RegistroDadger
client = create_client_from_env()
caso_uuid = UUID("00000000-0000-0000-0000-000000000000")
builder = (
DadgerConfigBuilder()
.enable(DadgerGenerationType.MIXED, stop_after_generation=False)
.set_complete_start(mes=1, ano=2025)
.set_selection_start(mes=3, ano=2025)
.select_records([
RegistroDadger.DP,
RegistroDadger.VE,
RegistroDadger.HE,
])
)
response = client.casos.configure_dadger(caso_uuid, builder)
if response is not None:
print(response.gerar_dadger)
print(response.tipo_geracao_dadger)
print(response.parar_apos_gerar_dadger)
print(response.registros_dadger_modificados)
print(response.entrada_atualizada)
Para desativar a geração do DADGER, use o builder desabilitado. Nesse caso, a API mantém o comportamento de comentário dos demais cards associados.
builder = DadgerConfigBuilder().disable()
response = client.casos.configure_dadger(caso_uuid, builder)
print(response)
Boas práticas
- Utilize
DadgerGenerationType.COMPLETEpara DADGER completo,DadgerGenerationType.RECORD_SELECTIONpara seleção de registros eDadgerGenerationType.MIXEDpara o modo misto. - Informe as datas necessárias conforme o tipo de geração escolhido.
- Use os enums de
RegistroDadger, comoRegistroDadger.DP,RegistroDadger.VEeRegistroDadger.HE, em vez de informar nomes de cards manualmente. - Evite repetir o mesmo registro na seleção, pois o SDK valida duplicidade antes de enviar a requisição.
Configuração de execução com partida
Para configurar a execução com partida, utilize o ExecutionWithPartidaBuilder. Ele permite definir se o caso usa partida, se há partida mensal e qual modelo será usado como ponto de partida quando aplicável.
from uuid import UUID
from pldpro_sdk import PLDProClient, SDKConfig
from pldpro_sdk.models import ExecutionWithPartidaBuilder, ModeloPartida
client = create_client_from_env()
caso_uuid = UUID("00000000-0000-0000-0000-000000000000")
builder = (
ExecutionWithPartidaBuilder()
.use_partida(True)
.set_monthly_partida(True)
.set_starting_model(ModeloPartida.NW)
)
response = client.casos.configure_execution_with_partida(caso_uuid, builder)
if response is not None:
print(response.executa_partida)
print(response.partida_mensal)
print(response.modelo_partida)
print(response.entrada_atualizada)
Também é possível desabilitar o uso de partida. Quando use_partida(False) é informado, o modelo de partida não é obrigatório.
builder = (
ExecutionWithPartidaBuilder()
.use_partida(False)
.set_monthly_partida(False)
)
response = client.casos.configure_execution_with_partida(caso_uuid, builder)
print(response)
Boas práticas
- Use
ModeloPartida.GV,ModeloPartida.NWouModeloPartida.DCpara selecionar o modelo de partida. - Informe
set_starting_modelapenas quando a execução com partida estiver habilitada. - Deixe a conversão para os cards
EXECUTAPARTIDA,PARTMESeMODELOPPQsob responsabilidade do SDK e da API.
Configuração de execução dos modelos, revisão de parada, versões e viabilização do DECOMP
Para configurar a execução dos modelos e seus dados relacionados, utilize o ModelExecutionConfigBuilder. A mesma chamada pode configurar execução, versões, revisão de parada e viabilização do DECOMP, mas também é possível enviar apenas parte dessas informações em uma chamada incremental.
from uuid import UUID
from pldpro_sdk import PLDProClient, SDKConfig
from pldpro_sdk.models import ModelExecutionConfigBuilder
client = create_client_from_env()
caso_uuid = UUID("00000000-0000-0000-0000-000000000000")
builder = (
ModelExecutionConfigBuilder()
.set_newave(enabled=True, version="29.1")
.set_gevazp(enabled=True, version="4.2")
.set_decomp(enabled=True, version="31.17")
.set_dessem(True)
.set_stop_revision(3)
.set_decomp_viabilization(enabled=True, max_attempts=5)
)
response = client.casos.configure_execution_models(caso_uuid, builder)
if response is not None:
print(response.executa_newave, response.versao_newave)
print(response.executa_gevazp, response.versao_gevazp)
print(response.executa_decomp, response.versao_decomp)
print(response.executa_dessem)
print(response.revisao_parada)
print(response.viabiliza_decomp)
print(response.numero_tentativas_viabiliza_decomp)
print(response.entrada_atualizada)
Exemplo de atualização parcial, alterando apenas a revisão de parada e a viabilização do DECOMP:
builder = (
ModelExecutionConfigBuilder()
.set_stop_revision(2)
.set_decomp_viabilization(enabled=True, max_attempts=3)
)
response = client.casos.configure_execution_models(caso_uuid, builder)
print(response)
Boas práticas
- Configure a versão do modelo quando habilitar sua execução, garantindo que o estado final do caso fique consistente.
- Use
set_newave,set_gevazp,set_decompeset_dessempara trabalhar por intenção, sem manipular diretamenteEXECNW,EXECGVP,EXECDCPouEXECDSS. - Use
set_stop_revisionpara refletirREVPARADAquando houver revisão de parada aplicável. - Use
set_decomp_viabilizationpara configurar a flag e o número máximo de tentativas deFLAGVIABDC.