<?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: aj1thkr1sh</title>
    <description>The latest articles on DEV Community by aj1thkr1sh (@aj1thkr1sh).</description>
    <link>https://dev.to/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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F71446%2F324513a4-e995-40ee-b835-4c242aa94eeb.png</url>
      <title>DEV Community: aj1thkr1sh</title>
      <link>https://dev.to/aj1thkr1sh</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aj1thkr1sh"/>
    <language>en</language>
    <item>
      <title>Building a Coding Agent on the Command Line : AllegroCode</title>
      <dc:creator>aj1thkr1sh</dc:creator>
      <pubDate>Fri, 21 Aug 2026 12:51:02 +0000</pubDate>
      <link>https://dev.to/aj1thkr1sh/building-a-coding-agent-on-the-command-line-allegrocode-2h4n</link>
      <guid>https://dev.to/aj1thkr1sh/building-a-coding-agent-on-the-command-line-allegrocode-2h4n</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyuo14bgo2bjo86kxlo9t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyuo14bgo2bjo86kxlo9t.png" alt=" " width="800" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Everyone is &lt;em&gt;using&lt;/em&gt; Coding Agents right now&lt;/p&gt;

&lt;p&gt;I need to understand how it's been Built, so I set out to Learn, and the best way know to Learn how something works is to Build it&lt;/p&gt;

&lt;p&gt;The result is &lt;strong&gt;&lt;a href="https://github.com/ajithraghavan/AllegroCode" rel="noopener noreferrer"&gt;AllegroCode&lt;/a&gt;&lt;/strong&gt;, a minimal Command Line Coding Harness that can Read, Edit, and Run Code on your behalf!&lt;/p&gt;

&lt;p&gt;It isn't trying to compete with the polished Tools you already use, it's a experimental Learning project, deliberately stripped down to the essentials so the Mechanics are impossible to miss&lt;/p&gt;

&lt;p&gt;AllegroCode is built on top of &lt;strong&gt;&lt;a href="https://github.com/ajithraghavan/AllegroAgent" rel="noopener noreferrer"&gt;AllegroAgent&lt;/a&gt;&lt;/strong&gt;, a small Agent Framework  &lt;a href="https://ajithraghavan.github.io/blog/Harness-Engineering/" rel="noopener noreferrer"&gt;wrote&lt;/a&gt; earlier&lt;/p&gt;

&lt;p&gt;This post walks through what I set out to understand, how the Coding Agent actually Works&lt;/p&gt;

&lt;h2&gt;
  
  
  The foundation, briefly
&lt;/h2&gt;

&lt;p&gt;AllegroAgent is a lightweight Python Framework for Stateful, Tool using LLM Agents&lt;/p&gt;

&lt;p&gt;You give its &lt;code&gt;Agent&lt;/code&gt; Class a Model string and a list of Tools, call &lt;code&gt;run()&lt;/code&gt;, and it handles the Conversation History, Provider Routing, and the Tool Calling Loop, send the Prompt and Tool Schemas to the Model, execute whatever Tools it asks for, feed the results back, and repeat until the Model returns a final answer&lt;/p&gt;

&lt;p&gt;That Loop is the beating heart of any Coding Agent, and having it as a reusable Library is what made AllegroCode small (I wrote about the Framework's design in a separate &lt;a href="https://ajithraghavan.github.io/blog/Harness-Engineering/" rel="noopener noreferrer"&gt;post&lt;/a&gt;, so I'll keep it short here and focus on the Coding Agent)&lt;/p&gt;

&lt;h2&gt;
  
  
  AllegroCode : a Coding Agent as a thin layer
&lt;/h2&gt;

&lt;p&gt;A Framework is a theory until something real is Built on it&lt;/p&gt;

&lt;p&gt;AllegroCode is that something : a Coding Harness that lives on your Command Line, built directly on AllegroAgent's Provider and Tool System&lt;/p&gt;

&lt;p&gt;Where AllegroAgent ships with a single reference Tool, a Coding Agent needs Tools&lt;/p&gt;

&lt;p&gt;AllegroCode gives the Agent the Tools it needs to actually work in a CodeBase : &lt;strong&gt;read&lt;/strong&gt; files, &lt;strong&gt;edit&lt;/strong&gt; them, run &lt;strong&gt;bash&lt;/strong&gt; commands, and &lt;strong&gt;list&lt;/strong&gt; directory contents, all driven from the CLI&lt;/p&gt;

&lt;p&gt;Getting started is two lines :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;OPENROUTER_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"sk-..."&lt;/span&gt;
allegro-code
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I wired it up to &lt;strong&gt;OpenRouter&lt;/strong&gt; so you can bring your own Model like Claude, GPT, Gemini, whatever you like, behind one API key&lt;/p&gt;

