Skip to main content

SLIM Rust bindings for Python

Project description

SLIM Python Bindings

Bindings to call the SLIM APIs from a python program.

Installation

pip install slim-bindings

Include as dependency

With pyproject.toml

[project]
name = "slim-example"
version = "0.1.0"
description = "Python program using SLIM"
requires-python = ">=3.9"
dependencies = [
    "slim-bindings>=0.1.0"
]

With poetry project

[tool.poetry]
name = "slim-example"
version = "0.1.0"
description = "Python program using SLIM"

[tool.poetry.dependencies]
python = ">=3.9,<3.14"
slim-bindings = ">=0.1.0"

Example programs

Server

# Copyright AGNTCY Contributors (https://github.com/agntcy)
# SPDX-License-Identifier: Apache-2.0

import argparse
import asyncio
from signal import SIGINT

import slim_bindings


async def run_server(address: str, enable_opentelemetry: bool):
    # init tracing
    slim_bindings.init_tracing(
        {
            "log_level": "debug"
            "opentelemetry": {
                "enabled": enable_opentelemetry
            }
        }
    )

    global slim
    # create new slim object
    slim = await slim_bindings.Slim.new("cisco", "default", "slim")

    # Run as server
    await slim.run_server({"endpoint": address, "tls": {"insecure": True}})


async def main():
    parser = argparse.ArgumentParser(
        description="Command line client for slim server."
    )
    parser.add_argument(
        "-s", "--slim", type=str, help="SLIM address.", default="127.0.0.1:12345"
    )
    parser.add_argument(
        "--enable-opentelemetry",
        "-t",
        action="store_true",
        default=False,
        help="Enable OpenTelemetry tracing.",
    )

    args = parser.parse_args()

    # Create an asyncio event to keep the loop running until interrupted
    stop_event = asyncio.Event()

    # Define a shutdown handler to set the event when interrupted
    def shutdown():
        print("\nShutting down...")
        stop_event.set()

    # Register the shutdown handler for SIGINT
    loop = asyncio.get_running_loop()
    loop.add_signal_handler(SIGINT, shutdown)

    # Run the client task
    client_task = asyncio.create_task(
        run_server(args.slim, args.enable_opentelemetry)
    )

    # Wait until the stop event is set
    await stop_event.wait()

    # Cancel the client task
    client_task.cancel()
    try:
        await client_task
    except asyncio.CancelledError:
        pass


if __name__ == "__main__":
    try:
        asyncio.run(main())
    except KeyboardInterrupt:
        print("Program terminated by user.")

PubSub Client

# Copyright AGNTCY Contributors (https://github.com/agntcy)
# SPDX-License-Identifier: Apache-2.0

import argparse
import asyncio
import datetime

import slim_bindings

class color:
    PURPLE = "\033[95m"
    CYAN = "\033[96m"
    DARKCYAN = "\033[36m"
    BLUE = "\033[94m"
    GREEN = "\033[92m"
    YELLOW = "\033[93m"
    RED = "\033[91m"
    BOLD = "\033[1m"
    UNDERLINE = "\033[4m"
    END = "\033[0m"


def format_message(message1, message2):
    return f"{color.BOLD}{color.CYAN}{message1.capitalize() :<45}{color.END}{message2}"


def split_id(id):
    # Split the IDs into their respective components
    try:
        local_organization, local_namespace, local_agent = id.split("/")
    except ValueError as e:
        print("Error: IDs must be in the format organization/namespace/agent.")
        raise e

    return local_organization, local_namespace, local_agent


