Skip to main content

zsynctech-studio-sdk

SDK Python oficial para conectar robôs de RPA à plataforma zsynctech-studio: handshake, heartbeat, ciclo de execução, consumo de fila e acesso ao cofre de credenciais, tudo via Socket.IO (namespace /robot).

Uso rápido

client.on_automation_start registra o que rodar quando a plataforma disparar o botão "Iniciar" para esse robô. client.listen() mantém o processo vivo aguardando esse evento, até a conexão encerrar ou você pressionar Ctrl+C.

Há duas formas de reportar trabalho, dependendo de onde a lista de tasks vem:

Consumindo a fila da plataforma

Use quando as tasks vêm de uma planilha importada na plataforma - client.queue.consume() entrega uma a uma até a fila esvaziar.

from zsynctech_studio_sdk import RobotClient, TaskStatus

client = RobotClient.from_api_key(
    "<sua-api-key>",
    backend_url="http://localhost:5000",
)

@client.on_automation_start
def handle_automation() -> None:
    with client.execution.run(observation="Minha automação"):
        for task in client.queue.consume():
            with client.queue.processing(task) as outcome:
                resultado = processar(task.payload)
                outcome.success(result=resultado)

with client:
    client.listen()

Sem fila: robô que processa a própria fonte de dados

Use quando o robô lê de uma fonte própria (planilha local, API interna, scraping, banco de dados...) em vez de uma fila importada na plataforma - pule client.queue inteiramente e reporte cada resultado direto com client.execution.report_tasks(...).

from zsynctech_studio_sdk import RobotClient, TaskItem, TaskStatus
from zsynctech_studio_sdk.utils import utc_now

client = RobotClient.from_api_key(
    "<sua-api-key>",
    backend_url="http://localhost:5000",
)

@client.on_automation_start
def handle_automation() -> None:
    itens = buscar_itens_a_processar()  # a fonte de dados é sua

    with client.execution.run(observation="Processamento de itens próprios"):
        for item in itens:
            started_at = utc_now()
            resultado = processar(item)

            client.execution.report_tasks([
                TaskItem(
                    external_id=item.id,
                    status=TaskStatus.SUCCESS,
                    result=resultado,
                    started_at=started_at,
                    finished_at=utc_now(),
                )
            ])

with client:
    client.listen()

Exemplos completos em examples/:

  • simulate_robot.py - robô completo consumindo tasks de uma fila da plataforma (client.queue.consume()); também demonstra client.credentials.reveal() logo após conectar.
  • own_tasks_robot.py - robô que processa a própria fonte de dados (planilha, API interna, etc.) e reporta os resultados direto na execução (client.execution.report_tasks()), sem usar fila.

Observação da execução

observation descreve o que está acontecendo numa execução - visível na plataforma. Dá pra atualizá-la quantas vezes quiser enquanto a execução está rodando, e sobrescrevê-la no finish() com o resultado final. execution.run() (o atalho com with) sempre finaliza com a observation original, então esse controle mais fino pede o par start()/finish() manual:

client.execution.start(observation="Boletagem VCOM")
try:
    tasks = list(client.queue.consume())
    if not tasks:
        client.execution.finish(observation="Fila vazia, nada a processar")
    else:
        for i, task in enumerate(tasks, start=1):
            client.execution.update_observation(f"Processando {i}/{len(tasks)}")
            ...
        client.execution.finish()
except Exception:
    client.execution.finish(ExecutionFinishStatus.FAILED)
    raise

Credenciais

O cofre de credenciais é acessado via REST (/robot/credentials), sem precisar de uma conexão /robot aberta - client.credentials funciona mesmo antes de client.connect():

credencial = client.credentials.reveal("<credential-id>")
print(credencial.value)  # str (TEXT), dict[str, str] (KEY_VALUE) ou JSON (JSON)

client.credentials.rotate("<credential-id>", "novo-valor")

client.credentials.expire("<credential-id>", "Login rejeitado pelo site do fornecedor")

Veja log_credential() em examples/simulate_robot.py para um exemplo em contexto (revela uma credencial e loga o valor assim que conecta).

Buscando por key em vez de id

id é o identificador interno da credencial - regenerado se o banco da plataforma for restaurado/migrado, quebrando qualquer robô que o tenha fixo no .env. key é um identificador estável, definido pelo admin na plataforma (ex.: "financeiro/senha-sap") e independente de id/name/pasta - renomear a credencial ou movê-la de pasta nunca muda a key. Prefira key para qualquer credencial referenciada de fora da plataforma:

credencial = client.credentials.reveal_by_key("financeiro/senha-sap")

client.credentials.rotate_by_key("financeiro/senha-sap", "novo-valor")

client.credentials.expire_by_key("financeiro/senha-sap", "Login rejeitado pelo site do fornecedor")

Arquitetura

