Call and export external capabilities
When another service already provides a calculation, declare its interface in AAL and let the host bind it to the real service. Business code handles inputs and results; the runtime supplies connections and permissions.
Define the result you need
Suppose a service accepts an integer and returns a calculated integer. Declare the contract and caller:
contract agent Worker
public
ability run(value: Int) -> Int effects()
agent Coordinator is Agent
public
ability run(value: Int) -> Int effects(agent)
return agent("Worker").run(value)
Worker names the interface; Coordinator is the Agent you run. effects(agent) allows it to call another Agent. Contract parameters and results must match the real service interface.
This code can be checked, but cannot return a result without a binding. A contract has no calculation implementation.
Configure the real service
The host needs:
- The target capability's URA and public descriptor.
- Matching input/output schemas and a trusted execution binding.
- Caller identity, permitted subjects and signing configuration.
- Transport address, timeouts and result recovery storage.
The Axon adapter binds through RemoteRoute. Use the official SDK to create invocation context; do not assemble signatures in AAL or treat service names as permissions.
See remote Agent configuration for host integration steps.
Let other programs call your AAL capability
Expose the entry as a public ability, then select published capabilities in application.abilities:
[application]
descriptor_version = "1.0.0"
fuel = 10000
[[application.abilities]]
name = "counter.next"
agent = "Counter"
ability = "next"
The project must contain Counter with a public next ability. Follow the project and distribution guide to build a provider package for Runtime installation and binding. Callers use the SDK and public descriptor, without accessing private skills.
Python and other languages
A complete bidirectional tutorial for native URA syntax calling Python, or a Python client calling AAL, is not provided here yet. The unbound contract above is not a configured Python connection.
To connect an existing Python function, start with the Python function guide. The AAL host binding and service invocation still require their own configuration; a complete bidirectional composition is not offered as a runnable example here.
After a timeout
A remote operation may have executed even when its result did not arrive. Do not resend the same business operation with a new request ID. Retain the original call record and use the host's result lookup and recovery flow to establish the outcome before continuing.