<?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: Anurag Kanojiya</title>
    <description>The latest articles on DEV Community by Anurag Kanojiya (@anuragkanojiya).</description>
    <link>https://dev.to/anuragkanojiya</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1818330%2Ffd773312-6e02-41f0-95fc-248d031f3a7d.png</url>
      <title>DEV Community: Anurag Kanojiya</title>
      <link>https://dev.to/anuragkanojiya</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/anuragkanojiya"/>
    <language>en</language>
    <item>
      <title>How to Dynamically Change App Language in Jetpack Compose (Modern Android Guide) 🚀🌏</title>
      <dc:creator>Anurag Kanojiya</dc:creator>
      <pubDate>Sat, 14 Mar 2026 22:43:27 +0000</pubDate>
      <link>https://dev.to/anuragkanojiya/how-to-dynamically-change-app-language-in-jetpack-compose-modern-android-guide-ee2</link>
      <guid>https://dev.to/anuragkanojiya/how-to-dynamically-change-app-language-in-jetpack-compose-modern-android-guide-ee2</guid>
      <description>&lt;p&gt;Many apps today let users &lt;strong&gt;choose their preferred language directly inside the app&lt;/strong&gt; — not just rely on the device language.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Someone learning a language may want the app in &lt;strong&gt;Spanish&lt;/strong&gt; 🇪🇸&lt;/li&gt;
&lt;li&gt;Or you might simply want to &lt;strong&gt;test translations during development&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Good news: modern Android provides a &lt;strong&gt;clean official way to change app language dynamically&lt;/strong&gt; using &lt;strong&gt;AppCompat 1.6+&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Let's implement it step by step. 👇&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Step 1 — Add AppCompat
&lt;/h2&gt;

&lt;p&gt;First, you need the &lt;strong&gt;AppCompat library&lt;/strong&gt; because the locale API lives there.&lt;/p&gt;

&lt;p&gt;Add this dependency:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="nf"&gt;implementation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"androidx.appcompat:appcompat:1.6.1"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you're using &lt;strong&gt;Version Catalogs&lt;/strong&gt; it may look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="nf"&gt;implementation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;libs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;androidx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;appcompat&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧩 Step 2 — Use &lt;code&gt;AppCompatActivity&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;To enable the locale API, your &lt;strong&gt;MainActivity must extend &lt;code&gt;AppCompatActivity&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Replace this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MainActivity&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;ComponentActivity&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;with this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MainActivity&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;AppCompatActivity&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;onCreate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;savedInstanceState&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Bundle&lt;/span&gt;&lt;span class="p"&gt;?)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;onCreate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;savedInstanceState&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it — now your app can use &lt;strong&gt;AppCompat locale management&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🌐 Step 3 — Add Language Resources
&lt;/h2&gt;

&lt;p&gt;Now we define &lt;strong&gt;localized strings&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Inside the &lt;code&gt;res&lt;/code&gt; folder, create resource directories using language qualifiers like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;values/strings.xml
values-hi/strings.xml
values-bn/strings.xml
values-ta/strings.xml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example:&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;string&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"hello"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Hello&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;string&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"hello"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;hola&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Android automatically loads the correct translation depending on the selected locale.&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%2Fu4x1x7inhc9v0fdhahek.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%2Fu4x1x7inhc9v0fdhahek.png" alt="Language qualifiers example" width="800" height="391"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 Step 4 — Create a Language Manager
&lt;/h2&gt;

&lt;p&gt;Instead of repeating locale logic everywhere, we create a small &lt;strong&gt;LanguageManager helper&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;object&lt;/span&gt; &lt;span class="nc"&gt;LanguageManager&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;setLanguage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;locale&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;LocaleListCompat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forLanguageTags&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nc"&gt;AppCompatDelegate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setApplicationLocales&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;locale&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;resetToSystem&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;AppCompatDelegate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setApplicationLocales&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="nc"&gt;LocaleListCompat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getEmptyLocaleList&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  What this does
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;setApplicationLocales()&lt;/code&gt; tells Android:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Hey, switch the entire app to this locale."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Android then &lt;strong&gt;refreshes the UI automatically&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Super clean ✨&lt;/p&gt;




&lt;h2&gt;
  
  
  📦 Step 5 — Create a Language Model
&lt;/h2&gt;

&lt;p&gt;Next, let's define a simple data model.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;data class&lt;/span&gt; &lt;span class="nc"&gt;AppLanguage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;code&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now define the languages supported by your app:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;languages&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;listOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nc"&gt;AppLanguage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"English"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nc"&gt;AppLanguage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"hi"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Hindi"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nc"&gt;AppLanguage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"as"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Assamese"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nc"&gt;AppLanguage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"bn"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Bengali"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nc"&gt;AppLanguage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"gu"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Gujarati"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nc"&gt;AppLanguage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"kn"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Kannada"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nc"&gt;AppLanguage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"ml"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Malayalam"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nc"&gt;AppLanguage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"mr"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Marathi"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nc"&gt;AppLanguage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"or"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Odia"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nc"&gt;AppLanguage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"pa"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Punjabi"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nc"&gt;AppLanguage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"ta"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Tamil"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nc"&gt;AppLanguage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"te"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Telugu"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nc"&gt;AppLanguage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"ur"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Urdu"&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;These language codes match the &lt;strong&gt;resource folder qualifiers&lt;/strong&gt; (&lt;code&gt;values-hi&lt;/code&gt;, &lt;code&gt;values-es&lt;/code&gt;, etc.).&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 Step 6 — Change Language from UI
&lt;/h2&gt;

&lt;p&gt;Now the fun part.&lt;/p&gt;

&lt;p&gt;You can change the language &lt;strong&gt;from onboarding, settings, or anywhere in your app&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="nc"&gt;LanguageManager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setLanguage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"hi"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or if you're showing a list of languages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="n"&gt;languages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;language&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt;
    &lt;span class="nc"&gt;LanguageManager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setLanguage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;language&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;code&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;Example button:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="nc"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;onClick&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;LanguageManager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setLanguage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"hi"&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="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Switch to Hindi"&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;Once triggered, Android will:&lt;/p&gt;

