<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Pranav Munigala</title>
    <description>The latest articles on Forem by Pranav Munigala (@pranavmunigala).</description>
    <link>https://forem.com/pranavmunigala</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%2F3177142%2Feb44f758-3cd5-4863-84d3-0a86916858d5.png</url>
      <title>Forem: Pranav Munigala</title>
      <link>https://forem.com/pranavmunigala</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/pranavmunigala"/>
    <language>en</language>
    <item>
      <title>BlastAI Program</title>
      <dc:creator>Pranav Munigala</dc:creator>
      <pubDate>Wed, 02 Jul 2025 20:51:57 +0000</pubDate>
      <link>https://forem.com/pranavmunigala/blastai-program-61o</link>
      <guid>https://forem.com/pranavmunigala/blastai-program-61o</guid>
      <description>&lt;p&gt;Recently, I created another biopython program to further my expertise in this field. Using BLAST (Basic Local Alignment Search Tool), an algorithm that compares biological sequences, such as DNA or protein sequences. To become familiar with this tool, I decided to create a program that takes in a sequence from the user, then runs BLAST on it, looking for alignments. Then, for people who are not so familiar with what it is) using an LLM, it explains what the results signify so the user can interpret it better. &lt;/p&gt;

&lt;p&gt;Let me explain how the program works:&lt;/p&gt;

&lt;p&gt;First I had to get the user input in BLAST format. Also asking which type of blast program they want (blastn or blastp). BLASTn compares a nucleotide sequence to a nucleotide database, while BLASTp compares a protein sequence to a protein database. &lt;/p&gt;

&lt;p&gt;Code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# User Input
fasta_input = st.text_area("🧬 Enter your FASTA sequence", height=150, value="&amp;gt;example\nATGCGTACGTAGCTAGCTAGCTAGCTAGCTGACT")

blast_program = st.selectbox("⚙️ Select BLAST program", ["blastn", "blastp"])
database = "nt" if blast_program == "blastn" else "nr"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then I had to create the blast function using fasta input. Here is the code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Run BLAST
if st.button("🚀 Run BLAST and Explain"):
    if not fasta_input.startswith("&amp;gt;"):
        st.error("Please provide a valid FASTA format (must start with '&amp;gt;').")
    else:
        try:
            with st.spinner("Submitting BLAST to NCBI..."):
                result_handle = NCBIWWW.qblast(blast_program, database, fasta_input)

            with st.spinner("Parsing BLAST results..."):
                blast_record = NCBIXML.read(result_handle)
                alignment_summaries = ""

                for alignment in blast_record.alignments[:3]:
                    for hsp in alignment.hsps:
                        if hsp.expect &amp;lt; 0.001:
                            alignment_summaries += f"""
Match: {alignment.hit_def}
E-value: {hsp.expect}
Score: {hsp.score}
Identities: {hsp.identities}/{hsp.align_length}
Query: {hsp.query[:60]}...
Subject: {hsp.sbjct[:60]}...
---
"""
                            break  # only one HSP per hit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A FASTA sequence is a text format that represents biological sequences such as DNA or proteins. For the BLAST to work the fasta sequence inputted HAS to begin with &amp;gt; followed by a sequence identifier. So the first part checks if it is valid or not. &lt;/p&gt;

&lt;p&gt;Next the &lt;code&gt;NCBIWWW.qblast&lt;/code&gt; function sends the BLAST request to NCBI servers. The parameters are&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;blast_program&lt;/code&gt;:the BLAST algorithm to use&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;database&lt;/code&gt;:the target database&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;fasta_input&lt;/code&gt;: the sequence enterd in FASTA format&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;result_handle&lt;/code&gt; : a file-like object containing the BLAST XML result.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Then the function &lt;code&gt;NCBIXML.read()&lt;/code&gt; parses the XML returned by NCBI into an object called &lt;code&gt;blast_record&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;Now under alignment summaries it appends a summary for each significant match. &lt;/p&gt;