async def run_client(local_id, remote_id, address, enable_opentelemetry: bool):
    # init tracing
    slim_bindings.init_tracing(
        {
            "log_level": "info"
            "opentelemetry": {
                "enabled": enable_opentelemetry
            }
        }
    )

    # Split the local IDs into their respective components
    local_organization, local_namespace, local_agent = split_id(local_id)

    # Split the remote IDs into their respective components
    remote_organization, remote_namespace, broadcast_topic = split_id(remote_id)

    name = f"{local_agent}"

    print(f"Creating participant {name}...")

    participant = await slim_bindings.Slim.new(
        local_organization, local_namespace, local_agent
    )

    # Connect to slim server
    _ = await participant.connect(
        {"endpoint": address, "tls": {"insecure": True}}
    )

    # set route for the chat, so that messages can be sent to the other participants
    await participant.set_route(remote_organization, remote_namespace, broadcast_topic)

    # Subscribe to the producer topic
    await participant.subscribe(remote_organization, remote_namespace, broadcast_topic)

    print(f"{name} -> Creating new pubsub sessions...")
    # create pubsubb session. A pubsub session is a just a bidirectional
    # streaming session, where participants are both sender and receivers
    session_info = await participant.create_session(
        slim_bindings.PySessionConfiguration.Streaming(
            slim_bindings.PySessionDirection.BIDIRECTIONAL,
            topic=slim_bindings.PyAgentType(
                remote_organization, remote_namespace, broadcast_topic
            ),
            max_retries=5,
            timeout=datetime.timedelta(seconds=5),
        )
    )

    # define the background task
    async def background_task():
        msg = f"Hello from {local_agent}"

        async with participant:
            while True:
                try:
                    # receive message from session
                    recv_session, msg_rcv = await participant.receive(
                        session=session_info.id
                    )

                    # Check if the message is calling this specific participant
                    # if not, ignore it
                    if local_agent in msg_rcv.decode():
                        # print the message
                        print(f"{name} -> Received message for me: {msg_rcv.decode()}")

                        # send the message to the next participant
                        await participant.publish(
                            recv_session,
                            msg.encode(),
                            remote_organization,
                            remote_namespace,
                            broadcast_topic,
                        )

                        print(f"{name} -> Sending message to all participants: {msg}")
                    else:
                        print(
                            f"{name} -> Receiving message: {msg_rcv.decode()} - not for me."
                        )
                except asyncio.CancelledError:
                    break
                except Exception as e:
                    print(f"{name} -> Error receiving message: {e}")
                    break

    receive_task = asyncio.create_task(background_task())

    async def background_task_keyboard():
        while True:
            user_input = await asyncio.to_thread(input, "message> ")
            if user_input == "exit":
                break

            # Send the message to the all participants
            await participant.publish(
                session_info,
                f"{user_input}".encode(),
                remote_organization,
                remote_namespace,
                broadcast_topic,
            )

        receive_task.cancel()

    send_task = asyncio.create_task(background_task_keyboard())

    # Wait for both tasks to finish
    await asyncio.gather(receive_task, send_task)


async def main():
    parser = argparse.ArgumentParser(
        description="Command line client for message passing."
    )
    parser.add_argument(
        "-l",
        "--local",
        type=str,
        help="Local ID in the format organization/namespace/agent.",
    )
    parser.add_argument(
        "-r",
        "--remote",
        type=str,
        help="Remote ID in the format organization/namespace/agent.",
    )
    parser.add_argument(
        "-s",
        "--slim",
        type=str,
        help="Slim address.",
        default="http://127.0.0.1:46357",
    )
    parser.add_argument(
        "-t",
        "--enable-opentelemetry",
        action="store_true",
        default=False,
        help="Enable OpenTelemetry tracing.",
    )

    args = parser.parse_args()

    # Run the client with the specified local ID, remote ID, and optional message
    await run_client(
        args.local,
        args.remote,
        args.slim,
        args.enable_opentelemetry,
    )


if __name__ == "__main__":
    try:
        asyncio.run(main())
    except KeyboardInterrupt:
        print("Program terminated by user.")

Streaming producer and consumer

# Copyright AGNTCY Contributors (https://github.com/agntcy)
# SPDX-License-Identifier: Apache-2.0

import argparse
import asyncio
import datetime
import os

import slim_bindings

class color:
    PURPLE = "\033[95m"
    CYAN = "\033[96m"
    DARKCYAN = "\033[36m"
    BLUE = "\033[94m"
    GREEN = "\033[92m"
    YELLOW = "\033[93m"
    RED = "\033[91m"
    BOLD = "\033[1m"
    UNDERLINE = "\033[4m"
    END = "\033[0m"


def format_message(message1, message2):
    return f"{color.BOLD}{color.CYAN}{message1.capitalize() :<45}{color.END}{message2}"


def split_id(id):
    # Split the IDs into their respective components
    try:
        local_organization, local_namespace, local_agent = id.split("/")
    except ValueError as e:
        print("Error: IDs must be in the format organization/namespace/agent.")
        raise e

    return local_organization, local_namespace, local_agent


