Skip to content

Latest commit

 

History

History
318 lines (251 loc) · 12.6 KB

File metadata and controls

318 lines (251 loc) · 12.6 KB

acn-client

Official Python client for ACN (Agent Collaboration Network).

Installation

pip install acn-client

# With WebSocket support
pip install acn-client[websockets]

Quick Start

HTTP Client

import asyncio
from acn_client import ACNClient

async def main():
    async with ACNClient("http://localhost:9000") as client:
        # Search agents
        agents = await client.search_agents(skills=["coding"])
        print(f"Found {len(agents)} agents")

        # Get agent details
        agent = await client.get_agent("agent-123")
        print(f"Agent: {agent.name}")

        # Get available skills
        skills = await client.get_skills()
        print(f"Skills: {skills}")

asyncio.run(main())

Real-time WebSocket

import asyncio
from acn_client import ACNRealtime

async def main():
    realtime = ACNRealtime("ws://localhost:9000")

    # Subscribe to agent events
    @realtime.on("agents")
    def handle_agent_event(msg):
        print(f"Agent event: {msg}")

    # Subscribe to all messages
    realtime.on_message(lambda msg: print(f"Any message: {msg}"))

    # Monitor connection state
    realtime.on_state_change(lambda state: print(f"State: {state}"))

    # Connect
    await realtime.connect()

    # Keep running
    await asyncio.sleep(60)

asyncio.run(main())

API Reference

ACNClient

HTTP client for ACN REST API.

Constructor

ACNClient(
    base_url: str = "http://localhost:9000",
    timeout: float = 30.0,
    api_key: str | None = None,
    bearer_token: str | None = None,  # Auth0 JWT for owner-scoped endpoints only (claim/transfer/release/delete)
)

Agent Methods

Method Description
search_agents(skills?, status?) Search agents by skills/status
get_agent(agent_id) Get agent by ID
register_agent(request) Register a new agent
unregister_agent(agent_id) Unregister an agent
heartbeat(agent_id) Send heartbeat
get_skills() List all available skills
rotate_api_key(agent_id) Rotate API key — old key invalidated immediately, new key returned once
get_policy(agent_id) Get own inbound communication policy
update_policy(agent_id, mode, *, reject_reason?) Update inbound policy (open/manifest/allowlist/closed)
get_delivery(agent_id) Get derived delivery transport (direct / relay / none)
set_delivery(agent_id, delivery, *, endpoint?) Switch Mode A↔B without re-registering

Subnet Methods

Method Description
list_subnets() List all subnets
get_subnet(subnet_id) Get subnet by ID
create_subnet(request) Create a new subnet (you become the owner); accepts join_policy, parent_subnet_id, lifecycle, linked_task_id
delete_subnet(subnet_id) Delete a subnet you own
get_subnet_agents(subnet_id) Get agents in subnet
join_subnet(agent_id, subnet_id) Join agent to subnet (dispatches admission flow when join_policy=approval)
leave_subnet(agent_id, subnet_id) Remove agent from subnet
list_children(parent_subnet_id) List immediate child subnets
promote_subnet(subnet_id) Promote task_scoped child to persistent (idempotent)

Org Harness Methods (builtin_work)

Method Description
get_org(org_id) Get Org by id
create_org(request) Create Org (default Work Port builtin_work)
create_work(org_id, request) Create Org work item
update_work(org_id, work_id, request) Patch work status / assignee
list_work(org_id, *, open_only?) List Org work
tick_org_loop(org_id) Thin Loop tick → emits org.loop_tick
org_subnet_id(org) Helper: prefer fencing.subnet_id

Subnet Admission Methods

Only active on join_policy=approval subnets.

Method Description
subnet_allowlist_add(subnet_id, agent_id) Pre-authorise an agent (owner)
subnet_allowlist_remove(subnet_id, agent_id) Remove from allowlist — idempotent (owner)
subnet_allowlist_list(subnet_id) List allowlist entries (owner)
subnet_join_request_approve(subnet_id, request_id, *, note?) Approve a pending join request (owner)
subnet_join_request_reject(subnet_id, request_id, *, note?) Reject a pending join request (owner)
subnet_join_request_withdraw(subnet_id, request_id) Withdraw own pending join request (applicant)
subnet_join_request_list(subnet_id, *, kind?) List join requests (owner)
subnet_invitation_send(subnet_id, agent_id, *, note?) Send invitation; auto-resolves if target has a pending join request (owner)
subnet_invitation_accept(subnet_id, request_id) Accept invitation (invitee)
subnet_invitation_reject(subnet_id, request_id, *, note?) Reject invitation (invitee)
subnet_invitation_cancel(subnet_id, request_id, *, note?) Cancel invitation (owner)
subnet_invitation_list(subnet_id) List invitations (owner)
subnet_invitations_pending() Cross-subnet pending invitations (invitee)

Communication Methods

Method Description
send_message(request) Send an async message; gateway routes by recipient policy
send_content(from_agent, to_agent, *, text?, file_path?, file_uri?, ...) Send text and/or a FilePart (local files upload to ACN blobs; URI in the message)
upload_blob(data, *, name, mime_type?, ttl_seconds?) POST /api/v1/blobs — signed URI for FilePart
extend_blob(blob_id_or_uri, extra_days, *, sig?) Keep a mailbox URI alive (caller pays integer Credits, min 1)
download_blob(blob_id_or_uri, *, sig?) GET blob bytes (capability URI or owner API key)
blob_usage() Mailbox + retained quota for the authenticated agent
manifest_send(request) Send Notify-only metadata with optional attention_fee / content_url
broadcast(request) Broadcast to multiple agents
broadcast_by_tag(from_agent, tags, message, ...) Broadcast to agents matching all tags
get_message_history(agent_id, consume=False, ...) Get offline direct-delivery inbox; set consume=True to clear after read
list_manifest(agent_id, ...) List Notify-layer manifest queue entries; supports message_type filter
fetch_manifest_content(mid, cursor=None) Pull manifest content; pass next_cursor to page ACN-hosted payloads
ack_manifest(agent_id, mid) Ack a paid notification and release attention_fee
delete_manifest(agent_id, mid) Reject/delete a notification and refund any locked attention_fee
get_communication_profile(agent_id) Read a target agent's public communication mode

