<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Deshu</title>
    <description>The latest articles on DEV Community by Deshu (@deshu_exe).</description>
    <link>https://dev.to/deshu_exe</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4196196%2F84b65522-f33f-4e6c-8012-14bc85d41067.png</url>
      <title>DEV Community: Deshu</title>
      <link>https://dev.to/deshu_exe</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/deshu_exe"/>
    <language>en</language>
    <item>
      <title>Ingesting Multi-Channel Notification Workflows into Cognee Knowledge Graphs with Novu</title>
      <dc:creator>Deshu</dc:creator>
      <pubDate>Tue, 20 Oct 2026 14:32:28 +0000</pubDate>
      <link>https://dev.to/deshu_exe/ingesting-multi-channel-notification-workflows-into-cognee-knowledge-graphs-with-novu-2384</link>
      <guid>https://dev.to/deshu_exe/ingesting-multi-channel-notification-workflows-into-cognee-knowledge-graphs-with-novu-2384</guid>
      <description>&lt;p&gt;Modern applications communicate with users across multiple channels, including email, SMS, push notifications, in-app messages, and chat platforms.&lt;/p&gt;

&lt;p&gt;As these systems grow, notification infrastructure becomes more complex. Workflows trigger messages, topics organize subscribers, and provider integrations handle delivery through external services.&lt;/p&gt;

&lt;p&gt;Novu provides notification infrastructure for building and managing these workflows. But as an application accumulates more notification rules and integrations, answering architectural questions becomes harder.&lt;/p&gt;

&lt;p&gt;Engineering, product, and support teams might need to know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which workflows send critical alerts through SMS or chat?&lt;/li&gt;
&lt;li&gt;Which delivery providers are configured and active?&lt;/li&gt;
&lt;li&gt;Which topics exist, and how many subscribers are associated with them?&lt;/li&gt;
&lt;li&gt;Which workflows depend on a particular provider integration?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Answering these questions often requires navigating multiple dashboards and API resources.&lt;/p&gt;

&lt;p&gt;What if an AI agent could retrieve this notification architecture from a shared knowledge graph?&lt;/p&gt;

&lt;p&gt;That's the idea behind &lt;code&gt;cognee-community-connector-novu&lt;/code&gt;, a community connector designed to synchronize Novu notification metadata into &lt;a href="https://github.com/topoteretes/cognee" rel="noopener noreferrer"&gt;Cognee&lt;/a&gt; using &lt;a href="https://dlthub.com/" rel="noopener noreferrer"&gt;dlt&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In this article, we'll explore the connector's architecture, ingestion workflow, entity representation, security considerations, and testing strategy.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Architecture: Bringing Notification Infrastructure into AI Memory
&lt;/h2&gt;

&lt;p&gt;The connector resides in the Cognee Community repository under:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;packages/connector/novu&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Its intended architecture connects three components:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Novu:&lt;/strong&gt; Provides notification workflow, topic, group, and integration metadata.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;dlt:&lt;/strong&gt; Handles structured data ingestion and synchronization.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cognee:&lt;/strong&gt; Processes ingested information for knowledge-graph and semantic retrieval.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The data flow looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Novu API
    |
    v
Novu Data-Source Connector
    |
    v
dlt Ingestion Pipeline
    |
    v
Cognee Memory Processing
    |
    v
Knowledge Graph and Search
    |
    v
AI-Assisted Notification Investigation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The goal is to make notification configuration easier to explore without manually piecing together information from multiple resources.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key engineering features
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Notification resource ingestion
&lt;/h4&gt;

&lt;p&gt;The connector is designed to ingest four categories of resources.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Workflows&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Workflow metadata describes notification behavior. Depending on the fields exposed by the connector, this might include names, descriptions, active status, tags, and delivery-channel steps such as email, SMS, push, in-app, and chat.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Topics&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Topic metadata helps identify notification categories and their associated subscriber information, where available.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Notification groups&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Group metadata provides organizational context for workflows and notification categories.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Provider integrations&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Integration metadata describes configured delivery providers, channel types, and relevant status information.&lt;/p&gt;

&lt;p&gt;Together, these resources provide a foundation for exploring how notification workflows relate to delivery infrastructure.&lt;/p&gt;

&lt;p&gt;The exact fields and relationships depend on the Novu API and the connector's current implementation.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Deterministic change detection
&lt;/h4&gt;

&lt;p&gt;Notification configurations change as teams add channels, modify workflows, or update provider settings.&lt;/p&gt;

&lt;p&gt;The connector uses canonical SHA-256 fingerprints to identify meaningful changes in supported records.&lt;/p&gt;

&lt;p&gt;The intended process is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Retrieve a resource from Novu.&lt;/li&gt;
&lt;li&gt;Normalize its relevant fields.&lt;/li&gt;
&lt;li&gt;Calculate a deterministic fingerprint.&lt;/li&gt;
&lt;li&gt;Compare it with the previously synchronized version.&lt;/li&gt;
&lt;li&gt;Skip unchanged records or process updated records.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This approach helps reduce unnecessary reprocessing during repeated synchronization.&lt;/p&gt;

&lt;p&gt;The fingerprint must include the fields that matter for synchronization. A field excluded from the fingerprint will not independently trigger an update.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Deletion detection and reconciliation
&lt;/h4&gt;

&lt;p&gt;Notification workflows, topics, and integrations are not permanent. When a resource is removed upstream, its downstream representation needs a cleanup strategy.&lt;/p&gt;

&lt;p&gt;The connector is designed to emit tombstones such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;_deleted&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These records communicate deletion to the downstream pipeline.&lt;/p&gt;

&lt;p&gt;The full cleanup process depends on the configured ingestion and cleanup mechanisms. Emitting a tombstone does not, by itself, guarantee removal from every relational, graph, and vector store.&lt;/p&gt;

&lt;h4&gt;
  
  
  4. Credential-safe ingestion
&lt;/h4&gt;

&lt;p&gt;Notification providers often require credentials, including email API keys, SMS authentication tokens, and chat webhook secrets.&lt;/p&gt;

&lt;p&gt;The connector describes a redaction strategy intended to prevent sensitive credential values from entering Cognee documents.&lt;/p&gt;

&lt;p&gt;For example, a provider integration might be represented as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Type: Novu Integration Provider
Provider ID: sendgrid
Channel Type: email
Status: Active
Credentials: [Redacted &amp;amp; Protected]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This retains useful information about the integration without deliberately copying its credentials into memory.&lt;/p&gt;

&lt;p&gt;Redaction must apply consistently to every supported resource and data path. URLs, custom headers, nested credential fields, and diagnostic logs also need careful handling.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Installation and Prerequisites
&lt;/h2&gt;

&lt;p&gt;The connector is distributed as a community package within the Cognee Community repository.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Python 3.10 or a version supported by the package.&lt;/li&gt;
&lt;li&gt;A Novu API key with permissions for the resources being ingested.&lt;/li&gt;
&lt;li&gt;Cognee and the connector's dependencies.&lt;/li&gt;
&lt;li&gt;Access to the Cognee Community repository.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 1: Clone the repository
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/topoteretes/cognee-community.git
&lt;span class="nb"&gt;cd &lt;/span&gt;cognee-community
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Install the connector
&lt;/h3&gt;

&lt;p&gt;Using &lt;code&gt;uv&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uv pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; packages/connector/novu
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run this command inside an appropriately configured Python environment.&lt;/p&gt;

&lt;p&gt;Check the package metadata and repository instructions for the supported Python and dependency versions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Configure your API key
&lt;/h3&gt;

&lt;p&gt;Set your Novu API key through an environment variable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;NOVU_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"your-novu-api-key"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Keep credentials out of source control. For production deployments, use a secrets manager or another approved credential-management mechanism.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Quickstart: Ingesting Notification Metadata into Cognee
&lt;/h2&gt;

&lt;p&gt;The following example illustrates the intended workflow: configure the connector, ingest notification resources, process the dataset, and query the resulting memory.&lt;/p&gt;

&lt;p&gt;Verify the current connector and Cognee API signatures against the repository before running the example.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;cognee&lt;/span&gt;

