<?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: Masum Ali</title>
    <description>The latest articles on DEV Community by Masum Ali (@insane_odyssey).</description>
    <link>https://dev.to/insane_odyssey</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%2F3730218%2F7fc94dba-909e-48b0-970d-6bed9a28aa7e.jpeg</url>
      <title>DEV Community: Masum Ali</title>
      <link>https://dev.to/insane_odyssey</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/insane_odyssey"/>
    <language>en</language>
    <item>
      <title>Connecting Honeycomb Observability &amp; SLOs into an AI Graph Memory with Cognee</title>
      <dc:creator>Masum Ali</dc:creator>
      <pubDate>Mon, 05 Oct 2026 12:36:23 +0000</pubDate>
      <link>https://dev.to/insane_odyssey/connecting-honeycomb-observability-slos-into-an-ai-graph-memory-with-cognee-21na</link>
      <guid>https://dev.to/insane_odyssey/connecting-honeycomb-observability-slos-into-an-ai-graph-memory-with-cognee-21na</guid>
      <description>&lt;h1&gt;
  
  
  Connecting Honeycomb Observability &amp;amp; SLOs into an AI Graph Memory with Cognee
&lt;/h1&gt;

&lt;p&gt;When production goes down or latency spikes at 2 AM, autonomous SRE agents and on-call engineers need answers fast:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;"Which alert triggers monitor 5xx errors on the checkout service?"&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;"What is our SLO error budget target for payments API and what queries measure it?"&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;"Which dashboards visualize database lock wait durations?"&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of this operational knowledge lives inside &lt;a href="https://honeycomb.io" rel="noopener noreferrer"&gt;Honeycomb&lt;/a&gt;. To make that metadata instantly queryable by AI agents and LLM tools, we built and contributed the &lt;strong&gt;Honeycomb Connector&lt;/strong&gt; for &lt;a href="https://github.com/topoteretes/cognee" rel="noopener noreferrer"&gt;Cognee&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Why Observability Belongs in a Knowledge Graph
&lt;/h2&gt;

&lt;p&gt;Rather than indexing raw high-velocity span telemetry (which belongs in high-throughput timeseries storage), high-leverage contextual intelligence lives in Honeycomb’s configuration layer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Datasets:&lt;/strong&gt; The telemetry boundaries and services being monitored.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Boards / Dashboards:&lt;/strong&gt; Curated graphs tracking p99 latencies, error budgets, and spans.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Triggers:&lt;/strong&gt; Threshold rules, evaluation frequencies, and runbook definitions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Service Level Objectives (SLOs):&lt;/strong&gt; Target reliability percentages (e.g. 99.95%) and SLI formulas.
&lt;/li&gt;
&lt;/ul&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart TD
    HC[Honeycomb Management API] --&amp;gt;|Datasets / Boards / Triggers / SLOs| Client[HoneycombClient]
    Client --&amp;gt;|yield Structured Markdown| DLT[DLT Pipeline]
    DLT --&amp;gt;|DOCUMENT_SOURCE_ATTR| Cognee[Cognee Cognify]
    Cognee --&amp;gt;|Build Topology &amp;amp; Dependency Graph| Memory[(Graph DB + Vector Store)]
    Memory --&amp;gt;|Natural Language &amp;amp; Incident Automation| Agent[Autonomous SRE Agent]&lt;/code&gt;&lt;/pre&gt;






&lt;h2&gt;
  
  
  2. Connector Architecture
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Clean Markdown Entity Serialization
&lt;/h3&gt;

&lt;p&gt;The connector normalizes triggers, SLO contracts, and board layouts into rich structured Markdown:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Honeycomb Trigger: High 5xx HTTP Error Rate&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Trigger ID:**&lt;/span&gt; &lt;span class="sb"&gt;`trig_api_5xx`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Dataset:**&lt;/span&gt; &lt;span class="sb"&gt;`api-gateway`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Status:**&lt;/span&gt; Active
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Evaluation Frequency:**&lt;/span&gt; Every 60s
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Threshold Rule:**&lt;/span&gt; Metric &amp;gt; 2.0
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Last Updated:**&lt;/span&gt; 2026-10-02T11:00:00Z

