<?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: Prachi</title>
    <description>The latest articles on DEV Community by Prachi (@prachivats21).</description>
    <link>https://dev.to/prachivats21</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%2F4172479%2Fb9f82d78-4bd6-4c4c-9bca-da5cd7a94a61.png</url>
      <title>DEV Community: Prachi</title>
      <link>https://dev.to/prachivats21</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/prachivats21"/>
    <language>en</language>
    <item>
      <title># I Wanted to Understand AI Beyond the Prompt Box: My Journey Into DSPy</title>
      <dc:creator>Prachi</dc:creator>
      <pubDate>Tue, 27 Oct 2026 06:32:42 +0000</pubDate>
      <link>https://dev.to/prachivats21/-i-wanted-to-understand-ai-beyond-the-prompt-box-my-journey-into-dspy-3clc</link>
      <guid>https://dev.to/prachivats21/-i-wanted-to-understand-ai-beyond-the-prompt-box-my-journey-into-dspy-3clc</guid>
      <description>&lt;p&gt;&lt;em&gt;An exploration of open-source AI, the curiosity that started it, the errors that interrupted it, and the satisfaction of finally making something work.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;There is something slightly inconvenient about being curious about too many things.&lt;/p&gt;

&lt;p&gt;One day, I want to understand how language models work. Another day, I find myself exploring cybersecurity, quantitative finance, product management, or some entirely different corner of technology. Every field seems to have something interesting hiding underneath the surface, and I have this persistent feeling that I should at least try to understand it.&lt;/p&gt;

&lt;p&gt;The problem is that trying everything and actually learning something are two very different things.&lt;/p&gt;

&lt;p&gt;It is easy to watch a tutorial, understand the general idea, build something that works once, and move on to the next exciting thing. It is considerably harder to open someone else's codebase, navigate unfamiliar abstractions, figure out why something is failing, and stay long enough to understand what is happening beneath the interface.&lt;/p&gt;

&lt;p&gt;For this exploration, I wanted to do the latter.&lt;/p&gt;

&lt;p&gt;I decided to investigate &lt;strong&gt;DSPy, an open-source framework for programming language-model applications&lt;/strong&gt;. I did not want to stop at understanding what the framework claimed to do. I wanted to see how it was structured, how its components interacted, and whether I could use what I learned to build a working demonstration of my own.&lt;/p&gt;

&lt;p&gt;I started with questions. I ended up with source-code investigations, test runs, configuration errors, a locally running language model, and a much more concrete understanding of what it means to explore an open-source AI project.&lt;/p&gt;

&lt;p&gt;This is that journey.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Why DSPy?
&lt;/h2&gt;

&lt;p&gt;When we talk about building with language models, the conversation often revolves around prompts.&lt;/p&gt;

&lt;p&gt;We write instructions, adjust the wording, test different variations, and hope the model produces the desired output. When the application becomes more complicated, managing those prompts and their interactions can become a problem of its own.&lt;/p&gt;

&lt;p&gt;That made me interested in a different question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What if I could think about a language-model application as a programmable system rather than a collection of prompts?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That question led me to DSPy.&lt;/p&gt;

&lt;p&gt;DSPy provides abstractions for defining tasks, composing model-powered modules, and optimizing how those modules use language models. Instead of manually treating every prompt as an isolated piece of text, developers can describe the task they want to perform and build a structured program around it.&lt;/p&gt;

&lt;p&gt;I found this interesting because it sits at the intersection of several things I wanted to understand: AI, software architecture, experimentation, and the process of turning an idea into a working system.&lt;/p&gt;

&lt;p&gt;I could have chosen a framework simply because it was popular or built a small application using an API and stopped there. But I wanted to investigate the framework itself.&lt;/p&gt;

&lt;p&gt;What happens when a prediction is called? What does a signature actually represent? How does a higher-level module build on a lower-level one? And what does optimization mean in a framework like this?&lt;/p&gt;

&lt;p&gt;I did not have all the answers when I started.&lt;/p&gt;

&lt;p&gt;That was precisely the point.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Before Building Anything, I Wanted to Understand the Architecture
&lt;/h2&gt;

&lt;p&gt;My first step was to explore the repository and identify the main components I wanted to investigate.&lt;/p&gt;

&lt;p&gt;Rather than trying to understand the entire codebase at once, I focused on a few concepts that appeared central to DSPy's programming model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Signatures&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;Predict&lt;/code&gt; module&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ChainOfThought&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Module composition&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;BootstrapFewShot&lt;/code&gt; optimization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I treated these as connected pieces rather than independent features.&lt;/p&gt;

&lt;h3&gt;
  
  
  Signatures: Defining the task
&lt;/h3&gt;

&lt;p&gt;A DSPy signature describes the relationship between the inputs a task receives and the outputs it is expected to produce.&lt;/p&gt;

