Skip to main content

Python SDK for Perceptic Workflow definitions - cross-language Temporal workflow types

Project description

Perceptic Workflow SDK

Python SDK for Perceptic Workflow definitions. This package provides cross-language Temporal workflow types that are compatible with the Java workflow definitions in perceptic-core-client.

Installation

uv add perceptic-workflow-sdk

Usage

Runtime Input Contract

Workflows started through Perceptic Core receive a typed envelope:

  • AgentInput[T] where:
    • run_rid identifies the run
    • user_id identifies the authenticated caller
    • payload contains your workflow-specific input model T

On the wire, Perceptic Core sends camelCase (runRid, userId, payload). In Python, use snake_case (run_rid, user_id, payload) per PEP 8. The SDK handles alias mapping automatically.

Workflow Events

from perceptic_workflow import (
    WorkflowEvent,
    InfoEvent,
    CheckpointEvent,
    UserInputEvent,
    UserInputRequestEvent,
    WorkflowCheckpointStatus,
)

# Create events
info_event = InfoEvent(
    event_id=1,
    type="progress",
    payload={"step": "processing"},
    timestamp=datetime.now()
)

Implementing Workflows

The SDK provides a mixin class for implementing Perceptic-compatible workflows:

from pydantic import BaseModel
from temporalio import workflow
from perceptic_workflow import AgentInput, PercepticWorkflowMixin, WorkflowEvent


class ResearchInput(BaseModel):
    query: str
    context: str

@workflow.defn
class MyWorkflow(PercepticWorkflowMixin):
    def __init__(self):
        self._events: list[WorkflowEvent] = []
        self._paused = False

    @workflow.run
    async def run(self, input: AgentInput[ResearchInput]) -> dict:
        # Envelope fields use snake_case in Python.
        run_rid = input.run_rid
        user_id = input.user_id
        request = input.payload

        if request is None:
            raise ValueError("payload is required")

        return {
            "runRid": run_rid,
            "userId": user_id,
            "query": request.query,
            "context": request.context,
        }

    @workflow.update(name=PercepticWorkflowMixin.UPDATE_SUBMIT_USER_INPUT)
    async def submit_user_input(self, inputs: dict) -> None:
        self._paused = False
        # Handle user input

    @workflow.update(name=PercepticWorkflowMixin.UPDATE_INTERRUPT)
    async def interrupt(self, reason: str) -> None:
        # Handle interruption
        pass

    @workflow.query(name=PercepticWorkflowMixin.QUERY_IS_PAUSED)
    def is_paused(self) -> bool:
        return self._paused

    @workflow.query(name=PercepticWorkflowMixin.QUERY_GET_EVENTS)
    def get_events(self, after_event_id: int | None = None) -> list[WorkflowEvent]:
        if after_event_id is None:
            return self._events
        return [e for e in self._events if e.event_id > after_event_id]

Decorator Validation

PercepticWorkflowMixin validates required Temporal handlers at class definition time. If any required method is missing a decorator, uses the wrong decorator kind, or uses the wrong reserved handler name, class creation raises TypeError.

Example error shape:

TypeError: MyWorkflow must implement Perceptic workflow handlers with the required Temporal decorators:
- Method 'submit_user_input' is not decorated with a Temporal handler. Expected @workflow.update(name=MyWorkflow.UPDATE_SUBMIT_USER_INPUT)

For static feedback before runtime, run type checks and the mixin checker together:

uv run ty check
uv run workflow-typecheck

Troubleshooting

  • ValidationError: Field required ... run_rid/user_id during workflow activation usually means your @workflow.run signature expects the wrong shape.
  • Use AgentInput[YourPayloadModel] for the first workflow argument, not a flattened domain model.
  • For run-start requests, send runRid and inputs; userId is derived from auth context by Perceptic Core.

Compatibility

This package is designed to be compatible with:

  • perceptic-core-client (Java)
  • perceptic-core-workflow-runtime (Java)

The workflow definitions and event types are generated from the same JSON Schema sources to ensure cross-language compatibility.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

perceptic_workflow_sdk-0.50.97.tar.gz (7.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

perceptic_workflow_sdk-0.50.97-py3-none-any.whl (12.3 kB view details)

Uploaded Python 3

File details

Details for the file perceptic_workflow_sdk-0.50.97.tar.gz.

File metadata

  • Download URL: perceptic_workflow_sdk-0.50.97.tar.gz
  • Upload date:
  • Size: 7.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for perceptic_workflow_sdk-0.50.97.tar.gz
Algorithm Hash digest
SHA256 a73741c340b24ab3377321b9c9a2a205e9c7f9d7a76b113d737fa72dd10b4f53
MD5 ea6af1db33198132db7791276c8a3d1a
BLAKE2b-256 c1382deca06dca54a004ce14e39e778c3ceba415afee5abb85b51e4cc1d6384b

See more details on using hashes here.

Provenance

The following attestation bundles were made for perceptic_workflow_sdk-0.50.97.tar.gz:

Publisher: publish-python.yml on perceptic/perceptic-core

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file perceptic_workflow_sdk-0.50.97-py3-none-any.whl.

File metadata

File hashes

Hashes for perceptic_workflow_sdk-0.50.97-py3-none-any.whl
Algorithm Hash digest
SHA256 6c055e5534c33dc78f63e894baa7d324144e96961b7ab0f5036114cbb14df185
MD5 4125d5f84c1bafa75de94f3928b34803
BLAKE2b-256 f8274f7fcd6916aaa2653ae1fb5a7c2b28f71479fa4b906d2f85e8cf87922b5f

See more details on using hashes here.

Provenance

The following attestation bundles were made for perceptic_workflow_sdk-0.50.97-py3-none-any.whl:

Publisher: publish-python.yml on perceptic/perceptic-core

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page