<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Barsolasco, Dearah Mae</title>
    <description>The latest articles on DEV Community by Barsolasco, Dearah Mae (@dear-arah).</description>
    <link>https://dev.to/dear-arah</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2528537%2F4e8b67e7-2581-4a1e-9748-0a06f01dce88.jpg</url>
      <title>DEV Community: Barsolasco, Dearah Mae</title>
      <link>https://dev.to/dear-arah</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dear-arah"/>
    <language>en</language>
    <item>
      <title>Your Video Call Isn’t A Classroom. Here’s What It Is.</title>
      <dc:creator>Barsolasco, Dearah Mae</dc:creator>
      <pubDate>Thu, 10 Sep 2026 10:46:00 +0000</pubDate>
      <link>https://dev.to/dear-arah/your-video-call-isnt-a-classroom-heres-what-it-is-9c0</link>
      <guid>https://dev.to/dear-arah/your-video-call-isnt-a-classroom-heres-what-it-is-9c0</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7ga70myph77p5rask5ml.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7ga70myph77p5rask5ml.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
Every ed-tech team hits the same wall eventually: your video call works fine for a meeting, but a classroom needs more. A teacher who can promote a student's mic, a whiteboard that stays in sync for forty kids, breakout rooms that don't fall over. Building that stack from raw WebRTC is a semester-long project by itself. So instead of building it, I set out to stand up Agora's &lt;strong&gt;Flexible Classroom&lt;/strong&gt; (the desktop build) and see how far a&amp;nbsp;.env file and an afternoon could actually get me.&lt;/p&gt;

&lt;p&gt;It got me further than expected. This is the walkthrough I wish I'd had going in: what Flexible Classroom actually is, the exact steps that got it running locally, and, because a working demo isn't the same as a reason to use it, where this kind of setup earns its keep in the real world.&lt;/p&gt;
&lt;h2&gt;
  
  
  What you're actually installing
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1p93v7i8h7sp7uj1tavj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1p93v7i8h7sp7uj1tavj.png" alt=" " width="799" height="369"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Flexible Classroom&lt;/strong&gt; isn't a video-call widget you drop into a page. It's a pre-built classroom UI, with layouts, roles, and interaction patterns already assembled, sitting on top of Agora's real-time engine. Under the hood you get low-latency video and audio over Agora's SD-RTN, a real-time messaging channel for state sync, and an interactive whiteboard, all wrapped in scenarios the docs call "small classes," "1-on-1," and "lecture hall." This particular repo builds it as an Electron desktop client rather than a browser tab: same engine, packaged as a native app for Windows and macOS.&lt;/p&gt;

&lt;p&gt;**Why that distinction matters. **You're not writing signaling logic or reconnect handling. You're configuring credentials and picking a role. The trade-off is you inherit Agora's opinions about layout and UX, which is exactly what makes the "from scratch to first class" timeline realistic in an afternoon rather than a quarter.&lt;/p&gt;
&lt;h2&gt;
  
  
  What's actually inside&amp;nbsp;it
&lt;/h2&gt;

&lt;p&gt;Before touching a terminal, it's worth knowing what you're getting for that&amp;nbsp;.env file. Flexible Classroom ships as a set of pre-built scenes (the SDK in this repo alone is split into a classroom UI kit, an education-core state layer, and a real-time transport layer) bundled into four feature groups.&lt;/p&gt;
&lt;h2&gt;
  
  
  Communication
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftynje5lgf9ci6cffnumd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftynje5lgf9ci6cffnumd.png" alt=" " width="800" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live video &amp;amp; audio&lt;/strong&gt; over Agora's SD-RTN, tuned for classroom-scale participant counts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Screen sharing&lt;/strong&gt; for slides, code, or any application window&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shared whiteboard&lt;/strong&gt;, built in rather than bolted on: freehand drawing, shape and text tools, multi-page docs, and live PDF/image annotation, with every stroke mirrored to each participant in the room as it's drawn&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Built-in text chat&lt;/strong&gt; alongside the video layout: a room-wide channel plus 1:1 private messages, with teacher-side muting so a big room doesn't turn into noise&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Engagement
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hand-raise queue&lt;/strong&gt; so a teacher can bring one student on stage at a time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live polling&lt;/strong&gt; and **pop-up quizzes **pushed to every student mid-session, with results tallied in real time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reward/points system&lt;/strong&gt; for lightweight participation feedback&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Countdown timers&lt;/strong&gt; for timed exercises inside a live class&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Roles &amp;amp; management
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Teacher / Student / Assistant&lt;/strong&gt; roles, each with distinct permissions out of the box&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Attendance tracking&lt;/strong&gt; logged automatically per room&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mute, remove, or promote&lt;/strong&gt; any participant from the teacher console&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Session recording&lt;/strong&gt; for later playback or compliance&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Platform
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Three built-in scenarios&lt;/strong&gt; (1-on-1, small class, and lecture hall), each a different pre-tuned layout&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web, desktop (Electron), and mobile builds&lt;/strong&gt; from the same core SDK&lt;/li&gt;
&lt;li&gt;**Custom branding **via the UI kit's theming layer&lt;/li&gt;
&lt;li&gt;ISO / SOC 2-aligned security posture on the underlying Agora infrastructure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;1-on-1 tutoring → small class, ~50 students → lecture hall, large cohorts: same SDK, different scene config.&lt;/p&gt;
&lt;h2&gt;
  
  
  The optional layer: widgets and proctoring
