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

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.13manylinux: glibc 2.34+ ARM64

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

Uploaded CPython 3.13macOS 11.0+ ARM64

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

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.12manylinux: glibc 2.34+ ARM64

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

Uploaded CPython 3.12macOS 11.0+ ARM64

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

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.11manylinux: glibc 2.34+ ARM64

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

Uploaded CPython 3.11macOS 11.0+ ARM64

agp_bindings-0.3.1-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.1-cp310-cp310-win_amd64.whl (4.9 MB view details)

Uploaded CPython 3.10Windows x86-64

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

Uploaded CPython 3.10manylinux: glibc 2.34+ ARM64

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

Uploaded CPython 3.10macOS 11.0+ ARM64

agp_bindings-0.3.1-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.1-cp39-cp39-win_amd64.whl (4.9 MB view details)

Uploaded CPython 3.9Windows x86-64

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

Uploaded CPython 3.9manylinux: glibc 2.34+ ARM64

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

Uploaded CPython 3.9macOS 11.0+ ARM64

agp_bindings-0.3.1-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.1.tar.gz.

File metadata

  • Download URL: agp_bindings-0.3.1.tar.gz
  • Upload date:
  • Size: 187.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.1.tar.gz
Algorithm Hash digest
SHA256 c80bd643c199600106be31f9dd7006401cce8671165f3c4899787010e80a1a27
MD5 f6ed4f89070eef05dc1c63180c67b78e
BLAKE2b-256 94d4a9ea7ac4b5b25b8530d6cec8fd2682fb0b9cd24cd657883d9d4999ff55bb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.1-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 3cf2cf0b915357fe5266d77f51614b788f11701d8a5e6b7243905e706adf1151
MD5 ac7d5b80d9c02af4ddb0c9bb3e3a1033
BLAKE2b-256 6e7b0fee3bf0928645be34e34b4d2edaea51f976652e447a2635415409d09248

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.1-cp313-cp313-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 4a49b1f971dfd1c6a34c28a02481b400945a7394d9983d5f59068604db73adaa
MD5 715b8334765be5d5fdf57fbf14b7ad7a
BLAKE2b-256 82563cf4cfd6abbd731c474a91253d71c6228bd84d9fb80ee3cb005b0a194358

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.1-cp313-cp313-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 ddeac3c883c2dc382ba16cf80abd715a4bfab64bab08fb3857bb87dac256b054
MD5 9858a155405d3c4c367afb96655aa7ad
BLAKE2b-256 aca291732599666d998437c437b47b10b50914e4b5b07013ef850d5344d8d69b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.1-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6d7ad2eef24367773451133dd6966e8ce58256d3c74d86801eaf1fcfc2e1dfaf
MD5 da4a499f05f6b86efae02999ecc38621
BLAKE2b-256 466f634c1cd89861ffc4fbe7e3871064c05bff8ac76d888134e892b203869f34

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.1-cp313-cp313-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 75f3bcdd04e49a292012e376ff555c71e8b96d2a5b3faff40a40179eca1967e1
MD5 86fec4bba229ce6d968110c232f37ef2
BLAKE2b-256 073126b1356d568fc28477ad10703cb173c80c7f259c1b6051bdad06a37b5822

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 ceaa3b2234613b5db9d2717f38aeb028d989db51a87ce04c09255d21a7dc6ba9
MD5 9fb6a60681b0d50282722bcb0630a328
BLAKE2b-256 935b0457c23d71b36f697d501718b69e44f0204649ae9d5957c1be8c847644b6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.1-cp312-cp312-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 6cd7d3d3ce67ba18602fc66ea8cdc22f6809b6f8b3b652d28625e193202ca700
MD5 f49727fcfafd47805e2e47cca7443587
BLAKE2b-256 5622f2a3ea472b78b6df1d405bc6a55df81ff67b44eb2c7975f9da393f2542ca

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.1-cp312-cp312-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 aa27a8077debb6ea1aec6cf4898d11dfb598b490ef249e7ee3d90d39d15041ba
MD5 f499babc25cd5fa45ae47147f1af8003
BLAKE2b-256 ae69f01f8c2ae21edbf95bbc4fc40075a191286d0b868d03b2031a9afe05096f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.1-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 05c730c325e43e71080efc0981e1fa39157b6411154974a36b1ef2372beb8c57
MD5 68ec39d295412b3a82ac7edbeb0bfc3d
BLAKE2b-256 fb1fdcbc4eeb57ea8cfde53013a52947e279c4af39b5e3cc0ff5110117457bba

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.1-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 08a6decda96d4222d1edd8717f5bdb534d59889011855f9f89c5853557eaa7df
MD5 0623d19e3db7b09e139502c7192a5d55
BLAKE2b-256 93a0b9aa64a7fabc854f49acb57a0d208ce0e46ca6b3da15e8d3afe1894a27cb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.1-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 941f4ffcb386f7b822316a80ce48b6b79cabb2c09420b92cbe5afce161d154bd
MD5 5b6d0df7a55805dee3e37829b0bf667e
BLAKE2b-256 0ec4a8ce50757c131424e60d332393c8a7a6cba4afc0f715a09746db5f49df30

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.1-cp311-cp311-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 d776c853dc3571c1cb373196a881794985164c60933d4d3c3d356a493e7df3fa
MD5 c0b657fe023d2038c0526e1a559c02f4
BLAKE2b-256 44fd7e013f8db135041f9750e011e11620cd8830e2af6c001678a38063ddc288

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.1-cp311-cp311-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 2bebdd832b0b5807cca098b1a2adfa9bffc11ba61c163b66a320a6c93595c9d2
MD5 94f4aac8c56fb10c7b1afa8803485d82
BLAKE2b-256 8f8becc12847fea915d4f7c7a3cf3feaed7d12a2f3b55461f41306b1b200595a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.1-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 34689f8de5d0240258aa52ac48af42bef5f3eea3cfb656da0d12aac17bc350d7
MD5 a5285c161034156ef2da3b153df210cd
BLAKE2b-256 bde82a1c74e8875eaec660b4a38a2637edc561b22c963076573faf912110a9ba

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.1-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 24e8b78233bde520f52d5491d0b952e7be6355f803fff794df7ee117dc66882b
MD5 c066cd1393f0d149c01dcf5d5a7443f5
BLAKE2b-256 524c0ef1b77e029e84a45b32b4c15e991c8fef9a3f3c5e9e249f3511f2fc1018

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.1-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 74831cccadf57276a9f86dacc1974d2b2c791c03a7557cd47d9913fe804b7658
MD5 a918944416fe054a17e52470112aa069
BLAKE2b-256 9b41398792fecd0aedb57c5694851f5b921369fd22a64b4cfdcd636b13dfd1b3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.1-cp310-cp310-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 bc3042e94e3267b25c703b0cdc1b410a5ba4d640b4d04ac7c50304081f8b98cd
MD5 f1d53677f6b629d7ad13d203fcbe25a5
BLAKE2b-256 921fe953b2fa6f209894057a6ad220845fa4a24c2a652c003de0cb4943c9c1a2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.1-cp310-cp310-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 906159714a389882a8bfc82389b405460d533484b36c32b294d150776b63ed19
MD5 ae388b81bb0d142be443283182c604b7
BLAKE2b-256 b61a0050a7e825d92e1c1dd197b075dbb30a1be78f02a8cfbab089f5b85c5f82

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.1-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c02ff871ffff0cc7b8165e1600b9877539235572511c0f75a463c3408d6396a3
MD5 0a95a68d8df26b7da2edde7f625c71b2
BLAKE2b-256 29bb2ceef9e90452418df4e9ad90e3ba1480ed807b5296c8a98f510afdddb142

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.1-cp310-cp310-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 d22966273c81b1de90c07767cf8b8ee82d9c8fec97549a96f2ec64ecf3b71226
MD5 07c1e549d32cba9981161a0690da17ff
BLAKE2b-256 759e5e360343d50bdce3058bc5a443abbeb393a246819ea7d5449b401c387144

