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.4.tar.gz (167.8 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.4-cp313-cp313-win_amd64.whl (4.5 MB view details)

Uploaded CPython 3.13Windows x86-64

agp_bindings-0.2.4-cp313-cp313-manylinux_2_34_x86_64.whl (5.9 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.34+ x86-64

agp_bindings-0.2.4-cp313-cp313-manylinux_2_34_aarch64.whl (5.7 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.34+ ARM64

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

Uploaded CPython 3.13macOS 11.0+ ARM64

agp_bindings-0.2.4-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.4-cp312-cp312-win_amd64.whl (4.5 MB view details)

Uploaded CPython 3.12Windows x86-64

agp_bindings-0.2.4-cp312-cp312-manylinux_2_34_x86_64.whl (5.9 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.34+ x86-64

agp_bindings-0.2.4-cp312-cp312-manylinux_2_34_aarch64.whl (5.7 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.34+ ARM64

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

Uploaded CPython 3.12macOS 11.0+ ARM64

agp_bindings-0.2.4-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.4-cp311-cp311-win_amd64.whl (4.5 MB view details)

Uploaded CPython 3.11Windows x86-64

agp_bindings-0.2.4-cp311-cp311-manylinux_2_34_x86_64.whl (5.9 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.34+ x86-64

agp_bindings-0.2.4-cp311-cp311-manylinux_2_34_aarch64.whl (5.7 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.34+ ARM64

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

Uploaded CPython 3.11macOS 11.0+ ARM64

agp_bindings-0.2.4-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.4-cp310-cp310-win_amd64.whl (4.5 MB view details)

Uploaded CPython 3.10Windows x86-64

agp_bindings-0.2.4-cp310-cp310-manylinux_2_34_x86_64.whl (5.9 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.34+ x86-64

agp_bindings-0.2.4-cp310-cp310-manylinux_2_34_aarch64.whl (5.7 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.34+ ARM64

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

Uploaded CPython 3.10macOS 11.0+ ARM64

agp_bindings-0.2.4-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.4-cp39-cp39-win_amd64.whl (4.5 MB view details)

Uploaded CPython 3.9Windows x86-64

agp_bindings-0.2.4-cp39-cp39-manylinux_2_34_x86_64.whl (5.9 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.34+ x86-64

agp_bindings-0.2.4-cp39-cp39-manylinux_2_34_aarch64.whl (5.7 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.34+ ARM64

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

Uploaded CPython 3.9macOS 11.0+ ARM64

agp_bindings-0.2.4-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.4.tar.gz.

File metadata

  • Download URL: agp_bindings-0.2.4.tar.gz
  • Upload date:
  • Size: 167.8 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.4.tar.gz
Algorithm Hash digest
SHA256 2438ab270963d91e760445f093cd1c483332b7cb7f21338aa416b0c5415b527e
MD5 3ea2496140ce96edceb98135bebd8d61
BLAKE2b-256 ad3ea3efaca0d0f7513f0d4d08e9d2258ecbcc1a77c42e6ddfb1e0cd0b376d9d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.2.4-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 6a10a60a0d7d2c2888af9124a0a130ae6c88fca0aea7dcc8808dcfe12fa21804
MD5 57b2bfa99fd1e6abb51ab2e0ba202cad
BLAKE2b-256 79fc11867c35f1aad4592fe26feb283411e05152bc0a94673ee9d3056b0e90fd

See more details on using hashes here.

File details

Details for the file agp_bindings-0.2.4-cp313-cp313-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for agp_bindings-0.2.4-cp313-cp313-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 c670c9d62155326c13ef08f43ed6ee7b947e692d34fb6309bfe129f8428000c8
MD5 2b3214bf580d8835f2684333a01adb5a
BLAKE2b-256 05735be36e633a221d0f1dda8bc40c9121a9538c43ba528b6c704849d55b3542

See more details on using hashes here.

File details

Details for the file agp_bindings-0.2.4-cp313-cp313-manylinux_2_34_aarch64.whl.

File metadata

File hashes

Hashes for agp_bindings-0.2.4-cp313-cp313-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 27f681821fa4962852a0943e5fd26bb3f44ea16aae469ceb080a362244b7ac15
MD5 62c991fce4b6a79607fdb8ebb09c632c
BLAKE2b-256 c43147033732b244d552dd44e269dca096ad1cff47545ffab663688511d97c2e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.2.4-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c02250f0648f3ecee1abce436efc49d5a3c1b7819596d4b8a82701f9a69e055e
MD5 e5b033f944d56a22d7557bb73dbdd7f1
BLAKE2b-256 117c1b81558d345abe97b5e9d00f5aa4ce97e6200afe8bc893b999cc5a3c8cf0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.2.4-cp313-cp313-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 30921c8fbd7e0f19ea2abc3773bb6f6b99417defa3496395243b80e725bf5160
MD5 87ee08eab9cca7996b94dc87b3f49290
BLAKE2b-256 5296f2e1193c8ee497e89148b83406f2001adbeebb67ed5d46b924d2434e1df8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.2.4-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 d08a9caac1dc47da810529efac023854c83833a90d34f312ffd348eda3981931
MD5 1171f702b84ec8e05eb73afcfa6b246c
BLAKE2b-256 64d7ff42dfad83f6fe7c69e24048151553d1f125ec7113e90143a8de7f881bed

See more details on using hashes here.

File details

Details for the file agp_bindings-0.2.4-cp312-cp312-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for agp_bindings-0.2.4-cp312-cp312-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 5d9c01cff8d9060653c6a821a22bf6f44947c2aabe5701f1863b0ed9e032acce
MD5 8606ecb3f9d10d2ee1779950fcb8fad9
BLAKE2b-256 c3d4b2cc31f44870d17b5a82aa146c5dd1dac4a521b0312119fcec5ae3489d67

See more details on using hashes here.

File details

Details for the file agp_bindings-0.2.4-cp312-cp312-manylinux_2_34_aarch64.whl.

File metadata

File hashes

Hashes for agp_bindings-0.2.4-cp312-cp312-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 4dae13109ab49adf8f4bdbe629bec11377c7c385b84ba9df2191b822dd565c5a
MD5 f15f30e1db763514429a7f3d8ef7870f
BLAKE2b-256 ef45a75e716ca4867e1e658a01211a9e0dfed6b2a19a1f8a559c095201f4f7e0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.2.4-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 046ed7053507e2364ab29707ade715053c0a6765b9793822de461f8ad8c636d9
MD5 02ad55a9ad891f05d5423963729bdf93
BLAKE2b-256 ed67cda0381434ad68ad8078abfe97c78a408767a4cb779632bbea0c832cbc5e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.2.4-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 ae02f9cb95c716113822947cd032bc40e81717602f20af20dc08f22d20dc95ce
MD5 6eb0c844d5399a6895c5e4623b1de4ad
BLAKE2b-256 da885450da1b43cecc867deaa2d5c03537419518145633c151dc1928d52c0f77

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.2.4-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 9e1c1a5ba93aa226758b3122987be8da6a8d9717c24e1d376144e3aa94157c4c
MD5 f0c5c4c384843bc6db75cee305d8c217
BLAKE2b-256 9363275c2a3ae89f784e7e004e12d067d4c73bacc1fe909f34877d4cfde12155

See more details on using hashes here.

File details

Details for the file agp_bindings-0.2.4-cp311-cp311-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for agp_bindings-0.2.4-cp311-cp311-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 848d916ec6835a3b8f96824135e7f5a129d1ad73ca36a877a86950c830a0afcd
MD5 9f3be404f6944480a394e48956f5d2fb
BLAKE2b-256 1d0ffd0914ccec1c5c2cfa17fef0e13770c43288d60ad2308ededfaf5b98ee3d

See more details on using hashes here.

File details

Details for the file agp_bindings-0.2.4-cp311-cp311-manylinux_2_34_aarch64.whl.

File metadata

File hashes

Hashes for agp_bindings-0.2.4-cp311-cp311-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 fcdaf6910ad13d508a5281e7016716ac99adf8b1c88e2155bc9e85d4649cf098
MD5 9198811aafebdace93e8da7808a8e1bd
BLAKE2b-256 3f4d2d2127713f80e2fbe867123f0bbe9bc7cbc02cee6e8b0b97a35e4f6b4885

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.2.4-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c4d2fd504c58d4c8322e7550c8d82be3c92f145f55bc83caaeac4aeede2e3496
MD5 395cb5831830cb57feb1fcbaadbca663
BLAKE2b-256 0f76a4a855392da44c2855a93031f6535548832bfebf84438734d164dc34bd46

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.2.4-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 a40c0705a6623a6912e620cd9744af93a5b9d9c29f4e26447ca747ca64372ab4
MD5 c7565fbca7ca49f5e448ba7682571c49
BLAKE2b-256 ebf9acb03af81fa6ded8935cdd1503f42cdaace314ccf8e78bb0d8e6a3884dea

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.2.4-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 fb943e2bf8152c8bea84679510b7018cd3388321bde0f26a084d4097a73abdce
MD5 514d62de72e92822377ff53166ce54cc
BLAKE2b-256 537cb00a8a7b918c46e356c3fef3d07c6f175cadc14b2fc4e6ebfbd778d3a07f

See more details on using hashes here.

File details

Details for the file agp_bindings-0.2.4-cp310-cp310-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for agp_bindings-0.2.4-cp310-cp310-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 8fe4fb6f31955b2f00cb218d9fcab32f21495b6267db9dc029f1a31b9564e45b
MD5 0cec300ca17d5e06b4071b1a4c65be9e
BLAKE2b-256 6a023873fe1b2b43285d49ab4b17eb8f330fa9d10c14afa779ee423753fd8a4f

See more details on using hashes here.

File details

Details for the file agp_bindings-0.2.4-cp310-cp310-manylinux_2_34_aarch64.whl.

File metadata

File hashes

Hashes for agp_bindings-0.2.4-cp310-cp310-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 55ad08125efb871e0a5553fc9a830c8f59d15bb933181bab328ba8cbb2a3bbbc
MD5 a0017820d563ffa4b5b5ce1bef272ae5
BLAKE2b-256 a91c82fc17d73b98f6fc27e3b44812c55f513afd4b2be11cc156dfbf5e64c11d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.2.4-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f3ac29cc1ed09686ff2f72409e1f3a95556391ed975848affccabdc91235ee46
MD5 c7bf83e5024e4f6b6ddb7310f097400d
BLAKE2b-256 f63ccfb00c2e79330d4239f0d12c95d8f580d36a2b4047ff4fe500dc29e8a684

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.2.4-cp310-cp310-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 4054d170dcbeb6b6aacb1210749f12def7c10b0d5157929ee319d65c6c9f0f40
MD5 ae15d02b103029336d6ad7590f1161ad
BLAKE2b-256 b361c87647aa1a744a1cc6b5157b0de773da4ef29d68ca4431a8286f436412ac

See more details on using hashes here.

File details

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

File metadata

  • Download URL: agp_bindings-0.2.4-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 4.5 MB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for agp_bindings-0.2.4-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 5893692b28db1f9e528cbd31c3056b38cafe4ac9fa1a6e5af69e8b8dc04652c6
MD5 6874ddab4b627959f5d970739fc47902
BLAKE2b-256 3d9f4380337f1abc53ca49a33ba6a60046ba0d89ef6ab0c90433519542fd8af7

See more details on using hashes here.

File details

Details for the file agp_bindings-0.2.4-cp39-cp39-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for agp_bindings-0.2.4-cp39-cp39-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 8bba237fcb5b450575032119b8dd523fa5f4b78b791e30f54f0b257f63d0261f
MD5 a9be039c0433abc459978dbebac4a571
BLAKE2b-256 b049367a634fb971de811ac1dff28c7025256b6ae443ca00283de67593b94744

See more details on using hashes here.

File details

Details for the file agp_bindings-0.2.4-cp39-cp39-manylinux_2_34_aarch64.whl.

File metadata

File hashes

Hashes for agp_bindings-0.2.4-cp39-cp39-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 ee1049f39c0e22aa2008836850abe3e0fcd1636c2ba272e59f541d59c0d1ad46
MD5 d85280a11185ab778b3d719de3ba8f93
BLAKE2b-256 ac26521ea39b5b9fe3c31070409537d26f3de770659470d26a52af6f1e46d9be

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.2.4-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a58e8210c3593c7fcf8337cc2b0153aa5dcf92e9350f901858e91031a230388d
MD5 5f4dec7e2b8edc3f292a4bfaa71138fc
BLAKE2b-256 bc3c63d6ef886f940b521d27d95bb99ed4330e55c947ea93fb44a54d15d2b275

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.2.4-cp39-cp39-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 0c831d49accf0e684b3566a454573f448fc7a0073f4f0d5097d6edb73c2271a9
MD5 7da3b99971e6381d52905ffa14ee8db6
BLAKE2b-256 7fc2d6c45179a694d242b2e363d65abe6228d187a507de33785463b953f1edff

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