<?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: Chaitanya Sharma</title>
    <description>The latest articles on DEV Community by Chaitanya Sharma (@sharmachaitanya945).</description>
    <link>https://dev.to/sharmachaitanya945</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%2F1826918%2Fd6a203d4-7d45-44fd-9dec-735d53d8f117.jpeg</url>
      <title>DEV Community: Chaitanya Sharma</title>
      <link>https://dev.to/sharmachaitanya945</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sharmachaitanya945"/>
    <language>en</language>
    <item>
      <title># 🤖 How I Built LegalEase AI: A Semantic Legal Assistant with MindsDB, Gemini &amp; Ollama</title>
      <dc:creator>Chaitanya Sharma</dc:creator>
      <pubDate>Sat, 21 Jun 2025 20:53:42 +0000</pubDate>
      <link>https://dev.to/sharmachaitanya945/-how-i-built-legalease-ai-a-semantic-legal-assistant-with-mindsdb-gemini-ollama-39j7</link>
      <guid>https://dev.to/sharmachaitanya945/-how-i-built-legalease-ai-a-semantic-legal-assistant-with-mindsdb-gemini-ollama-39j7</guid>
      <description>&lt;h2&gt;
  
  
  🚀 What Is LegalEase AI?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;LegalEase AI&lt;/strong&gt; is a full-stack legal research assistant that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Performs fast, intelligent &lt;strong&gt;semantic search&lt;/strong&gt; across legal documents&lt;/li&gt;
&lt;li&gt;Answers &lt;strong&gt;natural language legal questions&lt;/strong&gt; using a Gemini-powered agent&lt;/li&gt;
&lt;li&gt;Supports &lt;strong&gt;metadata filtering&lt;/strong&gt; and document classification&lt;/li&gt;
&lt;li&gt;Includes both a &lt;strong&gt;CLI&lt;/strong&gt; and &lt;strong&gt;Flask web UI&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Uses &lt;strong&gt;MindsDB&lt;/strong&gt; for all intelligent querying and indexing&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧱 Stack I Used
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Tech&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Backend&lt;/td&gt;
&lt;td&gt;Flask + MindsDB SDK&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vector Store&lt;/td&gt;
&lt;td&gt;PostgreSQL + pgvector&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Embeddings&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;mxbai-embed-large&lt;/code&gt; via Ollama&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reranking&lt;/td&gt;
&lt;td&gt;Gemini 2.0 Flash&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Frontend&lt;/td&gt;
&lt;td&gt;HTML, Bootstrap, &lt;code&gt;styles.css&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Infra&lt;/td&gt;
&lt;td&gt;Docker (for Ollama, PostgreSQL, MindsDB)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🔍 Key Features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Semantic Search via MindsDB KB
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;legal_kb_pg&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="k"&gt;LIKE&lt;/span&gt; &lt;span class="s1"&gt;'Miranda rights'&lt;/span&gt;
&lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'category'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Criminal Law'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. PGVector Indexing
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;KNOWLEDGE_BASE&lt;/span&gt; &lt;span class="n"&gt;legal_kb_pg&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Scheduled Job Ingestion
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="n"&gt;JOB&lt;/span&gt; &lt;span class="n"&gt;ingest_from_csv&lt;/span&gt;
&lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;legal_kb_pg&lt;/span&gt;
  &lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;legal_docs&lt;/span&gt;
  &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;doc_id&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;LAST&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;EVERY&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;HOUR&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Gemini Agent with KB Attached
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="n"&gt;AGENT&lt;/span&gt; &lt;span class="n"&gt;legal_gemini_agent&lt;/span&gt;
&lt;span class="k"&gt;USING&lt;/span&gt;
  &lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'gemini-2.0-flash'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;google_api_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;your-key&amp;gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;include_knowledge_bases&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'legal_kb_pg'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="n"&gt;prompt_template&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'You are LegalEase AI, a legal research assistant. Question: {{question}}'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  📸 User Interface
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/search&lt;/code&gt;: Ask legal questions and see search results with relevance scores.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/agent&lt;/code&gt;: Ask natural questions like "What happened in Roe v. Wade?"&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/upload&lt;/code&gt;: Insert new legal documents into the KB.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/jobs&lt;/code&gt;: View or create automatic ingestion jobs.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/initialize&lt;/code&gt;: Create your KB and Agent in one click.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;All queries are handled via MindsDB and routed through Gemini and Ollama for reasoning + embeddings.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🐞 Bug Report &amp;amp; Open Source Contribution
&lt;/h2&gt;