&lt;p&gt;1️⃣ Change the locale&lt;br&gt;
2️⃣ Reload resources&lt;br&gt;
3️⃣ Update UI automatically&lt;/p&gt;

&lt;p&gt;No manual activity restart required 🎉&lt;/p&gt;


&lt;h2&gt;
  
  
  🔄 Reset Language to System Default
&lt;/h2&gt;

&lt;p&gt;If the user wants the app to follow the &lt;strong&gt;device language&lt;/strong&gt;, just call:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="nc"&gt;LanguageManager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resetToSystem&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Android will switch back to the &lt;strong&gt;system locale&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚡ Why This Approach Is Great
&lt;/h2&gt;

&lt;p&gt;Using &lt;code&gt;AppCompatDelegate.setApplicationLocales()&lt;/code&gt; gives you:&lt;/p&gt;

&lt;p&gt;✅ Official AndroidX solution&lt;br&gt;
✅ Works with &lt;strong&gt;Jetpack Compose + Views&lt;/strong&gt;&lt;br&gt;
✅ No deprecated locale hacks&lt;br&gt;
✅ Automatic UI refresh&lt;br&gt;
✅ Clean and maintainable code&lt;/p&gt;




&lt;h2&gt;
  
  
  🎉 Final Result
&lt;/h2&gt;

&lt;p&gt;Your app now supports:&lt;/p&gt;

&lt;p&gt;🌍 Dynamic language switching&lt;br&gt;
⚡ Instant UI updates&lt;br&gt;
📱 System language fallback&lt;br&gt;
🧩 Clean architecture&lt;/p&gt;

&lt;p&gt;All with &lt;strong&gt;just a few lines of code&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  💡 Pro Tip
&lt;/h2&gt;

&lt;p&gt;If you want the language to persist across app restarts, store the selected language in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DataStore&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then apply it when the app launches.&lt;/p&gt;




&lt;p&gt;That's it!&lt;/p&gt;

&lt;p&gt;Your Android app is now &lt;strong&gt;ready for global users&lt;/strong&gt; 🌎&lt;/p&gt;

&lt;h2&gt;
  
  
  🧑‍💻 Author
&lt;/h2&gt;

&lt;p&gt;Anurag Kanojiya — Android app Developer | Kotlin | KMP | Java | Spring Boot&lt;/p&gt;

&lt;p&gt;• &lt;a href="https://x.com/AnuKanojiya829" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; • &lt;a href="https://linkedin.com/in/anurag-kanojiya-101312286" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; • &lt;a href="https://github.com/anuragkanojiya1" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

</description>
      <category>android</category>
      <category>kotlin</category>
      <category>jetpackcompose</category>
      <category>mobile</category>
    </item>
    <item>
      <title>🎬 Semantic Search for Movies &amp; Series with MindsDB and FastAPI</title>
      <dc:creator>Anurag Kanojiya</dc:creator>
      <pubDate>Sun, 29 Jun 2025 16:34:19 +0000</pubDate>
      <link>https://dev.to/anuragkanojiya/semantic-search-for-movies-series-with-mindsdb-and-fastapi-g39</link>
      <guid>https://dev.to/anuragkanojiya/semantic-search-for-movies-series-with-mindsdb-and-fastapi-g39</guid>
      <description>&lt;p&gt;In this post, I’ll walk you through the FastAPI-based backend of BingeMate and how it integrates with &lt;strong&gt;MindsDB&lt;/strong&gt; to enable &lt;strong&gt;semantic search&lt;/strong&gt;, &lt;strong&gt;metadata filtering&lt;/strong&gt;, and even &lt;strong&gt;conversational agent responses&lt;/strong&gt; using a SQL-powered interface.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 What Is BingeMate?
