> ## Documentation Index
> Fetch the complete documentation index at: https://docs.unoverse.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Create Your First Agent

Build a chat Agent in **Canvas**: a trigger that receives the message, a model that thinks, and a response that streams back. Ten minutes, no code.

## Before you begin

The platform is running (`unoverse start`) and **Canvas** is open at [http://localhost:3001](http://localhost:3001). You have an OpenAI API key, and the OpenAI package is installed from the [marketplace](/onboarding/marketplace-nodes).

## Build it

<Steps>
  <Step title="Add your OpenAI credential">
    In **Canvas**, open **Credentials** and click **New credential**. Select the **OpenAI API** type, name it, paste your API key, and save. Nodes never read keys from config or env files; they request credentials at execution time, decrypted and injected by the platform.

    <img src="https://mintcdn.com/unoverse/JiBuFoNMsGe7EgEw/images/credentials.png?fit=max&auto=format&n=JiBuFoNMsGe7EgEw&q=85&s=fc847c442e778a78fe1cf4a901aaa2b7" alt="The Credentials page in Canvas" width="1186" height="277" data-path="images/credentials.png" />
  </Step>

  <Step title="Create a workflow">
    Open **Workflows** and click **Create New Workflow**, then name it. An empty **Canvas**
    opens, ready for nodes. This comes first: nodes live in a workflow, so there is nowhere to
    drop one until you have made it.

    <img src="https://mintcdn.com/unoverse/HGquNnOUUM4p2Zom/images/onboarding/newWorkfloew.png?fit=max&auto=format&n=HGquNnOUUM4p2Zom&q=85&s=63bdddb8e0c888343c479b19105b9f25" alt="Creating a new workflow in Canvas" width="1626" height="628" data-path="images/onboarding/newWorkfloew.png" />
  </Step>

  <Step title="Add three nodes">
    The workflow needs three nodes:

    1. <span className="node-chip">Input Trigger</span> receives the user's message.
    2. <span className="node-chip">OpenAI Stream</span> sends it to the model and streams the reply.
    3. <span className="node-chip">Streaming Text</span> displays the reply to the user.

    Drag <span className="node-chip">Input Trigger</span> and <span className="node-chip">OpenAI Stream</span> from the node library onto the **Canvas**.

    <img src="https://mintcdn.com/unoverse/JiBuFoNMsGe7EgEw/images/onboarding/inputTrigger.png?fit=max&auto=format&n=JiBuFoNMsGe7EgEw&q=85&s=6ada77029c550af129381260503903b2" alt="An Input Trigger node on the canvas" width="1487" height="627" data-path="images/onboarding/inputTrigger.png" />

    <span className="node-chip">Streaming Text</span> is a component, so it comes from **Studio**. Open **Components** in **Studio**, select **StreamingText**, and click **Copy for Canvas**. Then paste it into your **Canvas**.

    <img src="https://mintcdn.com/unoverse/JiBuFoNMsGe7EgEw/images/onboarding/AIResponce.png?fit=max&auto=format&n=JiBuFoNMsGe7EgEw&q=85&s=0b2de1f5db62cfdf86bc706c1b5221e6" alt="The StreamingText component in Studio with Copy for Canvas" width="1197" height="665" data-path="images/onboarding/AIResponce.png" />

    Now connect them left to right: <span className="node-chip">Input Trigger</span> → <span className="node-chip">OpenAI Stream</span> → <span className="node-chip">Streaming Text</span>.

    The dots on a node's edges are **connectors**. Each output connector carries one named signal. Hover over a connector to see its name and what it carries. The names matter: they are how downstream fields reference the data, as in `signal.openaistream1.stream`.

    <span className="node-chip">OpenAI Stream</span> has more than one output, so pick the right one: connect from its `stream` connector. `stream` carries the live text, so the reply flows into <span className="node-chip">Streaming Text</span> as the model writes it.

    <img src="https://mintcdn.com/unoverse/JiBuFoNMsGe7EgEw/images/onboarding/connnector.png?fit=max&auto=format&n=JiBuFoNMsGe7EgEw&q=85&s=654ff77f2ff4151d16dfdc82d03db0a1" alt="Hovering a connector shows its name and what it carries" width="1107" height="764" data-path="images/onboarding/connnector.png" />

    <Note>
      Every node instance gets an id: its type, lowercased, plus a number. Your three nodes are `inputtrigger1`, `openaistream1`, and `airesponse1`. Downstream nodes read upstream outputs through these ids: `signal.<nodeId>.<output>`.
    </Note>
  </Step>

  <Step title="Set a test message">
    Double-click <span className="node-chip">Input Trigger</span> to open its settings. Under **Testing**, enter a **Message**. This is the question that kicks off the flow when you run the trigger.

    <img src="https://mintcdn.com/unoverse/JiBuFoNMsGe7EgEw/images/onboarding/SetTestMessage.png?fit=max&auto=format&n=JiBuFoNMsGe7EgEw&q=85&s=30f83e39ddabedcc709861b3d1c91b0d" alt="Setting a test message on Input Trigger" width="1163" height="905" data-path="images/onboarding/SetTestMessage.png" />
  </Step>

  <Step title="Configure the model">
    Double-click <span className="node-chip">OpenAI Stream</span> to open its settings:

    * **OpenAI API**: select the credential you created in step 1.
    * **Model**: pick a GPT-5.6 variant.
    * **System Prompt**: `You are a helpful assistant. Please answer the user's question.`
    * **User Prompt**: `The user's question is {{signal.inputtrigger1.output.message}}`

          <img src="https://mintcdn.com/unoverse/JiBuFoNMsGe7EgEw/images/onboarding/settings.png?fit=max&auto=format&n=JiBuFoNMsGe7EgEw&q=85&s=4462af7c3879add49c0f98df5fcf4b01" alt="The OpenAI Stream settings panel" width="1477" height="1030" data-path="images/onboarding/settings.png" />

    The double braces are a Handlebars reference: at run time it resolves to the message the trigger received.
  </Step>

  <Step title="Configure the response">
    Double-click <span className="node-chip">Streaming Text</span>:

    * **Main response text**: `return signal.openaistream1.stream`

    This field takes JavaScript. `stream` is the model's streaming output, so text appears live as the model writes. The complete reply is also available as `signal.openaistream1.text` once the node finishes.

    <Note>
      Config fields accept two syntaxes: Handlebars (`{{signal...}}`) for templating text, and JavaScript (`return signal...`) for computing a value. Use either; don't mix them in one field.
    </Note>
  </Step>

  <Step title="Step through it">
    Your workflow saves automatically as you build; there is no save button. Just run it: press the play button on <span className="node-chip">Input Trigger</span> to execute it with your test message. When a node completes, the next node in the chain becomes **armed** and flashes, meaning it is ready to run. Press its play button to step forward, inspecting each node's output as you go.

    <img src="https://mintcdn.com/unoverse/JiBuFoNMsGe7EgEw/images/onboarding/stepDebug.png?fit=max&auto=format&n=JiBuFoNMsGe7EgEw&q=85&s=4889cbdcfe1a9ed65e1f6e5c9e9a70a8" alt="Input Trigger completed, OpenAI Stream armed and ready to step" width="802" height="313" data-path="images/onboarding/stepDebug.png" />

    The moment a node runs, its output is ready to inspect. Double-click the node and open the **Debug** tab. It shows every signal the node produced and the exact value each one carried on this run.

    <img src="https://mintcdn.com/unoverse/JiBuFoNMsGe7EgEw/images/onboarding/debug.png?fit=max&auto=format&n=JiBuFoNMsGe7EgEw&q=85&s=d66c6d62a9d36eaac25233853baea75a" alt="The Debug tab showing OpenAI Stream's output" width="624" height="741" data-path="images/onboarding/debug.png" />

    Step through all three nodes and watch the reply stream into <span className="node-chip">Streaming Text</span>.
  </Step>
</Steps>

## One more thing

Everything you just built by hand, Claude Code can build for you. The platform ships a builder MCP, registered by this repo's `.mcp.json`:

1. With the platform running, open this repo in Claude Code and approve the `unoverse-builder` server when it asks. Type `/mcp` at any time to confirm it shows as connected.
2. In **Canvas**, create a new empty workflow and copy the `wf-xxxxxx` id from the URL.
3. Ask:

> Bind workflow wf-xxxxxx, then build a chat agent: input trigger → OpenAI → response display. Test each stage with runTest before adding the next.

Claude binds to that one **Canvas**, builds stage by stage, and runs each stage while you watch the nodes appear live. It can't see or touch any other workflow.

## Next steps

<Card title="Create your first node" icon="box" href="/onboarding/create-your-first-node" horizontal>
  Extend the platform with your own logic.
</Card>

<Card title="Ingest content to Spatial" icon="globe" href="/onboarding/ingest-content-to-spatial" horizontal>
  Ground your Agent's answers in your own content.
</Card>