async def run_client(
    local_id, remote_id, address, producer, enable_opentelemetry: bool
):
    # init tracing
    slim_bindings.init_tracing(
        {
            "log_level": "info"
            "opentelemetry": {
                "enabled": enable_opentelemetry
            }
        }
    )

    # Split the IDs into their respective components
    local_organization, local_namespace, local_agent = split_id(local_id)

    # create new slim object
    slim = await slim_bindings.Slim.new(
        local_organization, local_namespace, local_agent
    )

    # Connect to the service and subscribe for the local name
    print(format_message("connecting to:", address))
    _ = await slim.connect({"endpoint": address, "tls": {"insecure": True}})

    # Split the IDs into their respective components
    remote_organization, remote_namespace, broadcast_topic = split_id(remote_id)

    # Get the local agent instance from env
    instance = os.getenv("SLIM_INSTANCE_ID", local_agent)

    async with slim:
        if producer:
            # Create a route to the remote ID
            await slim.set_route(
                remote_organization, remote_namespace, broadcast_topic
            )

            # create streaming session with default config
            session_info = await slim.create_session(
                slim_bindings.PySessionConfiguration.Streaming(
                    slim_bindings.PySessionDirection.SENDER,
                    topic=None,
                    max_retries=5,
                    timeout=datetime.timedelta(seconds=5),
                )
            )

            # initialize count
            count = 0

            while True:
                try:
                    # Send a message
                    print(
                        format_message(
                            f"{instance} streaming message to {remote_organization}/{remote_namespace}/{broadcast_topic}: ",
                            f"{count}",
                        )
                    )

                    # Send the message and wait for a reply
                    await slim.publish(
                        session_info,
                        f"{count}".encode(),
                        remote_organization,
                        remote_namespace,
                        broadcast_topic,
                    )

                    count += 1
                except Exception as e:
                    print("received error: ", e)
                finally:
                    await asyncio.sleep(1)
        else:
            # subscribe to streaming session
            await slim.subscribe(
                remote_organization, remote_namespace, broadcast_topic
            )

            # Wait for messages and not reply
            while True:
                session_info, _ = await slim.receive()
                print(
                    format_message(
                        f"{instance.capitalize()} received a new session:",
                        f"{session_info.id}",
                    )
                )

                async def background_task(session_info):
                    while True:
                        # Receive the message from the session
                        session, msg = await slim.receive(session=session_info)
                        print(
                            format_message(
                                f"{local_agent.capitalize()} received from {remote_organization}/{remote_namespace}/{broadcast_topic}: ",
                                f"{msg.decode()}",
                            )
                        )

                asyncio.create_task(background_task(session_info.id))


async def main():
    parser = argparse.ArgumentParser(
        description="Command line client for message passing."
    )
    parser.add_argument(
        "-l",
        "--local",
        type=str,
        help="Local ID in the format organization/namespace/agent.",
    )
    parser.add_argument(
        "-r",
        "--remote",
        type=str,
        help="Remote ID in the format organization/namespace/agent.",
    )
    parser.add_argument(
        "-s",
        "--slim",
        type=str,
        help="SLIM address.",
        default="http://127.0.0.1:46357",
    )
    parser.add_argument(
        "-t",
        "--enable-opentelemetry",
        action="store_true",
        default=False,
        help="Enable OpenTelemetry tracing.",
    )
    parser.add_argument(
        "-p",
        "--producer",
        action="store_true",
        default=False,
        help="Enable producer mode.",
    )

    args = parser.parse_args()

    # Run the client with the specified local ID, remote ID, and optional message
    await run_client(
        args.local,
        args.remote,
        args.slim,
        args.producer,
        args.enable_opentelemetry,
    )


if __name__ == "__main__":
    try:
        asyncio.run(main())
    except KeyboardInterrupt:
        print("Program terminated by user.")

Fire And Forget sender and receiver

# Copyright AGNTCY Contributors (https://github.com/agntcy)
# SPDX-License-Identifier: Apache-2.0

import argparse
import asyncio
import os

import slim_bindings


class color:
    PURPLE = "\033[95m"
    CYAN = "\033[96m"
    DARKCYAN = "\033[36m"
    BLUE = "\033[94m"
    GREEN = "\033[92m"
    YELLOW = "\033[93m"
    RED = "\033[91m"
    BOLD = "\033[1m"
    UNDERLINE = "\033[4m"
    END = "\033[0m"


def format_message(message1, message2):
    return f"{color.BOLD}{color.CYAN}{message1.capitalize() :<45}{color.END}{message2}"


def split_id(id):
    # Split the IDs into their respective components
    try:
        local_organization, local_namespace, local_agent = id.split("/")
    except ValueError as e:
        print("Error: IDs must be in the format organization/namespace/agent.")
        raise e

    return local_organization, local_namespace, local_agent


