# kuyi11/video-content-knowledge-base architecture

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

- Interactive diagram: https://gitdiagram.com/kuyi11/video-content-knowledge-base
- Repository: https://github.com/kuyi11/video-content-knowledge-base

## Overview

VideoContentKnowledgeBase turns Bilibili videos and optional Obsidian sources into structured, searchable knowledge, then serves evidence-grounded answers and content-generation workflows. Its main ingestion path extracts subtitles or falls back to ASR, builds profile-specific notes, and updates a hybrid index. The query path retrieves and checks evidence before the agent applies safety and answer-admission rules. The README documents capabilities beyond the sampled excerpts; those branches are included where the documentation supports them, without inferring unsampled calls.

Main entry points: [`pipeline.py`](https://github.com/kuyi11/video-content-knowledge-base/blob/main/pipeline.py) (Ingestion pipeline), [`modules/agent.py`](https://github.com/kuyi11/video-content-knowledge-base/blob/main/modules/agent.py) (Answering agent), [`modules/query_engine.py`](https://github.com/kuyi11/video-content-knowledge-base/blob/main/modules/query_engine.py) (Query engine), [`api.py`](https://github.com/kuyi11/video-content-knowledge-base/blob/main/api.py) (FastAPI service)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_ingest["Video ingestion"]
  node_pipeline["Ingestion pipeline<br/>[pipeline.py]"]
  node_subtitle["Subtitle discovery<br/>[subtitle.py]"]
  node_audio["Audio download<br/>[audio.py]"]
  node_transcribe["ASR transcription<br/>[transcribe.py]"]
  node_asr_backends["ASR backends"]
  node_transcript_parse["Transcript parsing"]
end

subgraph group_knowledge["Knowledge preparation"]
  node_content_map["Fact-map extraction<br/>[content_map.py]"]
  node_structure["Profile synthesis<br/>[structure.py]"]
  node_profiles["Prompt profiles<br/>[prompt_profiles.py]"]
  node_writer["Markdown writer<br/>[obsidian_writer.py]"]
  node_vault[("Knowledge vault")]
end

subgraph group_retrieval["Search and retrieval"]
  node_vault_loader["Vault loader<br/>[vault_loader.py]"]
  node_chunk_splitter["Chunking<br/>[chunk_splitter.py]"]
  node_indexer[("Hybrid index<br/>[indexer.py]")]
  node_query_planner["Query planning<br/>[query_planner.py]"]
  node_query_rewriter["Query rewriting<br/>[query_rewriter.py]"]
  node_reranker["Result reranking<br/>[reranker.py]"]
  node_query_engine["Query engine<br/>[query_engine.py]"]
end

subgraph group_answering["Evidence-grounded answers"]
  node_agent["Answering agent<br/>[agent.py]"]
  node_claim_grounding["Claim grounding<br/>[claim_grounding.py]"]
  node_claim_judge["Semantic judge<br/>[claim_judge.py]"]
  node_medical_safety["Medical safety<br/>[medical_safety.py]"]
  node_evidence_audit[("Evidence audit<br/>[evidence_audit.py]")]
end

subgraph group_service["API and persistence"]
  node_api["FastAPI service<br/>[api.py]"]
  node_config["Runtime configuration<br/>[config.py]"]
end

node_video_user(("Video submitter"))
node_bilibili["Bilibili"]
node_ollama["Ollama LLM"]

node_video_user -->|"submits URL"| node_pipeline
node_pipeline -->|"checks subtitles"| node_subtitle
node_bilibili -->|"provides captions"| node_subtitle
node_pipeline -->|"downloads audio"| node_audio
node_pipeline -->|"invokes fallback"| node_transcribe
node_transcribe -->|"selects backend"| node_asr_backends
node_pipeline -->|"uses transcript"| node_transcript_parse
node_pipeline -->|"extracts facts"| node_content_map
node_pipeline -->|"synthesizes profiles"| node_structure
node_structure -->|"uses fact map"| node_content_map
node_structure -->|"applies profiles"| node_profiles
node_pipeline -->|"writes notes"| node_writer
node_writer -->|"writes Markdown"| node_vault
node_vault -->|"loads documents"| node_vault_loader
node_vault_loader -->|"prepares chunks"| node_chunk_splitter
node_pipeline -->|"updates index"| node_indexer
node_indexer -->|"loads vault documents"| node_vault_loader
node_api -->|"serves queries"| node_query_engine
node_query_engine -->|"plans queries"| node_query_planner
node_query_engine -->|"rewrites queries"| node_query_rewriter
node_query_engine -->|"retrieves chunks"| node_indexer
node_query_engine -->|"reranks results"| node_reranker
node_api -->|"invokes answering"| node_agent
node_agent -->|"retrieves evidence"| node_query_engine
node_agent -->|"grounds claims"| node_claim_grounding
node_agent -->|"checks support"| node_claim_judge
node_agent -->|"applies safety gate"| node_medical_safety
node_agent -->|"records evidence"| node_evidence_audit
node_agent -->|"generates and judges"| node_ollama
node_pipeline -->|"reads settings"| node_config
node_api -->|"reads settings"| node_config

click node_pipeline "https://github.com/kuyi11/video-content-knowledge-base/blob/main/pipeline.py"
click node_subtitle "https://github.com/kuyi11/video-content-knowledge-base/blob/main/modules/subtitle.py"
click node_audio "https://github.com/kuyi11/video-content-knowledge-base/blob/main/modules/audio.py"
click node_transcribe "https://github.com/kuyi11/video-content-knowledge-base/blob/main/modules/transcribe.py"
click node_asr_backends "https://github.com/kuyi11/video-content-knowledge-base/tree/main/modules/asr"
click node_transcript_parse "https://github.com/kuyi11/video-content-knowledge-base/blob/main/modules/transcript_parser.py"
click node_content_map "https://github.com/kuyi11/video-content-knowledge-base/blob/main/modules/content_map.py"
click node_structure "https://github.com/kuyi11/video-content-knowledge-base/blob/main/modules/structure.py"
click node_profiles "https://github.com/kuyi11/video-content-knowledge-base/blob/main/modules/prompt_profiles.py"
click node_writer "https://github.com/kuyi11/video-content-knowledge-base/blob/main/modules/obsidian_writer.py"
click node_vault_loader "https://github.com/kuyi11/video-content-knowledge-base/blob/main/modules/vault_loader.py"
click node_chunk_splitter "https://github.com/kuyi11/video-content-knowledge-base/blob/main/modules/chunk_splitter.py"
click node_indexer "https://github.com/kuyi11/video-content-knowledge-base/blob/main/modules/indexer.py"
click node_query_planner "https://github.com/kuyi11/video-content-knowledge-base/blob/main/modules/query_planner.py"
click node_query_rewriter "https://github.com/kuyi11/video-content-knowledge-base/blob/main/modules/query_rewriter.py"
click node_reranker "https://github.com/kuyi11/video-content-knowledge-base/blob/main/modules/reranker.py"
click node_query_engine "https://github.com/kuyi11/video-content-knowledge-base/blob/main/modules/query_engine.py"
click node_agent "https://github.com/kuyi11/video-content-knowledge-base/blob/main/modules/agent.py"
click node_claim_grounding "https://github.com/kuyi11/video-content-knowledge-base/blob/main/modules/claim_grounding.py"
click node_claim_judge "https://github.com/kuyi11/video-content-knowledge-base/blob/main/modules/claim_judge.py"
click node_medical_safety "https://github.com/kuyi11/video-content-knowledge-base/blob/main/modules/medical_safety.py"
click node_evidence_audit "https://github.com/kuyi11/video-content-knowledge-base/blob/main/modules/evidence_audit.py"
click node_api "https://github.com/kuyi11/video-content-knowledge-base/blob/main/api.py"
click node_config "https://github.com/kuyi11/video-content-knowledge-base/blob/main/config.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_pipeline,node_subtitle,node_audio,node_transcribe,node_asr_backends,node_transcript_parse toneBlue
class node_content_map,node_structure,node_profiles,node_writer,node_vault toneAmber
class node_vault_loader,node_chunk_splitter,node_indexer,node_query_planner,node_query_rewriter,node_reranker,node_query_engine toneMint
class node_agent,node_claim_grounding,node_claim_judge,node_medical_safety,node_evidence_audit toneRose
class node_api,node_config,node_video_user,node_bilibili,node_ollama toneIndigo
```

## Components

### Video ingestion

- [Ingestion pipeline](https://github.com/kuyi11/video-content-knowledge-base/blob/main/pipeline.py): `pipeline.py`
- [Subtitle discovery](https://github.com/kuyi11/video-content-knowledge-base/blob/main/modules/subtitle.py): `modules/subtitle.py`
- [Audio download](https://github.com/kuyi11/video-content-knowledge-base/blob/main/modules/audio.py): `modules/audio.py`
- [ASR transcription](https://github.com/kuyi11/video-content-knowledge-base/blob/main/modules/transcribe.py): `modules/transcribe.py`
- [ASR backends](https://github.com/kuyi11/video-content-knowledge-base/tree/main/modules/asr): `modules/asr`
- [Transcript parsing](https://github.com/kuyi11/video-content-knowledge-base/blob/main/modules/transcript_parser.py): `modules/transcript_parser.py`

### Knowledge preparation

- [Fact-map extraction](https://github.com/kuyi11/video-content-knowledge-base/blob/main/modules/content_map.py): `modules/content_map.py`
- [Profile synthesis](https://github.com/kuyi11/video-content-knowledge-base/blob/main/modules/structure.py): `modules/structure.py`
- [Prompt profiles](https://github.com/kuyi11/video-content-knowledge-base/blob/main/modules/prompt_profiles.py): `modules/prompt_profiles.py`
- [Markdown writer](https://github.com/kuyi11/video-content-knowledge-base/blob/main/modules/obsidian_writer.py): `modules/obsidian_writer.py`
- **Knowledge vault**

### Search and retrieval

- [Vault loader](https://github.com/kuyi11/video-content-knowledge-base/blob/main/modules/vault_loader.py): `modules/vault_loader.py`
- [Chunking](https://github.com/kuyi11/video-content-knowledge-base/blob/main/modules/chunk_splitter.py): `modules/chunk_splitter.py`
- [Hybrid index](https://github.com/kuyi11/video-content-knowledge-base/blob/main/modules/indexer.py): `modules/indexer.py`
- [Query planning](https://github.com/kuyi11/video-content-knowledge-base/blob/main/modules/query_planner.py): `modules/query_planner.py`
- [Query rewriting](https://github.com/kuyi11/video-content-knowledge-base/blob/main/modules/query_rewriter.py): `modules/query_rewriter.py`
- [Result reranking](https://github.com/kuyi11/video-content-knowledge-base/blob/main/modules/reranker.py): `modules/reranker.py`
- [Query engine](https://github.com/kuyi11/video-content-knowledge-base/blob/main/modules/query_engine.py): `modules/query_engine.py`

### Evidence-grounded answers

- [Answering agent](https://github.com/kuyi11/video-content-knowledge-base/blob/main/modules/agent.py): `modules/agent.py`
- [Claim grounding](https://github.com/kuyi11/video-content-knowledge-base/blob/main/modules/claim_grounding.py): `modules/claim_grounding.py`
- [Semantic judge](https://github.com/kuyi11/video-content-knowledge-base/blob/main/modules/claim_judge.py): `modules/claim_judge.py`
- [Medical safety](https://github.com/kuyi11/video-content-knowledge-base/blob/main/modules/medical_safety.py): `modules/medical_safety.py`
- [Evidence audit](https://github.com/kuyi11/video-content-knowledge-base/blob/main/modules/evidence_audit.py): `modules/evidence_audit.py`

### API and persistence

- [FastAPI service](https://github.com/kuyi11/video-content-knowledge-base/blob/main/api.py): `api.py`
- [Runtime configuration](https://github.com/kuyi11/video-content-knowledge-base/blob/main/config.py): `config.py`

### Other components

- **Video submitter**
- **Bilibili**
- **Ollama LLM**

## Connections

- Video submitter → Ingestion pipeline: submits URL (evidence: `README.md`)
- Ingestion pipeline → Subtitle discovery: checks subtitles (evidence: `pipeline.py`)
- Bilibili → Subtitle discovery: provides captions (evidence: `README.md`)
- Ingestion pipeline → Audio download: downloads audio (evidence: `README.md`)
- Ingestion pipeline → ASR transcription: invokes fallback (evidence: `pipeline.py`)
- ASR transcription → ASR backends: selects backend (evidence: `modules/transcribe.py`)
- Ingestion pipeline → Transcript parsing: uses transcript (evidence: `pipeline.py`)
- Ingestion pipeline → Fact-map extraction: extracts facts (evidence: `pipeline.py`)
- Ingestion pipeline → Profile synthesis: synthesizes profiles (evidence: `pipeline.py`)
- Profile synthesis → Fact-map extraction: uses fact map (evidence: `modules/structure.py`)
- Profile synthesis → Prompt profiles: applies profiles (evidence: `modules/structure.py`)
- Ingestion pipeline → Markdown writer: writes notes (evidence: `README.md`)
- Markdown writer → Knowledge vault: writes Markdown (evidence: `README.md`)
- Knowledge vault → Vault loader: loads documents (evidence: `README.md`)
- Vault loader → Chunking: prepares chunks (evidence: `modules/chunk_splitter.py`)
- Ingestion pipeline → Hybrid index: updates index (evidence: `pipeline.py`)
- Hybrid index → Vault loader: loads vault documents (evidence: `modules/indexer.py`)
- FastAPI service → Query engine: serves queries (evidence: `api.py`)
- Query engine → Query planning: plans queries (evidence: `modules/query_engine.py`)
- Query engine → Query rewriting: rewrites queries (evidence: `modules/query_engine.py`)
- Query engine → Hybrid index: retrieves chunks (evidence: `modules/query_engine.py`)
- Query engine → Result reranking: reranks results (evidence: `modules/query_engine.py`)
- FastAPI service → Answering agent: invokes answering (evidence: `api.py`)
- Answering agent → Query engine: retrieves evidence (evidence: `modules/agent.py`)
- Answering agent → Claim grounding: grounds claims (evidence: `modules/agent.py`)
- Answering agent → Semantic judge: checks support (evidence: `modules/agent.py`)
- Answering agent → Medical safety: applies safety gate (evidence: `modules/agent.py`)
- Answering agent → Evidence audit: records evidence (evidence: `modules/agent.py`)
- Answering agent → Ollama LLM: generates and judges (evidence: `modules/agent.py`)
- Ingestion pipeline → Runtime configuration: reads settings (evidence: `pipeline.py`)
- FastAPI service → Runtime configuration: reads settings (evidence: `api.py`)
