<?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>Forem: aj1thkr1sh</title>
    <description>The latest articles on Forem by aj1thkr1sh (@aj1thkr1sh).</description>
    <link>https://forem.com/aj1thkr1sh</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%2F71446%2F324513a4-e995-40ee-b835-4c242aa94eeb.png</url>
      <title>Forem: aj1thkr1sh</title>
      <link>https://forem.com/aj1thkr1sh</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/aj1thkr1sh"/>
    <language>en</language>
    <item>
      <title>🎶 AllegroAgent : A Lightweight Python Framework for Building Stateful AI Agents 🚀</title>
      <dc:creator>aj1thkr1sh</dc:creator>
      <pubDate>Wed, 15 Apr 2026 06:46:14 +0000</pubDate>
      <link>https://forem.com/aj1thkr1sh/allegroagent-a-lightweight-python-framework-for-building-stateful-ai-agents-15f4</link>
      <guid>https://forem.com/aj1thkr1sh/allegroagent-a-lightweight-python-framework-for-building-stateful-ai-agents-15f4</guid>
      <description>&lt;h1&gt;
  
  
  AllegroAgent : A Lightweight Python Framework for Building Stateful AI Agents 🚀
&lt;/h1&gt;

&lt;h2&gt;
  
  
  🎶 Introduction
&lt;/h2&gt;

&lt;p&gt;Imagine the AI Agentic Framework that keeps things simple, and still gave you eveything you need to Build Stateful, Tool Calling AI Agent&lt;/p&gt;

&lt;p&gt;That is exactly why I built &lt;strong&gt;🎶 AllegroAgent&lt;/strong&gt;, a light weight, extensible Python Framework for Building Stateful AI Agents backed by Local or Remote LLMs&lt;/p&gt;

&lt;p&gt;It is Open Source on GitHub and available on PyPI, ready for you to Install and start Building with&lt;/p&gt;

&lt;h2&gt;
  
  
  About AllegroAgent 🎶
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;AllegroAgent&lt;/strong&gt; is available in &lt;a href="https://github.com/ajithraghavan/AllegroAgent" rel="noopener noreferrer"&gt;github.com/ajithraghavan/AllegroAgent&lt;/a&gt; and also published on &lt;a href="https://pypi.org/project/allegro-agent/" rel="noopener noreferrer"&gt;PyPI as &lt;code&gt;allegro-agent&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So, you could easily start simply like,&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;allegro-agent
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At its core, the &lt;code&gt;AllegroAgent&lt;/code&gt; has single public entry point : the &lt;code&gt;Agent&lt;/code&gt; Class&lt;/p&gt;

&lt;p&gt;You could Configure with a &lt;code&gt;Model&lt;/code&gt; and necessary &lt;code&gt;Parameters&lt;/code&gt; and &lt;code&gt;Tools&lt;/code&gt; and &lt;code&gt;AllegroAgent&lt;/code&gt; take care of rest like, handling Conversation History, Provider Routing, Tool Calling Loop for you&lt;/p&gt;

&lt;p&gt;The Architecture is deliberately flat and easy to Navigate. No nested layers of Abstraction&lt;/p&gt;

&lt;p&gt;Just clean Python Code you can Read and Extend ⚡️&lt;/p&gt;

&lt;h2&gt;
  
  
  🤔 Why AllegroAgent?
&lt;/h2&gt;

&lt;p&gt;There are plenty of Agent Frameworks out there and why need another one?&lt;/p&gt;

&lt;p&gt;Here are the reasons that drove this project :&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Zero Heavy Dependencies&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AllegroAgent requires only &lt;code&gt;requests&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;No massive Dependencies&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You get a Framework that is lean and Fast to set up&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Simplicity First&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The public API is one Class : &lt;code&gt;Agent&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;You configure it, call &lt;code&gt;run()&lt;/code&gt;, and it Works&lt;/li&gt;
&lt;li&gt;There is no configuration patterns before you can Build your first Agents ⚡️&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. Pluggable Providers&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Want to add a new LLM backend which is Provider? Just implement a single &lt;code&gt;generate()&lt;/code&gt; method by sub Classing &lt;code&gt;BaseProvider&lt;/code&gt; and register it&lt;/li&gt;
&lt;li&gt;Ollama ships in the box, but adding support for OpenAI, Anthropic, or any other Provider is straightforward&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4. JSON Schema Tools&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tools follow a clean Pattern&lt;/li&gt;
&lt;li&gt;Sub Class &lt;code&gt;BaseTool&lt;/code&gt;, declare your Parameters using standard JSON Schema, implement &lt;code&gt;execute()&lt;/code&gt;, and you are good &lt;/li&gt;
&lt;li&gt;The Agent Automatically exposes your Tools to any "Function Calling Capable" Model&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;5. Typed Errors&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The framework provides a small but effective hierarchy of exceptions : &lt;code&gt;FrameworkError&lt;/code&gt;, &lt;code&gt;ProviderError&lt;/code&gt;, &lt;code&gt;ProviderNotFoundError&lt;/code&gt;, &lt;code&gt;InvalidModelFormatError&lt;/code&gt;, and &lt;code&gt;ToolError&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;This makes Debugging and Error handling clean and predictable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;6. Stateful by Design&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Agent.run()&lt;/code&gt; manages Conversation History across calls&lt;/li&gt;
&lt;li&gt;Your Agent remembers the Context from previous turns, so you can have multi turn interactions naturally&lt;/li&gt;
&lt;li&gt;Call &lt;code&gt;reset()&lt;/code&gt; when you want to start fresh&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ⚙️ How It Works
&lt;/h2&gt;

&lt;p&gt;The flow inside &lt;code&gt;AllegroAgent&lt;/code&gt; is elegant in its simplicity:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────┐
│  Agent            (Public, Stateful Loop)   │
├─────────────────────────────────────────────┤
│  Providers        (Ollama, ...)             │
└─────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When you call &lt;code&gt;agent.run("your prompt here")&lt;/code&gt;, the following happens :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The Agent sends your Prompt along with the Tool Schemas(if provided) to the LLM via the Configured Provider&lt;/li&gt;
&lt;li&gt;If the LLM returns &lt;code&gt;tool_calls&lt;/code&gt;, the Agent Executes each Tool and feeds the results back to the LLM&lt;/li&gt;
&lt;li&gt;Steps 1 and 2 repeat in a Loop until the LLM returns a plain text answer, or until the maximum of 10 Tool Rounds is reached&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The &lt;code&gt;Agent&lt;/code&gt; communicates with Providers through a small internal router (&lt;code&gt;_Client&lt;/code&gt;) that parses the &lt;code&gt;provider:model&lt;/code&gt; string and caches Provider instances&lt;/p&gt;

&lt;p&gt;You never need to interact with this Layer directly, all handled by &lt;code&gt;Agent&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  💻 Sample Implementation
&lt;/h2&gt;

&lt;p&gt;Getting started with &lt;code&gt;AllegroAgent&lt;/code&gt; is very straight forward&lt;/p&gt;

&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;

