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

> ## Agent Instructions
> To search or read these docs, connect the Ringg docs MCP server at https://docs.ringg.ai/mcp (no key needed; tools search_ringg_ai and query_docs_filesystem_ringg_ai) instead of browsing pages one by one. Setup for each client: https://docs.ringg.ai/resources/mcp-server/docs-mcp-server/mcp-for-ai-assistants.md
> The dashboard labels agents "Assistants"; these docs say "agent". Both mean the same object, identified by agent_id.
> API base URL: https://prod-api.ringg.ai/ca/api/v0. Send the workspace API key in the X-API-KEY header, from server-side code only.
> Placing a call dials a real phone number and spends credits. Confirm the number with the user before calling.
> To act on a Ringg workspace (place calls, edit agents, read transcripts), use the separate Ringg workspace MCP server at https://mcp.ringg.ai/mcp: https://docs.ringg.ai/resources/mcp-server/workspace-mcp-server/overview.md

# Lesson: Create the agent

> Create Acme Lending's EMI reminder agent from a Financial template in the Create Assistant dialog, name it, set its languages and voice, and open the editor.

export const Quiz = ({question, answers, correctFeedback, incorrectFeedback}) => {
  const [selected, setSelected] = React.useState(null);
  const [checked, setChecked] = React.useState(false);
  const quizId = React.useId();
  const isCorrect = checked && answers[selected]?.correct;
  const reset = () => {
    setSelected(null);
    setChecked(false);
  };
  const optionStyle = (answer, i) => {
    const base = {
      display: "flex",
      alignItems: "flex-start",
      gap: "0.6rem",
      padding: "0.6rem 0.8rem",
      marginTop: "0.5rem",
      borderRadius: "0.6rem",
      border: "1px solid rgba(128, 128, 128, 0.35)",
      cursor: checked ? "default" : "pointer",
      lineHeight: 1.45
    };
    if (checked && answer.correct) {
      return {
        ...base,
        borderColor: "rgba(22, 163, 74, 0.8)",
        background: "rgba(22, 163, 74, 0.12)"
      };
    }
    if (checked && selected === i && !answer.correct) {
      return {
        ...base,
        borderColor: "rgba(220, 38, 38, 0.8)",
        background: "rgba(220, 38, 38, 0.1)"
      };
    }
    if (!checked && selected === i) {
      return {
        ...base,
        borderColor: "currentColor",
        background: "rgba(128, 128, 128, 0.12)"
      };
    }
    return base;
  };
  const buttonStyle = disabled => ({
    marginTop: "0.9rem",
    padding: "0.45rem 0.9rem",
    borderRadius: "0.5rem",
    border: "1px solid rgba(128, 128, 128, 0.5)",
    background: "rgba(128, 128, 128, 0.1)",
    color: "inherit",
    font: "inherit",
    fontSize: "0.9em",
    cursor: disabled ? "not-allowed" : "pointer",
    opacity: disabled ? 0.5 : 1
  });
  return <div style={{
    marginTop: "1.5rem",
    padding: "1rem 1.1rem",
    borderRadius: "0.8rem",
    border: "1px solid rgba(128, 128, 128, 0.35)"
  }}>
      <Badge color="green">Quiz</Badge>
      <p id={quizId + "-question"} style={{
    fontWeight: 600,
    margin: "0.6rem 0 0.2rem"
  }}>
        {question}
      </p>
      <div role="radiogroup" aria-labelledby={quizId + "-question"} aria-disabled={checked}>
        {answers.map((answer, i) => <label key={i} style={optionStyle(answer, i)}>
            <input type="radio" name={"quiz-" + quizId} checked={selected === i} onChange={() => !checked && setSelected(i)} disabled={checked} style={{
    marginTop: "0.3rem",
    flexShrink: 0
  }} />
            <span>{answer.text}</span>
          </label>)}
      </div>
      {checked && <div role="status" aria-live="polite" aria-atomic="true" style={{
    marginTop: "0.9rem",
    padding: "0.7rem 0.9rem",
    borderRadius: "0.6rem",
    lineHeight: 1.5,
    background: isCorrect ? "rgba(22, 163, 74, 0.12)" : "rgba(220, 38, 38, 0.1)"
  }}>
          <strong style={{
    marginRight: "0.4rem"
  }}>{isCorrect ? "✓" : "✗"}</strong>
          {isCorrect ? correctFeedback : incorrectFeedback}
        </div>}
      {!checked ? <button type="button" onClick={() => selected !== null && setChecked(true)} disabled={selected === null} style={buttonStyle(selected === null)}>
          Check answer
        </button> : <button type="button" onClick={reset} style={buttonStyle(false)}>
          Try again
        </button>}
    </div>;
};

**Part 2: Building your first agent · Lesson 1 of 4 · 10 minutes**