async def run_client(
    local_id: str,
    remote_id: str,
    message: str,
    address: str,
    iterations: int,
    enable_opentelemetry: bool,
):
    # init tracing
    slim_bindings.init_tracing(
        {
            "log_level": "info"
            "opentelemetry": {
                "enabled": enable_opentelemetry
            }
        }
    )

    local_organization, local_namespace, local_agent = split_id(local_id)

    # create new slim object
    slim = await slim_bindings.Slim.new(
        local_organization, local_namespace, local_agent
    )

    # Connect to remote slim server
    print(format_message(f"connecting to: {address}"))
    _ = await slim.connect({"endpoint": address, "tls": {"insecure": True}})

    # Get the local agent instance from env
    instance = os.getenv("SLIM_INSTANCE_ID", local_agent)

    async with slim:
        if message:
            # Split the IDs into their respective components
            remote_organization, remote_namespace, remote_agent = split_id(remote_id)

            # Create a route to the remote ID
            await slim.set_route(remote_organization, remote_namespace, remote_agent)

            # create a session
            session = await slim.create_session(
                slim_bindings.PySessionConfiguration.FireAndForget()
            )

            for i in range(0, iterations):
                try:
                    # Send the message
                    await slim.publish(
                        session,
                        message.encode(),
                        remote_organization,
                        remote_namespace,
                        remote_agent,
                    )
                    print(format_message(f"{instance} sent:", message))

                    # Wait for a reply
                    session_info, msg = await slim.receive(session=session.id)
                    print(
                        format_message(
                            f"{instance.capitalize()} received (from session {session_info.id}):",
                            f"{msg.decode()}",
                        )
                    )
                except Exception as e:
                    print("received error: ", e)

                await asyncio.sleep(1)
        else:
            # Wait for a message and reply in a loop
            while True:
                session_info, _ = await slim.receive()
                print(
                    format_message(
                        f"{instance.capitalize()} received a new session:",
                        f"{session_info.id}",
                    )
                )

                async def background_task(session_id):
                    while True:
                        # Receive the message from the session
                        session, msg = await slim.receive(session=session_id)
                        print(
                            format_message(
                                f"{instance.capitalize()} received (from session {session_id}):",
                                f"{msg.decode()}",
                            )
                        )

                        ret = f"{msg.decode()} from {instance}"

                        await slim.publish_to(session, ret.encode())
                        print(format_message(f"{instance.capitalize()} replies:", ret))

                asyncio.create_task(background_task(session_info.id))


async def main():
    parser = argparse.ArgumentParser(
        description="Command line client for message passing."
    )
    parser.add_argument(
        "-l",
        "--local",
        type=str,
        help="Local ID in the format organization/namespace/agent.",
    )
    parser.add_argument(
        "-r",
        "--remote",
        type=str,
        help="Remote ID in the format organization/namespace/agent.",
    )
    parser.add_argument("-m", "--message", type=str, help="Message to send.")
    parser.add_argument(
        "-s",
        "--slim",
        type=str,
        help="SLIM address.",
        default="http://127.0.0.1:46357",
    )
    parser.add_argument(
        "-i",
        "--iterations",
        type=int,
        help="Number of messages to send, one per second.",
    )
    parser.add_argument(
        "-t",
        "--enable-opentelemetry",
        action="store_true",
        default=False,
        help="Enable OpenTelemetry tracing.",
    )

    args = parser.parse_args()

    # Run the client with the specified local ID, remote ID, and optional message
    await run_client(
        args.local,
        args.remote,
        args.message,
        args.slim,
        args.iterations,
        args.enable_opentelemetry,
    )


if __name__ == "__main__":
    try:
        asyncio.run(main())
    except KeyboardInterrupt:
        print("Program terminated by user.")

Request/Response Requester and Responder

# Copyright AGNTCY Contributors (https://github.com/agntcy)
# SPDX-License-Identifier: Apache-2.0

import argparse
import asyncio
import os

import slim_bindings


class color:
    PURPLE = "\033[95m"
    CYAN = "\033[96m"
    DARKCYAN = "\033[36m"
    BLUE = "\033[94m"
    GREEN = "\033[92m"
    YELLOW = "\033[93m"
    RED = "\033[91m"
    BOLD = "\033[1m"
    UNDERLINE = "\033[4m"
    END = "\033[0m"


def format_message(message1, message2):
    return f"{color.BOLD}{color.CYAN}{message1.capitalize() :<45}{color.END}{message2}"


def split_id(id):
    # Split the IDs into their respective components
    try:
        local_organization, local_namespace, local_agent = id.split("/")
    except ValueError as e:
        print("Error: IDs must be in the format organization/namespace/agent.")
        raise e

    return local_organization, local_namespace, local_agent