&lt;p&gt;For example, a simple classification task might look like this:&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;import&lt;/span&gt; &lt;span class="n"&gt;dspy&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ClassifyIntent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dspy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Signature&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Classify a customer message into a support category.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

    &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dspy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;InputField&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;intent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dspy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;OutputField&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This defines a task that accepts a customer query and produces an intent.&lt;/p&gt;

&lt;p&gt;The interesting part is what the code does not contain: I am not manually writing out the complete prompt that the model must follow. Instead, I am defining the task's interface and letting DSPy handle the prediction workflow.&lt;/p&gt;

&lt;p&gt;That distinction became a useful starting point for understanding the rest of the framework.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;Predict&lt;/code&gt;: Turning a specification into a prediction
&lt;/h3&gt;

&lt;p&gt;The next component was &lt;code&gt;dspy.Predict&lt;/code&gt;.&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;classifier&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dspy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Predict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ClassifyIntent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;classifier&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;I was charged twice for my order.&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;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;intent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&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%2F5nevqa68ocvet7xgqs9o.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%2F5nevqa68ocvet7xgqs9o.png" alt=" " width="800" height="412"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;The signature specifies the task. The predictor executes it using the configured language model.&lt;/p&gt;

&lt;p&gt;I wanted to understand how that relationship was implemented internally, not just how to use it in a script. That meant looking beyond the example and into DSPy's source code.&lt;/p&gt;

&lt;p&gt;This was where the investigation started becoming more interesting. A framework's public interface tells you how developers are expected to use it. Its implementation begins to explain how that interface actually works.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;ChainOfThought&lt;/code&gt;: Building on existing abstractions
&lt;/h3&gt;

&lt;p&gt;I also investigated &lt;code&gt;dspy.ChainOfThought&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Conceptually, it builds on the prediction machinery by extending a supplied signature with a reasoning field. It then delegates prediction to a standard &lt;code&gt;dspy.Predict&lt;/code&gt; instance.&lt;/p&gt;

&lt;p&gt;What interested me here was the design pattern.&lt;/p&gt;

&lt;p&gt;Rather than creating an entirely separate prediction system, DSPy composes existing functionality into a higher-level module. That makes the framework's abstractions easier to connect conceptually: more sophisticated behavior can be built on top of the underlying prediction mechanism.&lt;/p&gt;

&lt;h3&gt;
  
  
  Modules and composition
&lt;/h3&gt;

&lt;p&gt;I explored DSPy's module structure to understand how these components fit into larger applications.&lt;/p&gt;

&lt;p&gt;This mattered because real applications rarely consist of a single prediction. They combine multiple steps, pass outputs between components, and organize model calls into a workflow.&lt;/p&gt;

&lt;p&gt;Thinking in terms of modules shifted my attention from individual prompts to the structure of the application around them.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;BootstrapFewShot&lt;/code&gt;: Exploring optimization
&lt;/h3&gt;

&lt;p&gt;The final major component I focused on was &lt;code&gt;BootstrapFewShot&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;DSPy's teleprompting and optimization machinery can use training examples, model-generated demonstrations, and an evaluation metric to construct a predictor with demonstrations selected through an optimization process.&lt;/p&gt;

&lt;p&gt;This raised another question for me: how do you demonstrate optimization without confusing the existence of an optimizer with proof that it improves performance?&lt;/p&gt;

&lt;p&gt;I would return to that question when I began testing the framework.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Moving From Reading Code to Running It
&lt;/h2&gt;

&lt;p&gt;Understanding an architecture on paper is useful. Running the code gives you a different kind of understanding.&lt;/p&gt;

&lt;p&gt;I created a small investigation demo covering the concepts I had been exploring. The goal was not to build an elaborate product. It was to make the framework's behavior observable through a few focused examples.&lt;/p&gt;

&lt;p&gt;The demo covered: &lt;a href="https://youtu.be/klimwICb1a4" rel="noopener noreferrer"&gt;https://youtu.be/klimwICb1a4&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Inspecting signatures.&lt;/li&gt;
&lt;li&gt;Executing &lt;code&gt;dspy.Predict&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Executing &lt;code&gt;dspy.ChainOfThought&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Composing a customer-support pipeline.&lt;/li&gt;
&lt;li&gt;Demonstrating the &lt;code&gt;BootstrapFewShot&lt;/code&gt; workflow.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For the initial experiments, I used DSPy's &lt;code&gt;DummyLM&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A dummy language model is useful when you want to test a program's structure without depending on a real model response. It allows you to investigate how components are called and how data moves through the workflow.&lt;/p&gt;

&lt;p&gt;However, I needed to be precise about what that proved.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A successful mock-based demonstration is evidence that the workflow executes. It is not evidence that a real language model will produce accurate outputs.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I wanted to demonstrate both.&lt;/p&gt;