Módulo Responsabilidade
client.py RobotClient - fachada única que compõe as peças abaixo
connection.py SocketConnection - handshake, heartbeat automático, reconexão, call/emit
execution.py ExecutionManager - ciclo execution:start / execution:task / execution:finish
queue.py QueueConsumer - queue:next / queue:task-result, iteração da fila
credentials.py CredentialManager - reveal/rotate/expire, por id ou key, via REST
protocol.py Constantes do protocolo (namespace, nomes de eventos, rotas REST)
exceptions.py Hierarquia de exceções do SDK (RobotSDKError e subclasses)
utils.py Funções utilitárias reutilizáveis (detecção de plataforma, hostname, timestamps)
loggers.py Configuração do loguru compartilhada pelo SDK
models/ Modelos de dados e enums (Pydantic), espelhando os DTOs/enums do backend

Cada classe tem uma única responsabilidade (SRP): a conexão bruta não sabe o que é uma execução, a execução não sabe como a fila funciona, e o RobotClient só orquestra as três. Novos comportamentos (ex.: outro jeito de processar tasks) se registram via on_automation_start/queue.processing, sem precisar alterar essas classes.

Modelos e enums (models/)

Todos os payloads trocados com a plataforma são validados com Pydantic e convertidos entre snake_case (Python) e camelCase (protocolo) automaticamente via SdkBaseModel. Os enums (TaskStatus, RobotInstanceStatus, Platform, ...) espelham exatamente os enums TypeScript usados por RobotGateway no backend.

Logs

O SDK usa loguru e já vem configurado com um formato legível por padrão. Para customizar (nível, arquivo de destino, JSON estruturado):

from zsynctech_studio_sdk.loggers import configure_logging

configure_logging(level="DEBUG", sink="robot.log")

Chame antes de criar o RobotClient.

Desenvolvimento

uv run pytest                          # testes
uv run ruff check src examples tests   # lint
uv run ruff format src examples tests  # formatação
uv run mypy src examples tests         # checagem de tipos (modo strict)

ruff e mypy só olham src/examples/tests (não o README) - a partir do ruff 0.12+ o ruff format também reformata blocos de código Python dentro de Markdown, o que reescreveria os exemplos deste arquivo com as convenções de um .py (2 linhas em branco antes de decorators etc.) toda vez que rodasse. CI usa esse mesmo escopo (veja .github/workflows/ci.yml).

Release files for zsynctech-studio-sdk 1.4.6

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for zsynctech-studio-sdk 1.4.6
File Size Uploaded
zsynctech_studio_sdk-1.4.6.tar.gz 18.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for zsynctech-studio-sdk 1.4.6
File Interpreter ABI Platform
zsynctech_studio_sdk-1.4.6-py3-none-any.whl Python 3 none any Details

Total release size: 45.4 kB

Release files / zsynctech_studio_sdk-1.4.6.tar.gz

Download URL zsynctech_studio_sdk-1.4.6.tar.gz
Size 18.4 kB
Tags Source
SHA-256 checksum
How to use checksums
4d93ae153a3f1b44c8dc3e6e0971d7dcf71b17a8e4650998722ad7dc431d9be8
BLAKE2b-256 checksum
How to use checksums
5abbd20788e463fa12e86f9f829a27cfd8b8bf37b665e9619511d273d7ea68eb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.19 {"installer":{"name":"uv","version":"0.12.19","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / zsynctech_studio_sdk-1.4.6-py3-none-any.whl

Download URL zsynctech_studio_sdk-1.4.6-py3-none-any.whl
Size 27.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
cbbd29a8ca88380382db9fdcdff69e812aa1c781a4be527762269db04060d5af
BLAKE2b-256 checksum
How to use checksums
606c02c5fa26005540aba131dd34db959b879cb49ee4683d92e36af23388f294
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.19 {"installer":{"name":"uv","version":"0.12.19","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release history Release notifications | RSS feed

This release

1.4.6 This release

2 release files

1.4.5

2 release files

1.4.4

2 release files

1.4.3

2 release files

1.4.2

2 release files

1.4.1

2 release files

1.3.25

2 release files

1.3.24

2 release files

1.3.23

2 release files

1.3.22

2 release files

1.3.21

2 release files

1.3.20

2 release files

1.3.18

2 release files

1.3.17

2 release files

1.3.13

2 release files

1.3.12

2 release files

1.3.11

2 release files

1.3.10

2 release files

1.3.9

2 release files

1.3.8

2 release files

1.3.7

2 release files

1.3.6

2 release files

1.3.5

2 release files

1.3.4

2 release files

1.3.2

2 release files

1.3.1

2 release files

1.3.0

2 release files

1.2.0

2 release files

1.1.5

2 release files

1.1.4

2 release files

1.1.3

2 release files

1.1.2

2 release files

1.1.1

2 release files

1.1.0

2 release files

1.0.10

2 release files

1.0.9

2 release files

1.0.8

2 release files

1.0.7

2 release files

1.0.6

2 release files

1.0.5

2 release files

1.0.1

2 release files

1.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page