&lt;p&gt;&lt;code&gt;alignment.hit_def&lt;/code&gt;: description of the matched sequence.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;hsp.score&lt;/code&gt;: the alignment score.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;hsp.identities&lt;/code&gt;: how many positions match exactly.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;hsp.query[:60] and hsp.sbjct[:60]&lt;/code&gt;: shows first 60 bases of the aligned query and subject segments (truncated for readability).&lt;/p&gt;

&lt;p&gt;After this comes the LLM part. Using variables and prompt template I created a simple LLM that explains what is going on in the BLAST program.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Use OpenAI to explain
                st.subheader("🤖 GPT Explanation")
                with st.spinner("Generating explanation..."):
                    prompt = f"""
You are a bioinformatics tutor. Explain the following BLAST results to a high school student in simple terms.

Here are the matches:

{alignment_summaries}

Explain:
- If the sequence matched anything known
- What organisms the matches came from
- How strong the matches were
- What alignments or similarities were found

Keep your explanation under 500 tokens. Be clear and easy to understand.
"""
                    try:
                        response = client.chat.completions.create(
                            model="gpt-4",
                            messages=[{"role": "user", "content": prompt}],
                            max_tokens=300,
                            temperature=0.5
                        )
                        explanation = response.choices[0].message.content
                        st.write(explanation)
                    except Exception as e:
                        st.error(f"Error generating explanation: {str(e)}")
                        st.info("Please check your OpenAI API key in the .env file.")
            else:
                st.warning("No strong hits found (E-value &amp;lt; 0.001). Try another sequence.")

        except Exception as e:
            st.error(f"Error running BLAST: {str(e)}")
            st.info("Please check your internet connection and try again.")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It is always important for the LLM to know its role. In this case, I assigned it the role of a "bioinformatics tutor," so it knows what to focus on. &lt;/p&gt;

&lt;p&gt;Here is a video of the program in action: &lt;a href="https://youtu.be/edJgN316OXA" rel="noopener noreferrer"&gt;https://youtu.be/edJgN316OXA&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As always, please let me know if you have any suggestions on the code or even any advice on what to do next (or to make this program better). &lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>beginners</category>
      <category>ai</category>
    </item>
    <item>
      <title>Protein Structure &amp; Function Investigator</title>
      <dc:creator>Pranav Munigala</dc:creator>
      <pubDate>Sun, 29 Jun 2025 15:55:21 +0000</pubDate>
      <link>https://forem.com/pranavmunigala/protein-structure-function-investigator-1hl5</link>
      <guid>https://forem.com/pranavmunigala/protein-structure-function-investigator-1hl5</guid>
      <description>&lt;p&gt;Today, I would like to share a new program that I created in my journey to learn more about bioinformatics and biopython. This is the second project I undertook in this bioinformatics series, which involves investigating protein structure and function. &lt;/p&gt;

&lt;p&gt;What the program is supposed to do: Take user input in PBID (Protein Data Bank ID) form and return the 3D visual structure of the protein, and can interact with an AI agent that can read its file to answer specific questions about it. &lt;/p&gt;

&lt;p&gt;To create this program, I needed to use BioPython's PDB module, which takes a 4-character PDB ID and downloads the corresponding .pdb file. Then, using functions within this module, the output can be parsed so it is easier to read by the AI module and easier to work with in the code. Some key features that can be taken from a PDB file for a protein are structure resolution, secondary structure elements, and amino acid sequence (and many more). &lt;/p&gt;