&lt;p&gt;You can install it directly from PyPI :&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;allegro-agent
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or Clone and Install in Development Mode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/ajithraghavan/AllegroAgent.git
&lt;span class="nb"&gt;cd &lt;/span&gt;AllegroAgent
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For the default Ollama Provider, make sure Ollama is running locally :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama serve
ollama pull llama3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Building Your First Agent
&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;allegro_agent&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FileReadTool&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FileWriteTool&lt;/span&gt;

&lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Writer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ollama:llama3&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;temperature&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;system_prompt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You are a helpful writing assistant.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;FileReadTool&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="nc"&gt;FileWriteTool&lt;/span&gt;&lt;span class="p"&gt;()],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Write a haiku about the ocean to ocean.txt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Now write one about mountains to mountains.txt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reset&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c1"&gt;# clear history
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is it. No boilerplate, no Configuration Files. Just create an Agent, give it a Model and some Tools, and call &lt;code&gt;run()&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Adding a Custom Tool
&lt;/h3&gt;

&lt;p&gt;Creating your own Tool is just as clean :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;allegro_agent&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BaseTool&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AddTool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BaseTool&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;add&lt;/span&gt;&lt;span class="sh"&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;Add two integers.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;parameters&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&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;object&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;properties&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;a&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&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;integer&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;b&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&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;integer&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;required&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;a&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;b&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="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;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="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;a&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;b&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;h3&gt;
  
  
  Adding a Custom Provider
&lt;/h3&gt;