&lt;/h2&gt;

&lt;p&gt;None of what's above is hard-wired into the layout. Every one of it, whiteboard included, is its own bundle in the SDK's plugin gallery, loaded per scene, which is what makes the next tier possible: features you only turn on for a specific kind of session.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftu18wiipmagdc99oykmv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftu18wiipmagdc99oykmv.png" alt=" " width="704" height="812"&gt;&lt;/a&gt;&lt;br&gt;
whiteboard · chatroom · vote / polling · answer / quiz · countdown counter · watermark · stream-media · webview embed&lt;/p&gt;
&lt;h2&gt;
  
  
  Proctoring (separate SDK)
&lt;/h2&gt;

&lt;p&gt;This is the one that's genuinely separate, not just switched off by default. It ships as its own package, agora-proctor-sdk, and even packages into its own standalone desktop client, distinct from the classroom app itself. It turns a room into an invigilated exam session rather than a lesson.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;**Locked-down exam view **replacing the normal classroom layout&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Continuous camera monitoring&lt;/strong&gt; for the duration of the session&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Same real-time transport&lt;/strong&gt; as the classroom SDK, so no separate infra to stand up&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Opt-in only&lt;/strong&gt;: it's a separate install, not a toggle inside a normal class&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Setting it up, step by&amp;nbsp;step
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Get the prerequisites in&amp;nbsp;place&lt;/strong&gt;&lt;br&gt;
Git, Node.js 16 specifically (18+ isn't supported yet), and Yarn. An Agora account with a project that has Flexible Classroom enabled in the console. And, less obviously, a connection with no firewall getting in the way of real-time media ports.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;enable &lt;/span&gt;yarn via corepack &lt;span class="o"&gt;(&lt;/span&gt;node 16.10+&lt;span class="o"&gt;)&lt;/span&gt; 

corepack &lt;span class="nb"&gt;enable&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Clone the desktop repo and pin the&amp;nbsp;release&lt;/strong&gt;&lt;br&gt;
I stayed on release/2.9.0. Matching what's actually deployed matters more than chasing main when you're evaluating the platform.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/AgoraIO-Community/flexible-classroom-desktop.git
&lt;span class="nb"&gt;cd &lt;/span&gt;flexible-classroom-desktop
git checkout release/2.9.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. Pull in the submodules&lt;/strong&gt;&lt;br&gt;
The classroom UI, the whiteboard bindings, and the Electron shell each live as their own package. This one command fetches and links all of it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn &lt;span class="nb"&gt;install&lt;/span&gt;:packages
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;4. Drop in your App ID and certificate&lt;/strong&gt;&lt;br&gt;
These come from the Agora Console project you enabled Flexible Classroom on. With both set, the client generates its own RTM token at runtime, so no separate auth step is needed for local testing.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="c"&gt;# .env
&lt;/span&gt;&lt;span class="py"&gt;REACT_APP_AGORA_APP_ID&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;{your app id}&lt;/span&gt;
&lt;span class="py"&gt;REACT_APP_AGORA_APP_CERTIFICATE&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;{your app certificate}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;5. Launch&amp;nbsp;it&lt;/strong&gt;&lt;br&gt;
This starts the dev build and serves the classroom UI locally.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn dev

http://localhost:3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;6. Prove it with two&amp;nbsp;roles&lt;/strong&gt;&lt;br&gt;
Join a room as Teacher in one window, then join the same room name as Student from a second window or device. This is the moment it stops being a config file and starts being a classroom: video tiles populate, the whiteboard syncs live, and the teacher can mute, promote, or hand off drawing control.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7. Optional: pack it as a native&amp;nbsp;client&lt;/strong&gt;&lt;br&gt;
Because this is the desktop variant, the same build can be shipped as an actual installable app rather than a browser tab.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn ci:build
yarn pack:electron:mac &lt;span class="c"&gt;# or pack:electron:win&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Before this touches real students&lt;/strong&gt;&lt;br&gt;
The bundled token generator is there so you can get to a working demo without standing up backend infrastructure first. It is not meant to survive contact with production. Swap it for a real token server before anyone outside your laptop joins a room.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this setup actually pays&amp;nbsp;off
&lt;/h2&gt;

&lt;p&gt;A working local build is a proof of concept. These are the shapes of the real deployments it's built for.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;K-12 remote &amp;amp; hybrid&amp;nbsp;classes&lt;/strong&gt;&lt;br&gt;
Small Class · Whiteboard&lt;/p&gt;

&lt;p&gt;One teacher, a full roster of students, and a whiteboard that needs to feel like the front of a real room, with hand-raising, mic control, and screen share included by default.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Corporate onboarding &amp;amp;&amp;nbsp;L&amp;amp;D&lt;/strong&gt;&lt;br&gt;
Lecture Hall · Recording&lt;/p&gt;

&lt;p&gt;Live cohort training where the same session needs to be recorded, replayed, and tracked for completion, without engineering a bespoke video pipeline for HR.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1-on-1 tutoring &amp;amp; exam&amp;nbsp;prep&lt;/strong&gt;&lt;br&gt;
1-on-1 · Low Latency&lt;/p&gt;

&lt;p&gt;Just a tutor and a student sharing an annotated whiteboard in real time. It's the lightest of the three modes, and the one where sub-second latency is felt the most.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bootcamps &amp;amp; lab&amp;nbsp;sections&lt;/strong&gt;&lt;br&gt;
Breakout · Electron&lt;/p&gt;

&lt;p&gt;Breakout groups working through an exercise while an instructor drops between rooms. Desktop packaging matters here since labs often run on locked-down campus machines.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd tell the next person doing&amp;nbsp;this
&lt;/h2&gt;

&lt;p&gt;Pin the Node version before you do anything else. Node 18 will get you an install that looks fine and a runtime that isn't. Past that, the honest surprise wasn't the video or the audio, both of which just worked; it was the whiteboard staying pixel-in-sync between a teacher window and a student window on different machines, with nothing I had to configure for it. That's the actual pitch for a platform like this: not that it saves you from writing video code, but that it saves you from debugging the failure modes of video code you didn't write carefully enough the first time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.agora.io/en/realtime-media/flexible-classroom/reference/downloads/web" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;F&lt;a href="https://docs.agora.io/en/realtime-media/flexible-classroom/product-overview" rel="noopener noreferrer"&gt;CR Overview&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.agora.io/en/realtime-media/flexible-classroom/quickstart" rel="noopener noreferrer"&gt;FCR Demo Quickstart&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.agora.io/en/realtime-media/flexible-classroom/build/integrate-the-sdks/integrate-flexible-classroom/web" rel="noopener noreferrer"&gt;Integrate Classroom SDK&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;#Agora #FlexibleClassroom #FlexibleOnlineClasroom #ConversationalAI #RTC #Real-Time-Communication #Real-Time-Engagement&lt;/em&gt;&lt;/p&gt;

</description>
      <category>agora</category>
      <category>realtimecommunication</category>
      <category>flexibleclassroom</category>
      <category>ai</category>
    </item>
    <item>
      <title>I Built a Voice-Based Daily Reflection Companion under 15 Minutes Using Agora Agents SDK</title>
      <dc:creator>Barsolasco, Dearah Mae</dc:creator>
      <pubDate>Thu, 10 Sep 2026 10:17:33 +0000</pubDate>
      <link>https://dev.to/dear-arah/i-built-a-voice-based-daily-reflection-companion-under-15-minutes-using-agora-agents-sdk-4eki</link>
      <guid>https://dev.to/dear-arah/i-built-a-voice-based-daily-reflection-companion-under-15-minutes-using-agora-agents-sdk-4eki</guid>
      <description>&lt;p&gt;I expected to spend a weekend on working on my vision. Instead, I had a voice agent asking me "How was your day?" in under 15 minutes. What surprised me most wasn't the speed - it was that when I interrupted the voice AI agent I named "Compass" mid-sentence to change my answer, she just stopped and listened. No stuttering, no doubled audio, no ghost speech finishing in the background. It just worked, out of the box, without a single line of interruption-handling code on my end.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Faiow3gvuzw4r71foz1s2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Faiow3gvuzw4r71foz1s2.png" alt=" " width="800" height="361"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Voice Agents Are Still a Pain to Build (Normally)
&lt;/h2&gt;

&lt;p&gt;If you've tried to build a voice agent from scratch, you know the pipeline looks deceptively simple on a whiteboard: speech in, text to LLM, speech out. The reality is messier.&lt;/p&gt;

&lt;p&gt;You need a WebRTC or WebSocket layer to stream audio in real time. You need to integrate STT (and handle partial transcripts), stream tokens to TTS, manage token refresh, handle network retries, detect when the user starts speaking mid-sentence, and somehow prevent the agent from continuing its TTS output while the user is already replying. That's before you write a single line of actual product logic.&lt;/p&gt;

&lt;p&gt;The Agora Agents SDK removes every item on that list. It's built on top of Agora's existing RTC infrastructure, which is the same real-time communications network that powers video calling for hundreds of millions of users. The SDK wraps that into a Python (or TypeScript or Go) library where you describe &lt;em&gt;what&lt;/em&gt; your agent should do, not &lt;em&gt;how&lt;/em&gt; the audio pipeline should work.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I&amp;nbsp;Built
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Daily Reflection Companion&lt;/strong&gt;&lt;br&gt;
a voice AI named Compass that guides users through a structured end-of-day reflection: a daily check-in, a meaningful moment exploration, a gratitude round, a forward intention, and then an AI-generated written summary of the conversation.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Backend&lt;/strong&gt;: Python + FastAPI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent pipeline&lt;/strong&gt;: Deepgram STT → OpenAI GPT-4o-mini → MiniMax TTS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend&lt;/strong&gt;: HTML/JS + Agora Web SDK (no build tooling)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Phase 1: Setup - From Zero to First&amp;nbsp;Voice
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Install&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;agora-agents fastapi uvicorn[standard] python-dotenv openai
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;That's it. The SDK installs in under 10 seconds. Imports are under &lt;code&gt;agora_agent&lt;/code&gt; (note: no hyphen at import time).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Credentials You'll&amp;nbsp;Need&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a free account @&lt;a href="https://console.agora.io" rel="noopener noreferrer"&gt;console.agora.io&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Create a project, and enable the &lt;strong&gt;Conversational AI&lt;/strong&gt; feature.&lt;/li&gt;
&lt;li&gt;You'll get an &lt;strong&gt;App ID&lt;/strong&gt; and an &lt;strong&gt;App Certificate&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;You also need an &lt;strong&gt;&lt;a href="http://platform.openai.com/api-keys" rel="noopener noreferrer"&gt;OpenAI API key&lt;/a&gt;&lt;/strong&gt; (for the LLM and for generating the post-session summary) and &lt;strong&gt;&lt;a href="http://console.deepgram.com" rel="noopener noreferrer"&gt;DeepGram API key&lt;/a&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Copy your &lt;code&gt;.env.example&lt;/code&gt; to &lt;code&gt;.env&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="py"&gt;AGORA_APP_ID&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;your_app_id&lt;/span&gt;
&lt;span class="py"&gt;AGORA_APP_CERTIFICATE&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;your_certificate&lt;/span&gt;
&lt;span class="py"&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;sk-…&lt;/span&gt;
&lt;span class="py"&gt;DEEPGRAM_API_KEY&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;your_deepgram_key&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The Agora console's Conversational AI toggle is not prominently labelled. I spent about 4 minutes finding it - it lives under &lt;em&gt;&lt;em&gt;Project Settings → Features&lt;/em&gt;&lt;/em&gt;. Once enabled, everything worked on the first try.&lt;/p&gt;
&lt;h2&gt;
  
  
  Phase 2: The Core&amp;nbsp;Code
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The builder&amp;nbsp;chain&lt;/strong&gt;&lt;br&gt;
The entire STT → LLM → TTS pipeline is configured in one fluent chain. Here's the real code from &lt;a href="//agent.py"&gt;agent.py&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;agora_agent&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Agora&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Area&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;DeepgramSTT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;AgoraOpenAI&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;MiniMaxTTS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;expires_in_hours&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agora&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;area&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;Area&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;US&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;app_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;app_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;app_certificate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;app_certificate&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;turn_detection&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;language&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;en-US&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;with_stt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;DeepgramSTT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;nova-3&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;language&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;en&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;with_llm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nc"&gt;AgoraOpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4o-mini&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;system_messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;system&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;REFLECTION_SYSTEM_PROMPT&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="n"&gt;greeting_message&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello! I&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;m Compass. How was your day today?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;failure_message&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;I didn&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;t quite catch that. Could you say that again?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;max_history&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;max_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;150&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;temperature&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.75&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;with_tts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;MiniMaxTTS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;speech_2_6_turbo&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;voice_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;English_captivating_female1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Every line is intentional:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;turn_detection={"language": "en-US"}&lt;/code&gt; - tells the VAD (Voice Activity Detection) which language's speech patterns to use for end-of-turn detection. This directly affects how quickly the agent recognises you've finished speaking.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;max_history=50&lt;/code&gt; - the agent's LLM receives up to 50 turns of conversation as context. Critical for a reflection agent that needs to remember what was said early in the session.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;max_tokens=150&lt;/code&gt; - voice replies need to be short. Capping at 150 tokens enforces this at the model level, not just the prompt.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;greeting_message&lt;/code&gt; - the agent speaks this immediately when the session starts, without waiting for the user to speak first. No extra &lt;code&gt;session.say()&lt;/code&gt; call needed.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  The System Prompt (condensed)
&lt;/h2&gt;

&lt;p&gt;The reflection flow is driven entirely by the LLM system prompt. No explicit state machine, no conditional logic in the server code. The prompt instructs the agent to move through five phases naturally:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PHASE 1 - DAILY CHECK-IN: Ask one meaningful follow-up after the user's response.
PHASE 2 - MEANINGFUL MOMENT: Explore one significant experience.
PHASE 3 - GRATITUDE: Ask for 2–3 things they're thankful for.
PHASE 4 - TOMORROW'S INTENTION: Ask for one thing they'd like to carry forward.
PHASE 5 - CLOSING: Offer a warm, personalised goodbye.
VOICE RULES: Keep all responses under 35 words. One question per turn. No markdown.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The "under 35 words" constraint was the most important prompt engineering decision. Voice synthesis doesn't render markdown, and long replies feel like lectures, not conversations.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;Starting&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="err"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="n"&gt;Session&lt;/span&gt;
&lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_session&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="n"&gt;channel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reflection-&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;agent_uid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;999&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;remote_uids&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="n"&gt;idle_timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;expires_in&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;expires_in_hours&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;agent_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;code&gt;session.start()&lt;/code&gt; is a single blocking call that provisions the agent, connects it to the RTC channel, and returns an &lt;code&gt;agent_id&lt;/code&gt;. The channel name is how the browser's Agora Web SDK joins the same audio room.&lt;/p&gt;
&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;After the conversation ends, I call &lt;code&gt;session.get_history()&lt;/code&gt; to retrieve the transcript and send it to GPT-4o-mini with a structured summary prompt:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;history&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_history&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;# Format turns into a readable transcript, then:
&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;openai_client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4o-mini&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;system&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;SUMMARY_PROMPT&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Transcript:&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;transcript&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="n"&gt;max_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The summary appears on-screen after the session ends - a written record of what you reflected on. This is the feature that makes this more than a demo.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Browser Client (key&amp;nbsp;parts)
&lt;/h2&gt;

&lt;p&gt;The browser uses the Agora Web SDK (loaded from CDN - no npm, no webpack) to join the same RTC channel:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Create client and join&lt;/span&gt;
&lt;span class="nx"&gt;rtcClient&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;AgoraRTC&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createClient&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;rtc&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;codec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;vp8&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;rtcClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;app_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;token&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;uid&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// Publish microphone&lt;/span&gt;
&lt;span class="nx"&gt;localMicTrack&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;AgoraRTC&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createMicrophoneAudioTrack&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
&lt;span class="na"&gt;encoderConfig&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;speech_standard&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;rtcClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;publish&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;localMicTrack&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// Subscribe to agent's audio and play it&lt;/span&gt;
&lt;span class="nx"&gt;rtcClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user-published&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;mediaType&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mediaType&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;audio&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;rtcClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;audio&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;audioTrack&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;play&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Three async calls: &lt;code&gt;join&lt;/code&gt;, &lt;code&gt;publish&lt;/code&gt;, &lt;code&gt;subscribe&lt;/code&gt;. That's the entire WebRTC layer.&lt;/p&gt;
&lt;h2&gt;
  
  
  Phase 3: Real-Time Feel - The Part That Actually&amp;nbsp;Matters
&lt;/h2&gt;

&lt;p&gt;Once the pipeline runs, the question that matters is: does it feel like a real conversation?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Turn-taking&lt;/strong&gt;&lt;br&gt;
The Deepgram nova-3 model detects end-of-speech accurately. Compass waits for me to finish, then responds within about 1.2–1.8 seconds (STT transcription + LLM generation + TTS synthesis). Agora's published benchmark is &amp;lt;650ms end-to-end - I measured closer to 1.2–1.5s for GPT-4o-mini with MiniMax TTS, which still feels conversational rather than laggy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Interruption test&lt;/strong&gt;&lt;br&gt;
This is where I was genuinely surprised. I spoke over Compass mid-sentence. She stopped. Immediately, cleanly, no audio bleed. I tried this five times with different timing - sometimes right as she started a word, sometimes deep into a sentence. Every time the cut was instant.&lt;br&gt;
This is handled entirely by Agora's RTC infrastructure and the VAD layer. I wrote zero interruption-handling code. It just worked.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conversation quality&lt;/strong&gt;&lt;br&gt;
The reflection flow felt natural across few turns. The agent stayed on-topic, transitioned between phases at the right moments, and the "under 35 words" constraint kept responses appropriately brief for voice. The one area that needed tuning: Compass occasionally asked two questions in one turn early in testing (prompt refinement fixed this with a firm "Ask only ONE question per turn" rule).&lt;/p&gt;
&lt;h2&gt;
  
  
  Sample Demo
&lt;/h2&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://drive.google.com/file/d/1JD9224kekJ3bR6RbwoLuqWfeqInb467G/view?usp=drive_link" rel="noopener noreferrer" class="c-link"&gt;
            Daily Companion AI.mp4 - Google Drive
          &lt;/a&gt;
        &lt;/h2&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fssl.gstatic.com%2Fdocs%2Fdoclist%2Fimages%2Fdrive_favicon_2026_32dp.png" width="32" height="32"&gt;
          drive.google.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;Built with Agora Agents SDK (Python) + OpenAI GPT-4o-mini + Deepgram STT + MiniMax TTS&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Phase 4: Honest&amp;nbsp;Verdict
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What's genuinely great&lt;/strong&gt;&lt;br&gt;
The builder pattern is the right abstraction. Instead of wiring five services together yourself, you declare your pipeline and the SDK handles transport, buffering, retries, and token refresh. &lt;br&gt;
Interruption handling working out of the box is not a small thing - in a DIY build, that's easily a full day of work.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;session.think()&lt;/code&gt; (not demonstrated in this project's MVP but available) is a powerful primitive: you can inject mid-session instructions into the LLM without the agent speaking them aloud. For a more sophisticated reflection agent, this could be used to nudge the agent toward a specific phase based on time elapsed.&lt;br&gt;
&lt;strong&gt;What could be&amp;nbsp;better&lt;/strong&gt;&lt;br&gt;
*&lt;em&gt;The gap between quickstart and production. **The CLI quickstart (&lt;code&gt;agora init&lt;/code&gt;) scaffolds a working app fast, but the gap from that template to understanding *why&lt;/em&gt; each piece exists is steep. Better intermediate documentation (not just API reference, not just quickstart) would help.&lt;/p&gt;