&lt;p&gt;That meant moving beyond the initial tests and connecting DSPy to a real model.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. The First Setback: My Code Would Not Even Import
&lt;/h2&gt;

&lt;p&gt;Open-source exploration sounds particularly elegant when described after everything has worked.&lt;/p&gt;

&lt;p&gt;The actual process is less elegant.&lt;/p&gt;

&lt;p&gt;At one point, Python raised a &lt;code&gt;SyntaxError&lt;/code&gt; inside:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dspy/predict/chain_of_thought.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The error pointed to a line of explanatory prose that Python was interpreting as code.&lt;/p&gt;

&lt;p&gt;I had managed to get ordinary article text into a Python source file while working between the investigation and its explanation. Naturally, Python was not impressed by my literary ambitions.&lt;/p&gt;

&lt;p&gt;The immediate problem was not DSPy's architecture. The file itself was syntactically invalid.&lt;/p&gt;

&lt;p&gt;I inspected the affected section, checked the repository's Git status, and verified the source file rather than immediately reinstalling packages or changing unrelated code.&lt;/p&gt;

&lt;p&gt;Once the file was back to valid Python, I tested the import again.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dspy_investigation_demo/.venv/bin/python &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"import dspy; print('DSPy version:', dspy.__version__)"&lt;/span&gt;
&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%2F1ptgm0ax2vc1cu98mmr9.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%2F1ptgm0ax2vc1cu98mmr9.png" alt=" " width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The output was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DSPy version: 3.4.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That was a small but important lesson in debugging: identify the layer where the failure occurs before attempting to fix it.&lt;/p&gt;

&lt;p&gt;A syntax error in a source file, a missing dependency, and a model connection failure are different problems. Treating them as interchangeable usually creates more problems than it solves.&lt;/p&gt;

&lt;p&gt;I had not learned anything profound about language-model optimization from this incident. I had, however, practiced a more useful habit: inspect the evidence before changing the system.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Testing the Workflow
&lt;/h2&gt;

&lt;p&gt;With DSPy importing successfully, I ran the investigation's test suite.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dspy_investigation_demo/.venv/bin/pytest dspy_investigation_demo/test_demo.py &lt;span class="nt"&gt;-v&lt;/span&gt;
&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%2Fvcpot5fi3z0quti0i9en.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%2Fvcpot5fi3z0quti0i9en.png" alt=" " width="799" height="144"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;All five tests passed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;test_signature_declaration_and_fields&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;test_basic_predict_execution&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;test_chain_of_thought_execution&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;test_composed_pipeline_execution&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;test_optimization_with_bootstrap_fewshot&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These tests covered the basic prediction workflow, signature declarations, module composition, and the optimization demonstration.&lt;/p&gt;

&lt;p&gt;At this stage, I had evidence that the examples executed successfully under the test conditions.&lt;/p&gt;

&lt;p&gt;But I still wanted to see the framework communicate with a real model.&lt;/p&gt;

&lt;p&gt;That became the next stage of the investigation.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Connecting DSPy to Gemma Through Ollama
&lt;/h2&gt;

&lt;p&gt;I already had Ollama installed and the &lt;code&gt;gemma4:latest&lt;/code&gt; model available locally.&lt;/p&gt;

&lt;p&gt;My next goal was straightforward: configure DSPy to use Gemma and create a small classification task.&lt;/p&gt;

&lt;p&gt;I started with a customer-support example.&lt;/p&gt;

&lt;p&gt;The input was:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I was charged twice for my order. Please refund the extra payment.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The expected category was billing.&lt;/p&gt;

&lt;p&gt;The classification task itself was simple. The integration was where the debugging began.&lt;/p&gt;

&lt;h3&gt;
  
  
  The 404 error
&lt;/h3&gt;

&lt;p&gt;My first DSPy execution failed with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;InvalidRequestError: 404 page not found (ollama, HTTP 404)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This was confusing because the model was installed and Ollama was available.&lt;/p&gt;

&lt;p&gt;I needed to distinguish between two questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Was Ollama actually working?&lt;/li&gt;
&lt;li&gt;Was DSPy communicating with it correctly?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I tested Ollama's API directly rather than assuming that the failure meant the model was broken.&lt;/p&gt;

&lt;h3&gt;
  
  
  Testing Ollama independently
&lt;/h3&gt;

&lt;p&gt;I sent a direct request to the local chat endpoint, asking Gemma to reply with a fixed phrase.&lt;/p&gt;

&lt;p&gt;My first attempt failed because the JSON contained an extra comma and a misplaced closing bracket.&lt;/p&gt;

&lt;p&gt;The server responded with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;invalid character ']' looking for beginning of value
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That was not a model failure or a DSPy failure. It was simply an invalid request body.&lt;/p&gt;