&lt;p&gt;Overall, these are the tools that I used:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Tech: Python, Streamlit, LangChain Agents.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tools: BioPython (PDB module), Py3Dmol (for 3D visualization in Streamlit).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Data: Live data from the Protein Data Bank (PDB).&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now let's dive into the code for the program. I split this up into a couple of key parts and steps: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Getting the input and setting up a download path
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pdb_id_input = st.text_input("Enter a PDB ID (e.g., 1TUP):", value="1TUP").lower().strip()
download_path = "pdb_files"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This PDB module needs a space for all files to be saved, and for that I needed to setup a file path so that for every different input a new file would be created in that folder and the program would be able to access that information. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgfq2sce79neolnwlgh4p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgfq2sce79neolnwlgh4p.png" alt="Image description" width="172" height="179"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Parsing the input after getting the file and saving it to a variable named "info"
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if pdb_id_input:
    pdbl = PDBList()
    file_path = pdbl.retrieve_pdb_file(pdb_id_input, pdir=download_path, file_format="pdb")

    parser = PDBParser(QUIET=True)
    structure = parser.get_structure(pdb_id_input, file_path)

    # Extract structure info
    model = structure[0]
    chains = list(model.get_chains())
    residues = list(model.get_residues())
    atoms = list(model.get_atoms())

    # Create the `info` string with summary
    info = f"""
PDB ID: {pdb_id_input.upper()}
Structure Name: {structure.header.get('name', 'N/A')}
Experiment Method: {structure.header.get('structure_method', 'N/A')}
Resolution: {structure.header.get('resolution', 'N/A')} Å

Number of Chains: {len(chains)}
Chain IDs: {[chain.id for chain in chains]}
Number of Residues: {len(residues)}
Number of Atoms: {len(atoms)}
"""
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, I used a PDBParser, which is already trained to parse through this type of information and organize the information so that it is easier to extract. In addition, the data is in columns and rows, so you can see that to get the model, for example, it would be structure&lt;a href="https://dev.tousing%20table%20syntax"&gt;0&lt;/a&gt;. From the model, you can also get a lot of other information, like the chains, residues, and atoms. This information is very common, so I wanted to ensure that it was part of the variable that I created. &lt;/p&gt;

&lt;p&gt;Creating the "info" variable, I made sure to save a couple of key features like the ID, the structure name, experiment method, resolution, chains, chain IDs, atoms, and residues. The PDB file is very large, so I thought these would be the most important ones to include.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
# Output
    st.subheader("Structure Info:")
    st.code(info)

     # --- 3D Visualization ---
    st.subheader("🧬 3D Structure Viewer")
    with open(file_path, "r") as f:
        pdb_data = f.read()

    view = py3Dmol.view(width=700, height=500)
    view.addModel(pdb_data, "pdb")
    view.setStyle({'cartoon': {'color': 'spectrum'}})
    view.zoomTo()

    view_html = view._make_html()
    st.components.v1.html(view_html, height=500, width=700)


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

&lt;/div&gt;



&lt;p&gt;This block of code is to visualize the protein structure which is also within the PDB file. Here, I researched syntax and came up with this basic layout for protein structure visualization in the program. Below is an example of what it would look like:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsgruq6ghzgube7awe7wy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsgruq6ghzgube7awe7wy.png" alt="Image description" width="679" height="840"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Setting up the LLM with all the necessary information.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Ask if user has a question
    st.subheader("🤖 Ask About the Structure")
    ask_question = st.radio("Do you have any questions?", ["No", "Yes"])

    if ask_question == "Yes":
        user_question = st.text_input("Enter your question about this structure:")

        if user_question:
            # Initialize LLM
            llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0.4, max_tokens=300)

            # Prompt Template
            prompt = PromptTemplate(
                input_variables=["pdb_id", "info", "question"],
                template="""
You are an expert in protein structures. Given the following:

PDB ID: {pdb_id}
Structure Info:
{info}

Answer this question:
{question}

Make sure the answer is simple enough for a highschool student to understand
"""
            )

            chain = LLMChain(llm=llm, prompt=prompt)
            response = chain.run({
                "pdb_id": pdb_id_input.upper(),
                "info": info,
                "question": user_question
            })
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Through lots of practice, I thought it was pretty simple to do this part of the program. First, I prompted the user to say yes or no if they had any questions. If yes, they would be prompted to type in their question, and it would be saved in a temporary variable. Then I initialized the LLM, created a simple prompt template passing in the variables. Finally, the answer would be returned. &lt;/p&gt;