&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.amazonaws.com%2Fuploads%2Farticles%2F7w090jc6l00x87b0gv6m.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%2F7w090jc6l00x87b0gv6m.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BingeMate&lt;/strong&gt; is a semantic search and recommendation engine that helps users find the perfect movie or series using natural language queries like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Top-rated Netflix thrillers after 2020”&lt;/li&gt;
&lt;li&gt;“Feel-good anime with high IMDb ratings”&lt;/li&gt;
&lt;li&gt;“Is ‘Dark’ similar to ‘Stranger Things’?”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The backend is powered by &lt;strong&gt;FastAPI&lt;/strong&gt; and connects to a &lt;strong&gt;MindsDB knowledge base&lt;/strong&gt;, which stores semantically indexed chunks of content using LLMs and vectors.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/anuragkanojiya1" rel="noopener noreferrer"&gt;
        anuragkanojiya1
      &lt;/a&gt; / &lt;a href="https://github.com/anuragkanojiya1/BingeMate-Backend" rel="noopener noreferrer"&gt;
        BingeMate-Backend
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      This project is a FastAPI backend for BingeMate
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;⚙️ BingeMate-Backend&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;This project is a FastAPI backend for &lt;a href="https://github.com/anuragkanojiya1/BingeMate" rel="noopener noreferrer"&gt;BingeMate&lt;/a&gt; querying a &lt;strong&gt;MindsDB Knowledge Base&lt;/strong&gt; powered by &lt;strong&gt;Ollama LLMs&lt;/strong&gt; and embedding models. It integrates:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;🌐 FastAPI backend&lt;/li&gt;
&lt;li&gt;🧠 MindsDB KB, Jobs, Agent&lt;/li&gt;
&lt;li&gt;🦙 Ollama (Mistral + Granite embedding)&lt;/li&gt;
&lt;li&gt;🐳 Docker for environment management&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Demo Video&lt;/th&gt;
&lt;th&gt;Blog Post&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://youtu.be/QCIXBK0dxEs?si=rYhLqLZQ6KfP0onP" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprivate-user-images.githubusercontent.com%2F144598258%2F460989358-6cf3059f-84e8-4800-bade-11bd46a5f2e5.png%3Fjwt%3DeyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzQ2NTAxNDQsIm5iZiI6MTc3NDY0OTg0NCwicGF0aCI6Ii8xNDQ1OTgyNTgvNDYwOTg5MzU4LTZjZjMwNTlmLTg0ZTgtNDgwMC1iYWRlLTExYmQ0NmE1ZjJlNS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjYwMzI3JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MDMyN1QyMjE3MjRaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT04ZDIyZDIwNmMwZWMzZWEyMjRiYTlhMTM4ZTE5MmUzMWQwODI2NDkwZGI2YWI0YWU0MWUwZTU0YWQxZTdlYjBiJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.GRcAnMdbiIIvY8LsP0rGyaBPL-ES2WHwCP7TZ2iF8tA" alt="YouTube"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://dev.to/anuragkanojiya/semantic-search-for-movies-series-with-mindsdb-and-fastapi-g39" rel="nofollow"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprivate-user-images.githubusercontent.com%2F144598258%2F460989784-f4a138fc-9692-4486-bae4-6bb666ee3f72.jpeg%3Fjwt%3DeyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzQ2NTAxNDQsIm5iZiI6MTc3NDY0OTg0NCwicGF0aCI6Ii8xNDQ1OTgyNTgvNDYwOTg5Nzg0LWY0YTEzOGZjLTk2OTItNDQ4Ni1iYWU0LTZiYjY2NmVlM2Y3Mi5qcGVnP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI2MDMyNyUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNjAzMjdUMjIxNzI0WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9OTA1M2JiZTJkYjgwOTAwZDhkN2U1NGJmZDM5Y2MxNjg3NTUzYThlMDQyYmZiYjliOWQwYTgxOWQ4MTBjMDcyYiZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.j2BEhleCkxXuyxtQFxh5RhDxxSa7D-3wFz6_eq3WYo0" alt="Blog"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;📦 Requirements&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Before getting started, make sure you have installed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.docker.com/get-started" rel="nofollow noopener noreferrer"&gt;Docker Desktop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ollama.com/download" rel="nofollow noopener noreferrer"&gt;Ollama&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Python 3.8+&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;📁 Project Structure&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;project-root&lt;/p&gt;
&lt;p&gt;│── mindsdb_client.py&lt;br&gt;
├── main.py&lt;br&gt;
├── requirements.txt&lt;br&gt;
├── bingewatch.csv&lt;br&gt;
└── README.md&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🧪 Step-by-Step Setup&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;1️⃣ Clone this repo&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;git clone https://github.com/your-username/BingeMate-Backend.git
&lt;span class="pl-c1"&gt;cd&lt;/span&gt; BingeMate-Backend&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;2️⃣ Install Python dependencies&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;pip install -r requirements.txt&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;3️⃣ Run MindsDB in Docker&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;docker run --name mindsdb_container -e MINDSDB_APIS=http,mysql -p 47334:47334 -p 47335:47335 mindsdb/mindsdb&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;4️⃣ Start Ollama and download models&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Ollama must be running in the background.&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;ollama run granite-embedding
ollama run mistral&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🤖 Configure MindsDB&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Once MindsDB and Ollama are running, execute the following commands to set up:&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;📚 Create a&lt;/h3&gt;…&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/anuragkanojiya1/BingeMate-Backend" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;





