# Call and export external capabilities | EasyNet Docs Source: https://easynet.run/docs/aal/reference/interop # 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](https://github.com/Brain-Cell-Coding/Agent-Assembly-Language/blob/main/docs/remote-agent-routing.md) 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](https://easynet.run/docs/aal/reference/projects) 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](https://easynet.run/docs/connect/function). 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.