&lt;span class="gu"&gt;### Description &amp;amp; Runbook&lt;/span&gt;
Fires when the percentage of 5xx HTTP responses exceeds 2% over a 5-minute rolling window. Check upstream ingress proxy health.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Honeycomb Service Level Objective (SLO): Checkout Availability&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**SLO ID:**&lt;/span&gt; &lt;span class="sb"&gt;`slo_checkout_v1`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Dataset:**&lt;/span&gt; &lt;span class="sb"&gt;`payments-svc`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Target Reliability:**&lt;/span&gt; 99.9% over 30 days
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**SLI Metric Definition:**&lt;/span&gt; &lt;span class="sb"&gt;`checkout_success_rate`&lt;/span&gt;

&lt;span class="gu"&gt;### Target Rationale &amp;amp; Scope&lt;/span&gt;
&lt;span class="p"&gt;99.&lt;/span&gt;9% of checkout requests must return HTTP 200 within 1000ms.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When Cognee processes this, it builds an operational knowledge graph linking &lt;em&gt;Services&lt;/em&gt;, &lt;em&gt;SLOs&lt;/em&gt;, &lt;em&gt;Triggers&lt;/em&gt;, and &lt;em&gt;Dashboards&lt;/em&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Quickstart Example
&lt;/h2&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;cognee&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;cognee_community_connector_honeycomb&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;honeycomb_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;source&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;honeycomb_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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_HONEYCOMB_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;include_datasets&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;include_boards&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;include_triggers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;include_slos&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Ingest and Cognify
&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;add&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;infra_knowledge&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;infra_knowledge&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Ask operational questions
&lt;/span&gt;    &lt;span class="n"&gt;answers&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;What are the alerting rules and runbooks for high 5xx error rates on api-gateway?&lt;/span&gt;&lt;span class="sh"&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;infra_knowledge&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="n"&gt;answers&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;h2&gt;
  
  
  4. Offline Unit Testing
&lt;/h2&gt;

&lt;p&gt;The package includes a comprehensive mock test suite verifying header authentication (&lt;code&gt;X-Honeycomb-Team&lt;/code&gt;), incremental timestamp filtering (&lt;code&gt;since&lt;/code&gt;), and pipeline extraction:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uv run pytest packages/connector/honeycomb/tests/test_honeycomb.py &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Resources
&lt;/h2&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/237" rel="noopener noreferrer"&gt;topoteretes/cognee-community#237&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monorepo:&lt;/strong&gt; &lt;a href="https://github.com/topoteretes/cognee-community" rel="noopener noreferrer"&gt;github.com/topoteretes/cognee-community&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>python</category>
      <category>ai</category>
      <category>devops</category>
      <category>observability</category>
    </item>
    <item>
      <title>Turning Meeting Transcripts into an AI Knowledge Graph with tl;dv &amp; Cognee</title>
      <dc:creator>Masum Ali</dc:creator>
      <pubDate>Mon, 05 Oct 2026 12:35:46 +0000</pubDate>
      <link>https://dev.to/insane_odyssey/turning-meeting-transcripts-into-an-ai-knowledge-graph-with-tldv-cognee-57e7</link>
      <guid>https://dev.to/insane_odyssey/turning-meeting-transcripts-into-an-ai-knowledge-graph-with-tldv-cognee-57e7</guid>
      <description>&lt;h1&gt;
  
  
  Turning Meeting Transcripts into an AI Knowledge Graph with tl;dv &amp;amp; Cognee
&lt;/h1&gt;

&lt;p&gt;Engineering and product teams spend dozens of hours every week in meetings. Crucial technical decisions get debated, architectural tradeoffs get resolved, and action items get assigned.&lt;/p&gt;

&lt;p&gt;Then the call ends—and all that vital context gets buried in a 45-minute recording or lost inside scattered notes.&lt;/p&gt;

&lt;p&gt;To make meeting intelligence permanently accessible to AI agents and developers, we built the &lt;strong&gt;tl;dv Connector&lt;/strong&gt; for &lt;a href="https://github.com/topoteretes/cognee" rel="noopener noreferrer"&gt;Cognee&lt;/a&gt;. Here is how we turned raw meeting recordings from &lt;a href="https://tldv.io" rel="noopener noreferrer"&gt;tl;dv&lt;/a&gt; into an interconnected entity graph.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Vector Search Isn't Enough for Meeting Notes
&lt;/h2&gt;