&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;cognee_community_connector_novu&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;novu&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;NOVU_REMEMBER_KWARGS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;NOVU_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="n"&gt;source&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;novu&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;include&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;workflows&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;topics&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;notification_groups&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;integrations&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;dataset_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;notification_infrastructure&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Ingesting Novu notification infrastructure...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;cognee&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;remember&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;dataset_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;dataset_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;NOVU_REMEMBER_KWARGS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Processing the knowledge graph...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;cognee&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cognify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataset_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;dataset_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Which workflows send alerts through SMS or chat, &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;and which delivery providers are active?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;Querying: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;cognee&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;search_text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;dataset_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;dataset_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;[&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;] &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  What does this workflow do?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Configure the source.&lt;/strong&gt; The connector reads the API key from the environment and selects the supported resource types.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ingest the metadata.&lt;/strong&gt; &lt;code&gt;cognee.remember()&lt;/code&gt; sends the selected resources through the configured ingestion workflow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Process the memory.&lt;/strong&gt; &lt;code&gt;cognee.cognify()&lt;/code&gt; performs the graph-processing step for the dataset.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Query the notification architecture.&lt;/strong&gt; The search asks which workflows use SMS or chat and which providers are active.&lt;/p&gt;

&lt;p&gt;The results depend on the resource fields ingested, the relationships extracted, and the installed versions of the connector and Cognee.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example questions to explore
&lt;/h3&gt;

&lt;p&gt;After ingestion and memory processing complete successfully, try questions such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which workflows include SMS delivery steps?&lt;/li&gt;
&lt;li&gt;Which workflows use chat notifications?&lt;/li&gt;
&lt;li&gt;Which provider integrations are marked active?&lt;/li&gt;
&lt;li&gt;Which topics have the largest subscriber counts, if those counts are available?&lt;/li&gt;
&lt;li&gt;Which workflows reference a particular notification group?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These examples illustrate potential use cases. Each query requires the corresponding information to exist in the ingested records or extracted graph.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Entity Types and Representation
&lt;/h2&gt;

&lt;p&gt;The connector organizes notification resources into structured documents for downstream processing.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Entity type&lt;/th&gt;
&lt;th&gt;Example document title&lt;/th&gt;
&lt;th&gt;Useful context&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Workflow&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Novu Workflow: Password Reset [Active]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Workflow ID, name, description, steps, tags, status&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Topic&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Novu Topic: Security Alerts&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Topic key, name, available subscriber information&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Group&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Novu Group: Authentication&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Group ID and name&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Integration&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Novu Integration: Sendgrid (email) [Active]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Provider ID, channel type, status, primary configuration&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These examples illustrate a possible representation. Actual document titles and available fields depend on the connector implementation.&lt;/p&gt;

&lt;p&gt;A shared representation makes it easier to search for related notification resources and explore their relationships.&lt;/p&gt;

&lt;p&gt;For example, an engineer investigating a password-reset notification might want to identify the workflow, inspect its delivery channels, and determine which provider handles the relevant integration.&lt;/p&gt;

&lt;p&gt;Whether those connections are available in a useful form depends on the metadata ingested and the relationships created during graph processing.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Security: Protecting Provider Credentials
&lt;/h2&gt;

&lt;p&gt;Notification integrations often store credentials required to send email, SMS, push notifications, or chat messages.&lt;/p&gt;

&lt;p&gt;Consider a provider payload containing an API key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Illustrative payload only. Never use real credentials in examples.
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;providerId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sendgrid&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;credentials&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;apiKey&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;example-secret&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The intended memory representation excludes the sensitive value:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Type: Novu Integration Provider
Provider ID: sendgrid
Channel Type: email
Credentials: [Redacted &amp;amp; Protected]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A robust implementation should:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Redact credentials before generating documents.&lt;/li&gt;
&lt;li&gt;Handle nested credential fields consistently.&lt;/li&gt;
&lt;li&gt;Avoid exposing secrets in debug logs or error messages.&lt;/li&gt;
&lt;li&gt;Review webhook URLs and custom headers for embedded tokens.&lt;/li&gt;
&lt;li&gt;Test redaction across every supported resource type.&lt;/li&gt;
&lt;li&gt;Restrict access to the resulting Cognee dataset.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These controls reduce exposure, but a redaction policy should not be described as an absolute guarantee without reviewing and testing the full implementation.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Offline Testing and Verification
&lt;/h2&gt;

&lt;p&gt;The project describes a 38-test offline suite that uses an in-memory mock client rather than making live external HTTP requests.&lt;/p&gt;

&lt;p&gt;The reported coverage includes resource ingestion, synchronization, credential redaction, and deletion handling.&lt;/p&gt;

&lt;p&gt;Run the test suite with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pytest packages/connector/novu/tests &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check linting:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; ruff check packages/connector/novu
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check formatting:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; ruff format &lt;span class="nt"&gt;--check&lt;/span&gt; packages/connector/novu
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The reported result is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;38 tests passed in under 35 seconds
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Treat this as the project's reported result until you reproduce it against the relevant commit.&lt;/p&gt;

&lt;p&gt;Offline tests provide repeatable coverage of the behaviors they exercise. They do not replace integration testing against Novu or verification of the complete downstream memory-processing and cleanup workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Engineering Lessons
&lt;/h2&gt;

&lt;p&gt;This connector highlights several principles for building reliable AI integrations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Model relationships, not just records.&lt;/strong&gt; Workflow, topic, group, and integration metadata become more useful when their relationships are available to the retrieval system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Track meaningful changes.&lt;/strong&gt; Deterministic fingerprints help identify updates and reduce unnecessary reprocessing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Treat deletion as an explicit workflow.&lt;/strong&gt; Upstream removal does not automatically erase downstream representations. Tombstones and cleanup operations need separate verification.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Minimize sensitive data.&lt;/strong&gt; Store the information needed for retrieval without copying provider credentials into documents or indexes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keep operational claims grounded in source data.&lt;/strong&gt; Knowing that a provider is configured does not prove successful message delivery. Delivery outcomes require appropriate delivery-status or event data.&lt;/p&gt;

&lt;p&gt;These principles apply to notification systems, communication platforms, event-driven applications, and other infrastructure managed through APIs.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Project Links
&lt;/h2&gt;

&lt;p&gt;Explore the connector and its implementation in the &lt;a href="https://github.com/topoteretes/cognee-community" rel="noopener noreferrer"&gt;Cognee Community repository&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The connector package is located at:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;packages/connector/novu&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Review the source code and tests for current API support, available resource fields, credential handling, and synchronization behavior.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Connecting Novu to Cognee offers a path toward making notification infrastructure easier to explore through natural-language queries.&lt;/p&gt;

&lt;p&gt;The potential value comes from connecting workflow definitions, delivery channels, topics, and provider configurations in one searchable memory system.&lt;/p&gt;

&lt;p&gt;The difficult engineering work is keeping this context accurate, secure, and synchronized as the application evolves.&lt;/p&gt;

&lt;p&gt;If you were building an AI agent for notification infrastructure, what would you integrate next: delivery events, subscriber preferences, message templates, or incident-management data?&lt;/p&gt;

&lt;p&gt;Share your thoughts in the comments.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>opensource</category>
      <category>notations</category>
    </item>
    <item>
      <title>Mapping Distributed Webhook Architectures and Event Schemas into Cognee with Svix</title>
      <dc:creator>Deshu</dc:creator>
      <pubDate>Tue, 20 Oct 2026 14:29:50 +0000</pubDate>
      <link>https://dev.to/deshu_exe/mapping-distributed-webhook-architectures-and-event-schemas-into-cognee-with-svix-3b78</link>
      <guid>https://dev.to/deshu_exe/mapping-distributed-webhook-architectures-and-event-schemas-into-cognee-with-svix-3b78</guid>
      <description>&lt;p&gt;Modern cloud applications rely on asynchronous events to communicate across services. Payments, user registrations, subscription changes, and background jobs often trigger webhooks that connect applications to external systems.&lt;/p&gt;

&lt;p&gt;Platforms such as Svix help developers manage webhook applications, endpoint subscriptions, and event delivery infrastructure.&lt;/p&gt;

&lt;p&gt;But as an event-driven architecture grows, understanding its topology becomes harder.&lt;/p&gt;

&lt;p&gt;Engineers might need to answer questions such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which endpoints subscribe to &lt;code&gt;invoice.payment_failed&lt;/code&gt;?&lt;/li&gt;
&lt;li&gt;Which applications have disabled webhook endpoints?&lt;/li&gt;
&lt;li&gt;What is the potential impact of changing the &lt;code&gt;user.created&lt;/code&gt; event schema?&lt;/li&gt;
&lt;li&gt;Which endpoints are configured to receive billing events?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Finding these answers often requires switching between dashboards, API responses, and application documentation.&lt;/p&gt;