&lt;h2&gt;
  
  
  ⚙️ Backend Tech Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;FastAPI&lt;/strong&gt;: Lightweight, high-performance Python web framework for building APIs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MindsDB SDK&lt;/strong&gt;: Python client to query MindsDB knowledge bases and agents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pandas&lt;/strong&gt;: For formatting query results&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Uvicorn&lt;/strong&gt;: ASGI server for FastAPI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JSON-based filtering&lt;/strong&gt;: For flexible metadata queries&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📁 Project Structure
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;📦 bingemate-backend/
├── main.py                  # FastAPI app with routes
├── bingewatch.csv           # CSV file that contains movie/series data
├── mindsdb_client.py        # MindsDB SDK helper functions
├── requirements.txt         # Dependencies
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🧪 API Endpoints
&lt;/h2&gt;
&lt;h3&gt;
  
  
  &lt;code&gt;/query&lt;/code&gt; — Search Knowledge Base
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@app.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/query&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;search_kb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Query&lt;/span&gt;&lt;span class="p"&gt;(...,&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Search query, e.g., &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;best series&lt;/span&gt;&lt;span class="sh"&gt;'"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;min_relevance&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Minimum relevance threshold&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;query_params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;query_params&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;query_params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;q&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;query_params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;min_relevance&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;query_knowledge_base&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;search_query&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
        &lt;span class="n"&gt;min_relevance&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;min_relevance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
        &lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;query_params&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;count&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;results&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;🔎 Accepts a natural language query like &lt;code&gt;"popular kdrama in 2023"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;📊 Supports dynamic metadata filters like &lt;code&gt;?type=Series&amp;amp;genre=Drama&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;🔁 Filters results by minimum relevance score&lt;/li&gt;
&lt;/ul&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%2F7w090jc6l00x87b0gv6m.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%2F7w090jc6l00x87b0gv6m.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  &lt;code&gt;/agent&lt;/code&gt; — Ask a Question via Agent
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@app.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/agent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Query&lt;/span&gt;&lt;span class="p"&gt;(...,&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Question to ask the agent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Optional&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Description of the agent&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;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;query_agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;query&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;result&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This endpoint interacts with a &lt;strong&gt;MindsDB agent&lt;/strong&gt; that answers natural language questions based on pre-trained or fine-tuned SQL logic.&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%2Fjm48xd1uyu584p84jpry.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%2Fjm48xd1uyu584p84jpry.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  &lt;code&gt;/api/projects/mindsdb/jobs&lt;/code&gt; — Simulated Job Endpoint
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@app.post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/api/projects/mindsdb/jobs&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_job&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;job_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;message&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;Job &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;job_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; created in project &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; with query: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;query&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;✏️ Note : The MindsDB Job endpoint is used to schedule specific timepoints at which an SQL query will be executed.&lt;/p&gt;


&lt;h2&gt;
  
  
  🔧 mindsdb_client.py — Query Logic
&lt;/h2&gt;

&lt;p&gt;This module handles communication with MindsDB via SQL.&lt;/p&gt;
&lt;h3&gt;
  
  
  Search the Knowledge Base
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;query_knowledge_base&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;search_query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;min_relevance&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;conditions&lt;/span&gt; &lt;span class="o"&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;content = &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;search_query&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;relevance &amp;gt;= &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;min_relevance&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="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="n"&gt;conditions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&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="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; = &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;value&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;sql&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;SELECT * FROM my_bingekb WHERE &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; AND &lt;/span&gt;&lt;span class="sh"&gt;'&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="n"&gt;conditions&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sql&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="bp"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;✅ Uses SQL to query &lt;code&gt;my_bingekb&lt;/code&gt; table&lt;/li&gt;
&lt;li&gt;🧠 Automatically filters results using &lt;code&gt;relevance&lt;/code&gt; and &lt;code&gt;metadata&lt;/code&gt; (e.g., type, genre)&lt;/li&gt;
&lt;li&gt;🔄 Converts results to a JSON-friendly format&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  Ask a Question to an Agent
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;query_agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;sql&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;
    SELECT answer FROM my_agent WHERE question = &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="si"&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="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sql&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;fetch&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;df&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This enables direct Q&amp;amp;A via a SQL-like agent interface. You can map semantic questions to custom-trained answers.&lt;/p&gt;


&lt;h3&gt;
  
  
  🧪 requirements.txt
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fastapi
uvicorn
mindsdb_sdk
pandas
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  🚀 To run:
&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; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
uvicorn main:app &lt;span class="nt"&gt;--reload&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🌐 Example Usage
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;GET /query?q&lt;span class="o"&gt;=&lt;/span&gt;best%20series%20on%20netflix&amp;amp;genre&lt;span class="o"&gt;=&lt;/span&gt;Drama&amp;amp;type&lt;span class="o"&gt;=&lt;/span&gt;Series
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;GET /agent?query&lt;span class="o"&gt;=&lt;/span&gt;Is%20Breaking%20Bad%20better%20than%20Ozark
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  💡 Final Thoughts
&lt;/h2&gt;

&lt;p&gt;FastAPI + MindsDB gives you a supercharged backend for semantic search and conversational interfaces. Whether you’re building a movie recommender, travel planner, or knowledge assistant—this stack is lightweight, extensible, and LLM-ready.&lt;/p&gt;

&lt;p&gt;Now go and check out the implementation of this backend -- &lt;a href="https://github.com/anuragkanojiya1/BingeMate" rel="noopener noreferrer"&gt;BingeMate&lt;/a&gt;!&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/anuragkanojiya1" rel="noopener noreferrer"&gt;
        anuragkanojiya1
      &lt;/a&gt; / &lt;a href="https://github.com/anuragkanojiya1/BingeMate" rel="noopener noreferrer"&gt;
        BingeMate
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      🎬 BingeMate – Your AI-Powered Movie &amp;amp; Series Finder
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;🎬 BingeMate – Your AI-Powered Movie &amp;amp; Series Finder 🎙️📺&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;BingeMate&lt;/strong&gt; is a Jetpack Compose Android application that helps users discover movies and series using &lt;strong&gt;Voice input&lt;/strong&gt; and &lt;strong&gt;Semantic search&lt;/strong&gt; powered by &lt;strong&gt;MindsDB Knowledge Base&lt;/strong&gt; and &lt;strong&gt;Ollama LLMs&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It combines natural language queries with structured filters like genre, type, year, and IMDb rating to return personalized results from Mindsdb Knowledge base
App's backend link is required to get movie/series data for Semantic/agent search - &lt;a href="https://github.com/anuragkanojiya1/BingeMate-Backend" rel="noopener noreferrer"&gt;BingeMate-Backend&lt;/a&gt;&lt;/p&gt;
&lt;br&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Demo Video&lt;/th&gt;
&lt;th&gt;Blog Post&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://youtu.be/QCIXBK0dxEs?si=rYhLqLZQ6KfP0onP" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprivate-user-images.githubusercontent.com%2F144598258%2F460989358-6cf3059f-84e8-4800-bade-11bd46a5f2e5.png%3Fjwt%3DeyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzQ2NTAxNDQsIm5iZiI6MTc3NDY0OTg0NCwicGF0aCI6Ii8xNDQ1OTgyNTgvNDYwOTg5MzU4LTZjZjMwNTlmLTg0ZTgtNDgwMC1iYWRlLTExYmQ0NmE1ZjJlNS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjYwMzI3JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MDMyN1QyMjE3MjRaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT04ZDIyZDIwNmMwZWMzZWEyMjRiYTlhMTM4ZTE5MmUzMWQwODI2NDkwZGI2YWI0YWU0MWUwZTU0YWQxZTdlYjBiJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.GRcAnMdbiIIvY8LsP0rGyaBPL-ES2WHwCP7TZ2iF8tA" alt="YouTube"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://dev.to/anuragkanojiya/semantic-search-for-movies-series-with-mindsdb-and-fastapi-g39" rel="nofollow"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprivate-user-images.githubusercontent.com%2F144598258%2F460989784-f4a138fc-9692-4486-bae4-6bb666ee3f72.jpeg%3Fjwt%3DeyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzQ2NTAxNDQsIm5iZiI6MTc3NDY0OTg0NCwicGF0aCI6Ii8xNDQ1OTgyNTgvNDYwOTg5Nzg0LWY0YTEzOGZjLTk2OTItNDQ4Ni1iYWU0LTZiYjY2NmVlM2Y3Mi5qcGVnP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI2MDMyNyUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNjAzMjdUMjIxNzI0WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9OTA1M2JiZTJkYjgwOTAwZDhkN2U1NGJmZDM5Y2MxNjg3NTUzYThlMDQyYmZiYjliOWQwYTgxOWQ4MTBjMDcyYiZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.j2BEhleCkxXuyxtQFxh5RhDxxSa7D-3wFz6_eq3WYo0" alt="Blog"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🚀 Features&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;🎤 Voice-Powered Search&lt;/h3&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Uses &lt;strong&gt;Google Speech Services&lt;/strong&gt; for hands-free querying.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;🔍 Semantic Movie/Series Search&lt;/h3&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Queries are processed through &lt;strong&gt;MindsDB's Knowledge Base&lt;/strong&gt;, which semantically matches user intent to documents (movie/series data) in the database.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;📚 Metadata Filters&lt;/h3&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Users can refine results using:
&lt;ul&gt;
&lt;li&gt;🎭 &lt;code&gt;genre&lt;/code&gt; (e.g., action, comedy)&lt;/li&gt;
&lt;li&gt;🎞️ &lt;code&gt;type&lt;/code&gt; (movie/series)&lt;/li&gt;
&lt;li&gt;📅 &lt;code&gt;year&lt;/code&gt; (e.g., 2023)&lt;/li&gt;
&lt;li&gt;⭐ &lt;code&gt;IMDb rating&lt;/code&gt; (e.g., &amp;gt;8.0)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;🤖 Conversational Agent&lt;/h3&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;A built-in &lt;strong&gt;agent powered by Ollama&lt;/strong&gt;…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/anuragkanojiya1/BingeMate" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;





&lt;p&gt;&lt;strong&gt;🔗 Connect with me&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;𝕏 &lt;a href="https://x.com/AnuKanojiya829" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;   |   👨🏻‍💻 &lt;a href="https://github.com/anuragkanojiya1/anuragkanojiya1" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;   |   ✉ &lt;a href="//anurag.kanojiya829@gmail.com"&gt;Gmail&lt;/a&gt;   |   ▶ &lt;a href="https://www.youtube.com/@Anurag.Kanojiya829" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;   |   🇮🇳 &lt;a href="https://linkedin.com/in/anurag-kanojiya-101312286" rel="noopener noreferrer"&gt;LinkedIn&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%2F1rq5kivc7hqgyhhcb05g.gif" 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%2F1rq5kivc7hqgyhhcb05g.gif" alt="Bye Bye"&gt;&lt;/a&gt;&lt;/p&gt;




</description>
      <category>backend</category>
      <category>ai</category>
      <category>python</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to use LangGraph within a FastAPI Backend 🚀</title>
      <dc:creator>Anurag Kanojiya</dc:creator>
      <pubDate>Tue, 01 Apr 2025 14:23:56 +0000</pubDate>
      <link>https://dev.to/anuragkanojiya/how-to-use-langgraph-within-a-fastapi-backend-amm</link>
      <guid>https://dev.to/anuragkanojiya/how-to-use-langgraph-within-a-fastapi-backend-amm</guid>
      <description>&lt;p&gt;In this tutorial, I’ll walk you through how to build a backend to &lt;strong&gt;generate AI-crafted emails&lt;/strong&gt; using &lt;strong&gt;LangGraph&lt;/strong&gt; for structured workflows and &lt;strong&gt;FastAPI&lt;/strong&gt; for API endpoints.  &lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;📌 Prerequisites&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1️⃣ Install Dependencies&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Create a &lt;code&gt;requirements.txt&lt;/code&gt; file and add these dependencies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fastapi
uvicorn
pydantic
python-dotenv
google-generativeai
langgraph
langchain
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, install them using the below command in terminal inside your project folder:&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; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  &lt;strong&gt;📌 Setting Up the Backend&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;2️⃣ Create &lt;code&gt;backend.py&lt;/code&gt; and Import Required Modules&lt;/strong&gt;
&lt;/h3&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;fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastAPI&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pydantic&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BaseModel&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;google.generativeai&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;genai&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;langgraph&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langgraph.graph&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;StateGraph&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;dotenv&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;load_dotenv&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;What Do These Modules Do?&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;FastAPI&lt;/strong&gt; → API framework
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pydantic&lt;/strong&gt; → Request validation
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;os&lt;/strong&gt; → Load environment variables
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;google-generativeai&lt;/strong&gt; → Gemini AI for email generation
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;langgraph&lt;/strong&gt; → Manages AI workflows
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;dotenv&lt;/strong&gt; → Loads API keys from a &lt;code&gt;.env&lt;/code&gt; file
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;3️⃣ Load Environment Variables &amp;amp; Initialize FastAPI&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;load_dotenv&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;GEMINI_API_KEY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GEMINI_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;genai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;configure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;GEMINI_API_KEY&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;What do these do?&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;.env&lt;/code&gt; helps &lt;strong&gt;keep API keys secure&lt;/strong&gt; instead of hardcoding them.
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;FastAPI()&lt;/code&gt; initializes the &lt;strong&gt;backend application&lt;/strong&gt;.
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;📌 Defining the API&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;4️⃣ Request Model (Pydantic Validation)&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;EmailRequest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BaseModel&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;tone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;      
    &lt;span class="n"&gt;ai_model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;  
    &lt;span class="n"&gt;language&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;  
    &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This ensures the API gets structured input:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;tone&lt;/strong&gt; → Email tone (e.g., formal, friendly).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ai_model&lt;/strong&gt; → Which AI to use (&lt;code&gt;gemini&lt;/code&gt; or &lt;code&gt;mistral&lt;/code&gt;).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;language&lt;/strong&gt; → Language of the email (e.g., English, French).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;context&lt;/strong&gt; → The purpose/content of the email.
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;5️⃣ AI Email Generation Function (Gemini)&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;generate_email_gemini&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;language&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&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="n"&gt;genai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;GenerativeModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gemini-2.0-flash&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;prompt&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;
    Generate an email in &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;language&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; with a &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;tone&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; tone. Context: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;
    Return the response in this format:
    Subject: //subject
    Body: //body
    &lt;/span&gt;&lt;span class="sh"&gt;"""&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;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate_content&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;response_text&lt;/span&gt; &lt;span class="o"&gt;=&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;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="n"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response_text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Body:&lt;/span&gt;&lt;span class="sh"&gt;"&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="k"&gt;if&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Body:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;response_text&lt;/span&gt; &lt;span class="nf"&gt;else &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;No Subject&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;response_text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;subject&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Subject:&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="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;subject&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;body&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;How It Works?&lt;/strong&gt;  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Calls &lt;strong&gt;Gemini AI&lt;/strong&gt; using &lt;code&gt;"gemini-2.0-flash"&lt;/code&gt;.
&lt;/li&gt;
&lt;li&gt;Constructs a &lt;strong&gt;prompt&lt;/strong&gt; for email generation.
&lt;/li&gt;
&lt;li&gt;Parses the AI response and extracts &lt;strong&gt;subject &amp;amp; body&lt;/strong&gt;.
&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;6️⃣ Structuring the Workflow with LangGraph&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;generate_email_graph&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ai_model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;language&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;email_generation_fn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;ai_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;gemini&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;generate_email_gemini&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;language&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tone&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Invalid AI model selected!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;email&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;graph&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;StateGraph&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
    &lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_node&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;generate_email&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;email_generation_fn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set_entry_point&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;generate_email&lt;/span&gt;&lt;span class="sh"&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;graph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;Why Use LangGraph?&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creates &lt;strong&gt;structured AI workflows&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;Makes it easy to &lt;strong&gt;expand functionalities&lt;/strong&gt; (e.g., adding post-processing).
&lt;/li&gt;
&lt;li&gt;Can be &lt;strong&gt;extended with multiple AI models&lt;/strong&gt; (Mistral, GPT, etc.).
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;📌 FastAPI Routes&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;7️⃣ Root Endpoint&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@app.get&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="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;read_root&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;message&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;Hello, AutoComposeBackend is live!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This simply &lt;strong&gt;confirms the server is running&lt;/strong&gt;.  &lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;8️⃣ AI Email Generation API Endpoint&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@app.post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/generate_email&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;generate_email&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;EmailRequest&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Generate an AI-crafted email using Gemini.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;graph&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;generate_email_graph&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ai_model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tone&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;language&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&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;graph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;invoke&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;How It Works?&lt;/strong&gt;  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Receives&lt;/strong&gt; input via &lt;strong&gt;POST request&lt;/strong&gt; (&lt;code&gt;EmailRequest&lt;/code&gt;).
&lt;/li&gt;
&lt;li&gt;Calls &lt;strong&gt;generate_email_graph&lt;/strong&gt; to create a &lt;strong&gt;workflow&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;Executes the &lt;strong&gt;AI model&lt;/strong&gt; and returns the &lt;strong&gt;email response&lt;/strong&gt;.
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;📌 Running the Server&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Save &lt;code&gt;backend.py&lt;/code&gt; and run on terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uvicorn backend:app &lt;span class="nt"&gt;--host&lt;/span&gt; 0.0.0.0 &lt;span class="nt"&gt;--port&lt;/span&gt; 8080                   
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, visit:&lt;br&gt;&lt;br&gt;
➡ &lt;strong&gt;&lt;a href="http://0.0.0.0:8080/docs" rel="noopener noreferrer"&gt;http://0.0.0.0:8080/docs&lt;/a&gt;&lt;/strong&gt; to test the API using FastAPI’s built-in Swagger UI or postman.  &lt;/p&gt;


&lt;h2&gt;
  
  
  &lt;strong&gt;🚀 Deploying FastAPI on Railway.app&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Now that our FastAPI backend is ready, let's &lt;strong&gt;deploy it on Railway.app&lt;/strong&gt;, a cloud platform for hosting backend applications effortlessly.  &lt;/p&gt;


&lt;h3&gt;
  
  
  &lt;strong&gt;1️⃣ Create a Railway Account &amp;amp; New Project&lt;/strong&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;&lt;a href="https://railway.app/" rel="noopener noreferrer"&gt;Railway.app&lt;/a&gt;&lt;/strong&gt; and sign up.
&lt;/li&gt;
&lt;li&gt;Click on &lt;strong&gt;"New Project"&lt;/strong&gt; → &lt;strong&gt;"Deploy from GitHub"&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;Connect your GitHub repository containing the &lt;strong&gt;FastAPI backend&lt;/strong&gt;.
&lt;/li&gt;
&lt;/ol&gt;


&lt;h3&gt;
  
  
  &lt;strong&gt;2️⃣ Add a &lt;code&gt;Procfile&lt;/code&gt; for Deployment&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Railway uses a &lt;strong&gt;&lt;code&gt;Procfile&lt;/code&gt;&lt;/strong&gt; to define how your app runs. Create a &lt;strong&gt;&lt;code&gt;Procfile&lt;/code&gt;&lt;/strong&gt; in your project root:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;web: uvicorn backend:app &lt;span class="nt"&gt;--host&lt;/span&gt; 0.0.0.0 &lt;span class="nt"&gt;--port&lt;/span&gt; &lt;span class="nv"&gt;$PORT&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;Why?&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;uvicorn backend:app&lt;/code&gt; → Starts the FastAPI server.
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--host 0.0.0.0&lt;/code&gt; → Allows Railway to bind it to a public address.
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--port $PORT&lt;/code&gt; → Uses the Railway-assigned port dynamically.
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;3️⃣ Add Environment Variables in Railway&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Since we use &lt;strong&gt;API keys&lt;/strong&gt;, they must be stored securely:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In your &lt;strong&gt;Railway Project Dashboard&lt;/strong&gt;, go to &lt;strong&gt;Settings → Variables&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;Add environment variables:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;GEMINI_API_KEY = your_api_key_here&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;4️⃣ Deploy the App on Railway&lt;/strong&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Click on Deploy.&lt;/li&gt;
&lt;li&gt;Wait for the deployment to complete. Once done, &lt;strong&gt;you'll get a public URL&lt;/strong&gt; (e.g., &lt;code&gt;https://your-app.up.railway.app&lt;/code&gt;).
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Note: If you do not get a domain automatically then create a public domain manually from the project's networking section.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;5️⃣ Test Your Deployed API&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Open:&lt;br&gt;&lt;br&gt;
➡ &lt;strong&gt;&lt;code&gt;https://your-app.up.railway.app/docs&lt;/code&gt;&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;Here, you can test API endpoints using FastAPI's built-in Swagger UI or on postman.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;🎯 Done! Your FastAPI Backend is Live!&lt;/strong&gt; 🚀
&lt;/h3&gt;

&lt;p&gt;You now have a &lt;strong&gt;FastAPI backend running on Railway.app&lt;/strong&gt; with LangGraph-powered AI email generation.💡&lt;/p&gt;




&lt;p&gt;Next tutorial would be about me integrating this FastAPI-LangGraph powered backend with a Jetpack Compose frontend! 🚀&lt;/p&gt;

</description>
      <category>langchain</category>
      <category>fastapi</category>
      <category>ai</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>🚀A Developer’s Guide to Integrating Daytona with Android Projects ✨</title>
      <dc:creator>Anurag Kanojiya</dc:creator>
      <pubDate>Fri, 27 Dec 2024 12:18:30 +0000</pubDate>
      <link>https://dev.to/anuragkanojiya/a-developers-guide-to-integrating-daytona-with-android-projects-1a11</link>
      <guid>https://dev.to/anuragkanojiya/a-developers-guide-to-integrating-daytona-with-android-projects-1a11</guid>
      <description>&lt;p&gt;Hey devs! 👋&lt;/p&gt;

&lt;p&gt;I recently submitted an Android-Blockchain app for transparent donation tracking for Daytona's sample project. It was an exciting experience, and I wanted to share how Daytona made everything easier. 🚀&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s Daytona? 🤔
&lt;/h2&gt;

&lt;p&gt;Daytona is a tool that simplifies setting up and managing your dev environment. It makes working with different projects much smoother, especially if you’re trying to simplify workspace management. I used it for my Android blockchain project for donation tracking. &lt;/p&gt;

&lt;p&gt;My Android project - &lt;strong&gt;HopeChain&lt;/strong&gt;, uses &lt;strong&gt;Jetpack Compose&lt;/strong&gt; for building the UI and &lt;strong&gt;Solana blockchain&lt;/strong&gt; for tracking donations. With Daytona, setting up the whole environment was a breeze, and I’m here to walk you through it! 🌟&lt;/p&gt;

&lt;h2&gt;
  
  
  🛠️ Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before we dive in, here are a few things you’ll need to get started:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://developer.android.com/tools/releases/platform-tools" rel="noopener noreferrer"&gt;Android SDK&lt;/a&gt; 🔧&lt;/li&gt;
&lt;li&gt;Docker 🐋&lt;/li&gt;
&lt;li&gt;JetBrains Gateway 🧑‍💻&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These tools will help you set up Daytona and configure everything for a seamless experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 Getting Started
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Install Daytona&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;First off, you need Daytona on your system. Follow this &lt;a href="https://github.com/daytonaio/daytona#installation" rel="noopener noreferrer"&gt;Daytona Installation Guide&lt;/a&gt; to set it up.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Install Docker&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;You’ll also need Docker to isolate and configure the entire setup. Docker makes sure everything runs in its own container, keeping things clean and efficient. 🐳&lt;/p&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Set Up JetBrains Gateway&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Once Docker is running, you’ll need JetBrains Gateway to connect your IDE remotely. It’s great for seamless development across different environments. Check out the &lt;a href="https://www.jetbrains.com/remote-development/gateway/" rel="noopener noreferrer"&gt;installation guide here&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. &lt;strong&gt;Create the Workspace&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Next, you’ll create the workspace using Daytona:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;daytona create https://github.com/daytonaio/sample-android-blockchain
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Daytona will take care of setting up everything for you, so you can get straight to development. 😎&lt;/p&gt;

&lt;h3&gt;
  
  
  5. &lt;strong&gt;Open in IntelliJ IDEA&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Daytona automatically opens the project in &lt;strong&gt;IntelliJ IDEA Ultimate&lt;/strong&gt; with all the SDKs and tools pre-configured. If for some reason it doesn’t, you can always open it manually. 🖥️&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;daytona code
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6. &lt;strong&gt;Install the Android Plugin&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;For IntelliJ to recognize Android projects, you’ll need to install the Android plugin. Here’s a quick screenshot of the setup process:&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%2F775ev0zgj85g63s18jkt.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%2F775ev0zgj85g63s18jkt.png" alt="Screenshot 2024-12-10 150555" width="800" height="424"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Follow the steps, accept the license agreement, and proceed. Once done, you’ll see the &lt;strong&gt;Run&lt;/strong&gt; and &lt;strong&gt;Devices&lt;/strong&gt; section in the top menu.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. &lt;strong&gt;Build the APK&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Now, it’s time to generate your APK. Go to the &lt;strong&gt;Build&lt;/strong&gt; section and hit &lt;strong&gt;Generate APK&lt;/strong&gt;. After it’s done, you can find your APK path and copy it to your local system using Docker commands.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nb"&gt;cp&lt;/span&gt; &amp;lt;CONTAINER_ID&amp;gt;:/home/daytona/sample-android-blockchain/app/build/outputs/apk/debug/app-debug.apk /path/to/destination/on/host
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  8. &lt;strong&gt;Run on Your Device&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Once you have the APK, you can install it on your Android device using ADB which is found in the Platform tools in Android sdk downloaded earlier:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;adb &lt;span class="nb"&gt;install &lt;/span&gt;path/to/your-app.apk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And voilà! Your app is now running on your device. 🎉&lt;/p&gt;

&lt;h3&gt;
  
  
  Final Product 🎁
&lt;/h3&gt;

&lt;p&gt;Here’s a glimpse of the &lt;strong&gt;HopeChain&lt;/strong&gt; app once it’s up and running:&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%2F3za8kzb86sp8ns8gqgb8.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%2F3za8kzb86sp8ns8gqgb8.png" alt="HopeChain App Screenshot" width="800" height="1733"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🧑‍💻 Project Structure
&lt;/h2&gt;

&lt;p&gt;Here’s a quick breakdown of the project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Jetpack Compose UI&lt;/strong&gt;: Modern UI built with Jetpack Compose.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Blockchain Integration&lt;/strong&gt;: Using Solana to securely track donations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto Builder Support&lt;/strong&gt;: Daytona can build a Project using the default base image.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Why Daytona Made It All Easy 🧑‍💻
&lt;/h2&gt;

&lt;p&gt;Daytona saved me a ton of time by automating environment setup and project configuration. No more struggling with environment variables, SDK installations, or misconfigured dependencies. Everything worked out of the box. 🙌&lt;/p&gt;

&lt;p&gt;Currently Daytona only provides these JetBrains IDEs : &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CLion&lt;/li&gt;
&lt;li&gt;GoLand&lt;/li&gt;
&lt;li&gt;IntelliJ IDEA Ultimate&lt;/li&gt;
&lt;li&gt;PhpStorm&lt;/li&gt;
&lt;li&gt;PyCharm Professional&lt;/li&gt;
&lt;li&gt;Rider&lt;/li&gt;
&lt;li&gt;RubyMine&lt;/li&gt;
&lt;li&gt;WebStorm&lt;/li&gt;
&lt;li&gt;Fleet &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In future Daytona would also include Android Studio, which is the official IDE for Android development to make our development far more easy.✨&lt;/p&gt;

&lt;p&gt;Happy coding! 🚀&lt;/p&gt;

</description>
      <category>docker</category>
      <category>android</category>
      <category>tutorial</category>
      <category>opensource</category>
    </item>
    <item>
      <title>My Journey with Anthropic API and Mistral AI🚀🤖</title>
      <dc:creator>Anurag Kanojiya</dc:creator>
      <pubDate>Tue, 17 Sep 2024 18:55:12 +0000</pubDate>
      <link>https://dev.to/anuragkanojiya/my-journey-with-anthropic-api-and-mistral-ai-7ip</link>
      <guid>https://dev.to/anuragkanojiya/my-journey-with-anthropic-api-and-mistral-ai-7ip</guid>
      <description>&lt;p&gt;Hello Developers🧑‍💻, I have made &lt;strong&gt;MyHealth Passport&lt;/strong&gt;, a project for Quira Quest 16 which is an Android App integrated with &lt;strong&gt;Gemini API&lt;/strong&gt;, &lt;strong&gt;Cosmocloud Object Storage&lt;/strong&gt;, &lt;strong&gt;Cloud Firestore Database&lt;/strong&gt;, &lt;strong&gt;Anthropic API&lt;/strong&gt; and &lt;strong&gt;Mistral AI&lt;/strong&gt;. I've added two awesome tools for the Quira quest in my Jetpack Compose Android app: a Personal Therapist Chatbot using Anthropic AI and a Personalized Diet &amp;amp; Exercise Planning AI Agent using Mistral. Here is a quick look at how these APIs made my development process easy.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1. Personal Therapist Chatbot with Anthropic API&lt;/strong&gt; 🧠💬
&lt;/h3&gt;

&lt;p&gt;I used the &lt;strong&gt;Anthropic API&lt;/strong&gt; to create a Personal Therapist chatbot. It interacts like a professional therapist with the user, it offers thoughtful and empathetic responses. The integration was smooth, thanks to the user-friendly endpoints and clear documentation provided by Anthropic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I loved:&lt;/strong&gt; How easily it integrated into my Jetpack Compose Android app. The responses are super fast, and the interactions feel very natural and supportive.&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%2Fxoloaifjdjf038p7mx0m.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%2Fxoloaifjdjf038p7mx0m.png" alt="Personal Therapist ChatBot" width="800" height="1777"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;2. Personalized Diet &amp;amp; Exercise Planner with Mistral AI&lt;/strong&gt; 🍎🏋️‍♂️
&lt;/h3&gt;

&lt;p&gt;For personalized diet and exercise recommendations, I used &lt;strong&gt;Mistral AI&lt;/strong&gt; to build an agent that makes plan based on users' medical data. By simply entering a medical ID, users receive customized diet and exercise plans. The Mistral Agent Builder made it super easy to set up, and the API documentation was really helpful.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I loved:&lt;/strong&gt; How quickly I could build customized agents with very low effort. The Mistral API’s endpoint for agents was excellent, allowing me to built it in no time.&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%2Fsp5zmgeknd5f84hq8lg4.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%2Fsp5zmgeknd5f84hq8lg4.png" alt="Personalized Diet and Exercise Planning AI Agent" width="800" height="1777"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Challenges and Solutions&lt;/strong&gt; 🔧💡
&lt;/h3&gt;

&lt;p&gt;One major challenge was aligning the APIs with the MVVM architecture, which was tricky at first. However, the rich documentation and accessible features made it manageable. The Mistral endpoint for agents was very impressive and quick, and Anthropic’s fast response time made the chatbot interactions fast.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Final Thoughts&lt;/strong&gt; 🌟
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Anthropic API&lt;/strong&gt; and &lt;strong&gt;Mistral AI&lt;/strong&gt; have truly transformed my app development experience. Their straight forward features and ease of use made integration very smooth. If you’re looking to enhance your projects with advanced AI capabilities, these tools are definitely worth checking out!&lt;/p&gt;




&lt;p&gt;&lt;em&gt;#AnthropicAPI #MistralAI #JetpackCompose #AndroidDevelopment #Quira #Quine #DevCommunity&lt;/em&gt;&lt;/p&gt;

</description>
      <category>android</category>
      <category>mobile</category>
      <category>quira</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
