# kowshikkodumuri/video-agent architecture

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

- Interactive diagram: https://gitdiagram.com/kowshikkodumuri/video-agent
- Repository: https://github.com/kowshikkodumuri/video-agent

## Overview

Video-Agent turns a YouTube URL or local audio/video file into a meeting transcript, then generates a title, summary, action items, decisions, and open questions. Users can also ask transcript-grounded questions through a retrieval-augmented chat. The Streamlit app and CLI are separate entry points for this workflow. The sampled code shows the transcription, analysis, and retrieval calls; some UI and supporting modules are only partially represented in the excerpts.

Main entry points: [`app.py`](https://github.com/kowshikkodumuri/video-agent/blob/main/app.py) (Streamlit app), [`main.py`](https://github.com/kowshikkodumuri/video-agent/blob/main/main.py) (CLI pipeline), [`core/transcriber.py`](https://github.com/kowshikkodumuri/video-agent/blob/main/core/transcriber.py) (Transcription routing), [`core/rag_engine.py`](https://github.com/kowshikkodumuri/video-agent/blob/main/core/rag_engine.py) (Question answering)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_entry["User interfaces"]
  node_streamlit["Streamlit app<br/>[app.py]"]
  node_cli["CLI pipeline<br/>[main.py]"]
end

subgraph group_audio["Audio and transcription"]
  node_input["Input processing<br/>[audio_processor.py]"]
  node_youtube["YouTube audio download<br/>[audio_processor.py]"]
  node_audio_chunks["Audio conversion and chunks<br/>[audio_processor.py]"]
  node_transcriber["Transcription routing<br/>[transcriber.py]"]
  node_whisper["Whisper transcription<br/>[transcriber.py]"]
  node_sarvam["Sarvam transcription<br/>[transcriber.py]"]
end

subgraph group_analysis["Meeting analysis"]
  node_title["Title generation<br/>[summarize.py]"]
  node_summary["Transcript summary<br/>[summarize.py]"]
  node_extractor["Meeting findings<br/>[extractor.py]"]
end

subgraph group_chat["Transcript Q&amp;A"]
  node_rag["Question answering<br/>[rag_engine.py]"]
  node_vector_store["Vector indexing<br/>[vector_store.py]"]
  node_chroma[("Chroma store<br/>[vector_store.py]")]
  node_embeddings["Text embeddings<br/>[vector_store.py]"]
end

node_user(("User"))
node_mistral["Mistral model"]
node_youtube_service["YouTube"]
node_sarvam_service["Sarvam API"]

node_user -->|"submits source"| node_streamlit
node_user -->|"submits source"| node_cli
node_streamlit -->|"processes source"| node_input
node_cli -->|"processes source"| node_input
node_input -->|"downloads URL audio"| node_youtube
node_youtube -->|"fetches audio"| node_youtube_service
node_input -->|"converts and chunks"| node_audio_chunks
node_youtube -->|"provides audio"| node_audio_chunks
node_audio_chunks -->|"provides chunks"| node_transcriber
node_transcriber -->|"routes English"| node_whisper
node_transcriber -->|"routes Hinglish"| node_sarvam
node_sarvam -->|"sends audio pieces"| node_sarvam_service
node_transcriber -->|"returns transcript"| node_streamlit
node_transcriber -->|"returns transcript"| node_cli
node_streamlit -->|"generates title"| node_title
node_streamlit -->|"summarizes transcript"| node_summary
node_streamlit -->|"extracts findings"| node_extractor
node_cli -->|"generates title"| node_title
node_cli -->|"summarizes transcript"| node_summary
node_cli -->|"extracts findings"| node_extractor
node_title -->|"generates text"| node_mistral
node_summary -->|"generates text"| node_mistral
node_extractor -->|"generates text"| node_mistral
node_streamlit -->|"builds and queries"| node_rag
node_cli -->|"builds and queries"| node_rag
node_rag -->|"builds index"| node_vector_store
node_vector_store -->|"embeds chunks"| node_embeddings
node_vector_store -->|"writes chunks"| node_chroma
node_rag -->|"retrieves context"| node_chroma
node_rag -->|"answers question"| node_mistral
node_user -->|"asks question"| node_streamlit
node_user -->|"asks question"| node_cli

click node_streamlit "https://github.com/kowshikkodumuri/video-agent/blob/main/app.py"
click node_cli "https://github.com/kowshikkodumuri/video-agent/blob/main/main.py"
click node_input "https://github.com/kowshikkodumuri/video-agent/blob/main/utils/audio_processor.py"
click node_youtube "https://github.com/kowshikkodumuri/video-agent/blob/main/utils/audio_processor.py"
click node_audio_chunks "https://github.com/kowshikkodumuri/video-agent/blob/main/utils/audio_processor.py"
click node_transcriber "https://github.com/kowshikkodumuri/video-agent/blob/main/core/transcriber.py"
click node_whisper "https://github.com/kowshikkodumuri/video-agent/blob/main/core/transcriber.py"
click node_sarvam "https://github.com/kowshikkodumuri/video-agent/blob/main/core/transcriber.py"
click node_title "https://github.com/kowshikkodumuri/video-agent/blob/main/core/summarize.py"
click node_summary "https://github.com/kowshikkodumuri/video-agent/blob/main/core/summarize.py"
click node_extractor "https://github.com/kowshikkodumuri/video-agent/blob/main/core/extractor.py"
click node_rag "https://github.com/kowshikkodumuri/video-agent/blob/main/core/rag_engine.py"
click node_vector_store "https://github.com/kowshikkodumuri/video-agent/blob/main/core/vector_store.py"
click node_chroma "https://github.com/kowshikkodumuri/video-agent/blob/main/core/vector_store.py"
click node_embeddings "https://github.com/kowshikkodumuri/video-agent/blob/main/core/vector_store.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_streamlit,node_cli,node_user toneBlue
class node_input,node_youtube,node_audio_chunks,node_transcriber,node_whisper,node_sarvam toneAmber
class node_title,node_summary,node_extractor,node_sarvam_service toneMint
class node_rag,node_vector_store,node_chroma,node_embeddings toneRose
class node_mistral,node_youtube_service toneIndigo
```

## Components

### User interfaces

- [Streamlit app](https://github.com/kowshikkodumuri/video-agent/blob/main/app.py): `app.py`
- [CLI pipeline](https://github.com/kowshikkodumuri/video-agent/blob/main/main.py): `main.py`

### Audio and transcription

- [Input processing](https://github.com/kowshikkodumuri/video-agent/blob/main/utils/audio_processor.py): `utils/audio_processor.py`
- [YouTube audio download](https://github.com/kowshikkodumuri/video-agent/blob/main/utils/audio_processor.py): `utils/audio_processor.py`
- [Audio conversion and chunks](https://github.com/kowshikkodumuri/video-agent/blob/main/utils/audio_processor.py): `utils/audio_processor.py`
- [Transcription routing](https://github.com/kowshikkodumuri/video-agent/blob/main/core/transcriber.py): `core/transcriber.py`
- [Whisper transcription](https://github.com/kowshikkodumuri/video-agent/blob/main/core/transcriber.py): `core/transcriber.py`
- [Sarvam transcription](https://github.com/kowshikkodumuri/video-agent/blob/main/core/transcriber.py): `core/transcriber.py`

### Meeting analysis

- [Title generation](https://github.com/kowshikkodumuri/video-agent/blob/main/core/summarize.py): `core/summarize.py`
- [Transcript summary](https://github.com/kowshikkodumuri/video-agent/blob/main/core/summarize.py): `core/summarize.py`
- [Meeting findings](https://github.com/kowshikkodumuri/video-agent/blob/main/core/extractor.py): `core/extractor.py`

### Transcript Q&A

- [Question answering](https://github.com/kowshikkodumuri/video-agent/blob/main/core/rag_engine.py): `core/rag_engine.py`
- [Vector indexing](https://github.com/kowshikkodumuri/video-agent/blob/main/core/vector_store.py): `core/vector_store.py`
- [Chroma store](https://github.com/kowshikkodumuri/video-agent/blob/main/core/vector_store.py): `core/vector_store.py`
- [Text embeddings](https://github.com/kowshikkodumuri/video-agent/blob/main/core/vector_store.py): `core/vector_store.py`

### Other components

- **User**
- **Mistral model**
- **YouTube**
- **Sarvam API**

## Connections

- User → Streamlit app: submits source
- User → CLI pipeline: submits source
- Streamlit app → Input processing: processes source
- CLI pipeline → Input processing: processes source
- Input processing → YouTube audio download: downloads URL audio
- YouTube audio download → YouTube: fetches audio
- Input processing → Audio conversion and chunks: converts and chunks
- YouTube audio download → Audio conversion and chunks: provides audio
- Audio conversion and chunks → Transcription routing: provides chunks
- Transcription routing → Whisper transcription: routes English
- Transcription routing → Sarvam transcription: routes Hinglish
- Sarvam transcription → Sarvam API: sends audio pieces
- Transcription routing → Streamlit app: returns transcript
- Transcription routing → CLI pipeline: returns transcript
- Streamlit app → Title generation: generates title
- Streamlit app → Transcript summary: summarizes transcript
- Streamlit app → Meeting findings: extracts findings
- CLI pipeline → Title generation: generates title
- CLI pipeline → Transcript summary: summarizes transcript
- CLI pipeline → Meeting findings: extracts findings
- Title generation → Mistral model: generates text
- Transcript summary → Mistral model: generates text
- Meeting findings → Mistral model: generates text
- Streamlit app → Question answering: builds and queries
- CLI pipeline → Question answering: builds and queries
- Question answering → Vector indexing: builds index
- Vector indexing → Text embeddings: embeds chunks
- Vector indexing → Chroma store: writes chunks
- Question answering → Chroma store: retrieves context
- Question answering → Mistral model: answers question
- User → Streamlit app: asks question
- User → CLI pipeline: asks question
