<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Simon Kagwi on Caktus Group</title><link>https://www.caktusgroup.com/authors/simon-kagwi/</link><description>Recent content in Simon Kagwi on Caktus Group</description><generator>Hugo</generator><language>en</language><lastBuildDate>Tue, 16 Dec 2025 08:00:00 -0500</lastBuildDate><atom:link href="https://www.caktusgroup.com/authors/simon-kagwi/index.xml" rel="self" type="application/rss+xml"/><item><title>PydanticAI Agents Intro</title><link>https://www.caktusgroup.com/blog/2025/12/16/pydanticai-agents-intro/</link><pubDate>Tue, 16 Dec 2025 08:00:00 -0500</pubDate><guid>https://www.caktusgroup.com/blog/2025/12/16/pydanticai-agents-intro/</guid><description>&lt;p>In previous posts, we explored function calling and how it enables models to interact with external tools. However, manually defining schemas and managing the request/response loop can get tedious as an application grows. Agent frameworks can help here.&lt;/p></description></item><item><title>LLM Basics: Ollama Function Calling</title><link>https://www.caktusgroup.com/blog/2025/12/03/learning-llm-basics-ollama-function-calling/</link><pubDate>Wed, 03 Dec 2025 19:42:14 +0300</pubDate><guid>https://www.caktusgroup.com/blog/2025/12/03/learning-llm-basics-ollama-function-calling/</guid><description>&lt;p>In our &lt;a href="https://www.caktusgroup.com/blog/2025/12/01/learning-llm-basics-openai-function-calling/">previous post&lt;/a>, we introduced function calling and learned how to do it with OpenAI&amp;rsquo;s LLMs.
In this post, we&amp;rsquo;ll call the same &lt;code>cactify_name&lt;/code> function from that post using Meta&amp;rsquo;s
Llama 3.2 model, installed locally using Ollama. The techniques in this post should also work
with &lt;a href="https://ollama.com/search?c=tools" target="_blank" rel="noopener noreferrer">other Ollama models that support function-calling&lt;/a>.&lt;/p></description></item><item><title>LLM Basics: OpenAI Function Calling</title><link>https://www.caktusgroup.com/blog/2025/12/01/learning-llm-basics-openai-function-calling/</link><pubDate>Mon, 01 Dec 2025 10:00:00 -0500</pubDate><guid>https://www.caktusgroup.com/blog/2025/12/01/learning-llm-basics-openai-function-calling/</guid><description>&lt;p>In our &lt;a href="https://www.caktusgroup.com/blog/2025/10/28/learning-llm-basics-ollama/">previous post&lt;/a>, we explored how to send text to an LLM and receive a text response in return. That is useful for chatbots, but often we need to integrate LLMs with other systems. We may want the model to query a database, call an external API, or perform calculations.&lt;/p></description></item><item><title>Learning LLM Basics with Ollama</title><link>https://www.caktusgroup.com/blog/2025/10/28/learning-llm-basics-ollama/</link><pubDate>Tue, 28 Oct 2025 00:53:50 -0400</pubDate><guid>https://www.caktusgroup.com/blog/2025/10/28/learning-llm-basics-ollama/</guid><description>&lt;p>We have recently started learning about LLMs and how we can integrate them into our development projects, and we will be documenting our learning in a series of blog posts.
In our &lt;a href="https://www.caktusgroup.com/blog/2025/10/02/learning-llm-basics-openai/">first installment&lt;/a> of the &lt;a href="https://www.caktusgroup.com/tags/llm-learning-series/">series&lt;/a>, we learned about the OpenAI API.
In this one, we will experiment with &lt;a href="https://ollama.com/" target="_blank" rel="noopener noreferrer">Ollama&lt;/a>, which is an open-source application that allows you to download, run, and interact with LLMs on your own hardware. By running models locally, you maintain complete control over your data and can use LLMs without an internet connection. It also allows you to easily experiment with different models.&lt;/p></description></item><item><title>How We Replaced Bit.ly with Our Own URL Shortener Using Hugo and Cloudflare Pages</title><link>https://www.caktusgroup.com/blog/2025/10/21/how-we-replaced-bitly/</link><pubDate>Tue, 21 Oct 2025 09:42:47 -0400</pubDate><guid>https://www.caktusgroup.com/blog/2025/10/21/how-we-replaced-bitly/</guid><description>&lt;p>We have been using Bit.ly to create easily shareable short URLs, but we recently
decided to replace it with our own solution. We created a &lt;a href="https://gohugo.io/" target="_blank" rel="noopener noreferrer">Hugo&lt;/a>-based static
website where we could create the short URLs, handle redirects to their respective long URLs,
and have a page for each short URL displaying its QR code.&lt;/p></description></item><item><title>Learning LLM Basics with OpenAI</title><link>https://www.caktusgroup.com/blog/2025/10/02/learning-llm-basics-openai/</link><pubDate>Thu, 02 Oct 2025 09:00:00 -0400</pubDate><guid>https://www.caktusgroup.com/blog/2025/10/02/learning-llm-basics-openai/</guid><description>&lt;p>For some time now, we&amp;rsquo;ve been using tools like ChatGPT and CoPilot for day-to-day tasks, but mostly through the conversational AI chatbots they provide. We&amp;rsquo;ve used them for everything from drafting emails to providing type-ahead coding assistance. We haven&amp;rsquo;t, however, gone a step further and integrated them into a development project. Honestly, we weren&amp;rsquo;t sure where to start. Looking into the available options, you quickly run into a dozen new concepts, from vector stores to agents, and different SDKs that all seem to solve similar problems.&lt;/p></description></item><item><title>How to migrate from pip-tools to uv</title><link>https://www.caktusgroup.com/blog/2025/08/25/migrate-pip-tools-to-uv/</link><pubDate>Mon, 25 Aug 2025 14:00:00 -0400</pubDate><guid>https://www.caktusgroup.com/blog/2025/08/25/migrate-pip-tools-to-uv/</guid><description>&lt;p>At Caktus, many of our projects use &lt;code>pip-tools&lt;/code> for dependency management. Following Tobias&amp;rsquo; post &lt;a href="https://www.caktusgroup.com/blog/2025/06/11/migrating-python-django-projects-uv/">How to Migrate your Python &amp;amp; Django Projects to uv&lt;/a>, we were looking to migrate other projects to &lt;code>uv&lt;/code>, but the path seemed less clear with existing pip-tools setups. Our requirements are often spread across multiple files, like this:&lt;/p></description></item><item><title>How to Deploy a Hugo Site to Cloudflare Pages With Github Actions</title><link>https://www.caktusgroup.com/blog/2025/08/20/how-to-deploy-a-hugo-site-to-cloudflare-pages-with-github-actions/</link><pubDate>Wed, 20 Aug 2025 01:33:52 +0300</pubDate><guid>https://www.caktusgroup.com/blog/2025/08/20/how-to-deploy-a-hugo-site-to-cloudflare-pages-with-github-actions/</guid><description>&lt;p>We recently moved this website from Django to a static website made using &lt;a href="https://gohugo.io/" target="_blank" rel="noopener noreferrer">Hugo&lt;/a>, and
decided to use &lt;a href="https://pages.cloudflare.com/" target="_blank" rel="noopener noreferrer">Cloudflare Pages&lt;/a> to deploy it.
Cloudflare Pages offers automatic deployments, meaning it can automatically build
and deploy a website when changes are pushed to a GitHub branch. This is simple
to set up and works well. However, we wanted to build and deploy using GitHub
Actions instead, so that the build logs would be easily accessible on GitHub.
Cloudflare&amp;rsquo;s &lt;a href="https://github.com/cloudflare/wrangler-action" target="_blank" rel="noopener noreferrer">&lt;code>wrangler-action&lt;/code>&lt;/a>
makes it simple to set up a GitHub Actions workflow for this.&lt;/p></description></item><item><title>How to Create a Helm Chart for a Django App</title><link>https://www.caktusgroup.com/blog/2025/03/18/how-create-helm-chart-django-app/</link><pubDate>Tue, 18 Mar 2025 08:00:00 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2025/03/18/how-create-helm-chart-django-app/</guid><description>&lt;p>At Caktus, we use &lt;a href="https://helm.sh/" target="_blank" rel="noopener noreferrer">Helm charts&lt;/a> to simplify our
deployment process for Django projects. Helm is a package manager for
Kubernetes, and using Helm charts allows us to automate the process of
writing Kubernetes configuration files for our Django applications. We
use it together with GitHub Actions and Ansible to streamline our
deployment processes.&lt;/p></description></item><item><title>How to fix factory_boy post-generation deprecation warnings</title><link>https://www.caktusgroup.com/blog/2025/02/18/how-fix-factory_boy-post-generation-deprecation-warning/</link><pubDate>Tue, 18 Feb 2025 17:52:17 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2025/02/18/how-fix-factory_boy-post-generation-deprecation-warning/</guid><description>&lt;p>We use &lt;a href="https://factoryboy.readthedocs.io/en/stable/" target="_blank" rel="noopener noreferrer">factory_boy&lt;/a> for
bootstrapping test data on many Python and Django projects at Caktus.
Recently, we encountered a deprecation warning on an older project that
had been using &lt;code>factory_boy&lt;/code> for some time:&lt;/p></description></item><item><title>Testing Django Views for Concurrency Issues (Updated for Django 4.2 in 2024)</title><link>https://www.caktusgroup.com/blog/2009/05/26/testing-django-views-for-concurrency-issues/</link><pubDate>Tue, 26 May 2009 19:59:25 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2009/05/26/testing-django-views-for-concurrency-issues/</guid><description>&lt;p>&lt;em>Editor's note: This post was originally published in May, 2009 and was
updated in December, 2024 to incorporate changes in Django and
improvements suggested by our readers. It has also been tested for
compatibility as of the Django 4.2 release.&lt;/em>&lt;/p></description></item></channel></rss>