See more details on using hashes here.

File details

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

File metadata

  • Download URL: agp_bindings-0.3.1-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.1-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 3be666a35777172b03b1b5a1d4a2361edfce12a9c89d710778f224b0e07f515e
MD5 b0a553bad0ecb6b3813cb32525f3d2b2
BLAKE2b-256 234e7701112f43b78d1438fe8e9b2c1d422f3288fba1cf0d1e0ddcf600f22bc8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.1-cp39-cp39-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 fddad93f716ee0009879b88a4a92074bd4781a1ee2638728ec0953c11446f5f9
MD5 272d8a2a847dd8554862c772eca6a855
BLAKE2b-256 d292e8034a7c20f1cb08d1c24ad1d06258092fc1ce293a288ac2b2e498426198

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.1-cp39-cp39-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 9f227c939faa4a1d1c3fd93a15101d7689deaa749a1d3e4027a683fc7deb2465
MD5 46a4e0280156266d8bc7112b9c81c869
BLAKE2b-256 b5324ab28772b0e798f2a8a4ee15392725e79f290bc04e420b80963fc3ff3484

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.1-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3eb245a9c3aef0c208c488ab8931107caaf391f928a29e7075daa2af5b70940c
MD5 9e2a66c834196060717b3dcae478cf95
BLAKE2b-256 a499d8e5e463882caacbf860327ec09cd7417324eb05cf84625f11239a2d0833

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.1-cp39-cp39-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 63c98f7b51e355e572279e3663507986c5a572eb928d923759f15d91b7be06ce
MD5 8cf13873b20d6c0e7e2ac086a0deca54
BLAKE2b-256 1b4421a741c929947f4b1ddb2c0d41533f06a5977d2bd7546402769fadf9ad16

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