&lt;p&gt;I also discovered and reported a real-world issue while integrating MindsDB and Ollama:&lt;/p&gt;

&lt;p&gt;🔗 &lt;a href="https://github.com/mindsdb/mindsdb/issues/11143" rel="noopener noreferrer"&gt;View my GitHub Issue on MindsDB&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This was a great experience contributing back to a platform that’s been super helpful.&lt;/p&gt;




&lt;h2&gt;
  
  
  📁 GitHub Repository
&lt;/h2&gt;

&lt;p&gt;🔗 &lt;a href="https://github.com/sharmachaitanya945/legalease" rel="noopener noreferrer"&gt;https://github.com/sharmachaitanya945/legalease&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;README.md&lt;/code&gt; with setup instructions&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;queries.py&lt;/code&gt; for full KB + agent automation&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;styles.css&lt;/code&gt;, templates, &lt;code&gt;SUBMISSION.md&lt;/code&gt;, and &lt;code&gt;CONTRIBUTING.md&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💬 Want to Collaborate?
&lt;/h2&gt;

&lt;p&gt;I’d love to work with others on expanding this project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add chat memory&lt;/li&gt;
&lt;li&gt;Create an LLM Router&lt;/li&gt;
&lt;li&gt;Multi-KB and table question merging&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;🧑‍💻 See &lt;a href="https://github.com/sharmachaitanya945/legalease/blob/main/CONTRIBUTING.md" rel="noopener noreferrer"&gt;CONTRIBUTING.md&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🧠 Summary
&lt;/h2&gt;

&lt;p&gt;LegalEase AI shows how MindsDB can power:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Embedded knowledge search&lt;/li&gt;
&lt;li&gt;Semantic metadata filtering&lt;/li&gt;
&lt;li&gt;RAG-style agentic reasoning&lt;/li&gt;
&lt;li&gt;A full legal research pipeline!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks to the MindsDB team and this amazing community 🙏&lt;br&gt;&lt;br&gt;
Happy to answer any questions or hear your feedback below! 👇&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Built with ❤️ by &lt;a href="https://github.com/sharmachaitanya945" rel="noopener noreferrer"&gt;sharmachaitanya945&lt;/a&gt; using MindsDB, Ollama, Gemini &amp;amp; Flask.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Building CareerAgent: An AI-Powered Job Search Assistant with LangChain and Gemini</title>
      <dc:creator>Chaitanya Sharma</dc:creator>
      <pubDate>Sun, 13 Apr 2025 18:42:24 +0000</pubDate>
      <link>https://dev.to/sharmachaitanya945/building-careeragent-an-ai-powered-job-search-assistant-with-langchain-and-gemini-319i</link>
      <guid>https://dev.to/sharmachaitanya945/building-careeragent-an-ai-powered-job-search-assistant-with-langchain-and-gemini-319i</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.amazonaws.com%2Fuploads%2Farticles%2Fqhv6g1aza0ndyfdecvxe.jpg" 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%2Fqhv6g1aza0ndyfdecvxe.jpg" alt="CareerAgent Demo Video" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Have you ever wished for an AI assistant that could analyze your resume, find matching jobs, and even write cover letters for you? That's exactly what I built with CareerAgent, my submission for Quira Quest 25!&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Job searching is a tedious, time-consuming process that involves:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Figuring out which job titles match your skills&lt;/li&gt;