async def run_client(local_id, remote_id, message, address, enable_opentelemetry: bool):
    # init tracing
    slim_bindings.init_tracing(
        {
            "log_level": "info"
            "opentelemetry": {
                "enabled": enable_opentelemetry
            }
        }
    )

    # Split the IDs into their respective components
    local_organization, local_namespace, local_agent = split_id(local_id)

    # create new slim object
    slim = await slim_bindings.Slim.new(
        local_organization, local_namespace, local_agent
    )

    # Connect to the service and subscribe for the local name
    print(format_message("connecting to:", address))
    _ = await slim.connect({"endpoint": address, "tls": {"insecure": True}})

    # Get the local agent instance from env
    instance = os.getenv("SLIM_INSTANCE_ID", local_agent)

    async with slim:
        if message:
            # Split the IDs into their respective components
            remote_organization, remote_namespace, remote_agent = split_id(remote_id)

            # Create a route to the remote ID
            await slim.set_route(remote_organization, remote_namespace, remote_agent)

            # create a session
            session = await slim.create_session(
                slim_bindings.PySessionConfiguration.RequestResponse()
            )

            try:
                # Send the message and wait for a reply
                session_info, reply = await slim.request_reply(
                    session,
                    message.encode(),
                    remote_organization,
                    remote_namespace,
                    remote_agent,
                )
                print(format_message(f"{instance} sent:", message))

                # Print reply and exit
                print(
                    format_message(
                        f"{instance} received (from session {session_info.id}):",
                        f"{reply.decode()}",
                    )
                )

            except Exception as e:
                print("received error: ", e)
        else:
            # Wait for a message and reply in a loop
            while True:
                session_info, _ = await slim.receive()
                print(
                    format_message(
                        f"{instance.capitalize()} received a new session:",
                        f"{session_info.id}",
                    )
                )

                async def background_task(session_id):
                    while True:
                        # Receive the message from the session
                        session, msg = await slim.receive(session=session_id)
                        print(
                            format_message(
                                f"{instance.capitalize()} received (from session {session_id}):",
                                f"{msg.decode()}",
                            )
                        )

                        ret = f"{msg.decode()} from {instance}"

                        await slim.publish_to(session, ret.encode())
                        print(format_message(f"{instance.capitalize()} replies:", ret))

                asyncio.create_task(background_task(session_info.id))


async def main():
    parser = argparse.ArgumentParser(
        description="Command line client for message passing."
    )
    parser.add_argument(
        "-l",
        "--local",
        type=str,
        help="Local ID in the format organization/namespace/agent.",
    )
    parser.add_argument(
        "-r",
        "--remote",
        type=str,
        help="Remote ID in the format organization/namespace/agent.",
    )
    parser.add_argument("-m", "--message", type=str, help="Message to send.")
    parser.add_argument(
        "-s",
        "--slim",
        type=str,
        help="SLIM address.",
        default="http://127.0.0.1:46357",
    )

    parser.add_argument(
        "-t",
        "--enable-opentelemetry",
        action="store_true",
        default=False,
        help="Enable OpenTelemetry tracing.",
    )

    args = parser.parse_args()

    # Run the client with the specified local ID, remote ID, and optional message
    await run_client(
        args.local,
        args.remote,
        args.message,
        args.slim,
        args.enable_opentelemetry,
    )


if __name__ == "__main__":
    try:
        asyncio.run(main())
    except KeyboardInterrupt:
        print("Program terminated by user.")

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

slim_bindings-0.3.6.tar.gz (202.4 kB view details)

Uploaded Source

Built Distributions

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

slim_bindings-0.3.6-cp313-cp313-win_amd64.whl (5.0 MB view details)

Uploaded CPython 3.13Windows x86-64

