├── .dockerignore ├── .env.example ├── .github └── workflows │ ├── cd.yml │ └── ci.yml ├── .gitignore ├── .pre-commit-config.yaml ├── .prefectignore ├── .python-version ├── .vscode └── settings.json ├── CHANGELOG.md ├── Dockerfile ├── INSTRUCTIONS.md ├── LICENSE ├── Makefile ├── README.md ├── cloudbuild_fastapi.yaml ├── deploy_fastapi.sh ├── frontend ├── __init__.py └── app.py ├── prefect-cloud.yaml ├── prefect-local.yaml ├── pyproject.toml ├── requirements.txt ├── src ├── __init__.py ├── api │ ├── __init__.py │ ├── exceptions │ │ ├── __init__.py │ │ └── exception_handlers.py │ ├── main.py │ ├── middleware │ │ ├── __init__.py │ │ └── logging_middleware.py │ ├── models │ │ ├── __init__.py │ │ ├── api_models.py │ │ └── provider_models.py │ ├── routes │ │ ├── __init__.py │ │ ├── health_routes.py │ │ └── search_routes.py │ └── services │ │ ├── __init__.py │ │ ├── generation_service.py │ │ ├── providers │ │ ├── __init__.py │ │ ├── huggingface_service.py │ │ ├── openai_service.py │ │ ├── openrouter_service.py │ │ └── utils │ │ │ ├── __init__.py │ │ │ ├── evaluation_metrics.py │ │ │ ├── messages.py │ │ │ └── prompts.py │ │ └── search_service.py ├── config.py ├── configs │ └── feeds_rss.yaml ├── infrastructure │ ├── __init__.py │ ├── qdrant │ │ ├── __init__.py │ │ ├── create_collection.py │ │ ├── create_indexes.py │ │ ├── delete_collection.py │ │ ├── ingest_from_sql.py │ │ └── qdrant_vectorstore.py │ └── supabase │ │ ├── __init__.py │ │ ├── create_db.py │ │ ├── delete_db.py │ │ └── init_session.py ├── models │ ├── __init__.py │ ├── article_models.py │ ├── sql_models.py │ └── vectorstore_models.py ├── pipelines │ ├── __init__.py │ ├── flows │ │ ├── __init__.py │ │ ├── embeddings_ingestion_flow.py │ │ └── rss_ingestion_flow.py │ └── tasks │ │ ├── __init__.py │ │ ├── fetch_rss.py │ │ ├── ingest_embeddings.py │ │ └── ingest_rss.py └── utils │ ├── __init__.py │ ├── logger_util.py │ └── text_splitter.py ├── static ├── app_diagram.png ├── gradio_app.png ├── react_app.png └── supabase_string.png ├── tests ├── conftest.py ├── integration │ ├── test_db_connection.py │ └── test_rss_pipeline.py ├── test_models │ └── test_sql_models.py └── unit │ ├── test_fastapi.py │ └── test_fetch_rss_entries.py └── uv.lock /.dockerignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/.dockerignore -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/.env.example -------------------------------------------------------------------------------- /.github/workflows/cd.yml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/.github/workflows/cd.yml -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/.github/workflows/ci.yml -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/.gitignore -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/.pre-commit-config.yaml -------------------------------------------------------------------------------- /.prefectignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/.prefectignore -------------------------------------------------------------------------------- /.python-version: -------------------------------------------------------------------------------- 1 | 3.12 2 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/.vscode/settings.json -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/CHANGELOG.md -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/Dockerfile -------------------------------------------------------------------------------- /INSTRUCTIONS.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/INSTRUCTIONS.md -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/LICENSE -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/Makefile -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/README.md -------------------------------------------------------------------------------- /cloudbuild_fastapi.yaml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/cloudbuild_fastapi.yaml -------------------------------------------------------------------------------- /deploy_fastapi.sh: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/deploy_fastapi.sh -------------------------------------------------------------------------------- /frontend/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /frontend/app.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/frontend/app.py -------------------------------------------------------------------------------- /prefect-cloud.yaml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/prefect-cloud.yaml -------------------------------------------------------------------------------- /prefect-local.yaml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/prefect-local.yaml -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/pyproject.toml -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/requirements.txt -------------------------------------------------------------------------------- /src/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/api/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/api/exceptions/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/api/exceptions/exception_handlers.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/src/api/exceptions/exception_handlers.py -------------------------------------------------------------------------------- /src/api/main.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/src/api/main.py -------------------------------------------------------------------------------- /src/api/middleware/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/api/middleware/logging_middleware.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/src/api/middleware/logging_middleware.py -------------------------------------------------------------------------------- /src/api/models/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/api/models/api_models.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/src/api/models/api_models.py -------------------------------------------------------------------------------- /src/api/models/provider_models.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/src/api/models/provider_models.py -------------------------------------------------------------------------------- /src/api/routes/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/api/routes/health_routes.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/src/api/routes/health_routes.py -------------------------------------------------------------------------------- /src/api/routes/search_routes.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/src/api/routes/search_routes.py -------------------------------------------------------------------------------- /src/api/services/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/api/services/generation_service.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/src/api/services/generation_service.py -------------------------------------------------------------------------------- /src/api/services/providers/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/api/services/providers/huggingface_service.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/src/api/services/providers/huggingface_service.py -------------------------------------------------------------------------------- /src/api/services/providers/openai_service.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/src/api/services/providers/openai_service.py -------------------------------------------------------------------------------- /src/api/services/providers/openrouter_service.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/src/api/services/providers/openrouter_service.py -------------------------------------------------------------------------------- /src/api/services/providers/utils/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/api/services/providers/utils/evaluation_metrics.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/src/api/services/providers/utils/evaluation_metrics.py -------------------------------------------------------------------------------- /src/api/services/providers/utils/messages.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/src/api/services/providers/utils/messages.py -------------------------------------------------------------------------------- /src/api/services/providers/utils/prompts.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/src/api/services/providers/utils/prompts.py -------------------------------------------------------------------------------- /src/api/services/search_service.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/src/api/services/search_service.py -------------------------------------------------------------------------------- /src/config.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/src/config.py -------------------------------------------------------------------------------- /src/configs/feeds_rss.yaml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/src/configs/feeds_rss.yaml -------------------------------------------------------------------------------- /src/infrastructure/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/infrastructure/qdrant/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/infrastructure/qdrant/create_collection.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/src/infrastructure/qdrant/create_collection.py -------------------------------------------------------------------------------- /src/infrastructure/qdrant/create_indexes.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/src/infrastructure/qdrant/create_indexes.py -------------------------------------------------------------------------------- /src/infrastructure/qdrant/delete_collection.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/src/infrastructure/qdrant/delete_collection.py -------------------------------------------------------------------------------- /src/infrastructure/qdrant/ingest_from_sql.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/src/infrastructure/qdrant/ingest_from_sql.py -------------------------------------------------------------------------------- /src/infrastructure/qdrant/qdrant_vectorstore.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/src/infrastructure/qdrant/qdrant_vectorstore.py -------------------------------------------------------------------------------- /src/infrastructure/supabase/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/infrastructure/supabase/create_db.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/src/infrastructure/supabase/create_db.py -------------------------------------------------------------------------------- /src/infrastructure/supabase/delete_db.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/src/infrastructure/supabase/delete_db.py -------------------------------------------------------------------------------- /src/infrastructure/supabase/init_session.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/src/infrastructure/supabase/init_session.py -------------------------------------------------------------------------------- /src/models/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/models/article_models.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/src/models/article_models.py -------------------------------------------------------------------------------- /src/models/sql_models.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/src/models/sql_models.py -------------------------------------------------------------------------------- /src/models/vectorstore_models.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/src/models/vectorstore_models.py -------------------------------------------------------------------------------- /src/pipelines/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/pipelines/flows/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/pipelines/flows/embeddings_ingestion_flow.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/src/pipelines/flows/embeddings_ingestion_flow.py -------------------------------------------------------------------------------- /src/pipelines/flows/rss_ingestion_flow.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/src/pipelines/flows/rss_ingestion_flow.py -------------------------------------------------------------------------------- /src/pipelines/tasks/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/pipelines/tasks/fetch_rss.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/src/pipelines/tasks/fetch_rss.py -------------------------------------------------------------------------------- /src/pipelines/tasks/ingest_embeddings.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/src/pipelines/tasks/ingest_embeddings.py -------------------------------------------------------------------------------- /src/pipelines/tasks/ingest_rss.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/src/pipelines/tasks/ingest_rss.py -------------------------------------------------------------------------------- /src/utils/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/utils/logger_util.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/src/utils/logger_util.py -------------------------------------------------------------------------------- /src/utils/text_splitter.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/src/utils/text_splitter.py -------------------------------------------------------------------------------- /static/app_diagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/static/app_diagram.png -------------------------------------------------------------------------------- /static/gradio_app.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/static/gradio_app.png -------------------------------------------------------------------------------- /static/react_app.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/static/react_app.png -------------------------------------------------------------------------------- /static/supabase_string.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/static/supabase_string.png -------------------------------------------------------------------------------- /tests/conftest.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/tests/conftest.py -------------------------------------------------------------------------------- /tests/integration/test_db_connection.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/tests/integration/test_db_connection.py -------------------------------------------------------------------------------- /tests/integration/test_rss_pipeline.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/tests/integration/test_rss_pipeline.py -------------------------------------------------------------------------------- /tests/test_models/test_sql_models.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/tests/test_models/test_sql_models.py -------------------------------------------------------------------------------- /tests/unit/test_fastapi.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/tests/unit/test_fastapi.py -------------------------------------------------------------------------------- /tests/unit/test_fetch_rss_entries.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/tests/unit/test_fetch_rss_entries.py -------------------------------------------------------------------------------- /uv.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benitomartin/substack-newsletters-search-course/HEAD/uv.lock --------------------------------------------------------------------------------