<?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: Karan Raj</title>
    <description>The latest articles on DEV Community by Karan Raj (@karan_raj_1899d579c759c1f).</description>
    <link>https://dev.to/karan_raj_1899d579c759c1f</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%2F1660667%2F2278e384-c7b6-4c5d-9c44-3268627dfb9a.png</url>
      <title>DEV Community: Karan Raj</title>
      <link>https://dev.to/karan_raj_1899d579c759c1f</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/karan_raj_1899d579c759c1f"/>
    <language>en</language>
    <item>
      <title>TriageAgent: a fully local AI that triages support tickets for my dev team(HALF BAKED)</title>
      <dc:creator>Karan Raj</dc:creator>
      <pubDate>Sun, 04 Oct 2026 19:10:57 +0000</pubDate>
      <link>https://dev.to/karan_raj_1899d579c759c1f/triageagent-a-fully-local-ai-that-triages-support-tickets-for-my-dev-teamhalf-baked-159k</link>
      <guid>https://dev.to/karan_raj_1899d579c759c1f/triageagent-a-fully-local-ai-that-triages-support-tickets-for-my-dev-teamhalf-baked-159k</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01"&gt;Hacktoberfest Weekend Challenge: Build for a Friend&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;My dev team's biggest time-sink isn't writing code — it's triaging support tickets. Every morning someone reads a wall of messages, figures out which tickets we've already solved and which need a real engineer, and routes them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TriageAgent&lt;/strong&gt; does that automatically. You paste in our support chat log — no strict format, just messages that mention a ticket ID like &lt;code&gt;#123&lt;/code&gt; — and it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;groups&lt;/strong&gt; messages into ticket threads by their ticket ID,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;builds a local index&lt;/strong&gt; of every past thread and of each developer's past work,&lt;/li&gt;
&lt;li&gt;for a new ticket, either &lt;strong&gt;writes a short internal note&lt;/strong&gt; to the support team (when a similar &lt;em&gt;resolved&lt;/em&gt; thread exists) or &lt;strong&gt;routes it to the right dev&lt;/strong&gt; based on whose past responses it most resembles,&lt;/li&gt;
&lt;li&gt;and prints &lt;strong&gt;case-based reports&lt;/strong&gt;: open tickets per dev, critical cases, and a full case list.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No cloud, no API keys, nothing leaves the machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;It runs as a CLI and a small web UI. Two real examples from the sample data:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ python cli.py triage "#999 the login page crashes on Safari"
action: note
note: "Duplicate of #101. Fix applied: Safari-specific JS bug in login
       handler fixed in v2.3.1. Handled by: alice."
&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;$ python cli.py triage "#999 our webhook receiver is returning 500s"
action: route
assigned_dev: carol
reason: "A very similar ticket already exists (#108) but is still open,
         so I routed to 'carol' — their past work is closest."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmlvk7wt63f5a0h4jgxge.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%2Fmlvk7wt63f5a0h4jgxge.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;The whole thing is on GitHub:&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/karan-2004" rel="noopener noreferrer"&gt;
        karan-2004
      &lt;/a&gt; / &lt;a href="https://github.com/karan-2004/triage-agent" rel="noopener noreferrer"&gt;
        triage-agent
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;TriageAgent&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;A local, open-source support-ticket triage agent for a dev team. Point it at a
chat log; it groups messages into ticket threads, builds an index, then for any
new ticket it either &lt;strong&gt;writes a short internal note to the support team&lt;/strong&gt; (when
a similar resolved thread exists) or &lt;strong&gt;routes it to the developer&lt;/strong&gt; whose past
responses it most resembles. It also prints case-based reports (open tickets
per dev, critical cases, and a full case list).&lt;/p&gt;
&lt;p&gt;Built with local AI at its core (Ollama + open models). No data leaves your
machine.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;How it works&lt;/h2&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Ingest&lt;/strong&gt; — parse a free-form chat log, group messages by ticket ID
embed each thread (&lt;code&gt;nomic-embed-text&lt;/code&gt;), store in a local vector index. It
also builds one "profile" embedding per developer from every message they
wrote.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Triage&lt;/strong&gt; — embed the new ticket and search
&lt;ul&gt;
&lt;li&gt;if a past &lt;strong&gt;resolved&lt;/strong&gt; thread is similar enough (≥ threshold)…&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/karan-2004/triage-agent" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;The open-source AI is the point, so everything runs locally:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ollama&lt;/strong&gt; serving two open-weight models:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;nomic-embed-text&lt;/code&gt; — embeddings for similarity search,&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;llama3.2:1b&lt;/code&gt; — writes the internal notes.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Python&lt;/strong&gt; glue: a tiny numpy vector store (cosine similarity), a free-form chat-log parser that groups messages by ticket ID, and a simple RAG flow.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Streamlit&lt;/strong&gt; for the browser UI.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The flow: parse the chat log → embed each thread and each developer's profile → store locally. For a new ticket, embed it and search. If the best &lt;em&gt;resolved&lt;/em&gt; match clears a similarity threshold, the LLM drafts the note from that thread's resolution; otherwise it routes to the dev whose profile is closest.&lt;/p&gt;

&lt;p&gt;One detail I'm proud of: it only auto-notes from &lt;strong&gt;resolved&lt;/strong&gt; threads. An open duplicate gets routed instead of answered with a hallucinated fix — that alone cut the wrong answers to near zero. The suite of 26 pytest tests covers the parser, reports, store, and triage decisions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;Support tickets are full of things you don't want on someone else's server: customer emails, login problems, billing details. Because Ollama and the models are open-weight, &lt;strong&gt;this all runs on a laptop with the Wi-Fi off&lt;/strong&gt; — the tickets never leave the machine.&lt;/p&gt;

&lt;p&gt;That's what a closed API wouldn't let us do. A hosted model means shipping every ticket thread to a vendor. An open stack let us:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;keep the data local&lt;/strong&gt; — no upload, no retention policy to worry about;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;swap models freely&lt;/strong&gt; — if we outgrow &lt;code&gt;llama3.2:1b&lt;/code&gt;, point &lt;code&gt;TRIAGE_CHAT_MODEL&lt;/code&gt; at a bigger model, no code change;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;run it for free&lt;/strong&gt; — no per-token bill for triaging our own backlog.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Open innovation isn't a nice-to-have here; it's the reason the tool is safe to point at real tickets. Hope we devs really needs to keeps the bugs not to fly onto third party server exposing its source. &lt;/p&gt;

&lt;p&gt;Also Context of tickets need to be shared between the devs so that anyone can respond to it at the earliest. This agent acts as the context manager with autonomous response generator.&lt;/p&gt;

&lt;p&gt;Honestly it is still half baked and untested in the real environment. Need to involve in several iterations to make it helpful for my friends. So let it be outside rewarding category.&lt;/p&gt;

&lt;p&gt;Credits: Opencode with Deepseek 4(helped to convert my idea into code)&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>hf26challenge</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