&lt;p&gt;It defaults to &lt;code&gt;openrouter:openai/gpt-4o-mini&lt;/code&gt;, and you can swap Models with a flag :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;allegro-code &lt;span class="nt"&gt;--model&lt;/span&gt; &lt;span class="s2"&gt;"openrouter/anthropic/claude-sonnet-20240620"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There are the usual knobs to tweek too — &lt;code&gt;--temperature&lt;/code&gt;, &lt;code&gt;--max-tokens&lt;/code&gt;, and a &lt;code&gt;--yes&lt;/code&gt; / &lt;code&gt;-y&lt;/code&gt; flag to skip Confirmation Prompts when you trust the Agent to Run unattended&lt;/p&gt;

&lt;p&gt;The thing that is important is, AllegroCode was mostly a matter of &lt;em&gt;writing Tools&lt;/em&gt;!&lt;/p&gt;

&lt;p&gt;The Loop, the History Management, the Provider Routing, the "Call Tool -&amp;gt; Feed Result Back -&amp;gt; Repeat" Machinery and all of that came from the Framework&lt;/p&gt;

&lt;p&gt;Adding OpenRouter was just implementing one more provider&lt;/p&gt;

&lt;p&gt;The Coding Agent itself became a thin, understandable layer on top!&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it yourself
&lt;/h2&gt;

&lt;p&gt;AllegroCode is Open Source under Apache 2.0.&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-code
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;OPENROUTER_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"sk-..."&lt;/span&gt;
allegro-code
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AllegroCode&lt;/strong&gt; (The Coding Harness) : &lt;a href="https://github.com/ajithraghavan/AllegroCode" rel="noopener noreferrer"&gt;https://github.com/ajithraghavan/AllegroCode&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AllegroAgent&lt;/strong&gt; (The Framework Underneath) : &lt;a href="https://github.com/ajithraghavan/AllegroAgent" rel="noopener noreferrer"&gt;https://github.com/ajithraghavan/AllegroAgent&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

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

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

</description>
    </item>
    <item>
      <title>Attention Is All You Need, Building a Transformer for Thanglish-to-Tamil</title>
      <dc:creator>aj1thkr1sh</dc:creator>
      <pubDate>Mon, 15 Jun 2026 11:53:26 +0000</pubDate>
      <link>https://dev.to/aj1thkr1sh/attention-is-all-you-need-building-a-transformer-for-thanglish-to-tamil-4l17</link>
      <guid>https://dev.to/aj1thkr1sh/attention-is-all-you-need-building-a-transformer-for-thanglish-to-tamil-4l17</guid>
      <description>&lt;h1&gt;
  
  
  Attention Is All You Need, Building a Transformer for Thanglish-to-Tamil
&lt;/h1&gt;

&lt;h1&gt;
  
  
  Where We Left Off 📜
&lt;/h1&gt;

&lt;p&gt;In my &lt;a href="https://dev.to/aj1thkr1sh/cnn-lstm-hybrid-architecture-for-thanglish-to-tamil-bridging-26-letters-to-247-characters-j4n"&gt;last post&lt;/a&gt; I built &lt;strong&gt;three&lt;/strong&gt; architectures for "Thanglish to Tamil" Transliteration on the &lt;a href="https://github.com/google-research-datasets/dakshina" rel="noopener noreferrer"&gt;Google Dakshina Dataset&lt;/a&gt; using a &lt;strong&gt;Vanilla LSTM&lt;/strong&gt;, a &lt;strong&gt;BiGRU with Attention&lt;/strong&gt;, and a &lt;strong&gt;CNN-LSTM&lt;/strong&gt; Architecture&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;CNN-LSTM&lt;/strong&gt; won that round, not because it was the most Accurate, but because it matched the others while being &lt;strong&gt;16x smaller&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;But one Architecture was sitting in the corner the whole time, waiting 😏&lt;/p&gt;

&lt;p&gt;(Optimus Prime)&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💭 What if I just use the thing that Attention was actually &lt;em&gt;made&lt;/em&gt; for?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So this weekend I built &lt;strong&gt;The Transformer&lt;/strong&gt; the Original &lt;strong&gt;Encoder-Decoder&lt;/strong&gt; one from &lt;em&gt;Attention Is All You Need&lt;/em&gt; (Vaswani et al., 2017) from scratch using &lt;strong&gt;PyTorch&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  The Architecture 🏗️
&lt;/h1&gt;