&lt;p&gt;Just an FYI, all of my Streamlit UI was integrated between these parts. I thought it would be easier to incorporate it into each part of the program. &lt;/p&gt;

&lt;p&gt;Here is a brief walkthrough of the program in action: &lt;a href="https://youtu.be/6UzOTgFaA9c" rel="noopener noreferrer"&gt;https://youtu.be/6UzOTgFaA9c&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>beginners</category>
      <category>machinelearning</category>
      <category>ai</category>
    </item>
    <item>
      <title>Central Dogma Explorer</title>
      <dc:creator>Pranav Munigala</dc:creator>
      <pubDate>Sun, 22 Jun 2025 14:13:14 +0000</pubDate>
      <link>https://forem.com/pranavmunigala/central-dogma-explorer-g6f</link>
      <guid>https://forem.com/pranavmunigala/central-dogma-explorer-g6f</guid>
      <description>&lt;p&gt;Recently, I came across a simple tutorial on using Biopython, and after thoroughly studying the material, I was inspired to build a few projects that combine these foundational bioinformatics concepts with AI. My goal was to gain hands-on experience while creating something both educational and interactive. (&lt;a href="https://www.kaggle.com/code/shtrausslearning/biopython-bioinformatics-basics#8-%7C-PHYLOGENETIC-ANALYSIS" rel="noopener noreferrer"&gt;https://www.kaggle.com/code/shtrausslearning/biopython-bioinformatics-basics#8-|-PHYLOGENETIC-ANALYSIS&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;The first project in this series is called the "Central Dogma Explorer." It's an interactive educational tool designed to take a gene name, retrieve its DNA sequence, and visually demonstrate the biological processes of transcription and translation, ultimately showing how a functional protein is produced.&lt;/p&gt;

&lt;p&gt;To make this more manageable, I divided the project into three core components:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Biopython Integration – I wrote functions such as &lt;code&gt;fetch_gene_sequence(gene_symbol, organism="Homo sapiens")&lt;/code&gt; and &lt;code&gt;transcribe_translate_dna(dna_seq)&lt;/code&gt; to retrieve and process DNA sequences. These functions fetch gene data, transcribe DNA into mRNA, and translate it into an amino acid sequence.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;AI Explanation with an LLM – I incorporated a language model to explain the transcription and translation processes in simple terms. Here's the core function:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def generate_explanation(dna_seq):
    prompt = PromptTemplate(
        input_variables=["sequence"],
        template=(
            "You are an expert biology tutor. Explain the full process of transcription and translation "
            "for this DNA sequence: {sequence}. Your answer should be clear and easy to understand for a first-year biology student."
        )
    )
    chain = LLMChain(llm=llm, prompt=prompt)
    explanation = chain.run(sequence=dna_seq[:500])  # Limit to 500 bases
    return explanation

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

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;User Interface with Streamlit – I built a simple, user-friendly interface using Streamlit to display the DNA sequence, the corresponding mRNA transcript, the amino acid sequence, and an AI-generated explanation. Example UI elements include:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;st.subheader("1️⃣ DNA Sequence")
st.code(dna_seq[:1000] + ("..." if len(dna_seq) &amp;gt; 1000 else ""), language="text")

st.subheader("2️⃣ mRNA Transcript")
st.code(rna_seq[:1000] + ("..." if len(rna_seq) &amp;gt; 1000 else ""), language="text")

st.subheader("3️⃣ Amino Acid Sequence")
st.code(protein_seq, language="text")

st.subheader("4️⃣ AI-Generated Explanation")
st.markdown(explanation)

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

&lt;/div&gt;



&lt;p&gt;I've also created a short tutorial video walking through the application and its features (&lt;a href="https://youtu.be/2qi5UPiiS1Q" rel="noopener noreferrer"&gt;https://youtu.be/2qi5UPiiS1Q&lt;/a&gt;). I'm always open to feedback and would love to hear any suggestions for future bioinformatics projects that combine biology, AI, and interactivity. Thanks for reading!&lt;/p&gt;

&lt;p&gt;Here is a link to the code: &lt;a href="https://github.com/PranavMunigala/CentralDogmaExplorer.git" rel="noopener noreferrer"&gt;https://github.com/PranavMunigala/CentralDogmaExplorer.git&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>beginners</category>
      <category>ai</category>
      <category>python</category>
    </item>
    <item>
      <title>Fictional Player Profile Creator</title>
      <dc:creator>Pranav Munigala</dc:creator>
      <pubDate>Wed, 18 Jun 2025 16:35:37 +0000</pubDate>
      <link>https://forem.com/pranavmunigala/fictional-player-profile-creator-25cc</link>
      <guid>https://forem.com/pranavmunigala/fictional-player-profile-creator-25cc</guid>
      <description>&lt;p&gt;This is the next project in my beginner series, where I explore how to incorporate AI into Python projects by combining it with something I’m passionate about: basketball. My latest project is a player profile creator with a parsed output. &lt;/p&gt;

&lt;p&gt;In this app, users click a button named "Create a new prospect". After clicking the button, the app generates a complete, well-structured player profile, including a generated name, position, physical attributes, a list of strengths and weaknesses, and a creative backstory.&lt;/p&gt;

&lt;p&gt;Tools I Used:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Streamlit to build the interactive user interface&lt;/li&gt;
&lt;li&gt;LangChain to structure the prompt and manage the AI response&lt;/li&gt;
&lt;li&gt;OpenAI’s GPT-3.5 Turbo to perform the in-depth player analysis&lt;/li&gt;
&lt;li&gt;Python-dotenv to securely load my API key&lt;/li&gt;
&lt;li&gt;json parser&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every project in this series helps me build my skills in both coding and AI while keeping it fun by focusing on basketball. I’m looking forward to continuing this series with new features and ideas. As always, feedback is appreciated.&lt;/p&gt;

&lt;p&gt;Youtube Video to show how this works: &lt;a href="https://youtu.be/sfAUTWXf1mY" rel="noopener noreferrer"&gt;https://youtu.be/sfAUTWXf1mY&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>beginners</category>
      <category>ai</category>
      <category>python</category>
    </item>
    <item>
      <title>Player Announcer Tool</title>
      <dc:creator>Pranav Munigala</dc:creator>
      <pubDate>Tue, 17 Jun 2025 19:49:29 +0000</pubDate>
      <link>https://forem.com/pranavmunigala/player-announcer-tool-2nc</link>
      <guid>https://forem.com/pranavmunigala/player-announcer-tool-2nc</guid>
      <description>&lt;p&gt;This is the next project in my beginner series, where I explore how to incorporate AI into Python projects by combining it with something I’m passionate about: basketball. My latest project is an AI-powered hype announcer that generates and reads out dramatic NBA-style player introductions.&lt;/p&gt;

&lt;p&gt;In this app, users can enter the name of any basketball player. After clicking a button, the app produces a high-energy, announcer-style introduction and plays the audio using a realistic AI-generated voice.&lt;/p&gt;

&lt;p&gt;Tools I Used:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Streamlit to build the interactive user interface&lt;/li&gt;
&lt;li&gt;LangChain to structure the prompt and manage the AI response&lt;/li&gt;
&lt;li&gt;OpenAI’s GPT-3.5 Turbo to generate the announcer script&lt;/li&gt;
&lt;li&gt;ElevenLabs to convert text into realistic speech&lt;/li&gt;
&lt;li&gt;Python-dotenv to securely load my API key&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each project in this series helps me build my skills in both coding and AI while keeping it fun by focusing on basketball. I’m looking forward to continuing this series with new features and ideas. As always, feedback is appreciated.&lt;/p&gt;

&lt;p&gt;YouTube video to show how this works:&lt;a href="https://www.youtube.com/watch?v=K9AparJ-HOU" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=K9AparJ-HOU&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>beginners</category>
      <category>ai</category>
      <category>python</category>
    </item>
    <item>
      <title>"Whos Better at Basketball?" Basic AI Program</title>
      <dc:creator>Pranav Munigala</dc:creator>
      <pubDate>Wed, 11 Jun 2025 15:06:55 +0000</pubDate>
      <link>https://forem.com/pranavmunigala/whos-better-at-basketball-basic-ai-program-2n20</link>
      <guid>https://forem.com/pranavmunigala/whos-better-at-basketball-basic-ai-program-2n20</guid>
      <description>&lt;p&gt;This is the next project in my beginner series, where I explore how to incorporate AI into Python projects by combining it with something I’m passionate about: basketball. My latest project is a player comparison tool powered by AI.&lt;/p&gt;

&lt;p&gt;In this app, users can enter the names of two basketball players. After clicking a button, the app generates a detailed, side-by-side breakdown of their strengths, weaknesses, and a final comparison explaining who the better player is overall.&lt;/p&gt;

&lt;p&gt;Tools I Used:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Streamlit to build the interactive user interface&lt;/li&gt;
&lt;li&gt;LangChain to structure the prompt and manage the AI response&lt;/li&gt;
&lt;li&gt;OpenAI’s GPT-3.5 Turbo to perform the in-depth player analysis&lt;/li&gt;
&lt;li&gt;Python-dotenv to securely load my API key&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each project in this series helps me build my skills in both coding and AI while keeping it fun by focusing on basketball. I’m looking forward to continuing this series with new features and ideas. As always, feedback is appreciated.&lt;/p&gt;

&lt;p&gt;Youtube Video to show how this works: &lt;a href="https://www.youtube.com/watch?v=orScdMnyjhg" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=orScdMnyjhg&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>beginners</category>
      <category>ai</category>
      <category>python</category>
    </item>
    <item>
      <title>Breaking Down Basketball Terms with AI (Beginner Project Series)</title>
      <dc:creator>Pranav Munigala</dc:creator>
      <pubDate>Tue, 10 Jun 2025 02:32:38 +0000</pubDate>
      <link>https://forem.com/pranavmunigala/breaking-down-basketball-terms-with-ai-beginner-project-series-n6g</link>
      <guid>https://forem.com/pranavmunigala/breaking-down-basketball-terms-with-ai-beginner-project-series-n6g</guid>
      <description>&lt;p&gt;Hello,&lt;/p&gt;

&lt;p&gt;In my last post, I shared the first project in my beginner series where I’m learning how to incorporate AI into Python coding by connecting it with something I love: basketball. My second project builds on that idea — it's a basketball jargon explainer.&lt;/p&gt;

&lt;p&gt;This app allows users to enter a basketball term, and with the click of a button, it returns a beginner-friendly definition generated by AI.&lt;/p&gt;

&lt;p&gt;Tools I Used:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Streamlit for creating the interactive web interface&lt;/li&gt;
&lt;li&gt;LangChain to structure and manage the language model prompt&lt;/li&gt;
&lt;li&gt;OpenAI’s GPT-3.5 Turbo for generating the explanations&lt;/li&gt;
&lt;li&gt;Python-dotenv to securely manage my API key&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I’m continuing to explore ways to make learning and building with AI both fun and practical. Feedback or suggestions are always welcome. Thanks for following along.&lt;/p&gt;

&lt;p&gt;Youtube Video on how it works: &lt;a href="https://youtu.be/6mS_SNhxR_4" rel="noopener noreferrer"&gt;https://youtu.be/6mS_SNhxR_4&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.amazonaws.com%2Fuploads%2Farticles%2Fg9hg3cag9ivunp06lnfb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg9hg3cag9ivunp06lnfb.png" alt="Image description" width="743" height="630"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>beginners</category>
      <category>ai</category>
      <category>python</category>
    </item>
    <item>
      <title>NBA Random Fact Generator</title>
      <dc:creator>Pranav Munigala</dc:creator>
      <pubDate>Mon, 09 Jun 2025 12:30:03 +0000</pubDate>
      <link>https://forem.com/pranavmunigala/nba-random-fact-generator-49i9</link>
      <guid>https://forem.com/pranavmunigala/nba-random-fact-generator-49i9</guid>
      <description>&lt;p&gt;Hey everyone,&lt;/p&gt;

&lt;p&gt;I'm currently learning the basics of AI tools and web app development, and I decided to build something that combines both with one of my favorite interests: basketball.&lt;/p&gt;

&lt;p&gt;I created a simple Random NBA Fact Generator using Streamlit and LangChain (with OpenAI’s GPT-3.5 Turbo Instruct model). The app generates a new, true, and concise NBA fact each time you click a button. It also avoids repeating the same fact twice in a row.&lt;/p&gt;

&lt;p&gt;How it works:&lt;br&gt;
The app sends a prompt to the LLM:&lt;br&gt;
“Give me one interesting, true, and concise NBA fact. Only return the fact, nothing else.”&lt;/p&gt;

&lt;p&gt;I use a temperature of 0.7 to allow for some variation in responses.&lt;/p&gt;

&lt;p&gt;Streamlit provides a basic UI, and I use session state to store the previous fact and prevent duplicates.&lt;/p&gt;

&lt;p&gt;Why I built this:&lt;br&gt;
I'm exploring how to use Python, AI libraries, and web app frameworks together. Building small, fun projects like this helps reinforce what I'm learning. Since I love basketball, this was a great way to keep things interesting while practicing new tools.&lt;/p&gt;

&lt;p&gt;Here is a link to show how the program works: &lt;a href="https://youtu.be/7hNdoaspY1A" rel="noopener noreferrer"&gt;https://youtu.be/7hNdoaspY1A&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>ai</category>
      <category>python</category>
      <category>beginners</category>
    </item>
    <item>
      <title>First 3 projects with AI</title>
      <dc:creator>Pranav Munigala</dc:creator>
      <pubDate>Fri, 23 May 2025 13:53:08 +0000</pubDate>
      <link>https://forem.com/pranavmunigala/first-3-projects-with-ai-26d8</link>
      <guid>https://forem.com/pranavmunigala/first-3-projects-with-ai-26d8</guid>
      <description>&lt;p&gt;I'm currently a beginner learning how to use AI and improve my coding skills, and recently I built a few small projects that helped me understand how these technologies work. First, I created a simple REACT agent using LangChain and OpenAI that can perform tasks like basic math using tools I defined myself. It was exciting to see how I could connect a language model to actual Python functions and make it respond to user inputs.&lt;/p&gt;

&lt;p&gt;Then, I worked on two beginner-friendly Streamlit apps. One is an AI Resume Critiquer, where users upload a PDF or text version of their resume and get detailed feedback generated by GPT. The other is an Image Classifier that uses a pretrained MobileNetV2 model to predict what’s in a given image. Both of these apps helped me learn how to handle file uploads, connect with AI models, and display results cleanly.&lt;/p&gt;

&lt;p&gt;These projects may be simple, but they’ve been a great first step into the world of AI and app development. I’m excited to keep learning and building more. I would love to hear some more steps I can take to learn about AI or coding in general. Please feel free to give me recommendations. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0lm6lid9zf4yic6ftewf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0lm6lid9zf4yic6ftewf.png" alt="Image description" width="602" height="876"&gt;&lt;/a&gt;&lt;br&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%2Fc3a9uw1oc48glt66qvqm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc3a9uw1oc48glt66qvqm.png" alt="Image description" width="794" height="884"&gt;&lt;/a&gt;&lt;br&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%2F2uowx3bfuneowxkmxzf0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2uowx3bfuneowxkmxzf0.png" alt="Image description" width="800" height="576"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>ai</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
