Portfolio

Maureen, an assistant that lists your home for you

A site-wide AI agent on MOREin1 that answers questions, finds people and properties, and turns a conversation into a published listing.

Role
AI Automation Specialist, contract
When
Dec 2025 – present
Built
The LangGraph agent, its tools and retrieval, the listing flow, evals, and the admin panel
Stack
Python · FastAPI · LangGraph · Postgres + pgvector · Redis · OpenRouter

Recorded on the staging site. Jump to a part from the first chapter below.

  • ~2 minto create a listingdown from ~10 minutes by hand
  • 37/37evaluation test cases passed
  • 2000+members and guestscan use it across the site

The demo, part by part

The problem

MOREin1 brings buyers, sellers, agents, lenders, and service providers onto one real estate platform. Creating a listing meant working through a long form by hand: about 10 minutes per property. And with so many kinds of members on one site, people needed a single place to ask about the platform, their account, and who to work with.

What I built

One agent available on every page, signed in or not. It decides which tool a question needs and answers with links straight to the right page.

  • Answers from the site's docs

    Retrieval over MOREin1's help center, FAQ, and policies, so questions about the platform get the site's own answer.

  • Account answers through APIs

    Tool calls to the site's APIs: your groups, a property's details, a lender on the platform, each with a link to the page.

  • Listing by conversation

    Pulls listing details from a voice transcript, drafts the title and description, and walks the listing through to publishing.

How it fits together

Maureen runs as its own service, morein1-ai (Python, FastAPI, LangGraph), beside the site's NestJS API. Every chat passes through a gate in that API first. The agent calls back with a service token for account, directory, and role data, and writes listings, drafts, and photos to the core API.

Inside, guardrails wrap an agent loop that picks from its tools: the knowledge base, listings and profile search, account tools, and listing tools. It runs on Postgres with pgvector and Redis, and reaches language models through OpenRouter, with OpenAI embeddings, Cohere reranking, and an ElevenLabs voice agent for listing by voice.

MOREin1 architecture. Visitors, members, and admins reach the Next.js website, which hosts the Maureen chat widget on every page and an AI listing agent. The website talks to morein1-be, the core API for accounts, listings, drafts, and business records, and to backend-nest, the NestJS site API with its own PostgreSQL database and a chatbot gate. backend-nest forwards chat, admin, search, and events to morein1-ai, a Python FastAPI LangGraph service containing Maureen: guardrails, an agent loop, a knowledge base, listings search, account tools, and listing tools, plus profile search, event pages, and post moderation, on Postgres with pgvector and Redis. morein1-ai calls back to backend-nest with a service token for account, directory, and role data, and writes listings, drafts, and photos to morein1-be. Outside services: object storage, OneSignal, Slack, Datadog, and n8n for backend-nest; ListHub, OpenRouter, OpenAI embeddings, Cohere reranking, and ElevenLabs voice for morein1-ai.

Built to be run, not just demoed

An assistant on a live site needs someone to watch it. The admin panel gives MOREin1's staff control without needing a developer.

  • Kill switch

    Staff can turn the chat off in one click. Visitors get a polite "temporarily unavailable" message instead of an error.

  • Knowledge gaps

    Low-confidence questions are grouped with the replies Maureen gave. Staff write the right answer, and can add it to the evals so it stays fixed.

  • Message logs

    Every conversation with what was allowed or blocked, response time, and cost per message.

  • Knowledge base

    Staff upload PDFs, Word, Markdown, or text. Each document is chunked and indexed for retrieval, and re-uploading replaces it.