<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Coffee Chats]]></title><description><![CDATA[Coffee lovers and tech enthusiast]]></description><link>https://hvlcrs.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Wed, 16 Sep 2026 05:34:43 GMT</lastBuildDate><atom:link href="https://hvlcrs.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Building AI Powered Pokemon TCG Deck Builder]]></title><description><![CDATA[Pokémon has always been a huge part of my life! Every time a new game drops, you can bet it’s a day-one purchase for me. The Trading Card Game (TCG), however, has been a different story. Initially, I collected Pokémon cards just for fun—no competitiv...]]></description><link>https://hvlcrs.hashnode.dev/building-ai-powered-pokemon-tcg-deck-builder</link><guid isPermaLink="true">https://hvlcrs.hashnode.dev/building-ai-powered-pokemon-tcg-deck-builder</guid><category><![CDATA[llm]]></category><category><![CDATA[AI]]></category><category><![CDATA[software development]]></category><dc:creator><![CDATA[Havel Cyrus]]></dc:creator><pubDate>Sat, 10 May 2025 17:00:00 GMT</pubDate><content:encoded><![CDATA[<p>Pokémon has always been a huge part of my life! Every time a new game drops, you can bet it’s a day-one purchase for me. The Trading Card Game (TCG), however, has been a different story. Initially, I collected Pokémon cards just for fun—no competitive play, just pure joy. But my collection came to an abrupt halt when my parents banned me from collecting them (tragic, right?). Fast forward to a year ago, when I took my daughter to a Pokémon Festival—and that’s when the magic reignited! My little daughter asked for some cool sets and BOOM, I found myself diving back into the world of Pokémon TCG, both collecting and playing. What amazed me was how little had changed in the game itself. Sure, the competitive meta evolves due to power creep, and cards cycle out every year, but the core mechanics remain familiar.</p>
<h2 id="heading-application-architecture">Application architecture</h2>
<p>Last weekend, I had some free time and thought, "How can I make deck building easier?" Abruptly, I turned to the internet. But all I found were meta deck explanations and prebuilt tactical deck guides, great for competitive players, but not much help if you want to build a deck around a non meta Pokémon. Sure, I could ask the community for advice, but that takes time. That’s when I had a lightbulb moment, why not use AI to solve this problem?</p>
<p>I envisioned a simple system:</p>
<ul>
<li><p>A scraper to gather card data from websites</p>
</li>
<li><p>A database to store the information</p>
</li>
<li><p>Some retrieval mechanisms to fetch relevant data</p>
</li>
<li><p>An MCP server to expose this data to AI agents</p>
</li>
</ul>
<p>So, I started with something like this:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1747042954418/0f5d7d78-b5e0-4f22-9b31-98b80a487b10.png" alt class="image--center mx-auto" /></p>
<p><strong>TLDR; If you don't want to read the rest of the article and simply want to look at the code, it can be accessed</strong> <a target="_blank" href="https://github.com/hvlcrs/pokebuilder"><strong>here</strong></a><strong>. Else, let's go on!!</strong></p>
<h2 id="heading-scraping-the-cards">Scraping the cards</h2>
<p>The first step was scraping card data. Since I play using the regional Indonesia cards, big websites like <a target="_blank" href="https://serebii.net">Serebii</a> weren’t an option—some card names differ. That left me with the official Pokémon site, which thankfully provides all the necessary details. With that sorted, I could begin extracting the data!</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1747043028433/0c68793f-d387-4b48-8951-90f31d02ba15.png" alt class="image--center mx-auto" /></p>
<p>For this task, I chose <a target="_blank" href="https://github.com/unclecode/crawl4ai">crawl4ai</a>. It automatically chunks website sections, making it easier for AI tools to process the data—huge time-saver! Once the data was scraped, the next step was storing it in a vector database.</p>
<h2 id="heading-embedding-and-storing-the-data">Embedding and storing the data</h2>
<p>Since I wanted this tool to be accessible online, I initially leaned toward managed services. Carrying my laptop to casual TCG battles? Not cool. My database of choice is Milvus. There are other capable vector databases like chroma, qdrant, or even supabase. However, Ziliz, the managed Milvus service, is the most generous with it's free offerings. That is the deciding factor. I started with OpenAI for embedding, but reality hit fast, no free trial! That led me to explore alternatives like Gemini, Nomic, and others, but each had limitations for text embeddings. Given the large amount of scraped data, I decided to go local instead. Enter Ollama! Both Ollama and the embedding model can be easily installed with following commands:</p>
<pre><code class="lang-bash">curl -fsSL https://ollama.com/install.sh | sh
ollama pull nomic-embed-text
</code></pre>
<p>With the necessary embedding system and the database already set up. The next step is to process the data. To keep things simple, I started with just two collections:</p>
<ul>
<li><p>regulations (for game rules and restrictions)</p>
</li>
<li><p>cards (for all Pokémon TCG card data)</p>
</li>
</ul>
<p>Creating these collections programmatically was straightforward:</p>
<pre><code class="lang-python">    schema = milvus_client.create_schema(
        auto_id=<span class="hljs-literal">True</span>,
        enable_dynamic_field=<span class="hljs-literal">True</span>,
    )
    schema.add_field(field_name=<span class="hljs-string">"id"</span>, datatype=DataType.INT64, is_primary=<span class="hljs-literal">True</span>)
    schema.add_field(field_name=<span class="hljs-string">"vector"</span>, datatype=DataType.FLOAT_VECTOR,dim=<span class="hljs-number">768</span>) <span class="hljs-comment">#3072 for gemini, 1536 for openai, 768 for ollama</span>

    index_params = milvus_client.prepare_index_params()
    index_params.add_index(
        field_name=<span class="hljs-string">"id"</span>,
        index_type=<span class="hljs-string">"AUTOINDEX"</span>
    )

    index_params.add_index(
        field_name=<span class="hljs-string">"vector"</span>, 
        index_type=<span class="hljs-string">"AUTOINDEX"</span>,
        metric_type=<span class="hljs-string">"COSINE"</span>
    )

    <span class="hljs-comment"># Create a collection in Milvus if it doesn't exist</span>
    <span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> milvus_client.has_collection(collection_name):
        milvus_client.create_collection(
            collection_name=collection_name,
            consistency_level=<span class="hljs-string">"Strong"</span>,
            schema=schema,
            index_params=index_params,
        )
