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.5.tar.gz (197.6 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.5-cp313-cp313-win_amd64.whl (5.0 MB view details)

Uploaded CPython 3.13Windows x86-64

agp_bindings-0.3.5-cp313-cp313-manylinux_2_34_x86_64.whl (6.4 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.34+ x86-64

agp_bindings-0.3.5-cp313-cp313-manylinux_2_34_aarch64.whl (6.2 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.34+ ARM64

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

Uploaded CPython 3.13macOS 11.0+ ARM64

agp_bindings-0.3.5-cp313-cp313-macosx_10_12_x86_64.whl (5.9 MB view details)

Uploaded CPython 3.13macOS 10.12+ x86-64

agp_bindings-0.3.5-cp312-cp312-win_amd64.whl (5.0 MB view details)

Uploaded CPython 3.12Windows x86-64

agp_bindings-0.3.5-cp312-cp312-manylinux_2_34_x86_64.whl (6.4 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.34+ x86-64

agp_bindings-0.3.5-cp312-cp312-manylinux_2_34_aarch64.whl (6.2 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.34+ ARM64

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

Uploaded CPython 3.12macOS 11.0+ ARM64

agp_bindings-0.3.5-cp312-cp312-macosx_10_12_x86_64.whl (5.9 MB view details)

Uploaded CPython 3.12macOS 10.12+ x86-64

agp_bindings-0.3.5-cp311-cp311-win_amd64.whl (5.0 MB view details)

Uploaded CPython 3.11Windows x86-64

agp_bindings-0.3.5-cp311-cp311-manylinux_2_34_x86_64.whl (6.4 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.34+ x86-64

agp_bindings-0.3.5-cp311-cp311-manylinux_2_34_aarch64.whl (6.2 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.34+ ARM64

agp_bindings-0.3.5-cp311-cp311-macosx_11_0_arm64.whl (5.7 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

agp_bindings-0.3.5-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.5-cp310-cp310-win_amd64.whl (5.0 MB view details)

Uploaded CPython 3.10Windows x86-64

agp_bindings-0.3.5-cp310-cp310-manylinux_2_34_x86_64.whl (6.4 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.34+ x86-64

agp_bindings-0.3.5-cp310-cp310-manylinux_2_34_aarch64.whl (6.2 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.34+ ARM64

agp_bindings-0.3.5-cp310-cp310-macosx_11_0_arm64.whl (5.7 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

agp_bindings-0.3.5-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.5-cp39-cp39-win_amd64.whl (5.0 MB view details)

Uploaded CPython 3.9Windows x86-64

agp_bindings-0.3.5-cp39-cp39-manylinux_2_34_x86_64.whl (6.4 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.34+ x86-64

agp_bindings-0.3.5-cp39-cp39-manylinux_2_34_aarch64.whl (6.2 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.34+ ARM64

agp_bindings-0.3.5-cp39-cp39-macosx_11_0_arm64.whl (5.7 MB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

agp_bindings-0.3.5-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.5.tar.gz.

File metadata

  • Download URL: agp_bindings-0.3.5.tar.gz
  • Upload date:
  • Size: 197.6 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.5.tar.gz
Algorithm Hash digest
SHA256 1804f4f1bfc2709598b4961bc3a65994117a40cf5f3f70e21f460d6babc75786
MD5 ac578a418a518a751c21bddd68b9af8e
BLAKE2b-256 45c08bc6da495632b1c4e1f52a17616dce17cce862aec0788a2c71f5ef0f3745

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.5-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 39ef4ecdcafb70ec8bc1c5107ea3fcbc6f8b1fbf3dc1764be68ed7bcd5575512
MD5 3c76e4f5564cced5c62e1d81ae5cc875
BLAKE2b-256 ef89a28a54c3834a94a20442658f8fa1a2af1d126d01b7f1c60e7c8cd0550be2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.5-cp313-cp313-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 8b1fc112af12fe8de2eac0485a2e0b4cd4a7b32546fe83e25211b1d809e0d6b4
MD5 b8630bc326eb6331444d77120775df7a
BLAKE2b-256 c5a3714f2cc000112ccae9c5e0ca895a6d405ec7c261d9df31ee52400417dff2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.5-cp313-cp313-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 52151ed14efe020977865881a40f6c2ec9bf3e07b14edb2b67560e1540fbf985
MD5 6966a3d7d2742b01e647d4ec17a54be0
BLAKE2b-256 ebf0c548c9ba9faa74a1d5de531bb9063a4785b2ae7e877a2587435cd277e5a6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.5-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8ac5f55f5cece61722a8ab6b6aee7d12d3b6c528587fd9ccd24a13a521d87aab
MD5 fdd50b25af2dab44de7d2dc4f9a5489f
BLAKE2b-256 8a6a8c61d859e93860eb26683800a39a197f7d75a9dbaef57115d0f10c60d9b9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.5-cp313-cp313-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 7098233d61a875c0cbf5b73a556bf85311d6dfc501749ce158ba8233a0f2efb3
MD5 43ebe24706788cf3cb079bbcfd344625
BLAKE2b-256 6b8abdc3df4ef7bb94c8a3a8d448a9251fb29f1754de9a51582c0d64d33bcb8f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.5-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 d1d525ab828593293903861bd847451fe9153a6a0cd585e9f5ff2fbd96cca584
MD5 d03824f09e74dc9d51bf564d8cba35f7
BLAKE2b-256 339e6d1aaaba7a8cea942f55f89611a755beff18734d61ba76fb2e80a90dba8f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.5-cp312-cp312-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 eddcf52abf3f64d802932549537a8765d00c0d24c47ad5325f68ce13a4f0cbd2
MD5 7a7ff6b87e4119b9167c21cd92bef785
BLAKE2b-256 f49b3da46fa37a17e308a4afc5b18fa31edf3bd1520bc64bdf80142b2fa52296

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.5-cp312-cp312-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 5e5476ca93d6a81998c3359088397fe4af696d1a999aa991c41cb350c0e791d4
MD5 9071c1de5ba5f47af7e218471796242a
BLAKE2b-256 5b2eafe22f7b83e8c71a0c2eed429dedfe604a1a82c1254de3316165d11bfd2c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.5-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 da596d4d31153a295de8e86385b2af65151c579aac6bd5e7d71c8f51188ffe0d
MD5 c7e01a4487f2c32aa570cec3bec9705c
BLAKE2b-256 cc34c92c85163d0ed6afcc9e2299697a7cfaa895a3fc843707b746fbf01cbdfe

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.5-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 86745d2d61a71eb0455893264db77b6041ad5153e2e81badd5750cd249b938dd
MD5 0b5584779067529431c5adc4b0a5340a
BLAKE2b-256 bcef59bda8e0d416c0b55009ba7f3efe31b5399ff7ea65cbb8aeb9b366f1fc35

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.5-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 e9ea79ee071743e0f81e3726fbadc93619dca75c01a74a1c03f36a30d18d6d82
MD5 54fcf7ae588104e6c024335be11b1fcf
BLAKE2b-256 f745dd7fa0f96557d62b9ecc855f72a5b6f1019a7330343f6c37c540ae4922c3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.5-cp311-cp311-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 f9ae9f6464f5f2f563e7a73a7827f7b3300105751f797e7aed034f53d6604f24
MD5 d348b499dfc1c80c5e19beead8d638ce
BLAKE2b-256 63381234e4c82f1318769aecfadcb8411378c0ba7ebc7685a9fb7394aab26842

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.5-cp311-cp311-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 87b6058fdfea79ee4bda278c9d2dec396e3e4eb33bd2a8f3a925fd769d02a99d
MD5 5321f12e2295dc79c63125dff206bdd7
BLAKE2b-256 24e47655934a97ad6896d4a30685965329886f88f855010c02f37866a338fb3f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.5-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5b91cec0feaaa15b09b683c0021e6135ae24d2503ee89ef97aed8ca5683f9cf5
MD5 1308a4a5c303da734f87e5c80434a9cb
BLAKE2b-256 aade9a2d810c33cb917a63bdc8a7d99c01c2be5471188a5da07a6b6c8191ce5c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.5-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 404a560d41612c914cd73450068f912b1e958206fbee847f6102e8544d680329
MD5 0f41448ae08bfbca0154beabd9dbe530
BLAKE2b-256 7baa47f65f28f6be06855605bf784141e2e26b56acf101244a5431bff9e1ec9c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.5-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 7900c43db7dd75a5717b324f1904a400544fd30ca81f9f1938c3a7f7c410d2b0
MD5 5366979108512dbdb433a0d9774d2168
BLAKE2b-256 cf4eb09b5fb3bee7e8093e2b6f9fb975e8144f27ee12caa60b1444e11cd6c78f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.5-cp310-cp310-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 3245fb583f83230e6067ec34273cf2ec81a2d045b2311d36ab48c961b3710266
MD5 08947ab34a6ebc34ecba5fc650cf0f8b
BLAKE2b-256 2a21c2a6529a9b8e7b07902df943f3c3b37e7a89fb31eb211bcc688f25533c29

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.5-cp310-cp310-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 23fc56b0fef9f16fbf8523ecf0928b95a0af6962229a0c7b75f3774608235a9d
MD5 81666eca7d79ad114212a0cf1708d153
BLAKE2b-256 6a6378377d14fc24772d698fb4e323a9aa06dbefee84451a21404a52c17f36ee

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.5-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e9e5df8aaa1d3b7cf5ba1b579cff2cabf377b366b88b90b337af19405a928cb7
MD5 0c154b208d45a4ecaae72882ea099beb
BLAKE2b-256 7ffdc944ef5bd75a1dfec64bd416c6e580d0b7b8f44a0c601a6ef88ce31dafaf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.5-cp310-cp310-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 7688b9f85492f02955a25ab55374fd5bd920d5d3c9ac5e38f85efb0e2335f012
MD5 5cb97d17845c2a8307bfe738270b9325
BLAKE2b-256 d26f43167f0f1fc9702f428b3a0acdcd470f4f9830bd618c899ac290cd2744cb

See more details on using hashes here.

File details

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

File metadata

  • Download URL: agp_bindings-0.3.5-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 5.0 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.5-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 9be5d27f19845870313d8fb7eed023ca715c45332467875b41bd9f0c6b444b38
MD5 6baaff9b2e864e494f7a86c7d5fd33aa
BLAKE2b-256 f5780b512e10a636685ac5e05d0a0556fd483c8d628d019bbe96ce6e02ed5680

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.5-cp39-cp39-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 5be7b7753a020c0db7b987648b57c650ac3a212822c11d8140f134d4cd1b2841
MD5 39e171a795ae7b9027f03e3015513c78
BLAKE2b-256 80ca02a1ba7e34b42387e6a118a2c386678706a786bbfad3a4a9f8914ca738ed

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.5-cp39-cp39-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 6fd4c9da9cfb434651f883dfac4a459872e1e8465910b96f1eaf36dba3279c48
MD5 2e7482778b951c449eabd111c1a0d1c4
BLAKE2b-256 8a7e6298f35f7639e092eeebc11f9bb62c7b70ef223d9375baeea2ffaffecb5b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.5-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 56dcf8a76df1258b1c671eba2bc5992450ef65efa3246971d79d126a1eb47480
MD5 d98485cc1e25fc5b9752492822148b5a
BLAKE2b-256 85e17b2f61a7e85ff25066d02cfdab2d6976eee129f602f3fe6b9ad7c692981c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for agp_bindings-0.3.5-cp39-cp39-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 515f199a7298719e9329dfb1670a7e58bced245ebd21fa7d183ab65335ba1a0c
MD5 128483eb8fbc2204d958f0007d5b955b
BLAKE2b-256 ebf7c6ba49e72bffd938ed9ebd14277b23494b8ec28e631f2902e4968e8b93be

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