&lt;p&gt;If you store meeting transcripts as plain vector chunks, multi-speaker reasoning falls apart. Consider this query:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Who volunteered to lead the vector engine migration in Tuesday's sync, and what blockers did they raise?"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Vector search finds chunks containing words like "vector" or "blockers", but it lacks entity grounding. A Knowledge Graph, however, extracts explicit relationships:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cypher"&gt;&lt;code&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="py"&gt;Alice:&lt;/span&gt;&lt;span class="n"&gt;Engineer&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="ss"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;:VOLUNTEERED_FOR&lt;/span&gt;&lt;span class="ss"&gt;]&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="py"&gt;VectorMigration:&lt;/span&gt;&lt;span class="n"&gt;Project&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="n"&gt;VectorMigration&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="ss"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;:HAS_BLOCKER&lt;/span&gt;&lt;span class="ss"&gt;]&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="py"&gt;KuzuStorageDriver:&lt;/span&gt;&lt;span class="n"&gt;Issue&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart LR
    TLDV[tl;dv API] --&amp;gt;|Meetings + Transcripts + Notes| Client[TLDVClient]
    Client --&amp;gt;|Format Markdown Document| DLT[DLT Pipeline]
    DLT --&amp;gt;|DOCUMENT_SOURCE_ATTR| Cognee[Cognee Cognify]
    Cognee --&amp;gt;|Extract Entities &amp;amp; Dialogue Nodes| Graph[(Knowledge Graph + Vector Store)]&lt;/code&gt;&lt;/pre&gt;






&lt;h2&gt;
  
  
  Connector Architecture
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Multi-Endpoint Synthesis
&lt;/h3&gt;

&lt;p&gt;tl;dv splits data across multiple REST endpoints:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/meetings&lt;/code&gt;: Lists metadata (meeting title, organizer, participant list, timestamps, duration).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/meetings/{id}/transcript&lt;/code&gt;: Returns speaker-labeled dialogue turns with exact timestamps.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/meetings/{id}/notes&lt;/code&gt;: Contains AI-generated executive overviews and action item checklists.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Our connector fetches and synthesizes these into a single unified Markdown document per meeting:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Meeting: Q4 Distributed Vector Engine Planning&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Organizer:**&lt;/span&gt; Alice Product Lead
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Participants:**&lt;/span&gt; Alice Product Lead, Bob Tech Lead, Charlie SRE
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Date:**&lt;/span&gt; 2026-10-01T14:00:00Z
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Duration:**&lt;/span&gt; 3600 seconds

&lt;span class="gu"&gt;### Executive Summary&lt;/span&gt;
Reviewed roadmap milestones for the distributed graph indexing engine and agreed on partition strategy.

&lt;span class="gu"&gt;### Action Items&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Bob to finalize vector engine performance benchmarks
&lt;span class="p"&gt;-&lt;/span&gt; Charlie to configure replica autoscaling in Kubernetes

&lt;span class="gu"&gt;### Full Transcript&lt;/span&gt;
Alice Product Lead: Let's review the Q4 milestones.
Bob Tech Lead: The distributed vector engine is on track, but we need to scale the partition handler.
Charlie SRE: I will deploy the new replica pool before Friday.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Cognee Graph Ingestion Contract
&lt;/h3&gt;

&lt;p&gt;By annotating the &lt;code&gt;dlt&lt;/code&gt; resource with &lt;code&gt;DOCUMENT_SOURCE_ATTR = "tldv_document"&lt;/code&gt;, Cognee treats each meeting as a document node, running its NLP extraction pipeline over the executive takeaways and dialogue.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quickstart: Ingesting Meetings with Python
&lt;/h2&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;cognee&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;cognee_community_connector_tldv&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;tldv_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="c1"&gt;# 1. Initialize connector
&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;tldv_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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_TLDV_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;limit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;include_transcripts&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;include_notes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# 2. Add and Cognify
&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;add&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;engineering_meetings&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;engineering_meetings&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# 3. Query meeting intelligence
&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;What action items were assigned to Charlie regarding replicas?&lt;/span&gt;&lt;span class="sh"&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;engineering_meetings&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="n"&gt;results&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;h2&gt;
  
  
  Offline Unit Testing