</code></pre>
<p>After the code executed, the initiated collections can be seen from Ziliz's dashboard</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1747043159953/51016cf8-cb2f-44e8-9dca-093a8d18ea72.png" alt class="image--center mx-auto" /></p>
<p>Each collection has auto-indexing (because, let’s be honest, I’m lazy 😆), and I use the <code>COSINE</code> metric for data relativity. The key takeaway here is that the vector dimension must match the embedding system. If I ever switch to OpenAI, I’ll need to update the schema accordingly. Embedding the data using Ollama is ridiculously simple, it’s just one line of code:</p>
<pre><code class="lang-python">    ollama.embed(model=<span class="hljs-string">"nomic-embed-text"</span>, input=text).embeddings[<span class="hljs-number">0</span>]
</code></pre>
<h2 id="heading-bringing-the-mcp-server-to-life">Bringing the MCP server to life</h2>
<p>With everything now standardized, at least in the Python world, spinning up an MCP server is super fast. Thanks to libraries like <code>FastMCP</code>, it takes just a few lines of code to get things up and running:</p>
<pre><code class="lang-python">    <span class="hljs-comment"># Initialize FastMCP server</span>
    mcp = FastMCP(
        <span class="hljs-string">"pokebuilder"</span>,
        description=<span class="hljs-string">"MCP server for Pokemon TCG deck building"</span>,
        host=os.getenv(<span class="hljs-string">"MCP_HOST"</span>, <span class="hljs-string">"0.0.0.0"</span>),
        port=os.getenv(<span class="hljs-string">"MCP_PORT"</span>, <span class="hljs-string">"8051"</span>)
    )
