Powered by AI
  • Home
  • Handbook
    • SQL hangbook
    • R handbook
    • Python handbook
    • Machine learning handbook
    • tensorflowing handbook
    • AI handbook
  • Blog
  • CV
  • EN/中文
    • English
    • 中文

On this page

  • 💝 This Valentine’s Day
  • 📸 Photo Gallery
  • Our Memories
  • 🤖 AI Models
  • Tech stack
  • AI agent flow

A Love Agent

AI assistant for love memory,picture managment and more

AI
love
Author

Tony D

Published

February 14, 2026

💝 This Valentine’s Day

give your special someone a unique gift — a personalized AI agent to document your love story.

📸 Photo Gallery

Export precious photos anytime, anywhere. Smart categorization with one-click export.

Our Memories

Add your unique love memories and capture every sweet moment.

🤖 AI Models

Switch between latest AI models including GLM-5,Kimi K2.5,Minimax-m2.5.

Tech stack

Python/langgraph/OpenAI SDK/Streamlit/Supabase

AI agent flow

graph TD
    %% Frontend / UI Layer
    subgraph UI ["Streamlit Frontend (app.py)"]
        UserInput[User enters Message]
        Auth{Auth Check}
        UIPages[Page Navigation: Chat / Memory / Settings]
        DisplayResponse[Display Text + Images + Download Buttons]
    end

    %% Agent Logic Layer
    subgraph Agent ["LangGraph Workflow (agent.py)"]
        direction TB
        NodeStart((Start)) --> Retrieve[Retrieve Context]
        Retrieve --> DecideSearch{Decide Search}
        
        DecideSearch -- "Search Needed" --> WebSearch[Perform Web Search]
        DecideSearch -- "No Search" --> Generate
        WebSearch --> Generate[Generate Response]
        Generate --> NodeEnd((End))
    end

    %% Data / Knowledge Layer
    subgraph Storage ["Knowledge & Configuration"]
        StoryMD[story.md: Background Story]
        DataXLSX[data.xlsx: Image Metadata]
        ImageDir[image/: Local Photos]
        Supabase[(Supabase: Persistent Memory/Plans)]
        Config[config.py: LLM Providers & API Keys]
    end

    %% External Services
    subgraph External ["External Services"]
        LLM[LLM APIs: Gemini/Minimax/OpenRouter]
        SearchEngines[Tavily / DuckDuckGo]
    end

    %% Direct Connections
    UserInput --> Auth
    Auth -- "Pass" --> UIPages
    UIPages -- "Chat Interaction" --> Agent
    
    %% Agent Interactions
    Retrieve -.-> StoryMD
    Retrieve -.-> DataXLSX
    Retrieve -.-> Supabase
    DecideSearch -.-> LLM
    WebSearch -.-> SearchEngines
    Generate -.-> LLM
    Generate -.-> Config
    
    %% Output
    NodeEnd --> DisplayResponse
    DisplayResponse -.-> ImageDir

Source Code
---
title: "A Love Agent"
subtitle: "AI assistant for love memory,picture managment and more"
author: "Tony D"
date: "2026-02-14"
categories: [AI,love]
image: "images/cover.png"
format:
  html:
    code-fold: true
    code-tools: true
    code-copy: true
execute:
  warning: false
---

# 💝 This Valentine's Day

give your special someone a unique gift — a personalized AI agent to document your love story.


![](images/my screenshots 1.png){width="500"}

# 📸 **Photo Gallery**

Export precious photos anytime, anywhere. Smart categorization with one-click export.


![](images/my screenshots 2.png){width="500"}


#  **Our Memories** 
Add your unique love memories and capture every sweet moment.

![](images/my screenshots 3.png){width="500"}

# 🤖 **AI Models** 

Switch between latest AI models including GLM-5,Kimi K2.5,Minimax-m2.5.

![](images/my screenshots 4.png){width="500"}

# Tech stack

Python/langgraph/OpenAI SDK/Streamlit/Supabase


# AI agent flow


```{mermaid}
graph TD
    %% Frontend / UI Layer
    subgraph UI ["Streamlit Frontend (app.py)"]
        UserInput[User enters Message]
        Auth{Auth Check}
        UIPages[Page Navigation: Chat / Memory / Settings]
        DisplayResponse[Display Text + Images + Download Buttons]
    end

    %% Agent Logic Layer
    subgraph Agent ["LangGraph Workflow (agent.py)"]
        direction TB
        NodeStart((Start)) --> Retrieve[Retrieve Context]
        Retrieve --> DecideSearch{Decide Search}
        
        DecideSearch -- "Search Needed" --> WebSearch[Perform Web Search]
        DecideSearch -- "No Search" --> Generate
        WebSearch --> Generate[Generate Response]
        Generate --> NodeEnd((End))
    end

    %% Data / Knowledge Layer
    subgraph Storage ["Knowledge & Configuration"]
        StoryMD[story.md: Background Story]
        DataXLSX[data.xlsx: Image Metadata]
        ImageDir[image/: Local Photos]
        Supabase[(Supabase: Persistent Memory/Plans)]
        Config[config.py: LLM Providers & API Keys]
    end

    %% External Services
    subgraph External ["External Services"]
        LLM[LLM APIs: Gemini/Minimax/OpenRouter]
        SearchEngines[Tavily / DuckDuckGo]
    end

    %% Direct Connections
    UserInput --> Auth
    Auth -- "Pass" --> UIPages
    UIPages -- "Chat Interaction" --> Agent
    
    %% Agent Interactions
    Retrieve -.-> StoryMD
    Retrieve -.-> DataXLSX
    Retrieve -.-> Supabase
    DecideSearch -.-> LLM
    WebSearch -.-> SearchEngines
    Generate -.-> LLM
    Generate -.-> Config
    
    %% Output
    NodeEnd --> DisplayResponse
    DisplayResponse -.-> ImageDir

```
 
 

This blog is built with ❤️ and Quarto.