&lt;/h2&gt;

&lt;p&gt;To ensure reliability in CI and local testing without live API tokens, the connector includes a 100% offline mocked test suite:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uv run pytest packages/connector/tldv/tests/test_tldv.py &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Links &amp;amp; Contributions
&lt;/h2&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/236" rel="noopener noreferrer"&gt;topoteretes/cognee-community#236&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monorepo:&lt;/strong&gt; &lt;a href="https://github.com/topoteretes/cognee-community" rel="noopener noreferrer"&gt;github.com/topoteretes/cognee-community&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>python</category>
      <category>ai</category>
      <category>productivity</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Ingesting Mixpanel Event Dictionaries &amp; Cohorts into Cognee Knowledge Graphs</title>
      <dc:creator>Masum Ali</dc:creator>
      <pubDate>Mon, 05 Oct 2026 12:35:04 +0000</pubDate>
      <link>https://dev.to/insane_odyssey/ingesting-mixpanel-event-dictionaries-cohorts-into-cognee-knowledge-graphs-1ije</link>
      <guid>https://dev.to/insane_odyssey/ingesting-mixpanel-event-dictionaries-cohorts-into-cognee-knowledge-graphs-1ije</guid>
      <description>&lt;h1&gt;
  
  
  Ingesting Mixpanel Event Dictionaries &amp;amp; Cohorts into Cognee Knowledge Graphs
&lt;/h1&gt;

&lt;p&gt;When engineering AI agents to analyze user churn or feature adoption, the common knee-jerk reaction is to dump millions of raw event logs into a vector database.&lt;/p&gt;

&lt;p&gt;That almost never works. Millions of rows like &lt;code&gt;{"event": "checkout_clicked", "time": 1728144000}&lt;/code&gt; quickly blow past token budgets, bloat vector indexes, and return noisy semantic matches.&lt;/p&gt;

&lt;p&gt;The real high-leverage intelligence in Mixpanel lives in &lt;strong&gt;Lexicon Schemas&lt;/strong&gt;, &lt;strong&gt;User Cohort Criteria&lt;/strong&gt;, and &lt;strong&gt;Saved Report Bookmarks&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Here is how we built the official &lt;strong&gt;Mixpanel Connector&lt;/strong&gt; for &lt;a href="https://github.com/topoteretes/cognee" rel="noopener noreferrer"&gt;Cognee&lt;/a&gt; to turn that semantic product knowledge into an autonomous graph memory.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. What We Ingest: Context Over Noise
&lt;/h2&gt;

