New to Kestra?
Use blueprints to kickstart your first workflows.
Load precomputed embeddings into Pinecone with Kestra. Download the JSON export, reshape to vector format in Python, upsert as a file, report to Slack.
Embedding jobs produce files; vector databases want upserts. This blueprint is the bridge for a RAG corpus. io.kestra.plugin.core.http.Download pulls a JSON export of precomputed embeddings, a small Python script reshapes each record into Pinecone's vector format and writes one map per line, and io.kestra.plugin.pinecone.Upsert loads the whole file through its from property in a single task. Because upserts overwrite by vector id, reruns refresh the corpus instead of duplicating it, and Slack gets the upserted count after every load.
download_embeddings (io.kestra.plugin.core.http.Download) fetches the JSON export named by the embeddings_url input into internal storage.reshape_vectors (io.kestra.plugin.scripts.python.Script on the io.kestra.plugin.core.runner.Process task runner, no container needed) reads the export, builds one map per record with id, values, and any scalar fields as metadata, and writes them line by line to vectors.ion.upsert_vectors (io.kestra.plugin.pinecone.Upsert) points its from property at the reshaped file and loads every vector in one call, outputting upsertedCount.notify posts the upserted count, index name, and source URL to Slack.errors block posts a distinct Slack alert when any step fails, so a stale corpus never hides behind a green dashboard.Schedule trigger refreshes the index daily at 05:00.A load script on cron fails silently, keeps no history, and loses the file when the disk rotates. Kestra runs the same three steps with internal storage between them, passes the reshaped file to the upsert by URI, surfaces upsertedCount into the notification, and records every refresh in the execution history. When the export schema changes, the failure is a red execution with logs, not a quietly shrinking index.
id and embedding fields.PINECONE_API_KEY: Pinecone API key with write permission on the index.SLACK_WEBHOOK_URL: Slack incoming webhook URL.PINECONE_API_KEY and SLACK_WEBHOOK_URL secrets to your Kestra namespace.embeddings_url pointing at your embedding job's JSON export.disabled: false on the daily trigger.namespace property on the upsert task to keep multiple corpora separated inside one index.upsertedCount against the record count printed by the reshape step and fail the flow on a mismatch.