</code></pre>
<p>And just like that, the MCP server is live! 🎉 Now that the server is up and running, the next step is to build a RAG system to fetch relevant data from the database. This will be exposed as an MCP tool, allowing an AI agent to use it for deck building assistance. For this initial version, the regulations are static, but in the future, I might add features to help build competitive tournament decks—that’s a project for another day! When it comes to selecting relevant cards, the idea is simple:</p>
<ul>
<li><p>The user prompt is passed as a query to the database.</p>
</li>
<li><p>The system finds relevant cards based on keywords.</p>
</li>
<li><p>Since most competitive decks use around 15 different cards, I set the query limit to 30 cards, giving some extra flexibility.</p>
</li>
</ul>
<p>Here’s how the query works:</p>
<pre><code class="lang-python">    <span class="hljs-comment"># Get the context for cards selection</span>
    card_result = milvus_client.search(
        collection_name=<span class="hljs-string">"cards"</span>,
        data=[emb_ollama(query)],
        limit=<span class="hljs-number">30</span>,
        search_params={<span class="hljs-string">"metric_type"</span>: <span class="hljs-string">"COSINE"</span>, <span class="hljs-string">"params"</span>: {}},
        output_fields=[<span class="hljs-string">"text"</span>],
    )
    card_distance = [
        (res[<span class="hljs-string">"entity"</span>][<span class="hljs-string">"text"</span>], res[<span class="hljs-string">"distance"</span>]) <span class="hljs-keyword">for</span> res <span class="hljs-keyword">in</span> card_result[<span class="hljs-number">0</span>]
    ]
    card_context = <span class="hljs-string">"\n"</span>.join(
        [line_with_distance[<span class="hljs-number">0</span>] <span class="hljs-keyword">for</span> line_with_distance <span class="hljs-keyword">in</span> card_distance]
    )
</code></pre>
<p>Once the query results are retrieved, I combine the card text based on relevance (distance metric) into a single formatted string. This ensures the information is structured properly for AI processing. Now, it’s time to generate the user prompt! This prompt structure ensures the AI understands the deck-building rules, available cards, and user preferences:</p>
<pre><code class="lang-python">    <span class="hljs-comment"># Generate the user prompt</span>
    user_prompt = <span class="hljs-string">f"""
    Use the following pieces of deck building and battle information enclosed in &lt;regulations&gt; tags to build a pokemon deck with a selection of cards enclosed in &lt;&gt; tags using parameters enclosed in &lt;query&gt; tags.
    &lt;regulations&gt;
    <span class="hljs-subst">{regulation_context}</span>
    &lt;/regulations&gt;
    &lt;cards&gt;
    <span class="hljs-subst">{card_context}</span>
    &lt;/cards&gt;
    &lt;query&gt;
    <span class="hljs-subst">{query}</span>
    &lt;/query&gt;
    """</span>