&lt;p&gt;After correcting the JSON, the request succeeded:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"gemma4:latest"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"assistant"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"CONNECTION WORKS"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"done"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The exact response structure returned by Ollama included additional metadata, but the important result was clear: Gemma responded successfully to a direct API call.&lt;/p&gt;

&lt;p&gt;I now had evidence that Ollama was functioning independently of DSPy.&lt;/p&gt;

&lt;p&gt;That narrowed the problem considerably.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fixing the DSPy integration
&lt;/h3&gt;

&lt;p&gt;The remaining issue was the way DSPy routed the model request.&lt;/p&gt;

&lt;p&gt;I adjusted the model configuration to use DSPy's LiteLLM compatibility engine explicitly, keeping the Ollama endpoint and model name consistent with the working direct request.&lt;/p&gt;

&lt;p&gt;The relevant configuration became:&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;lm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dspy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;LM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ollama_chat/gemma4:latest&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;api_base&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://localhost:11434&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;model_type&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&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;engine&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;litellm&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;dspy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;configure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lm&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;lm&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&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%2Fpo5g8g0xb65gns1kypzf.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%2Fpo5g8g0xb65gns1kypzf.png" alt=" " width="800" height="808"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With that configuration, the demo finally executed successfully.&lt;/p&gt;

&lt;p&gt;The important part of this debugging process was not simply discovering which setting worked. It was separating the model server from the framework integration, testing them independently, and using the results to narrow down the failure.&lt;/p&gt;

&lt;p&gt;I went from a generic HTTP 404 to a working local inference pipeline by breaking the problem into smaller, testable pieces.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. The Moment the Demo Actually Worked
&lt;/h2&gt;

&lt;p&gt;With the integration working, I ran the classification script again.&lt;/p&gt;

&lt;p&gt;The output was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;--- DSPy + Gemma: Real Model Inference ---

Input: I was charged twice for my order. Please refund the extra payment.

Predicted intent: billing

Inference completed successfully.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It was a small result.&lt;/p&gt;

&lt;p&gt;No complicated interface. No elaborate multi-agent system. No dramatic claim about changing the future of AI.&lt;/p&gt;

&lt;p&gt;Just a customer message going into a program, a real local language model processing the request, and a category coming out.&lt;/p&gt;

&lt;p&gt;But this result represented a different kind of progress from the earlier mock-based demonstration.&lt;/p&gt;

&lt;p&gt;I had now verified that DSPy could execute the task using Gemma through Ollama on my machine.&lt;/p&gt;

&lt;p&gt;I then extended the experiment into an interactive customer-support demo. Instead of supplying a single hard-coded input, I could enter different messages and have the program return a category and a suggested response.&lt;/p&gt;

&lt;p&gt;For example, the inputs could describe:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A duplicate charge.&lt;/li&gt;
&lt;li&gt;A delayed delivery.&lt;/li&gt;
&lt;li&gt;An application that crashes when uploading a file.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The program used the same signature and prediction module for each request.&lt;/p&gt;

&lt;p&gt;That made the demonstration more useful because I could observe how the same task definition behaved with different inputs.&lt;/p&gt;

&lt;p&gt;It also introduced an important limitation: the categories and responses were model-generated, not guaranteed answers. A working inference pipeline does not automatically establish classification accuracy, response quality, or reliability across a wider dataset.&lt;/p&gt;

&lt;p&gt;Those questions would require a separate evaluation.&lt;/p&gt;

&lt;p&gt;For this investigation, the goal was narrower: understand the framework's structure and demonstrate a functioning real-model integration.&lt;/p&gt;

&lt;p&gt;I had achieved that.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. What I Learned Beyond the Code
&lt;/h2&gt;

&lt;p&gt;The technical results were useful, but the process taught me a few things that were not specific to DSPy.&lt;/p&gt;

&lt;h3&gt;
  
  
  First, understanding a framework is different from knowing how to call it
&lt;/h3&gt;

&lt;p&gt;It is easy to learn the syntax for creating a predictor.&lt;/p&gt;

&lt;p&gt;It takes more work to understand how signatures define task interfaces, how modules compose, how prediction execution is organized, and where optimization fits into the design.&lt;/p&gt;

&lt;p&gt;Reading source code alongside running small experiments helped connect these ideas.&lt;/p&gt;

&lt;p&gt;I did not need to understand every file in the repository. I needed to identify the components relevant to my questions and follow their relationships.&lt;/p&gt;

&lt;p&gt;That is a much more manageable way to approach a large codebase.&lt;/p&gt;

&lt;h3&gt;
  
  
  Second, a successful execution is not the same as a successful evaluation
&lt;/h3&gt;

&lt;p&gt;The five passing tests demonstrated that my mock-based workflows executed under the tested conditions.&lt;/p&gt;