&lt;p&gt;What if an AI agent could retrieve this information from a shared knowledge graph?&lt;/p&gt;

&lt;p&gt;That's the idea behind &lt;code&gt;cognee-community-connector-svix&lt;/code&gt;, a community connector designed to ingest Svix webhook infrastructure into &lt;a href="https://github.com/topoteretes/cognee" rel="noopener noreferrer"&gt;Cognee&lt;/a&gt; using &lt;a href="https://dlthub.com/" rel="noopener noreferrer"&gt;dlt&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In this article, we'll explore the connector's architecture, ingestion workflow, data representation, security considerations, and testing strategy.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Architecture: From Webhook Infrastructure to AI Memory
&lt;/h2&gt;

&lt;p&gt;The connector lives in the Cognee Community repository under:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;packages/connector/svix&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Its intended architecture connects three components:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Svix:&lt;/strong&gt; Provides webhook application, endpoint, and event-type metadata.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;dlt:&lt;/strong&gt; Handles structured ingestion and synchronization.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cognee:&lt;/strong&gt; Processes ingested information for knowledge-graph and semantic retrieval.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The data flow looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Svix REST API
     |
     v
Svix Data-Source Connector
     |
     v
dlt Ingestion Pipeline
     |
     v
Cognee Memory Processing
     |
     v
Knowledge Graph and Search
     |
     v
AI-Assisted Architecture Investigation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The goal is to make webhook relationships easier to investigate without manually reconstructing the topology from multiple resources.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key engineering features
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Application, endpoint, and event-type ingestion
&lt;/h4&gt;

&lt;p&gt;The connector is designed to ingest three resource categories.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Applications&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Application metadata provides context about the services or tenants associated with webhook infrastructure. Depending on the source fields, this might include application IDs, names, UIDs, creation timestamps, and rate-limit settings.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Endpoints&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Endpoint metadata describes webhook destinations and their configuration. Relevant fields might include target URLs, descriptions, versions, subscription settings, and active or disabled status.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Event types&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Event-type metadata describes the events applications produce, including their names, descriptions, status, and available schema information.&lt;/p&gt;

&lt;p&gt;Together, these resources provide a foundation for exploring how event producers and consumers relate to each other.&lt;/p&gt;

&lt;p&gt;The exact fields available depend on the Svix API responses and the connector's implementation.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Deterministic change detection
&lt;/h4&gt;

&lt;p&gt;Webhook configurations evolve. Endpoints get disabled, subscriptions change, and event definitions are updated.&lt;/p&gt;

&lt;p&gt;The connector uses canonical SHA-256 fingerprints to identify meaningful changes in supported records.&lt;/p&gt;

&lt;p&gt;The intended process is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Retrieve a resource from Svix.&lt;/li&gt;
&lt;li&gt;Normalize its relevant fields.&lt;/li&gt;
&lt;li&gt;Compute a deterministic fingerprint.&lt;/li&gt;
&lt;li&gt;Compare the result with the previously synchronized version.&lt;/li&gt;
&lt;li&gt;Skip unchanged records or process updated ones.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This approach helps reduce unnecessary reprocessing during repeated synchronization.&lt;/p&gt;

&lt;p&gt;Fingerprinting works only for fields included in the fingerprint calculation. Those fields should reflect the changes that matter to downstream memory.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Deletion detection and reconciliation
&lt;/h4&gt;

&lt;p&gt;An application or endpoint removed from Svix should not remain indefinitely in downstream memory.&lt;/p&gt;

&lt;p&gt;The connector is designed to emit tombstones for deleted resources:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;_deleted&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These records communicate deletion to the downstream pipeline.&lt;/p&gt;

&lt;p&gt;The full cleanup process still depends on the configured ingestion and cleanup mechanisms. Tombstone emission alone does not guarantee that every corresponding record has been removed from relational, graph, and vector storage.&lt;/p&gt;

&lt;h4&gt;
  
  
  4. Secret-safe ingestion
&lt;/h4&gt;

&lt;p&gt;Webhook infrastructure contains sensitive configuration, including signing secrets and custom authorization headers.&lt;/p&gt;

&lt;p&gt;The connector describes a redaction policy intended to replace sensitive values before documents enter Cognee memory.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Endpoint Secret: [Redacted &amp;amp; Protected]
Custom Headers: [Redacted &amp;amp; Protected]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This preserves useful information about the configuration while avoiding unnecessary exposure of credentials.&lt;/p&gt;

&lt;p&gt;Redaction must cover every relevant ingestion path. Target URLs also require care because query parameters sometimes contain tokens or other sensitive values.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Installation and Prerequisites
&lt;/h2&gt;

&lt;p&gt;The connector is distributed as a community package within the Cognee Community repository.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Python 3.10 or a version supported by the current package.&lt;/li&gt;
&lt;li&gt;A Svix API token with the permissions required for the resources being ingested.&lt;/li&gt;
&lt;li&gt;Cognee and the connector's dependencies.&lt;/li&gt;
&lt;li&gt;Access to the Cognee Community repository.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 1: Clone the repository
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/topoteretes/cognee-community.git
&lt;span class="nb"&gt;cd &lt;/span&gt;cognee-community
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Install the connector
&lt;/h3&gt;

&lt;p&gt;Using &lt;code&gt;uv&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uv pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; packages/connector/svix
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run this command inside an appropriately configured Python environment.&lt;/p&gt;

&lt;p&gt;Check the connector's package metadata and installation instructions for its supported Python and dependency versions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Configure your API token
&lt;/h3&gt;

&lt;p&gt;Set your Svix API token as an environment variable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;SVIX_API_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"your-svix-api-token"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Keep credentials out of source control. For production deployments, use a secrets manager or another approved credential-management mechanism.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Quickstart: Ingesting Webhook Topology into Cognee
&lt;/h2&gt;

&lt;p&gt;The following example illustrates the intended integration: configure the source, ingest the resources, process the dataset, and query the resulting memory.&lt;/p&gt;

&lt;p&gt;Verify the connector and Cognee API signatures against the current implementation before running it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;cognee&lt;/span&gt;

&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;cognee_community_connector_svix&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;svix&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;SVIX_REMEMBER_KWARGS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;api_token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SVIX_API_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="n"&gt;source&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;svix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;api_token&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;api_token&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;include&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;applications&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;endpoints&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;event_types&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="n"&gt;include_archived_events&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;dataset_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;webhook_architecture&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Ingesting Svix webhook infrastructure...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;cognee&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;remember&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;dataset_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;dataset_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;SVIX_REMEMBER_KWARGS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Processing knowledge graph...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;cognee&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cognify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataset_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;dataset_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Which endpoints are subscribed to billing events, &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;and are any of them currently disabled?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;Querying: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;cognee&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;search_text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;dataset_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;dataset_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;[&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;] &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  What does the workflow do?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Configure the source.&lt;/strong&gt; The connector reads the API token from the environment and selects applications, endpoints, and event types.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ingest the metadata.&lt;/strong&gt; &lt;code&gt;cognee.remember()&lt;/code&gt; sends the selected resources through the configured ingestion workflow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Process the memory.&lt;/strong&gt; &lt;code&gt;cognee.cognify()&lt;/code&gt; performs the graph-processing step for the dataset.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Query the topology.&lt;/strong&gt; The search asks which endpoints receive billing events and whether any are disabled.&lt;/p&gt;

&lt;p&gt;The results depend on the fields ingested, the relationships extracted, and the installed versions of the connector and Cognee.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example questions to explore
&lt;/h3&gt;

&lt;p&gt;After the ingestion pipeline completes successfully, try questions such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which endpoints are associated with billing events?&lt;/li&gt;
&lt;li&gt;Which endpoint configurations are disabled?&lt;/li&gt;
&lt;li&gt;Which event types are marked as archived?&lt;/li&gt;
&lt;li&gt;Which applications have configured rate limits?&lt;/li&gt;
&lt;li&gt;What endpoint metadata is available for a particular event type?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These examples demonstrate potential use cases. The connector must ingest the relevant fields and preserve the necessary relationships for each query to produce reliable answers.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Entity Types and Representation
&lt;/h2&gt;

&lt;p&gt;The connector organizes webhook resources into structured documents suitable for downstream processing.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Entity type&lt;/th&gt;
&lt;th&gt;Example document title&lt;/th&gt;
&lt;th&gt;Useful context&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Application&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Svix App: Billing Service&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Application ID, UID, creation time, available rate-limit metadata&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Endpoint&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Svix Endpoint: Stripe Webhook [Active]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Target URL, description, version, subscription metadata, status&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Event type&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Svix Event: invoice.paid [Active]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Event name, description, status, available schema information&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These titles illustrate a possible representation. Actual titles and extracted properties depend on the implementation.&lt;/p&gt;

