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

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

import argparse
import asyncio
from signal import SIGINT

import agp_bindings


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

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

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


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

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

import argparse
import asyncio
import datetime

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"
            "opentelemetry": {
                "enabled": enable_opentelemetry
            }
        }
    )

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

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

    name = f"{local_agent}"

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

    participant = await agp_bindings.Gateway.new(
        local_organization, local_namespace, local_agent
    )

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

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

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

    print(f"{name} -> Creating new pubsub sessions...")
    # create pubsubb session. A pubsub session is a just a bidirectional
    # streaming session, where participants are both sender and receivers
    session_info = await participant.create_session(
        agp_bindings.PySessionConfiguration.Streaming(
            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

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

import argparse
import asyncio
import datetime
import os

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, producer, enable_opentelemetry: bool
):
    # init tracing
    agp_bindings.init_tracing(
        {
            "log_level": "info"
            "opentelemetry": {
                "enabled": enable_opentelemetry
            }
        }
    )

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

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

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

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

    # Get the local agent instance from env
    instance = os.getenv("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_session(
                agp_bindings.PySessionConfiguration.Streaming(
                    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(session_info):
                    while True:
                        # Receive the message from the session
                        session, msg = await gateway.receive(session=session_info)
                        print(
                            format_message(
                                f"{local_agent.capitalize()} received from {remote_organization}/{remote_namespace}/{broadcast_topic}: ",
                                f"{msg.decode()}",
                            )
                        )

                asyncio.create_task(background_task(session_info.id))


async def main():
    parser = argparse.ArgumentParser(
        description="Command line client for message passing."
    )
    parser.add_argument(
        "-l",
        "--local",
        type=str,
        help="Local ID in the format organization/namespace/agent.",
    )
    parser.add_argument(
        "-r",
        "--remote",
        type=str,
        help="Remote ID in the format organization/namespace/agent.",
    )
    parser.add_argument(
        "-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

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

import argparse
import asyncio
import os

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: str,
    remote_id: str,
    message: str,
    address: str,
    iterations: int,
    enable_opentelemetry: bool,
):
    # init tracing
    agp_bindings.init_tracing(
        {
            "log_level": "info"
            "opentelemetry": {
                "enabled": 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
    )

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

    # 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_session(
                agp_bindings.PySessionConfiguration.FireAndForget()
            )

            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(session_id):
                    while True:
                        # Receive the message from the session
                        session, msg = await gateway.receive(session=session_id)
                        print(
                            format_message(
                                f"{instance.capitalize()} received (from session {session_id}):",
                                f"{msg.decode()}",
                            )
                        )

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

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

                asyncio.create_task(background_task(session_info.id))


async def main():
    parser = argparse.ArgumentParser(
        description="Command line client for message passing."
    )
    parser.add_argument(
        "-l",
        "--local",
        type=str,
        help="Local ID in the format organization/namespace/agent.",
    )
    parser.add_argument(
        "-r",
        "--remote",
        type=str,
        help="Remote ID in the format organization/namespace/agent.",
    )
    parser.add_argument("-m", "--message", type=str, help="Message to send.")
    parser.add_argument(
        "-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

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

import argparse
import asyncio
import os

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, message, address, enable_opentelemetry: bool):
    # init tracing
    agp_bindings.init_tracing(
        {
            "log_level": "info"
            "opentelemetry": {
                "enabled": enable_opentelemetry
            }
        }
    )

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

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

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

    # 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_session(
                agp_bindings.PySessionConfiguration.RequestResponse()
            )

            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(session_id):
                    while True:
                        # Receive the message from the session
                        session, msg = await gateway.receive(session=session_id)
                        print(
                            format_message(
                                f"{instance.capitalize()} received (from session {session_id}):",
                                f"{msg.decode()}",
                            )
                        )

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

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

                asyncio.create_task(background_task(session_info.id))


async def main():
    parser = argparse.ArgumentParser(
        description="Command line client for message passing."
    )
    parser.add_argument(
        "-l",
        "--local",
        type=str,
        help="Local ID in the format organization/namespace/agent.",
    )
    parser.add_argument(
        "-r",
        "--remote",
        type=str,
        help="Remote ID in the format organization/namespace/agent.",
    )
    parser.add_argument("-m", "--message", type=str, help="Message to send.")
    parser.add_argument(
        "-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.3.2.tar.gz (190.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.3.2-cp313-cp313-win_amd64.whl (4.9 MB view details)

Uploaded CPython 3.13Windows x86-64

agp_bindings-0.3.2-cp313-cp313-manylinux_2_34_x86_64.whl (6.3 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.34+ x86-64

agp_bindings-0.3.2-cp313-cp313-manylinux_2_34_aarch64.whl (6.1 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.34+ ARM64

agp_bindings-0.3.2-cp313-cp313-macosx_11_0_arm64.whl (5.6 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

agp_bindings-0.3.2-cp313-cp313-macosx_10_12_x86_64.whl (5.8 MB view details)

Uploaded CPython 3.13macOS 10.12+ x86-64

agp_bindings-0.3.2-cp312-cp312-win_amd64.whl (4.9 MB view details)

Uploaded CPython 3.12Windows x86-64

agp_bindings-0.3.2-cp312-cp312-manylinux_2_34_x86_64.whl (6.3 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.34+ x86-64

agp_bindings-0.3.2-cp312-cp312-manylinux_2_34_aarch64.whl (6.1 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.34+ ARM64

agp_bindings-0.3.2-cp312-cp312-macosx_11_0_arm64.whl (5.6 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

agp_bindings-0.3.2-cp312-cp312-macosx_10_12_x86_64.whl (5.8 MB view details)

Uploaded CPython 3.12macOS 10.12+ x86-64

agp_bindings-0.3.2-cp311-cp311-win_amd64.whl (4.9 MB view details)

Uploaded CPython 3.11Windows x86-64

agp_bindings-0.3.2-cp311-cp311-manylinux_2_34_x86_64.whl (6.3 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.34+ x86-64

agp_bindings-0.3.2-cp311-cp311-manylinux_2_34_aarch64.whl (6.1 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.34+ ARM64

agp_bindings-0.3.2-cp311-cp311-macosx_11_0_arm64.whl (5.6 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

agp_bindings-0.3.2-cp311-cp311-macosx_10_12_x86_64.whl (5.8 MB view details)

Uploaded CPython 3.11macOS 10.12+ x86-64

agp_bindings-0.3.2-cp310-cp310-win_amd64.whl (4.9 MB view details)

Uploaded CPython 3.10Windows x86-64

agp_bindings-0.3.2-cp310-cp310-manylinux_2_34_x86_64.whl (6.3 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.34+ x86-64

agp_bindings-0.3.2-cp310-cp310-manylinux_2_34_aarch64.whl (6.1 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.34+ ARM64

agp_bindings-0.3.2-cp310-cp310-macosx_11_0_arm64.whl (5.6 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

agp_bindings-0.3.2-cp310-cp310-macosx_10_12_x86_64.whl (5.8 MB view details)

Uploaded CPython 3.10macOS 10.12+ x86-64

agp_bindings-0.3.2-cp39-cp39-win_amd64.whl (4.9 MB view details)

Uploaded CPython 3.9Windows x86-64

agp_bindings-0.3.2-cp39-cp39-manylinux_2_34_x86_64.whl (6.3 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.34+ x86-64

agp_bindings-0.3.2-cp39-cp39-manylinux_2_34_aarch64.whl (6.1 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.34+ ARM64

agp_bindings-0.3.2-cp39-cp39-macosx_11_0_arm64.whl (5.6 MB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

agp_bindings-0.3.2-cp39-cp39-macosx_10_12_x86_64.whl (5.8 MB view details)

Uploaded CPython 3.9macOS 10.12+ x86-64

File details

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

File metadata

  • Download URL: agp_bindings-0.3.2.tar.gz
  • Upload date:
  • Size: 190.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.3.2.tar.gz
Algorithm Hash digest
SHA256 40a77cd9142cf569447488c4d16c149991096e9c66c45ca683673b27f2d4c555
MD5 35b849f132c63ae3f9d84e31e1bd81de
BLAKE2b-256 3838040a84ebc50a437297bbd193c79f630a95476b92a3ff661543b077ffd3a7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.2-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 d0609990ec4530c3371cd71935e79e5e7a89d13d47d44463befa254eb9de3875
MD5 c0b387a4c049f4b50970611bf62e0a8c
BLAKE2b-256 70bc3cea0a94f74f26ea85d33de5f2dcd51a6c548a6c1f52dd699b6b764d4b7b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.2-cp313-cp313-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 aefbe9165bfea8e0a3984fd75c4df2fe4339d6217f8f4350d7fc41b58dfd4106
MD5 531335e2fd16458e32af94191631275a
BLAKE2b-256 500c784fd6a018fc6e19c947e4206715a53b4074c062867419dae04f05c36433

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.2-cp313-cp313-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 1dbca08b9e8d29ce9e9b6af29b9a159ebf49ea0f48f5b77a6286c619425eca3d
MD5 5fe4e494d1977bb0c0940dab2436ef63
BLAKE2b-256 52b4f47012262d7ceef8cdc67f819865fcca38d2f86e44dee703f727661482cb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.2-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4429978196e9bdc2a40a19d0bac2f8f09b5694ea43172673b21ac1e0bcbe22e7
MD5 a45c95fd267a7a2a69493fa21c46fa24
BLAKE2b-256 a6397ef18afc97916b24df97ce5a96cc0301a737afaa073f937decfaf85af7c3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.2-cp313-cp313-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 99b7930c8b1aa2054d29458802485aeba1658d124a4a63b0ea384eb230346380
MD5 b9982d29e0a4b4816685227e2f96a0b0
BLAKE2b-256 26479560e77c95ebc262f8a308253c7137e03625b6ef9f6349938520aa068dae

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.2-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 3bdc715687f721c7c3bce864c3994804c0d707355631b6429996f701929f4a89
MD5 5af61adf8c8c7297faa2ab4a6bcf2113
BLAKE2b-256 361477e5361a7165647ae554ee251cea46e6f9db544ba4d954dbececd809305f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.2-cp312-cp312-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 2426cc5d7cab847f8701e5293e03d7b1459c35f38c28a111dc06ab9ad6a0619e
MD5 5582a042f57d072e371d2b1c578c9506
BLAKE2b-256 de15a342a119024075e7e0d02b41c5fe1c34091d0b26e336754427a324ae5577

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.2-cp312-cp312-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 e06e2da6f2bc172684255ece4b419c424f1081317b14b90f42af9269a3cd9cde
MD5 3e3d01e8fea321eac14979ff6a6bd296
BLAKE2b-256 1df35f04c33391bf05071321438e20489db38384fbc77f631e362c9945f498cf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.2-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 bbccbd4a17c587fb9d07499948af6fa7e2729b41fb008f537a1bc6a6a653a1cb
MD5 bcd3b14b1b3ecbdcd10580c802bcb32c
BLAKE2b-256 96e88bbba26ab6e27cb9a05279591941664419e7b1f90d5f1059954f60f24537

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.2-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 a803b73e523433f572443675e9f670041d331db2887b29bb6e6a84fcc9cd42e7
MD5 7b30e9c0805274e2f74676b782ecdc02
BLAKE2b-256 072e26c18957de88112322bde711c882e5fdbf6c44244b60594d14cabe2948aa

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.2-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 3ed07fea6385f110fb9e366e183799c6cafc0dbb726e933ab839d194c1e83483
MD5 b1307bf0610192bd350ac6229a38037b
BLAKE2b-256 7f970c2445bd89bb699c02e570550f692945d4700262abad622a79b34e28c1ad

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.2-cp311-cp311-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 61a3ed8a65c46017be847dcd179b84a4790520e19ab342d4a1fb043e8a7c2b8b
MD5 a511f57c7a913abb9974fc93cf5d34db
BLAKE2b-256 2c7f93d3c0fed571db12b7bc51cc402d202a2a6679fa09fa3f71aadb869d3489

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.2-cp311-cp311-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 902ae88950672c9009b47c28644a5561df1f2cf07f5487266a2170b59e0fca77
MD5 0a89f6dec7ca1c113f45e751e086e7d8
BLAKE2b-256 5f459031408a9e5e48152bb35f9dc41d05fbe0f3470082cd59581960f0a8f0a9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.2-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 344943d5bd05079823afb1d8f9201d9303c624c44fadc052c2d93016e4875756
MD5 4374f412630c494a8d9aa61d77a0f69f
BLAKE2b-256 fb5e37cc7262a512cb5f85c456c4d74db35388c4264d4139ceb38323c9201b26

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.2-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 26729a62363b5533ccf62ddc78aab7c4edcbf233ac6a9768807ae13c66c1b1c9
MD5 9254fe8a5dece76f8b241a354cbf2d24
BLAKE2b-256 fad098df8869ed65221db46fc272d7ce84181ab340886581213268470b99eacf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.2-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 6e7af2ea3725168bc693c64a6ebd8d4feba1bbffa88dd0550fdf7a5a3aaa222d
MD5 b5fd1403a8a12c86b2772a5aa6d77133
BLAKE2b-256 bc530d8d45e70fecabb7db5c5393a683ba0f345f728e8a3adca6cd7ea985e17e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.2-cp310-cp310-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 74f5083b60bfbcbc12e8eb3e760b98ed004768ab52077c617cb281ff37bc94ba
MD5 d821b2df1f92453a5839c9c90f6f9856
BLAKE2b-256 935d77a3623038bbdcfb76ae0801d3aae94ff4c8b07231a275c6eb5f16c3f300

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.2-cp310-cp310-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 fb4ad8bb294dc88ac621f785e07a7d3af3fb3447a527a35bb96d13dfebc3cea5
MD5 23466e1bd21ef44e0ab5ea638fa692d1
BLAKE2b-256 98029d3ea705b80edfb4c5b9503c13f1da7ffdffa24184599cbf665023d5c04a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.2-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e1c82125725bfdaaced62cdf6a158d313e4f818f1bcc346e724feb2fffd9d494
MD5 6d282527c8d80336e6eaac251dc1cbb7
BLAKE2b-256 414c81caa81c17c32d4a8cf915167d28da52a639bcd8ec3b65c9d7f85e671a48

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.2-cp310-cp310-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 02e8c09f75ffa5c089da0980d7b126f5313dba05b3dd8320601276e325865437
MD5 d1be0df44d92949dc2040e433ebad821
BLAKE2b-256 0f1446af57d0ce7fdc811228253688f00388eeeeec53275aad9acc1fc10bd377

See more details on using hashes here.

File details

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

File metadata

  • Download URL: agp_bindings-0.3.2-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 4.9 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.3.2-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 02e267a91c15d5bc47ac90d514c184ca62e92535555e32ac08aad61d43deeb86
MD5 c2e66c4ee18a5e17600ad84a08fbe4e1
BLAKE2b-256 840729dbea99f83565dacfb6de730fa60deefa3ba323d0ffb7b1f782db9a05c1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.2-cp39-cp39-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 f685f31c71129914aeebfa0aa14761bcd3e2165b39b3324cbde3ec19031e45f3
MD5 a7d711301168c852aa68f0f7e9f16976
BLAKE2b-256 6b76336793787cad20698d933bb2171ca2cbcc7f6b5f085c42fa7472150cd1c4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.2-cp39-cp39-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 2e6d586adb9a39144d13cd09984ebc65cd68a2296095ff1c80650a358ea4622d
MD5 f9a0a03e8965ff2fa04e18eed7f06320
BLAKE2b-256 b5e46949842eb0a4fbd9661cab59459ed902ab7b23e14ae3bf84a397e5f461a3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.2-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 bedad69be926525b0092ca641ec01742afb2d0d2442c71abe74975b29d62fb95
MD5 b11f6a361e9b9993b7f818ab6de721bb
BLAKE2b-256 38d4464e3a8cc14bf2adfcfc1f8731cbd545ede1dd4f6eb568bba39dafce8834

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.2-cp39-cp39-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 97a8257ef8f46bb74ae384c4acd2e160d15d5a54a7b73cea50fe701831e8caaa
MD5 f3b4b0ae3a7e94f0a756713fd819e81a
BLAKE2b-256 d669c7a233200aa7458892610c7c6146dd16a54c847580cf0dca1ef6befe5a11

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