&lt;p&gt;**&lt;code&gt;get_history()&lt;/code&gt; response format. **The method exists and works, but the response shape isn't clearly documented. I had to handle three possible formats defensively. This is the kind of thing that adds 30 minutes to an otherwise 5-minute task.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Error specificity.&lt;/strong&gt; When I accidentally misconfigured my App Certificate, the error was a generic 401. A message like "App Certificate mismatch - check AGORA_APP_CERTIFICATE in your environment" would have saved 10 minutes of debugging.&lt;/p&gt;

&lt;p&gt;These are fixable problems, not fundamental ones. The core pipeline is rock-solid.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;I started this build expecting to spend most of my time on infrastructure. Instead, I spent most of it on the part that matters - the conversation design, the system prompt, the reflection flow. That's the correct trade-off, and the SDK made it possible.&lt;/p&gt;

&lt;p&gt;The Agora Agents SDK doesn't replace the REST API - it's built on top of it, and REST stays fully supported. What it does is remove the RTC plumbing so you can focus on what your agent should say and feel like, not on how audio bytes travel between browser and model.&lt;/p&gt;

&lt;p&gt;For a real-time voice product where interruption, latency, and audio quality matter, the infrastructure Agora provides is serious. For a developer who wants to build that product in an afternoon rather than a week, this SDK is the fastest path I've found.&lt;/p&gt;