&lt;p&gt;The broader goal is to make related resources easier to find and connect.&lt;/p&gt;

&lt;p&gt;For example, an engineer investigating a billing event might want to identify the relevant application, inspect its endpoint configurations, and review the event's available schema metadata.&lt;/p&gt;

&lt;p&gt;Whether those connections are queryable depends on the records ingested and the graph relationships created during processing.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Security: Protecting Webhook Signing Secrets
&lt;/h2&gt;

&lt;p&gt;Svix webhook signing secrets are used by consumers to verify webhook signatures. Exposing them in a knowledge graph or vector store would create unnecessary risk.&lt;/p&gt;

&lt;p&gt;Consider an endpoint payload containing a signing secret:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Illustrative payload only. Never use real credentials in examples.
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.partner.com/webhook&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;secret&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;example-signing-secret&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The intended memory representation excludes the secret:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Type: Svix Webhook Endpoint
Target URL: https://api.partner.com/webhook
Endpoint Secret: [Redacted &amp;amp; Protected]
Custom Headers: [Redacted &amp;amp; Protected]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A robust implementation should:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Remove signing secrets before document generation.&lt;/li&gt;
&lt;li&gt;Avoid indexing sensitive custom-header values.&lt;/li&gt;
&lt;li&gt;Review target URLs for embedded credentials or sensitive query parameters.&lt;/li&gt;
&lt;li&gt;Keep API tokens outside source control.&lt;/li&gt;
&lt;li&gt;Test redaction across every supported resource type.&lt;/li&gt;
&lt;li&gt;Check generated documents and logs for accidental exposure.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Redaction should happen before sensitive values enter the downstream document and embedding pipeline.&lt;/p&gt;

&lt;p&gt;These controls reduce risk, but they should not be described as an absolute guarantee unless the full implementation has been reviewed and tested.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Offline Testing and Verification
&lt;/h2&gt;

&lt;p&gt;The project describes a 39-test offline suite that uses an in-memory mock client rather than making live external HTTP requests.&lt;/p&gt;

&lt;p&gt;The reported test areas include ingestion behavior, resource handling, change detection, deletion signals, and secret redaction.&lt;/p&gt;

&lt;p&gt;Run the test suite with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pytest packages/connector/svix/tests &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check linting:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; ruff check packages/connector/svix
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check formatting:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; ruff format &lt;span class="nt"&gt;--check&lt;/span&gt; packages/connector/svix
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The reported result is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;39 tests passed in under 25 seconds
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Treat this as the project's reported result until you reproduce it against the relevant commit.&lt;/p&gt;

&lt;p&gt;Offline tests provide repeatable coverage of the scenarios they exercise. They do not replace integration tests against the Svix API or verification of the complete downstream deletion and memory-processing workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Engineering Lessons
&lt;/h2&gt;

&lt;p&gt;This connector highlights several principles that apply to AI integrations for event-driven systems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Model relationships, not just records.&lt;/strong&gt; Application, endpoint, and event metadata become more useful when their relationships are available to the retrieval system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Track meaningful changes.&lt;/strong&gt; Deterministic fingerprints help identify updates without repeatedly processing unchanged records.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Treat deletion as an explicit workflow.&lt;/strong&gt; Upstream removal does not automatically erase downstream representations. Tombstones and cleanup need their own verification.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Minimize sensitive data.&lt;/strong&gt; Signing secrets and authorization values should never be included in memory documents when they are unnecessary for retrieval.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keep schema claims grounded.&lt;/strong&gt; Understanding the impact of an event-schema change requires the relevant schema versions and consumer relationships. A list of event names alone is insufficient to determine the full blast radius.&lt;/p&gt;

&lt;p&gt;These principles apply to webhook platforms, event brokers, message queues, and other distributed integration systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Project Links
&lt;/h2&gt;

&lt;p&gt;Explore the connector and its implementation in the &lt;a href="https://github.com/topoteretes/cognee-community" rel="noopener noreferrer"&gt;Cognee Community repository&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The connector package is located at:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;packages/connector/svix&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Review the source code and tests for the current API support, resource fields, redaction rules, and synchronization behavior.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Connecting Svix to Cognee offers a path toward making webhook infrastructure easier to explore through natural-language queries.&lt;/p&gt;

&lt;p&gt;The value comes from combining application metadata, endpoint configuration, event definitions, and reliable synchronization in one searchable memory system.&lt;/p&gt;

&lt;p&gt;The difficult engineering work is ensuring that this context remains accurate, useful, and secure as the underlying architecture changes.&lt;/p&gt;

&lt;p&gt;If you were building an AI agent for distributed systems, which integration would you add next: message queues, event brokers, API gateways, or distributed tracing?&lt;/p&gt;

&lt;p&gt;Share your thoughts in the comments.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>opensource</category>
      <category>devops</category>
    </item>
    <item>
      <title>Ingesting Real-Time Website Uptime and Incident Telemetry into Cognee with UptimeRobot</title>
      <dc:creator>Deshu</dc:creator>
      <pubDate>Tue, 20 Oct 2026 14:27:01 +0000</pubDate>
      <link>https://dev.to/deshu_exe/ingesting-real-time-website-uptime-and-incident-telemetry-into-cognee-with-uptimerobot-2iak</link>
      <guid>https://dev.to/deshu_exe/ingesting-real-time-website-uptime-and-incident-telemetry-into-cognee-with-uptimerobot-2iak</guid>
      <description>&lt;p&gt;When a production service goes down, site reliability engineers (SREs), incident commanders, and on-call responders need answers quickly.&lt;/p&gt;

&lt;p&gt;They need to know which monitors are failing, whether maintenance explains the disruption, which alert contacts are configured, and how reliable the affected service has been over time.&lt;/p&gt;

&lt;p&gt;Questions often include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which monitored endpoints are currently down?&lt;/li&gt;
&lt;li&gt;Is the outage related to a scheduled maintenance window?&lt;/li&gt;
&lt;li&gt;Which alert contacts are configured for the affected monitors?&lt;/li&gt;
&lt;li&gt;What historical uptime information is available for the degraded service?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Monitoring dashboards provide essential operational data, but investigating an incident often means switching between multiple pages and systems.&lt;/p&gt;

&lt;p&gt;What if an AI agent could retrieve relevant monitoring metadata from a knowledge graph and use it to help investigate these questions?&lt;/p&gt;

&lt;p&gt;That's the idea behind &lt;code&gt;cognee-community-connector-uptimerobot&lt;/code&gt;, a community connector designed to bring UptimeRobot monitoring data into &lt;a href="https://github.com/topoteretes/cognee" rel="noopener noreferrer"&gt;Cognee&lt;/a&gt; using &lt;a href="https://dlthub.com/" rel="noopener noreferrer"&gt;dlt&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In this article, we'll explore the connector's architecture, ingestion workflow, security considerations, and offline testing strategy.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Architecture: Bringing UptimeRobot Data into AI Memory
&lt;/h2&gt;

&lt;p&gt;The UptimeRobot connector integrates the monitoring platform's API with Cognee's data ingestion and memory-processing workflow.&lt;/p&gt;

&lt;p&gt;The intended architecture is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;UptimeRobot API v2
        |
        v
UptimeRobot Data-Source Connector
        |
        v
dlt Ingestion Pipeline
        |
        v
Cognee Memory Processing
        |
        v
Knowledge Graph and Search
        |
        v
AI-Assisted Incident Investigation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The connector is designed to ingest four categories of monitoring resources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Monitors:&lt;/strong&gt; Endpoint monitoring configuration and available status information.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Public status pages:&lt;/strong&gt; Public-facing service status metadata.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alert contacts:&lt;/strong&gt; Configured notification contacts and channel information.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maintenance windows:&lt;/strong&gt; Scheduled maintenance configuration.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The connector uses UptimeRobot API v2 endpoints, including &lt;code&gt;/getMonitors&lt;/code&gt;, &lt;code&gt;/getPSPs&lt;/code&gt;, &lt;code&gt;/getAlertContacts&lt;/code&gt;, and &lt;code&gt;/getMWindows&lt;/code&gt;, according to the described implementation.&lt;/p&gt;

&lt;p&gt;The exact fields and resource coverage depend on the API responses and the connector's current implementation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key engineering features
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Deterministic change detection
&lt;/h4&gt;