&lt;p&gt;&lt;a href="/assets/images/Transformer-Thanglish-To-Tamil/Transformer.png" class="article-body-image-wrapper"&gt;&lt;img src="/assets/images/Transformer-Thanglish-To-Tamil/Transformer.png" alt="Transformer Architecture"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is the Clasical &lt;strong&gt;Encoder-Decoder&lt;/strong&gt; Transformer : &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scaled Dot-Product Attention&lt;/strong&gt;
&lt;img src="/assets/images/Transformer-Thanglish-To-Tamil/scaled-dot-product-attention.png" alt="Scaled Dot Product Attention"&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-Head Attention&lt;/strong&gt; — 8 heads, separate &lt;code&gt;W_q, W_k, W_v&lt;/code&gt; and an output projection &lt;code&gt;W_o&lt;/code&gt;
&lt;img src="/assets/images/Transformer-Thanglish-To-Tamil/multi-head-attention.png" alt="Multi Head Attention"&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sinusoidal Positional Encoding&lt;/strong&gt;
&lt;img src="/assets/images/Transformer-Thanglish-To-Tamil/positional-encoding.png" alt="Positional Encoding"&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Encoder&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Decoder&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Masking&lt;/strong&gt; : A padding mask so we ignore &lt;code&gt;&amp;lt;PAD&amp;gt;&lt;/code&gt;, and a Causal Mask so the Decoder can’t peek at future Characters&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔧 Configuration :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="err"&gt;d_model&lt;/span&gt; &lt;span class="err"&gt;(Embedding&lt;/span&gt; &lt;span class="err"&gt;Dim)&lt;/span&gt;      &lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="err"&gt;256&lt;/span&gt;
&lt;span class="err"&gt;n_heads&lt;/span&gt; &lt;span class="err"&gt;(Attention&lt;/span&gt; &lt;span class="err"&gt;Heads)&lt;/span&gt;    &lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="err"&gt;8&lt;/span&gt;
&lt;span class="err"&gt;n_layers&lt;/span&gt; &lt;span class="err"&gt;(Encoder&lt;/span&gt; &lt;span class="err"&gt;/&lt;/span&gt; &lt;span class="err"&gt;Decoder)&lt;/span&gt; &lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="err"&gt;3&lt;/span&gt;
&lt;span class="err"&gt;d_ff&lt;/span&gt; &lt;span class="err"&gt;(Feed&lt;/span&gt; &lt;span class="err"&gt;Forward&lt;/span&gt; &lt;span class="err"&gt;Dim)&lt;/span&gt;      &lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="err"&gt;512&lt;/span&gt;
&lt;span class="py"&gt;dropout&lt;/span&gt;                      &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;0.1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same &lt;strong&gt;Character Level&lt;/strong&gt;, same &lt;strong&gt;Seq2Seq&lt;/strong&gt; setup as before&lt;/p&gt;

&lt;h1&gt;
  
  
  Evaluation 📈
&lt;/h1&gt;

&lt;p&gt;Used Google Colab for Training&lt;/p&gt;

&lt;p&gt;Note : Same as previous post, these Accuracy are not too high, I am just tweaking Hyperparameter like Regularization, with limited Compute Resource, just sharing the current progress here&lt;/p&gt;

&lt;h3&gt;
  
  
  Transformer (Encoder-Decoder)
&lt;/h3&gt;

&lt;p&gt;Current Total Parameters : &lt;strong&gt;3986994&lt;/strong&gt;&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.1178 | Val Loss : 0.3287 | Val Acc : 57.73% | Val CER : 15.49%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Test Exact Match Accuracy : &lt;strong&gt;56.29%&lt;/strong&gt;&lt;br&gt;
Test Character Error Rate : &lt;strong&gt;15.92%&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Val Accuracy was still climbing (60.14% on Dev Set) and Early Stopping stopped at epoch 48&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Best Accuracy of every Model is Built&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Validation Loss in a Completely Different Improved&lt;/li&gt;
&lt;li&gt;Demo Outputs good&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Overfitting : Training Loss dropped to ~0.07 while Val Loss is around 0.33&lt;/li&gt;
&lt;li&gt;Still slips on like : &lt;code&gt;puthagam&lt;/code&gt; for "புதகம்" instead of "புத்தகம்"&lt;/li&gt;
&lt;li&gt;Second Heaviest Model seen so far&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Fixes
&lt;/h4&gt;

&lt;p&gt;Yes, there are few fixes we can do if we find time later&lt;/p&gt;

&lt;h1&gt;
  
  
  🏆 The Match : All Four Architectures