&lt;h2&gt;
  
  
  Run It&amp;nbsp;Yourself
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;agora-agents fastapi uvicorn[standard] python-dotenv openai
&lt;span class="nb"&gt;cp&lt;/span&gt; .env.example .env
&lt;span class="c"&gt;# Fill in your API keys&lt;/span&gt;
uvicorn main:app - reload
&lt;span class="c"&gt;# Open http://localhost:8000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;GitHub (Python SDK):&lt;/strong&gt; &lt;a href="https://github.com/AgoraIO/agora-agents-python" rel="noopener noreferrer"&gt;https://github.com/AgoraIO/agora-agents-python&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;#VoiceAI #AIagents #Agora #ConversationalAI #ConvoAI #OpenAI #Agora #TTS #STT&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>agora</category>
      <category>convoai</category>
    </item>
    <item>
      <title>A Quick Start on Amazon Lightsail ☁️⚡</title>
      <dc:creator>Barsolasco, Dearah Mae</dc:creator>
      <pubDate>Fri, 20 Dec 2024 04:42:53 +0000</pubDate>
      <link>https://dev.to/dear-arah/a-quick-start-on-amazon-lightsail-51ff</link>
      <guid>https://dev.to/dear-arah/a-quick-start-on-amazon-lightsail-51ff</guid>
      <description>&lt;p&gt;Hello, fellow tech enthusiasts! Like me, are you someone who has &lt;strong&gt;just started&lt;/strong&gt; their tech journey and exploration in cloud computing🤓☝🏻? Well, don't worry. &lt;strong&gt;Amazon Lightsail&lt;/strong&gt; is the perfect platform to begin your cloud journey!&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Amazon Lightsail🤔?
