# pangyongsheng/thinkcanvas architecture

> Architecture diagram of the GitHub repository pangyongsheng/thinkcanvas, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-28). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/pangyongsheng/thinkcanvas
- Repository: https://github.com/pangyongsheng/thinkcanvas

## Overview

ThinkCanvas turns a user’s text prompt into a Manim animation, with a script-review-and-confirm stage for complex prompts and conversational refinement after generation. The documented v1 flow passes through the HTTP API and AgentService, which orchestrates the supervisor, retrieves examples and memory, and persists agent activity; routes handle rendering and expose resulting media. The v2 task API is represented separately because its task CRUD is visible, but its generation orchestration is not established by the sampled source. The graph follows the README and sampled files; unsampled subsystem wiring is omitted.

Main entry points: [`backend/app/agents/service.py`](https://github.com/pangyongsheng/thinkcanvas/blob/main/backend/app/agents/service.py) (AgentService), [`backend/app/main.py`](https://github.com/pangyongsheng/thinkcanvas/blob/main/backend/app/main.py) (FastAPI app), [`backend/app/agents/supervisor.py`](https://github.com/pangyongsheng/thinkcanvas/blob/main/backend/app/agents/supervisor.py) (Supervisor), [`backend/app/llm/client.py`](https://github.com/pangyongsheng/thinkcanvas/blob/main/backend/app/llm/client.py) (LLM adapter)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_experience["User experience"]
  node_frontend["Web interface<br/>[page.tsx]"]
  node_frontend_v2["Task interface<br/>[page.tsx]"]
end

subgraph group_api["HTTP interface"]
  node_app["FastAPI app<br/>[main.py]"]
  node_v1_routes["Generation routes"]
  node_v2_routes["Task routes"]
  node_render_route["Render endpoint<br/>[render.py]"]
end

subgraph group_generation["Generation workflow"]
  node_service["AgentService<br/>[service.py]"]
  node_supervisor["Supervisor<br/>[supervisor.py]"]
  node_script["Script Designer<br/>[script_designer.py]"]
  node_coder["Code generation<br/>[react_coder.py]"]
  node_reviewer["Code review<br/>[reviewer.py]"]
  node_middleware["Agent persistence<br/>[persistence.py]"]
  node_llm_adapter["LLM adapter<br/>[client.py]"]
end

subgraph group_context["Personalization"]
  node_fewshot["Example retrieval<br/>[retriever.py]"]
  node_embedding["Embeddings<br/>[embeddings.py]"]
  node_memory["Long-term memory<br/>[memory.py]"]
  node_curator["Memory curator<br/>[memory_curator.py]"]
end

subgraph group_persistence["State and output"]
  node_dao["Data access"]
  node_database[("PostgreSQL")]
  node_renderer["Manim renderer<br/>[manim.py]"]
  node_media["Generated media<br/>[main.py]"]
  node_task_store["Task storage<br/>[tasks_pg.py]"]
  node_task_models["V2 task models<br/>[task.py]"]
end

node_user(("User"))
node_llm{{"LLM provider"}}

node_user -->|"enters prompt"| node_frontend
node_frontend -->|"sends HTTP"| node_app
node_app -->|"dispatches routes"| node_v1_routes
node_v1_routes -->|"invokes workflow"| node_service
node_service -->|"retrieves examples"| node_fewshot
node_service -->|"builds context"| node_memory
node_fewshot -->|"embeds queries"| node_embedding
node_service -->|"runs state graph"| node_supervisor
node_supervisor -->|"routes scripting"| node_script
node_supervisor -->|"routes coding"| node_coder
node_supervisor -->|"routes review"| node_reviewer
node_reviewer -->|"returns feedback"| node_coder
node_coder -->|"requests completion"| node_llm_adapter
node_script -->|"requests completion"| node_llm_adapter
node_reviewer -->|"requests completion"| node_llm_adapter
node_llm_adapter -->|"calls provider"| node_llm
node_service -->|"invokes agent"| node_middleware
node_middleware -->|"persists activity"| node_dao
node_service -->|"reads and updates"| node_dao
node_dao -->|"reads and writes"| node_database
node_v1_routes -->|"delegates rendering"| node_renderer
node_renderer -->|"writes video"| node_media
node_app -->|"serves files"| node_media
node_frontend_v2 -->|"sends HTTP"| node_app
node_app -->|"dispatches routes"| node_v2_routes
node_v2_routes -->|"manages tasks"| node_task_store
node_task_store -->|"reads and writes"| node_task_models
node_task_models -->|"stored in"| node_database
node_curator -->|"updates memories"| node_dao

click node_frontend "https://github.com/pangyongsheng/thinkcanvas/blob/main/frontend/app/page.tsx"
click node_frontend_v2 "https://github.com/pangyongsheng/thinkcanvas/blob/main/frontend/app/v2/page.tsx"
click node_app "https://github.com/pangyongsheng/thinkcanvas/blob/main/backend/app/main.py"
click node_v1_routes "https://github.com/pangyongsheng/thinkcanvas/tree/main/backend/app/api/v1"
click node_v2_routes "https://github.com/pangyongsheng/thinkcanvas/tree/main/backend/app/api/v2"
click node_service "https://github.com/pangyongsheng/thinkcanvas/blob/main/backend/app/agents/service.py"
click node_supervisor "https://github.com/pangyongsheng/thinkcanvas/blob/main/backend/app/agents/supervisor.py"
click node_script "https://github.com/pangyongsheng/thinkcanvas/blob/main/backend/app/agents/script_designer.py"
click node_coder "https://github.com/pangyongsheng/thinkcanvas/blob/main/backend/app/agents/react_coder.py"
click node_reviewer "https://github.com/pangyongsheng/thinkcanvas/blob/main/backend/app/agents/reviewer.py"
click node_middleware "https://github.com/pangyongsheng/thinkcanvas/blob/main/backend/app/agents/middleware/persistence.py"
click node_llm_adapter "https://github.com/pangyongsheng/thinkcanvas/blob/main/backend/app/llm/client.py"
click node_fewshot "https://github.com/pangyongsheng/thinkcanvas/blob/main/backend/app/agents/retriever.py"
click node_embedding "https://github.com/pangyongsheng/thinkcanvas/blob/main/backend/app/services/embeddings.py"
click node_memory "https://github.com/pangyongsheng/thinkcanvas/blob/main/backend/app/agents/memory.py"
click node_curator "https://github.com/pangyongsheng/thinkcanvas/blob/main/backend/app/agents/memory_curator.py"
click node_dao "https://github.com/pangyongsheng/thinkcanvas/tree/main/backend/app/agents/dao"
click node_database "https://github.com/pangyongsheng/thinkcanvas/tree/main/backend/app/db"
click node_render_route "https://github.com/pangyongsheng/thinkcanvas/blob/main/backend/app/api/v1/render.py"
click node_renderer "https://github.com/pangyongsheng/thinkcanvas/blob/main/backend/app/renderers/manim.py"
click node_media "https://github.com/pangyongsheng/thinkcanvas/blob/main/backend/app/main.py"
click node_task_store "https://github.com/pangyongsheng/thinkcanvas/blob/main/backend/app/agent2/storage/tasks_pg.py"
click node_task_models "https://github.com/pangyongsheng/thinkcanvas/blob/main/backend/app/db/models_v2/task.py"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_frontend,node_frontend_v2,node_user toneBlue
class node_app,node_v1_routes,node_v2_routes,node_render_route toneAmber
class node_service,node_supervisor,node_script,node_coder,node_reviewer,node_middleware,node_llm_adapter toneMint
class node_fewshot,node_embedding,node_memory,node_curator toneRose
class node_dao,node_database,node_renderer,node_media,node_task_store,node_task_models,node_llm toneIndigo
```

## Components

### User experience

- [Web interface](https://github.com/pangyongsheng/thinkcanvas/blob/main/frontend/app/page.tsx): `frontend/app/page.tsx`
- [Task interface](https://github.com/pangyongsheng/thinkcanvas/blob/main/frontend/app/v2/page.tsx): `frontend/app/v2/page.tsx`

### HTTP interface

- [FastAPI app](https://github.com/pangyongsheng/thinkcanvas/blob/main/backend/app/main.py): `backend/app/main.py`
- [Generation routes](https://github.com/pangyongsheng/thinkcanvas/tree/main/backend/app/api/v1): `backend/app/api/v1`
- [Task routes](https://github.com/pangyongsheng/thinkcanvas/tree/main/backend/app/api/v2): `backend/app/api/v2`
- [Render endpoint](https://github.com/pangyongsheng/thinkcanvas/blob/main/backend/app/api/v1/render.py): `backend/app/api/v1/render.py`

### Generation workflow

- [AgentService](https://github.com/pangyongsheng/thinkcanvas/blob/main/backend/app/agents/service.py): `backend/app/agents/service.py`
- [Supervisor](https://github.com/pangyongsheng/thinkcanvas/blob/main/backend/app/agents/supervisor.py): `backend/app/agents/supervisor.py`
- [Script Designer](https://github.com/pangyongsheng/thinkcanvas/blob/main/backend/app/agents/script_designer.py): `backend/app/agents/script_designer.py`
- [Code generation](https://github.com/pangyongsheng/thinkcanvas/blob/main/backend/app/agents/react_coder.py): `backend/app/agents/react_coder.py`
- [Code review](https://github.com/pangyongsheng/thinkcanvas/blob/main/backend/app/agents/reviewer.py): `backend/app/agents/reviewer.py`
- [Agent persistence](https://github.com/pangyongsheng/thinkcanvas/blob/main/backend/app/agents/middleware/persistence.py): `backend/app/agents/middleware/persistence.py`
- [LLM adapter](https://github.com/pangyongsheng/thinkcanvas/blob/main/backend/app/llm/client.py): `backend/app/llm/client.py`

### Personalization

- [Example retrieval](https://github.com/pangyongsheng/thinkcanvas/blob/main/backend/app/agents/retriever.py): `backend/app/agents/retriever.py`
- [Embeddings](https://github.com/pangyongsheng/thinkcanvas/blob/main/backend/app/services/embeddings.py): `backend/app/services/embeddings.py`
- [Long-term memory](https://github.com/pangyongsheng/thinkcanvas/blob/main/backend/app/agents/memory.py): `backend/app/agents/memory.py`
- [Memory curator](https://github.com/pangyongsheng/thinkcanvas/blob/main/backend/app/agents/memory_curator.py): `backend/app/agents/memory_curator.py`

### State and output

- [Data access](https://github.com/pangyongsheng/thinkcanvas/tree/main/backend/app/agents/dao): `backend/app/agents/dao`
- [PostgreSQL](https://github.com/pangyongsheng/thinkcanvas/tree/main/backend/app/db): `backend/app/db`
- [Manim renderer](https://github.com/pangyongsheng/thinkcanvas/blob/main/backend/app/renderers/manim.py): `backend/app/renderers/manim.py`
- [Generated media](https://github.com/pangyongsheng/thinkcanvas/blob/main/backend/app/main.py): `backend/app/main.py`
- [Task storage](https://github.com/pangyongsheng/thinkcanvas/blob/main/backend/app/agent2/storage/tasks_pg.py): `backend/app/agent2/storage/tasks_pg.py`
- [V2 task models](https://github.com/pangyongsheng/thinkcanvas/blob/main/backend/app/db/models_v2/task.py): `backend/app/db/models_v2/task.py`

### Other components

- **User**
- **LLM provider**

## Connections

- User → Web interface: enters prompt
- Web interface → FastAPI app: sends HTTP
- FastAPI app → Generation routes: dispatches routes
- Generation routes → AgentService: invokes workflow
- AgentService → Example retrieval: retrieves examples
- AgentService → Long-term memory: builds context
- Example retrieval → Embeddings: embeds queries
- AgentService → Supervisor: runs state graph
- Supervisor → Script Designer: routes scripting
- Supervisor → Code generation: routes coding
- Supervisor → Code review: routes review
- Code review → Code generation: returns feedback
- Code generation → LLM adapter: requests completion
- Script Designer → LLM adapter: requests completion
- Code review → LLM adapter: requests completion
- LLM adapter → LLM provider: calls provider
- AgentService → Agent persistence: invokes agent
- Agent persistence → Data access: persists activity
- AgentService → Data access: reads and updates
- Data access → PostgreSQL: reads and writes
- Generation routes → Manim renderer: delegates rendering
- Manim renderer → Generated media: writes video
- FastAPI app → Generated media: serves files
- Task interface → FastAPI app: sends HTTP
- FastAPI app → Task routes: dispatches routes
- Task routes → Task storage: manages tasks
- Task storage → V2 task models: reads and writes
- V2 task models → PostgreSQL: stored in
- Memory curator → Data access: updates memories