&lt;p&gt;Repeatedly processing unchanged monitoring records wastes resources and introduces unnecessary updates.&lt;/p&gt;

&lt;p&gt;The connector uses canonical SHA-256 fingerprints to identify changes in supported entity records.&lt;/p&gt;

&lt;p&gt;The intended behavior is straightforward:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Retrieve the upstream resource.&lt;/li&gt;
&lt;li&gt;Normalize its relevant fields.&lt;/li&gt;
&lt;li&gt;Calculate a deterministic fingerprint.&lt;/li&gt;
&lt;li&gt;Compare it with the previously synchronized version.&lt;/li&gt;
&lt;li&gt;Skip unnecessary updates or process changed records.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For example, a monitor's configuration might remain unchanged for several synchronization cycles. Fingerprinting helps the connector identify records that do not need reprocessing.&lt;/p&gt;

&lt;p&gt;A meaningful change in a monitored resource should produce a different fingerprint, provided the changed field is included in the fingerprint calculation.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Deletion detection and reconciliation
&lt;/h4&gt;

&lt;p&gt;Monitoring resources are not permanent. A monitor might be removed, an alert contact might be deleted, or a status page might be retired.&lt;/p&gt;

&lt;p&gt;The connector is designed to emit tombstones for deleted resources:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;_deleted&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These records communicate deletion to the downstream pipeline.&lt;/p&gt;

&lt;p&gt;The complete cleanup process still depends on the configured merge behavior and Cognee's downstream cleanup mechanism. Tombstone generation alone does not guarantee that every stale record disappears from relational, graph, and vector storage.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Sensitive-field redaction
&lt;/h4&gt;

&lt;p&gt;Monitoring configurations sometimes contain HTTP Basic Authentication credentials or webhook URLs with sensitive query parameters.&lt;/p&gt;

&lt;p&gt;The connector describes a redaction strategy that replaces sensitive values before generating memory documents.&lt;/p&gt;

&lt;p&gt;For example, an authenticated monitor might be represented as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Type: HTTP Monitor
Name: Internal Vault API
Target URL: https://vault.internal.net/health
HTTP Authentication: [Redacted &amp;amp; Protected]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The goal is to retain useful operational context without exposing authentication values.&lt;/p&gt;

&lt;p&gt;Webhook URLs require particular care because secrets might appear in their paths or query parameters. A robust implementation should redact sensitive components rather than assume every URL is safe to store.&lt;/p&gt;

&lt;p&gt;The redaction policy should be tested across every supported resource type and data path before production use.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Installation and Prerequisites
&lt;/h2&gt;

&lt;p&gt;The connector is distributed within the Cognee Community repository.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Python 3.10 or a version supported by the current package.&lt;/li&gt;
&lt;li&gt;An UptimeRobot API key with the permissions required for the selected resources.&lt;/li&gt;
&lt;li&gt;Cognee and the connector's dependencies.&lt;/li&gt;
&lt;li&gt;Access to the Cognee Community repository.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 1: Clone the repository
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/topoteretes/cognee-community.git
&lt;span class="nb"&gt;cd &lt;/span&gt;cognee-community
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Install the connector
&lt;/h3&gt;

&lt;p&gt;Using &lt;code&gt;uv&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uv pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; packages/connector/uptimerobot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run this inside an environment where the required Python dependencies are installed.&lt;/p&gt;

&lt;p&gt;Check the connector's package metadata and repository instructions for the supported Python version and dependency setup.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Configure the API key
&lt;/h3&gt;

&lt;p&gt;Set your UptimeRobot API key through an environment variable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;UPTIMEROBOT_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"your-uptimerobot-api-key"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use a suitable key for your environment and avoid committing credentials to source control.&lt;/p&gt;

&lt;p&gt;The connector's supported key types and required permissions should be confirmed against the current UptimeRobot API and implementation.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Quickstart: Ingesting Monitoring Data into Cognee
&lt;/h2&gt;

&lt;p&gt;The following example demonstrates the intended workflow: configure the source, ingest monitoring resources, process the dataset, and ask an operational question.&lt;/p&gt;

&lt;p&gt;Verify the connector's current API signatures before running the example.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;cognee&lt;/span&gt;

&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;cognee_community_connector_uptimerobot&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;uptimerobot&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;UPTIMEROBOT_REMEMBER_KWARGS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;UPTIMEROBOT_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="n"&gt;source&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;uptimerobot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;include&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;monitors&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;public_status_pages&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;alert_contacts&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;maintenance_windows&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="n"&gt;only_down&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;dataset_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;production_infrastructure&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Ingesting UptimeRobot telemetry into Cognee...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;cognee&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;remember&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;dataset_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;dataset_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;UPTIMEROBOT_REMEMBER_KWARGS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Processing the knowledge graph...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;cognee&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cognify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataset_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;dataset_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;List the monitors that are currently down, &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;their available historical uptime metrics, &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;and their configured alert contacts.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;Querying: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;cognee&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;search_text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;dataset_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;dataset_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;[&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;] &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  What does this workflow do?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;First, it configures the source.&lt;/strong&gt; The connector reads the API key from the environment and selects the monitoring resource types to ingest.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Next, it ingests the data.&lt;/strong&gt; &lt;code&gt;cognee.remember()&lt;/code&gt; passes the source through the configured ingestion workflow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Then, it processes the memory.&lt;/strong&gt; &lt;code&gt;cognee.cognify()&lt;/code&gt; performs the graph-processing step for the selected dataset.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Finally, it runs a query.&lt;/strong&gt; The search asks for current monitor status, available historical uptime information, and configured alert contacts.&lt;/p&gt;

&lt;p&gt;The exact behavior of the search API depends on the installed Cognee version. Confirm the supported arguments and result structure before deploying the script.&lt;/p&gt;

&lt;p&gt;Also, ingestion does not guarantee that every requested metric is available. The query can return only information that the API exposes, the connector ingests, and the memory pipeline successfully processes.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Entity Types and Representation
&lt;/h2&gt;

&lt;p&gt;The connector organizes monitoring resources into human-readable documents that are intended for embedding and entity extraction.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Entity type&lt;/th&gt;
&lt;th&gt;Example document title&lt;/th&gt;
&lt;th&gt;Potentially useful context&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Monitor&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Monitor: Auth Gateway [UP]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Status, target, port, interval, available uptime metrics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Public status page&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Status Page: Global Status [Active]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Page URL, custom domain, associated monitors&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Alert contact&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Alert Contact: DevOps Pager&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Contact type, configured status&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Maintenance window&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Maintenance Window: Weekly DB Backup&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Schedule, duration, recurrence configuration&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The examples above illustrate a possible representation. The exact field names and title formats depend on the implementation.&lt;/p&gt;

&lt;p&gt;This structured context helps an AI agent connect related information across monitoring resources.&lt;/p&gt;

&lt;p&gt;For example, an agent might retrieve a monitor and its configured alert contact in the same investigation. Whether the relationship is available in a useful form depends on the records ingested and the graph-processing behavior.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Security: Protecting Credentials and Webhook Secrets
&lt;/h2&gt;

&lt;p&gt;Monitoring integrations often handle data that should not be exposed to downstream memory systems.&lt;/p&gt;

&lt;p&gt;Consider a monitor configuration containing HTTP authentication:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Illustrative source payload, not a real credential.
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;friendly_name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Internal Vault API&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http_username&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;example-user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http_password&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;example-password&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The intended memory representation excludes the authentication values:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Type: HTTP Monitor
Name: Internal Vault API
HTTP Authentication: [Redacted &amp;amp; Protected]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This approach preserves useful context about the configuration without storing the credentials themselves.&lt;/p&gt;

&lt;p&gt;Webhook URLs need similar treatment. A URL might contain a token in its path or query string, so the connector should avoid indexing the raw value when it contains sensitive information.&lt;/p&gt;

&lt;p&gt;For production deployments, consider these safeguards:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keep API keys in environment variables or a secrets manager.&lt;/li&gt;
&lt;li&gt;Test redaction for every resource type.&lt;/li&gt;
&lt;li&gt;Check generated documents and logs for accidental credential exposure.&lt;/li&gt;
&lt;li&gt;Review URL handling, including query parameters and embedded credentials.&lt;/li&gt;
&lt;li&gt;Restrict access to the resulting Cognee dataset.&lt;/li&gt;
&lt;li&gt;Rotate credentials if exposure is suspected.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Redaction tests increase confidence in the intended behavior. They do not prove that secrets are impossible to expose through every untested code path.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Offline Testing and Verification
&lt;/h2&gt;

