Skip to main content

pydantically-type-adapted-grpc framework for multimodal architectures team

Project description

mmar-ptag

pydantically-type-adapted-grpc framework for multimodal architectures team

The main goal: simplify defining type-safe Python interfaces to separate services.

Installation

pip install mmar-ptag

Quick Start

1. Define the Service

from types import SimpleNamespace
from mmar_ptag import deploy_server

class Greeter:
    def say_hello(self, *, name: str, count: int = 1, trace_id: str = "") -> dict:
        return {"message": f"Hello, {name} x{count}"}

2. Run the Server

deploy_server(
    config_server=SimpleNamespace(port=50051, max_workers=10),
    service=Greeter()
)

3. Create a Client

from mmar_ptag import ptag_client

class Greeter:
    def say_hello(self, *, name: str, count: int = 1) -> dict:
        ...

client = ptag_client(Greeter, "localhost:50051")
result = client.say_hello(name="World", count=3)
print(result)  # {'message': 'Hello, World x3'}

Trace ID Support

The trace_id parameter enables distributed tracing across your service mesh. When included in a method signature, it is automatically propagated through the call chain.

from mmar_ptag import ptag_client

class UserService:
    def get_user(self, *, user_id: int, trace_id: str = "") -> dict:
        ...

client = ptag_client(UserService, "localhost:50051")

# Trace ID is automatically propagated through the call chain
result = client.get_user(user_id=123, trace_id="request-abc-123")

The trace_id value is stored in mmar_ptag.ptag_framework.TRACE_ID_VAR, making it accessible throughout the request lifecycle without manual passing.

How It Works

ptag uses Pydantic adapters to handle type conversion between Python and gRPC/protobuf.

Example: client.say_hello(name="World", count=3)

Client flow (sending request):

{name="World", count=3}
    -(args tuple)->
("World", 3)
    -(args_adapter.dump_json)->
["World", 3]
    -(wrap in PTAGRequest)->
b'\n\tsay_hello\x12\x0c["World", 3]'
    -(server receives)->

Server flow (processing & responding):

b'\n\tsay_hello\x12\x0c["World", 3]'
    -(args_adapter.validate_json)->
["World", 3]
    -(bind to kwargs)->
{name="World", count=3}
    -(say_hello method)->
{"message": "Hello, World x3"}
    -(result_adapter.dump_json)->
{"message": "Hello, World x3"}
    -(wrap in PTAGResponse)->
b'\n\tsay_hello\x12\x1e{"message": "Hello, World x3"}'
    -(client receives)->

Client flow (receiving response):

b'\n\tsay_hello\x12\x1e{"message": "Hello, World x3"}'
    -(return_adapter.validate_json)->
{"message": "Hello, World x3"}

This ensures:

  • Arguments are validated and serialized before sending
  • Return values are deserialized and validated after receiving
  • Type safety across the wire without manual protobuf definitions

Features

  • Type-safe RPC using Pydantic for validation
  • Automatic reconnection with configurable retry attempts
  • Built-in tracing with trace ID support
  • Interface-based design – define services as Python classes
  • Keyword-only arguments – explicit and readable API

API Reference

ptag_client(interface, address, reconnect_attempts=5)

Create a dynamic client for the given interface at the provided gRPC address.

  • interface: Type (class) defining the service interface
  • address: gRPC server address (e.g., "localhost:50051")
  • reconnect_attempts: Number of retry attempts on connection failure (default: 5)

ptag_attach(server, service_object)

Attach a service object to an existing gRPC server.

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

mmar_ptag-1.0.26.tar.gz (9.4 kB view details)

Uploaded Source

Built Distribution

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

mmar_ptag-1.0.26-py3-none-any.whl (12.2 kB view details)

Uploaded Python 3

File details

Details for the file mmar_ptag-1.0.26.tar.gz.

File metadata

  • Download URL: mmar_ptag-1.0.26.tar.gz
  • Upload date:
  • Size: 9.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.6.13

File hashes

Hashes for mmar_ptag-1.0.26.tar.gz
Algorithm Hash digest
SHA256 5c8007c23a1668d3f6af7f11f3032ffcd66830859feda8da2e6641c6c01a221a
MD5 bf1c8556e2d7814a4cea6d5387fd9123
BLAKE2b-256 62a7b6a6dd0c7e7b8be87e3cbccd6dd52002287688a73ceda7145cc395506da0

See more details on using hashes here.

File details

Details for the file mmar_ptag-1.0.26-py3-none-any.whl.

File metadata

  • Download URL: mmar_ptag-1.0.26-py3-none-any.whl
  • Upload date:
  • Size: 12.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.2

File hashes

Hashes for mmar_ptag-1.0.26-py3-none-any.whl
Algorithm Hash digest
SHA256 f1a1b2a0be955e3556f768b5a423f82f7087b6d121724f0dd094ae4e1d546b8a
MD5 65eff4ed4a893f4bf69377405e856fe4
BLAKE2b-256 d0f61fa2c4250f852b718a02f745b90adb473c3c9066fd00b34b998a937fcdb8

See more details on using hashes here.

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