&lt;li&gt;Searching through numerous job boards&lt;/li&gt;
&lt;li&gt;Customizing cover letters for each application&lt;/li&gt;
&lt;li&gt;Tracking applications and responses&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's a perfect candidate for automation with AI, especially with the capabilities of modern LLMs and agent frameworks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enter CareerAgent
&lt;/h2&gt;

&lt;p&gt;CareerAgent is a practical AI assistant that streamlines the entire job application process, built with LangChain and Google's Gemini 2.0 Flash LLM. It demonstrates how we can use AI agents to create coherent workflows for real-world problems.&lt;/p&gt;

&lt;p&gt;Here's what it does:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Resume Analysis&lt;/strong&gt;: Extracts and analyzes PDF resumes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Job Title Suggestions&lt;/strong&gt;: Recommends suitable job titles based on your experience&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keyword Extraction&lt;/strong&gt;: Identifies relevant keywords for job searching&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Job Search&lt;/strong&gt;: Integrates with the Jooble API to find actual job listings&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cover Letter Generation&lt;/strong&gt;: Creates tailored cover letters for specific jobs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Document Export&lt;/strong&gt;: Saves cover letters as PDF or DOCX files&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The Technology Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LangChain&lt;/strong&gt;: For agent structure, tool definitions, and workflows&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Gemini 2.0 Flash&lt;/strong&gt;: The LLM powering the intelligence&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Streamlit&lt;/strong&gt;: For the user interface&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PyMuPDF&lt;/strong&gt;: For PDF text extraction&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Jooble API&lt;/strong&gt;: For retrieving real job listings&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;python-docx &amp;amp; pdfkit&lt;/strong&gt;: For document generation&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Building the Agent
&lt;/h2&gt;

&lt;p&gt;The core of the application is the LangChain agent structure. Here's how I approached it:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Tool Definitions
&lt;/h3&gt;

&lt;p&gt;First, I defined a set of tools to handle each job search task:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;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;Tool&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;analyze_resume&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Analyze a resume and extract key information&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;CareerTools&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;analyze_resume&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resume_text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nc"&gt;Tool&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;suggest_job_titles&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Suggest job titles based on resume content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;CareerTools&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;suggest_job_titles&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resume_text&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="c1"&gt;# More tools...
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Agent Initialization
&lt;/h3&gt;

&lt;p&gt;Then, I initialized the LangChain agent with these tools:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;initialize_agent&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="n"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;llm&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;llm&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;AgentType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CHAT_CONVERSATIONAL_REACT_DESCRIPTION&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;verbose&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;handle_parsing_errors&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;max_iterations&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;ConversationBufferMemory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;memory_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;chat_history&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;return_messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Workflow Implementation
&lt;/h3&gt;

&lt;p&gt;The application follows this step-by-step workflow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Upload Resume&lt;/strong&gt;: User uploads their PDF resume&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resume Analysis&lt;/strong&gt;: System processes and extracts text from the PDF&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;User Action Choice&lt;/strong&gt;: User can choose to search jobs or get recommendations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keyword Extraction&lt;/strong&gt;: For job search, the system extracts relevant keywords&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API Request&lt;/strong&gt;: System queries Jooble API with extracted keywords&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Display Results&lt;/strong&gt;: Job listings are displayed in the UI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Job Selection&lt;/strong&gt;: User selects a specific job listing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cover Letter Generation&lt;/strong&gt;: System creates a customized cover letter&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Export Options&lt;/strong&gt;: User can save the cover letter as PDF or DOCX&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This workflow combines several AI-powered steps with user decisions to create a seamless job application process.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Insights From Building This Project
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Prompt Engineering is Crucial
&lt;/h3&gt;

&lt;p&gt;For resume analysis and cover letter generation, prompt design makes a huge difference:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;PromptTemplate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;template&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 professional career advisor. Write a tailored cover letter for a job application.

    RESUME:
    {resume_text}

    JOB DETAILS:
    Title: {job_title}
    Company: {job_company}
    Description: {job_description}

    Write a professional cover letter that highlights the candidate&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s relevant experience and skills
    for this specific job. Format it as a proper business letter.
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;input_variables&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;resume_text&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;job_title&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;job_company&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;job_description&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Agent Structure Matters
&lt;/h3&gt;