</code></pre>
<p>Now that everything is set up, it’s time for the testing, whether the MCP server is running correctly! Thankfully, FastMCP comes with a built-in MCP inspector tool, making debugging super easy. To check if everything is working, simply run:</p>
<pre><code class="lang-bash">    mcp dev src/mcp_server.py
</code></pre>
<p>Once the inspector tool is running, you can access it at <a target="_blank" href="http://localhost:6274/#tools"><code>http://localhost:6274/#tools</code></a></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1747043329828/89ab577a-d254-46e6-9831-5a6ccc78850c.png" alt class="image--center mx-auto" /></p>
<p>Using this tool, we can test the MCP server tools and prompts. Just make sure that the transport type is set to SSE and that it points to the correct URL.</p>
<h2 id="heading-setting-up-the-ui">Setting up the UI</h2>
<p>Since I plan to deploy this application online, I need a web-based UI. That led me to <a target="_blank" href="https://github.com/open-webui/open-webui">openwebui</a>, a fantastic web-based interface that can run anywhere! The good news? It’s super flexible! The bad news? It doesn’t support SSE based MCP servers natively. But don’t worry, this is easily fixable! All we need is a proxy in front of our MCP server. For this, I used an openwebui extension called <a target="_blank" href="https://github.com/open-webui/mcpo">mcpo</a>, which can be installed globally using <code>pipx</code>. To run the mcpo server and target our MCP, simply use:</p>
<pre><code class="lang-bash">    mcpo --port 8000 --server-type <span class="hljs-string">"sse"</span> -- http://localhost:8051/sse
</code></pre>
<p>While Ollama works great locally, I want to access this from my phone. That means the MCP server needs to process prompts using a cloud machine (or maybe I’ll host it in my local lab—still undecided!). For now, I’m keeping things simple, so Gemini it is!</p>
<h3 id="heading-setting-up-gemini-with-openwebui">Setting up Gemini with OpenWebUI</h3>
<p>First, we need to get the Gemini API key to integrate it with OpenWebUI.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1747043433420/3bdf118f-21b3-47f7-b3ec-5d14b82b6b14.png" alt class="image--center mx-auto" /></p>
<p>Then, configure the UI to list Gemini as its backend:</p>
<ul>
<li><p>Access the settings and go to Connections</p>
</li>
<li><p>Add Gemini backend URL <a target="_blank" href="https://generativelanguage.googleapis.com/v1beta"><code>https://generativelanguage.googleapis.com/v1beta</code></a></p>
</li>
<li><p>Add the token</p>
</li>
<li><p>Manually add the model ID, for example <code>gemini-2.0-flash</code></p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1747043466804/1d288587-936c-4f3e-b177-5863ea6ca518.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-connecting-openwebui-to-the-mcp">Connecting OpenWebUI to the MCP</h3>
<p>Now, let’s connect the UI to our MCP server:</p>
<ul>
<li><p>Access the settings and go to Tools</p>
</li>
<li><p>Input the mcpo running proxy URL as the target, by default it is <a target="_blank" href="http://localhost:8000/openapi.json"><code>http://localhost:8000/openapi.json</code></a></p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1747043493572/983e0438-288c-4583-946b-f36c25c204ec.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-time-to-build-our-deck">Time to build our deck</h2>
<p>With everything set up, we can finally start building our Pokémon TCG deck!</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1747043518192/c990eaa1-3ccb-41db-b08b-caf81d065a27.png" alt class="image--center mx-auto" /></p>
<p>For now, the results feel a bit sketchy, but tweaking the parameters should help refine things. Interestingly, running the prompt directly as a RAG application instead of through MCP yields better results with the current setup, something that still puzzles me. That’s my homework for now! The next step? Deploying this in the cloud—but that’s a project for another weekend. 😆</p>
]]></content:encoded></item><item><title><![CDATA[The Trap of Being a Manager]]></title><description><![CDATA[Stepping into management is a bit like being point guard in a team where you’ve always been the three. Suddenly, instead of producing dazzling solo drive, layups, and jump shots, you’re managing the tempo, ensuring every section plays harmoniously, a...]]></description><link>https://hvlcrs.hashnode.dev/the-trap-of-being-a-manager</link><guid isPermaLink="true">https://hvlcrs.hashnode.dev/the-trap-of-being-a-manager</guid><category><![CDATA[management]]></category><category><![CDATA[software development]]></category><dc:creator><![CDATA[Havel Cyrus]]></dc:creator><pubDate>Mon, 17 Feb 2025 17:00:00 GMT</pubDate><content:encoded><![CDATA[<p>Stepping into management is a bit like being point guard in a team where you’ve always been the <em>three</em>. Suddenly, instead of producing dazzling solo drive, layups, and jump shots, you’re managing the tempo, ensuring every section plays harmoniously, and making those cut through pass. It’s a wild, sometimes chaotic adventure but one that has taught me invaluable lessons.</p>
<h2 id="heading-what-differs-from-ic-to-manager">What differs from IC to Manager?</h2>
<p>Let’s start with a confession: looking back at my childhood, I’ve always been drawn to the secondary characters, the ones thrust into leadership roles, not by choice, but by circumstance. Think Locke from <em>Final Fantasy VI</em> or Mat from <em>The Wheel of Time</em>. Ironically, life decided to play out the same trope for me. I started as a game developer, passionately crafting physics equations, debugging code, and dreaming up clever game logic. It was a blast! But fast-forward a few years, and the company decided my "communicative, organized, process-oriented" self was ripe for promotion. And just like that, I was a manager. The transition was rocky. As an IC, I had my groove; just me, my code, and my coffee. Lots of coffee. As a manager? Suddenly, the stakes were different. It wasn't just about me anymore; it was about the team. Success was now measured not in lines of code but in team spirit, strategy, and growth. At first, it felt like trading the thrill of scoring points for the quiet satisfaction of assisting my team to shine. And you know what? Over time, I realized I grew into it.</p>
<h2 id="heading-managers-life">Manager's life</h2>
<p>Another thing that I learned the hard way when I first became a manager was that you are expected to wear multiple hats all at once. Especially when you are working in a startup. Constant juggling between horizontal and vertical communication, deciding which fires to put out and which can smolder for a bit, guiding team members in their growth and career paths, handling conflicts, or championing the team’s needs and achievements to leadership. You're expected to juggle like a seasoned circus performer. A manager's worth is measured when they can bring impact to the company. Mastering soft skills like empathy, conflict resolution, and strategic thinking is a must for a manager to grow and make sure they are being seen.</p>
<p>Truth bomb: a manager’s worth often gets tangled up with the team’s output. It’s a little like basketball, you’ve gone from being a flashy shooting guard to a selfless point guard. Your job isn’t to rack up points but to make sure the ball spins smoothly. Challenging? Totally. Rewarding? Absolutely.</p>
<h2 id="heading-coding-or-no-coding-that-is-the-question">Coding or no coding, that is the question</h2>
<p>Like I said before, I miss my coding days. Nothing beats the satisfaction of building something from scratch. The reality being a manager though, your time would be spent more on the people instead of the code itself. Meetings and 1 on 1 are the constants, instead of the variables. In most cases, growing as a manager means broader scope, more responsibility, and more influence; eventually reaching executives’ position. This is where the trap lies. When you step on the managerial ladder, your focus will be on business impact, team building, and growing influence. While on the other hand, as engineering manager, you are expected to excel at engineering!! At first, it's still manageable, but slowly when the company grows, or you grow, it became harder and harder to find the time to code again.</p>
<p>In my case, I still dabbled in technical meetings, PRs and designing system architecture. This allows me to stay connected with the codebase and keeping up with the product development. Spoiler ahead: it's not enough. The reality is it's easy to lose your coding groove. Early on, I found myself lagging behind, struggling with new features, new codes, and submitting PRs that were embarrassingly sloppy. Cue existential crisis: “Am I still an engineer at heart?”. With slow realization, I knew that I started to be left behind.</p>
<p>Then came mistake number two, I code again as a <em>manager</em>. You know where it goes wrong? Yes, trying to code like a full-on player-coach! Bad idea. Being a manager <strong>and</strong> programmer means more working time. I committed more time to code new feature while growing and coaching the team. The result was disastrous, juggling coding and managerial tasks not only burned me out but slowed the team’s progress. It took a while until I can find the balance again.</p>
<p>Lesson learned, I’m not here to score the three pointers, I’m here to assist. I need to be like Steve Nash. The top priority is ~passing the ball~ managerial tasks. Neglecting that means failure, not only for me but for the team as well. I don't need to <em>always</em> code. The sweet spot? Tackling occasional technical challenges that excite me performance tuning, bootstrapping new features, or fixing pesky bugs. And for staying sharp? Side projects are my sanctuary. I finally found the fun again.</p>
<h2 id="heading-any-regrets-so-far">Any regrets so far?</h2>
<p>Do I regret becoming a manager? Honestly? Not really. Sure, there have been moments of sleepless nights over decisions. But every challenge has shaped me to be a better person of myself. The learning curves, the laughter shared over coffee breaks, and the pride in watching my team flourish far outweigh any drawbacks. If I were offered a chance to rewind time, would I choose this path again? Probably. Well, just like what my favorite fictional characters said, “<em>What’s life like if you don’t take a chance now and then?”.</em></p>
]]></content:encoded></item><item><title><![CDATA[Local vs Cloud LLMs/RAG]]></title><description><![CDATA[ChatGPT, Copilot, Gemini... and Local LLM
With all the AI buzzing left and right, it's hard not to jump on the bandwagon. ChatGPT, Copilot, Gemini... so many choices out there! For the general masses, ChatGPT is more than enough to cover the needs.
N...]]></description><link>https://hvlcrs.hashnode.dev/local-vs-cloud-llmsrag</link><guid isPermaLink="true">https://hvlcrs.hashnode.dev/local-vs-cloud-llmsrag</guid><category><![CDATA[AI]]></category><category><![CDATA[llm]]></category><dc:creator><![CDATA[Havel Cyrus]]></dc:creator><pubDate>Wed, 27 Nov 2024 17:00:00 GMT</pubDate><content:encoded><![CDATA[<h2 id="heading-chatgpt-copilot-gemini-and-local-llm">ChatGPT, Copilot, Gemini... and Local LLM</h2>
<p>With all the AI buzzing left and right, it's hard not to jump on the bandwagon. ChatGPT, Copilot, Gemini... so many choices out there! For the general masses, ChatGPT is more than enough to cover the needs.</p>
<p>Now for the tricky part. Sometimes, we need AI help to handle big documents, brainstorm with the right context, or code with a specialized AI model. Sure, you can copy-paste information as a prompt or use RAG to feed data to the LLM backend. But these easy ways come at a price—your prompt becomes part of the AI model's training data, which can be a BIG problem if it contains important information. This is where local LLMs come to the rescue.</p>
<h2 id="heading-enter-the-local-llm">Enter the Local LLM</h2>
<p>What is Local LLM? It's basically a large language model running on your machine instead of the cloud. It offers benefits like offline capability and more security, though it may be slower and less accurate unless you have a powerful machine.</p>
<h3 id="heading-localllm-setup">LocalLLM setup</h3>
<p>My favorite app to run this is <a target="_blank" href="https://msty.app/">Msty</a>. It supports running local models on a CPU (if you have enough memory) and offers GPU acceleration. There are other popular options like LMStudio or llama.cpp, which offer more flexibility, but I prefer a nice UI, and Msty provides just that.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1742893693907/1fe0b5ba-4b27-4af1-b8d2-be78d582e516.png" alt class="image--center mx-auto" /></p>
<p>My setup is quite simple, I installed one of the most popular models from HuggingFace, Meta's <code>LLama 3.1 8B</code> for general use. I use <code>Codegemma</code> for code related stuffs, and <code>Mixed Breed Embed Large</code> for RAGs. Those three models alrady covers almost all of my use case.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1742893700796/25637462-767f-42cc-8e91-49d705ace2d3.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-use-cases">Use cases</h3>
<p>Aside from work, I often use my laptop to write blogs like this or do a bit of coding. My AI use cases also revolve around that. Brainstorming or doing general tasks is straightforward through the prompt UI.</p>
<p>One feature I find super useful for more contextual results is the knowledge stack. It consumes the document we provide through the RAG plugin, tokenizes the content, and stores it in a vector database. This way, I can ask the agent for information from manuals/books without needing to read or search for keywords. Trust me, it saves hours!!</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1742893801288/d6410613-d191-4f3c-b42d-10a9a67328b2.png" alt class="image--center mx-auto" /></p>
<p>For code assistance, I use a VSCode extension called <a target="_blank" href="https://marketplace.visualstudio.com/items?itemName=Continue.continue">Continue</a>. Even though it's rarely used, I find it quite helpful to analyze and review proprietary code without breaking any NDA since everything runs locally.</p>
<h2 id="heading-continue-integration-with-visual-studio-code">Continue integration with Visual Studio Code</h2>
<h3 id="heading-step-1-install-the-model">Step 1: Install the Model</h3>
<p>First things first, let's get that model installed in Msty. It's super straightforward! Just download it from the <code>Local AI Models</code>. Personally, I love using two models for my coding needs: <code>codegemma:7B</code> for general code completion and <code>starcoder2:7b</code> for tab completion. After you've got those models, make sure your local server is up and running in the background—it usually runs on port 10000 by default.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1742893926034/d6de1852-3ff4-4e29-80ad-ff0715bc8623.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-step-2-install-the-vscode-extension">Step 2: Install the VSCode Extension</h3>
<p>Next up, let's get the extension from the VSCode <a target="_blank" href="https://marketplace.visualstudio.com/items?itemName=Continue.continue">marketplace</a>. Once you've finished installing it, it's time to configure the remote target through the <code>config.json</code> file. You can find all the nitty-gritty details here:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1742893916823/db747a43-7eed-477e-973d-8e91dfbe2c63.png" alt class="image--center mx-auto" /></p>
<p>Just access the file settings from the Continue chat tab context menu.</p>
<h3 id="heading-step-3-fine-tuning-and-tweaks">Step 3: Fine-Tuning and Tweaks</h3>
<p>Both Local LLMs and cloud AI have their own strengths and weaknesses. The choice between the two depends on your specific needs and priorities. If local context, data privacy, and customization are important, go for local LLMs. However, for versatility, speed, and broad applicability, cloud options like ChatGPT are excellent choices.</p>
<p>Ultimately, the best solution often lies in a hybrid approach, leveraging the strengths of both local LLMs and global models to meet diverse AI requirements effectively.</p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>Both Local LLMs and cloud AI have their own strengths and weaknesses. The choice between the two depends on your specific needs and priorities. If local context, data privacy, and customization are important, go for local LLMs. However, for versatility, speed, and broad applicability, cloud options like ChatGPT are excellent choices.</p>
<p>Ultimately, the best solution often lies in a hybrid approach, leveraging the strengths of both local LLMs and global models to meet diverse AI requirements effectively.</p>
]]></content:encoded></item></channel></rss>