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 = "agw-example"
version = "0.1.0"
description = "Python program using AGW"
requires-python = ">=3.9"
dependencies = [
"agp-bindings>=0.1.0"
]
With poetry project
[tool.poetry]
name = "agw-example"
version = "0.1.0"
description = "Python program using AGW"
[tool.poetry.dependencies]
python = ">=3.9,<3.14"
agp-bindings = ">=0.1.0"
Example programs
Server
import argparse
import asyncio
from signal import SIGINT
import agp_bindings
from agp_bindings import GatewayConfig
async def run_server(address: str, enable_opentelemetry: bool):
# init tracing
agp_bindings.init_tracing(
log_level="debug", enable_opentelemetry=enable_opentelemetry
)
global gateway
# create new gateway object
gateway = await agp_bindings.Gateway.new("cisco", "default", "gateway")
# Configure gateway
config = GatewayConfig(endpoint=address, insecure=True)
gateway.configure(config)
# Run as server
await gateway.run_server()
async def main():
parser = argparse.ArgumentParser(
description="Command line client for gateway server."
)
parser.add_argument(
"-g", "--gateway", type=str, help="Gateway address.", default="127.0.0.1:12345"
)
parser.add_argument(
"--enable-opentelemetry",
"-t",
action="store_true",
default=False,
help="Enable OpenTelemetry tracing.",
)
args = parser.parse_args()
# Create an asyncio event to keep the loop running until interrupted
stop_event = asyncio.Event()
# Define a shutdown handler to set the event when interrupted
def shutdown():
print("\nShutting down...")
stop_event.set()
# Register the shutdown handler for SIGINT
loop = asyncio.get_running_loop()
loop.add_signal_handler(SIGINT, shutdown)
# Run the client task
client_task = asyncio.create_task(
run_server(args.gateway, args.enable_opentelemetry)
)
# Wait until the stop event is set
await stop_event.wait()
# Cancel the client task
client_task.cancel()
try:
await client_task
except asyncio.CancelledError:
pass
if __name__ == "__main__":
try:
asyncio.run(main())
except KeyboardInterrupt:
print("Program terminated by user.")
PubSub Client
import argparse
import asyncio
import datetime
import signal
import agp_bindings
class color:
PURPLE = "\033[95m"
CYAN = "\033[96m"
DARKCYAN = "\033[36m"
BLUE = "\033[94m"
GREEN = "\033[92m"
YELLOW = "\033[93m"
RED = "\033[91m"
BOLD = "\033[1m"
UNDERLINE = "\033[4m"
END = "\033[0m"
def format_message(message1, message2):
return f"{color.BOLD}{color.CYAN}{message1.capitalize() :<45}{color.END}{message2}"
def split_id(id):
# Split the IDs into their respective components
try:
local_organization, local_namespace, local_agent = id.split("/")
except ValueError as e:
print("Error: IDs must be in the format organization/namespace/agent.")
raise e
return local_organization, local_namespace, local_agent
async def run_client(local_id, remote_id, address, enable_opentelemetry: bool):
# init tracing
agp_bindings.init_tracing(
log_level="info", enable_opentelemetry=enable_opentelemetry
)
# Split the local IDs into their respective components
local_organization, local_namespace, local_agent = split_id(local_id)
# Split the remote IDs into their respective components
remote_organization, remote_namespace, broadcast_topic = split_id(remote_id)
name = f"{local_agent}"
print(f"Creating participant {name}...")
participant = await agp_bindings.Gateway.new(
local_organization, local_namespace, local_agent
)
participant.configure(agp_bindings.GatewayConfig(endpoint=address, insecure=True))
# Connect to gateway server
_ = await participant.connect()
# set route for the chat, so that messages can be sent to the other participants
await participant.set_route(remote_organization, remote_namespace, broadcast_topic)
# Subscribe to the producer topic
await participant.subscribe(remote_organization, remote_namespace, broadcast_topic)
print(f"{name} -> Creating new pubsub sessions...")
# create pubsubb session. A pubsub session is a just a bidirectional
# streaming session, where participants are both sender and receivers
session_info = await participant.create_streaming_session(
agp_bindings.PyStreamingConfiguration(
agp_bindings.PySessionDirection.BIDIRECTIONAL,
topic=agp_bindings.PyAgentType(
remote_organization, remote_namespace, broadcast_topic
),
max_retries=5,
timeout=datetime.timedelta(seconds=5),
)
)
# define the background task
async def background_task():
msg = f"Hello from {local_agent}"
async with participant:
while True:
try:
# receive message from session
recv_session, msg_rcv = await participant.receive(
session=session_info.id
)
# Check if the message is calling this specific participant
# if not, ignore it
if local_agent in msg_rcv.decode():
# print the message
print(f"{name} -> Received message for me: {msg_rcv.decode()}")
# send the message to the next participant
await participant.publish(
recv_session,
msg.encode(),
remote_organization,
remote_namespace,
broadcast_topic,
)
print(f"{name} -> Sending message to all participants: {msg}")
else:
print(
f"{name} -> Receiving message: {msg_rcv.decode()} - not for me."
)
except asyncio.CancelledError:
break
except Exception as e:
print(f"{name} -> Error receiving message: {e}")
break
receive_task = asyncio.create_task(background_task())
async def background_task_keyboard():
while True:
user_input = await asyncio.to_thread(input, "message> ")
if user_input == "exit":
break
# Send the message to the all participants
await participant.publish(
session_info,
f"{user_input}".encode(),
remote_organization,
remote_namespace,
broadcast_topic,
)
receive_task.cancel()
send_task = asyncio.create_task(background_task_keyboard())
# Wait for both tasks to finish
await asyncio.gather(receive_task, send_task)
async def main():
parser = argparse.ArgumentParser(
description="Command line client for message passing."
)
parser.add_argument(
"-l",
"--local",
type=str,
help="Local ID in the format organization/namespace/agent.",
)
parser.add_argument(
"-r",
"--remote",
type=str,
help="Remote ID in the format organization/namespace/agent.",
)
parser.add_argument(
"-g",
"--gateway",
type=str,
help="Gateway address.",
default="http://127.0.0.1:46357",
)
parser.add_argument(
"-t",
"--enable-opentelemetry",
action="store_true",
default=False,
help="Enable OpenTelemetry tracing.",
)
args = parser.parse_args()
# Run the client with the specified local ID, remote ID, and optional message
await run_client(
args.local,
args.remote,
args.gateway,
args.enable_opentelemetry,
)
if __name__ == "__main__":
try:
asyncio.run(main())
except KeyboardInterrupt:
print("Program terminated by user.")
Streaming producer and consumer
import argparse
import asyncio
import datetime
import time
import os
import agp_bindings
from agp_bindings import GatewayConfig, PySessionInfo
class color:
PURPLE = "\033[95m"
CYAN = "\033[96m"
DARKCYAN = "\033[36m"
BLUE = "\033[94m"
GREEN = "\033[92m"
YELLOW = "\033[93m"
RED = "\033[91m"
BOLD = "\033[1m"
UNDERLINE = "\033[4m"
END = "\033[0m"
def format_message(message1, message2):
return f"{color.BOLD}{color.CYAN}{message1.capitalize() :<45}{color.END}{message2}"
async def run_client(
local_id, remote_id, address, producer, enable_opentelemetry: bool
):
# init tracing
agp_bindings.init_tracing(
log_level="info", enable_opentelemetry=enable_opentelemetry
)
# Split the IDs into their respective components
try:
local_organization, local_namespace, local_agent = local_id.split("/")
except ValueError:
print("Error: IDs must be in the format organization/namespace/agent.")
return
# create new gateway object
gateway = await agp_bindings.Gateway.new(
local_organization, local_namespace, local_agent
)
# Configure gateway
config = GatewayConfig(endpoint=address, insecure=True)
gateway.configure(config)
# Connect to the service and subscribe for the local name
print(format_message(f"connecting to:", address))
_ = await gateway.connect()
# Split the IDs into their respective components
try:
remote_organization, remote_namespace, broadcast_topic = remote_id.split("/")
except ValueError:
print("Error: IDs must be in the format organization/namespace/agent.")
return
# Get the local agent instance from env
instance = os.getenv("AGP_INSTANCE_ID", local_agent)
async with gateway:
if producer:
# Create a route to the remote ID
await gateway.set_route(
remote_organization, remote_namespace, broadcast_topic
)
# create streaming session with default config
session_info = await gateway.create_streaming_session(
agp_bindings.PyStreamingConfiguration(
agp_bindings.PySessionDirection.SENDER,
topic=None,
max_retries=5,
timeout=datetime.timedelta(seconds=5),
)
)
# initialize count
count = 0
while True:
try:
# Send a message
print(
format_message(
f"{instance} streaming message to {remote_organization}/{remote_namespace}/{broadcast_topic}: ",
f"{count}",
)
)
# Send the message and wait for a reply
await gateway.publish(
session_info,
f"{count}".encode(),
remote_organization,
remote_namespace,
broadcast_topic,
)
count += 1
except Exception as e:
print("received error: ", e)
finally:
await asyncio.sleep(1)
else:
# subscribe to streaming session
await gateway.subscribe(
remote_organization, remote_namespace, broadcast_topic
)
# Wait for messages and not reply
while True:
session_info, _ = await gateway.receive()
print(
format_message(
f"{instance.capitalize()} received a new session:",
f"{session_info.id}",
)
)
async def background_task():
while True:
# Receive the message from the session
session, msg = await gateway.receive(session=session_info.id)
print(
format_message(
f"{local_agent.capitalize()} received from {remote_organization}/{remote_namespace}/{broadcast_topic}: ",
f"{msg.decode()}",
)
)
asyncio.create_task(background_task())
async def main():
parser = argparse.ArgumentParser(
description="Command line client for message passing."
)
parser.add_argument(
"-l",
"--local",
type=str,
help="Local ID in the format organization/namespace/agent.",
)
parser.add_argument(
"-r",
"--remote",
type=str,
help="Remote ID in the format organization/namespace/agent.",
)
parser.add_argument(
"-g",
"--gateway",
type=str,
help="Gateway address.",
default="http://127.0.0.1:46357",
)
parser.add_argument(
"-t",
"--enable-opentelemetry",
action="store_true",
default=False,
help="Enable OpenTelemetry tracing.",
)
parser.add_argument(
"-p",
"--producer",
action="store_true",
default=False,
help="Enable producer mode.",
)
args = parser.parse_args()
# Run the client with the specified local ID, remote ID, and optional message
await run_client(
args.local,
args.remote,
args.gateway,
args.producer,
args.enable_opentelemetry,
)
if __name__ == "__main__":
try:
asyncio.run(main())
except KeyboardInterrupt:
print("Program terminated by user.")
Fire And Forget sender and receiver
import argparse
import asyncio
import time
import os
import agp_bindings
from agp_bindings import GatewayConfig, PySessionInfo
class color:
PURPLE = "\033[95m"
CYAN = "\033[96m"
DARKCYAN = "\033[36m"
BLUE = "\033[94m"
GREEN = "\033[92m"
YELLOW = "\033[93m"
RED = "\033[91m"
BOLD = "\033[1m"
UNDERLINE = "\033[4m"
END = "\033[0m"
def format_message(message1, message2):
return f"{color.BOLD}{color.CYAN}{message1.capitalize() :<45}{color.END}{message2}"
def split_id(id):
# Split the IDs into their respective components
try:
local_organization, local_namespace, local_agent = id.split("/")
except ValueError as e:
print("Error: IDs must be in the format organization/namespace/agent.")
raise e
return local_organization, local_namespace, local_agent
async def run_client(
local_id: str,
remote_id: str,
message: str,
address: str,
iterations: int,
enable_opentelemetry: bool,
):
# init tracing
agp_bindings.init_tracing(
log_level="info", enable_opentelemetry=enable_opentelemetry
)
local_organization, local_namespace, local_agent = split_id(local_id)
# create new gateway object
gateway = await agp_bindings.Gateway.new(
local_organization, local_namespace, local_agent
)
# Configure gateway
config = GatewayConfig(endpoint=address, insecure=True)
gateway.configure(config)
# Connect to remote gateway server
print(format_message(f"connecting to:", address))
_ = await gateway.connect()
# Get the local agent instance from env
instance = os.getenv("AGP_INSTANCE_ID", local_agent)
async with gateway:
if message:
# Split the IDs into their respective components
remote_organization, remote_namespace, remote_agent = split_id(remote_id)
# Create a route to the remote ID
await gateway.set_route(remote_organization, remote_namespace, remote_agent)
# create a session
session = await gateway.create_ff_session(
agp_bindings.PyFireAndForgetConfiguration()
)
for i in range(0, iterations):
try:
# Send the message
await gateway.publish(
session,
message.encode(),
remote_organization,
remote_namespace,
remote_agent,
)
print(format_message(f"{instance} sent:", message))
# Wait for a reply
session_info, msg = await gateway.receive(session=session.id)
print(
format_message(
f"{instance.capitalize()} received (from session {session_info.id}):",
f"{msg.decode()}",
)
)
except Exception as e:
print("received error: ", e)
await asyncio.sleep(1)
else:
# Wait for a message and reply in a loop
while True:
session_info, _ = await gateway.receive()
print(
format_message(
f"{instance.capitalize()} received a new session:",
f"{session_info.id}",
)
)
async def background_task():
while True:
# Receive the message from the session
session, msg = await gateway.receive(session=session_info.id)
print(
format_message(
f"{instance.capitalize()} received (from session {session.id}):",
f"{msg.decode()}",
)
)
ret = f"{msg.decode()} from {instance}"
await gateway.publish_to(session, ret.encode())
print(format_message(f"{instance.capitalize()} replies:", ret))
asyncio.create_task(background_task())
async def main():
parser = argparse.ArgumentParser(
description="Command line client for message passing."
)
parser.add_argument(
"-l",
"--local",
type=str,
help="Local ID in the format organization/namespace/agent.",
)
parser.add_argument(
"-r",
"--remote",
type=str,
help="Remote ID in the format organization/namespace/agent.",
)
parser.add_argument("-m", "--message", type=str, help="Message to send.")
parser.add_argument(
"-g",
"--gateway",
type=str,
help="Gateway address.",
default="http://127.0.0.1:46357",
)
parser.add_argument(
"-i",
"--iterations",
type=int,
help="Number of messages to send, one per second.",
)
parser.add_argument(
"-t",
"--enable-opentelemetry",
action="store_true",
default=False,
help="Enable OpenTelemetry tracing.",
)
args = parser.parse_args()
# Run the client with the specified local ID, remote ID, and optional message
await run_client(
args.local,
args.remote,
args.message,
args.gateway,
args.iterations,
args.enable_opentelemetry,
)
if __name__ == "__main__":
try:
asyncio.run(main())
except KeyboardInterrupt:
print("Program terminated by user.")
Request/Response Requester and Responder
import argparse
import asyncio
import time
import os
import agp_bindings
from agp_bindings import GatewayConfig, PySessionInfo
class color:
PURPLE = "\033[95m"
CYAN = "\033[96m"
DARKCYAN = "\033[36m"
BLUE = "\033[94m"
GREEN = "\033[92m"
YELLOW = "\033[93m"
RED = "\033[91m"
BOLD = "\033[1m"
UNDERLINE = "\033[4m"
END = "\033[0m"
def format_message(message1, message2):
return f"{color.BOLD}{color.CYAN}{message1.capitalize() :<45}{color.END}{message2}"
def split_id(id):
# Split the IDs into their respective components
try:
local_organization, local_namespace, local_agent = id.split("/")
except ValueError as e:
print("Error: IDs must be in the format organization/namespace/agent.")
raise e
return local_organization, local_namespace, local_agent
async def run_client(local_id, remote_id, message, address, enable_opentelemetry: bool):
# init tracing
agp_bindings.init_tracing(
log_level="info", enable_opentelemetry=enable_opentelemetry
)
# Split the IDs into their respective components
local_organization, local_namespace, local_agent = split_id(local_id)
# create new gateway object
gateway = await agp_bindings.Gateway.new(
local_organization, local_namespace, local_agent
)
# Configure gateway
config = GatewayConfig(endpoint=address, insecure=True)
gateway.configure(config)
# Connect to the service and subscribe for the local name
print(format_message(f"connecting to:", address))
_ = await gateway.connect()
# Get the local agent instance from env
instance = os.getenv("AGP_INSTANCE_ID", local_agent)
async with gateway:
if message:
# Split the IDs into their respective components
remote_organization, remote_namespace, remote_agent = split_id(remote_id)
# Create a route to the remote ID
await gateway.set_route(remote_organization, remote_namespace, remote_agent)
# create a session
session = await gateway.create_rr_session(
agp_bindings.PyRequestResponseConfiguration()
)
try:
# Send the message and wait for a reply
session_info, reply = await gateway.request_reply(
session,
message.encode(),
remote_organization,
remote_namespace,
remote_agent,
)
print(format_message(f"{instance} sent:", message))
# Print reply and exit
print(
format_message(
f"{instance} received (from session {session_info.id}):",
f"{reply.decode()}",
)
)
except Exception as e:
print("received error: ", e)
else:
# Wait for a message and reply in a loop
while True:
session_info, _ = await gateway.receive()
print(
format_message(
f"{instance.capitalize()} received a new session:",
f"{session_info.id}",
)
)
async def background_task():
while True:
# Receive the message from the session
session, msg = await gateway.receive(session=session_info.id)
print(
format_message(
f"{instance.capitalize()} received (from session {session.id}):",
f"{msg.decode()}",
)
)
ret = f"{msg.decode()} from {instance}"
await gateway.publish_to(session, ret.encode())
print(format_message(f"{instance.capitalize()} replies:", ret))
asyncio.create_task(background_task())
async def main():
parser = argparse.ArgumentParser(
description="Command line client for message passing."
)
parser.add_argument(
"-l",
"--local",
type=str,
help="Local ID in the format organization/namespace/agent.",
)
parser.add_argument(
"-r",
"--remote",
type=str,
help="Remote ID in the format organization/namespace/agent.",
)
parser.add_argument("-m", "--message", type=str, help="Message to send.")
parser.add_argument(
"-g",
"--gateway",
type=str,
help="Gateway address.",
default="http://127.0.0.1:46357",
)
parser.add_argument(
"-t",
"--enable-opentelemetry",
action="store_true",
default=False,
help="Enable OpenTelemetry tracing.",
)
args = parser.parse_args()
# Run the client with the specified local ID, remote ID, and optional message
await run_client(
args.local,
args.remote,
args.message,
args.gateway,
args.enable_opentelemetry,
)
if __name__ == "__main__":
try:
asyncio.run(main())
except KeyboardInterrupt:
print("Program terminated by user.")
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file agp_bindings-0.2.0.tar.gz.
File metadata
- Download URL: agp_bindings-0.2.0.tar.gz
- Upload date:
- Size: 166.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dad226ae9574960a7402e57479d62ebe032c0b320c20f634071f29d4d9d0008a
|
|
| MD5 |
930ac5cd34c897a1630f133f258480d6
|
|
| BLAKE2b-256 |
0abe4f7009133c56326914e814068c27db98770551e45fe6acc6f764fc1dd68a
|
File details
Details for the file agp_bindings-0.2.0-cp313-cp313-win_amd64.whl.
File metadata
- Download URL: agp_bindings-0.2.0-cp313-cp313-win_amd64.whl
- Upload date:
- Size: 4.6 MB
- Tags: CPython 3.13, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d3091ff534d6b875585f34a5ac8300562ef3a1469914272df878a3ab37f2a7c7
|
|
| MD5 |
6c86eeecf08a20f71379424ecc28cecc
|
|
| BLAKE2b-256 |
b6d0ade257e1ee702fbec355fe2432720bcfd001d2cbcbb87d4e6b047fc606ce
|
File details
Details for the file agp_bindings-0.2.0-cp313-cp313-manylinux_2_38_x86_64.whl.
File metadata
- Download URL: agp_bindings-0.2.0-cp313-cp313-manylinux_2_38_x86_64.whl
- Upload date:
- Size: 5.9 MB
- Tags: CPython 3.13, manylinux: glibc 2.38+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
57fe58744f605245a674d11104da31ec755c29b45e5698fadadba77a1a8a8ac0
|
|
| MD5 |
74e63d0ca09889b5fe96c966009caef4
|
|
| BLAKE2b-256 |
1e00cac8d5434a46c72555afb32f799ae25bd9289b4c06e933d94b074c24cb6e
|
File details
Details for the file agp_bindings-0.2.0-cp313-cp313-macosx_11_0_arm64.whl.
File metadata
- Download URL: agp_bindings-0.2.0-cp313-cp313-macosx_11_0_arm64.whl
- Upload date:
- Size: 5.2 MB
- Tags: CPython 3.13, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
77a8f755fbcfe88bb4873fda5f0d9654eb49e0bf2a502ac4bb3a91d468aa8699
|
|
| MD5 |
696ff1026e4cae4932017e67f2359549
|
|
| BLAKE2b-256 |
26cbaacda7a25b14c5b896799124b3bd7adaaedea45efa0aff9f7acf699c536e
|
File details
Details for the file agp_bindings-0.2.0-cp313-cp313-macosx_10_12_x86_64.whl.
File metadata
- Download URL: agp_bindings-0.2.0-cp313-cp313-macosx_10_12_x86_64.whl
- Upload date:
- Size: 5.4 MB
- Tags: CPython 3.13, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b28ddb4281abcd75960006447c3883ccfa14e59fb6fe1713d245ec80175b36eb
|
|
| MD5 |
d24d1fc633aa4706f98bd2b6458e10a1
|
|
| BLAKE2b-256 |
b9ddcbd425bbf76bd338a97a545de26cf5f1a59f2c2a6aec44d1deb3069e4142
|
File details
Details for the file agp_bindings-0.2.0-cp312-cp312-win_amd64.whl.
File metadata
- Download URL: agp_bindings-0.2.0-cp312-cp312-win_amd64.whl
- Upload date:
- Size: 4.6 MB
- Tags: CPython 3.12, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3027cb33b23ba664371e4e8d2b60138802f0da78a56f4034ef747d02ec98c440
|
|
| MD5 |
58587f20a77af6d9f099ba7eee35448a
|
|
| BLAKE2b-256 |
bfaa408d97b4ce9e9cbaf97cede6857393f5e0be8ea22a2d48bcdc3f556105ed
|
File details
Details for the file agp_bindings-0.2.0-cp312-cp312-manylinux_2_38_x86_64.whl.
File metadata
- Download URL: agp_bindings-0.2.0-cp312-cp312-manylinux_2_38_x86_64.whl
- Upload date:
- Size: 5.9 MB
- Tags: CPython 3.12, manylinux: glibc 2.38+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9076ccbdda0ff6c259c642d9aa8ab629a00493aa890d0ddb089ed7f5ab9f1280
|
|
| MD5 |
ec8a382cc89bd4688f29b8dd032209e1
|
|
| BLAKE2b-256 |
b7a0d76b20309314c4307f662ab188733c9985057619c45f716f6ee33aa7fb37
|
File details
Details for the file agp_bindings-0.2.0-cp312-cp312-macosx_11_0_arm64.whl.
File metadata
- Download URL: agp_bindings-0.2.0-cp312-cp312-macosx_11_0_arm64.whl
- Upload date:
- Size: 5.2 MB
- Tags: CPython 3.12, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
23c27c900a2672ae53dc8a8d223894277cc7b71cabad6310c9afe07862a2591f
|
|
| MD5 |
0d09193c9d6737f95bbe199ba02a0214
|
|
| BLAKE2b-256 |
7496f1a46048040ad58b1dd289968b36c398221d12160dae3f158672ecb1fa25
|
File details
Details for the file agp_bindings-0.2.0-cp312-cp312-macosx_10_12_x86_64.whl.
File metadata
- Download URL: agp_bindings-0.2.0-cp312-cp312-macosx_10_12_x86_64.whl
- Upload date:
- Size: 5.4 MB
- Tags: CPython 3.12, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e4dec180f7a7d6b8d0eed31ff33bf54605c39238e22c0edd25558b73e2382575
|
|
| MD5 |
1156915f7112a2086dbbfe3f90b49ed9
|
|
| BLAKE2b-256 |
ed9d7426e9c13871badb0a5772f5846444b7b7f75365f3e0047e80c1f737a35b
|
File details
Details for the file agp_bindings-0.2.0-cp311-cp311-win_amd64.whl.
File metadata
- Download URL: agp_bindings-0.2.0-cp311-cp311-win_amd64.whl
- Upload date:
- Size: 4.6 MB
- Tags: CPython 3.11, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d09be97225544ceb9c3bc09d0c337a10ecba5346d175b2fa4be10f98c4016f82
|
|
| MD5 |
5b10491cda1d91c0f9dcb6c421ba1399
|
|
| BLAKE2b-256 |
8be33844ad798ed1bcc067e3ebf7f0b20173a53e9ce60049acd4d3f99b270f4e
|
File details
Details for the file agp_bindings-0.2.0-cp311-cp311-manylinux_2_38_x86_64.whl.
File metadata
- Download URL: agp_bindings-0.2.0-cp311-cp311-manylinux_2_38_x86_64.whl
- Upload date:
- Size: 5.9 MB
- Tags: CPython 3.11, manylinux: glibc 2.38+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3bf8a6ae98c943c8c9801d4136c72160dfc022ceecbde8eff6cfbca0e8316618
|
|
| MD5 |
5b0749e2747f939da27b4bec41721a50
|
|
| BLAKE2b-256 |
eb5c1ff8f0f953492095848646b7b3e9f54435e654df5e4d4bfc42b81e98d24f
|
File details
Details for the file agp_bindings-0.2.0-cp311-cp311-macosx_11_0_arm64.whl.
File metadata
- Download URL: agp_bindings-0.2.0-cp311-cp311-macosx_11_0_arm64.whl
- Upload date:
- Size: 5.2 MB
- Tags: CPython 3.11, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e5345f3a8bcaaf75282d06711165724c1bc7e0acda18349367c123a502597ccd
|
|
| MD5 |
3c768c3b81d13ce3de383e38bfc9299a
|
|
| BLAKE2b-256 |
01d9a789cfba3dcbab67979f812128c0100f5e8fd34317524d79a7945f9df2e0
|
File details
Details for the file agp_bindings-0.2.0-cp311-cp311-macosx_10_12_x86_64.whl.
File metadata
- Download URL: agp_bindings-0.2.0-cp311-cp311-macosx_10_12_x86_64.whl
- Upload date:
- Size: 5.4 MB
- Tags: CPython 3.11, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
221db908d11cc2df0d1cdc38f9cbcfcfb77c28bc386bbbd3c7797ef2b336feb9
|
|
| MD5 |
39a73701103be015a1c8a00cd541f8e3
|
|
| BLAKE2b-256 |
e595eeada670c6064a5fac8f4a55c0c3322409a45c15b3825199c52d4f498d0a
|
File details
Details for the file agp_bindings-0.2.0-cp310-cp310-win_amd64.whl.
File metadata
- Download URL: agp_bindings-0.2.0-cp310-cp310-win_amd64.whl
- Upload date:
- Size: 4.6 MB
- Tags: CPython 3.10, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c54860d7d57e46216505b05988172587ab56c05bf3c89d8769128c97203b4d1a
|
|
| MD5 |
8656f19dd6537f746ab528aef7d2341d
|
|
| BLAKE2b-256 |
b44b0badaa85a1c72bb8ef110679e7314403d4cb78111c2865d8f8f8bc3fa306
|
File details
Details for the file agp_bindings-0.2.0-cp310-cp310-manylinux_2_38_x86_64.whl.
File metadata
- Download URL: agp_bindings-0.2.0-cp310-cp310-manylinux_2_38_x86_64.whl
- Upload date:
- Size: 5.9 MB
- Tags: CPython 3.10, manylinux: glibc 2.38+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
90a44e61d6444f504cd56870e6a2d7ce3382e7f147a62011286737888ce63017
|
|
| MD5 |
84068244004922d22e20b13a13766ffe
|
|
| BLAKE2b-256 |
6d65d08a8da3ac1d21d338e254395b03b898e22181234fdd4f0db6cffdfc87e5
|
File details
Details for the file agp_bindings-0.2.0-cp310-cp310-macosx_11_0_arm64.whl.
File metadata
- Download URL: agp_bindings-0.2.0-cp310-cp310-macosx_11_0_arm64.whl
- Upload date:
- Size: 5.2 MB
- Tags: CPython 3.10, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2c8033ad641ba0c87be5c566c1476ec79dcab84e06249fe872f34589a73f5098
|
|
| MD5 |
1c0eb36d766eb18a07647f0d258aec93
|
|
| BLAKE2b-256 |
21a8a7b6c09520f78d12e7e065180a3286c97af759da513288bfdf5ea17717f9
|
File details
Details for the file agp_bindings-0.2.0-cp310-cp310-macosx_10_12_x86_64.whl.
File metadata
- Download URL: agp_bindings-0.2.0-cp310-cp310-macosx_10_12_x86_64.whl
- Upload date:
- Size: 5.4 MB
- Tags: CPython 3.10, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2a75311a1f37370ad9b7bcb133ebfd1d839bc6d7cb49bd1f3a4fa608ccf5b2bc
|
|
| MD5 |
331defc1ef16fd0f39e4f600ee398df3
|
|
| BLAKE2b-256 |
5bac5c2da59118415eb5d19afc211a29c241b36069810e3d3073626e4ab2082a
|
File details
Details for the file agp_bindings-0.2.0-cp39-cp39-win_amd64.whl.
File metadata
- Download URL: agp_bindings-0.2.0-cp39-cp39-win_amd64.whl
- Upload date:
- Size: 4.6 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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f1c17f1e0c56313a19926b00090c390aaaca9c5c51d51604cb532c4a2cee133d
|
|
| MD5 |
f355f2100059d6c4b802609b0419f909
|
|
| BLAKE2b-256 |
eab4760cbadb35c0f74e7345401ce4ae1e1581c5c0387a7adbb96b4bf3f41507
|
File details
Details for the file agp_bindings-0.2.0-cp39-cp39-manylinux_2_38_x86_64.whl.
File metadata
- Download URL: agp_bindings-0.2.0-cp39-cp39-manylinux_2_38_x86_64.whl
- Upload date:
- Size: 5.9 MB
- Tags: CPython 3.9, manylinux: glibc 2.38+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
52f931e65cc63e6e1c50adad12f626edbd053a7f466345b8180b5f4a3c119111
|
|
| MD5 |
ee7546244e8031fae8216b54a3ac21a3
|
|
| BLAKE2b-256 |
e15182b86b4af291ea1d51da1bce6941608e30a73e109fee05848614875bddd5
|
File details
Details for the file agp_bindings-0.2.0-cp39-cp39-macosx_11_0_arm64.whl.
File metadata
- Download URL: agp_bindings-0.2.0-cp39-cp39-macosx_11_0_arm64.whl
- Upload date:
- Size: 5.2 MB
- Tags: CPython 3.9, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6d5ce3be33b658cb8676f6ba7e787072e877410fac6583284449982205bb133f
|
|
| MD5 |
668d57ff84982a60840fe2d954f09326
|
|
| BLAKE2b-256 |
f5843e41181f5245325e2ebd85ae95fd4850dd4b8fd2ad62b92bcb97b56f8939
|
File details
Details for the file agp_bindings-0.2.0-cp39-cp39-macosx_10_12_x86_64.whl.
File metadata
- Download URL: agp_bindings-0.2.0-cp39-cp39-macosx_10_12_x86_64.whl
- Upload date:
- Size: 5.4 MB
- Tags: CPython 3.9, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7ff4ec4cdd484268955aca7449535433c7a2d9df20c1b4f05b7aa162833cf4b3
|
|
| MD5 |
4c4ed5acdaedd50860a6370a4f0e20b1
|
|
| BLAKE2b-256 |
89fb9da46f6998d650fe1a9a41ea143b5bffac9783ebe7fbe5b1ff381f980bc7
|