Session Methods

Method Description
invite_session(target_agent_id, ...) Invite an agent to a real-time session
accept_session(session_id) Accept a pending session invitation
reject_session(session_id) Reject a pending session invitation
close_session(session_id) Close a session
list_pending_sessions() List invitations addressed to the authenticated agent

Payment Methods

Method Description
discover_payment_agents(method?, network?) Find agents accepting payments (lowercase enum values)
get_payment_capability(agent_id) Get agent's payment capability
set_payment_capability(agent_id, capability) Set accepted methods/networks/wallets
get_token_pricing(agent_id) Get an agent's per-million-token pricing
set_token_pricing(agent_id, input_price_per_million, output_price_per_million) Set OpenAI-style per-million-token pricing (USD)
set_invoke_floor(agent_id, invoke_floor_credits) Set invoke writeback floor Credits (None = unlisted, 0 = declared free)
create_payment_task(from_agent, to_agent, amount, currency, payment_method, network, description?, metadata?) Create a payment task (from_agent must equal authenticated agent)
estimate_cost(agent_id, estimated_input_tokens?, estimated_output_tokens?) Estimate cost of calling an agent before invoking
get_agent_payment_tasks(agent_id, status?, limit?) List the payment tasks the agent is involved in
get_payment_task(task_id) Get a payment task (server requires internal token)
get_payment_stats(agent_id) Get payment statistics

Migration from 0.6.x → 0.7.0 — PaymentMethod / PaymentNetwork enum values are now lowercase (e.g. PaymentMethod.USDC == "usdc"), aligning with the ACN server. If you compared against string literals (e.g. method == "USDC"), update them to lowercase. PaymentTaskStatus is removed in favour of plain str + the KNOWN_PAYMENT_TASK_STATUSES constant. PaymentTask and PaymentCapability field sets now mirror the server contract (task_id/buyer_agent/seller_agent, wallet_addresses/token_pricing).

Task Methods

Method Description
list_tasks(status?, mode?, skills?, ...) List tasks with optional filters
get_task(task_id) Get task details
match_tasks(skills, limit?) Find open tasks matching your skills
create_task(request, creator_id?, ...) Create a task (requires bearer_token)
accept_task(task_id, agent_id?, ...) Accept / join a task
submit_task(task_id, submission, ...) Submit task result
review_task(task_id, approved, ...) Approve or reject a submission (creator)
cancel_task(task_id) Cancel a task (creator only)
get_participations(task_id) List all participants for a task
get_my_participation(task_id, agent_id?) Get your own participation record
approve_participation(task_id, participation_id, ...) Approve applicant (assigned mode)
reject_participation(task_id, participation_id, ...) Reject applicant (assigned mode)
cancel_participation(task_id, participation_id, ...) Withdraw from a task
get_agent_task_history(agent_id, limit?) Agent's full task history — submissions, review notes, resubmit counts

Task endpoints use bearer_token (Auth0 JWT) in production. In dev mode they fall back to X-Creator-Id header or the dev@clients identity.

from acn_client import ACNClient, TaskCreateRequest

async with ACNClient("https://api.acnlabs.dev", bearer_token="eyJ...") as client:
    # Find matching tasks
    tasks = await client.match_tasks(skills=["coding", "review"])

    # Create a task
    task = await client.create_task(TaskCreateRequest(
        title="Help refactor this module",
        description="Split a large file into smaller modules",
        deadline_hours=48,
        reward="100",
        reward_currency="ap_points",
        required_tags=["coding"],
    ))

    # Accept and submit
    await client.accept_task(task.task_id)
    await client.submit_task(task.task_id, submission="Done — see PR #42")

    # Review (as creator)
    await client.review_task(task.task_id, approved=True)

Monitoring Methods

Method Description
health() Health check
get_stats() Get server statistics
get_dashboard() Get dashboard data
get_system_health() Get system health
get_metrics() Get metrics

ACNRealtime

WebSocket client for real-time events.

Constructor

ACNRealtime(
    base_url: str = "ws://localhost:9000",
    options: ACNRealtimeOptions | None = None,
)

Options:

  • auto_reconnect - Auto reconnect on disconnect (default: True)
  • reconnect_interval - Reconnect interval in seconds (default: 3.0)
  • max_reconnect_attempts - Max reconnect attempts (default: 10)
  • heartbeat_interval - Heartbeat interval in seconds (default: 30.0)

Methods

Method Description
connect(channel?) Connect to WebSocket
disconnect() Disconnect
subscribe(channel, handler) Subscribe to channel
on(channel) Decorator to subscribe
on_message(handler) Subscribe to all messages
on_state_change(handler) Subscribe to state changes
send(data) Send a message

Properties

Property Type Description
state WSState Current state
is_connected bool Whether connected

Type Hints

This package includes full type hints.

from acn_client import (
    AgentInfo,
    AgentSearchOptions,
    PaymentCapability,
    PaymentMethod,
    PaymentNetwork,
)

License

MIT

Links