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.")
Metadata
Release files for agp-bindings 0.3.5
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| agp_bindings-0.3.5.tar.gz | 197.6 kB | Details |
Built distributions (wheels)
Total release size: 145.3 MB
Release files / agp_bindings-0.3.5.tar.gz
| Download URL | agp_bindings-0.3.5.tar.gz |
|---|---|
| Size | 197.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
1804f4f1bfc2709598b4961bc3a65994117a40cf5f3f70e21f460d6babc75786
|
|
BLAKE2b-256 checksum How to use checksums |
45c08bc6da495632b1c4e1f52a17616dce17cce862aec0788a2c71f5ef0f3745
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.12.9
|
Release files / agp_bindings-0.3.5-cp313-cp313-win_amd64.whl
| Download URL | agp_bindings-0.3.5-cp313-cp313-win_amd64.whl |
|---|---|
| Size | 5.0 MB |
| Tags | CPython 3.13 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
39ef4ecdcafb70ec8bc1c5107ea3fcbc6f8b1fbf3dc1764be68ed7bcd5575512
|
|
BLAKE2b-256 checksum How to use checksums |
ef89a28a54c3834a94a20442658f8fa1a2af1d126d01b7f1c60e7c8cd0550be2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.12.9
|
Release files / agp_bindings-0.3.5-cp313-cp313-manylinux_2_34_x86_64.whl
| Download URL | agp_bindings-0.3.5-cp313-cp313-manylinux_2_34_x86_64.whl |
|---|---|
| Size | 6.4 MB |
| Tags | CPython 3.13 Linux glibc 2.34+ x86-64 |
|
SHA-256 checksum How to use checksums |
8b1fc112af12fe8de2eac0485a2e0b4cd4a7b32546fe83e25211b1d809e0d6b4
|
|
BLAKE2b-256 checksum How to use checksums |
c5a3714f2cc000112ccae9c5e0ca895a6d405ec7c261d9df31ee52400417dff2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.12.9
|
Release files / agp_bindings-0.3.5-cp313-cp313-manylinux_2_34_aarch64.whl
| Download URL | agp_bindings-0.3.5-cp313-cp313-manylinux_2_34_aarch64.whl |
|---|---|
| Size | 6.2 MB |
| Tags | CPython 3.13 Linux glibc 2.34+ ARM64 |
|
SHA-256 checksum How to use checksums |
52151ed14efe020977865881a40f6c2ec9bf3e07b14edb2b67560e1540fbf985
|
|
BLAKE2b-256 checksum How to use checksums |
ebf0c548c9ba9faa74a1d5de531bb9063a4785b2ae7e877a2587435cd277e5a6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.12.9
|
Release files / agp_bindings-0.3.5-cp313-cp313-macosx_11_0_arm64.whl
| Download URL | agp_bindings-0.3.5-cp313-cp313-macosx_11_0_arm64.whl |
|---|---|
| Size | 5.6 MB |
| Tags | CPython 3.13 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
8ac5f55f5cece61722a8ab6b6aee7d12d3b6c528587fd9ccd24a13a521d87aab
|
|
BLAKE2b-256 checksum How to use checksums |
8a6a8c61d859e93860eb26683800a39a197f7d75a9dbaef57115d0f10c60d9b9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.12.9
|
Release files / agp_bindings-0.3.5-cp313-cp313-macosx_10_12_x86_64.whl
| Download URL | agp_bindings-0.3.5-cp313-cp313-macosx_10_12_x86_64.whl |
|---|---|
| Size | 5.9 MB |
| Tags | CPython 3.13 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
7098233d61a875c0cbf5b73a556bf85311d6dfc501749ce158ba8233a0f2efb3
|
|
BLAKE2b-256 checksum How to use checksums |
6b8abdc3df4ef7bb94c8a3a8d448a9251fb29f1754de9a51582c0d64d33bcb8f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.12.9
|
Release files / agp_bindings-0.3.5-cp312-cp312-win_amd64.whl
| Download URL | agp_bindings-0.3.5-cp312-cp312-win_amd64.whl |
|---|---|
| Size | 5.0 MB |
| Tags | CPython 3.12 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
d1d525ab828593293903861bd847451fe9153a6a0cd585e9f5ff2fbd96cca584
|
|
BLAKE2b-256 checksum How to use checksums |
339e6d1aaaba7a8cea942f55f89611a755beff18734d61ba76fb2e80a90dba8f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.12.9
|
Release files / agp_bindings-0.3.5-cp312-cp312-manylinux_2_34_x86_64.whl
| Download URL | agp_bindings-0.3.5-cp312-cp312-manylinux_2_34_x86_64.whl |
|---|---|
| Size | 6.4 MB |
| Tags | CPython 3.12 Linux glibc 2.34+ x86-64 |
|
SHA-256 checksum How to use checksums |
eddcf52abf3f64d802932549537a8765d00c0d24c47ad5325f68ce13a4f0cbd2
|
|
BLAKE2b-256 checksum How to use checksums |
f49b3da46fa37a17e308a4afc5b18fa31edf3bd1520bc64bdf80142b2fa52296
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.12.9
|
Release files / agp_bindings-0.3.5-cp312-cp312-manylinux_2_34_aarch64.whl
| Download URL | agp_bindings-0.3.5-cp312-cp312-manylinux_2_34_aarch64.whl |
|---|---|
| Size | 6.2 MB |
| Tags | CPython 3.12 Linux glibc 2.34+ ARM64 |
|
SHA-256 checksum How to use checksums |
5e5476ca93d6a81998c3359088397fe4af696d1a999aa991c41cb350c0e791d4
|
|
BLAKE2b-256 checksum How to use checksums |
5b2eafe22f7b83e8c71a0c2eed429dedfe604a1a82c1254de3316165d11bfd2c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.12.9
|
Release files / agp_bindings-0.3.5-cp312-cp312-macosx_11_0_arm64.whl
| Download URL | agp_bindings-0.3.5-cp312-cp312-macosx_11_0_arm64.whl |
|---|---|
| Size | 5.6 MB |
| Tags | CPython 3.12 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
da596d4d31153a295de8e86385b2af65151c579aac6bd5e7d71c8f51188ffe0d
|
|
BLAKE2b-256 checksum How to use checksums |
cc34c92c85163d0ed6afcc9e2299697a7cfaa895a3fc843707b746fbf01cbdfe
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.12.9
|
Release files / agp_bindings-0.3.5-cp312-cp312-macosx_10_12_x86_64.whl
| Download URL | agp_bindings-0.3.5-cp312-cp312-macosx_10_12_x86_64.whl |
|---|---|
| Size | 5.9 MB |
| Tags | CPython 3.12 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
86745d2d61a71eb0455893264db77b6041ad5153e2e81badd5750cd249b938dd
|
|
BLAKE2b-256 checksum How to use checksums |
bcef59bda8e0d416c0b55009ba7f3efe31b5399ff7ea65cbb8aeb9b366f1fc35
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.12.9
|
Release files / agp_bindings-0.3.5-cp311-cp311-win_amd64.whl
| Download URL | agp_bindings-0.3.5-cp311-cp311-win_amd64.whl |
|---|---|
| Size | 5.0 MB |
| Tags | CPython 3.11 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
e9ea79ee071743e0f81e3726fbadc93619dca75c01a74a1c03f36a30d18d6d82
|
|
BLAKE2b-256 checksum How to use checksums |
f745dd7fa0f96557d62b9ecc855f72a5b6f1019a7330343f6c37c540ae4922c3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.12.9
|
Release files / agp_bindings-0.3.5-cp311-cp311-manylinux_2_34_x86_64.whl
| Download URL | agp_bindings-0.3.5-cp311-cp311-manylinux_2_34_x86_64.whl |
|---|---|
| Size | 6.4 MB |
| Tags | CPython 3.11 Linux glibc 2.34+ x86-64 |
|
SHA-256 checksum How to use checksums |
f9ae9f6464f5f2f563e7a73a7827f7b3300105751f797e7aed034f53d6604f24
|
|
BLAKE2b-256 checksum How to use checksums |
63381234e4c82f1318769aecfadcb8411378c0ba7ebc7685a9fb7394aab26842
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.12.9
|
Release files / agp_bindings-0.3.5-cp311-cp311-manylinux_2_34_aarch64.whl
| Download URL | agp_bindings-0.3.5-cp311-cp311-manylinux_2_34_aarch64.whl |
|---|---|
| Size | 6.2 MB |
| Tags | CPython 3.11 Linux glibc 2.34+ ARM64 |
|
SHA-256 checksum How to use checksums |
87b6058fdfea79ee4bda278c9d2dec396e3e4eb33bd2a8f3a925fd769d02a99d
|
|
BLAKE2b-256 checksum How to use checksums |
24e47655934a97ad6896d4a30685965329886f88f855010c02f37866a338fb3f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.12.9
|
Release files / agp_bindings-0.3.5-cp311-cp311-macosx_11_0_arm64.whl
| Download URL | agp_bindings-0.3.5-cp311-cp311-macosx_11_0_arm64.whl |
|---|---|
| Size | 5.7 MB |
| Tags | CPython 3.11 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
5b91cec0feaaa15b09b683c0021e6135ae24d2503ee89ef97aed8ca5683f9cf5
|
|
BLAKE2b-256 checksum How to use checksums |
aade9a2d810c33cb917a63bdc8a7d99c01c2be5471188a5da07a6b6c8191ce5c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.12.9
|
Release files / agp_bindings-0.3.5-cp311-cp311-macosx_10_12_x86_64.whl
| Download URL | agp_bindings-0.3.5-cp311-cp311-macosx_10_12_x86_64.whl |
|---|---|
| Size | 5.9 MB |
| Tags | CPython 3.11 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
404a560d41612c914cd73450068f912b1e958206fbee847f6102e8544d680329
|
|
BLAKE2b-256 checksum How to use checksums |
7baa47f65f28f6be06855605bf784141e2e26b56acf101244a5431bff9e1ec9c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.12.9
|
Release files / agp_bindings-0.3.5-cp310-cp310-win_amd64.whl
| Download URL | agp_bindings-0.3.5-cp310-cp310-win_amd64.whl |
|---|---|
| Size | 5.0 MB |
| Tags | CPython 3.10 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
7900c43db7dd75a5717b324f1904a400544fd30ca81f9f1938c3a7f7c410d2b0
|
|
BLAKE2b-256 checksum How to use checksums |
cf4eb09b5fb3bee7e8093e2b6f9fb975e8144f27ee12caa60b1444e11cd6c78f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.12.9
|
Release files / agp_bindings-0.3.5-cp310-cp310-manylinux_2_34_x86_64.whl
| Download URL | agp_bindings-0.3.5-cp310-cp310-manylinux_2_34_x86_64.whl |
|---|---|
| Size | 6.4 MB |
| Tags | CPython 3.10 Linux glibc 2.34+ x86-64 |
|
SHA-256 checksum How to use checksums |
3245fb583f83230e6067ec34273cf2ec81a2d045b2311d36ab48c961b3710266
|
|
BLAKE2b-256 checksum How to use checksums |
2a21c2a6529a9b8e7b07902df943f3c3b37e7a89fb31eb211bcc688f25533c29
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.12.9
|
Release files / agp_bindings-0.3.5-cp310-cp310-manylinux_2_34_aarch64.whl
| Download URL | agp_bindings-0.3.5-cp310-cp310-manylinux_2_34_aarch64.whl |
|---|---|
| Size | 6.2 MB |
| Tags | CPython 3.10 Linux glibc 2.34+ ARM64 |
|
SHA-256 checksum How to use checksums |
23fc56b0fef9f16fbf8523ecf0928b95a0af6962229a0c7b75f3774608235a9d
|
|
BLAKE2b-256 checksum How to use checksums |
6a6378377d14fc24772d698fb4e323a9aa06dbefee84451a21404a52c17f36ee
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.12.9
|
Release files / agp_bindings-0.3.5-cp310-cp310-macosx_11_0_arm64.whl
| Download URL | agp_bindings-0.3.5-cp310-cp310-macosx_11_0_arm64.whl |
|---|---|
| Size | 5.7 MB |
| Tags | CPython 3.10 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
e9e5df8aaa1d3b7cf5ba1b579cff2cabf377b366b88b90b337af19405a928cb7
|
|
BLAKE2b-256 checksum How to use checksums |
7ffdc944ef5bd75a1dfec64bd416c6e580d0b7b8f44a0c601a6ef88ce31dafaf
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.12.9
|
Release files / agp_bindings-0.3.5-cp310-cp310-macosx_10_12_x86_64.whl
| Download URL | agp_bindings-0.3.5-cp310-cp310-macosx_10_12_x86_64.whl |
|---|---|
| Size | 5.9 MB |
| Tags | CPython 3.10 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
7688b9f85492f02955a25ab55374fd5bd920d5d3c9ac5e38f85efb0e2335f012
|
|
BLAKE2b-256 checksum How to use checksums |
d26f43167f0f1fc9702f428b3a0acdcd470f4f9830bd618c899ac290cd2744cb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.12.9
|
Release files / agp_bindings-0.3.5-cp39-cp39-win_amd64.whl
| Download URL | agp_bindings-0.3.5-cp39-cp39-win_amd64.whl |
|---|---|
| Size | 5.0 MB |
| Tags | CPython 3.9 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
9be5d27f19845870313d8fb7eed023ca715c45332467875b41bd9f0c6b444b38
|
|
BLAKE2b-256 checksum How to use checksums |
f5780b512e10a636685ac5e05d0a0556fd483c8d628d019bbe96ce6e02ed5680
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.12.9
|
Release files / agp_bindings-0.3.5-cp39-cp39-manylinux_2_34_x86_64.whl
| Download URL | agp_bindings-0.3.5-cp39-cp39-manylinux_2_34_x86_64.whl |
|---|---|
| Size | 6.4 MB |
| Tags | CPython 3.9 Linux glibc 2.34+ x86-64 |
|
SHA-256 checksum How to use checksums |
5be7b7753a020c0db7b987648b57c650ac3a212822c11d8140f134d4cd1b2841
|
|
BLAKE2b-256 checksum How to use checksums |
80ca02a1ba7e34b42387e6a118a2c386678706a786bbfad3a4a9f8914ca738ed
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.12.9
|
Release files / agp_bindings-0.3.5-cp39-cp39-manylinux_2_34_aarch64.whl
| Download URL | agp_bindings-0.3.5-cp39-cp39-manylinux_2_34_aarch64.whl |
|---|---|
| Size | 6.2 MB |
| Tags | CPython 3.9 Linux glibc 2.34+ ARM64 |
|
SHA-256 checksum How to use checksums |
6fd4c9da9cfb434651f883dfac4a459872e1e8465910b96f1eaf36dba3279c48
|
|
BLAKE2b-256 checksum How to use checksums |
8a7e6298f35f7639e092eeebc11f9bb62c7b70ef223d9375baeea2ffaffecb5b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.12.9
|
Release files / agp_bindings-0.3.5-cp39-cp39-macosx_11_0_arm64.whl
| Download URL | agp_bindings-0.3.5-cp39-cp39-macosx_11_0_arm64.whl |
|---|---|
| Size | 5.7 MB |
| Tags | CPython 3.9 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
56dcf8a76df1258b1c671eba2bc5992450ef65efa3246971d79d126a1eb47480
|
|
BLAKE2b-256 checksum How to use checksums |
85e17b2f61a7e85ff25066d02cfdab2d6976eee129f602f3fe6b9ad7c692981c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.12.9
|
Release files / agp_bindings-0.3.5-cp39-cp39-macosx_10_12_x86_64.whl
| Download URL | agp_bindings-0.3.5-cp39-cp39-macosx_10_12_x86_64.whl |
|---|---|
| Size | 5.9 MB |
| Tags | CPython 3.9 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
515f199a7298719e9329dfb1670a7e58bced245ebd21fa7d183ab65335ba1a0c
|
|
BLAKE2b-256 checksum How to use checksums |
ebf7c6ba49e72bffd938ed9ebd14277b23494b8ec28e631f2902e4968e8b93be
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.12.9
|