&lt;/h1&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Architecture&lt;/th&gt;
&lt;th&gt;Parameters&lt;/th&gt;
&lt;th&gt;Test Accuracy&lt;/th&gt;
&lt;th&gt;Test CER&lt;/th&gt;
&lt;th&gt;Val Loss&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CNN-LSTM&lt;/td&gt;
&lt;td&gt;767,666&lt;/td&gt;
&lt;td&gt;50.55%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;15.81%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.9868&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vanilla LSTM&lt;/td&gt;
&lt;td&gt;1,411,890&lt;/td&gt;
&lt;td&gt;51.57%&lt;/td&gt;
&lt;td&gt;16.36%&lt;/td&gt;
&lt;td&gt;1.4453&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Transformer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;3,986,994&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;56.29%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;15.92%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.3287&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BiGRU + Attention&lt;/td&gt;
&lt;td&gt;12,580,914&lt;/td&gt;
&lt;td&gt;50.60%&lt;/td&gt;
&lt;td&gt;16.44%&lt;/td&gt;
&lt;td&gt;1.3492&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h1&gt;
  
  
  So… Who Actually Wins? 🤷
&lt;/h1&gt;

&lt;p&gt;This is where it gets fun, because the answer is &lt;strong&gt;two different Winners depending on the Question&lt;/strong&gt;&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;br&gt;
.&lt;br&gt;
.&lt;br&gt;
.&lt;/p&gt;

&lt;h3&gt;
  
  
  If the question is “Best Quality” : Transformer wins 🎉
&lt;/h3&gt;

&lt;p&gt;It jumps to &lt;strong&gt;56.29%&lt;/strong&gt; accuracy : a &lt;strong&gt;+4.72 point&lt;/strong&gt; lead over the next best (Vanilla LSTM)&lt;/p&gt;

&lt;p&gt;It ties the CNN-LSTM on CER (15.92% vs 15.81% — noise)&lt;/p&gt;

&lt;p&gt;Its Validation Loss (0.3287) shows it is genuinely Modelling the problem far better, not just Memorizing&lt;/p&gt;

&lt;h3&gt;
  
  
  If the question is “Best Efficiency” : CNN-LSTM still wins 🥳
&lt;/h3&gt;

&lt;p&gt;The CNN-LSTM reaches CER at &lt;strong&gt;1/5th&lt;/strong&gt; the Parameters of the Transformer (and 16x smaller than BiGRU + Attention)&lt;/p&gt;

&lt;p&gt;For Deployment, Inference Speed, and “does it earn its size” : Convolution still Rules&lt;/p&gt;

&lt;p&gt;So my earlier Thesis survives, just with a footnote :&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For local, "n-gram-driven Transliteration", &lt;strong&gt;Convolution is the efficiency winner&lt;/strong&gt; But when you can go for the the Parameters, &lt;strong&gt;global Attention is the Accuracy winner&lt;/strong&gt; Right tool&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And honestly : both are fixable further, Label Smoothing, Warmup, more Regularization could change this table again. That’s the whole point :&lt;/p&gt;

&lt;h3&gt;
  
  
  Because we need to Experiment and Find 🔬
&lt;/h3&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;

</description>
      <category>ai</category>
      <category>transformers</category>
      <category>genai</category>
      <category>deeplearning</category>
    </item>
    <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://dev.to/aj1thkr1sh/allegroagent-a-lightweight-python-framework-for-building-stateful-ai-agents-15f4</link>
      <guid>https://dev.to/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://dev.to/aj1thkr1sh/cnn-lstm-hybrid-architecture-for-thanglish-to-tamil-bridging-26-letters-to-247-characters-j4n</link>
      <guid>https://dev.to/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://dev.to/aj1thkr1sh/try-my-35-million-parameters-model-instead-for-18o2</link>
      <guid>https://dev.to/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;
  
  
  🚨&amp;nbsp;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://dev.to/aj1thkr1sh/meet-qmd-quick-markdown-1mpc</link>
      <guid>https://dev.to/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://dev.to/aj1thkr1sh/say-hi-to-phoneslides-the-vertical-first-presentation-tool-1bb6</link>
      <guid>https://dev.to/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://dev.to/aj1thkr1sh/yaali-the-tamil-conversing-ai-35n8</link>
      <guid>https://dev.to/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://dev.to/aj1thkr1sh/single-page-application-in-vanilla-js-4cce</link>
      <guid>https://dev.to/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://dev.to/aj1thkr1sh/access-any-html-dom-element-easier-than-ever-628</link>
      <guid>https://dev.to/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://dev.to/aj1thkr1sh/stylq-5000-downloads-3cbi</link>
      <guid>https://dev.to/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://dev.to/aj1thkr1sh/stylq-cli-1gph</link>
      <guid>https://dev.to/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>
  </channel>
</rss>