&lt;p&gt;Instead of flooding your graph with every repetitive click timestamp, our connector focuses on the core conceptual primitives:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Lexicon Schemas:&lt;/strong&gt; The data dictionary of your product (what properties exist on &lt;code&gt;workspace_created&lt;/code&gt;, what each property represents, and its active status).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;User Cohorts:&lt;/strong&gt; Dynamic user groupings (e.g. &lt;em&gt;"Power Users active &amp;gt; 5 days a week"&lt;/em&gt; or &lt;em&gt;"Dormant Enterprise Accounts"&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Saved Reports / Insights:&lt;/strong&gt; The queries and metrics your growth and product teams care about most.
&lt;/li&gt;
&lt;/ol&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart LR
    MP[Mixpanel API] --&amp;gt;|Lexicon / Cohorts / Bookmarks| Client[MixpanelClient]
    Client --&amp;gt;|yield Semantic Markdown| DLT[DLT Pipeline]
    DLT --&amp;gt;|DOCUMENT_SOURCE_ATTR| Cognee[Cognee Cognify]
    Cognee --&amp;gt;|Graph Nodes &amp;amp; Relations| DB[(Graph DB + Vector Storage)]&lt;/code&gt;&lt;/pre&gt;






&lt;h2&gt;
  
  
  2. Engineering the Connector
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Resilience &amp;amp; Rate-Limit Handling
&lt;/h3&gt;

&lt;p&gt;Mixpanel APIs enforce strict query limits. We built an exponential backoff loop with status code inspection to gracefully handle HTTP 429 and network blips:&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="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;attempt&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MAX_RETRIES&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;params&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;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;429&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;retry_after&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;headers&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;Retry-After&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;attempt&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;retry_after&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;continue&lt;/span&gt;
        &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;raise_for_status&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nf"&gt;except &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;httpx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TransportError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;httpx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TimeoutException&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;attempt&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;MAX_RETRIES&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="k"&gt;raise&lt;/span&gt;
        &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;attempt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Semantic Prose Serialization
&lt;/h3&gt;

&lt;p&gt;Each event schema is parsed into a clean document capturing its data dictionary:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Mixpanel Lexicon Event: payment_failed&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Event Name:**&lt;/span&gt; payment_failed
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Status:**&lt;/span&gt; active
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Tags:**&lt;/span&gt; billing, alerts, core_checkout

&lt;span class="gu"&gt;### Description&lt;/span&gt;
Fired whenever a Stripe or PayPal payment intent returns an error during checkout.

&lt;span class="gu"&gt;### Event Properties &amp;amp; Data Dictionary&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`error_code`&lt;/span&gt; (string) - Raw gateway error code
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`retry_count`&lt;/span&gt; (number) - Number of automatic retry attempts
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`plan_tier`&lt;/span&gt; (string) - Target subscription tier (starter, pro, enterprise)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When Cognee indexes this, questions like &lt;em&gt;"What triggers a payment failure event and what properties are logged?"&lt;/em&gt; are answered instantly with graph precision.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Quickstart Example
&lt;/h2&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;cognee&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;cognee_community_connector_mixpanel&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;mixpanel_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;source&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;mixpanel_source&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;project_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_MIXPANEL_PROJECT_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;secret&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_SERVICE_ACCOUNT_SECRET&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_schemas&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;include_cohorts&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;include_reports&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&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;add&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;mixpanel_knowledge&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mixpanel_knowledge&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;answer&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Which user cohorts track dormant enterprise accounts?&lt;/span&gt;&lt;span class="sh"&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;mixpanel_knowledge&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="n"&gt;answer&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;h2&gt;
  
  
  4. Testing &amp;amp; Verification
&lt;/h2&gt;

&lt;p&gt;100% offline mocked pytest tests verify schema parsing, cohort mapping, date filters, and Cognee ingestion without hitting live network endpoints:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uv run pytest packages/connector/mixpanel/tests/test_mixpanel.py &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PR:&lt;/strong&gt; &lt;a href="https://github.com/topoteretes/cognee-community/pull/235" rel="noopener noreferrer"&gt;topoteretes/cognee-community#235&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monorepo:&lt;/strong&gt; &lt;a href="https://github.com/topoteretes/cognee-community" rel="noopener noreferrer"&gt;github.com/topoteretes/cognee-community&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>python</category>
      <category>ai</category>
      <category>analytics</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Bridging Pendo Product Telemetry into an AI Knowledge Graph with Cognee</title>
      <dc:creator>Masum Ali</dc:creator>
      <pubDate>Mon, 05 Oct 2026 12:34:11 +0000</pubDate>
      <link>https://dev.to/insane_odyssey/bridging-pendo-product-telemetry-into-an-ai-knowledge-graph-with-cognee-61n</link>
      <guid>https://dev.to/insane_odyssey/bridging-pendo-product-telemetry-into-an-ai-knowledge-graph-with-cognee-61n</guid>
      <description>&lt;h1&gt;
  
  
  Bridging Pendo Product Telemetry into an AI Knowledge Graph with Cognee
&lt;/h1&gt;

&lt;p&gt;Product teams sit on a goldmine of context inside &lt;a href="https://pendo.io" rel="noopener noreferrer"&gt;Pendo&lt;/a&gt;: in-app onboarding guides, user feature clicks, customer accounts, and drop-off points. &lt;/p&gt;

&lt;p&gt;Yet, when product managers or AI agents want to answer fundamental qualitative questions—like &lt;em&gt;"Which enterprise accounts struggled with our latest SSO migration guide?"&lt;/em&gt;—they are forced to write multi-tab CSV exports or complex Segment queries.&lt;/p&gt;

&lt;p&gt;To bridge this gap, we built and shipped the &lt;strong&gt;Pendo Connector&lt;/strong&gt; for &lt;a href="https://github.com/topoteretes/cognee" rel="noopener noreferrer"&gt;Cognee&lt;/a&gt;. Here’s a breakdown of how it works, the architectural choices we made, and how to get it running in your environment.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Challenge: Telemetry vs Semantic Context
&lt;/h2&gt;

&lt;p&gt;Raw product analytics is dominated by click events (&lt;code&gt;button_clicked_id_382&lt;/code&gt;). By itself, that click means nothing to an LLM unless linked to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Feature Definition:&lt;/strong&gt; What screen or workflow did that button belong to?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Guide / Walkthrough:&lt;/strong&gt; Was the user engaged in an active onboarding tour?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Account Context:&lt;/strong&gt; What subscription tier or industry does this user belong to?
&lt;/li&gt;
&lt;/ul&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart TD
    subgraph Pendo API
        G[Guides &amp;amp; Tours]
        F[Feature Definitions]
        E[Track Events]
        A[Accounts &amp;amp; Visitors]
    end

    G --&amp;gt; Client[PendoClient]
    F --&amp;gt; Client
    E --&amp;gt; Client
    A --&amp;gt; Client

    Client --&amp;gt; DLT[DLT Pipeline]
    DLT --&amp;gt;|DOCUMENT_SOURCE_ATTR| Cognee[Cognee Cognify Engine]
    Cognee --&amp;gt; KG[(Graph Database + Vector Embeddings)]&lt;/code&gt;&lt;/pre&gt;






&lt;h2&gt;
  
  
  Architectural Deep Dive
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Multi-Resource Aggregation with &lt;code&gt;dlt&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Rather than treating Pendo as a dumb event pipe, our connector extracts four distinct knowledge layers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Guides:&lt;/strong&gt; Onboarding tooltips, banners, and walkthrough step texts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Features:&lt;/strong&gt; Element selectors, UI tags, and human descriptions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Track Events:&lt;/strong&gt; Custom behavioral events sent by backend services.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Visitor Context:&lt;/strong&gt; Account groupings and last-seen metadata.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PendoClient&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;integration_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://app.pendo.io&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;integration_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;integration_key&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;base_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rstrip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&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;def&lt;/span&gt; &lt;span class="nf"&gt;get_guides&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;]]:&lt;/span&gt; &lt;span class="bp"&gt;...&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_features&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;]]:&lt;/span&gt; &lt;span class="bp"&gt;...&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_track_events&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;]]:&lt;/span&gt; &lt;span class="bp"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Turning UI Hierarchies into LLM-Ready Markdown
&lt;/h3&gt;

&lt;p&gt;For every guide, feature, and event, we construct rich semantic documents:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Pendo In-App Guide: Workspace Onboarding Tour (ID: guide_489)&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Status:**&lt;/span&gt; Published
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Audience Segment:**&lt;/span&gt; All New Workspace Admins
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Created At:**&lt;/span&gt; 2026-08-15T09:00:00Z

&lt;span class="gu"&gt;### Guide Steps &amp;amp; UI Content&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Step 1:**&lt;/span&gt; Welcome to your team workspace! Let's configure your data sources.
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Step 2:**&lt;/span&gt; Click here to connect your PostgreSQL or Neo4j databases.
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Step 3:**&lt;/span&gt; Invite your teammates to collaborate.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When Cognee's &lt;code&gt;cognify()&lt;/code&gt; pipeline digests this, it extracts relationships between &lt;em&gt;Guides&lt;/em&gt;, &lt;em&gt;Features&lt;/em&gt;, and &lt;em&gt;Onboarding Steps&lt;/em&gt;, allowing autonomous agents to understand the exact UX journeys users experience.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to Use It in 60 Seconds
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Installation
&lt;/h3&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-community-connector-pendo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Ingestion Script
&lt;/h3&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;cognee&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;cognee_community_connector_pendo&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pendo_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;source&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;pendo_source&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;integration_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;YOUR_PENDO_INTEGRATION_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;include_guides&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;include_features&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;include_events&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;since&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2026-09-01T00:00:00Z&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="c1"&gt;# Ingest into Cognee memory
&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;add&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;product_telemetry&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;product_telemetry&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Ask deep product questions
&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;What guides are active for onboarding new workspace admins?&lt;/span&gt;&lt;span class="sh"&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;product_telemetry&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="n"&gt;results&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;h2&gt;
  
  
  Offline Unit Testing
&lt;/h2&gt;

&lt;p&gt;The package includes an offline pytest suite testing pagination, rate-limit backoffs, and Cognee pipeline compatibility:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uv run pytest packages/connector/pendo/tests/test_pendo.py &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Summary &amp;amp; Links
&lt;/h2&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/234" rel="noopener noreferrer"&gt;topoteretes/cognee-community#234&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source Code:&lt;/strong&gt; &lt;a href="https://github.com/topoteretes/cognee-community" rel="noopener noreferrer"&gt;cognee-community repo&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let us know what other product tools you'd love to see connected to Cognee!&lt;/p&gt;

</description>
      <category>python</category>
      <category>ai</category>
      <category>opensource</category>
      <category>datanerd</category>
    </item>
    <item>
      <title>Why We Built a Typeform Knowledge Graph Connector for Cognee</title>
      <dc:creator>Masum Ali</dc:creator>
      <pubDate>Mon, 05 Oct 2026 12:34:08 +0000</pubDate>
      <link>https://dev.to/insane_odyssey/why-we-built-a-typeform-knowledge-graph-connector-for-cognee-14mf</link>
      <guid>https://dev.to/insane_odyssey/why-we-built-a-typeform-knowledge-graph-connector-for-cognee-14mf</guid>
      <description>&lt;h1&gt;
  
  
  Why We Built a Typeform Knowledge Graph Connector for Cognee
&lt;/h1&gt;

&lt;p&gt;If you’ve ever tried piping survey responses into an LLM application or RAG pipeline, you know the pain. &lt;/p&gt;

&lt;p&gt;Forms don't output clean prose. They spit out disjointed JSON arrays: arbitrary field IDs, cryptic choice indexes, nested metadata, and missing answers. Dump that raw tabular data into standard vector search, and your similarity lookups fall apart the moment someone asks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"What did enterprise leads in Europe say about our self-hosted pricing tier?"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To solve this, we built and contributed the official &lt;strong&gt;Typeform Connector&lt;/strong&gt; for &lt;a href="https://github.com/topoteretes/cognee" rel="noopener noreferrer"&gt;Cognee&lt;/a&gt; (&lt;code&gt;cognee-community-connector-typeform&lt;/code&gt;). Here is how we designed it, how Cognee's document model works under the hood, and how you can use it in your own stacks.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem with Naive Survey Ingestion
&lt;/h2&gt;

&lt;p&gt;When ingesting form telemetry into a Knowledge Graph, two approaches usually fail:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Flat Relational Dumps:&lt;/strong&gt; Flattening every submission into rows strips away semantic context. The LLM has to guess what &lt;code&gt;choice_id_892&lt;/code&gt; actually meant in relation to the respondent's company size.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Raw JSON String Dumps:&lt;/strong&gt; Embedding raw JSON blobs wastes token budget on structural boilerplate (&lt;code&gt;{"type": "multiple_choice", "field": {"ref": "..."}}&lt;/code&gt;) rather than the respondent's actual voice.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  The Solution: Form-Aware Prose Serialization
&lt;/h3&gt;

&lt;p&gt;Our connector hooks into Typeform's Forms and Responses APIs via a resilient &lt;code&gt;dlt&lt;/code&gt; (data load tool) pipeline. It resolves form definition schemas, maps each question title directly to its submitted answer, and constructs a structured markdown document for every response:&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart LR
    TF[Typeform API] --&amp;gt;|Form Schema + Responses| Client[TypeformClient]
    Client --&amp;gt;|Resolve Question Titles &amp;amp; Answers| DLT[DLT Resource]
    DLT --&amp;gt;|DOCUMENT_SOURCE_ATTR='typeform_responses'| Cognee[Cognee Cognify]
    Cognee --&amp;gt;|Extract Entities &amp;amp; Relationships| Graph[(Knowledge Graph + Vector Store)]&lt;/code&gt;&lt;/pre&gt;






&lt;h2&gt;
  
  
  How It Works Under the Hood
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. The Schema-to-Answer Resolver
&lt;/h3&gt;

&lt;p&gt;Typeform splits form definitions (&lt;code&gt;/forms/{id}&lt;/code&gt;) from respondent answers (&lt;code&gt;/forms/{id}/responses&lt;/code&gt;). The connector caches question titles and maps varied response types (&lt;code&gt;choices&lt;/code&gt;, &lt;code&gt;text&lt;/code&gt;, &lt;code&gt;number&lt;/code&gt;, &lt;code&gt;boolean&lt;/code&gt;, &lt;code&gt;payment&lt;/code&gt;):&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="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_extract_answer_value&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ans&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;ans_type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ans&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;type&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="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;ans_type&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;ans&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;text&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="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;ans_type&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;choice&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;ans&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;choice&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;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;label&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="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;ans_type&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;choices&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;labels&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ans&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;choices&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;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;labels&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="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;labels&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;ans_type&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;boolean&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Yes&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;ans&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;boolean&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;No&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;ans_type&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;number&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ans&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;number&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="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ans&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="n"&gt;ans_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. The Cognee Document Contract
&lt;/h3&gt;

&lt;p&gt;Cognee's &lt;code&gt;cognify()&lt;/code&gt; engine needs to know when incoming records should undergo entity and relation extraction rather than flat tabular storage. We register this via &lt;code&gt;DOCUMENT_SOURCE_ATTR&lt;/code&gt;:&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;DOCUMENT_SOURCE_ATTR&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;typeform_responses&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="nf"&gt;setattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;typeform_responses_resource&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DOCUMENT_SOURCE_ATTR&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;Each submission is transformed into clean prose:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Typeform Response: Customer Feedback Survey (ID: resp_8821)&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Submitted At:**&lt;/span&gt; 2026-10-04T16:00:00Z
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Response ID:**&lt;/span&gt; resp_8821

&lt;span class="gu"&gt;### Survey Responses&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**What is your company size?**&lt;/span&gt; 50-200 employees
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Which feature is most critical for your team?**&lt;/span&gt; On-premise vector index synchronization
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Any additional feedback?**&lt;/span&gt; The current REST API latency is solid, but we need better RBAC controls.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When Cognee processes this, its GLiNER and LLM extractors recognize &lt;em&gt;companies&lt;/em&gt;, &lt;em&gt;features&lt;/em&gt;, &lt;em&gt;feedback sentiments&lt;/em&gt;, and create connected nodes in your graph database (Kuzu, Neo4j, or Postgres).&lt;/p&gt;




&lt;h2&gt;
  
  
  Quickstart: Adding Typeform to Your Cognee Pipeline
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Installation
&lt;/h3&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-community-connector-typeform
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Ingestion in 4 Lines of Python
&lt;/h3&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;cognee&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;cognee_community_connector_typeform&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;typeform_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="c1"&gt;# Configure connector
&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;typeform_source&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_TYPEFORM_PERSONAL_ACCESS_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;form_ids&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;abc123xyz&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;  &lt;span class="c1"&gt;# Or omit to sync all forms
&lt;/span&gt;        &lt;span class="n"&gt;since&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2026-09-01T00:00:00Z&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="c1"&gt;# Ingest and Cognify
&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;add&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;survey_insights&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;survey_insights&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Ask multi-hop questions over survey feedback
&lt;/span&gt;    &lt;span class="n"&gt;insights&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;What are mid-sized companies saying about RBAC requirements?&lt;/span&gt;&lt;span class="sh"&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;survey_insights&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="n"&gt;insights&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;h2&gt;
  
  
  Resilient Offline Testing
&lt;/h2&gt;

&lt;p&gt;Because CI runners shouldn't rely on live API keys, we wrote a complete mock-tested suite covering:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Handling paginated responses and token auth headers.&lt;/li&gt;
&lt;li&gt;Graceful fallbacks when questions have no answers.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;since&lt;/code&gt; ISO timestamp filtering.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Run it locally anytime:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uv run pytest packages/connector/typeform/tests/test_typeform.py &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Check It Out
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PR:&lt;/strong&gt; &lt;a href="https://github.com/topoteretes/cognee-community/pull/233" rel="noopener noreferrer"&gt;topoteretes/cognee-community#233&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monorepo:&lt;/strong&gt; &lt;a href="https://github.com/topoteretes/cognee-community" rel="noopener noreferrer"&gt;github.com/topoteretes/cognee-community&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Have ideas for more data connectors or graph models? Jump into Cognee's Discord and let's build!&lt;/p&gt;

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