p5jsTutorial1 / tutorial1.md
sarahciston's picture
Create tutorial1.md
8b9d08a verified
metadata
title: p5.js Starting Your Critical AI Kit
author: Sarah Ciston
editors:
  - Emily Martinez
  - Minne Atairu
category: critical-ai

X. [TO-DO] Get to know the terms and tools.

API: Model: Dataset: [TO-DO]:

X. [TO-DO] Create HuggingFace account.

[TO-DO][XXX]

X. Create a Hugging Face Space.

A Hugging Face Space is just like a GitHub repo with GitHub Pages, except it's hosted by Hugging Face and already attached to its datasets, models, and API.

Visit https://huggingface.co/new-space?.

Name your Space. Maybe something like p5jsCriticalAIKit or criticalAITutorial1

Select static and then select a Blank template. Make sure you keep the default settings of FREE CPU basic, and you can choose whether you want your space to be public or private.

Your new Space should load on the App page, which is its web page. It should say Running at the top in green if it worked. Click on the drop down menu next to Running. Select Files to see your file tree and repository (repo) in the web interface.

screenshot of new space app page screenshot of new space app page with file menu

Click "Add File" to make a new sketch.js file. Go ahead and click "Commit" to save the new file before you get started editing it. You can hit "Edit" to make changes to the file in your browser.

Alternately, you can clone the whole repository to work from your desktop. Refer to p5.js Tutorial on Setup or Dan Shiffman’s Hosting a p5.js Sketch with GitHub Pages which also works for HF Spaces)] for more detailed information about setting up your workspace. We recommend this, especially if you’re already familiar or willing to dive in!

X. Add p5.js to the Space

Edit index.html to include the p5.js library by including this line inside the ` tags:

<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.10.0/p5.min.js"></script>

If you like, you can change the title of your page to your preference. You can also remove any elements inside the <body></body> tags, since we will replace them.

Next, update index.html to reference the sketch.js file we created. Add this line inside the <body></body> tags:

<script type="module" src="sketch.js"></script> // make sure it has the type attribute "module"

The script element importing the sketch file may be familiar to you. Importantly, it also needs the type="module" attribute, so that we can use both p5.js and other libraries in the file. Let's set that up next...

X. Create a class instance of p5 in sketch.js.

Our p5.js Instance is basically a wrapper that allows us to hold all of our p5.js functions together in one place and label them, so that the program can recognize them as belonging to p5.js.

First we declare a new p5() class instance:

new p5(function (p5) {
    //
})

Then, all our usual p5.js coding will happen within these curly braces.

new p5(function (p5) {
    p5.setup = function(){
        //
    }

    p5.draw = function(){
        // 
    }
})

Important: When using any functions specific to p5.js, you will start them out with a label of whatever you called your p5.js instance. In this case we called it p5 so our functions will be called p5.setup() and p5.draw() instead of the setup() and draw() you may recognize.

This will apply to any other function that is special to p5.js, like p5.noCanvas, but not to other functions which are standard to Javascript. Anything code written outside of the new p5(){} instance will not understand any p5.js syntax.

Let's add the instance mode version of p5.noCanvas() because we will be working directly with the DOM and don't need a canvas.

new p5(function (p5) {
    p5.setup = function(){
        p5.noCanvas()
        console.log('p5 instance loaded')
    }

    p5.draw = function(){
        // 
    }
})

We can also check that the p5 instance is working correctly by adding console.log('p5 instance loaded') to p5.setup(), since you won't yet see a canvas or any DOM elements

Check that the page loaded, since we don't have a canvas. Add this outside of the p5.js instance:

window.onload = function(){
    console.log('DOM loaded, sketch.js loaded')
}

X. Create a web interface and add template features.

We'll build an easy p5.js web interface so that we can interact with our Critical AI Kit. Create three new functions and run them in the In the p5.setup() function. Add a fourth function named displayResults() but don't run it in Setup. Instead it will run with a button press we make later.

new p5(function (p5){
    p5.setup = function(){
        p5.noCanvas()
        console.log('p5 instance loaded')

        makeTextDisplay()
        makeFields()
        makeButtons()
    }

    function makeTextDisplay(){
        //
    }

    function makeFields(){
        //
    }

    function makeButtons(){
        //
    }

    function displayResults(){
        //
    }
})

For a deep dive into how to use the p5.DOM features, see DOM TUTORIAL. Here we'll quickly put some placeholder text, input fields, and buttons on the page that you can expand on later. First, add a title, a description, and some alt text for accessibility. Don't forget to add p5. in front of every function that is specific to p5.js.

function makeTextDisplay(){
    let title = p5.createElement('h1','p5.js Critical AI Kit')
    let intro = p5.createP(`Description`)
    let altText = p5.describe(p5.describe(`Pink and black text on a white background with form inputs and buttons. The text describes a p5.js tool that lets you explore machine learning interactively. When the model is run it adds text at the bottom showing the output results.`))
}

For now, we'll just add a single input field, for writing prompts. It won't work yet because we'll need to connect it to the rest of the form. We describe its size, give it a label, and give it the class prompt.

function makeFields(){
    let pField = p5.createInput(``)
    pField.size(700)
    pField.attribute('label', `Write a prompt here:`)
    p5.createP(pField.attribute('label'))
    pField.addClass("prompt")
  }

We'll add one button that will let us send prompts to the model. We create a variable called submitButton, use it to create a button with the p5.createButton function, and display the text "SUBMIT" on the button. We also size the button and give it a class. For now it won't do anything because we haven't used its .mousePressed() method to call any functions, but we'll add that later.

function makeButtons(){
    let submitButton = p5.createButton("SUBMIT")
    submitButton.size(170)
    submitButton.class('submit')
    // submitButton.mousePressed()
  }

And how about somewhere to display the results we get from our model? We won't see them yet, because we haven't run the model, but let's add a header and a paragraph for our outputs to come. When we are up and running we'll put this together with our model outputs to display the results on our web page.

function displayResults(){
    let outHeader = p5.createElement('h3',"Results") 
    let outText = p5.createP('')

X. Add CSS flair.

Create a style.css file and paste in this code:

Link to raw file

You can also write your own or revamp this code! See CSS Tutorial [XXX] for more details on playing with styles.

X. Add authorization to your space. [MAY NOT BE NEEDED][XXX]

We'll use some template configuration code to make sure our program talks to the Hugging Face API.

Paste this code into your sketch.js file:

[XXX-TO-DO][MAY NOT NEED]

Also add this to your README.md:

hf_oauth: true
hf_oauth_scopes:
  - read-repos
  - write-repos
  - inference-api

When you next load your app, click Authorize

screenshot of Hugging Face app authorization screen

To check if your authorization has worked, visit the Settings for your Hugging Face profile. Click Connected Apps and you should see the name of your Space.

screenshot of authorized space in Hugging Face Settings interface

To adjust the configuration of your HF space: https://huggingface.co/docs/hub/spaces-config-reference

ALT if not using HF Spaces:

X. Get a HuggingFace API key.

https://huggingface.co/docs/hub/spaces-overview#managing-secrets

X. Connect your API key to your p5.js instance.

Reflections & Next Steps

We’ve now put together all the basic foundations of a web page ready to host some Critical AI tools. As we move on to [XXX]