&lt;p&gt;Want to bring your own LLM backend or Provider? Here is how :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;allegro_agent.providers.base&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BaseProvider&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ProviderResponse&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;allegro_agent&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;register_provider&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OpenAIProvider&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BaseProvider&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;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;ProviderResponse&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# call the API, translate the response
&lt;/span&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;ProviderResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="n"&gt;provider&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;openai&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;tool_calls&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="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;register_provider&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;openai&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OpenAIProvider&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# now usable as model="openai:gpt-4"
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Configuration Options
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;Agent&lt;/code&gt; class accepts the following keyword Arguments :&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Argument&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;model&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;str&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Required.&lt;/strong&gt; Format : &lt;code&gt;provider:model&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;name&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;str&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Display Name (default &lt;code&gt;"Agent"&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;temperature&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;float&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Sampling Temperature&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;max_tokens&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;int&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Max Response Tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;system_prompt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;str&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;System Instruction prepended to every Call&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tools&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;list[BaseTool]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Tools the Agent may invoke&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  🔮 What is Next?
&lt;/h2&gt;

&lt;p&gt;AllegroAgent is at version 0.2.0, and there is a lot of room to grow&lt;/p&gt;

&lt;p&gt;I am exploring include adding more built-in Providers (OpenRouter, OpenAI, Anthropic, etc.), Streaming Support, Async Execution, and Richer Tool patterns&lt;/p&gt;

&lt;p&gt;The Framework is designed to be Extended 🧩, so Contributions and Ideas are welcome&lt;/p&gt;

&lt;p&gt;If you are looking for a Framework that respects your time, keeps things simple, and lets you focus on Building Agents, give &lt;code&gt;AllegroAgent&lt;/code&gt; a try&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/ajithraghavan/AllegroAgent" rel="noopener noreferrer"&gt;github.com/ajithraghavan/AllegroAgent&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;PyPI:&lt;/strong&gt; &lt;a href="https://pypi.org/project/allegro-agent/" rel="noopener noreferrer"&gt;pypi.org/project/allegro-agent&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;allegro-agent
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Please feel free to share you comments 💭&lt;/p&gt;

&lt;p&gt;Happy Building! 🎉&lt;/p&gt;

&lt;p&gt;Thanks for Reading!&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>llm</category>
      <category>allegroagent</category>
    </item>
    <item>
      <title>CNN-LSTM Hybrid Architecture for Thanglish-to-Tamil : Bridging 26 Letters to 247 Characters</title>
      <dc:creator>aj1thkr1sh</dc:creator>
      <pubDate>Tue, 17 Feb 2026 07:13:24 +0000</pubDate>
      <link>https://forem.com/aj1thkr1sh/cnn-lstm-hybrid-architecture-for-thanglish-to-tamil-bridging-26-letters-to-247-characters-j4n</link>
      <guid>https://forem.com/aj1thkr1sh/cnn-lstm-hybrid-architecture-for-thanglish-to-tamil-bridging-26-letters-to-247-characters-j4n</guid>
      <description>&lt;h1&gt;
  
  
  Introduction : Let's do Experiment 🧪
&lt;/h1&gt;

&lt;p&gt;I sometime use Google Input Tools to write Tamil via Thanglish.  Like, if I type "Vanakkam" it will replace with "வணக்கம்"&lt;/p&gt;

&lt;p&gt;Seeing(some years back) and using this on Day 1, I always thought, how they Built this?  What Model they use?  How we can Build this one?  Like those&lt;/p&gt;

&lt;p&gt;So, on past Weekend I decided to Build One 💪&lt;/p&gt;

&lt;h1&gt;
  
  
  Dataset : First thing in Machine Learning / Deep Learning 📊
&lt;/h1&gt;

&lt;p&gt;I analyzed a lot of Dataset and decided to stick with &lt;a href="https://github.com/google-research-datasets/dakshina" rel="noopener noreferrer"&gt;Google Dakshina Dataset&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It contains a lot of Dataset, I chose to use below&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ta.translit.sampled.train.tsv&lt;/li&gt;
&lt;li&gt;ta.translit.sampled.dev.tsv&lt;/li&gt;
&lt;li&gt;ta.translit.sampled.test.tsv&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So, it is &lt;strong&gt;Character Level&lt;/strong&gt; not Word or Token Level&lt;/p&gt;

&lt;h1&gt;
  
  
  Choosing Architecture 🏗️ : Comes Engineer's Artist 🎨
&lt;/h1&gt;

&lt;h3&gt;
  
  
  Seq2Seq : Fixed
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Just briefly : Seq2Seq is used to turn one Sequence of Data into another Sequence, typically contain &lt;strong&gt;Encoder Block&lt;/strong&gt; to read the Input then produce the &lt;strong&gt;Context Representation&lt;/strong&gt; and &lt;strong&gt;Decoder Block&lt;/strong&gt; to generate the output&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;First it is understandable that we need &lt;strong&gt;Seq2Seq Model&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes, we enter the Sequence of Characters and we need to get Sequence of Characters&lt;/p&gt;

&lt;p&gt;We shall proceed with that&lt;/p&gt;

&lt;h3&gt;
  
  
  Intuition of Architecture
&lt;/h3&gt;

&lt;p&gt;First, intuition that came to me to like&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💭 Use Bidirectional RNN either BiLSTM or BiGRU with &lt;strong&gt;Attention Mechanism&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's the intuition that came to me&lt;/p&gt;

&lt;p&gt;But, then I thought, wait, we are going to use Character Level, so, maximum Number of Timesteps will not exceed maximum of 50 time steps.&lt;/p&gt;

&lt;p&gt;So, just LSTM works good here(LONG SHORT-TERM MEMORY!)&lt;/p&gt;

&lt;p&gt;And I got another Thought, kind of FIRST PRINCIPLE&lt;/p&gt;

&lt;h3&gt;
  
  
  Look closely at First Level
&lt;/h3&gt;

&lt;p&gt;Why, my Intuition suggested BiRNN(LSTM or GRU) with &lt;strong&gt;Attention Mechanism&lt;/strong&gt;?  Because of,&lt;/p&gt;

&lt;h4&gt;
  
  
  Thanglish Words Representation
&lt;/h4&gt;

&lt;p&gt;Let us consider an example,&lt;/p&gt;

&lt;p&gt;If we write "Vanakkam" for generating "வ" it needs to look for 'v' and 'a' both, right?&lt;/p&gt;

&lt;p&gt;Similarly, for generating "ண" it needs to look for "na" and needs to decide which "ந", "ன", "ண" for that it needs to decide what comes BEFORE what comes AFTER&lt;/p&gt;

&lt;p&gt;Because, "ன", "ண" won't appear in &lt;strong&gt;starting&lt;/strong&gt; of the word and "ந" won't appear at &lt;strong&gt;end&lt;/strong&gt; of the words &lt;strong&gt;rarely&lt;/strong&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Attention Mechanism
&lt;/h4&gt;

&lt;blockquote&gt;
&lt;p&gt;I will not go too detail about Attention Mechanism here but generally, allows the Decoder to look back at all the Encoder's Hidden States and &lt;em&gt;Pick which ones are most Relevant&lt;/em&gt; at each step of the output&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here we need to look for surrounding characters and decide&lt;/p&gt;

&lt;p&gt;Note : "na" is just one example, there are other &lt;strong&gt;PATTERNS&lt;/strong&gt; to consider like for "pattam", "tt" should be "ட்ட" like many other patterns too&lt;/p&gt;

&lt;h4&gt;
  
  
  Vanilla LSTM
&lt;/h4&gt;

&lt;p&gt;But, just LSTM on Seq2Seq should solve the use case right?  Because there is no such &lt;em&gt;Long Range Dependencies&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Local Receptive Field
&lt;/h3&gt;

&lt;p&gt;Local Receptive Field is one of the Fundamental concept in Convolutional Neural Networks (CNNs) which focuses on a specific spatial location&lt;/p&gt;

&lt;p&gt;Have explained briefly CNN &lt;a href="https://ajithraghavan.github.io/blog/cnn-intro/" rel="noopener noreferrer"&gt;here&lt;/a&gt;, please take a look!&lt;/p&gt;

&lt;h3&gt;
  
  
  🤷 What to do with Image Here?
&lt;/h3&gt;

&lt;p&gt;We aren't dealing with Image right, then why use CNN?&lt;/p&gt;

&lt;h4&gt;
  
  
  1D Convolution comes to rescue
&lt;/h4&gt;

&lt;p&gt;We are going to use 1D Convolution, where Convolution is performed in Sequential Data, such as Text, Time Series, or Audio Signals etc.,&lt;/p&gt;

&lt;h3&gt;
  
  
  Again why Convolution 🤷
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://ajithraghavan.github.io/blog/cnn-intro/" rel="noopener noreferrer"&gt;You can read more here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But briefly, it performs Convolution Operation : A Filter (or Kernel) that slides across an Input Data(mostly Image), Computing &lt;br&gt;
Element Wise Multiplications and Summing the results at each position to produce an output called a Feature Map&lt;/p&gt;
&lt;h4&gt;
  
  
  We have the solution here
&lt;/h4&gt;

&lt;p&gt;Both Attention and Convolution compute weighted combinations of input values, but Convolution is restricted to a small local window, while Attention can relate any positions regardless of distance&lt;/p&gt;

&lt;p&gt;Similar to Attention Mechanism(where Attention dynamically Computes Relationships between positions, often globally),  and Convolution Operation extracts Features from Local Spatial Regions (a small fixed window) to address our use case&lt;/p&gt;
&lt;h3&gt;
  
  
  Best Architecture?
&lt;/h3&gt;

&lt;p&gt;There are many Architectures and Design Choices but let us stick with it as of now&lt;/p&gt;

&lt;p&gt;Any of those which one is the best Architecture, that's the billion dollar question, right?&lt;/p&gt;

&lt;p&gt;Let the Evaluation Speak&lt;/p&gt;
&lt;h2&gt;
  
  
  Evaluation 📈
&lt;/h2&gt;

&lt;p&gt;Training using Google Colab&lt;/p&gt;

&lt;p&gt;Note : These Accuracy are not too high, I am just tweaking Hyperparameter like Regularization, Architectural Design etc., with limited Compute Resource, just sharing the current progress here&lt;/p&gt;
&lt;h3&gt;
  
  
  Vanilla LSTM
&lt;/h3&gt;

&lt;p&gt;Current Total Parameters : 1,411,890&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Train Loss: 0.1314 | Val Loss: 1.4453 | Val Acc: 53.41% | Val CER: 15.67% | LR: 0.000500
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Test Exact Match Accuracy: 51.57%&lt;br&gt;
Test Character Error Rate: 16.36%&lt;/p&gt;
&lt;h4&gt;
  
  
  Good
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;The Model is actually Learning&lt;/li&gt;
&lt;li&gt;Some demo outputs are correct&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  Bad
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Overfitting&lt;/li&gt;
&lt;li&gt;Some Errors in demo&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  Fixes(but not limited to)
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Regularization&lt;/li&gt;
&lt;li&gt;Model Architecture Improvement&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  BiGRU with Attention Mechanism
&lt;/h3&gt;

&lt;p&gt;Current Total Parameters : 12,580,914&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Train Loss: 0.1460 | Val Loss: 1.3492 | Val Acc: 54.74% | Val CER: 15.50% | LR: 0.000500
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Test Exact Match Accuracy: 50.60%&lt;br&gt;
Test Character Error Rate: 16.44%&lt;/p&gt;
&lt;h4&gt;
  
  
  Good
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;The Model is actually Learning&lt;/li&gt;
&lt;li&gt;Some demo outputs are correct&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  Bad
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Overfitting&lt;/li&gt;
&lt;li&gt;Some Errors in demo&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  Fixes(but not limited to)
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Regularization&lt;/li&gt;
&lt;li&gt;Model Architecture Improvement&lt;/li&gt;
&lt;li&gt;Residual Connection&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  CNN-LSTM Architecture
&lt;/h3&gt;

&lt;p&gt;Current Total Parameters : 767,666&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Train Loss : 0.0903 | Val Loss: 0.9868 | Val Acc : 53.13% | Val CER : 15.77% | LR : 0.000125
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Test Exact Match Accuracy : 50.55%&lt;br&gt;
Test Character Error Rate : 15.81%&lt;/p&gt;

&lt;h4&gt;
  
  
  Good
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Total Parameters size is low comparatively&lt;/li&gt;
&lt;li&gt;The Model is actually Learning&lt;/li&gt;
&lt;li&gt;Some demo outputs are correct&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Bad
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Overfitting&lt;/li&gt;
&lt;li&gt;Some Errors in demo&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Fixes(but not limited to)
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Regularization&lt;/li&gt;
&lt;li&gt;Model Architecture Improvement&lt;/li&gt;
&lt;li&gt;Residual Connection&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🏆 Billion Dollar Question : Which Architecture is the Winner?
&lt;/h2&gt;

&lt;p&gt;All three Models perform remarkably similarly on test metrics (~50-51% accuracy, ~15.8-16.4% CER)&lt;/p&gt;

&lt;p&gt;But the winner is.....&lt;/p&gt;

&lt;p&gt;.&lt;br&gt;
.&lt;br&gt;
.&lt;br&gt;
.&lt;br&gt;
.&lt;br&gt;
.&lt;br&gt;
.&lt;br&gt;
.&lt;br&gt;
.&lt;/p&gt;

&lt;h3&gt;
  
  
  CNN-LSTM Architecture wins 🎉 🥳
&lt;/h3&gt;

&lt;h3&gt;
  
  
  Why CNN-LSTM wins :
&lt;/h3&gt;

&lt;p&gt;First CNN does Parameter Sharing&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Best generalization : Lowest val loss (0.9868) by a significant margin compared to the other two (~1.35–1.45)&lt;/li&gt;
&lt;li&gt;Best test CER (15.81%)&lt;/li&gt;
&lt;li&gt;Smallest Model : Only 767K parameters, roughly 16x smaller than BiGRU+Attention and 2x smaller than Vanilla LSTM.  This means faster Inference, easier Deployment&lt;/li&gt;
&lt;li&gt;Best efficiency : Achieving comparable (or better) results with far Fewer Parameters is a strong signal that the Architecture suits this task well and CNNs are good at capturing local character-level &lt;strong&gt;n-gram patterns&lt;/strong&gt;, which is exactly what transliteration needs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Note : In all Three Architectures, we can do fixes to improve all Three Models, may be even with Hyperparameter tuning other Architecture might win but here sharing the current status&lt;/p&gt;

&lt;p&gt;Also, CNN-LSTM is not new it's already applied in other various fields and domain, like&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OCR : Optical Character Recognition&lt;/li&gt;
&lt;li&gt;The CNN-LSTM Attention-based Seq2Seq model has been shown to be effective for OCR&lt;/li&gt;
&lt;li&gt;Many other Domains and Fields &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because we need to Experiment and Find&lt;/p&gt;

&lt;p&gt;Repository : &lt;a href="https://github.com/ajithraghavan/VisAI" rel="noopener noreferrer"&gt;https://github.com/ajithraghavan/VisAI&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Please feel free to Clone, Use and Train on your own Dataset for exploration&lt;/p&gt;

&lt;p&gt;Thanks for reading!&lt;/p&gt;

&lt;p&gt;Originally Posted : &lt;a href="https://ajithraghavan.github.io/blog/CNN-and-LSTM-for-Tamil-Typing/" rel="noopener noreferrer"&gt;https://ajithraghavan.github.io/blog/CNN-and-LSTM-for-Tamil-Typing/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>cnn</category>
      <category>lstm</category>
      <category>ai</category>
      <category>tamil</category>
    </item>
    <item>
      <title>Try My ~3.5 Million Parameters Model Instead for ✨😉</title>
      <dc:creator>aj1thkr1sh</dc:creator>
      <pubDate>Mon, 25 Aug 2025 07:26:03 +0000</pubDate>
      <link>https://forem.com/aj1thkr1sh/try-my-35-million-parameters-model-instead-for-18o2</link>
      <guid>https://forem.com/aj1thkr1sh/try-my-35-million-parameters-model-instead-for-18o2</guid>
      <description>&lt;h2&gt;
  
  
  😊 Introduction
&lt;/h2&gt;

&lt;p&gt;I thought to Build a Machine Learning Model to generate Emojis for My Writing content &lt;/p&gt;

&lt;p&gt;Like when typing some sentences, I think I need relevant Emojis in the sentences, as it will give more expressiveness, right&lt;/p&gt;

&lt;p&gt;And also because currently I am searching in Web(using some website like Emoji Finder etc., it is based on keywords only) to pick Emojis&lt;/p&gt;

&lt;p&gt;So I decided to Develop a &lt;strong&gt;LSTM Model&lt;/strong&gt; to automatically generate Emoji for My Sentences&lt;/p&gt;

&lt;h2&gt;
  
  
  🎥 First Demo
&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%2Fr6s1zi8d5phx36rgeeec.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%2Fr6s1zi8d5phx36rgeeec.gif" alt="Demo Video" width="480" height="245"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🧑‍🏫 Explanation
&lt;/h2&gt;

&lt;p&gt;When the user types the paragraph, for each paragraph the Model predicts the approximate Emoji &lt;/p&gt;

&lt;p&gt;For example, if you have 5 sentences in a paragraph, the Model will generate 5 Emojis&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚙️ Technical Details
&lt;/h2&gt;

&lt;p&gt;I currently have totally 20 Emojis ❤, 😍, 😂, 💕, 🔥, 😊, 😎, ✨, 💙, 😘, 📷, 🇺🇸, ☀, 💜, 😉, 💯, 😁, 🎄, 📸, 😜&lt;/p&gt;

&lt;p&gt;And used Dataset from &lt;a href="https://huggingface.co/datasets/cardiffnlp/tweet_eval" rel="noopener noreferrer"&gt;Hugging Face&lt;/a&gt; and used Google Colab for Training &lt;/p&gt;

&lt;h3&gt;
  
  
  🎯 Model Selection
&lt;/h3&gt;

&lt;p&gt;I have decided to use BiLSTM(Bidirectional LSTM(Long Short-Term Memory)) &lt;/p&gt;

&lt;p&gt;We could have just used &lt;strong&gt;LSTM&lt;/strong&gt; rather then &lt;strong&gt;BiLSTM&lt;/strong&gt; as we are not doing Seq2Seq Task, like we are not translating English to Emojis &lt;/p&gt;

&lt;p&gt;But, here &lt;strong&gt;BiLSTM&lt;/strong&gt; improves the performance by at least 10% &lt;/p&gt;

&lt;p&gt;So, decided to use &lt;strong&gt;BiLSTM&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note : &lt;/p&gt;

&lt;p&gt;Here we could have used BiLSTM with Attention Mechanism or even  Fine-Tuned Pre Trained Model like BERT&lt;/p&gt;

&lt;p&gt;But decided to use BiLSTM&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  🏗️ Architecture
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;First have used Embedding Layer &lt;/li&gt;
&lt;li&gt;Then, BiLSTM with 2 Layers &lt;/li&gt;
&lt;li&gt;Dropout for Regularization &lt;/li&gt;
&lt;li&gt;Then Linear Layer with 20 output units for each Emojis 

&lt;ul&gt;
&lt;li&gt;Note : &lt;/li&gt;
&lt;li&gt;We are using BiLSTM, so it will hidden states from both the directions &lt;/li&gt;
&lt;li&gt;So, before passing to Linear Layer we must concatenate both the hidden states&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  🎲 Hyperparameters
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;I have used the Maximum length of the Sequence to be &lt;code&gt;50&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;Embedding Dimension as &lt;code&gt;128&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;Hidden Dimension for LSTM States to be &lt;code&gt;128&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;As stated before, we have chosen Number of Layers to be 2 &lt;/li&gt;
&lt;li&gt;Learning Rate α : 0.0005&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  🚨 Accuracy and Important Study
&lt;/h3&gt;

&lt;p&gt;Regarding Accuracy, it is not relatively higher although with &lt;strong&gt;BiLSTM&lt;/strong&gt; and even low with &lt;strong&gt;Unidirectional LSTM&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Was tweaking and trying to improve the performance then LATER ONLY realized that data has Class Imbalance Problem&lt;/p&gt;

&lt;p&gt;Where ~21% of the Data has "❤" which dominates most and followed by ~10% of Data has "😍" and so on... then "😜" was barely minimum&lt;/p&gt;

&lt;h4&gt;
  
  
  ⚠️ Important action
&lt;/h4&gt;

&lt;p&gt;🥇 First Rule : Data in Training Set, Development Set and Test Set should follow the same Distribution&lt;/p&gt;

&lt;p&gt;Followed by, may be here, we can Augmented Data Synthetically, or may be with some other Architecture so on&lt;/p&gt;

&lt;p&gt;Yes, we can also increase Accuracy with the same Data but as of now saved that for later&lt;/p&gt;

&lt;h3&gt;
  
  
  📜 Little History
&lt;/h3&gt;

&lt;p&gt;I have used Regular LSTM and saw the Model was Overfitting &lt;/p&gt;

&lt;p&gt;So, of various Hyperparameters(still overfitting) after few tweaking various Hyperparameters along with  BiLSTM showed little improvement and continued and seems to work fine&lt;/p&gt;

&lt;p&gt;Originally Posted : &lt;a href="https://ajithraghavan.github.io/blog/emoji-generator/" rel="noopener noreferrer"&gt;https://ajithraghavan.github.io/blog/emoji-generator/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks for reading&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>rnn</category>
      <category>lstm</category>
    </item>
    <item>
      <title>🚀 Meet QMD : Quick Markdown</title>
      <dc:creator>aj1thkr1sh</dc:creator>
      <pubDate>Thu, 17 Jul 2025 14:17:03 +0000</pubDate>
      <link>https://forem.com/aj1thkr1sh/meet-qmd-quick-markdown-1mpc</link>
      <guid>https://forem.com/aj1thkr1sh/meet-qmd-quick-markdown-1mpc</guid>
      <description>&lt;p&gt;Hey Developers! 👋&lt;/p&gt;

&lt;p&gt;TL;DR: Single-character syntax = significant fewer tokens = cheaper AI costs 🎯&lt;/p&gt;




&lt;p&gt;What if I told you there's a way to make your Markdown few percentage more efficient for LLMs while keeping it just as readable for humans?&lt;/p&gt;

&lt;p&gt;Sounds too good to be true? Well, Quick Markdown (QMD) is here to change the game! 🎮&lt;/p&gt;

&lt;h2&gt;
  
  
  🤔 What is Quick Markdown?
&lt;/h2&gt;

&lt;p&gt;Quick Markdown (QMD) is a lightweight markup language that maintains Markdown's readability while significantly reducing storage requirements and token consumption.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enter: QMD 🎯
&lt;/h2&gt;

&lt;p&gt;🧠 Built for LLMs(in addition)&lt;br&gt;
💾 Reduces token &amp;amp; storage usage&lt;br&gt;
📏 Compact, clean, and context-aware&lt;br&gt;
🔁 Still plays nicely with traditional Markdown!&lt;/p&gt;

&lt;p&gt;It’s like Markdown, but on a diet 💪🍃&lt;/p&gt;
&lt;h2&gt;
  
  
  💭 Show us example, man
&lt;/h2&gt;

&lt;p&gt;Yes, yes, here are examples by comparison&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Traditional:    ## Heading Two        (3 tokens)
QMD:            &amp;gt;Heading Two          (1 token) 🎉

Traditional:    **bold text**         (4 tokens)  
QMD:            *bold text*           (2 tokens) ⚡

Traditional:    - [x] Done task       (6 tokens)
QMD:            + Done task           (2 tokens) 🍀 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  💵 Real impact
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Comparison: Traditional vs QMD
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Traditional Markdown&lt;/strong&gt; (231 bytes):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Shopping List&lt;/span&gt;

&lt;span class="gs"&gt;**Important**&lt;/span&gt; items to buy:
&lt;span class="p"&gt;
-&lt;/span&gt; Milk
&lt;span class="p"&gt;-&lt;/span&gt; Bread
&lt;span class="p"&gt;  -&lt;/span&gt; Whole wheat
&lt;span class="p"&gt;  -&lt;/span&gt; Sourdough
&lt;span class="p"&gt;-&lt;/span&gt; ~~Eggs~~ Already have

&lt;span class="gu"&gt;### Tasks&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; [x] Buy groceries
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Call store
&lt;span class="p"&gt;-&lt;/span&gt; [~] Check prices

&lt;span class="gu"&gt;### Notes&lt;/span&gt;

Check https://store.com for &lt;span class="ge"&gt;*deals*&lt;/span&gt;.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;QMD Version&lt;/strong&gt; (217 bytes, approximately 6.1 % reduction):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt;Shopping List

*Important* items to buy:

• Milk
• Bread
  • Whole wheat
  • Sourdough
• ~Eggs~ Already have

-Tasks
+ Buy groceries
. Call store
* Check prices

-Notes

Check https://store.com for /deals/.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For larger files, the compression ratio between QMD and MD should be significantly better&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 Ready to Start?
&lt;/h2&gt;

&lt;p&gt;Check out the &lt;a href="https://github.com/ajithraghavan/qmd" rel="noopener noreferrer"&gt;GitHub repo&lt;/a&gt; and start using QMD today! Your LLM bills will thank you! 💰&lt;/p&gt;

&lt;p&gt;GitHub : &lt;a href="https://github.com/ajithraghavan/qmd" rel="noopener noreferrer"&gt;https://github.com/ajithraghavan/qmd&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The future of documentation is Quick, Quality, and ready for a Quantum-leap! ⚡&lt;/p&gt;

&lt;p&gt;⭐ Star it on GitHub, clone it, try it out and tell us what you think!&lt;/p&gt;

&lt;p&gt;Built something cool with QMD&lt;/p&gt;

&lt;p&gt;💬 Drop it in the comments!&lt;/p&gt;

</description>
      <category>markdown</category>
      <category>python</category>
      <category>chatgpt</category>
      <category>llm</category>
    </item>
    <item>
      <title>📱🎉 Say Hi to PhoneSlides – The Vertical-First Presentation Tool! 🎉📱</title>
      <dc:creator>aj1thkr1sh</dc:creator>
      <pubDate>Sat, 12 Jul 2025 12:00:21 +0000</pubDate>
      <link>https://forem.com/aj1thkr1sh/say-hi-to-phoneslides-the-vertical-first-presentation-tool-1bb6</link>
      <guid>https://forem.com/aj1thkr1sh/say-hi-to-phoneslides-the-vertical-first-presentation-tool-1bb6</guid>
      <description>&lt;p&gt;Hey Folks 👋&lt;/p&gt;

&lt;p&gt;Introducing 🚀 PhoneSlides : the friendliest slide presentation tool made for your phone!&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%2Fc269a765x3iec18z3ou7.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%2Fc269a765x3iec18z3ou7.png" alt="PhoneSlides Logo" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🧠 The Idea
&lt;/h2&gt;

&lt;p&gt;We are consuming everything on vertical screens now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reels 📱&lt;/li&gt;
&lt;li&gt;Shorts 🎬&lt;/li&gt;
&lt;li&gt;TikToks 🕺&lt;/li&gt;
&lt;li&gt;Stories 🧃&lt;/li&gt;
&lt;li&gt;etc&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But what about presentations?&lt;br&gt;
That’s where PhoneSlides comes in&lt;/p&gt;

&lt;h2&gt;
  
  
  📲 What is PhoneSlides?
&lt;/h2&gt;

&lt;p&gt;✅ Create beautiful vertical-first presentations (optimized for phones)&lt;br&gt;
✅ Add titles, descriptions, and images with ease&lt;br&gt;
✅ Record your screen and voice walkthrough (hello, mini-reels!)&lt;br&gt;
✅ Export/share as video to YouTube Shorts, Instagram Reels, or even WhatsApp&lt;/p&gt;

&lt;p&gt;So, just tall, crisp, story-driven slides.&lt;/p&gt;

&lt;h2&gt;
  
  
  🛠️ Tech Stack
&lt;/h2&gt;

&lt;p&gt;We built PhoneSlides using: HTML, CSS, JavaScript&lt;/p&gt;

&lt;h2&gt;
  
  
  🔮 What's Next?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;✨ Templates and styling options&lt;/li&gt;
&lt;li&gt;🎨 Image uploads and custom themes&lt;/li&gt;
&lt;li&gt;🐛 Bug fixes and performance tweaks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your feedback will shape what comes next!&lt;/p&gt;

&lt;h2&gt;
  
  
  🎯 Try It Out!
&lt;/h2&gt;

&lt;p&gt;GitHub Link : &lt;a href="https://github.com/ajithraghavan/PhoneSlides" rel="noopener noreferrer"&gt;https://github.com/ajithraghavan/PhoneSlides&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  💬 We Want Your Feedback!
&lt;/h2&gt;

&lt;p&gt;This is the initial stage release of PhoneSlides, and we are excited to hear from the community:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What features would you love to see?&lt;/li&gt;
&lt;li&gt;How would you use PhoneSlides in your work?&lt;/li&gt;
&lt;li&gt;Found any bugs? We'd love to fix them!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Drop a comment below or star ⭐️ us on GitHub if you find this interesting!&lt;/p&gt;

&lt;p&gt;Or raise an issue, or even send a PR!&lt;/p&gt;

&lt;p&gt;Let’s build a better mobile presentation future together 💪&lt;/p&gt;

&lt;p&gt;Your feedback helps us build something amazing 🙌&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>javascript</category>
      <category>ui</category>
      <category>ux</category>
    </item>
    <item>
      <title>Yaali, the Tamil conversing AI</title>
      <dc:creator>aj1thkr1sh</dc:creator>
      <pubDate>Wed, 18 Aug 2021 15:41:17 +0000</pubDate>
      <link>https://forem.com/aj1thkr1sh/yaali-the-tamil-conversing-ai-35n8</link>
      <guid>https://forem.com/aj1thkr1sh/yaali-the-tamil-conversing-ai-35n8</guid>
      <description>&lt;h2&gt;
  
  
  Yaali
&lt;/h2&gt;

&lt;p&gt;I have created Yaali AI, using Neural Network, that one can communicate in Tamil&lt;/p&gt;

&lt;p&gt;Please look at the demo &lt;a href="https://www.instagram.com/p/CSkV7qIhs7N/"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conversation
&lt;/h2&gt;

&lt;p&gt;When I say "Yaali", Yaali will reply "Sollunga"&lt;br&gt;
When I ask to say a joke,&lt;br&gt;
Yaali will say, "risk edukarathellam enakku rusk sapdramathiri",&lt;br&gt;
which is one of the actor Vadivelu's dialogues joke&lt;/p&gt;

&lt;p&gt;Thanks for reading&lt;/p&gt;

&lt;p&gt;Follow on&lt;br&gt;
&lt;a href="https://www.instagram.com/ajith_raghavan/"&gt;Instagram&lt;/a&gt;&lt;br&gt;
&lt;a href="https://twitter.com/ajith2krishna"&gt;Twitter&lt;/a&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>python</category>
      <category>machinelearning</category>
      <category>yaali</category>
    </item>
    <item>
      <title>Single Page Application Library in Vanilla JS</title>
      <dc:creator>aj1thkr1sh</dc:creator>
      <pubDate>Sat, 20 Mar 2021 19:18:11 +0000</pubDate>
      <link>https://forem.com/aj1thkr1sh/single-page-application-in-vanilla-js-4cce</link>
      <guid>https://forem.com/aj1thkr1sh/single-page-application-in-vanilla-js-4cce</guid>
      <description>&lt;h1&gt;
  
  
  Flyght
&lt;/h1&gt;

&lt;p&gt;Hi, library for making Single Page Application (SPA) in Vanilla JavaScript library&lt;/p&gt;

&lt;p&gt;Flyght works based window.loction.hash whenever the hash changes, the configured URL will be triggered and page will be loaded&lt;/p&gt;

&lt;p&gt;One can easily make Single Page Application using the Flyght&lt;/p&gt;

&lt;p&gt;Simple, yet powerful&lt;/p&gt;

&lt;p&gt;Note : Single Page Application might affect SEO, choose appropriate case to use&lt;/p&gt;

&lt;h2&gt;
  
  
  Usage
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;script type="text/javascript" src="https://unpkg.com/flyght"&amp;gt;&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Simple right?&lt;/p&gt;

&lt;p&gt;Yes, Simple yet powerful&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuration
&lt;/h2&gt;

&lt;p&gt;You need to init the Flyght with required parameter, then your webpage will turn into SPA, like the Flyght way&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Flyght.init({
  idElement : "idElement",
  urlConfiguration : [ {
    hash : "#about",
    url : "/about.html",
    type : "GET"
  }, {
    hash : "#contact",
    url : "/contact.html",
    type : "GET"
  }, {
    hash : "#team",
    url : "/team.html",
    type : "GET"
  } ],
  requestHeader : [ {
    header : 'Content-type',
    value : 'application/json'
  } ]
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Configuration Parameters
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;idElement : Is the id of the DOM Element, where the loaded page is rendered&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;urlConfiguration : Is the Array of Object that has, url, hash, and request type&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;hash : The hash we provided&lt;/li&gt;
&lt;li&gt;url : For the given hash respective URL will be called and response will be attached to the idElement content&lt;/li&gt;
&lt;li&gt;type : The request type URL to be called&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;requestHeader : The header to be attached to the request&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;header : The header value to be attached to the header&lt;/li&gt;
&lt;li&gt;value : The value to the request header&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://github.com/aj1thkr1sh/flyght"&gt;⭐ on GitHub&lt;/a&gt; if you love&lt;/p&gt;

&lt;p&gt;Follow Me on &lt;br&gt;
&lt;a href="https://twitter.com/ajith2krishna"&gt;Twitter&lt;/a&gt;&lt;br&gt;
&lt;a href="//instagram.com/ajith_raghavan/"&gt;Intsagram&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.linkedin.com/in/ajith-raghavan/"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

</description>
      <category>flyght</category>
      <category>showdev</category>
      <category>javascript</category>
      <category>spa</category>
    </item>
    <item>
      <title>Access any HTML DOM Element, easier than ever</title>
      <dc:creator>aj1thkr1sh</dc:creator>
      <pubDate>Sat, 09 Jan 2021 08:41:33 +0000</pubDate>
      <link>https://forem.com/aj1thkr1sh/access-any-html-dom-element-easier-than-ever-628</link>
      <guid>https://forem.com/aj1thkr1sh/access-any-html-dom-element-easier-than-ever-628</guid>
      <description>&lt;h1&gt;
  
  
  EnFields
&lt;/h1&gt;

&lt;p&gt;Say, if you are developing the web application in JavaScript&lt;/p&gt;

&lt;p&gt;You need to manipulate the HTML DOM to add event listener or actions or anything by mapping the HTML DOM to JavaScript variables&lt;/p&gt;

&lt;p&gt;Example,&lt;br&gt;
if below is the HTML&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;......
&amp;lt;input type="text" id="name" placeholder="Name"&amp;gt;
&amp;lt;input type="email" id="email" placeholder="EMail"&amp;gt;
&amp;lt;input type="number" id="mobile_number" placeholder="Mobile Number"&amp;gt;
......
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;you need to map those HTML DOM to JavaScript variable to access&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;......
var name = document.getElementById("name");
var email = document.getElementById("email");
var mobileNumber = document.getElementById("mobile_number");
......
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;then you can get the values or attach event or whatever you want to manipulate the HTML DOM&lt;/p&gt;

&lt;h4&gt;
  
  
  🤔 What if the library does this for you?
&lt;/h4&gt;

&lt;h2&gt;
  
  
  Say Hi, to EnFields
&lt;/h2&gt;

&lt;p&gt;EnFields does the process for you&lt;/p&gt;

&lt;h2&gt;
  
  
  😲 How?
&lt;/h2&gt;

&lt;p&gt;It is very simple.  Include the library in you webpage&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;script src="https://unpkg.com/enfields"&amp;gt;&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;then,&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;EnFields.start();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🎉 Ta-da!
&lt;/h3&gt;

&lt;p&gt;The&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;input type="text" id="name" placeholder="Name"&amp;gt;&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;DOM will map to variable&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;_name
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  😍
&lt;/h1&gt;

&lt;h3&gt;
  
  
  How cool, right?
&lt;/h3&gt;

&lt;h3&gt;
  
  
  ⚙️ Naming Convention( What will be the name of the variable? )
&lt;/h3&gt;

&lt;p&gt;The name given to the id that is&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;id="name"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;, the "name" is taken, appending with preceding underscore, so, the&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;_name
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;is the variable generated, which will be added to window object.  So, directly using&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;_name
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;will refer to that HTML DOM&lt;/p&gt;

&lt;h3&gt;
  
  
  🔧 EnFields parameters
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;EnFields.start()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;accepts the object of below type,&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;queryElement : is the value, where the variable generation process starts, if not provided then, all id element from the HTML DOM will be generated&lt;/li&gt;
&lt;/ol&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  &amp;lt;form id="user-form"&amp;gt;......&amp;lt;/form&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  EnFields.start({
    queryElement: 'user-form'
  });

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The variable, will be generated for all the HTML DOM element containing id attribute, in user-form HTML DOM, including user-form tag&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;targetObject : is used to assign the generated variable to the provided target object, instead of window object&lt;/li&gt;
&lt;/ol&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  var UserForm = {};

  EnFields.start({
    targetObject: UserForm
  });

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The variables will be generated and will be stored to UserForm object instead of window object&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;idList : list of id names in array, if passed, variables will be generated only for the ids, contained in this array&lt;/li&gt;
&lt;/ol&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  EnFields.start({
    idList: ['name', 'email']
  });

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The variable will be generated only for name and email HTML DOM&lt;/p&gt;

&lt;p&gt;However, one can use all the three keys to make more flexible&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 plaintext"&gt;&lt;code&gt;EnFields.start({
  targetObject: UserForm,
  queryElement: 'user-form',
  idList: ['name', 'email']
});

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://github.com/aj1thkr1sh/EnField"&gt;⭐ Star on GitHub&lt;/a&gt; if you love&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>javascript</category>
      <category>web</category>
      <category>enfields</category>
    </item>
    <item>
      <title>Stylq: 5000+ downloads</title>
      <dc:creator>aj1thkr1sh</dc:creator>
      <pubDate>Sat, 21 Nov 2020 08:32:26 +0000</pubDate>
      <link>https://forem.com/aj1thkr1sh/stylq-5000-downloads-3cbi</link>
      <guid>https://forem.com/aj1thkr1sh/stylq-5000-downloads-3cbi</guid>
      <description>&lt;h3&gt;
  
  
  Hi, Thank You for 5000+ downloads on Stylq
&lt;/h3&gt;

&lt;p&gt;Stylq is the cool syntax language, allows user to make website more easily and effectively.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Stlyq is the Rich Syntax file that generate HTML file. &lt;/li&gt;
&lt;li&gt;Stylq uses variable to make website fastly and effectively.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Download and enjoy &lt;a href="https://www.npmjs.com/package/stylq"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/aj1thkr1sh/stylq"&gt;Star on GitHub&lt;/a&gt; if you like Stylq&lt;/p&gt;

&lt;h3&gt;
  
  
  Stylq CLI
&lt;/h3&gt;

&lt;p&gt;One can also use &lt;a href="https://www.npmjs.com/package/stylq-cli"&gt;Stylq CLI&lt;/a&gt; to achieve the same more effectively&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/aj1thkr1sh/stylq-cli"&gt;Stylq-CLI Github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks for the support&lt;/p&gt;

</description>
      <category>stylq</category>
      <category>javascript</category>
      <category>npm</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Stylq CLI</title>
      <dc:creator>aj1thkr1sh</dc:creator>
      <pubDate>Sat, 04 Jan 2020 06:35:01 +0000</pubDate>
      <link>https://forem.com/aj1thkr1sh/stylq-cli-1gph</link>
      <guid>https://forem.com/aj1thkr1sh/stylq-cli-1gph</guid>
      <description>&lt;h1&gt;
  
  
  Stylq
&lt;/h1&gt;

&lt;p&gt;Stylq is the cool syntax HTML Preprocessor.&lt;br&gt;
Stylq will allow user to make HTML file more easily.&lt;br&gt;
Stlyq is the Rich Syntax file to generator HTML file in the easy way.  Stylq is easy readable and writable.&lt;/p&gt;
&lt;h1&gt;
  
  
  Stylq CLI
&lt;/h1&gt;

&lt;p&gt;Stylq CLI is the easy way to process Stylq file&lt;/p&gt;
&lt;h2&gt;
  
  
  Command Line Usage
&lt;/h2&gt;

&lt;p&gt;For NPM&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  npm i stylq-cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For YARN&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  yarn add stylq-cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  General Syntax
&lt;/h2&gt;

&lt;p&gt;Use&lt;br&gt;
1.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;stylq FileName.stylq
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;to process the file and save as the same name&lt;/p&gt;

&lt;p&gt;2.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;stylq FileName.stylq TargetFile.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;to process and save to the target location&lt;/p&gt;

&lt;p&gt;Thanks for reading.&lt;/p&gt;

&lt;p&gt;Please Star on GitHub if you like it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/aj1thkr1sh/stylq"&gt;Stylq&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/aj1thkr1sh/Stylq-CLI"&gt;StylqCLI&lt;/a&gt;&lt;/p&gt;

</description>
      <category>stylq</category>
      <category>stylqcli</category>
      <category>cli</category>
      <category>html</category>
    </item>
    <item>
      <title>Find the real world match that you draw</title>
      <dc:creator>aj1thkr1sh</dc:creator>
      <pubDate>Sun, 01 Sep 2019 05:52:05 +0000</pubDate>
      <link>https://forem.com/aj1thkr1sh/find-the-real-world-match-that-you-draw-19pn</link>
      <guid>https://forem.com/aj1thkr1sh/find-the-real-world-match-that-you-draw-19pn</guid>
      <description>&lt;h1&gt;
  
  
  Hi I am Ajith, I have created the web application called MagicDraw
&lt;/h1&gt;

&lt;p&gt;You can draw the image and find the near exact match of the real world picture&lt;/p&gt;

&lt;p&gt;This application (MagicDraw) creation date  :  30/08/2019&lt;/p&gt;

&lt;p&gt;Take a look in Instagram  : &lt;a href="https://www.instagram.com/p/B10_CE-jDq8/?igshid=1toi26d7yxo9b"&gt;https://www.instagram.com/p/B10_CE-jDq8/?igshid=1toi26d7yxo9b&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Take a look&lt;/p&gt;

&lt;p&gt;cover_image:&lt;a href="https://thepracticalde/v.s3.amazonaws.com/i/omss4z0j88w0hesym7ew.png"&gt;https://thepracticalde/v.s3.amazonaws.com/i/omss4z0j88w0hesym7ew.png&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Color You console, with iPrint</title>
      <dc:creator>aj1thkr1sh</dc:creator>
      <pubDate>Sat, 15 Jun 2019 05:16:18 +0000</pubDate>
      <link>https://forem.com/aj1thkr1sh/color-you-console-with-iprint-4f3p</link>
      <guid>https://forem.com/aj1thkr1sh/color-you-console-with-iprint-4f3p</guid>
      <description>&lt;h1&gt;
  
  
  iPrint
&lt;/h1&gt;

&lt;p&gt;Hi, cosole.log(value);&lt;br&gt;
is cool 😎 but it is very large syntax to, type.&lt;br&gt;
And,&lt;br&gt;&lt;br&gt;
how cool if you have to just do type&lt;/p&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  iPrint('Hi');
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;and adding color to the console?&lt;br&gt;
😲&lt;/p&gt;

&lt;h2&gt;
  
  
  Here you are!
&lt;/h2&gt;

&lt;p&gt;iPrint is the cool console logger.&lt;/p&gt;

&lt;p&gt;iPrint gives color to your "console"!&lt;/p&gt;

&lt;h2&gt;
  
  
  Command Line Usage
&lt;/h2&gt;

&lt;p&gt;For NPM&lt;/p&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  npm install iprint
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;or&lt;/p&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  npm i iprint
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h1&gt;
  
  
  Example
&lt;/h1&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
  var iPrint = require('iPrint').iPrinter;

  iPrint('Hi, everyone');

  iPrint('Hi everyone - Magenta Color','magenta');

  iPrint('Hi, everyone - Blue Background','bgblue');

  iPrint('iPrintDefaultColor','cyan'); // Changes default output color from 'blue' to 'cyan'

  iPrint('Hi, default color changed form blue to cyan');

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  General Syntax
&lt;/h2&gt;

&lt;p&gt;Just type as follow&lt;/p&gt;

&lt;p&gt;..1. To just print the string (default color is blue)&lt;/p&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    iPrint(value);
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;..2. To add color to your string&lt;/p&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    iPrint(value,colorValue);
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;..3. To add background color to your string&lt;/p&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    iPrint(value,backgroundColorValue);
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;..4. To change default color to your string&lt;/p&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    iPrint('iPrintDefaultColor',colorValue);
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;'iPrintDefaultColor' is strict notation of changing the default color of output string.&lt;/p&gt;

&lt;p&gt;Here after output's default color will be changed.&lt;/p&gt;

&lt;h1&gt;
  
  
  Color Values
&lt;/h1&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    iPrint(value,colorValue);
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;colorValue = 'blue'&lt;/li&gt;
&lt;li&gt;colorValue = 'red'&lt;/li&gt;
&lt;li&gt;colorValue = 'green'&lt;/li&gt;
&lt;li&gt;colorValue = 'yellow'&lt;/li&gt;
&lt;li&gt;colorValue = 'cyan'&lt;/li&gt;
&lt;li&gt;colorValue = 'white'&lt;/li&gt;
&lt;li&gt;colorValue = 'black'&lt;/li&gt;
&lt;li&gt;colorValue = 'magenta'&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  Background Color Values
&lt;/h1&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      iPrint(value,backgroundColorValue);
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;colorValue = 'bgblue'&lt;/li&gt;
&lt;li&gt;colorValue = 'bgred'&lt;/li&gt;
&lt;li&gt;colorValue = 'bggreen'&lt;/li&gt;
&lt;li&gt;colorValue = 'bgyellow'&lt;/li&gt;
&lt;li&gt;colorValue = 'bgcyan'&lt;/li&gt;
&lt;li&gt;colorValue = 'bgwhite'&lt;/li&gt;
&lt;li&gt;colorValue = 'bgblack'&lt;/li&gt;
&lt;li&gt;colorValue = 'bgmagenta'&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>iprint</category>
      <category>javascript</category>
      <category>node</category>
    </item>
  </channel>
</rss>
