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.3.tar.gz (167.3 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.3-cp313-cp313-win_amd64.whl (4.6 MB view details)

Uploaded CPython 3.13Windows x86-64

agp_bindings-0.2.3-cp313-cp313-manylinux_2_34_x86_64.whl (6.0 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.34+ x86-64

agp_bindings-0.2.3-cp313-cp313-manylinux_2_34_aarch64.whl (5.8 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.34+ ARM64

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

Uploaded CPython 3.13macOS 11.0+ ARM64

agp_bindings-0.2.3-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.3-cp312-cp312-win_amd64.whl (4.6 MB view details)

Uploaded CPython 3.12Windows x86-64

agp_bindings-0.2.3-cp312-cp312-manylinux_2_34_x86_64.whl (6.0 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.34+ x86-64

agp_bindings-0.2.3-cp312-cp312-manylinux_2_34_aarch64.whl (5.8 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.34+ ARM64

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

Uploaded CPython 3.12macOS 11.0+ ARM64

agp_bindings-0.2.3-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.3-cp311-cp311-win_amd64.whl (4.6 MB view details)

Uploaded CPython 3.11Windows x86-64

agp_bindings-0.2.3-cp311-cp311-manylinux_2_34_x86_64.whl (6.0 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.34+ x86-64

agp_bindings-0.2.3-cp311-cp311-manylinux_2_34_aarch64.whl (5.8 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.34+ ARM64

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

Uploaded CPython 3.11macOS 11.0+ ARM64

agp_bindings-0.2.3-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.3-cp310-cp310-win_amd64.whl (4.6 MB view details)

Uploaded CPython 3.10Windows x86-64

agp_bindings-0.2.3-cp310-cp310-manylinux_2_34_x86_64.whl (6.0 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.34+ x86-64

agp_bindings-0.2.3-cp310-cp310-manylinux_2_34_aarch64.whl (5.8 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.34+ ARM64

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

Uploaded CPython 3.10macOS 11.0+ ARM64

agp_bindings-0.2.3-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.3-cp39-cp39-win_amd64.whl (4.6 MB view details)

Uploaded CPython 3.9Windows x86-64

agp_bindings-0.2.3-cp39-cp39-manylinux_2_34_x86_64.whl (6.0 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.34+ x86-64

agp_bindings-0.2.3-cp39-cp39-manylinux_2_34_aarch64.whl (5.8 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.34+ ARM64

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

Uploaded CPython 3.9macOS 11.0+ ARM64

agp_bindings-0.2.3-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.3.tar.gz.

File metadata

  • Download URL: agp_bindings-0.2.3.tar.gz
  • Upload date:
  • Size: 167.3 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.3.tar.gz
Algorithm Hash digest
SHA256 0d93df4ffca5cd650fcc9e9b4b7fee7733f8fc27366d36a1e52d2b5260f4c131
MD5 e5906531e6f34da5a9b3ae29cd59e132
BLAKE2b-256 aa52d9ffa4e8619710dee155f4c9c63717a58ebc9143a148d40e43b3b6e81619

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.2.3-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 3bdeb4b28a5761696daa0ab8768e26e88bbfb4a8e2f895f9194a48231ef227c4
MD5 27d472783faf73fb33cb592aa55b39e0
BLAKE2b-256 3832ae14432227926bfccb8b06bbca22679bc46cfe4c403833a4421d39cbb993

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.2.3-cp313-cp313-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 4b79966243c4c184460aa04a8b7db988ceea84d9810cbfb35b287c44696298af
MD5 07211bb222141273614ecc3d83acc509
BLAKE2b-256 f1948e1139b11d7edd019c6962e4f5dbd7612dfb6327a963df944878f2ddf614

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.2.3-cp313-cp313-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 7d4f87e856cbfccaa9127b2d3d8a6ffbf41a195412845c28a7900170e98921ec
MD5 4d49eb4adf03d74bfe32a565c05788a0
BLAKE2b-256 6761fec49afb5c7f5b13c0e3eaa4eece829e1e337ba6f054bc268e875f38973c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.2.3-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ebeb7e8e3868028d4102d79fb9f6cd89d1da1c8e9aa3e067f5a7b9181ebc20d5
MD5 d2b6cde1496d04595e598a6962dafd33
BLAKE2b-256 ce8263f30eefcfe43c5600c6b0ff928e565715c10d7b1dbd4cf5b8b574c8f65c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.2.3-cp313-cp313-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 e4afce427c87e7964a1640d58983188850c139ce3bbbda0bc135c15787f802da
MD5 053917df73b90ac76fe8546aa555b0d2
BLAKE2b-256 fb304db94d09462f6a488ef34af9602e068bad71b2e2221f4c2baa29f27feecf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.2.3-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 233b1b6e1bcf4c9d29a6026a9a16b6926992f282a34d86d4520a8c3b70e12ad0
MD5 2d09c3fb6b47e5147689e5c5d6e4224c
BLAKE2b-256 df95269c0a022b51ca6b40fa3681fbefc33bb6a02d8b031e0bc4f910f4873d12

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.2.3-cp312-cp312-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 23f45e399655882a64ceca7202a04719d14e0dcb7cfe68d1d1ed119db4651ddc
MD5 da122a4db080bd9963e5d611ff5eea6b
BLAKE2b-256 6ae707791caf3478766b44ae8626d3c24575f1fe3a7336c1b435a780cb395303

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.2.3-cp312-cp312-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 86003ae2209803563bc522b1d924d9c5f2cbea7f5ade66b6c1bec3bbe9fe886e
MD5 51a4ee8a0ee62f638bf4e8edf6c3522d
BLAKE2b-256 9d72560aac542e0c045e026ceda5cdacbfb7fcaf77e9d67664df58456def870c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.2.3-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2ca693326cfc0449ab45ab1384d48ccf76184cf0f8a64d5e8c7f850adceafd67
MD5 bef428701ace96d6ad92959cce24844e
BLAKE2b-256 8252a5139d11a32f792a13d7c8d9502a531e9e77017be821e67fbb602c08b2c4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.2.3-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 5b826d1e8881b7a813f90b68647edc4bfc8ac3cb1932eb3d01c97cd87a31dc47
MD5 4b26a49d76ee1a825586770cb43ae2de
BLAKE2b-256 997c22c397cb1ba00393d8040d9a455685692d0d21026638304f6b9347e7ddb2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.2.3-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 1363ae2969272500a5574e95c2d86d75b2c94644d3e5455ccfe0c27a463469c5
MD5 32837c95fe0fd0f39e79b25168140da3
BLAKE2b-256 566762eb4652d6e89aea23949e7c19f4abac1dfc2f13bfa25f1f3cc305e0907b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.2.3-cp311-cp311-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 ec9adea93aad1d689187ca4ac9bfec9adcadc8adc207336a0f8e64afe9337b56
MD5 c27ca24116891f0df0627088b82b80e9
BLAKE2b-256 115784aee5b28aa7cc1128ba82f34139e4785c82329d0bac181a2468a0c2f2ae

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.2.3-cp311-cp311-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 17d09ff97df53387a46ed7a17db1d9dfc0bf91f4065253ab91dddee9cd1f150b
MD5 bdf909f4690b10b8e166f86931ac7029
BLAKE2b-256 b31d5b8ecedf93aba48b9891134037feec54588707c4ede941432fa5c83862f0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.2.3-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7e05ae06a16719d7e6913c7e993f54be3d10519d29b79fb89863611bfbb1472f
MD5 923b0731f764d5e43311433536aefce3
BLAKE2b-256 8929195834629bc200fcda58ef3907383e0001ad225b9c9eb81ccc37f6309c98

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.2.3-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 1426d38c04a6e4ad8257b70b269454c181aec7ae3673336f10c7c7276ff1bebb
MD5 2bc6a1e47745166187c625beea68fd65
BLAKE2b-256 667bede359f6139a248c7d4e4b4295947d9a1428fc95eccf7e470a739a563ed4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.2.3-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 f8d016bbeb6eb590369f1be6badbb47c0d2bc90d3c614e3ab27a7781aa731e57
MD5 b463d33ecf509764fa1649c16823200a
BLAKE2b-256 d33cb50db7448f0c277c6c80d7c0617af4be618af2dc38ced1a22ba0b3a824d6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.2.3-cp310-cp310-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 61ead9bc53f25331d1227c781cefe3a65bc85bef3e5678ea089804da84d22ee1
MD5 154fe6f42ff80efa5c0ce55832e9aeaf
BLAKE2b-256 c6ab4d4b66182fac9c3ca1c84faceec4845c209dbb7297ec8c5555b90fefefee

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.2.3-cp310-cp310-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 e41d3694498d34e2b8f8605505b9445ca7eaac3ad5806dfd0964c86f70c8c504
MD5 d7a01dc844b9701f261233d01a406b1e
BLAKE2b-256 33e0b36d6232e3cc538fd2bc774de68417497be7f8b80f300129f4a665c024b8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.2.3-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d73512726b64ed1aaeb484178de57f7fa8db9b0da97466fe2cf9145f30fa61b4
MD5 aac7d167e6b05eb466743b636b40df86
BLAKE2b-256 2a2b3650b7e36026992f0e857202636d9bf01163ac987422b595cae8d3e5ad8a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.2.3-cp310-cp310-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 44493b3aad9a13f896e31299a8496274f754b16460e0a300eee9c15dea1e9123
MD5 6592193c9807884af25353bbadebfc4a
BLAKE2b-256 99d3f8690e09c9afe8a799c312dda945938f5b114f76de3080c5fa33245ea4a8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.2.3-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 f7a3a79a01fa86fdc69f90c2b102b945a0cb3a33da1b981bbea8b3ecf9c778d6
MD5 cfee1364d4bd3d08718ed4d14182a6cf
BLAKE2b-256 994bd30d87f574c29d6b2daed2d0a43af724b62953ee804d3cbddcdd7eb89d9d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.2.3-cp39-cp39-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 7424efe281a82e92a57cbde681e927ee9d738e18bd2b0aadad4777900c0cc2fb
MD5 4e0a76dd1e079f725826ca961be42e2f
BLAKE2b-256 17aaf164c7cb2489416bfda5be1eb387c023f099d18b21f2154dad62f1a0c3b7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.2.3-cp39-cp39-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 39629f50e7f57f51b6f8e2bd984c56051caf2ffe6e171dd78ab10a873e51d5a4
MD5 b68d33657e2d752ada036397ac8f202c
BLAKE2b-256 c0871a960a0dea80f98b30bc25430dfee13f4edd883e12e08da7db101d28d658

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.2.3-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5cda5695e82a6bcf78d78f823d4d58838e6472f8f6adaddb2c8e0335968ad70b
MD5 b210afbf901d23151b77f24e9f3e2d1b
BLAKE2b-256 f277878a3d71f09085e35a33b2994618a810d6f130a52458d3ee0a19c10cf7a5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.2.3-cp39-cp39-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 ac39d44cb4af439376b22b21ed479849f1b827804e7ed7aa9d416cab50ed1d2d
MD5 fb3753003160a09a47f69b2c93e2539e
BLAKE2b-256 accb68cd0aa27f00ba7b0d8185794f0752259ac51cafb422bf1456bad70ac929

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