diff --git a/README.md b/README.md index cc5330e..3f4c7fd 100644 --- a/README.md +++ b/README.md @@ -89,19 +89,25 @@ client = AxmeClient( # Check connectivity print(client.health()) -# Send an intent +# Send an intent to a registered agent address intent = client.create_intent( { "intent_type": "order.fulfillment.v1", + "to_agent": "agent://acme-corp/production/fulfillment-service", "payload": {"order_id": "ord_123", "priority": "high"}, - "owner_agent": "agent://fulfillment-service", }, idempotency_key="fulfill-ord-123-001", + correlation_id="corr-ord-123-001", ) print(intent["intent_id"], intent["status"]) +# List registered agent addresses in your workspace +agents = client.list_agents(org_id="acme-corp-uuid", workspace_id="prod-ws-uuid") +for agent in agents["agents"]: + print(agent["address"], agent["status"]) + # Wait for resolution -resolved = client.wait_for(intent["intent_id"], terminal_states={"RESOLVED", "CANCELLED"}) +resolved = client.wait_for(intent["intent_id"]) print(resolved["status"]) ``` diff --git a/axme_sdk/client.py b/axme_sdk/client.py index 40f5fbe..d58e98b 100644 --- a/axme_sdk/client.py +++ b/axme_sdk/client.py @@ -744,6 +744,44 @@ def create_service_account_key( retryable=idempotency_key is not None, ) + def list_agents( + self, + *, + org_id: str, + workspace_id: str, + limit: int | None = None, + trace_id: str | None = None, + ) -> dict[str, Any]: + """List registered agent addresses in a workspace. + + Returns a dict with an ``agents`` list, each entry containing + ``address``, ``display_name``, ``status``, and ``created_at``. + """ + params: dict[str, str] = {"org_id": org_id, "workspace_id": workspace_id} + if limit is not None: + params["limit"] = str(limit) + return self._request_json( + "GET", + "/v1/agents", + params=params, + trace_id=trace_id, + retryable=True, + ) + + def get_agent(self, address: str, *, trace_id: str | None = None) -> dict[str, Any]: + """Get agent address details by full ``agent://org/workspace/name`` address.""" + if not isinstance(address, str) or not address.strip(): + raise ValueError("address must be a non-empty string") + path_part = address.strip() + if path_part.startswith("agent://"): + path_part = path_part[len("agent://"):] + return self._request_json( + "GET", + f"/v1/agents/{path_part}", + trace_id=trace_id, + retryable=True, + ) + def revoke_service_account_key( self, service_account_id: str, diff --git a/examples/basic_submit.py b/examples/basic_submit.py index 95f81e5..52dbbe0 100644 --- a/examples/basic_submit.py +++ b/examples/basic_submit.py @@ -15,8 +15,7 @@ def main() -> None: created = client.create_intent( { "intent_type": "intent.demo.v1", - "from_agent": "agent://basic/python/source", - "to_agent": "agent://basic/python/target", + "to_agent": "agent://acme-corp/production/target", "payload": {"task": "hello-from-python"}, }, correlation_id=correlation_id,