TIMES OF TECH

Orchestrating RAG pipelines with Apache Airflow – Open Data Science

Editor’s note: Kenten Danas is a speaker for ODSC AI West this October 28th-30th. Be sure to check out her talk, Orchestrating Workflows for GenAI Applications with Apache Airflow, there!

Productionizing GenAI applications often relies on multi-stage, complex pipelines that manage data ingestion, creation of vector embeddings, vector storage, querying, and response construction. Apache Airflow, a leading open-source orchestration framework, provides the structure and flexibility required to implement complex GenAI workflows with relatively basic Python code.

In this tutorial, you’ll learn how to use Airflow to orchestrate a basic RAG pipeline that includes embedding book descriptions with the OpenAI API, ingesting the embeddings into a PostgreSQL database with pgvector installed, and querying the database for books that match a user-provided mood. To learn about a more advanced implementation of this topic, join my workshop at ODSC West where I’ll cover:

  • More on Airflow and orchestration basics
  • Writing GenAI pipelines in Airflow, including how to use the Airflow AI SDK for interacting with LLMs
  • Airflow features for running GenAI pipelines in production that optimize reliability and performance

In-person conference | October 28th-30th, 2025 | San Francisco, CA

Over 100 workshops and trainings will help you:

✅ Identify high-impact AI opportunities for your organization
✅ Build AI-ready teams, tools, and infrastructure
✅ Scale AI projects with governance and measurable ROI
✅ Learn directly from companies applying AI at scale

 

Why use Airflow for GenAI Applications?

The pipelines that help power GenAI applications need to run reliably, scale efficiently, and recover from failure without manual intervention. When using Airflow for orchestration, actions in your AI pipelines become aware of each other, and you have a central location to monitor, edit, and troubleshoot all your workflows, from the ETL/ELT pipelines that provide data for your models, to RAG, to prompt engineering, to fine tuning. 

Airflow provides many benefits for GenAI workflows, including:

  • Reliable task execution: APIs of AI models often come with transient errors and rate limits. Airflow can automatically retry individual tasks, send notifications in case of issues and handle timeouts.
  • Tool agnosticism: Airflow can connect to any application in your data ecosystem that allows connections through an API. This means you are never locked into one model vendor and can quickly switch individual tasks to the latest and best model and AI tooling. Prebuilt provider packages exist to connect to many common data tools. You can find a comprehensive catalogue of provider packages in the Astronomer registry.
  • High extensibility: Since Airflow pipelines are written in Python, you can build on top of the existing codebase and extend the functionality of Airflow to meet your needs. Almost anything you can do in Python, you can do in Airflow.Infin
  • ite scalability: Given enough computing power, you can orchestrate as many processes as you need, no matter the complexity of your pipelines.
  • Observability: The Airflow UI provides an immediate overview of all your data pipelines and can provide the source of truth for workflows in your whole data ecosystem. 

Prerequisites

This tutorial requires the following tools:

  • The Astro CLI. This is a free tool provided by Astronomer used to run Airflow locally. If you have a different way you are already running Airflow, you can use that as well.
  • An OpenAI API key of at least tier 1 if you want to use OpenAI for vectorization. If you do not want to use OpenAI, you can adapt the create_embeddings function at the start of the DAG to use a different vectorizer.

This tutorial uses a local PostgreSQL database created as a Docker container. The image comes with pgvector preinstalled.

Step 1: Configure your Astro project

1. Create a new Astro project:

$ mkdir astro-pgvector-tutorial && cd astro-pgvector-tutorial
$ astro dev init

2. Add the following two packages to your requirements.txt file to install the pgvector Airflow provider and the OpenAI Python client in your Astro project:

apache-airflow-providers-pgvector==1.0.0
openai==1.3.2

3. This tutorial uses a local PostgreSQL database running in a Docker container. To add a second PostgreSQL container to your Astro project, create a new file in your project’s root directory called docker-compose.override.yml and add the following. The ankane/pgvector image builds a PostgreSQL database with pgvector preinstalled.

services:
  postgres_pgvector:
    image: ankane/pgvector
    volumes:
      - ${PWD}/include/postgres:/var/lib/postgresql/data
      - ${PWD}/include:/include
    networks:
      - airflow
    ports:
      - 5433:5432
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
# Airflow containers
  scheduler:
    networks:
      - airflow
  api-server:
    networks:
      - airflow
  triggerer:
    networks:
      - airflow
  postgres:
    networks:
      - airflow

4. To create an Airflow connection to the PostgreSQL database, add the following to your .env file. If you are using the OpenAI API for embeddings you will need to update the OPENAI_API_KEY environment variable.

AIRFLOW_CONN_POSTGRES_DEFAULT='{
    "conn_type": "postgres",
    "login": "postgres",
    "password": "postgres",
    "host": "host.docker.internal",
    "port": 5433,
    "schema": "postgres"
}'
OPENAI_API_KEY=""

Step 2: Add your data

The dag in this tutorial runs a query on vectorized book descriptions from Goodreads, but you can adjust the dag to use any data you want.

1. Create a new file called book_data.txt in the include directory.

2. Copy the book description from the book_data.txt file in Astronomer’s GitHub for a list of great books.

Note: If you want to add your own books make sure the data is in the following format:

 integer> ::: </span> <span style="font-weight: 400;">(<year> <span style="font-weight: 400;">of</span> <span style="font-weight: 400;">publication>)</span> <span style="font-weight: 400;">:::</span> <span style="font-weight: 400;"><author/></span> <span style="font-weight: 400;">:::</span> <span style="font-weight: 400;"><description/></span></year></span></index></span></pre>
