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

Uploaded CPython 3.13Windows x86-64

agp_bindings-0.3.3-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.3-cp313-cp313-manylinux_2_34_aarch64.whl (6.1 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.34+ ARM64

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

Uploaded CPython 3.13macOS 11.0+ ARM64

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

Uploaded CPython 3.12Windows x86-64

agp_bindings-0.3.3-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.3-cp312-cp312-manylinux_2_34_aarch64.whl (6.1 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.34+ ARM64

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

Uploaded CPython 3.12macOS 11.0+ ARM64

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

Uploaded CPython 3.11Windows x86-64

agp_bindings-0.3.3-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.3-cp311-cp311-manylinux_2_34_aarch64.whl (6.1 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.34+ ARM64

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

Uploaded CPython 3.11macOS 11.0+ ARM64

agp_bindings-0.3.3-cp311-cp311-macosx_10_12_x86_64.whl (5.9 MB view details)

Uploaded CPython 3.11macOS 10.12+ x86-64

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

Uploaded CPython 3.10Windows x86-64

agp_bindings-0.3.3-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.3-cp310-cp310-manylinux_2_34_aarch64.whl (6.1 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.34+ ARM64

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

Uploaded CPython 3.10macOS 11.0+ ARM64

agp_bindings-0.3.3-cp310-cp310-macosx_10_12_x86_64.whl (5.9 MB view details)

Uploaded CPython 3.10macOS 10.12+ x86-64

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

Uploaded CPython 3.9Windows x86-64

agp_bindings-0.3.3-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.3-cp39-cp39-manylinux_2_34_aarch64.whl (6.1 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.34+ ARM64

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

Uploaded CPython 3.9macOS 11.0+ ARM64

agp_bindings-0.3.3-cp39-cp39-macosx_10_12_x86_64.whl (5.9 MB view details)

Uploaded CPython 3.9macOS 10.12+ x86-64

File details

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

File metadata

  • Download URL: agp_bindings-0.3.3.tar.gz
  • Upload date:
  • Size: 191.7 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.3.tar.gz
Algorithm Hash digest
SHA256 1de48385a9611a6782777a20b8741c211ad095ad5d433ee95d7e0ae867b9a764
MD5 10d5da6fd1ebf0409ad3bbbaf3430a7a
BLAKE2b-256 61609405e8b9ccd34dae5ec1a3a669598cd0787b99488ddb47a55997619c80fe

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.3-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 ec2bdc8402ceb8971d3560d9cf9c6d8ddc54e6ff7867e49cb4fc781d1d658c1d
MD5 5c670d7bef2e939a05222b0283cae53a
BLAKE2b-256 6abff04fb4cd782ef10625c641ea3439929f3f84bd26c8bdbd6cd8d0b5211362

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.3-cp313-cp313-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 b1d340a66a86470c13c611140f531a9c18f4b262aaff617e1cdb552bbaabd0c5
MD5 881c9f9f5a58023a3f7013ab3dec1745
BLAKE2b-256 dd762840567049de613d478ec752687c8a7696265c1f896dfd11d582c8c157fc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.3-cp313-cp313-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 656d0582e7921fefaa885d29c7b6bf5133a55ef165bf164e4cbedd194d121ed9
MD5 289b8b6a703af1e8d090d3ca660586ac
BLAKE2b-256 04f1c1f3cfc62ffde8635a8a8dbc1dae57bde42d64cf773530c04e22673a84cd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.3-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 36bd23f5787bb963b457e9d80a62fa70a41244ee8cf8a5371ac19985b59a298a
MD5 72b77dc3f5df9c8e8d9ac48bb6288043
BLAKE2b-256 7ac0ee7fcea2502cd612bab989a8bd004c2f03eff372a9beb41181aba3e278e9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.3-cp313-cp313-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 f3f4b6e86d6c8b3ff6572c8917bf9a9d5883ecb1ad20196d264e82c5e507c8be
MD5 6324d18a3b6c055a9821e3ded18c2de9
BLAKE2b-256 90d7c315bf9a3c7764d6e5ab032ac6a0ac1dcc81414e23b971e6486395a9aa26

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.3-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 6144562385abfbd98159b6be815090e54b0b3fc2d9c7e3e3cd1bb535fd23e37e
MD5 bff062da79ab3b66c273cec49458558d
BLAKE2b-256 ba6c2e6ac81a75e20ee7a41a9d7af92757dd163c1e278363d4c491304f88953e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.3-cp312-cp312-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 15bb258ca1702f2bc9bcb22cf9cba953ec97ca4770ed11344ba276e4ead07aeb
MD5 92396c7400097b707e5251a396430f2b
BLAKE2b-256 eac71f5ad021b41e6677557f88c3b4a59f11e206640bc58fe71242d728a9111c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.3-cp312-cp312-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 ebab14d3341bf9b9fe3b27d5ec87160db853deb1c1466ef9b2613e46dbed7cff
MD5 523d24fa828ef9da97a175e4787804d9
BLAKE2b-256 8740b6fc5e79db0f2a9ec1e45f44bd38fe40188c31d32bdc86707a3e9ff9d18d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.3-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0cff7016cf6d101589f26fab93cda2ab76bd45421b417e61e46e11f6e26f6cc1
MD5 9392b845303330599dc0d83aa661c0fb
BLAKE2b-256 e4c81b8565c67465b97ab907ace05668b421faa8491be0a3bf68045e81d77995

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.3-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 96e9def18608d76fb35547bb3b464f975ba4041dd3ec44ec3d76640c1625a194
MD5 26400ebd34fab50ef24c124b2ab8e35a
BLAKE2b-256 83151f5189fa922572e5f274e99e1afc69730fc59cac4fd8d41461ff69fe344b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.3-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 c34b2c5aa0e5c4b91f90fc8d42c8b03806850a540c9b793ac50723afd3447c9e
MD5 ddabd24ecccf9d81a482a472d2989b2f
BLAKE2b-256 2850757fcdcd571261bc38e2cc1eb959ea6550fe2ccde3374b3ede48d239972c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.3-cp311-cp311-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 6c2df873b4411c735e526a6cb95a640506f09920a35fb7822cd672113c75659f
MD5 c668a220e7c2d05cfba868203de6cac8
BLAKE2b-256 550fd960832ddaa123c721a25c03c868cdd074231a8d8322f7d4bdfa0462610c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.3-cp311-cp311-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 7eaab040a4112e76f181d0d601aab3dbf1704fcafeaba4eb714f159658eee469
MD5 9de02f3b051f8905bff9105814c5ed43
BLAKE2b-256 cb62862e8cda4e4580dbac1e200a6eb94f86633aa5e3b1cceb8b786ca295c0dd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.3-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6c6eee0820b441d722da12a46f1920e94328b05a54146ceaf1b2bbb3d084fa27
MD5 f9932967d4db54ecf4f4c3ce73926f86
BLAKE2b-256 0430ece92eae6c53c0404f9d428bf1c5706b236139bd93b90a6f8e02a0109d6b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.3-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 2b48025f30df40678afa678785c1b1d7b2d2ce59ae86fbd436942dfc8417bc67
MD5 02f152ee910dc6db37e477e42aaccd88
BLAKE2b-256 873fb3245b86d2cbddd5b3f1f371bd56a9b864b19650d066c20db3e14fac739d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.3-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 364f86c340a9d4fec2d2032d6e3eabfd8863c7c8ed944422ce3cbe9053dfd6e8
MD5 9934905624e4629b2309160fdc2aee3b
BLAKE2b-256 baec1a1dc061df5172e0e360edcfefd7d85d76b4fa830d262733bce4d486bf1f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.3-cp310-cp310-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 6236c425debb0fe2c5c17f2e1fdedd35c4e68b1f0dd7a66295113aadc60f6172
MD5 78b173c1308446cbc86d1bcc30efb05f
BLAKE2b-256 09991699044656f3eab646d7146792484021338b4d19394671309433023f8376

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.3-cp310-cp310-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 2c5278ca2d8fa4d92e6eac067a066b8a17ae31d53b9b28d48e52835d46e18f1b
MD5 e6c7eb862b90c5968897c31ddd61c791
BLAKE2b-256 cb4c6c4904cfc601588921313621458a3d591e3bab4307910438364981fff666

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.3-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f6470d42a0c8d85f75429ab2285dc8ee3d5775ee51731d67b27adc77d3ba8f21
MD5 bb374aff741cbe03aca7cc9e6c98fe36
BLAKE2b-256 f1b3e3e031b34ccb3f935f0a7219ba34168fdfea0e46be23c5d404fa772a403c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.3-cp310-cp310-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 d7a9231ac2c2ce7f16946a7573df70c66897e5185ac2f0273ea220de3683e409
MD5 f0b896bf7698715ee4c158a444bdf32e
BLAKE2b-256 f856b940b338a12d54d65774ed616b8aa12ce9020ad66ff6864382f3a93744d8

See more details on using hashes here.

File details

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

File metadata

  • Download URL: agp_bindings-0.3.3-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.3-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 960420926d4eb399e0989c3606d6ac5da755648c2b2454cb529898e0e8541db1
MD5 755827c4cb39017aa026bced04c4b908
BLAKE2b-256 590dc4e674cc667b3c77a43238e56b1810ca8af2ba8ae6a215b07e1b224ec704

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.3-cp39-cp39-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 3305c6769fe2a25088559624e35963170d87e658476b0a18a6dbbb46e7a29ea4
MD5 49665ddcc42695659970b67ca2ad1a92
BLAKE2b-256 e7590e068179e31f1d331b9f5222f033789ed01c5517b005d7e78d2daa581319

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.3-cp39-cp39-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 fa6ad76e1dbee7f8f9af2b3c0757525c0ea041c5ba11b47b13378013a7625a7e
MD5 750711ec635eb7a633197812986d12f7
BLAKE2b-256 7cea6bd42b6b92354d52f1e73ff627dd293574b97cece095030339058652ed2a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.3-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8565af1cc782f5a568477db5f356be588db987af6f029bef3fac8678178ae83e
MD5 29a03514f4738357a33f32ace9f31dba
BLAKE2b-256 149f0f3681dc7cd4a9b6dc7fad250b7d6d49defb6da21f23e72c6814f0cb252b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.3-cp39-cp39-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 279546f4199791a257ddf1f2257efa86872f915b11229e23dab93b6163e8d9fd
MD5 36e000fc8a40d3d4f4fb416ea7319671
BLAKE2b-256 934592febfb64a04cf8e7cd41a11ae35c1b108e500004b41832bf0be707ef097

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