&lt;/h2&gt;

&lt;p&gt;Amazon Lightsail offers core services in a &lt;u&gt;simplified&lt;/u&gt; approach, so you can deploy and manage your applications that do not require massive computing power and scaling.&lt;br&gt;
&lt;br&gt;&lt;br&gt;
Here are the high-level features offered by Lightsail:&lt;br&gt;
-&lt;strong&gt;Instances:&lt;/strong&gt; Easy-to-set-up virtual servers for various applications.&lt;br&gt;
-&lt;strong&gt;Containers:&lt;/strong&gt; Run containerized applications securely in the cloud.&lt;br&gt;
-&lt;strong&gt;Load Balancers:&lt;/strong&gt; Distribute web traffic for improved performance and reliability.&lt;br&gt;
-&lt;strong&gt;Managed Databases:&lt;/strong&gt; Fully managed MySQL or PostgreSQL databases.&lt;br&gt;
-&lt;strong&gt;Block and Object Storage:&lt;/strong&gt; Scalable storage options for various needs.&lt;br&gt;
-&lt;strong&gt;CDN Distributions:&lt;/strong&gt; Global content delivery network for faster website access.&lt;br&gt;
-&lt;strong&gt;AWS Integration:&lt;/strong&gt; Access to a wider range of AWS services through VPC peering.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀Get Started with Lightsail!
&lt;/h2&gt;

