Skip to main content

SLIM-powered messaging

Project description

Pattern Agentic Messaging

An async SLIM wrapper with a FastAPI-like interface

Installation

pip install pattern_agentic_messaging

Server

Route messages to decorated handlers based on a discriminator field:

from pattern_agentic_messaging import PASlimApp, PASlimConfig
from .models import QuestionRequest, StatusRequest, AnswerResponse

config = PASlimConfig(
    local_name="org/ns/server",
    endpoint="https://slim.example.com",
    auth_secret="shared-secret-at-least-32-bytes!",
    message_discriminator="type",
)

app = PASlimApp(config)

@app.on_session_connect
async def on_connect(session):
    session.context["agent"] = await create_agent(...)

@app.on_message
async def handle_prompt(session, msg: QuestionRequest):
    agent = session.context["agent"]
    response = await agent.ask(msg.question)
    await session.send(AnswerResponse(answer=response))

@app.on_message
async def handle_status(session, msg: StatusRequest):
    await session.send({"type": "status", "value": "ready"})

@app.on_message
async def handle_other(session, msg):
    await session.send({"error": f"Unknown message type: {msg}"})

app.run()

Discriminator models are Pydantic models with a Literal field matching the discriminator:

from pydantic import BaseModel
from typing import Literal

class QuestionRequest(BaseModel):
    type: Literal["question"] = "question"
    prompt: str

class AnswerResponse(BaseModel):
    type: Literal["answer"] = "answer"
    answer: str

Authentication

Fluent configuration for three auth modes:

from pattern_agentic_messaging import PASlimConfig

# No auth (for local dev / data planes configured with auth: none)
config = PASlimConfig(local_name="org/ns/app", endpoint="...").with_no_auth()

# Shared secret
config = PASlimConfig(local_name="org/ns/app", endpoint="...").with_shared_secret("my-secret-key-at-least-32-bytes!")

# JWT with JWKS verification
config = PASlimConfig(
    local_name="org/ns/app", endpoint="...",
).with_jwt_auth(
    "path/to/service.token",
    jwks_url="https://auth.example.com/.well-known/jwks.json",
    issuer="my-issuer",
    audience=["svc-b"],
)

Passing auth_secret= directly still works for backward compatibility with shared secret auth.

MessageContext

Handlers can optionally receive SLIM message context (sender identity, metadata, etc.) by adding a typed parameter:

from pattern_agentic_messaging import MessageContext

@app.on_message
async def handle(session, msg, msg_context: MessageContext):
    print(msg_context.source_name)       # sender identity
    print(msg_context.destination_name)   # destination
    print(msg_context.metadata)           # sender-supplied k/v pairs

Handlers without this parameter work as before.

Client

Connect to a specific peer:

config = PASlimConfig(
    local_name="org/ns/client",
    endpoint="https://slim.example.com",
    auth_secret="shared-secret-at-least-32-bytes!",
)

async with PASlimApp(config) as app:
    async with await app.connect("org/ns/server") as session:
        await session.send({"type": "prompt", "prompt": "Hello world!"})
        async for msg in session:
            print(f"RECEIVED: {msg}")

Join a group channel:

async with PASlimApp(config) as app:
    async with await app.join_channel() as session:
        async for msg in session:
            await session.send({"type": "response", "msg": "received"})

A2A Message Models

Lightweight Pydantic models for the A2A protocol message types, useful for constructing A2A-compliant payloads from clients:

from pattern_agentic_messaging.a2a import Message, Part, Role

msg = Message(role=Role.USER, parts=[Part.from_text("What time is it?")])
await session.send(msg.model_dump(by_alias=True, exclude_none=True))

Low-level usage

The decorator pattern's underlying API can be used directly:

async with PASlimApp(config) as app:
    async for session, msg in app:
        result = await process(msg["prompt"])
        await session.send({"result": result})

Message Types

All messages carry a metadata.__pa_type discriminator. See docs/message-types.md.

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

pattern_agentic_messaging-1.5.0.dev0.tar.gz (46.2 kB view details)

Uploaded Source

Built Distribution

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

pattern_agentic_messaging-1.5.0.dev0-py3-none-any.whl (23.1 kB view details)

Uploaded Python 3

File details

Details for the file pattern_agentic_messaging-1.5.0.dev0.tar.gz.

File metadata

File hashes

Hashes for pattern_agentic_messaging-1.5.0.dev0.tar.gz
Algorithm Hash digest
SHA256 93e85d53b04f1670356622edf59ba6667282225a7ff4323f51d1df33dd05c467
MD5 6eecee9c608abd43cb06622352f03a0e
BLAKE2b-256 e686e7730d6872c6e60897e0e8dcbf20bc8c21475cf4d927ea12c4c6594c7493

See more details on using hashes here.

File details

Details for the file pattern_agentic_messaging-1.5.0.dev0-py3-none-any.whl.

File metadata

File hashes

Hashes for pattern_agentic_messaging-1.5.0.dev0-py3-none-any.whl
Algorithm Hash digest
SHA256 9d705d945bd896aefa0d2d0dec68ad7897853155e3719a91aae01c231e7ab77b
MD5 baba44e325ee01dbd6e8ba9aa785e1c8
BLAKE2b-256 cb20d48935c27018c8aeceecb9e15be78767da55b6ec05b8f232e6ce25649fb3

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