Passo 1: Explore o catálogo
O catálogo é um registro somente leitura dos provedores, executores de catálogo e gatilhos que vêm com o Flowker. Você os descobre. Você nunca os cria.
1
Liste os provedores disponíveis
Chame o endpoint Listar provedores do catálogo para ver os tipos de serviço a que o Flowker se conecta. O catálogo sempre inclui o conector HTTP genérico. Provedores nativos como
ledger (Midaz) e tracer são sintetizados a partir de especificações OpenAPI publicadas e aparecem apenas quando o registro nativo de esquemas está configurado e a síntese tem sucesso.2
Liste os executores de catálogo disponíveis
Chame o endpoint Listar executores do catálogo para ver as operações que um nó de workflow pode invocar. Use Listar executores por provedor para estreitar a lista a um provedor.
3
Liste os gatilhos disponíveis
Chame o endpoint Listar gatilhos do catálogo para ver os tipos de gatilho nativos: webhooks e agendamentos. A API de executar workflow começa um workflow, mas não é um gatilho de catálogo.
Passo 2: Crie uma configuração de provedor
Chame
POST /v1/provider-configurations para definir a sua conexão com uma instância de um serviço externo.
Um
providerId é um identificador de catálogo, e nem sempre combina com o nome do produto. O catálogo registra o Midaz como ledger. Pegue sempre o valor em Listar provedores do catálogo em vez de adivinhá-lo pelo nome do produto.Exemplo de requisição
Exemplo de requisição
Autenticação
O blococonfig.auth guarda a autenticação que o serviço externo exige, como um par { type, config }. Use o método que o seu serviço espera.
O Flowker guarda as folhas secretas em
config.auth fora do documento de configuração persistido. Uma leitura autorizada da configuração de provedor pode resolver esses valores no cofre e devolvê-los em texto claro. Folhas não resolvidas continuam mascaradas. Conceda o acesso de leitura de acordo.
Qualquer outra coisa que você coloque no documento de configuração (um header, por exemplo) fica com a configuração, e uma leitura pode retorná-la. Coloque cada credencial em config.auth.
Para rotacionar um secret, envie o novo valor em uma atualização. Para manter o atual, omita o campo ou envie-o em branco. Isso funciona enquanto auth.type continua o mesmo. Uma atualização que muda auth.type deve carregar um valor para cada secret que o novo tipo exige e o anterior não exigia. Caso contrário o Flowker a rejeita com FLK-0952. Uma mudança entre dois tipos que usam o mesmo secret, como oidc_user para oidc_client_credentials, não precisa desse valor de novo.
Exemplo: client credentials OIDC
Exemplo: client credentials OIDC
Como habilitar e desabilitar
Configurações de provedor têm dois status:active (em uso) e disabled (temporariamente fora). Uma nova configuração de provedor começa no status active. Use Desabilitar configuração de provedor para tirar uma conexão de serviço e Habilitar configuração de provedor para trazê-la de volta.
Veja a API de configurações de provedor para a referência completa.
Passo 3: Referencie a configuração de provedor a partir de um nó de workflow
Cada nó executor carrega um
providerConfigId, o identificador da configuração de provedor pela qual ele chama. O Flowker rejeita um workflow cujo nó executor não tem providerConfigId, e rejeita um valor que não é um UUID. Em tempo de execução, ele monta cada requisição de saída com a URL base daquela configuração de provedor mais o caminho no nó. O nó falha se a configuração de provedor não estiver active.
Estes são os campos que um nó executor define no seu objeto data quando chama pelo conector HTTP genérico:
Um nó que chama uma operação de um documento OpenAPI que você subiu a nomeia com
operation_path e operation_method em vez de um executorId. O Flowker preenche o executorId para você a partir da configuração de provedor para a qual o nó aponta. Como conectar sua própria API percorre esse caminho inteiro.
Valide a configuração de um nó antes de salvar
Chame o endpoint Validar a configuração de um nó (POST /v1/catalog/executors/{id}/validate) para conferir a configuração de um nó contra o JSON Schema do executor de catálogo.
Isso faz apenas a validação de JSON Schema. Confere se o seu objeto de configuração combina com a estrutura que o executor de catálogo espera (campos obrigatórios, tipos, formatos). Não chama o serviço externo, então a primeira ida e volta real acontece quando um workflow roda o nó.
Passe mappedTargets para nomear os campos que o seu nó fornece por um inputMapping em vez de um valor fixo. Esses campos contam como satisfeitos, então um nó que mapeia um campo obrigatório vindo do gatilho valida antes de você salvá-lo.
Mapeamento de campos e transformação de dados
Use mapeamentos de campo e transformações quando os dados do workflow não combinam com o formato que um serviço externo espera. Use-os também quando um serviço devolve dados em um formato que a próxima etapa não consome. Você define os mapeamentos de campo e as transformações dentro do objeto
data dos nós executores. O Flowker aplica os mapeamentos de entrada antes de chamar o serviço externo, e os mapeamentos de saída depois de receber a resposta.
Um target de entrada é um caminho no corpo da requisição de saída, escrito exatamente como o serviço externo espera. Não há objeto envolvente nem prefixo a acrescentar. Um source de saída é um caminho dentro do envelope da resposta, então os campos da resposta ficam sob body.
Exemplo rápido: mapear campos de workflow para um nó executor
Exemplo rápido: mapear campos de workflow para um nó executor
${executor-balance.balance}.Passo 4: Rode o workflow
Referencie a configuração de provedor em um nó de workflow do tipo
executor.
O exemplo abaixo cria um workflow de validação de pagamento em cima da conexão FraudShield do Passo 2. Quando um pagamento chega, o Flowker chama o serviço de checagem de fraude, avalia a pontuação de risco e aprova ou rejeita o pagamento conforme o resultado.
O workflow tem cinco nós. Um gatilho de webhook recebe o pagamento, e um nó executor chama o serviço de checagem de fraude. Um nó condicional avalia a pontuação, e há dois nós de ação para os resultados de aprovar e rejeitar. Arestas os conectam em sequência, com o nó condicional ramificando para um caminho ou outro conforme o limiar da pontuação.
Use o endpoint Criar workflow para definir o workflow, depois Ative e por fim Execute.
Exemplo: criar um workflow de validação de pagamento
Exemplo: criar um workflow de validação de pagamento
check-fraud nomeia http, o conector HTTP genérico do catálogo. Ele também nomeia a configuração FraudShield do Passo 2, que guarda a URL base e as credenciais. Os dois lados nomeiam o mesmo provedor, então o workflow salva. O Flowker envia a requisição para https://api.fraudshield.example.com/score-transaction.O nó não declara outputMapping, então a saída dele mantém o formato do envelope da resposta. A pontuação fica então em check-fraud.body.score, que é o que a condição evaluate-score lê. Adicione um outputMapping quando você preferir um nome mais raso. Veja Mapeamento de campos e transformação de dados.Exemplo: executar o workflow
Exemplo: executar o workflow
Como disparar workflows
Você dispara execuções de workflow pelo endpoint Executar workflow:
inputData da execução. Todos os campos ficam disponíveis para os nós seguintes pelo namespace workflow (por exemplo, workflow.transactionId ou workflow.amount). As saídas dos nós ficam disponíveis pelo ID do nó (por exemplo, check-fraud.body.score para um nó que não declara outputMapping).
Idempotência
Cada requisição de execução deve incluir um headerIdempotency-Key. Uma requisição sem ele falha com 400 Bad Request (erro FLK-0509). Gere um UUID novo para cada nova execução, e reutilize a mesma chave apenas ao repetir a requisição idêntica.
Gatilhos de webhook
Webhooks são a principal forma de sistemas externos dispararem workflows do Flowker. Em vez de o seu sistema chamar a API de execuções diretamente, você registra um caminho de webhook em um workflow. Os serviços externos então enviam requisições HTTP para esse caminho.
Como funciona
- Adicione um nó de gatilho do tipo
webhookao seu workflow com umpathe ummethodno seudata. Definainput_contractexplicitamente em nós novos quando você precisa de validaçãoopen,xsdouopenapi. - Quando você ativa o workflow, o Flowker registra o caminho no seu registro de webhooks.
- Sistemas externos enviam requisições para
POST /v1/webhooks/{path}(ou o método que você configurou). - O Flowker resolve o caminho para o workflow correspondente e o executa.
Como definir um nó de gatilho de webhook
O gatilho de webhook é um nó comtype: "trigger" e triggerType: "webhook" no seu data, mais um path, um method e um input_contract opcional. Como configurar um gatilho de webhook cobre cada campo, os três modos de input_contract e o que cada um exige, e traz um nó resolvido para cada modo.
A configuração do gatilho segue um contrato fechado. Salvar um workflow falha com FLK-0934 quando o gatilho de webhook dele omite path ou method, ou deixa de fora um campo que o modo de input_contract escolhido exige. Também falha quando o gatilho nomeia o id de schema ou o campo de operação de outro modo. Falha também quando o gatilho carrega uma chave ou um valor que o schema não aceita. Uma declaração inválida de accepted_headers falha, em vez disso, com FLK-0957.
O schema também declara os campos opcionais response_mode, response_view e accepted_headers. Veja Como configurar um gatilho de webhook.
Como proteger um webhook
A entrega de webhook usa a mesma autenticação do resto da API. Com o Access Manager habilitado (PLUGIN_AUTH_ENABLED=true), cada requisição a /v1/webhooks/* deve carregar um Bearer token (OIDC JWT), e quem chama deve ter a permissão execute no recurso webhooks. Uma requisição sem um token válido falha com 401 Unauthorized.
Conceda essa permissão a uma identidade máquina a máquina para cada sistema que você deixa chamar os seus webhooks, e gerencie a concessão no Access Manager. Isso mantém o acesso ao webhook sob o mesmo modelo de papéis e políticas da gestão de workflows, em vez de uma credencial presa ao caminho.
Metadados do webhook
O Flowker injeta automaticamente um objeto_webhook no inputData da execução com metadados sobre a requisição que chegou:
Esses metadados ficam disponíveis para todos os nós do workflow pelo namespace
workflow._webhook.
Notas importantes
- Apenas um workflow ativo pode registrar cada combinação de caminho e método de webhook. Ativar um segundo workflow com o mesmo caminho falha com um erro de conflito.
- Caminhos de webhook aceitam segmentos aninhados (por exemplo,
payments/stripe/received). - O tamanho máximo do corpo da requisição é 1 MB.
- Desativar um workflow cancela automaticamente o registro das rotas de webhook dele.
Modo de resposta síncrona
Por padrão, um gatilho de webhook responde com um recibo202 assim que a execução começa (o modo assíncrono). Quem chama deve consultar o status da execução em separado. Defina response_mode como "sync" no data do nó de gatilho para que o Flowker mantenha a conexão HTTP aberta e devolva o resultado da execução direto na resposta:
Se a execução não chega a um estado terminal antes de o limite interno de espera se esgotar, o Flowker recorre ao recibo
202 do modo assíncrono. Esse recibo carrega um header Location apontando para o endpoint de resultados.
response_view escolhe o formato do corpo da resposta síncrona:
O
finalOutput de uma execução que falhou (nas visões full ou final_output) sempre carrega status: "failed" e errorMessage, e errorClass quando o Flowker conseguiu classificar a falha, nunca um {} vazio. Sem um override de responseStatusCode (veja abaixo), o status HTTP síncrono continua 200 para full/final_output/receipt (ele reporta a saúde do transporte, não o resultado de negócio). Um responseStatusCode válido no nó set_output terminal sobrepõe esse status nessas três visões.
Um nó de ação com actionType: "set_output" pode carregar um responseStatusCode opcional (inteiro, 200–599) para sobrepor o status HTTP que uma resposta de webhook sync devolve. Um valor fora do intervalo ou não inteiro falha na hora de salvar (FLK-0122). Para passthrough, o override se aplica apenas quando o próprio nó set_output é a etapa terminal. O status de provedor repassado por um executor terminal sempre vence, e o caminho de reserva sem resposta sempre usa um 200 simples, para que um override nunca mascare uma falha.
A detecção de passthrough é estrita: apenas a etapa terminal conta. Um set_output terminal depois de um executor dá forma à resposta como a saída dele mesmo. O Flowker nunca volta atrás para a resposta de um executor anterior. Em uma execução que falhou, a etapa que parou é a etapa terminal, então o Flowker repassa um 4xx de provedor que parou o workflow como o 4xx real.
Os valores na saída de um nó set_output aceitam referências ${...} resolvidas contra o contexto do workflow, incluindo ${workflow.<field>} (payload do gatilho), ${execution.id}, ${execution.startedAt} e ${execution.now} (carimbado no momento da interpolação). Uma referência ${...} que não resolve faz a etapa falhar (fail-closed).
Tratamento de erros
Se um nó falha, a execução para e o status dela vira
failed.
Não existe fallback automático. Depois que as novas tentativas acabam, a execução falha.
Os resultados da execução reportam o status da execução e os stepResults. Uma etapa que falhou fornece stepNumber, nodeId, status e errorMessage, com statusCode e errorClass quando disponíveis. O campo output é opcional. Não prometa um errorCode, incluindo FLK-0504 ou FLK-0507, em todo payload de resultados de execução.
Novas tentativas e circuit breaker
O Flowker inclui resiliência nativa para chamadas de executor.
Novas tentativas
Quando uma chamada de executor falha com um erro transitório (um erro de rede, um timeout na tentativa, qualquer status5xx, ou status 408 ou 429), o Flowker tenta de novo automaticamente. O comportamento de nova tentativa é configurável por nó, no data do nó executor:
As novas tentativas valem apenas quando a operação é segura de repetir. Por padrão, o Flowker trata chamadas
POST e PATCH como não idempotentes e não as repete (uma única tentativa), enquanto GET, PUT, DELETE e outros verbos são repetidos normalmente. Um retry.max_attempts maior que 1 faz aquele nó aderir às novas tentativas seja qual for o método. Um retry.max_attempts de 1 não é uma adesão. Ele define uma única tentativa.
Erros que não permitem nova tentativa vão direto para uma única tentativa, seja qual for a configuração. São eles: circuit breaker aberto, contexto cancelado, erros de configuração e falhas ao resolver secrets. Incluem também um corpo de requisição acima do limite de tamanho configurado, um corpo de resposta de provedor acima do mesmo limite e respostas 4xx de provedor que não são transitórias. Isso significa qualquer 4xx exceto 408 e 429.
A nova tentativa vale por execução de nó. Se todas as tentativas falham, a etapa falha e a execução para.
Circuit breaker
O Flowker usa um circuit breaker para que chamadas que falham repetidamente não sobrecarreguem serviços externos:
Erros
4xx de cliente ou de autenticação do provedor não abrem o circuito: eles são problema de quem chama, não sinal de que o provedor está fora. Apenas falhas de transporte e 5xx contam para o limiar.
Quando o circuito está aberto, as chamadas de executor falham na hora com FLK-0507 em vez de alcançar o serviço externo. Isso evita falhas em cascata e dá tempo ao serviço externo para se recuperar.
Transições de estado do circuit breaker
Registro de configurações de executor
Este registro é um terceiro uso, separado, da palavra “executor”. As entradas dele não são os executores de catálogo do Passo 1. Não são os nós de workflow de
type: "executor", nem as configurações de provedor do Passo 2. O motor lê as configurações de provedor para chamar serviços externos, não estas entradas, e o registro carrega o próprio vocabulário de campos (baseUrl, endpoints, authentication). O registro expõe quatro operações:
Cada entrada carrega um
status, que a API reporta em cada resposta:
PATCH aceita name, baseUrl, endpoints e authentication, mais os opcionais description e metadata. Não aceita status, mas a operação de listar aceita status como filtro de query. A atualização vale para entradas em status unconfigured ou configured. A exclusão vale para entradas em status unconfigured, configured ou disabled. Nenhuma operação nesta versão move uma entrada para tested, active ou disabled. A tabela lista esses valores porque as respostas os reportam e o filtro da listagem os aceita.
O que vem a seguir
Conceitos centrais
Entenda workflows, nós, arestas e execuções.
API de configurações de provedor
Explore a API de configuração de provedor.