&lt;p&gt;Here is the walkthrough on how you can set up your Amazon Lightsail ready for your website's deployment. But, if you don't have your website files ready, it is perfectly fine. We are here to learn how we can set up our instances. &lt;br&gt;
&lt;br&gt;&lt;br&gt;
&lt;strong&gt;What is an Instance?&lt;/strong&gt; : An &lt;strong&gt;instance&lt;/strong&gt; in cloud computing is like a virtual server provided by a cloud service. Instead of owning and maintaining physical servers, you rent these virtual servers from cloud providers to run tasks like apps, databases, or virtual machines.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;p&gt;1.) &lt;strong&gt;Access Amazon Lightsail&lt;/strong&gt;&lt;br&gt;
After logging in to your AWS Account, search for ‘Amazon Lightsail’ or ‘Lightsail’ on the search bar or from your AWS Console. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc888xefxoue623flvt3b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc888xefxoue623flvt3b.png" alt="Image description" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
2.) &lt;strong&gt;Create Your Instance&lt;/strong&gt;&lt;br&gt;
In the Lightsail dashboard, click "&lt;u&gt;Create instance&lt;/u&gt;".&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4wkf1gdo48je3wzq7xte.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4wkf1gdo48je3wzq7xte.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
3.) &lt;strong&gt;Choose Region and Availability Zone&lt;/strong&gt;&lt;br&gt;
Select a region close to your target audience for better performance. I chose Singapore because it is the closest, therefore, providing low latency.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fadxictxw3lg34r3vyur5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fadxictxw3lg34r3vyur5.png" alt="Image description" width="800" height="489"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
4.) &lt;strong&gt;Select Platform and Blueprint&lt;/strong&gt;&lt;br&gt;
Linux/Unix: For PHP, Python, or Node.js applications.&lt;br&gt;
Windows: For ASP.NET applications.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fphjl6pef8v7xwv09k4od.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fphjl6pef8v7xwv09k4od.png" alt="Image description" width="800" height="146"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
You can use the pre-configured blueprints like Wordpress, LAMP, and Node.js. I chose Node.js for my MERN App for example.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxcgdjjfrpopum7p72w9e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxcgdjjfrpopum7p72w9e.png" alt="Image description" width="800" height="384"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
5.) &lt;strong&gt;SSH Keys&lt;/strong&gt;&lt;br&gt;
An SSH key is like a digital passcode that lets you securely access a computer or server. You can configure your SSH Key Pairs and create a new one. For demonstration purposes, I created an SSH Key Pair named it as "Website".&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flcyj5m48xy9l5qief28j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flcyj5m48xy9l5qief28j.png" alt="Image description" width="800" height="232"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4r71ru97qwaljpf1c3r8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4r71ru97qwaljpf1c3r8.png" alt="Image description" width="643" height="331"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
6.) &lt;strong&gt;Choose Your Instance Plan&lt;/strong&gt;&lt;br&gt;
You can adjust the pricing plan based on your needs. For now, I chose the default plan.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw6qj2fryqke0owvh6swk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw6qj2fryqke0owvh6swk.png" alt="Image description" width="800" height="649"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
7.) &lt;strong&gt;Name Your Instance&lt;/strong&gt;&lt;br&gt;
You can create a unique name for your instance. For mine, I named my instance as "website". You can also assign labels to your resources using the tagging options.&lt;br&gt;
&lt;br&gt;&lt;br&gt;
After completing the steps above, you may now click "&lt;strong&gt;Create Instance&lt;/strong&gt;" to finish the process of creating your instance.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F20mdxa5h5dbq9ttnupfw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F20mdxa5h5dbq9ttnupfw.png" alt="Image description" width="800" height="565"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Congratulations&lt;/strong&gt;🎉! You have just created your first instance (&lt;em&gt;me too&lt;/em&gt;)!&lt;/p&gt;

