--- title: "Tenant Functions" slug: "tenant-functions" updated: 2022-07-13T23:36:46Z published: 2022-07-13T23:36:46Z canonical: "docs.echo.stream/tenant-functions" --- > ## Documentation Index > Fetch the complete documentation index at: https://docs.echo.stream/llms.txt > Use this file to discover all available pages before exploring further. # Tenant Functions While the [System Functions](/v1/docs/system-functions) provide a substantial amount of functionality for your Tenant's processing network, in many cases you may want to augment those Functions with ones that are specific to your processing needs. For example: - You want to augment a message with information from a database as you are processing that message. - You need to call an API with information included in the message during part of your processing. - You have a Tenant Message Type that you want to convert the message to or convert the message from. - You have an incoming Webhook that requires custom authentication EchoStream allows you to create as many Tenant-specific Functions as you wish to fulfill these types of use-cases. ## Creating To create a Tenant-specific Function, you must provide the following: ### Name The name of your Function must conform to the regular expression ^[A-Za-z0-9_.:/=+-@ ]{3,80}$ and must be unique within your Tenant. ### Code The actual Python code of the Function. Just like custom functions in your Nodes, all Python code in your Function must be contained within a single top-level `def` declaration. The signature of the Function's `def` declaration is dependant on the Function's type. ### Argument Message Type All Bitmapper and Processor Functions have an Argument Message Type. This is the type of message that will be passed to the function for processing. > Note - this **cannot** be changed after Function creation. ### Return Message Type Functions that return messages (i.e. - Processor Functions) will have a Return Message Type. This is the type of message that will be returned by the Functions after processing. > Note - this **cannot** be changed after Function creation. ### Requirements If your Function requires third-party Python packages, you *may* provide a list of those packages in `pip` [requirement specifiers](https://pip.pypa.io/en/stable/cli/pip_install/#requirement-specifiers) format. For example, if your Function does image conversion you could include `Pillow` by: ``` Pillow ``` ### README While is is not required, EchoStream strongly suggests that you provide a README in Markdown format that provides a more in-depth explanation of your Function and it's use to users of your Function. ## Updating You may update the code, requirements, description and readme of your Function. Updates are automatically applied to all Nodes that use your Function (unaltered) in near-real time. ## Deleting You may delete your Function if there are no Nodes in your Tenant that use it.