slim_bindings-0.3.6-cp313-cp313-manylinux_2_34_x86_64.whl (6.4 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.34+ x86-64

slim_bindings-0.3.6-cp313-cp313-manylinux_2_34_aarch64.whl (6.2 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.34+ ARM64

slim_bindings-0.3.6-cp313-cp313-macosx_11_0_arm64.whl (5.7 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

slim_bindings-0.3.6-cp313-cp313-macosx_10_12_x86_64.whl (5.9 MB view details)

Uploaded CPython 3.13macOS 10.12+ x86-64

slim_bindings-0.3.6-cp312-cp312-win_amd64.whl (5.0 MB view details)

Uploaded CPython 3.12Windows x86-64

slim_bindings-0.3.6-cp312-cp312-manylinux_2_34_x86_64.whl (6.4 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.34+ x86-64

slim_bindings-0.3.6-cp312-cp312-manylinux_2_34_aarch64.whl (6.2 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.34+ ARM64

slim_bindings-0.3.6-cp312-cp312-macosx_11_0_arm64.whl (5.7 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

slim_bindings-0.3.6-cp312-cp312-macosx_10_12_x86_64.whl (5.9 MB view details)

Uploaded CPython 3.12macOS 10.12+ x86-64

slim_bindings-0.3.6-cp311-cp311-win_amd64.whl (5.0 MB view details)

Uploaded CPython 3.11Windows x86-64

slim_bindings-0.3.6-cp311-cp311-manylinux_2_34_x86_64.whl (6.4 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.34+ x86-64

slim_bindings-0.3.6-cp311-cp311-manylinux_2_34_aarch64.whl (6.2 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.34+ ARM64

slim_bindings-0.3.6-cp311-cp311-macosx_11_0_arm64.whl (5.7 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

slim_bindings-0.3.6-cp311-cp311-macosx_10_12_x86_64.whl (5.9 MB view details)

Uploaded CPython 3.11macOS 10.12+ x86-64

slim_bindings-0.3.6-cp310-cp310-win_amd64.whl (5.0 MB view details)

Uploaded CPython 3.10Windows x86-64

slim_bindings-0.3.6-cp310-cp310-manylinux_2_34_x86_64.whl (6.4 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.34+ x86-64

slim_bindings-0.3.6-cp310-cp310-manylinux_2_34_aarch64.whl (6.2 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.34+ ARM64

slim_bindings-0.3.6-cp310-cp310-macosx_11_0_arm64.whl (5.7 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

slim_bindings-0.3.6-cp310-cp310-macosx_10_12_x86_64.whl (5.9 MB view details)

Uploaded CPython 3.10macOS 10.12+ x86-64

slim_bindings-0.3.6-cp39-cp39-win_amd64.whl (5.0 MB view details)

Uploaded CPython 3.9Windows x86-64

slim_bindings-0.3.6-cp39-cp39-manylinux_2_34_x86_64.whl (6.4 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.34+ x86-64

slim_bindings-0.3.6-cp39-cp39-manylinux_2_34_aarch64.whl (6.2 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.34+ ARM64

slim_bindings-0.3.6-cp39-cp39-macosx_11_0_arm64.whl (5.7 MB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

slim_bindings-0.3.6-cp39-cp39-macosx_10_12_x86_64.whl (5.9 MB view details)

Uploaded CPython 3.9macOS 10.12+ x86-64

File details

Details for the file slim_bindings-0.3.6.tar.gz.

File metadata

  • Download URL: slim_bindings-0.3.6.tar.gz
  • Upload date:
  • Size: 202.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for slim_bindings-0.3.6.tar.gz
Algorithm Hash digest
SHA256 f0e0f5167f675eeb0c866c6dd11258a082afeb3944543b34fa75a546cc9e4682
MD5 14880c444edcc8d4001502c5337ab75f
BLAKE2b-256 76c1bd0e74f5bae0d5f691f567888f74673996dc4686201ddb2230f23bb032d3

See more details on using hashes here.

File details

Details for the file slim_bindings-0.3.6-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for slim_bindings-0.3.6-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 d81aa49eba4de9c0e6073585f08a26e92ef1a7c968ab56e7990c29f50584f537
MD5 da71b91b42a15e0683d146802d7510bd
BLAKE2b-256 e437125096cb6a973e5ea011025308fd1225fe676a1fd6f3eb3e07e35d248239

See more details on using hashes here.

File details

Details for the file slim_bindings-0.3.6-cp313-cp313-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for slim_bindings-0.3.6-cp313-cp313-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 63ec98167c5c7a773f88bea749443ffde57782627ea605c021b8ccf74b84de8c
MD5 939aee43b30e8cd950bed50174bb3370
BLAKE2b-256 23d847690138392230b3c3a4fcfccce217194ed88474889a7ac0d9943c7fb39a

See more details on using hashes here.

File details

Details for the file slim_bindings-0.3.6-cp313-cp313-manylinux_2_34_aarch64.whl.

File metadata

File hashes

Hashes for slim_bindings-0.3.6-cp313-cp313-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 23df7bc4fb386248a7529d279ca3d3ab0078e5512c89d3f526a739af209ae44d
MD5 b4fd2668ff7b8878d5037bd7e26f9316
BLAKE2b-256 355ad32dbe9ffc24b450a8659548b14878bb662494617e35ee16b7c088eedbd2

See more details on using hashes here.

File details

Details for the file slim_bindings-0.3.6-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for slim_bindings-0.3.6-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 096f1b6ac8943c472439d6518a4e2559c003b94212f86d9f10238c587f9e2981
MD5 a7fb5ebc8e1bc1b6cdf5087bfa0f1794
BLAKE2b-256 47e30c35da99f249995de87a6a27e139f2698cb9e0c54b966b41ca7152d4bb3b

See more details on using hashes here.

File details

Details for the file slim_bindings-0.3.6-cp313-cp313-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for slim_bindings-0.3.6-cp313-cp313-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 d113b6e969a054941784b10772deec027ffa336bec9e5e3a143a4929197a01ad
MD5 042a87efdeea3e52405df449cf6feae5
BLAKE2b-256 3c227bff0ba82e3f54fee363d76a606a51cb436cb5281175ec9765e620e1d418

See more details on using hashes here.

File details

Details for the file slim_bindings-0.3.6-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for slim_bindings-0.3.6-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 1d8974ab32321b387f693744f46c33802e238f9743b01ceb861e6e132c68eef7
MD5 83292392664647a2bb98e3928c247ab9
BLAKE2b-256 625994fa67dd2b5830828a36f3a61def40f0215e981c15ff799463aa6ed5e484

See more details on using hashes here.

File details

Details for the file slim_bindings-0.3.6-cp312-cp312-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for slim_bindings-0.3.6-cp312-cp312-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 74ff3aeb22715bd637ca0d3457c632dd9482a1974126fb4c5554bc1b6d4b48c9
MD5 0056ccd7b02c16b7625984f10e69772b
BLAKE2b-256 961114ddc5d7ee20294a2d195ce39963ceaef2066fc48e29635bee310f470b4e

See more details on using hashes here.

File details

Details for the file slim_bindings-0.3.6-cp312-cp312-manylinux_2_34_aarch64.whl.

File metadata

File hashes

Hashes for slim_bindings-0.3.6-cp312-cp312-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 1221acc781052ea24c9459abeea85a4a2701e92a7a3f69dffb320bd4cc983307
MD5 10cb1761fd4dbe453075ad037ac80eea
BLAKE2b-256 a496d074b11b0612cdd559122274c6b7e0f0be82336b50c4f46a5a7db6985187

See more details on using hashes here.

File details

Details for the file slim_bindings-0.3.6-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for slim_bindings-0.3.6-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 94fed05db7fb7ed78445267e894a6336d301323c13ee17b3f0e0568ff562ec45
MD5 bede8a2283c1b6fb2b4ab4a42e675966
BLAKE2b-256 12abc810884aa03728006320e3948c8ff01dd005649afd8951af5d2dd587f43d

See more details on using hashes here.

File details

Details for the file slim_bindings-0.3.6-cp312-cp312-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for slim_bindings-0.3.6-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 16f6861b531067bf542891d072aabdc9ddba9cf6537f2ef260466c324818dbbb
MD5 92ba31ca240c51b36b0af7f2d7f2b07e
BLAKE2b-256 5748104f15a66996af2675fc383c112558cd92e40c109429443e772333d5e6e5

See more details on using hashes here.

File details

Details for the file slim_bindings-0.3.6-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for slim_bindings-0.3.6-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 e2de3ffbb29b0c67d04190e890a60eca2280a50ac0b31bd2a192d08b2325d281
MD5 791c1a47ac2f20c263e8a64afc7d71e0
BLAKE2b-256 be5e22156d64aec134280563dd60a464d014cd3c891b91d9c54402caf47faa75

See more details on using hashes here.

File details

Details for the file slim_bindings-0.3.6-cp311-cp311-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for slim_bindings-0.3.6-cp311-cp311-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 b4b3809380a5dd24799458a260c69344519fb4fd7c93d6eafccdf3bc10c4be03
MD5 7c25c9499b115e05bc839a7f9f879ea8
BLAKE2b-256 af4069bd874056f5a07bf86e0c6005a5585873d3ab286daea1ccb0505cf2c0f2

See more details on using hashes here.

File details

Details for the file slim_bindings-0.3.6-cp311-cp311-manylinux_2_34_aarch64.whl.

File metadata

File hashes

Hashes for slim_bindings-0.3.6-cp311-cp311-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 8143500f6359b8ac8fda8712d6e68f02ce48f9feb5e4bdd176233bdf39c89b2d
MD5 2c082195c92a9820cb98e05ad57127b0
BLAKE2b-256 282f48be3b9a7799ffff726f8632b3b4ee11268c6ee0bbb1757300bdbb7648e0

See more details on using hashes here.

File details

Details for the file slim_bindings-0.3.6-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for slim_bindings-0.3.6-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 301dc1affe2f82272d4dba8aa51f4ce22524fc042cde8973b325f9cf4b991226
MD5 0369ccfdc4cce29cef3b0191579da0cf
BLAKE2b-256 44ebe546aa7244e0a6d69f38bbd98b5fa6eda0557917e0fb250699c024bc632e

See more details on using hashes here.

File details

Details for the file slim_bindings-0.3.6-cp311-cp311-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for slim_bindings-0.3.6-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 99c81676b9cb1eadc001cc1bdeb885862df98fae8cf43a21fc053ca32e21007b
MD5 cb5eba9f330171027b4df2051c15e3d5
BLAKE2b-256 5bb367025031751b1afe07f316d71beb64b37ccd1e1737df98bc83988a35d130

See more details on using hashes here.

File details

Details for the file slim_bindings-0.3.6-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for slim_bindings-0.3.6-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 5805cf2a70334a7158fe6525b2e6f2b179258e220bad911c3e7ca5f4223cec7f
MD5 c5fb721bfe1e7faf08a62da67f997885
BLAKE2b-256 7bcf49231928a4f11282970d7bf78f0c57df4cf21c56ea9a07f51db27c92ca7b

See more details on using hashes here.

File details

Details for the file slim_bindings-0.3.6-cp310-cp310-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for slim_bindings-0.3.6-cp310-cp310-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 0430911a2e7167c6066190b876f5e5fd396538073b686dfb0e57a6e8f91c64a0
MD5 681f8dd14aea28495a21962301353f5d
BLAKE2b-256 6e89c08ad26aff5fc005e588a7b3cc9898a8a43f1adb9e460a3c0669c72fc6f6

See more details on using hashes here.

File details

Details for the file slim_bindings-0.3.6-cp310-cp310-manylinux_2_34_aarch64.whl.

File metadata

File hashes

Hashes for slim_bindings-0.3.6-cp310-cp310-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 0d49ca430896d07ad69a89a624c37a9e0f8d3a87822ac123e3be7a4a5022c35d
MD5 a4d92010851c9950923ef3f3a40808b2
BLAKE2b-256 a6e514338d1d78438800c0971103c5c307e6aac326747675dd032e7491eba7ab

See more details on using hashes here.

File details

Details for the file slim_bindings-0.3.6-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for slim_bindings-0.3.6-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4bb5fcc5f210ccd8b7873c866b2b70bd1ef146a3cbf2ba7c169ab521b3b9ffda
MD5 6e52ae0bc1d2c1afe7e4d4edba017e66
BLAKE2b-256 b8439ce3e44fc2081b10f633b602820e71fe32b097cf4a4ae16fb860aeba8911

See more details on using hashes here.

File details

Details for the file slim_bindings-0.3.6-cp310-cp310-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for slim_bindings-0.3.6-cp310-cp310-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 9be6076f11577f978d0e59e10fc7ba7f17d29f5b1b9a0641dc4f65b41e3e21bb
MD5 9b12bc50313fb799d06a4f6df0d2e184
BLAKE2b-256 467af470d0774095568f299144e0019eddcca3490bb194a72b97970799e6cd8d

See more details on using hashes here.

File details

Details for the file slim_bindings-0.3.6-cp39-cp39-win_amd64.whl.

File metadata

File hashes

Hashes for slim_bindings-0.3.6-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 423fdc40a65b71fc7592c79dcee626dc98139a40e8b6d30c1c24c47f16a5068d
MD5 9c862ea4cef406c0174153631f9651b8
BLAKE2b-256 5deffbb3f1cc38473afc59d6e122229b0e4134fb643d33b092a98c41a631c48d

See more details on using hashes here.

File details

Details for the file slim_bindings-0.3.6-cp39-cp39-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for slim_bindings-0.3.6-cp39-cp39-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 10aa8fd105d183abd77d8e21900d4f013115da55ee62730349bfd99e3d314b97
MD5 0ae978ceed5dc65101d96de02dd58ce4
BLAKE2b-256 4e28e4152002e601ef01a61745f6b3dfc38f1f48d1ffcdf26bfde976bb77145d

See more details on using hashes here.

File details

Details for the file slim_bindings-0.3.6-cp39-cp39-manylinux_2_34_aarch64.whl.

File metadata

File hashes

Hashes for slim_bindings-0.3.6-cp39-cp39-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 8e8d588ddc9a0b69321551b45dabc897e1c65db189e3d8c7f9e6a5d180fad887
MD5 7800182c5fc7ef4518cfecfa82806c09
BLAKE2b-256 af48403640c7ebeac4f97711f2170c37a1725705d3cb41e696bff6e94d3f8a90

See more details on using hashes here.

File details

Details for the file slim_bindings-0.3.6-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for slim_bindings-0.3.6-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ec87bdce983a231b4d98d2d015084c356d983c3cd14875bd3a16bb05533fecfb
MD5 cde18dbd136a4c5d023760bf6346a2f4
BLAKE2b-256 97f831e4552f53d403540c1cea4a7ec3956b4eb191d8ffb43253bd480f16a79c

See more details on using hashes here.

File details

Details for the file slim_bindings-0.3.6-cp39-cp39-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for slim_bindings-0.3.6-cp39-cp39-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 26b6b5e7fa16cbcf405337d56c0b1c28098e165c2247122bcfeb010887180ac9
MD5 8faad3d8487a5d56068cfaff1d2b9fed
BLAKE2b-256 242cb144047bdc34def7838200c7e49d90a40384e7a9e987f32bb5d5581b2318

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