&lt;p&gt;The project describes a 43-test offline unit and integration test suite that uses a mock client instead of relying on live external API calls.&lt;/p&gt;

&lt;p&gt;The reported coverage includes API behavior, data normalization, redaction, state synchronization, and deletion handling.&lt;/p&gt;

&lt;p&gt;Run the connector's tests with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pytest packages/connector/uptimerobot/tests &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run the lint checks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; ruff check packages/connector/uptimerobot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify formatting:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; ruff format &lt;span class="nt"&gt;--check&lt;/span&gt; packages/connector/uptimerobot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The reported result is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;43 tests passed in under 25 seconds
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Treat this as the project's reported result until you reproduce it against the relevant commit.&lt;/p&gt;

&lt;p&gt;Offline tests help make connector behavior repeatable without network dependencies. They do not replace integration tests against the actual UptimeRobot API or validation of the complete Cognee ingestion and cleanup pipeline.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Engineering Lessons
&lt;/h2&gt;

&lt;p&gt;This connector highlights several principles that apply to AI-powered observability integrations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Synchronize changes, not just snapshots.&lt;/strong&gt; Monitoring metadata evolves. Deterministic fingerprints help identify changed records and reduce redundant processing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Treat deletion as a separate workflow.&lt;/strong&gt; A deleted source record does not automatically disappear from downstream storage. Tombstones and cleanup operations require explicit verification.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Minimize sensitive data.&lt;/strong&gt; Ingest the information needed for useful retrieval without unnecessarily copying credentials into memory.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keep metrics grounded in source data.&lt;/strong&gt; Historical uptime calculations require the appropriate source fields and reporting period. Do not infer a 30-day uptime ratio when the underlying data is unavailable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keep live monitoring authoritative.&lt;/strong&gt; Knowledge graphs provide context, but time-sensitive incident decisions should be validated against the monitoring system.&lt;/p&gt;

&lt;p&gt;Together, these principles help make AI-assisted incident investigation more useful and more trustworthy.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Project and Repository
&lt;/h2&gt;

&lt;p&gt;Explore the connector and its implementation through the &lt;a href="https://github.com/topoteretes/cognee-community" rel="noopener noreferrer"&gt;Cognee Community repository&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The connector package is located at:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;packages/connector/uptimerobot&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Review the source code and tests for the current API support, supported resource types, redaction behavior, and deletion-handling implementation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Connecting UptimeRobot to Cognee creates a path toward AI-assisted investigations grounded in monitoring metadata.&lt;/p&gt;

&lt;p&gt;The potential value comes from bringing related information into one searchable memory system: monitor configuration, service status, alert contacts, and maintenance schedules.&lt;/p&gt;

&lt;p&gt;The engineering challenge is to keep that information secure, current, and consistent with the source system.&lt;/p&gt;

&lt;p&gt;If you were building an AI incident investigation agent, what would you integrate next: application logs, distributed traces, deployment history, or incident-management data?&lt;/p&gt;

&lt;p&gt;Share your thoughts in the comments.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>opensource</category>
      <category>sre</category>
    </item>
    <item>
      <title>Proactive Incident Intelligence: Syncing Checkly Monitoring into Cognee Memory with dlt</title>
      <dc:creator>Deshu</dc:creator>
      <pubDate>Tue, 20 Oct 2026 12:59:04 +0000</pubDate>
      <link>https://dev.to/deshu_exe/proactive-incident-intelligence-syncing-checkly-monitoring-into-cognee-memory-with-dlt-n0n</link>
      <guid>https://dev.to/deshu_exe/proactive-incident-intelligence-syncing-checkly-monitoring-into-cognee-memory-with-dlt-n0n</guid>
      <description>&lt;p&gt;Modern applications cannot afford to wait for users to report outages. Engineering teams use synthetic monitoring platforms like Checkly to test REST APIs, execute automated Playwright browser flows, and detect failures before they affect more users.&lt;/p&gt;

&lt;p&gt;But detecting an incident is only half the problem. Engineers also need context to understand what is failing, which alerts are configured, and whether maintenance windows explain the behavior.&lt;/p&gt;

&lt;p&gt;During an incident, an engineer or AI agent might need to answer questions such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which synthetic API checks or checkout flows are failing?&lt;/li&gt;
&lt;li&gt;Which alert channels notify the team about API degradation?&lt;/li&gt;
&lt;li&gt;Are the affected endpoints covered by a scheduled maintenance window?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Answering these questions often requires information from multiple resources.&lt;/p&gt;

&lt;p&gt;In this article, we explore &lt;code&gt;cognee-community-connector-checkly&lt;/code&gt;, a Checkly data-source connector developed for the Mergetober 2026 hackathon. It is designed to synchronize synthetic monitoring metadata into &lt;a href="https://github.com/topoteretes/cognee" rel="noopener noreferrer"&gt;Cognee&lt;/a&gt; using &lt;a href="https://dlthub.com/" rel="noopener noreferrer"&gt;dlt&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We'll examine its architecture, secret-safe ingestion strategy, health-status synchronization, deletion handling, and offline testing approach.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Architecture: Bringing Synthetic Monitoring into AI Memory
&lt;/h2&gt;

&lt;p&gt;The connector resides in the &lt;a href="https://github.com/topoteretes/cognee-community" rel="noopener noreferrer"&gt;Cognee Community monorepo&lt;/a&gt;, under:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;packages/connector/checkly&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Its architecture connects three components:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Checkly:&lt;/strong&gt; Supplies synthetic monitoring data and configuration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;dlt:&lt;/strong&gt; Handles structured data ingestion and incremental synchronization.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cognee:&lt;/strong&gt; Processes ingested information for knowledge-graph and semantic retrieval.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The intended data flow is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Checkly API
    |
    v
Checkly Data-Source Connector
    |
    v
dlt Ingestion Pipeline
    |
    v
Cognee Memory Processing
    |
    v
AI-Powered Incident Investigation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The goal is to give AI agents useful operational context without treating monitoring data as static documentation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Core design principles
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Secret-safe metadata ingestion
&lt;/h4&gt;

&lt;p&gt;Synthetic checks often use authenticated requests, API tokens, cookies, and basic authentication. Check groups might also contain environment variables with sensitive values.&lt;/p&gt;

&lt;p&gt;Indexing these values in a knowledge graph or vector store introduces unnecessary risk.&lt;/p&gt;

&lt;p&gt;The connector follows a key-only redaction strategy for supported headers and environment variables. Instead of storing a sensitive header value, the intended representation retains its name:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Headers (keys only): Authorization
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Likewise, environment variables are represented by their names:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Environment Variables (keys only):
STRIPE_SECRET_KEY, API_BASE_URL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This preserves structural information that helps explain a check's configuration without deliberately copying the associated values into memory.&lt;/p&gt;

&lt;p&gt;The implementation must apply this policy consistently across every ingestion path. Redaction tests help verify the behavior, but they do not replace a broader security review.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Health-status propagation
&lt;/h4&gt;

&lt;p&gt;Check definitions describe what should be monitored. Health-status data helps explain what is happening now.&lt;/p&gt;

&lt;p&gt;The connector is designed to retrieve check-status information through the &lt;code&gt;/v1/check-statuses&lt;/code&gt; endpoint and associate the results with relevant monitoring records.&lt;/p&gt;

&lt;p&gt;The intended benefit is to make health information available alongside check configuration. An AI agent could then investigate questions such as:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Which synthetic API checks are failing or degraded, and which alert channels are configured to notify the team?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The usefulness of these answers depends on the connector's status mapping, the API response, and the freshness of the latest successful synchronization.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Merge-based synchronization and deletion handling
&lt;/h4&gt;

&lt;p&gt;Monitoring resources change over time. Checks are updated, groups are removed, and temporary configurations become obsolete.&lt;/p&gt;

&lt;p&gt;The connector uses merge-based ingestion:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;write_disposition&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;merge&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It also uses a &lt;code&gt;_deleted&lt;/code&gt; tombstone mechanism with hard-delete semantics to represent upstream deletions.&lt;/p&gt;

&lt;p&gt;The intended workflow is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Detect that a resource no longer exists upstream.&lt;/li&gt;
&lt;li&gt;Emit a tombstone for the deleted resource.&lt;/li&gt;
&lt;li&gt;Pass the deletion signal into downstream cleanup.&lt;/li&gt;
&lt;li&gt;Remove stale records from the relevant storage layers.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Cognee's cleanup process must execute successfully for the deletion to propagate through relational, graph, and vector storage. Emitting a tombstone alone does not guarantee complete cleanup.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Quickstart: Integrating Checkly with Cognee
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Install the dependencies
&lt;/h3&gt;