## Objective

Create an outbound agent from a template and open it in the editor, ready to be given a prompt.

## The scenario

Acme Lending sends a reminder call three days before a customer's EMI is due. The agent, Ananya, confirms who she is speaking to, states the amount and date, and asks when the customer will pay. This lesson creates her; the next three give her a prompt, a voice and a test call.

## Hands-on

<Frame caption="Creating a single-prompt agent in the dashboard">
  <video alt="Creating a single-prompt agent in the dashboard" aria-label="Creating a single-prompt agent in the dashboard" controls muted playsInline className="w-full rounded-xl" style={{ aspectRatio: "16 / 10" }} preload="metadata" controlsList="nodownload noremoteplayback" poster="/media/agents-create/poster.webp">
    <source src="https://mintcdn.com/ringgai-0da73d20/zhzhS2waLZvF8qXk/media/agents-create/video.webm?fit=max&auto=format&n=zhzhS2waLZvF8qXk&q=85&s=dde4b3f463406a6112dae7dc08a290e7" type="video/webm; codecs=&#x22;av01.0.09M.08&#x22;" data-path="media/agents-create/video.webm" />
  </video>
</Frame>

<Steps>
  <Step title="Open the create dialog">
    In the sidebar, click **Assistants**, then **Create agent**. In the **Create Assistant** dialog, choose the **Outbound** tab: the reminder is a call Acme places, not one it receives.
  </Step>

  <Step title="Start from the Financial templates">
    Under **Select industry templates**, click **Financial** and pick the template closest to a payment reminder. A template gives you a prompt written for the use case, which you edit in the next lesson.
  </Step>

  <Step title="Name the agent and pick its languages">
    Set **Agent Name** to `EMI reminder - Hindi`. The name is how your team finds the agent later, so say what it does and in which language.

    Set **Primary Language** to English (India) and **Secondary Language** to Hindi, so Ananya can switch when a customer answers in Hindi.
  </Step>

  <Step title="Choose a voice">
    Pick any Indian English female voice; clicking a card plays its preview. You will compare voices properly in lesson 3. Click **Next**.
  </Step>

  <Step title="Fill in the call context">
    These fields are what the template turns into a prompt. Enter:

    * **Company details**: `Acme Lending offers personal and two-wheeler loans across Maharashtra.`
    * **Purpose of the call**: `Remind the customer of their upcoming EMI and note the date they will pay.`

    Leave the custom variables and knowledge base as they are; part 3 covers both. Click **Create Assistant**.
  </Step>

  <Step title="Wait for the prompt">
    A progress screen shows while Ringg writes the prompt from your context, usually under a minute. Then you see **Assistant created** and the agent opens in the editor.
  </Step>
</Steps>

## Checkpoint

<Check>
  The editor's top bar shows **EMI reminder - Hindi** and a **Test assistant** button, and the **Prompt** section holds a first message and prompt sections. The agent also appears on the **Agents** page.
</Check>

## Exercise

Open **Create agent** again, pick the same Financial template, fill in **Agent basics**, click **Next**, then click **Back**. Expected result: the first step still shows the name, languages and voice you entered; **Back** returns without losing them. Close the dialog without creating a second agent.

## What you learned

* Every agent starts in the **Create Assistant** dialog, where the channel tab decides whether it calls, answers, runs on a web page or on WhatsApp.
* A template writes the first prompt from the call context you enter. You edit from there rather than from a blank page.
* Languages and voice are set at creation but can be changed later, so a wrong choice here costs nothing.

<Quiz
  question="Acme also wants an agent that answers calls from customers who ring the branch. In the Create Assistant dialog, what decides that?"
  answers={[
{ text: "The template you pick under Select industry templates", correct: false },
{ text: "The channel tab: Inbound instead of Outbound", correct: true },
{ text: "The Primary Language, since callers choose the language", correct: false },
{ text: "The voice, since an inbound agent needs a different one", correct: false },
]}
  correctFeedback="Right. The channel tab decides how conversations reach the agent: Outbound calls people, Inbound answers calls to a number attached to it. Templates, languages and voice can be changed later; the channel is the one choice made at creation."
  incorrectFeedback="Not quite. Templates write the first prompt, and languages and voice can be changed in the editor at any time. Whether an agent places calls or answers them is set by the channel tab at the top of the dialog."
/>

## Reference

<Columns cols={2}>
  <Card title="Create an agent" icon="bot" href="/documentation/build-agents/agents/create-an-agent" horizontal>
    Every field, the API call, and troubleshooting.
  </Card>

  <Card title="Agent types" icon="layers" href="/documentation/build-agents/agents/agent-types" horizontal>
    Outbound, inbound, web and WhatsApp agents, single- or multi-prompt.
  </Card>
</Columns>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.