An AI assistant, in Drupal and Python
A production AI assistant that runs across several LOOM client projects. I built both halves: the Drupal side (module architecture, admin configuration, the assistant interface, content integration) and a companion Python service that does the LLM orchestration.
- It started on Flask and the OpenAI API. I later moved it to LangChain so it isn’t tied to one model provider.
- Retrieval runs on Qdrant, behind a REST contract I designed between the Python service and Drupal.
- The work didn’t end at launch: production debugging, retrieval tuning and ongoing maintenance are part of it.
Semantic search that holds up in production
Semantic search backed by vector databases, taken from working to reliable. That meant choosing embeddings, deciding how to index, and working on retrieval quality end to end, and extending existing AI features until they met real reliability and performance requirements.
The hardest bugs were results that looked plausible and were wrong. That’s the failure mode that makes RAG systems hard to ship, and finding and fixing it was part of the job.
How I work with AI tools
Claude Code is my main development environment, for exploring architecture, implementing, refactoring, debugging, testing and research. Before that I used GitHub Copilot and ChatGPT heavily across VS Code, PhpStorm and the terminal. The point is working well with the tool so the code gets better, not handing the code over to it.