&lt;p&gt;The Gemma experiment demonstrated that real inference worked.&lt;/p&gt;

&lt;p&gt;Neither result, on its own, proved that DSPy produced better outputs than a manually written prompt or that &lt;code&gt;BootstrapFewShot&lt;/code&gt; improved task performance.&lt;/p&gt;

&lt;p&gt;To establish that, I would need a defined dataset, an appropriate metric, a baseline, and a controlled comparison.&lt;/p&gt;

&lt;p&gt;That distinction matters because AI projects can look impressive long before their actual performance has been measured.&lt;/p&gt;

&lt;p&gt;I wanted my investigation to distinguish what I had demonstrated from what remained to be tested.&lt;/p&gt;

&lt;h3&gt;
  
  
  Third, errors can help narrow a problem down
&lt;/h3&gt;

&lt;p&gt;The syntax error, malformed JSON, and HTTP 404 were different failures at different layers.&lt;/p&gt;

&lt;p&gt;Fixing them required different approaches.&lt;/p&gt;

&lt;p&gt;I learned to check whether the source file was valid, whether the local model server responded, whether the request itself was well formed, and whether DSPy's provider configuration was correct.&lt;/p&gt;

&lt;p&gt;Debugging became less about randomly changing settings and more about asking which assumption had failed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Finally, curiosity needs a direction
&lt;/h3&gt;

&lt;p&gt;I started this exploration because I wanted to understand something unfamiliar.&lt;/p&gt;

&lt;p&gt;But curiosity alone can easily become endless browsing: another repository, another framework, another concept that seems interesting enough to investigate.&lt;/p&gt;

&lt;p&gt;The useful part was choosing a specific set of questions and following them far enough to produce evidence.&lt;/p&gt;

&lt;p&gt;I examined the architecture, built a small demo, tested the workflow, connected a real model, and recorded the result.&lt;/p&gt;

&lt;p&gt;I did not master DSPy in a day. That was never a realistic goal.&lt;/p&gt;

&lt;p&gt;I developed a more concrete understanding of a framework by working through a small, defined investigation.&lt;/p&gt;

&lt;p&gt;That is a better outcome than simply collecting another technology name to put on a profile.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. What I Would Explore Next
&lt;/h2&gt;

&lt;p&gt;This investigation gave me a working foundation, but it also raised questions I have not yet answered.&lt;/p&gt;

&lt;p&gt;The most interesting next step would be to evaluate optimization rather than merely demonstrate that an optimizer runs.&lt;/p&gt;

&lt;p&gt;I would want to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Build a small, labeled customer-support dataset.&lt;/li&gt;
&lt;li&gt;Define a metric for classification quality.&lt;/li&gt;
&lt;li&gt;Measure a baseline predictor before optimization.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;BootstrapFewShot&lt;/code&gt; with suitable training examples.&lt;/li&gt;
&lt;li&gt;Evaluate the optimized predictor on held-out examples.&lt;/li&gt;
&lt;li&gt;Compare the results under the same conditions.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That would help answer a more substantive question: under what conditions does DSPy's optimization process improve the task, and how much improvement can be measured?&lt;/p&gt;

&lt;p&gt;I would also want to investigate failure cases, including ambiguous messages, overlapping categories, and inputs that do not fit the predefined labels.&lt;/p&gt;

&lt;p&gt;Those experiments would move the project from an architectural investigation and working demonstration toward a more rigorous evaluation.&lt;/p&gt;

&lt;p&gt;For now, I have deliberately kept the scope small. A clear experiment with honest limitations is more useful than a complicated demo whose results I cannot explain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion: The Point Was Never to Know Everything Immediately
&lt;/h2&gt;

&lt;p&gt;I started this investigation with a familiar kind of curiosity: I wanted to understand another part of AI, and I did not want to settle for a superficial explanation.&lt;/p&gt;

&lt;p&gt;I chose DSPy because its approach to programming language-model applications gave me a concrete architectural question to explore. I investigated its signatures, prediction modules, composition, and optimization workflow. I created a demonstration, ran five tests using a dummy language model, and then connected DSPy to Gemma through Ollama for real inference.&lt;/p&gt;

&lt;p&gt;Along the way, I encountered errors that forced me to distinguish between source-code problems, malformed requests, and integration issues. I fixed them, verified the working configuration, and extended the experiment into an interactive demo.&lt;/p&gt;

&lt;p&gt;The final output was modest. The learning process was more valuable.&lt;/p&gt;

&lt;p&gt;I am still interested in too many things to pretend that I have settled on one narrow path. I want to explore AI, cybersecurity, quantitative systems, software engineering, and the ways technology becomes useful to people.&lt;/p&gt;

