If you like video tutorials, here is one of our latest workshops on building your first AI Agent Contract. In this tutorial, you will learn:
How to get an OpenAI API Key at https://red-pill.ai
Clone the AI Agent Contract template repo
Build and test your Agent Script
Launch and interact with your Agent Script through the Phala Agent Gateway
The RedPill AI Agent template is a MINIMAL template to build an AI Agent that can be hosted on Phala Network's decentralized hosting protocol. Unlike Vercel or other FaaS, it allows you to publish your AI Agent compiled code to IPFS and hosts it on a fully decentralized FaaS cloud with the following benefits:
💨 Ship Fast: Build and ship with familiar toolchain in minutes
⛑️ Secure: Execution guarded by rock solid TEE
🔒 Private: Host API keys and user privacy at ease
💎 Unstoppable: Powered by IPFS and Phala's 40k+ decentralized TEE workers
🧪 Vite Test Framework: Vite Testing Framework support, but you're free to change the test framework to your desire.
We recommend using @hono/tiny to avoid a large bundle size and the 20MB final artifact limitation.
This guide will focus on the following topics:
Build and Deploy Your AI Agent Contract
Build and deploy your Agent Contract that is deployed to IPFS and served through the Phala Agent Gateway executed on Phala Network
Use/Interact with Your AI Agent Contract
The Agent Gateway will fetch the Agent Contract code/prompt located on IPFS.
Interact with your agent hosted through Phala's Agent Gateway (https://wapo-testnet.phala.network/ipfs/<CID>).
Getting Started
Prepare
Clone git repo or use degit to get the source code.
Create .env file with the default ThirdWeb API key for publishing your Agent Contract to IPFS
cp.env.example.env
Get an API Key from Redpill
Note
There is a default RedPill API Key provided in the .env.example file. This API key is rate limited and if you run into an error that displays Insufficient funds, reach out to the Phala Team on discord.
In default.json file replace YOUR_API_KEY with your API Key. The default has a rate limit. If you want access to a RedPill code, reach out to the Phala Team.
{"apiKey":"YOUR_REDPILL_API_KEY"}
Build your Agent
npmrunbuild
Test your Agent locally
npmruntest
Expected Test Results
Nowyouarereadytopublishyouragent,addsecrets,andinteractwithyouragentinthefollowingsteps:-Execute:'npm run publish-agent'-Setsecrets:'npm run set-secrets'-Gototheurlproducedbysettingthesecrets (e.g. https://wapo-testnet.phala.network/ipfs/QmPQJD5zv3cYDRM25uGAVjLvXGNyQf9Vonz7rqkQB52Jae?key=b092532592cbd0cf)✓tests/index.test.ts (2) 6157ms✓TestRedPillAIAgentContract (2) 6156ms✓GETTest:PasschatQuerythroughURLQuery2722ms✓POSTTest:PasschatQueryandmodelthroughbodyofPOSTrequest3434msTestFiles1passed (1)Tests2passed (2)Startat16:30:03Duration6.36s (transform 23ms,setup6ms,collect31ms,tests6.16s,environment0ms,prepare39ms)
Upload your compiled AI Agent code to IPFS.
npmrunpublish-agent
Upon a successful upload, the command should show the URL to access your AI Agent.
-UploadingfiletoIPFS.Thismaytakeawhiledependingonfilesizes.✔SuccessfullyuploadedfiletoIPFS.✔FilesstoredatthefollowingIPFSURI:ipfs://QmaUbZgNz9dZ5eGm87DDqegRtcBV7RdosxizYQcfe2bHRc✔Openthislinktoviewyourupload:https://b805a9b72767504353244e0422c2b5f9.ipfscdn.io/ipfs/bafybeifukvkuyztltpq2gi55nswzvwkpgrwrogwykm4ymoqeymh2pxoukm/AgentContractdeployedat:https://wapo-testnet.phala.network/ipfs/QmaUbZgNz9dZ5eGm87DDqegRtcBV7RdosxizYQcfe2bHRcIfyouragentrequiressecrets,ensuretodothefollowing:1) Edit the ./secrets/default.json file or create a new JSON file in the ./secrets folder and add your secrets to it.2) Run command: 'npm run set-secrets' or 'npm run set-secrets [path-to-json-file]'Logsfoldercreated.Deploymentinformationupdatedin./logs/latestDeployment.json
Note that your latest deployment information will be logged to in file ./logs/latestDeployment.json. This file is updated every time you publish a new Agent Contract to IPFS. This file is also used to get the IPFS CID of your Agent Contract when setting secrets for your Agent Contract.
If ThirdWeb fails to publish, please signup for your own ThirdWeb account to publish your Agent Contract to IPFS. Signup or login at https://thirdweb.com/dashboard/
Whenever you log into ThirdWeb, create a new API key and replace the default API Key with yours in the .env file.
THIRDWEB_API_KEY="YOUR_THIRDWEB_API_KEY"
Accessing The Published Agent
Once published, your AI Agent is available at the URL: https://wapo-testnet.phala.network/ipfs/<your-cid>. You can get it from the "Publish to IPFS" step.
By default, all the compiled JS code is visible for anyone to view if they look at IPFS CID. This makes private info like API keys, signer keys, etc. vulnerable to be stolen. To protect devs from leaking keys, we have added a field called secret in the Request object. It allows you to store secrets in a vault for your AI Agent to access.
To add your secrets,
Edit the default.json file or create a new JSON file in the ./secrets folder and add your secrets to it.
{"apiKey":"YOUR_REDPILL_API_KEY"}
Run command to set the secrets
npmrunset-secrets# or if you have a custom JSON filenpmrunset-secrets<path-to-json-file>
Note that all your secrets will be logged in file ./logs/secrets.log. This file is updated every time you add new secrets to your Agent Contract. If you have not published an Agent Contract, yet, this command will fail since there is not a CID to map the secrets to.
The API returns a token and a key. The key is the id of your secret. It can be used to specify which secret you are going to pass to your frame. The token can be used by the developer to access the raw secret. You should never leak the token.
To verify the secret, run the following command where key and token are replaced with the values from adding your secret to the vault.
let vault:Record<string,string> = {}try { vault =JSON.parse(process.env.secret ||'')} catch (e) {console.error(e)returnc.json({ error:"Failed to parse secrets" })}constapiKey= (vault.apiKey) ?vault.apiKey asstring:'SALTY_BAE'
Handling Requests
Check the Hono docs for information on accessing URL queries or body from a post request.
We recommend using @hono/tiny to avoid a large bundle size and the 20MB final artifact limitation.
Example
// Access query value for a URL query named `type`let queries =c.req.queries() || {}constgetType= (queries.type) ?queries.type[0] asstring:''// Access body from post requestconstdata=awaitc.req.json()
Debugging Your Agent
To debug your agent, you can use the following command:
For more information check the MDN docs on console object.
Run a Local Testnet With Docker
Run a local testnet with docker support. All you need to do to get a local testnet started is run:
Running the local testnet may return an error if port 8000 is already in use.
npmrundev
Make a Request to Your Local Build
# GET requestcurlhttp://127.0.0.1:8000/local# GET request with URL queriescurlhttp://127.0.0.1:8000/local?query1=one&query2=two# POST requestcurlhttp://127.0.0.1:8000/local-XPOST-H'content-type: application/json'-d'{"foo": "bar"}'
Congratulations! You have deployed and interacted with your first AI Agent Contract on Phala Network! Now let's move to a more Web3-centric agent to execute transactions onchain by importing the Viem SDK into the AI Agent Contract.
@hono/tiny Support: a small, simple, and ultrafast web framework built on Web Standards.