&lt;p&gt;Install the connector and its main dependency:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;cognee cognee-community-connector-checkly
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use a virtual environment and verify the supported package versions in the repository before running the integration.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Configure your Checkly API key
&lt;/h3&gt;

&lt;p&gt;Retrieve your API key from Checkly and configure it through an environment variable.&lt;/p&gt;

&lt;p&gt;For Linux or macOS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;CHECKLY_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"your-checkly-api-key"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For an account-specific configuration, set the optional account ID:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;CHECKLY_ACCOUNT_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"your-checkly-account-id"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Keep credentials out of source control. For production deployments, use your platform's secrets manager or another approved credential-management mechanism.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Synchronize monitoring metadata
&lt;/h3&gt;

&lt;p&gt;The following example illustrates the intended integration. Verify the current connector and Cognee API signatures against the repository before running it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;cognee&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;cognee_community_connector_checkly&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;checkly_source&lt;/span&gt;


&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CHECKLY_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;account_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CHECKLY_ACCOUNT_ID&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;source&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;checkly_source&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;account_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;account_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;resource_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;checkly_prod&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;include&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;checks&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;check_groups&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;alert_channels&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;maintenance_windows&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--- Ingesting Checkly metadata ---&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;cognee&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;remember&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;dataset_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;synthetic_monitoring_memory&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;primary_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;write_disposition&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;merge&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;max_rows_per_table&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Sync stats:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cognee_sync_stats&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;--- Querying monitoring memory ---&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;cognee&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;query_text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Which synthetic API checks are failing or degraded, &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;and which alert channels notify on failure?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="n"&gt;query_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;cognee&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SearchType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GRAPH_COMPLETION&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;datasets&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;synthetic_monitoring_memory&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Monitoring insights:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This example demonstrates three main operations:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Configure the Checkly connector using environment variables.&lt;/li&gt;
&lt;li&gt;Ingest checks, groups, alert channels, and maintenance-window metadata.&lt;/li&gt;
&lt;li&gt;Query the resulting Cognee dataset using natural language.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The exact resources available depend on the connector implementation and the installed version. Confirm that each resource type is supported before using the example in production.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Ask incident-related questions
&lt;/h3&gt;

&lt;p&gt;After ingestion and memory processing complete successfully, try queries such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which synthetic API checks are failing?&lt;/li&gt;
&lt;li&gt;Which alert channels are configured for the affected checks?&lt;/li&gt;
&lt;li&gt;Which check groups contain the failing checks?&lt;/li&gt;
&lt;li&gt;Which maintenance windows overlap with the incident?&lt;/li&gt;
&lt;li&gt;What monitoring configuration is associated with the affected endpoint?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These questions illustrate how structured monitoring metadata might support AI-assisted incident investigation.&lt;/p&gt;

&lt;p&gt;One important distinction: synchronizing monitoring metadata does not automatically create a real-time incident response system. The freshness of the results depends on synchronization frequency, and critical incident decisions should be checked against authoritative monitoring data.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Comprehensive Offline Test Suite
&lt;/h2&gt;

&lt;p&gt;Reliable ingestion requires more than successful API responses. A connector must handle network failures, rate limits, changing health states, sensitive values, and deleted resources.&lt;/p&gt;

&lt;p&gt;The project reports a 45-test offline suite covering the following areas.&lt;/p&gt;

&lt;h3&gt;
  
  
  API client behavior
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Retry handling for HTTP 502 responses.&lt;/li&gt;
&lt;li&gt;Connection-drop retries.&lt;/li&gt;
&lt;li&gt;Rate-limit header parsing.&lt;/li&gt;
&lt;li&gt;Account scoping through &lt;code&gt;X-Checkly-Account&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;API token redaction.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Secret-redaction verification
&lt;/h3&gt;

&lt;p&gt;Tests use sensitive-looking values in fixtures to verify that credentials do not appear in emitted document text.&lt;/p&gt;

&lt;p&gt;Examples include:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Authorization: Bearer secret
STRIPE_SECRET_KEY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important distinction is between retaining a configuration key and retaining its sensitive value. The connector should preserve only the information required for its intended use.&lt;/p&gt;

&lt;h3&gt;
  
  
  Health-transition detection
&lt;/h3&gt;

&lt;p&gt;A synthetic check might report &lt;code&gt;HEALTHY&lt;/code&gt; during one sync and &lt;code&gt;FAILING&lt;/code&gt; during the next.&lt;/p&gt;

&lt;p&gt;The connector's fingerprinting strategy is designed to detect meaningful changes and re-emit updated records. This helps prevent AI memory from remaining stuck on an earlier state.&lt;/p&gt;

&lt;h3&gt;
  
  
  Forget-on-delete verification
&lt;/h3&gt;

&lt;p&gt;When a Checkly resource is deleted, the connector should detect the removal and emit a &lt;code&gt;_deleted=True&lt;/code&gt; tombstone.&lt;/p&gt;

&lt;p&gt;The downstream pipeline must then process that tombstone and remove the corresponding stale data.&lt;/p&gt;

&lt;h3&gt;
  
  
  SQLite-backed dlt pipeline
&lt;/h3&gt;

&lt;p&gt;The suite also describes an SQLite-backed pipeline that exercises merge behavior and hard-deletion handling across successive runs.&lt;/p&gt;

&lt;p&gt;Run the tests with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pytest packages/connector/checkly/tests &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The reported result is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;45 passed in 22.70s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the reported test result, not an independently verified result. Reproduce it against the relevant commit before presenting it as your own verified run.&lt;/p&gt;

&lt;p&gt;Offline tests provide repeatable coverage of the behaviors they exercise. They do not replace integration testing against Checkly or validation of the complete downstream cleanup pipeline.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Engineering Lessons
&lt;/h2&gt;

&lt;p&gt;This connector illustrates several principles that apply to AI integrations across monitoring and infrastructure systems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Minimize sensitive data.&lt;/strong&gt; Retain the metadata needed for retrieval without unnecessarily copying credentials into documents or indexes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Track changing operational states.&lt;/strong&gt; Monitoring data evolves. Incremental synchronization should recognize meaningful changes rather than treating every record as immutable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Design deletion handling explicitly.&lt;/strong&gt; Removing a resource from its source does not automatically remove every downstream representation. Tombstones and cleanup operations need separate verification.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Make synchronization observable.&lt;/strong&gt; Fingerprints and sync statistics help engineers understand which records changed and which were skipped.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keep operational truth authoritative.&lt;/strong&gt; AI memory helps connect related information, but live incident status should be verified against the monitoring system when decisions depend on current conditions.&lt;/p&gt;

&lt;p&gt;These principles apply to other integrations involving application logs, distributed traces, deployment systems, infrastructure inventories, and incident-management platforms.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Project Links
&lt;/h2&gt;

&lt;p&gt;The connector was developed as part of the Mergetober 2026 hackathon.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pull request:&lt;/strong&gt; &lt;a href="https://github.com/topoteretes/cognee-community/pull/447" rel="noopener noreferrer"&gt;Cognee Community PR #447&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Feature issue:&lt;/strong&gt; &lt;a href="https://github.com/topoteretes/cognee/issues/6124" rel="noopener noreferrer"&gt;Cognee Issue #6124&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Repository:&lt;/strong&gt; &lt;a href="https://github.com/topoteretes/cognee-community" rel="noopener noreferrer"&gt;Cognee Community Monorepo&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cognee:&lt;/strong&gt; &lt;a href="https://github.com/topoteretes/cognee" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Visit the pull request and repository for the implementation details, supported configuration, and current test results.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Connecting Checkly synthetic monitoring to Cognee offers a way to give AI agents more context about application reliability, monitoring configuration, and incident investigation.&lt;/p&gt;

&lt;p&gt;The difficult engineering work lies in maintaining that context safely and accurately: protecting credentials, tracking health changes, synchronizing updates, and removing deleted resources.&lt;/p&gt;

&lt;p&gt;If you were building an AI incident investigation agent, which data source would you integrate next: application logs, distributed traces, deployment history, or incident-management data?&lt;/p&gt;

