ComponentsAgents and toolkitsAINetworkOn this pageAINetworkAI Network is a layer 1 blockchain designed to accommodate large-scale AI models, utilizing a decentralized GPU network powered by the $AIN token, enriching AI-driven NFTs (AINFTs).The AINetwork Toolkit is a set of tools for interacting with the AINetwork Blockchain. These tools allow you to transfer AIN, read and write values, create apps, and set permissions for specific paths within the blockchain database.Installing dependencies​Before using the AINetwork Toolkit, you need to install the ain-py package. You can install it with pip:pip install ain-pySet environmental variables​You need to set the AIN_BLOCKCHAIN_ACCOUNT_PRIVATE_KEY environmental variable to your AIN Blockchain Account Private Key.import osos.environ["AIN_BLOCKCHAIN_ACCOUNT_PRIVATE_KEY"] = ""Get AIN Blockchain private key​import osfrom ain.account import Accountif os.environ.get("AIN_BLOCKCHAIN_ACCOUNT_PRIVATE_KEY", None):    account = Account(os.environ["AIN_BLOCKCHAIN_ACCOUNT_PRIVATE_KEY"])else:    account = Account.create()    os.environ["AIN_BLOCKCHAIN_ACCOUNT_PRIVATE_KEY"] = account.private_key    print(        f"""address: {account.address}private_key: {account.private_key}"""    )# IMPORTANT: If you plan to use this account in the future, make sure to save the#  private key in a secure place. Losing access to your private key means losing#  access to your account.        address: 0x5BEB4Defa2ccc274498416Fd7Cb34235DbC122Ac    private_key: f5e2f359bb6b7836a2ac70815473d1a290c517f847d096f5effe818de8c2cf14    Initialize the AINetwork Toolkit​You can initialize the AINetwork Toolkit like this:from langchain.agents.agent_toolkits.ainetwork.toolkit import AINetworkToolkittoolkit = AINetworkToolkit()tools = toolkit.get_tools()address = tools[0].interface.wallet.defaultAccount.addressInitialize the Agent with the AINetwork Toolkit​You can initialize the agent with the AINetwork Toolkit like this:from langchain.chat_models import ChatOpenAIfrom langchain.agents import initialize_agent, AgentTypellm = ChatOpenAI(temperature=0)agent = initialize_agent(    tools=tools,    llm=llm,    verbose=True,    agent=AgentType.OPENAI_FUNCTIONS,)Example Usage​Here are some examples of how you can use the agent with the AINetwork Toolkit:Define App name to test​appName = f"langchain_demo_{address.lower()}"Create an app in the AINetwork Blockchain database​print(    agent.run(        f"Create an app in the AINetwork Blockchain database with the name {appName}"    ))            > Entering new AgentExecutor chain...        Invoking: `AINappOps` with `{'type': 'SET_ADMIN', 'appName': 'langchain_demo_0x5beb4defa2ccc274498416fd7cb34235dbc122ac'}`            {"tx_hash": "0x018846d6a9fc111edb1a2246ae2484ef05573bd2c584f3d0da155fa4b4936a9e", "result": {"gas_amount_total": {"bandwidth": {"service": 4002, "app": {"langchain_demo_0x5beb4defa2ccc274498416fd7cb34235dbc122ac": 2}}, "state": {"service": 1640}}, "gas_cost_total": 0, "func_results": {"_createApp": {"op_results": {"0": {"path": "/apps/langchain_demo_0x5beb4defa2ccc274498416fd7cb34235dbc122ac", "result": {"code": 0, "bandwidth_gas_amount": 1}}, "1": {"path": "/apps/langchain_demo_0x5beb4defa2ccc274498416fd7cb34235dbc122ac", "result": {"code": 0, "bandwidth_gas_amount": 1}}, "2": {"path": "/manage_app/langchain_demo_0x5beb4defa2ccc274498416fd7cb34235dbc122ac/config/admin", "result": {"code": 0, "bandwidth_gas_amount": 1}}}, "code": 0, "bandwidth_gas_amount": 2000}}, "code": 0, "bandwidth_gas_amount": 2001, "gas_amount_charged": 5642}}The app with the name "langchain_demo_0x5beb4defa2ccc274498416fd7cb34235dbc122ac" has been created in the AINetwork Blockchain database.        > Finished chain.    The app with the name "langchain_demo_0x5beb4defa2ccc274498416fd7cb34235dbc122ac" has been created in the AINetwork Blockchain database.Set a value at a given path in the AINetwork Blockchain database​print(    agent.run(f"Set the value {{1: 2, '34': 56}} at the path /apps/{appName}/object ."))            > Entering new AgentExecutor chain...        Invoking: `AINvalueOps` with `{'type': 'SET', 'path': '/apps/langchain_demo_0x5beb4defa2ccc274498416fd7cb34235dbc122ac/object', 'value': {'1': 2, '34': 56}}`            {"tx_hash": "0x3d1a16d9808830088cdf4d37f90f4b1fa1242e2d5f6f983829064f45107b5279", "result": {"gas_amount_total": {"bandwidth": {"service": 0, "app": {"langchain_demo_0x5beb4defa2ccc274498416fd7cb34235dbc122ac": 1}}, "state": {"service": 0, "app": {"langchain_demo_0x5beb4defa2ccc274498416fd7cb34235dbc122ac": 674}}}, "gas_cost_total": 0, "code": 0, "bandwidth_gas_amount": 1, "gas_amount_charged": 0}}The value {1: 2, '34': 56} has been set at the path /apps/langchain_demo_0x5beb4defa2ccc274498416fd7cb34235dbc122ac/object.        > Finished chain.    The value {1: 2, '34': 56} has been set at the path /apps/langchain_demo_0x5beb4defa2ccc274498416fd7cb34235dbc122ac/object.Set permissions for a path in the AINetwork Blockchain database​print(    agent.run(        f"Set the write permissions for the path /apps/{appName}/user/$from with the"        " eval string auth.addr===$from ."    ))            > Entering new AgentExecutor chain...        Invoking: `AINruleOps` with `{'type': 'SET', 'path': '/apps/langchain_demo_0x5beb4defa2ccc274498416fd7cb34235dbc122ac/user/$from', 'eval': 'auth.addr===$from'}`            {"tx_hash": "0x37d5264e580f6a217a347059a735bfa9eb5aad85ff28a95531c6dc09252664d2", "result": {"gas_amount_total": {"bandwidth": {"service": 0, "app": {"langchain_demo_0x5beb4defa2ccc274498416fd7cb34235dbc122ac": 1}}, "state": {"service": 0, "app": {"langchain_demo_0x5beb4defa2ccc274498416fd7cb34235dbc122ac": 712}}}, "gas_cost_total": 0, "code": 0, "bandwidth_gas_amount": 1, "gas_amount_charged": 0}}The write permissions for the path `/apps/langchain_demo_0x5beb4defa2ccc274498416fd7cb34235dbc122ac/user/$from` have been set with the eval string `auth.addr===$from`.        > Finished chain.    The write permissions for the path `/apps/langchain_demo_0x5beb4defa2ccc274498416fd7cb34235dbc122ac/user/$from` have been set with the eval string `auth.addr===$from`.Retrieve the permissions for a path in the AINetwork Blockchain database​print(agent.run(f"Retrieve the permissions for the path /apps/{appName}."))            > Entering new AgentExecutor chain...        Invoking: `AINownerOps` with `{'type': 'GET', 'path': '/apps/langchain_demo_0x5beb4defa2ccc274498416fd7cb34235dbc122ac'}`            {".owner": {"owners": {"0x5BEB4Defa2ccc274498416Fd7Cb34235DbC122Ac": {"branch_owner": true, "write_function": true, "write_owner": true, "write_rule": true}}}}The permissions for the path /apps/langchain_demo_0x5beb4defa2ccc274498416fd7cb34235dbc122ac are as follows:        - Address: 0x5BEB4Defa2ccc274498416Fd7Cb34235DbC122Ac      - branch_owner: true      - write_function: true      - write_owner: true      - write_rule: true        > Finished chain.    The permissions for the path /apps/langchain_demo_0x5beb4defa2ccc274498416fd7cb34235dbc122ac are as follows:        - Address: 0x5BEB4Defa2ccc274498416Fd7Cb34235DbC122Ac      - branch_owner: true      - write_function: true      - write_owner: true      - write_rule: trueGet AIN from faucet​curl http://faucet.ainetwork.ai/api/test/{address}/    {"result":"0x0eb07b67b7d0a702cb60e865d3deafff3070d8508077ef793d69d6819fd92ea3","time":1692348112376}Get AIN Balance​print(agent.run(f"Check AIN balance of {address}"))            > Entering new AgentExecutor chain...        Invoking: `AINvalueOps` with `{'type': 'GET', 'path': '/accounts/0x5BEB4Defa2ccc274498416Fd7Cb34235DbC122Ac/balance'}`            100The AIN balance of address 0x5BEB4Defa2ccc274498416Fd7Cb34235DbC122Ac is 100 AIN.        > Finished chain.    The AIN balance of address 0x5BEB4Defa2ccc274498416Fd7Cb34235DbC122Ac is 100 AIN.Transfer AIN​print(    agent.run(        "Transfer 100 AIN to the address 0x19937b227b1b13f29e7ab18676a89ea3bdea9c5b"    ))            > Entering new AgentExecutor chain...        Invoking: `AINtransfer` with `{'address': '0x19937b227b1b13f29e7ab18676a89ea3bdea9c5b', 'amount': 100}`            {"tx_hash": "0xa59d15d23373bcc00e413ac8ba18cb016bb3bdd54058d62606aec688c6ad3d2e", "result": {"gas_amount_total": {"bandwidth": {"service": 3}, "state": {"service": 866}}, "gas_cost_total": 0, "func_results": {"_transfer": {"op_results": {"0": {"path": "/accounts/0x5BEB4Defa2ccc274498416Fd7Cb34235DbC122Ac/balance", "result": {"code": 0, "bandwidth_gas_amount": 1}}, "1": {"path": "/accounts/0x19937B227b1b13f29e7AB18676a89EA3BDEA9C5b/balance", "result": {"code": 0, "bandwidth_gas_amount": 1}}}, "code": 0, "bandwidth_gas_amount": 0}}, "code": 0, "bandwidth_gas_amount": 1, "gas_amount_charged": 869}}The transfer of 100 AIN to the address 0x19937b227b1b13f29e7ab18676a89ea3bdea9c5b was successful. The transaction hash is 0xa59d15d23373bcc00e413ac8ba18cb016bb3bdd54058d62606aec688c6ad3d2e.        > Finished chain.    The transfer of 100 AIN to the address 0x19937b227b1b13f29e7ab18676a89ea3bdea9c5b was successful. The transaction hash is 0xa59d15d23373bcc00e413ac8ba18cb016bb3bdd54058d62606aec688c6ad3d2e.PreviousAgents and toolkitsNextAirbyte Question AnsweringInstalling dependenciesSet environmental variablesGet AIN Blockchain private keyInitialize the AINetwork ToolkitInitialize the Agent with the AINetwork ToolkitExample UsageDefine App name to testCreate an app in the AINetwork Blockchain databaseSet a value at a given path in the AINetwork Blockchain databaseSet permissions for a path in the AINetwork Blockchain databaseRetrieve the permissions for a path in the AINetwork Blockchain databaseGet AIN from faucetGet AIN BalanceTransfer AIN