&lt;p&gt;But I am beginning to understand that exploring everything does not mean trying to master everything simultaneously.&lt;/p&gt;

&lt;p&gt;Sometimes it means choosing one question, following it beyond the documentation, making something work, understanding why it works, and being honest about what you have not yet proved.&lt;/p&gt;

&lt;p&gt;I don't need to know everything today.&lt;/p&gt;

&lt;p&gt;I do want to become the kind of person who can approach something unfamiliar, investigate it seriously, and build a working understanding of it.&lt;/p&gt;

&lt;p&gt;For this project, that meant going from &lt;em&gt;What exactly is DSPy doing?&lt;/em&gt; to a working local inference pipeline.&lt;/p&gt;

&lt;p&gt;For the next one, the question will probably be different.&lt;/p&gt;

&lt;p&gt;The process, I hope, will be better.&lt;/p&gt;




&lt;h3&gt;
  
  
  Project Evidence
&lt;/h3&gt;

&lt;p&gt;This investigation included:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Source-code exploration of DSPy's signatures, prediction modules, and optimization machinery.&lt;/li&gt;
&lt;li&gt;A demonstration covering signatures, &lt;code&gt;Predict&lt;/code&gt;, &lt;code&gt;ChainOfThought&lt;/code&gt;, module composition, and &lt;code&gt;BootstrapFewShot&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Five passing tests using a dummy language model.&lt;/li&gt;
&lt;li&gt;A real-model inference script using DSPy 3.4.1, Ollama 0.40.10, and the locally installed &lt;code&gt;gemma4:latest&lt;/code&gt; model.&lt;/li&gt;
&lt;li&gt;An interactive customer-support classification demonstration.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Scope note:&lt;/strong&gt; The mock-based tests verified the example workflows. The Gemma integration verified that local inference worked for the demonstrated task. A controlled benchmark comparing prediction quality before and after optimization was outside the scope of this investigation.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>learning</category>
      <category>llm</category>
      <category>python</category>
    </item>
    <item>
      <title>SponsorLoop: More Support. Bigger Impact.</title>
      <dc:creator>Prachi</dc:creator>
      <pubDate>Sun, 25 Oct 2026 19:16:10 +0000</pubDate>
      <link>https://dev.to/prachivats21/sponsorloop-more-support-bigger-impact-1pma</link>
      <guid>https://dev.to/prachivats21/sponsorloop-more-support-bigger-impact-1pma</guid>
      <description>&lt;h1&gt;
  
  
  SponsorLoop: An AI Agent for Sponsorship Outreach
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;A submission for Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady.&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Organizing a college hackathon is hard enough. Finding sponsors, researching companies, writing personalized pitches, managing follow-ups, and tracking commitments can feel like running an entirely separate operation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SponsorLoop is an AI-powered sponsorship workflow agent designed for student hackathons, college festivals, and conferences.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It helps organizers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Discover potential sponsors:&lt;/strong&gt; Identify relevant prospects and review their fit for an event.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prepare personalized pitches:&lt;/strong&gt; Generate outreach drafts using event details and sponsorship packages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep humans in control:&lt;/strong&gt; Review and approve outreach drafts before they can be sent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manage the sponsorship pipeline:&lt;/strong&gt; Track prospects from discovery and research through outreach, negotiation, and confirmation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Track commitments:&lt;/strong&gt; Keep sponsor deliverables and organizer obligations organized in one place.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prepare social outreach:&lt;/strong&gt; Create LinkedIn and Instagram message drafts that organizers can review and use themselves.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is to reduce the repetitive coordination work involved in sponsorship outreach, giving organizers more time to focus on the event itself.&lt;/p&gt;

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

&lt;p&gt;**Live demo:&lt;a href="https://github.com/Prachivats-21/sponsorloop" rel="noopener noreferrer"&gt;https://github.com/Prachivats-21/sponsorloop&lt;/a&gt;&lt;br&gt;
**Video demo:&lt;a href="https://youtu.be/-wnLMzHzC8k" rel="noopener noreferrer"&gt;https://youtu.be/-wnLMzHzC8k&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The demo walks through finding sponsor prospects, generating a tailored pitch, reviewing and approving the draft, and tracking the sponsorship pipeline.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;GitHub repository:&lt;/strong&gt; [Add your SponsorLoop repository URL]&lt;/p&gt;

&lt;p&gt;SponsorLoop includes a FastAPI backend, a React frontend, SQLite-backed event and sponsorship records, a typed tool registry, and a workflow orchestrator.&lt;/p&gt;

&lt;p&gt;The project is designed around a modular architecture so that the AI provider and individual tools can evolve without requiring the entire application to be rebuilt.&lt;/p&gt;

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

&lt;p&gt;I built SponsorLoop as a workflow-oriented agent rather than a chatbot that simply returns text.&lt;/p&gt;