&lt;p&gt;You can configure other settings as you click your created instance on the Lightsail console.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6z6gexo733mblm7pbegh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6z6gexo733mblm7pbegh.png" alt="Image description" width="800" height="582"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
You can also connect using &lt;strong&gt;SSH&lt;/strong&gt;, which will open a new terminal window where you can authenticate using your SSH keys to securely access and manage your Lightsail instance. Once connected, you can run commands, configure your server, upload files, or troubleshoot issues directly on the server.&lt;br&gt;
&lt;br&gt;&lt;br&gt;
&lt;strong&gt;SSH&lt;/strong&gt;, or Secure Shell, is a cryptographic network protocol that allows secure communication between a client and a server. It’s commonly used for remotely managing servers and transferring files over an encrypted connection.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7ec3rp07bpl62c3ddy4t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7ec3rp07bpl62c3ddy4t.png" alt="Image description" width="800" height="627"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
You can also create &lt;strong&gt;snapshots&lt;/strong&gt; to back up your instances or disk. Snapshots allow you to restore your data based on the latest saved state.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr9o642suaq9u0dby9ccq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr9o642suaq9u0dby9ccq.png" alt="Image description" width="800" height="357"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
You can also give it a name. After that, the loading process may take a few minutes depending on the instance or disk size. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu4mrwie7b0b2rqexxtxu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu4mrwie7b0b2rqexxtxu.png" alt="Image description" width="710" height="292"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs5vsncdhd9frixm10upk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs5vsncdhd9frixm10upk.png" alt="Image description" width="736" height="218"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi8xbuhusqthd3cmov2zk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi8xbuhusqthd3cmov2zk.png" alt="Image description" width="680" height="107"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Lightsail is a beginner-friendly platform😊, offering everything from pre-configured blueprints to easy-to-use features like SSH connections and snapshots, and scalable pricing plans. Whether you are hosting a small website or you simply just want to deploy a simple app that you have created, Lightsail provides reliable and efficient support for your goals.&lt;br&gt;
&lt;br&gt;&lt;br&gt;
&lt;strong&gt;What I could have done differently:&lt;/strong&gt;  Because of my limited knowledge in programming and in cloud computing, I hope that I could've demonstrated and deployed a simple application or website that I have created. But nonetheless, experiencing Amazon Console with freedom and being able to create an instance using a service was already a humbling and winning experience for me🌟.&lt;/p&gt;

</description>
      <category>lightsail</category>
      <category>aws</category>
      <category>beginners</category>
      <category>cloudcomputing</category>
    </item>
  </channel>
</rss>