&lt;p&gt;Share your thoughts in the comments.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>opensource</category>
      <category>monitoring</category>
    </item>
    <item>
      <title>Building AI Agent Memory for Prefect Workflows with Cognee and dlt</title>
      <dc:creator>Deshu</dc:creator>
      <pubDate>Tue, 20 Oct 2026 12:52:03 +0000</pubDate>
      <link>https://dev.to/deshu_exe/building-ai-agent-memory-for-prefect-workflows-with-cognee-and-dlt-58gg</link>
      <guid>https://dev.to/deshu_exe/building-ai-agent-memory-for-prefect-workflows-with-cognee-and-dlt-58gg</guid>
      <description>&lt;p&gt;Building an Intelligent Workflow Brain: Syncing Prefect Orchestration into Cognee Memory with DLT&lt;/p&gt;

&lt;p&gt;Modern data engineering and orchestration platforms manage hundreds of pipelines, scheduled deployments, and thousands of execution runs. When a midnight ETL job crashes, an engineer is often left piecing together what happened across disconnected logs, API records, and dashboards.&lt;/p&gt;

&lt;p&gt;What if your AI agents had instant, contextual memory of your entire orchestration topology?&lt;/p&gt;

&lt;p&gt;In this guide, we dive into the newly created Prefect data-source connector for Cognee&lt;br&gt;
 (cognee-community-connector-prefect), built as part of the Mergetober 2026 hackathon. We'll explore how it seamlessly bridges Prefect 2/3 orchestration metadata into Cognee's knowledge graph and vector stores using dlt, while upholding production-grade security, incremental state transitions, and forget-on-delete capabilities.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The Challenge: Orchestration Blind Spots for AI Agents&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;LLM-driven assistants and autonomous DevOps agents are only as capable as the memory backing them. While general documents and database tables are easy to ingest, workflow orchestration data introduces three unique engineering hurdles:&lt;/p&gt;

&lt;p&gt;State Dynamics: Unlike static files, a flow run is mutable. It starts as PENDING, transitions to RUNNING, and terminates as COMPLETED, FAILED, or CRASHED. A naive ingestion pipeline that only queries creation timestamps misses terminal state transitions.&lt;br&gt;
Secret Parameter Leakage: Prefect deployments and flow runs routinely accept runtime parameters—such as database passwords, connection strings, and webhook tokens. Indexing raw parameters into vector databases or knowledge graphs poses an unacceptable security risk.&lt;br&gt;
Graph Deletion &amp;amp; Drift: When obsolete flows or ephemeral testing deployments are deleted in Prefect, they must be cleanly removed from Cognee's graph and vector memory rather than lingering as orphaned hallucinations.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Architecture: How the Prefect Connector Solves This&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The cognee-community-connector-prefect package lives in the topoteretes/cognee-community&lt;br&gt;
 monorepo under packages/connector/prefect.&lt;/p&gt;

&lt;p&gt;Key Engineering Decisions:&lt;br&gt;
Strict Zero-Secret Parameter Policy: The connector parses parameters on deployments and runs, strictly rendering parameter keys only (e.g. Parameters (keys only): batch_size, target_table), ensuring zero passwords or API keys are ever committed to memory.&lt;br&gt;
Merge Disposition with Tombstones: Configured with write_disposition="merge" and columns={"_deleted": {"data_type": "bool", "hard_delete": True}}. When an entity is deleted upstream, a tombstone row is emitted, enabling Cognee's orphan_cleanup to purge it from relational, graph, and vector stores without wiping the dataset.&lt;br&gt;
Deterministic SHA-256 Fingerprints: Each record is fingerprinted across its core operational metadata. When a flow run updates from RUNNING to COMPLETED, its fingerprint shifts, prompting Cognee to re-index the updated state while untouched historical runs are skipped (stats["skipped"]).&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Step-by-Step Walkthrough
Step 1: Install Dependencies
bash
pip install cognee cognee-community-connector-prefect
Step 2: Configure Your Prefect Environment&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For a self-hosted Prefect instance:&lt;/p&gt;

&lt;p&gt;bash&lt;br&gt;
export PREFECT_API_URL="&lt;a href="http://localhost:4200/api" rel="noopener noreferrer"&gt;http://localhost:4200/api&lt;/a&gt;"&lt;/p&gt;

&lt;p&gt;For Prefect Cloud:&lt;/p&gt;

&lt;p&gt;bash&lt;br&gt;
export PREFECT_API_URL="&lt;a href="https://api.prefect.cloud/api/accounts/" rel="noopener noreferrer"&gt;https://api.prefect.cloud/api/accounts/&lt;/a&gt;/workspaces/"&lt;br&gt;
export PREFECT_API_KEY="pnu_..."&lt;br&gt;
Step 3: Ingest Orchestration Metadata with cognee.remember&lt;br&gt;
python&lt;br&gt;
import asyncio&lt;br&gt;
import os&lt;br&gt;
import cognee&lt;br&gt;
from cognee_community_connector_prefect import prefect_source&lt;br&gt;
async def main():&lt;br&gt;
    base_url = os.environ.get("PREFECT_API_URL", "&lt;a href="http://localhost:4200/api%22" rel="noopener noreferrer"&gt;http://localhost:4200/api"&lt;/a&gt;)&lt;br&gt;
    api_key = os.environ.get("PREFECT_API_KEY")&lt;br&gt;
    # Ingest flows, deployments, and execution runs into memory&lt;br&gt;
    source = prefect_source(&lt;br&gt;
        base_url=base_url,&lt;br&gt;
        api_key=api_key,&lt;br&gt;
        resource_name="prefect_main",&lt;br&gt;
        include=("flows", "deployments", "flow_runs"),&lt;br&gt;
        # Optional: filter by tags or execution states&lt;br&gt;
        flow_run_states=["COMPLETED", "FAILED", "CRASHED"],&lt;br&gt;
    )&lt;br&gt;
    print("--- Starting Prefect Ingestion ---")&lt;br&gt;
    await cognee.remember(&lt;br&gt;
        source,&lt;br&gt;
        dataset_name="orchestration_memory",&lt;br&gt;
        primary_key="id",&lt;br&gt;
        write_disposition="merge",&lt;br&gt;
        max_rows_per_table=0,&lt;br&gt;
    )&lt;br&gt;
    print("Sync Stats:", source.cognee_sync_stats)&lt;br&gt;
    # Query your workflow memory&lt;br&gt;
    print("\n--- Asking Cognee Memory ---")&lt;br&gt;
    result = await cognee.search(&lt;br&gt;
        query_text="What flows and deployments failed recently, and what are their schedules?",&lt;br&gt;
        query_type=cognee.SearchType.GRAPH_COMPLETION,&lt;br&gt;
        datasets=["orchestration_memory"],&lt;br&gt;
    )&lt;br&gt;
    print("Orchestration Insights:\n", result)&lt;br&gt;
if &lt;strong&gt;name&lt;/strong&gt; == "&lt;strong&gt;main&lt;/strong&gt;":&lt;br&gt;
    asyncio.run(main())&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Rigorous Offline Verification&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To ensure rock-solid reliability without external network dependencies, the connector includes a 42-test offline suite:&lt;/p&gt;

&lt;p&gt;Client Tests: Exponential backoff on HTTP 502/503, connection retry handling, rate-limit header parsing, and token redaction.&lt;br&gt;
State Transition Tests: Verifies that a flow run moving from PENDING to FAILED is recognized and re-emitted on the subsequent sync.&lt;br&gt;
Secret Redaction Tests: Verifies that test fixtures with sensitive passwords (db_password=supersecretpassword) never leak into document text.&lt;br&gt;
Forget-on-Delete Tests: Confirms single-endpoint lookups detect deleted entities and issue tombstones.&lt;br&gt;
Real SQLite DLT Pipeline: Verifies state survival and hard-deletion across consecutive pipeline runs.&lt;br&gt;
bash&lt;br&gt;
pytest packages/connector/prefect/tests -v&lt;br&gt;
====================== 42 passed in 22.84s =======================&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Summary &amp;amp; Links&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Connecting workflow orchestration engines like Prefect into Cognee bridges the gap between infrastructure telemetry and cognitive AI agents. Operators can now query complex pipeline states naturally, conduct automated failure root-cause analysis, and build resilient autonomous workflows.&lt;/p&gt;

&lt;p&gt;Pull Request: topoteretes/cognee-community#446&lt;br&gt;
Feature Issue: topoteretes/cognee#6119&lt;br&gt;
Repository: Cognee Community Monorepo&lt;/p&gt;

</description>
      <category>python</category>
      <category>opensource</category>
      <category>ai</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