<p><span style="font-weight: 400;">One book corresponds to one line in the file.</span></p>
<div class="vc_row wpb_row vc_row-fluid dashed">
<div class="wpb_column vc_column_container vc_col-sm-12">
<div class="vc_column-inner">
<div class="wpb_wrapper">
<div class="aio-icon-component    style_1">
<div id="Info-box-wrap-4333" class="aio-icon-box default-icon" style=""> <!-- header --></p>
<div class="aio-icon-description ult-responsive" data-ultimate-target="#Info-box-wrap-4333 .aio-icon-description" data-responsive-json-new="{"font-size":"","line-height":""}" style="">
<h4 id='in-person-conference-|-october-28th-30th-2025-|-san-francisco-ca-1'  id="boomdevs_6" style="text-align: center;">In-person conference | <strong>October 28th-30th, 2025 | San Francisco, CA</strong></h4>
<p style="text-align: center;"><a href="https://opendatascience.com/wp-content/uploads/2024/03/Week-of-July-21-2025-Blog-Banners_468x60_.png" target="_blank" rel="noopener"><img decoding="async" class="aligncenter wp-image-51525 size-full lazyload" src="https://opendatascience.com/wp-content/uploads/2024/03/Week-of-August-18-Blog-Banners_468x60-2.png" alt="" width="468" height="60"/><img decoding="async" class="aligncenter wp-image-51525 size-full lazyload" src="https://opendatascience.com/wp-content/uploads/2024/03/Week-of-August-18-Blog-Banners_468x60-2.png" alt="" width="468" height="60" srcset="https://opendatascience.com/wp-content/uploads/2024/03/Week-of-August-18-Blog-Banners_468x60-2.png 468w, https://opendatascience.com/wp-content/uploads/2024/03/Week-of-August-18-Blog-Banners_468x60-2-300x38.png 300w" sizes="(max-width: 468px) 100vw, 468px"/></a></p>
<p style="text-align: center;">ODSC West is back—bringing together the brightest minds in AI to deliver cutting-edge insights. Train with experts in:</p>
<p style="text-align: center;">LLMs & GenAI | Agentic AI & MLOps | Machine Learning & Deep Learning | NLP | Robotics | and More</p>
</div>
<p> <!-- description --></div>
<p> <!-- aio-icon-box --></div>
<p> <!-- aio-icon-component --></div>
</div>
</div>
</div>
<p> <!-- AddThis Advanced Settings above via filter on the_content --><!-- AddThis Advanced Settings below via filter on the_content --><!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons above via filter on the_content --><!-- AddThis Share Buttons below via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content --></p>
<p> </p>
<h2 id='step-3-create-your-dag'  id="boomdevs_7"><span style="font-weight: 400;">Step 3: Create your DAG</span></h2>
<p><span style="font-weight: 400;">1. In your </span><span style="font-weight: 400;">dags</span><span style="font-weight: 400;"> folder, create a file called </span><span style="font-weight: 400;">query_book_vectors.py</span><span style="font-weight: 400;">.</span></p>
<p><span style="font-weight: 400;">2. Copy the following code into the file. If you want to use a vectorizer other than OpenAI, make sure to adjust both the </span><span style="font-weight: 400;">create_embeddings</span><span style="font-weight: 400;"> function at the start of the DAG and provide the correct </span><span style="font-weight: 400;">MODEL_VECTOR_LENGTH</span><span style="font-weight: 400;">.</span></p>
<pre><span style="font-weight: 400;">"""</span>
<span style="font-weight: 400;">## Vectorize book descriptions with OpenAI and store them in Postgres with pgvector</span>
<span style="font-weight: 400;">This DAG shows how to use the OpenAI API 1.0+ to vectorize book descriptions and </span>
<span style="font-weight: 400;">store them in Postgres with the pgvector extension.</span>
<span style="font-weight: 400;">It will also help you pick your next book to read based on a mood you describe.</span>
<span style="font-weight: 400;">You will need to set the following environment variables:</span>
<span style="font-weight: 400;">- `AIRFLOW_CONN_POSTGRES_DEFAULT`: an Airflow connection to your Postgres database</span>
<span style="font-weight: 400;">    that has pgvector installed</span>
<span style="font-weight: 400;">- `OPENAI_API_KEY`: your OpenAI API key</span>
<span style="font-weight: 400;">"""</span>
<span style="font-weight: 400;">from</span> <span style="font-weight: 400;">airflow.sdk</span> <span style="font-weight: 400;">import</span> <span style="font-weight: 400;">dag,</span> <span style="font-weight: 400;">task</span>
<span style="font-weight: 400;">from</span> <span style="font-weight: 400;">airflow.models.baseoperator</span> <span style="font-weight: 400;">import</span> <span style="font-weight: 400;">chain</span>
<span style="font-weight: 400;">from</span> <span style="font-weight: 400;">airflow.models.param</span> <span style="font-weight: 400;">import</span> <span style="font-weight: 400;">Param</span>
<span style="font-weight: 400;">from</span> <span style="font-weight: 400;">airflow.providers.pgvector.operators.pgvector</span> <span style="font-weight: 400;">import</span> <span style="font-weight: 400;">PgVectorIngestOperator</span>
<span style="font-weight: 400;">from</span> <span style="font-weight: 400;">airflow.providers.postgres.operators.postgres</span> <span style="font-weight: 400;">import</span> <span style="font-weight: 400;">PostgresOperator</span>
<span style="font-weight: 400;">from</span> <span style="font-weight: 400;">airflow.exceptions</span> <span style="font-weight: 400;">import</span> <span style="font-weight: 400;">AirflowSkipException</span>
<span style="font-weight: 400;">from</span> <span style="font-weight: 400;">pendulum</span> <span style="font-weight: 400;">import</span> <span style="font-weight: 400;">datetime</span>
<span style="font-weight: 400;">from</span> <span style="font-weight: 400;">openai</span> <span style="font-weight: 400;">import</span> <span style="font-weight: 400;">OpenAI</span>
<span style="font-weight: 400;">import</span> <span style="font-weight: 400;">uuid</span>
<span style="font-weight: 400;">import</span> <span style="font-weight: 400;">re</span>
<span style="font-weight: 400;">import</span> <span style="font-weight: 400;">os</span>
<span style="font-weight: 400;">POSTGRES_CONN_ID</span> <span style="font-weight: 400;">=</span> <span style="font-weight: 400;">"postgres_default"</span>
<span style="font-weight: 400;">TEXT_FILE_PATH</span> <span style="font-weight: 400;">=</span> <span style="font-weight: 400;">"include/book_data.txt"</span>
<span style="font-weight: 400;">TABLE_NAME</span> <span style="font-weight: 400;">=</span> <span style="font-weight: 400;">"Book"</span>
<span style="font-weight: 400;">OPENAI_MODEL</span> <span style="font-weight: 400;">=</span> <span style="font-weight: 400;">"text-embedding-ada-002"</span>
<span style="font-weight: 400;">MODEL_VECTOR_LENGTH</span> <span style="font-weight: 400;">=</span> <span style="font-weight: 400;">1536</span>
<span style="font-weight: 400;">def</span> <span style="font-weight: 400;">create_embeddings(text:</span> <span style="font-weight: 400;">str</span><span style="font-weight: 400;">,</span> <span style="font-weight: 400;">model:</span> <span style="font-weight: 400;">str</span><span style="font-weight: 400;">):</span>
<span style="font-weight: 400;">    </span><span style="font-weight: 400;">"""Create embeddings for a text with the OpenAI API."""</span>
<span style="font-weight: 400;">    </span><span style="font-weight: 400;">client</span> <span style="font-weight: 400;">=</span> <span style="font-weight: 400;">OpenAI(api_key=os.environ[</span><span style="font-weight: 400;">"OPENAI_API_KEY"</span><span style="font-weight: 400;">])</span>
<span style="font-weight: 400;">    </span><span style="font-weight: 400;">response</span> <span style="font-weight: 400;">=</span> <span style="font-weight: 400;">client.embeddings.create(</span><span style="font-weight: 400;">input</span><span style="font-weight: 400;">=text,</span> <span style="font-weight: 400;">model=model)</span>
<span style="font-weight: 400;">    </span><span style="font-weight: 400;">embeddings</span> <span style="font-weight: 400;">=</span> <span style="font-weight: 400;">response.data[</span><span style="font-weight: 400;">0</span><span style="font-weight: 400;">].embedding</span>
<span style="font-weight: 400;">    </span><span style="font-weight: 400;">return</span> <span style="font-weight: 400;">embeddings</span>
<span style="font-weight: 400;">@dag(</span>
<span style="font-weight: 400;">    </span><span style="font-weight: 400;">start_date=datetime(</span><span style="font-weight: 400;">2025</span><span style="font-weight: 400;">,</span> <span style="font-weight: 400;">8</span><span style="font-weight: 400;">,</span> <span style="font-weight: 400;">1</span><span style="font-weight: 400;">),</span>
<span style="font-weight: 400;">    </span><span style="font-weight: 400;">schedule=</span><span style="font-weight: 400;">None</span><span style="font-weight: 400;">,</span>
<span style="font-weight: 400;">    </span><span style="font-weight: 400;">tags=[</span><span style="font-weight: 400;">"pgvector"</span><span style="font-weight: 400;">],</span>
<span style="font-weight: 400;">    </span><span style="font-weight: 400;">params={</span>
<span style="font-weight: 400;">        </span><span style="font-weight: 400;">"book_mood"</span><span style="font-weight: 400;">:</span> <span style="font-weight: 400;">Param(</span>
<span style="font-weight: 400;">            </span><span style="font-weight: 400;">"A philosophical book about consciousness."</span><span style="font-weight: 400;">,</span>
<span style="font-weight: 400;">            </span><span style="font-weight: 400;">type</span><span style="font-weight: 400;">=</span><span style="font-weight: 400;">"string"</span><span style="font-weight: 400;">,</span>
<span style="font-weight: 400;">            </span><span style="font-weight: 400;">description=</span><span style="font-weight: 400;">"Describe the kind of book you want to read."</span><span style="font-weight: 400;">,</span>
<span style="font-weight: 400;">        </span><span style="font-weight: 400;">),</span>
<span style="font-weight: 400;">    </span><span style="font-weight: 400;">},</span>
<span style="font-weight: 400;">)</span>
<span style="font-weight: 400;">def</span> <span style="font-weight: 400;">query_book_vectors():</span>
<span style="font-weight: 400;">    </span><span style="font-weight: 400;">enable_vector_extension_if_not_exists</span> <span style="font-weight: 400;">=</span> <span style="font-weight: 400;">PostgresOperator(</span>
<span style="font-weight: 400;">        </span><span style="font-weight: 400;">task_id=</span><span style="font-weight: 400;">"enable_vector_extension_if_not_exists"</span><span style="font-weight: 400;">,</span>
<span style="font-weight: 400;">        </span><span style="font-weight: 400;">postgres_conn_id=POSTGRES_CONN_ID,</span>
<span style="font-weight: 400;">        </span><span style="font-weight: 400;">sql=</span><span style="font-weight: 400;">"CREATE EXTENSION IF NOT EXISTS vector;"</span><span style="font-weight: 400;">,</span>
<span style="font-weight: 400;">    </span><span style="font-weight: 400;">)</span>
<span style="font-weight: 400;">    </span><span style="font-weight: 400;">create_table_if_not_exists</span> <span style="font-weight: 400;">=</span> <span style="font-weight: 400;">PostgresOperator(</span>
<span style="font-weight: 400;">        </span><span style="font-weight: 400;">task_id=</span><span style="font-weight: 400;">"create_table_if_not_exists"</span><span style="font-weight: 400;">,</span>
<span style="font-weight: 400;">        </span><span style="font-weight: 400;">postgres_conn_id=POSTGRES_CONN_ID,</span>
<span style="font-weight: 400;">        </span><span style="font-weight: 400;">sql=</span><span style="font-weight: 400;">f"""</span>
<span style="font-weight: 400;">        CREATE TABLE IF NOT EXISTS {TABLE_NAME} (         </span>
<span style="font-weight: 400;">            book_id UUID PRIMARY KEY,</span>
<span style="font-weight: 400;">            title TEXT,</span>
<span style="font-weight: 400;">            year INTEGER,</span>
<span style="font-weight: 400;">            author TEXT,</span>
<span style="font-weight: 400;">            description TEXT,</span>
<span style="font-weight: 400;">            vector VECTOR(%(vector_length)s)</span>
<span style="font-weight: 400;">        );</span>
<span style="font-weight: 400;">        """</span><span style="font-weight: 400;">,</span>
<span style="font-weight: 400;">        </span><span style="font-weight: 400;">parameters={</span><span style="font-weight: 400;">"vector_length"</span><span style="font-weight: 400;">:</span> <span style="font-weight: 400;">MODEL_VECTOR_LENGTH},</span>
<span style="font-weight: 400;">    </span><span style="font-weight: 400;">)</span>
<span style="font-weight: 400;">    </span><span style="font-weight: 400;">get_already_imported_book_ids</span> <span style="font-weight: 400;">=</span> <span style="font-weight: 400;">PostgresOperator(</span>
<span style="font-weight: 400;">        </span><span style="font-weight: 400;">task_id=</span><span style="font-weight: 400;">"get_already_imported_book_ids"</span><span style="font-weight: 400;">,</span>
<span style="font-weight: 400;">        </span><span style="font-weight: 400;">postgres_conn_id=POSTGRES_CONN_ID,</span>
<span style="font-weight: 400;">        </span><span style="font-weight: 400;">sql=</span><span style="font-weight: 400;">f"""</span>
<span style="font-weight: 400;">        SELECT book_id</span>
<span style="font-weight: 400;">        FROM {TABLE_NAME};</span>
<span style="font-weight: 400;">        """</span><span style="font-weight: 400;">,</span>
<span style="font-weight: 400;">    </span><span style="font-weight: 400;">)</span>
<span style="font-weight: 400;">    </span><span style="font-weight: 400;">@task</span>
<span style="font-weight: 400;">    </span><span style="font-weight: 400;">def</span> <span style="font-weight: 400;">import_book_data(text_file_path:</span> <span style="font-weight: 400;">str</span><span style="font-weight: 400;">,</span> <span style="font-weight: 400;">table_name:</span> <span style="font-weight: 400;">str</span><span style="font-weight: 400;">)</span> <span style="font-weight: 400;">-></span> <span style="font-weight: 400;">list</span><span style="font-weight: 400;">:</span>
<span style="font-weight: 400;">        </span><span style="font-weight: 400;">"Read the text file and create a list of dicts from the book information."</span>
<span style="font-weight: 400;">        </span><span style="font-weight: 400;">with</span> <span style="font-weight: 400;">open</span><span style="font-weight: 400;">(text_file_path,</span> <span style="font-weight: 400;">"r"</span><span style="font-weight: 400;">)</span> <span style="font-weight: 400;">as</span> <span style="font-weight: 400;">f:</span>
<span style="font-weight: 400;">            </span><span style="font-weight: 400;">lines</span> <span style="font-weight: 400;">=</span> <span style="font-weight: 400;">f.readlines()</span>
<span style="font-weight: 400;">            </span><span style="font-weight: 400;">num_skipped_lines</span> <span style="font-weight: 400;">=</span> <span style="font-weight: 400;">0</span>
<span style="font-weight: 400;">            </span><span style="font-weight: 400;">list_of_params</span> <span style="font-weight: 400;">=</span> <span style="font-weight: 400;">[]</span>
<span style="font-weight: 400;">            </span><span style="font-weight: 400;">for</span> <span style="font-weight: 400;">line</span> <span style="font-weight: 400;">in</span> <span style="font-weight: 400;">lines:</span>
<span style="font-weight: 400;">                </span><span style="font-weight: 400;">parts</span> <span style="font-weight: 400;">=</span> <span style="font-weight: 400;">line.split(</span><span style="font-weight: 400;">":::"</span><span style="font-weight: 400;">)</span>
<span style="font-weight: 400;">                </span><span style="font-weight: 400;">title_year</span> <span style="font-weight: 400;">=</span> <span style="font-weight: 400;">parts[</span><span style="font-weight: 400;">1</span><span style="font-weight: 400;">].strip()</span>
<span style="font-weight: 400;">                </span><span style="font-weight: 400;">match</span> <span style="font-weight: 400;">=</span> <span style="font-weight: 400;">re.match(r</span><span style="font-weight: 400;">"</span><span style="font-weight: 400;">(.+)</span> <img loading="lazy" loading="lazy" decoding="async" src="https://opendatascience.com/wp-content/ql-cache/quicklatex.com-8bc072ac78f0a99722814ca8ddb96a15_l3.png" class="ql-img-inline-formula quicklatex-auto-format lazyload" alt="(\d{4})" title="Rendered by QuickLaTeX.com" height="19" width="21" style="vertical-align: -5px;"/><img loading="lazy" loading="lazy" decoding="async" src="https://opendatascience.com/wp-content/ql-cache/quicklatex.com-8bc072ac78f0a99722814ca8ddb96a15_l3.png" class="ql-img-inline-formula quicklatex-auto-format lazyload" alt="(\d{4})" title="Rendered by QuickLaTeX.com" height="19" width="21" style="vertical-align: -5px;"/>", title_year)
<span style="font-weight: 400;">                try:</span>
<span style="font-weight: 400;">                    title, year = match.groups()</span>
<span style="font-weight: 400;">                    year = int(year)</span>
<span style="font-weight: 400;">                # skip malformed lines</span>
<span style="font-weight: 400;">                except:</span>
<span style="font-weight: 400;">                    num_skipped_lines += 1</span>
<span style="font-weight: 400;">                    continue</span>
<span style="font-weight: 400;">                author = parts[2].strip()</span>
<span style="font-weight: 400;">                description = parts[3].strip()</span>
<span style="font-weight: 400;">                list_of_params.append(</span>
<span style="font-weight: 400;">                    {</span>
<span style="font-weight: 400;">                        "</span><span style="font-weight: 400;">book_id</span><span style="font-weight: 400;">"</span><span style="font-weight: 400;">:</span> <span style="font-weight: 400;">str</span><span style="font-weight: 400;">(</span>
<span style="font-weight: 400;">                            </span><span style="font-weight: 400;">uuid.uuid5(</span>
<span style="font-weight: 400;">                                </span><span style="font-weight: 400;">name=</span><span style="font-weight: 400;">" "</span><span style="font-weight: 400;">.join([title,</span> <span style="font-weight: 400;">str</span><span style="font-weight: 400;">(year),</span> <span style="font-weight: 400;">author,</span> <span style="font-weight: 400;">description]),</span>
<span style="font-weight: 400;">                                </span><span style="font-weight: 400;">namespace=uuid.NAMESPACE_DNS,</span>
<span style="font-weight: 400;">                            </span><span style="font-weight: 400;">)</span>
<span style="font-weight: 400;">                        </span><span style="font-weight: 400;">),</span>
<span style="font-weight: 400;">                        </span><span style="font-weight: 400;">"title"</span><span style="font-weight: 400;">:</span> <span style="font-weight: 400;">title,</span>
<span style="font-weight: 400;">                        </span><span style="font-weight: 400;">"year"</span><span style="font-weight: 400;">:</span> <span style="font-weight: 400;">year,</span>
<span style="font-weight: 400;">                        </span><span style="font-weight: 400;">"author"</span><span style="font-weight: 400;">:</span> <span style="font-weight: 400;">author,</span>
<span style="font-weight: 400;">                        </span><span style="font-weight: 400;">"description"</span><span style="font-weight: 400;">:</span> <span style="font-weight: 400;">description,</span>
<span style="font-weight: 400;">                    </span><span style="font-weight: 400;">}</span>
<span style="font-weight: 400;">                </span><span style="font-weight: 400;">)</span>
<span style="font-weight: 400;">            </span><span style="font-weight: 400;">print</span><span style="font-weight: 400;">(</span>
<span style="font-weight: 400;">                </span><span style="font-weight: 400;">f"Created a list with {len(list_of_params)} elements "</span>
<span style="font-weight: 400;">                </span><span style="font-weight: 400;">" while skipping {num_skipped_lines} lines."</span>
<span style="font-weight: 400;">            </span><span style="font-weight: 400;">)</span>
<span style="font-weight: 400;">            </span><span style="font-weight: 400;">return</span> <span style="font-weight: 400;">list_of_params</span>
<span style="font-weight: 400;">    </span><span style="font-weight: 400;">@task</span>
<span style="font-weight: 400;">    </span><span style="font-weight: 400;">def</span> <span style="font-weight: 400;">create_embeddings_book_data(</span>
<span style="font-weight: 400;">        </span><span style="font-weight: 400;">book_data:</span> <span style="font-weight: 400;">dict</span><span style="font-weight: 400;">,</span> <span style="font-weight: 400;">model:</span> <span style="font-weight: 400;">str</span><span style="font-weight: 400;">,</span> <span style="font-weight: 400;">already_imported_books:</span> <span style="font-weight: 400;">list</span>
<span style="font-weight: 400;">    </span><span style="font-weight: 400;">)</span> <span style="font-weight: 400;">-></span> <span style="font-weight: 400;">dict</span><span style="font-weight: 400;">:</span>
<span style="font-weight: 400;">        </span><span style="font-weight: 400;">"Create embeddings for a book description and add them to the book data."</span>
<span style="font-weight: 400;">        </span><span style="font-weight: 400;">already_imported_books_ids</span> <span style="font-weight: 400;">=</span> <span style="font-weight: 400;">[x[</span><span style="font-weight: 400;">0</span><span style="font-weight: 400;">]</span> <span style="font-weight: 400;">for</span> <span style="font-weight: 400;">x</span> <span style="font-weight: 400;">in</span> <span style="font-weight: 400;">already_imported_books]</span>
<span style="font-weight: 400;">        </span><span style="font-weight: 400;">if</span> <span style="font-weight: 400;">book_data[</span><span style="font-weight: 400;">"book_id"</span><span style="font-weight: 400;">]</span> <span style="font-weight: 400;">in</span> <span style="font-weight: 400;">already_imported_books_ids:</span>
<span style="font-weight: 400;">            </span><span style="font-weight: 400;">raise</span> <span style="font-weight: 400;">AirflowSkipException(</span><span style="font-weight: 400;">"Book already imported."</span><span style="font-weight: 400;">)</span>
<span style="font-weight: 400;">        </span><span style="font-weight: 400;">embeddings</span> <span style="font-weight: 400;">=</span> <span style="font-weight: 400;">create_embeddings(text=book_data[</span><span style="font-weight: 400;">"description"</span><span style="font-weight: 400;">],</span> <span style="font-weight: 400;">model=model)</span>
<span style="font-weight: 400;">        </span><span style="font-weight: 400;">book_data[</span><span style="font-weight: 400;">"vector"</span><span style="font-weight: 400;">]</span> <span style="font-weight: 400;">=</span> <span style="font-weight: 400;">embeddings</span>
<span style="font-weight: 400;">        </span><span style="font-weight: 400;">return</span> <span style="font-weight: 400;">book_data</span>
<span style="font-weight: 400;">    </span><span style="font-weight: 400;">@task</span>
<span style="font-weight: 400;">    </span><span style="font-weight: 400;">def</span> <span style="font-weight: 400;">create_embeddings_query(model:</span> <span style="font-weight: 400;">str</span><span style="font-weight: 400;">,</span> <span style="font-weight: 400;">**context)</span> <span style="font-weight: 400;">-></span> <span style="font-weight: 400;">list</span><span style="font-weight: 400;">:</span>
<span style="font-weight: 400;">        </span><span style="font-weight: 400;">"Create embeddings for the user provided book mood."</span>
<span style="font-weight: 400;">        </span><span style="font-weight: 400;">query</span> <span style="font-weight: 400;">=</span> <span style="font-weight: 400;">context[</span><span style="font-weight: 400;">"params"</span><span style="font-weight: 400;">][</span><span style="font-weight: 400;">"book_mood"</span><span style="font-weight: 400;">]</span>
<span style="font-weight: 400;">        </span><span style="font-weight: 400;">embeddings</span> <span style="font-weight: 400;">=</span> <span style="font-weight: 400;">create_embeddings(text=query,</span> <span style="font-weight: 400;">model=model)</span>
<span style="font-weight: 400;">        </span><span style="font-weight: 400;">return</span> <span style="font-weight: 400;">embeddings</span>
<span style="font-weight: 400;">    </span><span style="font-weight: 400;">book_data</span> <span style="font-weight: 400;">=</span> <span style="font-weight: 400;">import_book_data(text_file_path=TEXT_FILE_PATH,</span> <span style="font-weight: 400;">table_name=TABLE_NAME)</span>
<span style="font-weight: 400;">    </span><span style="font-weight: 400;">book_embeddings</span> <span style="font-weight: 400;">=</span> <span style="font-weight: 400;">create_embeddings_book_data.partial(</span>
<span style="font-weight: 400;">        </span><span style="font-weight: 400;">model=OPENAI_MODEL,</span>
<span style="font-weight: 400;">        </span><span style="font-weight: 400;">already_imported_books=get_already_imported_book_ids.output,</span>
<span style="font-weight: 400;">    </span><span style="font-weight: 400;">).expand(book_data=book_data)</span>
<span style="font-weight: 400;">    </span><span style="font-weight: 400;">query_vector</span> <span style="font-weight: 400;">=</span> <span style="font-weight: 400;">create_embeddings_query(model=OPENAI_MODEL)</span>
<span style="font-weight: 400;">    </span><span style="font-weight: 400;">import_embeddings_to_pgvector</span> <span style="font-weight: 400;">=</span> <span style="font-weight: 400;">PgVectorIngestOperator.partial(</span>
<span style="font-weight: 400;">        </span><span style="font-weight: 400;">task_id=</span><span style="font-weight: 400;">"import_embeddings_to_pgvector"</span><span style="font-weight: 400;">,</span>
<span style="font-weight: 400;">        </span><span style="font-weight: 400;">trigger_rule=</span><span style="font-weight: 400;">"none_failed"</span><span style="font-weight: 400;">,</span>
<span style="font-weight: 400;">        </span><span style="font-weight: 400;">conn_id=POSTGRES_CONN_ID,</span>
<span style="font-weight: 400;">        </span><span style="font-weight: 400;">sql=(</span>
<span style="font-weight: 400;">            </span><span style="font-weight: 400;">f"INSERT INTO {TABLE_NAME} "</span>
<span style="font-weight: 400;">            </span><span style="font-weight: 400;">"(book_id, title, year, author, description, vector) "</span>
<span style="font-weight: 400;">            </span><span style="font-weight: 400;">"VALUES (%(book_id)s, %(title)s, %(year)s, "</span>
<span style="font-weight: 400;">            </span><span style="font-weight: 400;">"%(author)s, %(description)s, %(vector)s) "</span>
<span style="font-weight: 400;">            </span><span style="font-weight: 400;">"ON CONFLICT (book_id) DO NOTHING;"</span>
<span style="font-weight: 400;">        </span><span style="font-weight: 400;">),</span>
<span style="font-weight: 400;">    </span><span style="font-weight: 400;">).expand(parameters=book_embeddings)</span>
<span style="font-weight: 400;">    </span><span style="font-weight: 400;">get_a_book_suggestion</span> <span style="font-weight: 400;">=</span> <span style="font-weight: 400;">PostgresOperator(</span>
<span style="font-weight: 400;">        </span><span style="font-weight: 400;">task_id=</span><span style="font-weight: 400;">"get_a_book_suggestion"</span><span style="font-weight: 400;">,</span>
<span style="font-weight: 400;">        </span><span style="font-weight: 400;">postgres_conn_id=POSTGRES_CONN_ID,</span>
<span style="font-weight: 400;">        </span><span style="font-weight: 400;">trigger_rule=</span><span style="font-weight: 400;">"none_failed"</span><span style="font-weight: 400;">,</span>
<span style="font-weight: 400;">        </span><span style="font-weight: 400;">sql=</span><span style="font-weight: 400;">f"""</span>
<span style="font-weight: 400;">            SELECT title, year, author, description</span>
<span style="font-weight: 400;">            FROM {TABLE_NAME}</span>
<span style="font-weight: 400;">            ORDER BY vector <-> CAST(%(query_vector)s AS VECTOR)</span>
<span style="font-weight: 400;">            LIMIT 1;</span>
<span style="font-weight: 400;">        """</span><span style="font-weight: 400;">,</span>
<span style="font-weight: 400;">        </span><span style="font-weight: 400;">parameters={</span><span style="font-weight: 400;">"query_vector"</span><span style="font-weight: 400;">:</span> <span style="font-weight: 400;">query_vector},</span>
<span style="font-weight: 400;">    </span><span style="font-weight: 400;">)</span>
<span style="font-weight: 400;">    </span><span style="font-weight: 400;">@task</span>
<span style="font-weight: 400;">    </span><span style="font-weight: 400;">def</span> <span style="font-weight: 400;">print_suggestion(query_result,</span> <span style="font-weight: 400;">**context):</span>
<span style="font-weight: 400;">        </span><span style="font-weight: 400;">"Print the book suggestion."</span>
<span style="font-weight: 400;">        </span><span style="font-weight: 400;">query</span> <span style="font-weight: 400;">=</span> <span style="font-weight: 400;">context[</span><span style="font-weight: 400;">"params"</span><span style="font-weight: 400;">][</span><span style="font-weight: 400;">"book_mood"</span><span style="font-weight: 400;">]</span>
<span style="font-weight: 400;">        </span><span style="font-weight: 400;">book_title</span> <span style="font-weight: 400;">=</span> <span style="font-weight: 400;">query_result[</span><span style="font-weight: 400;">0</span><span style="font-weight: 400;">][</span><span style="font-weight: 400;">0</span><span style="font-weight: 400;">]</span>
<span style="font-weight: 400;">        </span><span style="font-weight: 400;">book_year</span> <span style="font-weight: 400;">=</span> <span style="font-weight: 400;">query_result[</span><span style="font-weight: 400;">0</span><span style="font-weight: 400;">][</span><span style="font-weight: 400;">1</span><span style="font-weight: 400;">]</span>
<span style="font-weight: 400;">        </span><span style="font-weight: 400;">book_author</span> <span style="font-weight: 400;">=</span> <span style="font-weight: 400;">query_result[</span><span style="font-weight: 400;">0</span><span style="font-weight: 400;">][</span><span style="font-weight: 400;">2</span><span style="font-weight: 400;">]</span>
<span style="font-weight: 400;">        </span><span style="font-weight: 400;">book_description</span> <span style="font-weight: 400;">=</span> <span style="font-weight: 400;">query_result[</span><span style="font-weight: 400;">0</span><span style="font-weight: 400;">][</span><span style="font-weight: 400;">3</span><span style="font-weight: 400;">]</span>
<span style="font-weight: 400;">        </span><span style="font-weight: 400;">print</span><span style="font-weight: 400;">(</span><span style="font-weight: 400;">f"Book suggestion for '{query}':"</span><span style="font-weight: 400;">)</span>
<span style="font-weight: 400;">        </span><span style="font-weight: 400;">print</span><span style="font-weight: 400;">(</span>
<span style="font-weight: 400;">            </span><span style="font-weight: 400;">f"You should read {book_title} by {book_author}, published in {book_year}!"</span>
<span style="font-weight: 400;">        </span><span style="font-weight: 400;">)</span>
<span style="font-weight: 400;">        </span><span style="font-weight: 400;">print</span><span style="font-weight: 400;">(</span><span style="font-weight: 400;">f"Goodreads describes the book as: {book_description}"</span><span style="font-weight: 400;">)</span>
<span style="font-weight: 400;">    </span><span style="font-weight: 400;">chain(</span>
<span style="font-weight: 400;">        </span><span style="font-weight: 400;">enable_vector_extension_if_not_exists,</span>
<span style="font-weight: 400;">        </span><span style="font-weight: 400;">create_table_if_not_exists,</span>
<span style="font-weight: 400;">        </span><span style="font-weight: 400;">get_already_imported_book_ids,</span>
<span style="font-weight: 400;">        </span><span style="font-weight: 400;">import_embeddings_to_pgvector,</span>
<span style="font-weight: 400;">        </span><span style="font-weight: 400;">get_a_book_suggestion,</span>
<span style="font-weight: 400;">        </span><span style="font-weight: 400;">print_suggestion(query_result=get_a_book_suggestion.output),</span>
<span style="font-weight: 400;">    </span><span style="font-weight: 400;">)</span>
<span style="font-weight: 400;">    </span><span style="font-weight: 400;">chain(query_vector,</span> <span style="font-weight: 400;">get_a_book_suggestion)</span>
<span style="font-weight: 400;">    </span><span style="font-weight: 400;">chain(get_already_imported_book_ids,</span> <span style="font-weight: 400;">book_embeddings)</span>
<span style="font-weight: 400;">query_book_vectors()</span></pre>
<p><span style="font-weight: 400;">This DAG consists of nine tasks to make a simple RAG orchestration pipeline.</span></p>
<p><span style="font-weight: 400;">– The </span><span style="font-weight: 400;">enable_vector_extension_if_not_exists</span><span style="font-weight: 400;"> task uses a </span><a href="https://registry.astronomer.io/providers/apache-airflow-providers-postgres/versions/latest/modules/PostgresOperator" target="_blank" rel="noopener"><span style="font-weight: 400;">PostgresOperator</span></a><span style="font-weight: 400;"> to enable the pgvector extension in the PostgreSQL database.</span></p>
<p><span style="font-weight: 400;">– The </span><span style="font-weight: 400;">create_table_if_not_exists</span><span style="font-weight: 400;"> task creates the </span><span style="font-weight: 400;">Book</span><span style="font-weight: 400;"> table in PostgreSQL. Note the </span><span style="font-weight: 400;">VECTOR()</span><span style="font-weight: 400;"> datatype used for the </span><span style="font-weight: 400;">vector</span><span style="font-weight: 400;"> column. This datatype is added to PostgreSQL by the pgvector extension and needs to be defined with the vector length of the vectorizer you use as an argument. This example uses the OpenAI’s </span><span style="font-weight: 400;">text-embedding-ada-002</span><span style="font-weight: 400;"> to create 1536-dimensional vectors, so we define the columns with the type </span><span style="font-weight: 400;">VECTOR(1536)</span><span style="font-weight: 400;"> using parameterized SQL.</span></p>
<p><span style="font-weight: 400;">– The </span><span style="font-weight: 400;">get_already_imported_book_ids</span><span style="font-weight: 400;"> task queries the </span><span style="font-weight: 400;">Book</span><span style="font-weight: 400;"> table to return all </span><span style="font-weight: 400;">book_id</span><span style="font-weight: 400;"> values of books that were already stored with their vectors in previous DAG runs.</span></p>
<p><span style="font-weight: 400;">– The </span><span style="font-weight: 400;">import_book_data</span><span style="font-weight: 400;"> task uses the </span><a href="http://airflow-decorators"><span style="font-weight: 400;">@task</span><span style="font-weight: 400;"> decorator</span></a><span style="font-weight: 400;"> to read the book data from the </span><span style="font-weight: 400;">book_data.txt</span><span style="font-weight: 400;"> file and return it as a list of dictionaries with keys corresponding to the columns of the </span><span style="font-weight: 400;">Book</span><span style="font-weight: 400;"> table.</span></p>
<p><span style="font-weight: 400;">– The </span><span style="font-weight: 400;">create_embeddings_book_data</span><span style="font-weight: 400;"> task is </span><a href="http://dynamic-tasks"><span style="font-weight: 400;">dynamically mapped</span></a><span style="font-weight: 400;"> over the list of dictionaries returned by the </span><span style="font-weight: 400;">import_book_data</span><span style="font-weight: 400;"> task to parallelize vector embedding of all book descriptions that have not been added to the </span><span style="font-weight: 400;">Book</span><span style="font-weight: 400;"> table in previous DAG runs. The </span><span style="font-weight: 400;">create_embeddings</span><span style="font-weight: 400;"> function defines how the embeddings are computed and can be modified to use other embedding models. If all books in the list have already been added to the </span><span style="font-weight: 400;">Book</span><span style="font-weight: 400;"> table, then all mapped task instances are skipped.</span></p>
<p><span style="font-weight: 400;">– The </span><span style="font-weight: 400;">create_embeddings_query</span><span style="font-weight: 400;"> task applies the same </span><span style="font-weight: 400;">create_embeddings</span><span style="font-weight: 400;"> function to the desired book mood the user provided via </span><a href="http://airflow-params"><span style="font-weight: 400;">Airflow params</span></a><span style="font-weight: 400;">.</span></p>
<p><span style="font-weight: 400;">– The </span><span style="font-weight: 400;">import_embeddings_to_pgvector</span><span style="font-weight: 400;"> task uses the </span><a href="https://registry.astronomer.io/providers/apache-airflow-providers-pgvector/versions/latest/modules/PgVectorIngestOperator" target="_blank" rel="noopener"><span style="font-weight: 400;">PgVectorIngestOperator</span></a><span style="font-weight: 400;"> to insert the book data including the embedding vectors into the PostgreSQL database. This task is dynamically mapped to import the embeddings from one book at a time. The dynamically mapped task instances of books that have already been imported in previous DAG runs are skipped.</span></p>
<p><span style="font-weight: 400;">– The </span><span style="font-weight: 400;">get_a_book_suggestion</span><span style="font-weight: 400;"> task queries the PostgreSQL database for the book that is most similar to the user-provided mood using nearest neighbor search. Note how the vector of the user-provided book mood (</span><span style="font-weight: 400;">query_vector</span><span style="font-weight: 400;">) is cast to the </span><span style="font-weight: 400;">VECTOR</span><span style="font-weight: 400;"> datatype before similarity search: </span><span style="font-weight: 400;">ORDER BY vector <-> CAST(%(query_vector)s AS VECTOR)</span><span style="font-weight: 400;">.</span></p>
<p><span style="font-weight: 400;">– The </span><span style="font-weight: 400;">print_book_suggestion</span><span style="font-weight: 400;"> task prints the book suggestion to the task logs.</span></p>
<p><span style="font-weight: 400;">Your dag should look like this in the Airflow UI:</span></p>
<p><a href="https://opendatascience.com/wp-content/uploads/2025/08/odsc_west_blog_post_dag_graph.png" target="_blank" rel="noopener"><img loading="lazy" loading="lazy" decoding="async" class="aligncenter size-large wp-image-51620 lazyload" src="https://opendatascience.com/wp-content/uploads/2025/08/odsc_west_blog_post_dag_graph-1024x142.png" alt="" width="680" height="94"/><img loading="lazy" loading="lazy" decoding="async" class="aligncenter size-large wp-image-51620 lazyload" src="https://opendatascience.com/wp-content/uploads/2025/08/odsc_west_blog_post_dag_graph-1024x142.png" alt="" width="680" height="94" srcset="https://opendatascience.com/wp-content/uploads/2025/08/odsc_west_blog_post_dag_graph-1024x142.png 1024w, https://opendatascience.com/wp-content/uploads/2025/08/odsc_west_blog_post_dag_graph-300x41.png 300w, https://opendatascience.com/wp-content/uploads/2025/08/odsc_west_blog_post_dag_graph-768x106.png 768w, https://opendatascience.com/wp-content/uploads/2025/08/odsc_west_blog_post_dag_graph-810x112.png 810w, https://opendatascience.com/wp-content/uploads/2025/08/odsc_west_blog_post_dag_graph.png 1534w" sizes="(max-width: 680px) 100vw, 680px"/></a></p>
<h2 id='step-4-run-your-dag'  id="boomdevs_8"><span style="font-weight: 400;">Step 4: Run your DAG</span></h2>
<p><span style="font-weight: 400;">1. Run </span><span style="font-weight: 400;">astro dev start</span><span style="font-weight: 400;"> in your Astro project to start Airflow and open the Airflow UI at </span><span style="font-weight: 400;">localhost:8080</span><span style="font-weight: 400;">.</span></p>
<p><span style="font-weight: 400;">2. In the Airflow UI, run the </span><span style="font-weight: 400;">query_book_vectors</span><span style="font-weight: 400;"> DAG by clicking the Trigger button. Then, provide the </span><a href="http://airflow-params"><span style="font-weight: 400;">Airflow param</span></a><span style="font-weight: 400;"> for the desired </span><span style="font-weight: 400;">book_mood</span><span style="font-weight: 400;">.</span></p>
<p><a href="https://opendatascience.com/wp-content/uploads/2025/08/odsc_west_blog_post_trigger_dag.png" target="_blank" rel="noopener"><img loading="lazy" loading="lazy" decoding="async" class="aligncenter size-large wp-image-51621 lazyload" src="https://opendatascience.com/wp-content/uploads/2025/08/odsc_west_blog_post_trigger_dag-1024x548.png" alt="" width="680" height="364"/><img loading="lazy" loading="lazy" decoding="async" class="aligncenter size-large wp-image-51621 lazyload" src="https://opendatascience.com/wp-content/uploads/2025/08/odsc_west_blog_post_trigger_dag-1024x548.png" alt="" width="680" height="364" srcset="https://opendatascience.com/wp-content/uploads/2025/08/odsc_west_blog_post_trigger_dag-1024x548.png 1024w, https://opendatascience.com/wp-content/uploads/2025/08/odsc_west_blog_post_trigger_dag-300x161.png 300w, https://opendatascience.com/wp-content/uploads/2025/08/odsc_west_blog_post_trigger_dag-768x411.png 768w, https://opendatascience.com/wp-content/uploads/2025/08/odsc_west_blog_post_trigger_dag-1536x822.png 1536w, https://opendatascience.com/wp-content/uploads/2025/08/odsc_west_blog_post_trigger_dag-810x434.png 810w, https://opendatascience.com/wp-content/uploads/2025/08/odsc_west_blog_post_trigger_dag.png 1804w" sizes="(max-width: 680px) 100vw, 680px"/></a></p>
<p><span style="font-weight: 400;">3. View your book suggestion in the task logs of the </span><span style="font-weight: 400;">print_book_suggestion</span><span style="font-weight: 400;"> task:</span></p>
<pre><span style="font-weight: 400;">[2025-08-27,</span> <span style="font-weight: 400;">09:45:54]</span> <span style="font-weight: 400;">INFO</span> <span style="font-weight: 400;">-</span> <span style="font-weight: 400;">Book</span> <span style="font-weight: 400;">suggestion</span> <span style="font-weight: 400;">for</span> <span style="font-weight: 400;">'A</span> <span style="font-weight: 400;">philosophical</span> <span style="font-weight: 400;">book</span> <span style="font-weight: 400;">about</span> <span style="font-weight: 400;">consciousness.'::</span> <span style="font-weight: 400;">chan="stdout":</span> <span style="font-weight: 400;">source="task"</span>
<span style="font-weight: 400;">[2025-08-27,</span> <span style="font-weight: 400;">09:45:54]</span> <span style="font-weight: 400;">INFO</span> <span style="font-weight: 400;">-</span> <span style="font-weight: 400;">You</span> <span style="font-weight: 400;">should</span> <span style="font-weight: 400;">read</span> <span style="font-weight: 400;">The</span> <span style="font-weight: 400;">Idea</span> <span style="font-weight: 400;">of</span> <span style="font-weight: 400;">the</span> <span style="font-weight: 400;">World</span> <span style="font-weight: 400;">by</span> <span style="font-weight: 400;">Bernardo</span> <span style="font-weight: 400;">Kastrup,</span> <span style="font-weight: 400;">published</span> <span style="font-weight: 400;">in</span> <span style="font-weight: 400;">2019!:</span> <span style="font-weight: 400;">chan="stdout":</span> <span style="font-weight: 400;">source="task"</span>
<span style="font-weight: 400;">[2025-08-27,</span> <span style="font-weight: 400;">09:45:54]</span> <span style="font-weight: 400;">INFO</span> <span style="font-weight: 400;">-</span> <span style="font-weight: 400;">Goodreads</span> <span style="font-weight: 400;">describes</span> <span style="font-weight: 400;">the</span> <span style="font-weight: 400;">book</span> <span style="font-weight: 400;">as:</span> <span style="font-weight: 400;">A</span> <span style="font-weight: 400;">rigorous</span> <span style="font-weight: 400;">case</span> <span style="font-weight: 400;">for</span> <span style="font-weight: 400;">the</span> <span style="font-weight: 400;">primacy</span> <span style="font-weight: 400;">of</span> <span style="font-weight: 400;">mind</span> <span style="font-weight: 400;">in</span> <span style="font-weight: 400;">nature,</span> <span style="font-weight: 400;">from</span> <span style="font-weight: 400;">philosophy</span> <span style="font-weight: 400;">to</span> <span style="font-weight: 400;">neuroscience,</span> <span style="font-weight: 400;">psychology</span> <span style="font-weight: 400;">and</span> <span style="font-weight: 400;">physics.</span> <span style="font-weight: 400;">The</span> <span style="font-weight: 400;">Idea</span> <span style="font-weight: 400;">of</span> <span style="font-weight: 400;">the</span> <span style="font-weight: 400;">World</span> <span style="font-weight: 400;">offers</span> <span style="font-weight: 400;">a</span> <span style="font-weight: 400;">grounded</span> <span style="font-weight: 400;">alternative</span> <span style="font-weight: 400;">to</span> <span style="font-weight: 400;">the</span> <span style="font-weight: 400;">frenzy</span> <span style="font-weight: 400;">of</span> <span style="font-weight: 400;">unrestrained</span> <span style="font-weight: 400;">abstractions</span> <span style="font-weight: 400;">and</span> <span style="font-weight: 400;">unexamined</span> <span style="font-weight: 400;">assumptions</span> <span style="font-weight: 400;">in</span> <span style="font-weight: 400;">philosophy</span> <span style="font-weight: 400;">and</span> <span style="font-weight: 400;">science</span> <span style="font-weight: 400;">today.</span> <span style="font-weight: 400;">[...]</span></pre>
<h2 id='conclusion'  id="boomdevs_9"><span style="font-weight: 400;">Conclusion</span></h2>
<p><span style="font-weight: 400;">Congratulations, in this tutorial you used Apache Airflow to orchestrate a simple RAG pipeline! Airflow can be used for any GenAI workflow orchestration, including batch inference jobs, multi-agent workflows, and more. To learn more about the tools and patterns needed to deploy and maintain AI systems at scale using Airflow, join my workshop at ODSC West; I hope to see you there!</span></p>
<div class="vc_row wpb_row vc_row-fluid dashed">
<div class="wpb_column vc_column_container vc_col-sm-12">
<div class="vc_column-inner">
<div class="wpb_wrapper">
<div class="aio-icon-component    style_1">
<div id="Info-box-wrap-2051" class="aio-icon-box default-icon" style=""> <!-- header --></p>
<div class="aio-icon-description ult-responsive" data-ultimate-target="#Info-box-wrap-2051 .aio-icon-description" data-responsive-json-new="{"font-size":"","line-height":""}" style="">
<h4 id='in-person-conference-|-october-28th-30th-2025-|-san-francisco-ca-2'  id="boomdevs_10" style="text-align: left;">In-person conference | <strong>October 28th-30th, 2025 | San Francisco, CA</strong></h4>
<p style="text-align: left;"><span style="font-weight: 400;"><a href="https://www.eventbrite.com/e/odsc-ai-west-2025-conference-open-data-science-conference-tickets-1216835771549?discount=odscblog" target="_blank" rel="noopener"><img fetchpriority="high" fetchpriority="high" decoding="async" class="alignleft wp-image-51524 size-full lazyload" src="https://opendatascience.com/wp-content/uploads/2023/07/Week-of-August-18-Blog-Banners-300x250-1.png" alt="" width="300" height="250"/><img fetchpriority="high" fetchpriority="high" decoding="async" class="alignleft wp-image-51524 size-full lazyload" src="https://opendatascience.com/wp-content/uploads/2023/07/Week-of-August-18-Blog-Banners-300x250-1.png" alt="" width="300" height="250"/></a>Over 100 workshops and trainings will help you:</span></p>
<p style="text-align: left;"><span style="font-weight: 400;">✅ Identify high-impact AI opportunities for your organization</span><span style="font-weight: 400;"><br /></span><span style="font-weight: 400;">✅ Build AI-ready teams, tools, and infrastructure</span><span style="font-weight: 400;"><br /></span><span style="font-weight: 400;">✅ Scale AI projects with governance and measurable ROI</span><span style="font-weight: 400;"><br /></span><span style="font-weight: 400;">✅ Learn directly from companies applying AI at scale</span></p>
</div>
<p> <!-- description --></div>
<p> <!-- aio-icon-box --></div>
<p> <!-- aio-icon-component --></div>
</div>
</div>
</div>
<p> <!-- AddThis Advanced Settings above via filter on the_content --><!-- AddThis Advanced Settings below via filter on the_content --><!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons above via filter on the_content --><!-- AddThis Share Buttons below via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content --></p>
<p> </p>
<p><b>Author bio:</b></p>
<p><span style="font-weight: 400;"><img decoding="async" class="alignleft lazyload" src="https://odsc.ai/wp-content/uploads/2025/07/Kenten-Danas-Speakers-Headshots_WEST2025-1.png"/><img decoding="async" class="alignleft lazyload" src="https://odsc.ai/wp-content/uploads/2025/07/Kenten-Danas-Speakers-Headshots_WEST2025-1.png"/>Kenten leads the Developer Relations team at Astronomer and has a background in field engineering, data engineering, and consulting. She has first-hand experience adopting and running Airflow as a consultant, and is passionate about helping other data engineers scale and get the most out of their Airflow experience. When she isn’t working with data she’s typically outside trail running or skiing.</span></p>
<p><b>LinkedIn: </b><span style="font-weight: 400;">https://www.linkedin.com/in/kentendanas/</span></p>
<p><b>Astronomer website: </b><span style="font-weight: 400;">https://www.astronomer.io/</span></p>
</div>
<p><script type="text/javascript"> !function(f,b,e,v,n,t,s){if(f.fbq)return;n=f.fbq=function(){n.callMethod?
n.callMethod.apply(n,arguments):n.queue.push(arguments)};if(!f._fbq)f._fbq=n;
n.push=n;n.loaded=!0;n.version='2.0';n.queue=[];t=b.createElement(e);t.async=!0;
t.src=v;s=b.getElementsByTagName(e)[0];s.parentNode.insertBefore(t,s)}(window,
document,'script','https://connect.facebook.net/en_US/fbevents.js?v=next'); </script><br />
<br /><a href="https://opendatascience.com/orchestrating-rag-pipelines-with-apache-airflow/" target="_blank" rel="noopener">Source link </a></p>
<p>For more info visit at  <a href="https://www.times-of-tech.com/">Times Of Tech </a></p>

<div id='jp-relatedposts' class='jp-relatedposts' >
	<h3 class="jp-relatedposts-headline"><em>Related</em></h3>
</div>				</div>
				</div>
				<div class="elementor-element elementor-element-6f4a770 elementor-author-box--link-yes elementor-author-box--layout-image-left elementor-author-box--align-left elementor-author-box--avatar-yes elementor-author-box--name-yes elementor-author-box--biography-yes elementor-widget elementor-widget-author-box" data-id="6f4a770" data-element_type="widget" data-widget_type="author-box.default">
				<div class="elementor-widget-container">
							<div class="elementor-author-box">
							<div  class="elementor-author-box__avatar">
					<img src="https://secure.gravatar.com/avatar/9e23cb5075f658dfb1a809153ab9ef73aef93c4c77f3c4c276a9ca0abe5223db?s=300&d=mm&r=g" alt="Picture of mohsin" loading="lazy">
				</div>
			
			<div class="elementor-author-box__text">
									<div >
						<h4 class="elementor-author-box__name">
							mohsin						</h4>
					</div>
				
									<div class="elementor-author-box__bio">
						I am an author and tech enthusiast deeply passionate about AI, Data Science, and cutting-edge technologies. With expertise in Python, machine learning, and automation, he is dedicated to simplifying complex concepts, helping readers navigate and excel in the dynamic world of artificial intelligence and data science.					</div>
				
									<a class="elementor-author-box__button elementor-button elementor-size-xs" href="https://www.times-of-tech.com/author/mohsin/">
						See All Posts					</a>
							</div>
		</div>
						</div>
				</div>
		<div data-particle_enable="false" data-particle-mobile-disabled="false" class="elementor-element elementor-element-c3f85f4 e-con-full e-flex wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no e-con e-child" data-id="c3f85f4" data-element_type="container">
		<div data-particle_enable="false" data-particle-mobile-disabled="false" class="elementor-element elementor-element-ca1d960 e-con-full e-flex wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no e-con e-child" data-id="ca1d960" data-element_type="container">
				<div class="elementor-element elementor-element-678798d elementor-widget elementor-widget-heading" data-id="678798d" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h2 class="elementor-heading-title elementor-size-default">Share this post on </h2>				</div>
				</div>
				</div>
		<div data-particle_enable="false" data-particle-mobile-disabled="false" class="elementor-element elementor-element-0ec33b4 e-con-full e-flex wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no e-con e-child" data-id="0ec33b4" data-element_type="container">
				<div class="elementor-element elementor-element-3f58c8a elementor-share-buttons--skin-flat elementor-share-buttons--shape-rounded elementor-grid-3 elementor-share-buttons--view-icon-text elementor-share-buttons--color-official elementor-widget elementor-widget-share-buttons" data-id="3f58c8a" data-element_type="widget" data-widget_type="share-buttons.default">
				<div class="elementor-widget-container">
							<div class="elementor-grid" role="list">
								<div class="elementor-grid-item" role="listitem">
						<div class="elementor-share-btn elementor-share-btn_facebook" role="button" tabindex="0" aria-label="Share on facebook">
															<span class="elementor-share-btn__icon">
								<svg class="e-font-icon-svg e-fab-facebook" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg"><path d="M504 256C504 119 393 8 256 8S8 119 8 256c0 123.78 90.69 226.38 209.25 245V327.69h-63V256h63v-54.64c0-62.15 37-96.48 93.67-96.48 27.14 0 55.52 4.84 55.52 4.84v61h-31.28c-30.8 0-40.41 19.12-40.41 38.73V256h68.78l-11 71.69h-57.78V501C413.31 482.38 504 379.78 504 256z"></path></svg>							</span>
																						<div class="elementor-share-btn__text">
																			<span class="elementor-share-btn__title">
										Facebook									</span>
																	</div>
													</div>
					</div>
									<div class="elementor-grid-item" role="listitem">
						<div class="elementor-share-btn elementor-share-btn_twitter" role="button" tabindex="0" aria-label="Share on twitter">
															<span class="elementor-share-btn__icon">
								<svg class="e-font-icon-svg e-fab-twitter" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg"><path d="M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"></path></svg>							</span>
																						<div class="elementor-share-btn__text">
																			<span class="elementor-share-btn__title">
										Twitter									</span>
																	</div>
													</div>
					</div>
									<div class="elementor-grid-item" role="listitem">
						<div class="elementor-share-btn elementor-share-btn_linkedin" role="button" tabindex="0" aria-label="Share on linkedin">
															<span class="elementor-share-btn__icon">
								<svg class="e-font-icon-svg e-fab-linkedin" viewBox="0 0 448 512" xmlns="http://www.w3.org/2000/svg"><path d="M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3zM135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5zm282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9V416z"></path></svg>							</span>
																						<div class="elementor-share-btn__text">
																			<span class="elementor-share-btn__title">
										LinkedIn									</span>
																	</div>
													</div>
					</div>
						</div>
						</div>
				</div>
				</div>
				</div>
				<div class="elementor-element elementor-element-1534c4b elementor-widget elementor-widget-post-comments" data-id="1534c4b" data-element_type="widget" data-widget_type="post-comments.theme_comments">
				<div class="elementor-widget-container">
					
<div id="comments" class="comments-area">
    
    	<div id="respond" class="comment-respond">
		<h2 id="reply-title" class="comment-reply-title">Leave a Reply <small><a rel="nofollow" id="cancel-comment-reply-link" href="/orchestrating-rag-pipelines-with-apache-airflow-open-data-science/#respond" style="display:none;">Cancel reply</a></small></h2><form action="https://www.times-of-tech.com/wp-comments-post.php" method="post" id="commentform" class="comment-form"><p class="comment-notes"><span id="email-notes">Your email address will not be published.</span> <span class="required-field-message">Required fields are marked <span class="required">*</span></span></p><p class="comment-form-comment"><label for="comment">Comment <span class="required">*</span></label> <textarea id="comment" name="comment" cols="45" rows="8" maxlength="65525" required></textarea></p><p class="comment-form-email"><label for="email">Email <span class="required">*</span></label> <input id="email" name="email" type="email" value="" size="30" maxlength="100" aria-describedby="email-notes" autocomplete="email" required /><span class="gravatar-enhanced-profile"><img src="" alt="Gravatar profile" /></span></p>
<p class="comment-form-author"><label for="author">Name <span class="required">*</span></label> <input id="author" name="author" type="text" value="" size="30" maxlength="245" autocomplete="name" required /></p>
<p class="comment-form-url"><label for="url">Website</label> <input id="url" name="url" type="url" value="" size="30" maxlength="200" autocomplete="url" /></p>
<p class="comment-form-cookies-consent"><input id="wp-comment-cookies-consent" name="wp-comment-cookies-consent" type="checkbox" value="yes" /> <label for="wp-comment-cookies-consent">Save my name, email, and website in this browser for the next time I comment.</label></p>
<p class="form-submit"><input name="submit" type="submit" id="submit" class="submit" value="Post Comment" /> <input type='hidden' name='comment_post_ID' value='31336' id='comment_post_ID' />
<input type='hidden' name='comment_parent' id='comment_parent' value='0' />
</p></form>	</div><!-- #respond -->
	</div>				</div>
				</div>
				</div>
		<div data-particle_enable="false" data-particle-mobile-disabled="false" class="elementor-element elementor-element-4f4a5a3d e-con-full e-flex wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no e-con e-child" data-id="4f4a5a3d" data-element_type="container">
				</div>
					</div>
				</div>
		<div data-particle_enable="false" data-particle-mobile-disabled="false" class="elementor-element elementor-element-64dc732c e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no e-con e-parent" data-id="64dc732c" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-bdb88f3 elementor-widget elementor-widget-heading" data-id="bdb88f3" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h2 class="elementor-heading-title elementor-size-default">Related Posts</h2>				</div>
				</div>
				<div class="elementor-element elementor-element-7434454 elementor-align-left elementor-widget elementor-widget-elementskit-post-list" data-id="7434454" data-element_type="widget" data-widget_type="elementskit-post-list.default">
				<div class="elementor-widget-container">
					<div class="ekit-wid-con" >		<ul class="elementor-icon-list-items ekit-post-list-wrapper  elementor-inline-items">
						<li class="elementor-icon-list-item col-lg-4  ">
				<a href="https://www.times-of-tech.com/air-pods-pro-with-wireless-charging-case-2/" >
					<img loading="lazy" width="140" height="100" src="https://i0.wp.com/www.times-of-tech.com/wp-content/uploads/2025/08/air_pods_pro_with_wireless_charging_case-1.png?fit=140%2C100&ssl=1" class="attachment-medium size-medium wp-post-image" alt="Air Pods Pro with Wireless Charging Case" title="Air Pods Pro with Wireless Charging Case" decoding="async" />					<div class="ekit_post_list_content_wraper">
						
						<span class="elementor-icon-list-text">Air Pods Pro with Wireless Charging Case</span>

											</div>
				</a>
			</li>
					<li class="elementor-icon-list-item col-lg-4  ">
				<a href="https://www.times-of-tech.com/virtual-reality-or-artificial-intelligence-technology-2/" >
					<img loading="lazy" width="140" height="100" src="https://i0.wp.com/www.times-of-tech.com/wp-content/uploads/2025/08/virtual_reality_or_artificial_intelligence_technology-1.png?fit=140%2C100&ssl=1" class="attachment-medium size-medium wp-post-image" alt="Virtual Reality or Artificial Intelligence Technology" title="Virtual Reality or Artificial Intelligence Technology" decoding="async" />					<div class="ekit_post_list_content_wraper">
						
						<span class="elementor-icon-list-text">Virtual Reality or Artificial Intelligence Technology</span>

											</div>
				</a>
			</li>
					<li class="elementor-icon-list-item col-lg-4  ">
				<a href="https://www.times-of-tech.com/rocket-lab-mission-fails-shortly-after-launch-2/" >
					<img loading="lazy" width="140" height="100" src="https://i0.wp.com/www.times-of-tech.com/wp-content/uploads/2025/08/rocket_lab_mission_fails_shortly_after_launch-1.png?fit=140%2C100&ssl=1" class="attachment-medium size-medium wp-post-image" alt="Rocket Lab mission fails shortly after launch" title="Rocket Lab mission fails shortly after launch" decoding="async" />					<div class="ekit_post_list_content_wraper">
						
						<span class="elementor-icon-list-text">Rocket Lab mission fails shortly after launch</span>

											</div>
				</a>
			</li>
					<li class="elementor-icon-list-item col-lg-4  ">
				<a href="https://www.times-of-tech.com/virtual-reality-or-artificial-intelligence-technology/" >
					<img loading="lazy" width="140" height="100" src="https://i0.wp.com/www.times-of-tech.com/wp-content/uploads/2025/08/virtual_reality_or_artificial_intelligence_technology.png?fit=140%2C100&ssl=1" class="attachment-medium size-medium wp-post-image" alt="Virtual Reality or Artificial Intelligence Technology" title="Virtual Reality or Artificial Intelligence Technology" decoding="async" />					<div class="ekit_post_list_content_wraper">
						
						<span class="elementor-icon-list-text">Virtual Reality or Artificial Intelligence Technology</span>

											</div>
				</a>
			</li>
					<li class="elementor-icon-list-item col-lg-4  ">
				<a href="https://www.times-of-tech.com/air-pods-pro-with-wireless-charging-case/" >
					<img loading="lazy" width="140" height="100" src="https://i0.wp.com/www.times-of-tech.com/wp-content/uploads/2025/08/air_pods_pro_with_wireless_charging_case.png?fit=140%2C100&ssl=1" class="attachment-medium size-medium wp-post-image" alt="Air Pods Pro with Wireless Charging Case" title="Air Pods Pro with Wireless Charging Case" decoding="async" />					<div class="ekit_post_list_content_wraper">
						
						<span class="elementor-icon-list-text">Air Pods Pro with Wireless Charging Case</span>

											</div>
				</a>
			</li>
					<li class="elementor-icon-list-item col-lg-4  ">
				<a href="https://www.times-of-tech.com/rocket-lab-mission-fails-shortly-after-launch/" >
					<img loading="lazy" width="140" height="100" src="https://i0.wp.com/www.times-of-tech.com/wp-content/uploads/2025/08/rocket_lab_mission_fails_shortly_after_launch.png?fit=140%2C100&ssl=1" class="attachment-medium size-medium wp-post-image" alt="Rocket Lab mission fails shortly after launch" title="Rocket Lab mission fails shortly after launch" decoding="async" />					<div class="ekit_post_list_content_wraper">
						
						<span class="elementor-icon-list-text">Rocket Lab mission fails shortly after launch</span>

											</div>
				</a>
			</li>
				</ul>
		</div>				</div>
				</div>
					</div>
				</div>
				</div>
		
<script nitro-exclude>
    document.cookie = 'nitroCachedPage=' + (!window.NITROPACK_STATE ? '0' : '1') + '; path=/; SameSite=Lax';
</script>
<script nitro-exclude>
    if (!window.NITROPACK_STATE || window.NITROPACK_STATE != 'FRESH') {
        var proxyPurgeOnly = 0;
        if (typeof navigator.sendBeacon !== 'undefined') {
            var nitroData = new FormData(); nitroData.append('nitroBeaconUrl', 'aHR0cHM6Ly93d3cudGltZXMtb2YtdGVjaC5jb20vb3JjaGVzdHJhdGluZy1yYWctcGlwZWxpbmVzLXdpdGgtYXBhY2hlLWFpcmZsb3ctb3Blbi1kYXRhLXNjaWVuY2Uv'); nitroData.append('nitroBeaconCookies', 'W10='); nitroData.append('nitroBeaconHash', 'f5e2f28c0f15122cd408ec09be5faf115b5f84c20220e65ef407d3287c679561ad761471ac72ea24ad04fe83d28143e8578b13a9869b201afff9c3584de0fa99'); nitroData.append('proxyPurgeOnly', ''); nitroData.append('layout', 'post'); navigator.sendBeacon(location.href, nitroData);
        } else {
            var xhr = new XMLHttpRequest(); xhr.open('POST', location.href, true); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhr.send('nitroBeaconUrl=aHR0cHM6Ly93d3cudGltZXMtb2YtdGVjaC5jb20vb3JjaGVzdHJhdGluZy1yYWctcGlwZWxpbmVzLXdpdGgtYXBhY2hlLWFpcmZsb3ctb3Blbi1kYXRhLXNjaWVuY2Uv&nitroBeaconCookies=W10=&nitroBeaconHash=f5e2f28c0f15122cd408ec09be5faf115b5f84c20220e65ef407d3287c679561ad761471ac72ea24ad04fe83d28143e8578b13a9869b201afff9c3584de0fa99&proxyPurgeOnly=&layout=post');
        }
    }
</script>
		<footer itemtype="https://schema.org/WPFooter" itemscope="itemscope" id="colophon" role="contentinfo">
			<div class='footer-width-fixer'>		<div data-elementor-type="wp-post" data-elementor-id="1098" class="elementor elementor-1098" data-elementor-post-type="elementor-hf">
						<section data-particle_enable="false" data-particle-mobile-disabled="false" class="elementor-section elementor-top-section elementor-element elementor-element-6f8faf3a elementor-section-boxed elementor-section-height-default elementor-section-height-default wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no" data-id="6f8faf3a" data-element_type="section" id="xs_footer_13" data-settings="{"background_background":"classic"}">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-35b4a167" data-id="35b4a167" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-4f3a9db elementor-widget elementor-widget-heading" data-id="4f3a9db" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h2 class="elementor-heading-title elementor-size-default">Times Of Tech</h2>				</div>
				</div>
				<div class="elementor-element elementor-element-fb4e573 elementor-widget elementor-widget-text-editor" data-id="fb4e573" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p><span style="color: #000080;">We provide Content and News for Technology, AI and Data Science around the Globe to update you with trends.</span></p>								</div>
				</div>
				<div class="elementor-element elementor-element-2414286 elementor-widget elementor-widget-elementskit-social-media" data-id="2414286" data-element_type="widget" data-widget_type="elementskit-social-media.default">
				<div class="elementor-widget-container">
					<div class="ekit-wid-con" >			 <ul class="ekit_social_media">
														<li class="elementor-repeater-item-da8f4de">
					    <a
						href="https://www.facebook.com/profile.php?id=61567455863839" aria-label="Facebook" class="facebook" >
							
							<i aria-hidden="true" class="icon icon-facebook"></i>
                                                                                                            </a>
                    </li>
                    														<li class="elementor-repeater-item-1399011">
					    <a
						href="https://x.com/timesoftech95" aria-label="Twitter" class="twitter" >
							
							<svg aria-hidden="true" class="e-font-icon-svg e-fab-x-twitter" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg"><path d="M389.2 48h70.6L305.6 224.2 487 464H345L233.7 318.6 106.5 464H35.8L200.7 275.5 26.8 48H172.4L272.9 180.9 389.2 48zM364.4 421.8h39.1L151.1 88h-42L364.4 421.8z"></path></svg>
                                                                                                            </a>
                    </li>
                    														<li class="elementor-repeater-item-8f886e8">
					    <a
						href="https://www.linkedin.com/company/times-of-tech/" aria-label="LinkedIn" class="linkedin" >
							
							<i aria-hidden="true" class="icon icon-linkedin"></i>
                                                                                                            </a>
                    </li>
                    														<li class="elementor-repeater-item-c8596be">
					    <a
						href="https://www.instagram.com/timesoftech8/" aria-label="Instagram" class="1" >
							
							<i aria-hidden="true" class="icon icon-instagram-1"></i>
                                                                                                            </a>
                    </li>
                    														<li class="elementor-repeater-item-b2f551b">
					    <a
						href="https://rss.app/feeds/vCtxHBvh7C31722H.xml" aria-label="RSS" class="rss" >
							
							<i aria-hidden="true" class="icon icon-rss"></i>
                                                                                                            </a>
                    </li>
                    							</ul>
		</div>				</div>
				</div>
					</div>
		</div>
				<div class="elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-4b4bb99a" data-id="4b4bb99a" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-44df1c23 elementor-widget elementor-widget-heading" data-id="44df1c23" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h2 class="elementor-heading-title elementor-size-default">Contact Us</h2>				</div>
				</div>
				<div class="elementor-element elementor-element-9ed6de5 elementor-align-left elementor-icon-list--layout-traditional elementor-list-item-link-full_width elementor-widget elementor-widget-icon-list" data-id="9ed6de5" data-element_type="widget" data-widget_type="icon-list.default">
				<div class="elementor-widget-container">
							<ul class="elementor-icon-list-items">
							<li class="elementor-icon-list-item">
											<span class="elementor-icon-list-icon">
							<i aria-hidden="true" class="icon icon-phone1"></i>						</span>
										<span class="elementor-icon-list-text">+91 899 925 5183</span>
									</li>
								<li class="elementor-icon-list-item">
											<span class="elementor-icon-list-icon">
							<svg aria-hidden="true" class="e-font-icon-svg e-fas-envelope" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg"><path d="M502.3 190.8c3.9-3.1 9.7-.2 9.7 4.7V400c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V195.6c0-5 5.7-7.8 9.7-4.7 22.4 17.4 52.1 39.5 154.1 113.6 21.1 15.4 56.7 47.8 92.2 47.6 35.7.3 72-32.8 92.3-47.6 102-74.1 131.6-96.3 154-113.7zM256 320c23.2.4 56.6-29.2 73.4-41.4 132.7-96.3 142.8-104.7 173.4-128.7 5.8-4.5 9.2-11.5 9.2-18.9v-19c0-26.5-21.5-48-48-48H48C21.5 64 0 85.5 0 112v19c0 7.4 3.4 14.3 9.2 18.9 30.6 23.9 40.7 32.4 173.4 128.7 16.8 12.2 50.2 41.8 73.4 41.4z"></path></svg>						</span>
										<span class="elementor-icon-list-text">mohsin@times-of-tech.com</span>
									</li>
								<li class="elementor-icon-list-item">
											<span class="elementor-icon-list-icon">
							<svg aria-hidden="true" class="e-font-icon-svg e-fas-location-arrow" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg"><path d="M444.52 3.52L28.74 195.42c-47.97 22.39-31.98 92.75 19.19 92.75h175.91v175.91c0 51.17 70.36 67.17 92.75 19.19l191.9-415.78c15.99-38.39-25.59-79.97-63.97-63.97z"></path></svg>						</span>
										<span class="elementor-icon-list-text">Mumbai, Maharashtra, India</span>
									</li>
						</ul>
						</div>
				</div>
					</div>
		</div>
				<div class="elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-4fa0f637" data-id="4fa0f637" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-279e60f elementor-widget elementor-widget-heading" data-id="279e60f" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h2 class="elementor-heading-title elementor-size-default">Quick Links</h2>				</div>
				</div>
				<div class="elementor-element elementor-element-00018e9 hfe-nav-menu__align-left hfe-submenu-icon-arrow hfe-link-redirect-child hfe-nav-menu__breakpoint-tablet elementor-widget elementor-widget-navigation-menu" data-id="00018e9" data-element_type="widget" data-settings="{"padding_horizontal_menu_item":{"unit":"px","size":10,"sizes":[]},"padding_vertical_menu_item":{"unit":"px","size":10,"sizes":[]},"menu_space_between":{"unit":"px","size":10,"sizes":[]},"padding_horizontal_menu_item_tablet":{"unit":"px","size":"","sizes":[]},"padding_horizontal_menu_item_mobile":{"unit":"px","size":"","sizes":[]},"padding_vertical_menu_item_tablet":{"unit":"px","size":"","sizes":[]},"padding_vertical_menu_item_mobile":{"unit":"px","size":"","sizes":[]},"menu_space_between_tablet":{"unit":"px","size":"","sizes":[]},"menu_space_between_mobile":{"unit":"px","size":"","sizes":[]},"dropdown_border_radius":{"unit":"px","top":"","right":"","bottom":"","left":"","isLinked":true},"dropdown_border_radius_tablet":{"unit":"px","top":"","right":"","bottom":"","left":"","isLinked":true},"dropdown_border_radius_mobile":{"unit":"px","top":"","right":"","bottom":"","left":"","isLinked":true},"padding_horizontal_dropdown_item":{"unit":"px","size":"","sizes":[]},"padding_horizontal_dropdown_item_tablet":{"unit":"px","size":"","sizes":[]},"padding_horizontal_dropdown_item_mobile":{"unit":"px","size":"","sizes":[]},"padding_vertical_dropdown_item":{"unit":"px","size":15,"sizes":[]},"padding_vertical_dropdown_item_tablet":{"unit":"px","size":"","sizes":[]},"padding_vertical_dropdown_item_mobile":{"unit":"px","size":"","sizes":[]},"distance_from_menu":{"unit":"px","size":"","sizes":[]},"distance_from_menu_tablet":{"unit":"px","size":"","sizes":[]},"distance_from_menu_mobile":{"unit":"px","size":"","sizes":[]},"toggle_size":{"unit":"px","size":"","sizes":[]},"toggle_size_tablet":{"unit":"px","size":"","sizes":[]},"toggle_size_mobile":{"unit":"px","size":"","sizes":[]},"toggle_border_width":{"unit":"px","size":"","sizes":[]},"toggle_border_width_tablet":{"unit":"px","size":"","sizes":[]},"toggle_border_width_mobile":{"unit":"px","size":"","sizes":[]},"toggle_border_radius":{"unit":"px","size":"","sizes":[]},"toggle_border_radius_tablet":{"unit":"px","size":"","sizes":[]},"toggle_border_radius_mobile":{"unit":"px","size":"","sizes":[]}}" data-widget_type="navigation-menu.default">
				<div class="elementor-widget-container">
								<div class="hfe-nav-menu hfe-layout-vertical hfe-nav-menu-layout vertical" data-layout="vertical">
				<div role="button" class="hfe-nav-menu__toggle elementor-clickable" tabindex="0" aria-label="Menu Toggle">
					<span class="screen-reader-text">Menu</span>
					<div class="hfe-nav-menu-icon">
						<svg aria-hidden="true"  class="e-font-icon-svg e-fas-align-justify" viewBox="0 0 448 512" xmlns="http://www.w3.org/2000/svg"><path d="M432 416H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0-128H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0-128H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0-128H16A16 16 0 0 0 0 48v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16z"></path></svg>					</div>
				</div>
				<nav class="hfe-nav-menu__layout-vertical hfe-nav-menu__submenu-arrow" data-toggle-icon="<svg aria-hidden="true" tabindex="0" class="e-font-icon-svg e-fas-align-justify" viewBox="0 0 448 512" xmlns="http://www.w3.org/2000/svg"><path d="M432 416H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0-128H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0-128H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0-128H16A16 16 0 0 0 0 48v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16z"></path></svg>" data-close-icon="<svg aria-hidden="true" tabindex="0" class="e-font-icon-svg e-far-window-close" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg"><path d="M464 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h416c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm0 394c0 3.3-2.7 6-6 6H54c-3.3 0-6-2.7-6-6V86c0-3.3 2.7-6 6-6h404c3.3 0 6 2.7 6 6v340zM356.5 194.6L295.1 256l61.4 61.4c4.6 4.6 4.6 12.1 0 16.8l-22.3 22.3c-4.6 4.6-12.1 4.6-16.8 0L256 295.1l-61.4 61.4c-4.6 4.6-12.1 4.6-16.8 0l-22.3-22.3c-4.6-4.6-4.6-12.1 0-16.8l61.4-61.4-61.4-61.4c-4.6-4.6-4.6-12.1 0-16.8l22.3-22.3c4.6-4.6 12.1-4.6 16.8 0l61.4 61.4 61.4-61.4c4.6-4.6 12.1-4.6 16.8 0l22.3 22.3c4.7 4.6 4.7 12.1 0 16.8z"></path></svg>" data-full-width="yes">
					<ul id="menu-1-00018e9" class="hfe-nav-menu"><li id="menu-item-1014" class="menu-item menu-item-type-post_type menu-item-object-page parent hfe-creative-menu"><a href="https://www.times-of-tech.com/home-page/" class = "hfe-menu-item">Home Page</a></li>
<li id="menu-item-1015" class="menu-item menu-item-type-post_type menu-item-object-page parent hfe-creative-menu"><a href="https://www.times-of-tech.com/about-us/" class = "hfe-menu-item">About Us</a></li>
<li id="menu-item-1018" class="menu-item menu-item-type-post_type menu-item-object-page parent hfe-creative-menu"><a href="https://www.times-of-tech.com/jobs-2/" class = "hfe-menu-item">Jobs</a></li>
<li id="menu-item-10988" class="menu-item menu-item-type-post_type menu-item-object-page parent hfe-creative-menu"><a href="https://www.times-of-tech.com/contact-us/" class = "hfe-menu-item">Contact Us</a></li>
<li id="menu-item-1019" class="menu-item menu-item-type-post_type menu-item-object-page parent hfe-creative-menu"><a href="https://www.times-of-tech.com/privacy-policy-2/" class = "hfe-menu-item">Privacy Policy</a></li>
</ul> 
				</nav>
			</div>
							</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section data-particle_enable="false" data-particle-mobile-disabled="false" class="elementor-section elementor-top-section elementor-element elementor-element-3a694d62 elementor-section-full_width elementor-section-height-default elementor-section-height-default wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no" data-id="3a694d62" data-element_type="section" data-settings="{"background_background":"classic","background_motion_fx_motion_fx_mouse":"yes"}">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-481d9b90" data-id="481d9b90" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-3e87b862 elementor-widget-tablet__width-initial elementor-widget elementor-widget-elementskit-heading" data-id="3e87b862" data-element_type="widget" data-widget_type="elementskit-heading.default">
				<div class="elementor-widget-container">
					<div class="ekit-wid-con" ><div class="ekit-heading elementskit-section-title-wraper text_center   ekit_heading_tablet-text_center   ekit_heading_mobile-text_center"><a href="https://www.times-of-tech.com/"><p class="ekit-heading--title elementskit-section-title ">Copyright © Times Of Tech 2025. All Rights Reserved.</p></a></div></div>				</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				</div>
		</div>		</footer>
	</div><!-- #page -->
<script type="speculationrules">
{"prefetch":[{"source":"document","where":{"and":[{"href_matches":"\/*"},{"not":{"href_matches":["\/wp-*.php","\/wp-admin\/*","\/wp-content\/uploads\/*","\/wp-content\/*","\/wp-content\/plugins\/*","\/wp-content\/themes\/tech-review-blog\/*","\/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]}
</script>
			<script>
				const lazyloadRunObserver = () => {
					const lazyloadBackgrounds = document.querySelectorAll( `.e-con.e-parent:not(.e-lazyloaded)` );
					const lazyloadBackgroundObserver = new IntersectionObserver( ( entries ) => {
						entries.forEach( ( entry ) => {
							if ( entry.isIntersecting ) {
								let lazyloadBackground = entry.target;
								if( lazyloadBackground ) {
									lazyloadBackground.classList.add( 'e-lazyloaded' );
								}
								lazyloadBackgroundObserver.unobserve( entry.target );
							}
						});
					}, { rootMargin: '200px 0px 200px 0px' } );
					lazyloadBackgrounds.forEach( ( lazyloadBackground ) => {
						lazyloadBackgroundObserver.observe( lazyloadBackground );
					} );
				};
				const events = [
					'DOMContentLoaded',
					'elementor/lazyload/observe',
				];
				events.forEach( ( event ) => {
					document.addEventListener( event, lazyloadRunObserver );
				} );
			</script>
				<script type='text/javascript'>
		(function () {
			var c = document.body.className;
			c = c.replace(/woocommerce-no-js/, 'woocommerce-js');
			document.body.className = c;
		})();
	</script>
	<script type="text/template" id="tmpl-variation-template">
	<div class="woocommerce-variation-description">{{{ data.variation.variation_description }}}</div>
	<div class="woocommerce-variation-price">{{{ data.variation.price_html }}}</div>
	<div class="woocommerce-variation-availability">{{{ data.variation.availability_html }}}</div>
</script>
<script type="text/template" id="tmpl-unavailable-variation-template">
	<p role="alert">Sorry, this product is unavailable. Please choose a different combination.</p>
</script>
<link rel='stylesheet' id='fifu-woo-css' href='https://www.times-of-tech.com/wp-content/plugins/featured-image-from-url/includes/html/css/woo.css?ver=5.2.8' type='text/css' media='all' />
<style id='fifu-woo-inline-css' type='text/css'>
img.zoomImg {display:inline !important}
</style>
<link rel='stylesheet' id='wc-blocks-style-css' href='https://c0.wp.com/p/woocommerce/10.2.1/assets/client/blocks/wc-blocks.css' type='text/css' media='all' />
<link rel='stylesheet' id='e-motion-fx-css' href='https://www.times-of-tech.com/wp-content/plugins/elementor-pro/assets/css/modules/motion-fx.min.css?ver=3.31.2' type='text/css' media='all' />
<script type="text/javascript" id="essential-blocks-blocks-localize-js-extra">
/* <![CDATA[ */
var eb_conditional_localize = [];
var EssentialBlocksLocalize = {"eb_plugins_url":"https:\/\/www.times-of-tech.com\/wp-content\/plugins\/essential-blocks\/","image_url":"https:\/\/www.times-of-tech.com\/wp-content\/plugins\/essential-blocks\/assets\/images","eb_wp_version":"6.8","eb_version":"5.7.0","eb_admin_url":"https:\/\/www.times-of-tech.com\/wp-admin\/","rest_rootURL":"https:\/\/www.times-of-tech.com\/wp-json\/","ajax_url":"https:\/\/www.times-of-tech.com\/wp-admin\/admin-ajax.php","nft_nonce":"173959b16b","post_grid_pagination_nonce":"67d77f94c7","placeholder_image":"https:\/\/www.times-of-tech.com\/wp-content\/plugins\/essential-blocks\/assets\/images\/placeholder.png","is_pro_active":"false","upgrade_pro_url":"https:\/\/essential-blocks.com\/upgrade","responsiveBreakpoints":{"tablet":1024,"mobile":767},"wc_currency_symbol":"\u20b9"};
/* ]]> */
</script>
<script type="text/javascript" src="https://www.times-of-tech.com/wp-content/plugins/essential-blocks/assets/js/eb-blocks-localize.js?ver=31d6cfe0d16ae931b73c" id="essential-blocks-blocks-localize-js"></script>
<script type="text/javascript" src="https://c0.wp.com/c/6.8.2/wp-includes/js/dist/hooks.min.js" id="wp-hooks-js"></script>
<script type="text/javascript" src="https://c0.wp.com/c/6.8.2/wp-includes/js/dist/i18n.min.js" id="wp-i18n-js"></script>
<script type="text/javascript" id="wp-i18n-js-after">
/* <![CDATA[ */
wp.i18n.setLocaleData( { 'text direction\u0004ltr': [ 'ltr' ] } );
/* ]]> */
</script>
<script type="text/javascript" src="https://www.times-of-tech.com/wp-content/plugins/contact-form-7/includes/swv/js/index.js?ver=6.1.1" id="swv-js"></script>
<script type="text/javascript" id="contact-form-7-js-before">
/* <![CDATA[ */
var wpcf7 = {
    "api": {
        "root": "https:\/\/www.times-of-tech.com\/wp-json\/",
        "namespace": "contact-form-7\/v1"
    },
    "cached": 1
};
/* ]]> */
</script>
<script type="text/javascript" src="https://www.times-of-tech.com/wp-content/plugins/contact-form-7/includes/js/index.js?ver=6.1.1" id="contact-form-7-js"></script>
<script type="text/javascript" id="woocommerce-js-extra">
/* <![CDATA[ */
var woocommerce_params = {"ajax_url":"\/wp-admin\/admin-ajax.php","wc_ajax_url":"\/?wc-ajax=%%endpoint%%","i18n_password_show":"Show password","i18n_password_hide":"Hide password"};
/* ]]> */
</script>
<script type="text/javascript" src="https://c0.wp.com/p/woocommerce/10.2.1/assets/js/frontend/woocommerce.min.js" id="woocommerce-js" data-wp-strategy="defer"></script>
<script type="text/javascript" id="boomdevs-tocone-page-nav-js-extra">
/* <![CDATA[ */
var page_nav = {"offset_from_top":"0"};
/* ]]> */
</script>
<script type="text/javascript" src="https://www.times-of-tech.com/wp-content/plugins/top-table-of-contents/public/js/jquery.nav.js?ver=1.3.30" id="boomdevs-tocone-page-nav-js"></script>
<script type="text/javascript" id="boomdevs-toc-js-extra">
/* <![CDATA[ */
var handle = {"initial_view":"1","isProActivated":""};
/* ]]> */
</script>
<script type="text/javascript" src="https://www.times-of-tech.com/wp-content/plugins/top-table-of-contents/public/js/boomdevs-toc-public.js?ver=1.3.30" id="boomdevs-toc-js"></script>
<script type="text/javascript" src="https://www.times-of-tech.com/wp-content/plugins/elespare/assets/marquee/jquery.marquee.js?ver=1759011612" id="jquery-marquee-js"></script>
<script type="text/javascript" src="https://www.times-of-tech.com/wp-content/plugins/royal-elementor-addons/assets/js/lib/particles/particles.js?ver=3.0.6" id="wpr-particles-js"></script>
<script type="text/javascript" src="https://www.times-of-tech.com/wp-content/plugins/royal-elementor-addons/assets/js/lib/jarallax/jarallax.min.js?ver=1.12.7" id="wpr-jarallax-js"></script>
<script type="text/javascript" src="https://www.times-of-tech.com/wp-content/plugins/royal-elementor-addons/assets/js/lib/parallax/parallax.min.js?ver=1.0" id="wpr-parallax-hover-js"></script>
<script type="text/javascript" id="mailchimp-woocommerce-js-extra">
/* <![CDATA[ */
var mailchimp_public_data = {"site_url":"https:\/\/www.times-of-tech.com","ajax_url":"https:\/\/www.times-of-tech.com\/wp-admin\/admin-ajax.php","disable_carts":"","subscribers_only":"","language":"en","allowed_to_set_cookies":"1"};
/* ]]> */
</script>
<script type="text/javascript" src="https://www.times-of-tech.com/wp-content/plugins/mailchimp-for-woocommerce/public/js/mailchimp-woocommerce-public.min.js?ver=5.5.1.07" id="mailchimp-woocommerce-js"></script>
<script type="text/javascript" id="wc-cart-fragments-js-extra">
/* <![CDATA[ */
var wc_cart_fragments_params = {"ajax_url":"\/wp-admin\/admin-ajax.php","wc_ajax_url":"\/?wc-ajax=%%endpoint%%","cart_hash_key":"wc_cart_hash_9364c6e1ca11407764515a3b2f3782f4","fragment_name":"wc_fragments_9364c6e1ca11407764515a3b2f3782f4","request_timeout":"5000"};
/* ]]> */
</script>
<script type="text/javascript" src="https://c0.wp.com/p/woocommerce/10.2.1/assets/js/frontend/cart-fragments.min.js" id="wc-cart-fragments-js" data-wp-strategy="defer"></script>
<script type="text/javascript" id="tinvwl-js-extra">
/* <![CDATA[ */
var tinvwl_add_to_wishlist = {"text_create":"Create New","text_already_in":"{product_name} already in {wishlist_title}","simple_flow":"","hide_zero_counter":"","i18n_make_a_selection_text":"Please select some product options before adding this product to your wishlist.","tinvwl_break_submit":"No items or actions are selected.","tinvwl_clipboard":"Copied!","allow_parent_variable":"","block_ajax_wishlists_data":"","update_wishlists_data":"","hash_key":"ti_wishlist_data_9364c6e1ca11407764515a3b2f3782f4","nonce":"f35cef1d49","rest_root":"https:\/\/www.times-of-tech.com\/wp-json\/","plugin_url":"https:\/\/www.times-of-tech.com\/wp-content\/plugins\/ti-woocommerce-wishlist\/","wc_ajax_url":"\/?wc-ajax=tinvwl","stats":"","popup_timer":"6000"};
/* ]]> */
</script>
<script type="text/javascript" src="https://www.times-of-tech.com/wp-content/plugins/ti-woocommerce-wishlist/assets/js/public.min.js?ver=2.10.0" id="tinvwl-js"></script>
<script type="text/javascript" src="https://www.times-of-tech.com/wp-content/themes/tech-review-blog/assets/js/navigation.js?ver=1.0" id="tech-review-blog-navigation-js"></script>
<script type="text/javascript" src="https://www.times-of-tech.com/wp-content/themes/tech-review-blog/assets/js/script.js?ver=1.0" id="tech-review-blog-script-js"></script>
<script type="text/javascript" src="https://c0.wp.com/c/6.8.2/wp-includes/js/comment-reply.min.js" id="comment-reply-js" async="async" data-wp-strategy="async"></script>
<script type="text/javascript" src="https://www.times-of-tech.com/wp-content/plugins/elementor/assets/js/webpack.runtime.min.js?ver=3.32.2" id="elementor-webpack-runtime-js"></script>
<script type="text/javascript" src="https://www.times-of-tech.com/wp-content/plugins/elementor/assets/js/frontend-modules.min.js?ver=3.32.2" id="elementor-frontend-modules-js"></script>
<script type="text/javascript" src="https://c0.wp.com/c/6.8.2/wp-includes/js/jquery/ui/core.min.js" id="jquery-ui-core-js"></script>
<script type="text/javascript" id="elementor-frontend-js-before">
/* <![CDATA[ */
var elementorFrontendConfig = {"environmentMode":{"edit":false,"wpPreview":false,"isScriptDebug":false},"i18n":{"shareOnFacebook":"Share on Facebook","shareOnTwitter":"Share on Twitter","pinIt":"Pin it","download":"Download","downloadImage":"Download image","fullscreen":"Fullscreen","zoom":"Zoom","share":"Share","playVideo":"Play Video","previous":"Previous","next":"Next","close":"Close","a11yCarouselPrevSlideMessage":"Previous slide","a11yCarouselNextSlideMessage":"Next slide","a11yCarouselFirstSlideMessage":"This is the first slide","a11yCarouselLastSlideMessage":"This is the last slide","a11yCarouselPaginationBulletMessage":"Go to slide"},"is_rtl":false,"breakpoints":{"xs":0,"sm":480,"md":768,"lg":1025,"xl":1440,"xxl":1600},"responsive":{"breakpoints":{"mobile":{"label":"Mobile Portrait","value":767,"default_value":767,"direction":"max","is_enabled":true},"mobile_extra":{"label":"Mobile Landscape","value":880,"default_value":880,"direction":"max","is_enabled":false},"tablet":{"label":"Tablet Portrait","value":1024,"default_value":1024,"direction":"max","is_enabled":true},"tablet_extra":{"label":"Tablet Landscape","value":1200,"default_value":1200,"direction":"max","is_enabled":false},"laptop":{"label":"Laptop","value":1366,"default_value":1366,"direction":"max","is_enabled":false},"widescreen":{"label":"Widescreen","value":2400,"default_value":2400,"direction":"min","is_enabled":false}},
"hasCustomBreakpoints":false},"version":"3.32.2","is_static":false,"experimentalFeatures":{"e_font_icon_svg":true,"additional_custom_breakpoints":true,"container":true,"theme_builder_v2":true,"nested-elements":true,"home_screen":true,"global_classes_should_enforce_capabilities":true,"e_variables":true,"cloud-library":true,"e_opt_in_v4_page":true,"import-export-customization":true},"urls":{"assets":"https:\/\/www.times-of-tech.com\/wp-content\/plugins\/elementor\/assets\/","ajaxurl":"https:\/\/www.times-of-tech.com\/wp-admin\/admin-ajax.php","uploadUrl":"https:\/\/www.times-of-tech.com\/wp-content\/uploads"},"nonces":{"floatingButtonsClickTracking":"0ec7c2856a"},"swiperClass":"swiper","settings":{"page":[],"editorPreferences":[]},"kit":{"active_breakpoints":["viewport_mobile","viewport_tablet"],"global_image_lightbox":"yes","lightbox_enable_counter":"yes","lightbox_enable_fullscreen":"yes","lightbox_enable_zoom":"yes","lightbox_enable_share":"yes","lightbox_title_src":"title","lightbox_description_src":"description","woocommerce_notices_elements":[]},"post":{"id":31336,"title":"Orchestrating%20RAG%20pipelines%20with%20Apache%20Airflow%20%E2%80%93%20Open%20Data%20Science","excerpt":"","featuredImage":"https:\/\/i0.wp.com\/www.times-of-tech.com\/wp-content\/uploads\/2025\/08\/books-gf35ce9151_640-640x300.jpg?fit=640%2C300&ssl=1"}};
/* ]]> */
</script>
<script type="text/javascript" src="https://www.times-of-tech.com/wp-content/plugins/elementor/assets/js/frontend.min.js?ver=3.32.2" id="elementor-frontend-js"></script>
<script type="text/javascript" src="https://www.times-of-tech.com/wp-content/plugins/elementskit-lite/libs/framework/assets/js/frontend-script.js?ver=3.7.3" id="elementskit-framework-js-frontend-js"></script>
<script type="text/javascript" id="elementskit-framework-js-frontend-js-after">
/* <![CDATA[ */
		var elementskit = {
			resturl: 'https://www.times-of-tech.com/wp-json/elementskit/v1/',
		}

		
/* ]]> */
</script>
<script type="text/javascript" src="https://www.times-of-tech.com/wp-content/plugins/elementskit-lite/widgets/init/assets/js/widget-scripts.js?ver=3.7.3" id="ekit-widget-scripts-js"></script>
<script type="text/javascript" src="https://www.times-of-tech.com/wp-content/plugins/gravatar-enhanced/build/hovercards.js?ver=0f12f0eec5527ff309cd" id="gravatar-enhanced-hovercards-js"></script>
<script type="text/javascript" id="gravatar-enhanced-comments-js-extra">
/* <![CDATA[ */
var gravatarEnhancedComments = {"locale":""};
/* ]]> */
</script>
<script type="text/javascript" src="https://www.times-of-tech.com/wp-content/plugins/gravatar-enhanced/build/comments.js?ver=d359e8c3fec913d88674" id="gravatar-enhanced-comments-js"></script>
<script type="text/javascript" src="https://c0.wp.com/p/woocommerce/10.2.1/assets/js/sourcebuster/sourcebuster.min.js" id="sourcebuster-js-js"></script>
<script type="text/javascript" id="wc-order-attribution-js-extra">
/* <![CDATA[ */
var wc_order_attribution = {"params":{"lifetime":1.0e-5,"session":30,"base64":false,"ajaxurl":"https:\/\/www.times-of-tech.com\/wp-admin\/admin-ajax.php","prefix":"wc_order_attribution_","allowTracking":true},"fields":{"source_type":"current.typ","referrer":"current_add.rf","utm_campaign":"current.cmp","utm_source":"current.src","utm_medium":"current.mdm","utm_content":"current.cnt","utm_id":"current.id","utm_term":"current.trm","utm_source_platform":"current.plt","utm_creative_format":"current.fmt","utm_marketing_tactic":"current.tct","session_entry":"current_add.ep","session_start_time":"current_add.fd","session_pages":"session.pgs","session_count":"udata.vst","user_agent":"udata.uag"}};
/* ]]> */
</script>
<script type="text/javascript" src="https://c0.wp.com/p/woocommerce/10.2.1/assets/js/frontend/order-attribution.min.js" id="wc-order-attribution-js"></script>
<script type="text/javascript" src="https://www.times-of-tech.com/wp-content/plugins/google-site-kit/dist/assets/js/googlesitekit-events-provider-contact-form-7-10f93ca20bbdedf1f7dd.js" id="googlesitekit-events-provider-contact-form-7-js" defer></script>
<script type="text/javascript" id="googlesitekit-events-provider-woocommerce-js-before">
/* <![CDATA[ */
window._googlesitekit.wcdata = window._googlesitekit.wcdata || {};
window._googlesitekit.wcdata.products = [];
window._googlesitekit.wcdata.add_to_cart = null;
window._googlesitekit.wcdata.currency = "INR";
window._googlesitekit.wcdata.eventsToTrack = ["add_to_cart","purchase"];
/* ]]> */
</script>
<script type="text/javascript" src="https://www.times-of-tech.com/wp-content/plugins/google-site-kit/dist/assets/js/googlesitekit-events-provider-woocommerce-8317e4f1e6fd3ba5a52e.js" id="googlesitekit-events-provider-woocommerce-js" defer></script>
<script type="text/javascript" src="https://www.times-of-tech.com/wp-content/plugins/google-site-kit/dist/assets/js/googlesitekit-events-provider-wpforms-2d1e2a896ca7befe287a.js" id="googlesitekit-events-provider-wpforms-js" defer></script>
<script type="text/javascript" id="eael-general-js-extra">
/* <![CDATA[ */
var localize = {"ajaxurl":"https:\/\/www.times-of-tech.com\/wp-admin\/admin-ajax.php","nonce":"fe5967d9d9","i18n":{"added":"Added ","compare":"Compare","loading":"Loading..."},"eael_translate_text":{"required_text":"is a required field","invalid_text":"Invalid","billing_text":"Billing","shipping_text":"Shipping","fg_mfp_counter_text":"of"},"page_permalink":"https:\/\/www.times-of-tech.com\/orchestrating-rag-pipelines-with-apache-airflow-open-data-science\/","cart_redirectition":"no","cart_page_url":"https:\/\/www.times-of-tech.com\/cart\/","el_breakpoints":{"mobile":{"label":"Mobile Portrait","value":767,"default_value":767,"direction":"max","is_enabled":true},"mobile_extra":{"label":"Mobile Landscape","value":880,"default_value":880,"direction":"max","is_enabled":false},"tablet":{"label":"Tablet Portrait","value":1024,"default_value":1024,"direction":"max","is_enabled":true},"tablet_extra":{"label":"Tablet Landscape","value":1200,"default_value":1200,"direction":"max","is_enabled":false},"laptop":{"label":"Laptop","value":1366,"default_value":1366,"direction":"max","is_enabled":false},"widescreen":{"label":"Widescreen","value":2400,"default_value":2400,"direction":"min","is_enabled":false}},"ParticleThemesData":{"default":"{\"particles\":{\"number\":{\"value\":160,\"density\":{\"enable\":true,\"value_area\":800}},\"color\":{\"value\":\"#ffffff\"},\"shape\":{\"type\":\"circle\",\"stroke\":{\"width\":0,\"color\":\"#000000\"},\"polygon\":{\"nb_sides\":5},\"image\":{\"src\":\"img\/github.svg\",\"width\":100,\"height\":100}},\"opacity\":{\"value\":0.5,\"random\":false,\"anim\":{\"enable\":false,\"speed\":1,\"opacity_min\":0.1,\"sync\":false}},\"size\":{\"value\":3,\"random\":true,\"anim\":{\"enable\":false,\"speed\":40,\"size_min\":0.1,\"sync\":false}},\"line_linked\":{\"enable\":true,\"distance\":150,\"color\":\"#ffffff\",\"opacity\":0.4,\"width\":1},\"move\":{\"enable\":true,\"speed\":6,\"direction\":\"none\",\"random\":false,\"straight\":false,\"out_mode\":\"out\",\"bounce\":false,\"attract\":{\"enable\":false,\"rotateX\":600,\"rotateY\":1200}}},\"interactivity\":{\"detect_on\":\"canvas\",\"events\":{\"onhover\":{\"enable\":true,\"mode\":\"repulse\"},\"onclick\":{\"enable\":true,\"mode\":\"push\"},\"resize\":true},\"modes\":{\"grab\":{\"distance\":400,\"line_linked\":{\"opacity\":1}},\"bubble\":{\"distance\":400,\"size\":40,\"duration\":2,\"opacity\":8,\"speed\":3},\"repulse\":{\"distance\":200,\"duration\":0.4},\"push\":{\"particles_nb\":4},\"remove\":{\"particles_nb\":2}}},\"retina_detect\":true}","nasa":"{\"particles\":{\"number\":{\"value\":250,\"density\":{\"enable\":true,\"value_area\":800}},\"color\":{\"value\":\"#ffffff\"},\"shape\":{\"type\":\"circle\",\"stroke\":{\"width\":0,\"color\":\"#000000\"},\"polygon\":{\"nb_sides\":5},\"image\":{\"src\":\"img\/github.svg\",\"width\":100,\"height\":100}},\"opacity\":{\"value\":1,\"random\":true,\"anim\":{\"enable\":true,\"speed\":1,\"opacity_min\":0,\"sync\":false}},\"size\":{\"value\":3,\"random\":true,\"anim\":{\"enable\":false,\"speed\":4,\"size_min\":0.3,\"sync\":false}},\"line_linked\":{\"enable\":false,\"distance\":150,\"color\":\"#ffffff\",\"opacity\":0.4,\"width\":1},\"move\":{\"enable\":true,\"speed\":1,\"direction\":\"none\",\"random\":true,\"straight\":false,\"out_mode\":\"out\",\"bounce\":false,\"attract\":{\"enable\":false,\"rotateX\":600,\"rotateY\":600}}},\"interactivity\":{\"detect_on\":\"canvas\",\"events\":{\"onhover\":{\"enable\":true,\"mode\":\"bubble\"},\"onclick\":{\"enable\":true,\"mode\":\"repulse\"},\"resize\":true},\"modes\":{\"grab\":{\"distance\":400,\"line_linked\":{\"opacity\":1}},\"bubble\":{\"distance\":250,\"size\":0,\"duration\":2,\"opacity\":0,\"speed\":3},\"repulse\":{\"distance\":400,\"duration\":0.4},\"push\":{\"particles_nb\":4},\"remove\":{\"particles_nb\":2}}},\"retina_detect\":true}","bubble":"{\"particles\":{\"number\":{\"value\":15,\"density\":{\"enable\":true,\"value_area\":800}},\"color\":{\"value\":\"#1b1e34\"},\"shape\":{\"type\":\"polygon\",\"stroke\":{\"width\":0,\"color\":\"#000\"},\"polygon\":{\"nb_sides\":6},\"image\":{\"src\":\"img\/github.svg\",\"width\":100,\"height\":100}},\"opacity\":{\"value\":0.3,\"random\":true,\"anim\":{\"enable\":false,\"speed\":1,\"opacity_min\":0.1,\"sync\":false}},\"size\":{\"value\":50,\"random\":false,\"anim\":{\"enable\":true,\"speed\":10,\"size_min\":40,\"sync\":false}},\"line_linked\":{\"enable\":false,\"distance\":200,\"color\":\"#ffffff\",\"opacity\":1,\"width\":2},\"move\":{\"enable\":true,\"speed\":8,\"direction\":\"none\",\"random\":false,\"straight\":false,\"out_mode\":\"out\",\"bounce\":false,\"attract\":{\"enable\":false,\"rotateX\":600,\"rotateY\":1200}}},\"interactivity\":{\"detect_on\":\"canvas\",\"events\":{\"onhover\":{\"enable\":false,\"mode\":\"grab\"},\"onclick\":{\"enable\":false,\"mode\":\"push\"},\"resize\":true},\"modes\":{\"grab\":{\"distance\":400,\"line_linked\":{\"opacity\":1}},\"bubble\":{\"distance\":400,\"size\":40,\"duration\":2,\"opacity\":8,\"speed\":3},\"repulse\":{\"distance\":200,\"duration\":0.4},\"push\":{\"particles_nb\":4},\"remove\":{\"particles_nb\":2}}},\"retina_detect\":true}","snow":"{\"particles\":{\"number\":{\"value\":450,\"density\":{\"enable\":true,\"value_area\":800}},\"color\":{\"value\":\"#fff\"},\"shape\":{\"type\":\"circle\",\"stroke\":{\"width\":0,\"color\":\"#000000\"},\"polygon\":{\"nb_sides\":5},\"image\":{\"src\":\"img\/github.svg\",\"width\":100,\"height\":100}},\"opacity\":{\"value\":0.5,\"random\":true,\"anim\":{\"enable\":false,\"speed\":1,\"opacity_min\":0.1,\"sync\":false}},\"size\":{\"value\":5,\"random\":true,\"anim\":{\"enable\":false,\"speed\":40,\"size_min\":0.1,\"sync\":false}},\"line_linked\":{\"enable\":false,\"distance\":500,\"color\":\"#ffffff\",\"opacity\":0.4,\"width\":2},\"move\":{\"enable\":true,\"speed\":6,\"direction\":\"bottom\",\"random\":false,\"straight\":false,\"out_mode\":\"out\",\"bounce\":false,\"attract\":{\"enable\":false,\"rotateX\":600,\"rotateY\":1200}}},\"interactivity\":{\"detect_on\":\"canvas\",\"events\":{\"onhover\":{\"enable\":true,\"mode\":\"bubble\"},\"onclick\":{\"enable\":true,\"mode\":\"repulse\"},\"resize\":true},\"modes\":{\"grab\":{\"distance\":400,\"line_linked\":{\"opacity\":0.5}},\"bubble\":{\"distance\":400,\"size\":4,\"duration\":0.3,\"opacity\":1,\"speed\":3},\"repulse\":{\"distance\":200,\"duration\":0.4},\"push\":{\"particles_nb\":4},\"remove\":{\"particles_nb\":2}}},\"retina_detect\":true}","nyan_cat":"{\"particles\":{\"number\":{\"value\":150,\"density\":{\"enable\":false,\"value_area\":800}},\"color\":{\"value\":\"#ffffff\"},\"shape\":{\"type\":\"star\",\"stroke\":{\"width\":0,\"color\":\"#000000\"},\"polygon\":{\"nb_sides\":5},\"image\":{\"src\":\"http:\/\/wiki.lexisnexis.com\/academic\/images\/f\/fb\/Itunes_podcast_icon_300.jpg\",\"width\":100,\"height\":100}},\"opacity\":{\"value\":0.5,\"random\":false,\"anim\":{\"enable\":false,\"speed\":1,\"opacity_min\":0.1,\"sync\":false}},\"size\":{\"value\":4,\"random\":true,\"anim\":{\"enable\":false,\"speed\":40,\"size_min\":0.1,\"sync\":false}},\"line_linked\":{\"enable\":false,\"distance\":150,\"color\":\"#ffffff\",\"opacity\":0.4,\"width\":1},\"move\":{\"enable\":true,\"speed\":14,\"direction\":\"left\",\"random\":false,\"straight\":true,\"out_mode\":\"out\",\"bounce\":false,\"attract\":{\"enable\":false,\"rotateX\":600,\"rotateY\":1200}}},\"interactivity\":{\"detect_on\":\"canvas\",\"events\":{\"onhover\":{\"enable\":false,\"mode\":\"grab\"},\"onclick\":{\"enable\":true,\"mode\":\"repulse\"},\"resize\":true},\"modes\":{\"grab\":{\"distance\":200,\"line_linked\":{\"opacity\":1}},\"bubble\":{\"distance\":400,\"size\":40,\"duration\":2,\"opacity\":8,\"speed\":3},\"repulse\":{\"distance\":200,\"duration\":0.4},\"push\":{\"particles_nb\":4},\"remove\":{\"particles_nb\":2}}},\"retina_detect\":true}"},"eael_login_nonce":"0e4a49bfcc","eael_register_nonce":"ff86f01d3f","eael_lostpassword_nonce":"cf1560da97","eael_resetpassword_nonce":"bb3af4584a"};
/* ]]> */
</script>
<script type="text/javascript" src="https://www.times-of-tech.com/wp-content/plugins/essential-addons-for-elementor-lite/assets/front-end/js/view/general.min.js?ver=6.3.2" id="eael-general-js"></script>
<script type="text/javascript" id="jetpack-stats-js-before">
/* <![CDATA[ */
_stq = window._stq || [];
_stq.push([ "view", JSON.parse("{\"v\":\"ext\",\"blog\":\"239374254\",\"post\":\"31336\",\"tz\":\"5.5\",\"srv\":\"www.times-of-tech.com\",\"j\":\"1:15.0.2\"}") ]);
_stq.push([ "clickTrackerInit", "239374254", "31336" ]);
/* ]]> */
</script>
<script type="text/javascript" src="https://stats.wp.com/e-202539.js" id="jetpack-stats-js" defer="defer" data-wp-strategy="defer"></script>
<script type="text/javascript" id="fifu-image-js-js-extra">
/* <![CDATA[ */
var fifuImageVars = {"fifu_woo_lbox_enabled":"1","fifu_is_product":"","fifu_is_flatsome_active":""};
/* ]]> */
</script>
<script type="text/javascript" src="https://www.times-of-tech.com/wp-content/plugins/featured-image-from-url/includes/html/js/image.js?ver=5.2.8" id="fifu-image-js-js"></script>
<script type="text/javascript" src="https://www.times-of-tech.com/wp-content/plugins/header-footer-elementor/inc/js/frontend.js?ver=2.5.2" id="hfe-frontend-js-js"></script>
<script type="text/javascript" src="https://www.times-of-tech.com/wp-content/plugins/elementor-pro/assets/js/webpack-pro.runtime.min.js?ver=3.31.2" id="elementor-pro-webpack-runtime-js"></script>
<script type="text/javascript" id="elementor-pro-frontend-js-before">
/* <![CDATA[ */
var ElementorProFrontendConfig = {"ajaxurl":"https:\/\/www.times-of-tech.com\/wp-admin\/admin-ajax.php","nonce":"00970a4d43","urls":{"assets":"https:\/\/www.times-of-tech.com\/wp-content\/plugins\/elementor-pro\/assets\/","rest":"https:\/\/www.times-of-tech.com\/wp-json\/"},"settings":{"lazy_load_background_images":true},"popup":{"hasPopUps":false},"shareButtonsNetworks":{"facebook":{"title":"Facebook","has_counter":true},"twitter":{"title":"Twitter"},"linkedin":{"title":"LinkedIn","has_counter":true},"pinterest":{"title":"Pinterest","has_counter":true},"reddit":{"title":"Reddit","has_counter":true},"vk":{"title":"VK","has_counter":true},"odnoklassniki":{"title":"OK","has_counter":true},"tumblr":{"title":"Tumblr"},"digg":{"title":"Digg"},"skype":{"title":"Skype"},"stumbleupon":{"title":"StumbleUpon","has_counter":true},"mix":{"title":"Mix"},"telegram":{"title":"Telegram"},"pocket":{"title":"Pocket","has_counter":true},"xing":{"title":"XING","has_counter":true},"whatsapp":{"title":"WhatsApp"},"email":{"title":"Email"},"print":{"title":"Print"},"x-twitter":{"title":"X"},"threads":{"title":"Threads"}},
"woocommerce":{"menu_cart":{"cart_page_url":"https:\/\/www.times-of-tech.com\/cart\/","checkout_page_url":"https:\/\/www.times-of-tech.com\/checkout\/","fragments_nonce":"bc0a233997"}},
"facebook_sdk":{"lang":"en_US","app_id":""},"lottie":{"defaultAnimationUrl":"https:\/\/www.times-of-tech.com\/wp-content\/plugins\/elementor-pro\/modules\/lottie\/assets\/animations\/default.json"}};
/* ]]> */
</script>
<script type="text/javascript" src="https://www.times-of-tech.com/wp-content/plugins/elementor-pro/assets/js/frontend.min.js?ver=3.31.2" id="elementor-pro-frontend-js"></script>
<script type="text/javascript" src="https://www.times-of-tech.com/wp-content/plugins/elementor-pro/assets/js/elements-handlers.min.js?ver=3.31.2" id="pro-elements-handlers-js"></script>
<script type="text/javascript" src="https://www.times-of-tech.com/wp-content/plugins/elementskit-lite/widgets/init/assets/js/animate-circle.min.js?ver=3.7.3" id="animate-circle-js"></script>
<script type="text/javascript" id="elementskit-elementor-js-extra">
/* <![CDATA[ */
var ekit_config = {"ajaxurl":"https:\/\/www.times-of-tech.com\/wp-admin\/admin-ajax.php","nonce":"5653feff4e"};
/* ]]> */
</script>
<script type="text/javascript" src="https://www.times-of-tech.com/wp-content/plugins/elementskit-lite/widgets/init/assets/js/elementor.js?ver=3.7.3" id="elementskit-elementor-js"></script>
<script type="text/javascript" src="https://www.times-of-tech.com/wp-content/plugins/royal-elementor-addons/assets/js/lib/dompurify/dompurify.min.js?ver=3.0.6" id="dompurify-js"></script>
<script type="text/javascript" id="wpr-addons-js-js-extra">
/* <![CDATA[ */
var WprConfig = {"ajaxurl":"https:\/\/www.times-of-tech.com\/wp-admin\/admin-ajax.php","resturl":"https:\/\/www.times-of-tech.com\/wp-json\/wpraddons\/v1","nonce":"e4bd4dfadd","addedToCartText":"was added to cart","viewCart":"View Cart","comparePageID":"","comparePageURL":"https:\/\/www.times-of-tech.com\/orchestrating-rag-pipelines-with-apache-airflow-open-data-science\/","wishlistPageID":"","wishlistPageURL":"https:\/\/www.times-of-tech.com\/orchestrating-rag-pipelines-with-apache-airflow-open-data-science\/","chooseQuantityText":"Please select the required number of items.","site_key":"","is_admin":"","input_empty":"Please fill out this field","select_empty":"Nothing selected","file_empty":"Please upload a file","recaptcha_error":"Recaptcha Error","woo_shop_ppp":"9","woo_shop_cat_ppp":"9","woo_shop_tag_ppp":"9","is_product_category":"","is_product_tag":""};
/* ]]> */
</script>
<script type="text/javascript" data-cfasync="false" src="https://www.times-of-tech.com/wp-content/plugins/royal-elementor-addons/assets/js/frontend.min.js?ver=1.7.1034" id="wpr-addons-js-js"></script>
<script type="text/javascript" src="https://www.times-of-tech.com/wp-content/plugins/royal-elementor-addons/assets/js/modal-popups.min.js?ver=1.7.1034" id="wpr-modal-popups-js-js"></script>
<script type="text/javascript" src="https://c0.wp.com/c/6.8.2/wp-includes/js/underscore.min.js" id="underscore-js"></script>
<script type="text/javascript" id="wp-util-js-extra">
/* <![CDATA[ */
var _wpUtilSettings = {"ajax":{"url":"\/wp-admin\/admin-ajax.php"}};
/* ]]> */
</script>
<script type="text/javascript" src="https://c0.wp.com/c/6.8.2/wp-includes/js/wp-util.min.js" id="wp-util-js"></script>
<script type="text/javascript" id="wc-add-to-cart-variation-js-extra">
/* <![CDATA[ */
var wc_add_to_cart_variation_params = {"wc_ajax_url":"\/?wc-ajax=%%endpoint%%","i18n_no_matching_variations_text":"Sorry, no products matched your selection. Please choose a different combination.","i18n_make_a_selection_text":"Please select some product options before adding this product to your cart.","i18n_unavailable_text":"Sorry, this product is unavailable. Please choose a different combination.","i18n_reset_alert_text":"Your selection has been reset. Please select some product options before adding this product to your cart."};
/* ]]> */
</script>
<script type="text/javascript" src="https://c0.wp.com/p/woocommerce/10.2.1/assets/js/frontend/add-to-cart-variation.min.js" id="wc-add-to-cart-variation-js" defer="defer" data-wp-strategy="defer"></script>
<script type="text/javascript" id="wc-single-product-js-extra">
/* <![CDATA[ */
var wc_single_product_params = {"i18n_required_rating_text":"Please select a rating","i18n_rating_options":["1 of 5 stars","2 of 5 stars","3 of 5 stars","4 of 5 stars","5 of 5 stars"],"i18n_product_gallery_trigger_text":"View full-screen image gallery","review_rating_required":"yes","flexslider":{"rtl":false,"animation":"slide","smoothHeight":true,"directionNav":true,"controlNav":"thumbnails","slideshow":false,"animationSpeed":500,"animationLoop":false,"allowOneSlide":false},"zoom_enabled":"","zoom_options":[],"photoswipe_enabled":"","photoswipe_options":{"shareEl":false,"closeOnScroll":false,"history":false,"hideAnimationDuration":0,"showAnimationDuration":0},"flexslider_enabled":""};
/* ]]> */
</script>
<script type="text/javascript" src="https://c0.wp.com/p/woocommerce/10.2.1/assets/js/frontend/single-product.min.js" id="wc-single-product-js" defer="defer" data-wp-strategy="defer"></script>
<!-- WooCommerce JavaScript -->
<script type="text/javascript">
jQuery(function($) { 
_wca.push({'_en': 'woocommerceanalytics_page_view','session_id': '', 'blog_id': '239374254', 'store_id': '0abe35f1-6d10-4137-90ea-e43e70f21876', 'ui': '', 'url': 'https://www.times-of-tech.com', 'landing_page': '', 'woo_version': '10.2.1', 'wp_version': '6.8.2', 'store_admin': '0', 'device': 'desktop', 'template_used': '0', 'additional_blocks_on_cart_page': [],'additional_blocks_on_checkout_page': [],'store_currency': 'INR', 'timezone': '+05:30', 'is_guest': '1', 'order_value': '0', 'order_total': '0', 'total_tax': '0.00', 'total_discount': '0', 'total_shipping': '0', 'products_count': '0', 'cart_page_contains_cart_block': '1', 'cart_page_contains_cart_shortcode': '0', 'checkout_page_contains_checkout_block': '1', 'checkout_page_contains_checkout_shortcode': '0', });
 });
</script>
</body>
</html>