&lt;p&gt;The application combines:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;FastAPI&lt;/strong&gt; for the backend API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;React and Vite&lt;/strong&gt; for the frontend.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SQLite&lt;/strong&gt; for persistent event, prospect, and outreach records.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pydantic v2&lt;/strong&gt; for typed data validation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A tool registry and custom orchestrator&lt;/strong&gt; for coordinating the application's workflow.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An AI-provider layer&lt;/strong&gt; designed to support different inference backends.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'm using Hermes as part of my agent approach, with the aim of making the workflow tool-driven and extensible. The application itself manages the event data, sponsorship pipeline, and human-approval rules.&lt;/p&gt;

&lt;p&gt;The project also contains an integration for running Gemma 2 through Ollama, alongside a deterministic fallback engine. The fallback keeps the core workflow usable when an external AI provider or local model service is unavailable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One design principle matters particularly here: generated outreach is not automatically authorized outreach.&lt;/strong&gt; Drafts require human approval before they can proceed to the sending workflow.&lt;/p&gt;

&lt;p&gt;This separation makes it possible to automate repetitive preparation without giving the agent unrestricted control over external communication.&lt;/p&gt;

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

&lt;p&gt;Sponsorship workflows are not identical across communities.&lt;/p&gt;

&lt;p&gt;A small college hackathon, a university technical festival, and a developer conference can have very different sponsor categories, outreach styles, packages, and approval processes.&lt;/p&gt;

&lt;p&gt;Open innovation makes SponsorLoop easier for other organizers and developers to inspect, adapt, and extend. Someone could customize the sponsor categories, add a new outreach channel, improve the matching logic, or connect another AI provider without rebuilding the entire product.&lt;/p&gt;

&lt;p&gt;It also makes the project's limitations easier to examine. Developers can see how the workflow operates, where human approval is enforced, and how the application behaves when an AI provider is unavailable.&lt;/p&gt;

&lt;p&gt;For a project intended to help student communities, that flexibility matters. The goal is not to lock organizers into one provider or one rigid workflow. It's to give them a foundation they can improve together.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Lazy Payoff
&lt;/h2&gt;

&lt;p&gt;The repetitive work involved in sponsorship outreach includes searching for prospects, tailoring pitches, and keeping the pipeline up to date.&lt;/p&gt;

&lt;p&gt;SponsorLoop brings those tasks into one workflow, reducing the amount of manual switching between documents, messages, and tracking sheets.&lt;/p&gt;

&lt;p&gt;I haven't included a measured time-saving figure because I don't want to present an estimate as a benchmark. A useful next step is to compare the time required to research and draft outreach for the same set of sponsors manually versus using SponsorLoop.&lt;/p&gt;

&lt;p&gt;The intended payoff is straightforward: less administrative repetition, more time for the work that actually makes an event successful.&lt;/p&gt;

&lt;p&gt;Thank You!!!!!!!&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Opportunity Radar: Never Miss an Opportunity Again 🎯</title>
      <dc:creator>Prachi</dc:creator>
      <pubDate>Sun, 18 Oct 2026 18:23:32 +0000</pubDate>
      <link>https://dev.to/prachivats21/opportunity-radar-never-miss-an-opportunity-again-21io</link>
      <guid>https://dev.to/prachivats21/opportunity-radar-never-miss-an-opportunity-again-21io</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week2-2026-10-12"&gt;Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;As a college student, I've spent way too much time searching for hackathons, internships, and other opportunities across platforms like Unstop, LinkedIn, and various event websites.&lt;/p&gt;

&lt;p&gt;The frustrating part wasn't finding opportunities. It was keeping track of them.&lt;/p&gt;

&lt;p&gt;One opportunity would be on one platform, another somewhere else, and by the time I remembered to check again, registration might already be closed. I wanted to participate in more hackathons, explore internships, and discover opportunities relevant to my interests, but keeping track of everything became a task of its own.&lt;/p&gt;

&lt;p&gt;So, I started building &lt;strong&gt;Opportunity Radar&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Opportunity Radar is an AI-assisted platform designed to bring opportunities into one place and help students discover which ones are relevant to them.&lt;/p&gt;

&lt;p&gt;Here's what the current version can do:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Discover opportunities:&lt;/strong&gt; Browse a structured collection of opportunities, including hackathons and other student-focused listings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Match opportunities to your profile:&lt;/strong&gt; Get relevance scores based on your interests and eligibility information.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extract information using AI:&lt;/strong&gt; Turn unstructured opportunity information into structured data, with a fallback path when local AI inference isn't available.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add opportunities:&lt;/strong&gt; Save additional listings through the interface.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Work with real application links:&lt;/strong&gt; Keep the source and application information connected to each listing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The project currently has a working React frontend and FastAPI backend, with opportunity listing, matching, extraction, and API health checks implemented.&lt;/p&gt;