&lt;p&gt;I initially built a simpler version but refactored to use LangChain's proper agent structure with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Defined tools with clear responsibilities&lt;/li&gt;
&lt;li&gt;Sequential chains for multi-step tasks&lt;/li&gt;
&lt;li&gt;Proper memory management for contextual awareness&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Error Handling is Essential
&lt;/h3&gt;

&lt;p&gt;When dealing with external APIs and document processing, robust error handling is critical:&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="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;jobs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;fetch_job_listings&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;jobs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&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;error&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;message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;No jobs found matching your query.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;# Process jobs...
&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;ToolException&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&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;error&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;message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Error searching for jobs: &lt;/span&gt;&lt;span class="si"&gt;{&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;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The User Experience
&lt;/h2&gt;

&lt;p&gt;The app interface is built with Streamlit and provides an intuitive workflow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Upload resume&lt;/strong&gt;: Start by uploading a PDF resume&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Search for jobs&lt;/strong&gt;: Use the form to search by keywords/title&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Browse results&lt;/strong&gt;: View matching job listings&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generate cover letters&lt;/strong&gt;: Create tailored cover letters for specific positions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Export documents&lt;/strong&gt;: Save as PDF or DOCX files&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;Check out the full demo video to see it in action:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=S4ZPeb96LGw" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqhv6g1aza0ndyfdecvxe.jpg" alt="CareerAgent Demo" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What Makes This an Agent?
&lt;/h2&gt;

&lt;p&gt;CareerAgent isn't just an application with LLM integration. It's a true AI agent because it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Makes decisions&lt;/strong&gt;: Determines appropriate job matches and cover letter content&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Uses tools&lt;/strong&gt;: Leverages different tools for specific tasks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Follows workflows&lt;/strong&gt;: Executes multi-step processes to achieve goals&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maintains context&lt;/strong&gt;: Uses memory to provide coherent assistance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Takes actions&lt;/strong&gt;: Performs concrete steps toward the user's job search goals&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Try It Yourself
&lt;/h2&gt;

&lt;p&gt;Want to try CareerAgent or build on it? The code is available on GitHub:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/sharmachaitanya945/CareerAgent-AI-Powered-Job-Assistant" rel="noopener noreferrer"&gt;CareerAgent Repository&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Clone the repository&lt;/span&gt;
git clone https://github.com/sharmachaitanya945/CareerAgent-AI-Powered-Job-Assistant.git

&lt;span class="c"&gt;# Install dependencies&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;langchain langchain_google_genai streamlit pymupdf requests python-docx pdfkit

&lt;span class="c"&gt;# Set environment variables&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;GOOGLE_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"your_google_api_key"&lt;/span&gt;  
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;JOOBLE_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"your_jooble_api_key"&lt;/span&gt;

&lt;span class="c"&gt;# Run the application&lt;/span&gt;
streamlit run main.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Future Enhancements
&lt;/h2&gt;

&lt;p&gt;I'm planning several enhancements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Integration with more job search APIs&lt;/li&gt;
&lt;li&gt;Resume improvement suggestions&lt;/li&gt;
&lt;li&gt;Interview preparation assistance&lt;/li&gt;
&lt;li&gt;Application tracking features&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Building CareerAgent has shown me how powerful the combination of LLMs and agent frameworks can be for creating practical applications. The key insight is that structuring agents properly with well-defined tools and workflows allows them to tackle complex real-world problems effectively.&lt;/p&gt;

&lt;p&gt;What do you think? Would you use an AI agent like this for your job search? What other features would you like to see?&lt;/p&gt;

&lt;p&gt;Share your thoughts in the comments!&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This project was created for Quira Quest 25, April 2025.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>career</category>
    </item>
  </channel>
</rss>
