Skip to main content

AGP Rust bindings for Python

Project description

Gateway Python Bindings

Bindings to call the gateway APIs from a python program.

Installation

pip install agp-bindings

Include as dependency

With pyproject.toml

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

With poetry project

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

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

Example programs

Server

import argparse
import asyncio
from signal import SIGINT

import agp_bindings
from agp_bindings import GatewayConfig


async def run_server(address: str, enable_opentelemetry: bool):
    # init tracing
    agp_bindings.init_tracing(
        log_level="debug", enable_opentelemetry=enable_opentelemetry
    )

    global gateway
    # create new gateway object
    gateway = await agp_bindings.Gateway.new("cisco", "default", "gateway")

    # Configure gateway
    config = GatewayConfig(endpoint=address, insecure=True)
    gateway.configure(config)

    # Run as server
    await gateway.run_server()


async def main():
    parser = argparse.ArgumentParser(
        description="Command line client for gateway server."
    )
    parser.add_argument(
        "-g", "--gateway", type=str, help="Gateway 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.gateway, 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

import argparse
import asyncio
import datetime
import signal

import agp_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
    agp_bindings.init_tracing(
        log_level="info", enable_opentelemetry=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 agp_bindings.Gateway.new(
        local_organization, local_namespace, local_agent
    )
    participant.configure(agp_bindings.GatewayConfig(endpoint=address, insecure=True))

    # Connect to gateway server
    _ = await participant.connect()

    # 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_streaming_session(
        agp_bindings.PyStreamingConfiguration(
            agp_bindings.PySessionDirection.BIDIRECTIONAL,
            topic=agp_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(
        "-g",
        "--gateway",
        type=str,
        help="Gateway 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.gateway,
        args.enable_opentelemetry,
    )


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

Streaming producer and consumer

import argparse
import asyncio
import datetime
import time
import os

import agp_bindings
from agp_bindings import GatewayConfig, PySessionInfo


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}"


async def run_client(
    local_id, remote_id, address, producer, enable_opentelemetry: bool
):
    # init tracing
    agp_bindings.init_tracing(
        log_level="info", enable_opentelemetry=enable_opentelemetry
    )

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

    # create new gateway object
    gateway = await agp_bindings.Gateway.new(
        local_organization, local_namespace, local_agent
    )

    # Configure gateway
    config = GatewayConfig(endpoint=address, insecure=True)
    gateway.configure(config)

    # Connect to the service and subscribe for the local name
    print(format_message(f"connecting to:", address))
    _ = await gateway.connect()

    # Split the IDs into their respective components
    try:
        remote_organization, remote_namespace, broadcast_topic = remote_id.split("/")
    except ValueError:
        print("Error: IDs must be in the format organization/namespace/agent.")
        return

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

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

            # create streaming session with default config
            session_info = await gateway.create_streaming_session(
                agp_bindings.PyStreamingConfiguration(
                    agp_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 gateway.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 gateway.subscribe(
                remote_organization, remote_namespace, broadcast_topic
            )

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

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

                asyncio.create_task(background_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(
        "-g",
        "--gateway",
        type=str,
        help="Gateway 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.gateway,
        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

import argparse
import asyncio
import time
import os

import agp_bindings
from agp_bindings import GatewayConfig, PySessionInfo


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
    agp_bindings.init_tracing(
        log_level="info", enable_opentelemetry=enable_opentelemetry
    )

    local_organization, local_namespace, local_agent = split_id(local_id)

    # create new gateway object
    gateway = await agp_bindings.Gateway.new(
        local_organization, local_namespace, local_agent
    )

    # Configure gateway
    config = GatewayConfig(endpoint=address, insecure=True)
    gateway.configure(config)

    # Connect to remote gateway server
    print(format_message(f"connecting to:", address))
    _ = await gateway.connect()

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

    async with gateway:
        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 gateway.set_route(remote_organization, remote_namespace, remote_agent)

            # create a session
            session = await gateway.create_ff_session(
                agp_bindings.PyFireAndForgetConfiguration()
            )

            for i in range(0, iterations):
                try:
                    # Send the message
                    await gateway.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 gateway.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 gateway.receive()
                print(
                    format_message(
                        f"{instance.capitalize()} received a new session:",
                        f"{session_info.id}",
                    )
                )

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

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

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

                asyncio.create_task(background_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("-m", "--message", type=str, help="Message to send.")
    parser.add_argument(
        "-g",
        "--gateway",
        type=str,
        help="Gateway 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.gateway,
        args.iterations,
        args.enable_opentelemetry,
    )


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

Request/Response Requester and Responder

import argparse
import asyncio
import time
import os

import agp_bindings
from agp_bindings import GatewayConfig, PySessionInfo


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
    agp_bindings.init_tracing(
        log_level="info", enable_opentelemetry=enable_opentelemetry
    )

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

    # create new gateway object
    gateway = await agp_bindings.Gateway.new(
        local_organization, local_namespace, local_agent
    )

    # Configure gateway
    config = GatewayConfig(endpoint=address, insecure=True)
    gateway.configure(config)

    # Connect to the service and subscribe for the local name
    print(format_message(f"connecting to:", address))
    _ = await gateway.connect()

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

    async with gateway:
        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 gateway.set_route(remote_organization, remote_namespace, remote_agent)

            # create a session
            session = await gateway.create_rr_session(
                agp_bindings.PyRequestResponseConfiguration()
            )

            try:
                # Send the message and wait for a reply
                session_info, reply = await gateway.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 gateway.receive()
                print(
                    format_message(
                        f"{instance.capitalize()} received a new session:",
                        f"{session_info.id}",
                    )
                )

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

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

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

                asyncio.create_task(background_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("-m", "--message", type=str, help="Message to send.")
    parser.add_argument(
        "-g",
        "--gateway",
        type=str,
        help="Gateway 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.gateway,
        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

agp_bindings-0.2.2.tar.gz (167.4 kB view details)

Uploaded Source

Built Distributions

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

agp_bindings-0.2.2-cp313-cp313-win_amd64.whl (4.6 MB view details)

Uploaded CPython 3.13Windows x86-64

agp_bindings-0.2.2-cp313-cp313-manylinux_2_38_x86_64.whl (5.9 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.38+ x86-64

agp_bindings-0.2.2-cp313-cp313-manylinux_2_38_aarch64.whl (5.7 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.38+ ARM64

agp_bindings-0.2.2-cp313-cp313-macosx_11_0_arm64.whl (5.2 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

agp_bindings-0.2.2-cp313-cp313-macosx_10_12_x86_64.whl (5.4 MB view details)

Uploaded CPython 3.13macOS 10.12+ x86-64

agp_bindings-0.2.2-cp312-cp312-win_amd64.whl (4.6 MB view details)

Uploaded CPython 3.12Windows x86-64

agp_bindings-0.2.2-cp312-cp312-manylinux_2_38_x86_64.whl (5.9 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.38+ x86-64

agp_bindings-0.2.2-cp312-cp312-manylinux_2_38_aarch64.whl (5.7 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.38+ ARM64

agp_bindings-0.2.2-cp312-cp312-macosx_11_0_arm64.whl (5.2 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

agp_bindings-0.2.2-cp312-cp312-macosx_10_12_x86_64.whl (5.4 MB view details)

Uploaded CPython 3.12macOS 10.12+ x86-64

agp_bindings-0.2.2-cp311-cp311-win_amd64.whl (4.6 MB view details)

Uploaded CPython 3.11Windows x86-64

agp_bindings-0.2.2-cp311-cp311-manylinux_2_38_x86_64.whl (5.9 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.38+ x86-64

agp_bindings-0.2.2-cp311-cp311-manylinux_2_38_aarch64.whl (5.7 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.38+ ARM64

agp_bindings-0.2.2-cp311-cp311-macosx_11_0_arm64.whl (5.2 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

agp_bindings-0.2.2-cp311-cp311-macosx_10_12_x86_64.whl (5.4 MB view details)

Uploaded CPython 3.11macOS 10.12+ x86-64

agp_bindings-0.2.2-cp310-cp310-win_amd64.whl (4.6 MB view details)

Uploaded CPython 3.10Windows x86-64

agp_bindings-0.2.2-cp310-cp310-manylinux_2_38_x86_64.whl (5.9 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.38+ x86-64

agp_bindings-0.2.2-cp310-cp310-manylinux_2_38_aarch64.whl (5.8 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.38+ ARM64

agp_bindings-0.2.2-cp310-cp310-macosx_11_0_arm64.whl (5.2 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

agp_bindings-0.2.2-cp310-cp310-macosx_10_12_x86_64.whl (5.4 MB view details)

Uploaded CPython 3.10macOS 10.12+ x86-64

agp_bindings-0.2.2-cp39-cp39-win_amd64.whl (4.6 MB view details)

Uploaded CPython 3.9Windows x86-64

agp_bindings-0.2.2-cp39-cp39-manylinux_2_38_x86_64.whl (5.9 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.38+ x86-64

agp_bindings-0.2.2-cp39-cp39-manylinux_2_38_aarch64.whl (5.8 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.38+ ARM64

agp_bindings-0.2.2-cp39-cp39-macosx_11_0_arm64.whl (5.2 MB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

agp_bindings-0.2.2-cp39-cp39-macosx_10_12_x86_64.whl (5.4 MB view details)

Uploaded CPython 3.9macOS 10.12+ x86-64

File details

Details for the file agp_bindings-0.2.2.tar.gz.

File metadata

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

File hashes

Hashes for agp_bindings-0.2.2.tar.gz
Algorithm Hash digest
SHA256 a4813a0501e6a79ef31381fcd6b303e832a8d47bac06d2206ca622193f38c3fb
MD5 702b15105d4c33abe012e64ea3d22456
BLAKE2b-256 66dea286f2d8b06cf79f692ad9936fe748ed3d7891a59e286f21cc17ab9df018

See more details on using hashes here.

File details

Details for the file agp_bindings-0.2.2-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for agp_bindings-0.2.2-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 94c8e16757b0efec00ce0710f74c06086f2f30855682507cf44e67ddeafa7bf3
MD5 b899d736d353c7e4b5a2e84f57246d7c
BLAKE2b-256 8df82f2e64287efe805cbbd258bde419278def90cd5c9d12f27c5063ad5754b1

See more details on using hashes here.

File details

Details for the file agp_bindings-0.2.2-cp313-cp313-manylinux_2_38_x86_64.whl.

File metadata

File hashes

Hashes for agp_bindings-0.2.2-cp313-cp313-manylinux_2_38_x86_64.whl
Algorithm Hash digest
SHA256 126ddc537798d3a21b0778c5043fb6daf20bf3629d92a983e17365185b898d3d
MD5 1b4918dd716b7e0f3c56ac4e5ca9ee65
BLAKE2b-256 bf4c533840b65bf68dd160d4e2aef73599581e4c61be07a72a84e95553589dd6

See more details on using hashes here.

File details

Details for the file agp_bindings-0.2.2-cp313-cp313-manylinux_2_38_aarch64.whl.

File metadata

File hashes

Hashes for agp_bindings-0.2.2-cp313-cp313-manylinux_2_38_aarch64.whl
Algorithm Hash digest
SHA256 fac2d119c6c147d1b6d2f948e7ba846a783c632fd2b90f17294d68d3620013e0
MD5 5bd2ec21428f57b15319f05d3f35fd04
BLAKE2b-256 68bafe711da83f2c5a58f2b94b56eac090cfab6938987fe914359608c0d63ea1

See more details on using hashes here.

File details

Details for the file agp_bindings-0.2.2-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for agp_bindings-0.2.2-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7c3188b15cf59fda96724b7c2da6f24a4196497606b57f1ba9eae87dff932845
MD5 a6c34031512ab656002e21af9b763a0c
BLAKE2b-256 ba28c77588730552c12fde9c200fddb87fe276aa75b228e6e6d18a6866d096a0

See more details on using hashes here.

File details

Details for the file agp_bindings-0.2.2-cp313-cp313-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for agp_bindings-0.2.2-cp313-cp313-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 b7a6d96bf034907c3c0628007a05ed7f32afbbf4a24ef36c6691c922d35f1696
MD5 f90cd25514b2a88ce5f7161302aa484b
BLAKE2b-256 1145b3541a9c8f53fd4af1b546ce1b08a3418a90315e8c5765a78f49580de826

See more details on using hashes here.

File details

Details for the file agp_bindings-0.2.2-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for agp_bindings-0.2.2-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 e375fe5c11e5216edb5f3dbd7141e1199057a5bbc0d2ff997719c24563dd6fdc
MD5 e7b3002d5d91f376122312a2d4dd51c0
BLAKE2b-256 fc253c850b40d56c23c47a0f59ef50ff32db13096267275739b1a3de82f5f24d

See more details on using hashes here.

File details

Details for the file agp_bindings-0.2.2-cp312-cp312-manylinux_2_38_x86_64.whl.

File metadata

File hashes

Hashes for agp_bindings-0.2.2-cp312-cp312-manylinux_2_38_x86_64.whl
Algorithm Hash digest
SHA256 0227c1b5375f9501fd119eface676bcf42ff60cd6d2a9717ad19a768c0dbb28b
MD5 4b716df290d7a4bbb85b0f249a0d0fbc
BLAKE2b-256 7d7ee3089be61b48623c9e72c6bc857e5a4fb068cf0a042b9fc7dbe7c28ad914

See more details on using hashes here.

File details

Details for the file agp_bindings-0.2.2-cp312-cp312-manylinux_2_38_aarch64.whl.

File metadata

File hashes

Hashes for agp_bindings-0.2.2-cp312-cp312-manylinux_2_38_aarch64.whl
Algorithm Hash digest
SHA256 ef0e521bfb8902359af527bb117055b3ce6151706208e041bc1dd827b25b762b
MD5 eb3c24714c2230e787ce78f2b1ba529c
BLAKE2b-256 8bbccc4e3100f827cdeef24d40866efe615ed6fcdac2aba6f0b4c52897a29451

See more details on using hashes here.

File details

Details for the file agp_bindings-0.2.2-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for agp_bindings-0.2.2-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 124f29cfbf8c8115c641d95d9ea9993be04923a7f897c92047572fa4fd98e1c9
MD5 8465102d353ca9c52ca51332304c6f65
BLAKE2b-256 f4c24b0a891dc6dd254e2ab1453725deac91cbe7f568c36b5dc4e1962541e3cc

See more details on using hashes here.

File details

Details for the file agp_bindings-0.2.2-cp312-cp312-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for agp_bindings-0.2.2-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 a2d4f7bb35b81b117acc214bf453f63357305e6924265dc55cad73cd50a5c370
MD5 d18ef417ac08e6a56870f1f3b11931ac
BLAKE2b-256 bbe38ae9c8c58c8370b4f9d283abb3ab35af3a8dcb1c462f4d01092d962ba178

See more details on using hashes here.

File details

Details for the file agp_bindings-0.2.2-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for agp_bindings-0.2.2-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 c40060adf84cf6e24aebff2a8b3eaf8be3c736e389300ead66e6efed49eea2cb
MD5 5ae8abe3577cde78e742dac44e4a781b
BLAKE2b-256 af83fc402d216125d42b49997ed75009eaaac831a7876a9d73a7d00f784be808

See more details on using hashes here.

File details

Details for the file agp_bindings-0.2.2-cp311-cp311-manylinux_2_38_x86_64.whl.

File metadata

File hashes

Hashes for agp_bindings-0.2.2-cp311-cp311-manylinux_2_38_x86_64.whl
Algorithm Hash digest
SHA256 c297c919745021c9c4b58bdf420878dd1e5b94c6e2d282e7295619d5dd65bd38
MD5 f4230f92143a970dbbee11ecabe86858
BLAKE2b-256 f84c089a11932447e815795e54660a8e3b5a731bd0ff9945ca5b9dd3bc4bee73

See more details on using hashes here.

File details

Details for the file agp_bindings-0.2.2-cp311-cp311-manylinux_2_38_aarch64.whl.

File metadata

File hashes

Hashes for agp_bindings-0.2.2-cp311-cp311-manylinux_2_38_aarch64.whl
Algorithm Hash digest
SHA256 3506b8f992160cf81be3dbbbcc0930eb7f5dd61bbf4f4123c87787ec1a2c109a
MD5 fcf36111cf12534dc2dba5a5bf715854
BLAKE2b-256 6280ddd8fa19dbd0d07b4ea6484c441e48ce816bead83ee7f0b5abef8d4ec1ff

See more details on using hashes here.

File details

Details for the file agp_bindings-0.2.2-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for agp_bindings-0.2.2-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e5dd45a96b2533437d8da8c1c9565fdd7bb8daed845c69903e211ec7187d01ec
MD5 fd40417812bcba81a3bd22b4f6894106
BLAKE2b-256 69a0f4ceaf41597c20e3fc5da1a19b1ef2a5031f8591b60384aade2ba60e81b8

See more details on using hashes here.

File details

Details for the file agp_bindings-0.2.2-cp311-cp311-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for agp_bindings-0.2.2-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 e2f655be31d996dc11270076a4067faef7c14bb68e0a164487c1c373d494357b
MD5 b6b441698e40ce548fe8f0e88e5f4cb7
BLAKE2b-256 e9c6bd57360d29c44595e4a64735ff1c053783602f6b9c45766095d43e732dfe

See more details on using hashes here.

File details

Details for the file agp_bindings-0.2.2-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for agp_bindings-0.2.2-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 535de5bb7381554d724530c5788e330e66725481bbd747d6b9c28e5b26ba4fe5
MD5 aaabe50adc152010dd62c90f99de7a93
BLAKE2b-256 d7786ab74b6e61faf2cf2e414edce932a44020f5362affcdc6fa902e119b45fe

See more details on using hashes here.

File details

Details for the file agp_bindings-0.2.2-cp310-cp310-manylinux_2_38_x86_64.whl.

File metadata

File hashes

Hashes for agp_bindings-0.2.2-cp310-cp310-manylinux_2_38_x86_64.whl
Algorithm Hash digest
SHA256 ae782948a20e98e33ba99df9e557ffb4214b5d2d62c2b4c96fdcad6c4cc5ce4f
MD5 e89b48b592f30ecd5236c5e182f96f53
BLAKE2b-256 1cadea1a9ccbeb1741541518742ce70e7c18f7564a5822f54efbae6180b741b7

See more details on using hashes here.

File details

Details for the file agp_bindings-0.2.2-cp310-cp310-manylinux_2_38_aarch64.whl.

File metadata

File hashes

Hashes for agp_bindings-0.2.2-cp310-cp310-manylinux_2_38_aarch64.whl
Algorithm Hash digest
SHA256 94a1d12194cf8488c6a98f276e1947abb1ae8d0975a3fa8aa51ff429c016a0b3
MD5 b6a6f266d8d6d4b56bd340fd40af5c2d
BLAKE2b-256 e1800b77c50ebe04862405ac2091972c89eaca2e970285f67647d7e0c964b555

See more details on using hashes here.

File details

Details for the file agp_bindings-0.2.2-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for agp_bindings-0.2.2-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 36cffe9121ddcb1c662e8b4709f398a20e1da644e9e69584e59d7856a3562b85
MD5 0accbc3925698767acd844e8827e0733
BLAKE2b-256 3343f8175fcffa30417a1b6cbb91fb4d19c88bb0aa29a43e851ef29ab51bfa17

See more details on using hashes here.

File details

Details for the file agp_bindings-0.2.2-cp310-cp310-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for agp_bindings-0.2.2-cp310-cp310-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 3fb46d35c2d43b9de4c5a3e0738070949ff8ce654e2ebc163c4c7ee16f16e98a
MD5 64aaf2f03a0af690d501c7154fd2ede4
BLAKE2b-256 12fc798550ff99e46ccb613057a2eb9a7575f5ffe53c19b4a74b02e99ba4d559

See more details on using hashes here.

File details

Details for the file agp_bindings-0.2.2-cp39-cp39-win_amd64.whl.

File metadata

File hashes

Hashes for agp_bindings-0.2.2-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 9d50713c6ae4396153179cdf5ba353bae6f7d96b98ed460962882e8520c5cdbc
MD5 b795439c675b227b8d3e83b9f4e579bb
BLAKE2b-256 6d95c50107dca1c779c5e30881371ada0f0b43438ce16661011144220d841c20

See more details on using hashes here.

File details

Details for the file agp_bindings-0.2.2-cp39-cp39-manylinux_2_38_x86_64.whl.

File metadata

File hashes

Hashes for agp_bindings-0.2.2-cp39-cp39-manylinux_2_38_x86_64.whl
Algorithm Hash digest
SHA256 4414470d0dc68c656a5afca2554e0925b2eb1ca3de59ab6bd956d981b70790ab
MD5 03e9b97f3524242e0522cee215b6182b
BLAKE2b-256 95f76eecd472e37334fbc4d32366247d0b5e6afdd3639ca501516713e247562e

See more details on using hashes here.

File details

Details for the file agp_bindings-0.2.2-cp39-cp39-manylinux_2_38_aarch64.whl.

File metadata

File hashes

Hashes for agp_bindings-0.2.2-cp39-cp39-manylinux_2_38_aarch64.whl
Algorithm Hash digest
SHA256 a998e9b1158d0da8aff55c15c5b5528c72795bbc91f3926967acdc4ddf57d89e
MD5 c448ac3d3e9cba21962c39a747b96094
BLAKE2b-256 caa0f967f68a82e2834df6734778d2aaf2ccb6369cc43b856fc75e1477cfecf3

See more details on using hashes here.

File details

Details for the file agp_bindings-0.2.2-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for agp_bindings-0.2.2-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 dad43abcc518bbd37bbe340ee6390e7068003b6c58f2e4a9afe681661c9d3534
MD5 f9fd30ac0edc7453dd20d4184bbfdf55
BLAKE2b-256 e45ad0c29042b9aac33e7db65bc6486c74b7eaf74c845ae1c45ce844468531c0

See more details on using hashes here.

File details

Details for the file agp_bindings-0.2.2-cp39-cp39-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for agp_bindings-0.2.2-cp39-cp39-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 db0fce383bc9bd9309ecebb8e6e3783b94358a5a44c988c5a79fddfbabed0323
MD5 ff581993d3c690073106946f5149b1c6
BLAKE2b-256 e46885bc1663ec3f609951d08a64013b73d0f769658edc139cf5e6736b298a7e

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