&lt;p&gt;The bigger vision is to make opportunity discovery less fragmented, so students can spend less time hunting for registrations and more time actually applying, building, and participating.&lt;/p&gt;

&lt;h3&gt;
  
  
  Who would pay for it?
&lt;/h3&gt;

&lt;p&gt;Students would be the primary users, but the potential paying customers are institutions and communities that want to help students find relevant opportunities.&lt;/p&gt;

&lt;p&gt;College placement cells, student clubs, hackathon communities, and career development teams could use a platform like this to curate opportunities, distribute relevant listings, and help students discover options they might otherwise miss.&lt;/p&gt;

&lt;p&gt;I'm still exploring the business model. For now, the priority is building something useful, validating the core experience, and expanding its coverage responsibly.&lt;/p&gt;

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

&lt;p&gt;**Live demo:&lt;a href="https://youtu.be/Byri8N50mLo" rel="noopener noreferrer"&gt;https://youtu.be/Byri8N50mLo&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;**GitHub repository: &lt;a href="https://github.com/Prachivats-21/Opportunity-radar" rel="noopener noreferrer"&gt;https://github.com/Prachivats-21/Opportunity-radar&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The project is being developed as an open-source application, with a frontend, backend API, opportunity data, matching logic, AI-assisted extraction, and tests.&lt;/p&gt;

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

&lt;p&gt;I built Opportunity Radar using a combination of web development, backend APIs, deterministic matching logic, and open-weight AI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Current tech stack:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; React, TypeScript, and Vite&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; Python and FastAPI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI inference:&lt;/strong&gt; Ollama with a locally accessible model, including the Gemma model family explored during development&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data validation:&lt;/strong&gt; Pydantic&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Opportunity matching:&lt;/strong&gt; Profile-based matching logic with relevance scoring&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testing:&lt;/strong&gt; Automated backend tests and frontend build checks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One of the interesting parts was figuring out where AI actually helps and where it doesn't need to be involved.&lt;/p&gt;

&lt;p&gt;Opportunity listings often contain unstructured information, including descriptions, eligibility requirements, and deadlines. AI can help extract that information into a structured format. Once the information is structured, deterministic logic can handle matching and validation more predictably.&lt;/p&gt;

&lt;p&gt;This hybrid approach makes the system easier to test and reason about than relying on a model to make every decision.&lt;/p&gt;

&lt;p&gt;I'm also working toward a modular source-integration architecture, so additional opportunity providers can be connected without rebuilding the entire application around each one.&lt;/p&gt;

&lt;p&gt;The current version is a foundation, not a finished all-in-one aggregator. Broader platform integrations, automated updates, and more comprehensive deadline tracking are part of the direction I'm working toward.&lt;/p&gt;

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

&lt;p&gt;Opportunity Radar is built around a problem that affects students across different colleges, backgrounds, and technical skill levels.&lt;/p&gt;

&lt;p&gt;Open innovation matters here because opportunity discovery shouldn't depend on access to an expensive proprietary AI service or a closed ecosystem.&lt;/p&gt;

&lt;p&gt;Using open-weight models and local inference gives me greater control over experimentation, model selection, and the way information is processed. It also lets me explore a hybrid architecture where AI handles unstructured information while transparent application logic handles matching.&lt;/p&gt;

&lt;p&gt;Open source makes the project easier for other developers to inspect, test, extend, and contribute to. Someone could improve the matching algorithm, add a new authorized data source, improve extraction accuracy, or build a feature for a particular student community.&lt;/p&gt;

&lt;p&gt;I'd also like the source integrations to remain responsible. Not every platform provides a public API, and not every website permits automated collection. Building openly means making those limitations visible and designing integrations around permitted access rather than treating every website as data to scrape.&lt;/p&gt;

&lt;p&gt;For me, open innovation isn't just about using an open model. It's about making the solution itself something others can understand and build upon.&lt;/p&gt;




&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Select only the partner categories that match the tools and requirements actually used in the submitted project.&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open-source AI / open-weight model category, if applicable to the challenge's official criteria.&lt;/li&gt;
&lt;li&gt;Any other applicable partner category, after checking its specific eligibility requirements.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;The next steps for Opportunity Radar are to expand the opportunity database, add authorized source integrations, improve deadline tracking, strengthen profile-based recommendations, and validate the product with actual students.&lt;/p&gt;

&lt;p&gt;The long-term goal is simple: &lt;strong&gt;students shouldn't have to be professional opportunity hunters just to find opportunities worth pursuing.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is version one, and there's plenty left to build. But it starts with a problem I've experienced myself, and I'm excited to keep working on it.&lt;/p&gt;

&lt;p&gt;Thanks for checking out Opportunity Radar! 🚀&lt;/p&gt;

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