<?xml version="1.0" encoding="UTF-8" ?><!-- generator=Zoho Sites --><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><atom:link href="https://www.highperformance.tech/blogs/tag/ai/feed" rel="self" type="application/rss+xml"/><title>High Performance Technologies - High Performance Technologies Blog #ai</title><description>High Performance Technologies - High Performance Technologies Blog #ai</description><link>https://www.highperformance.tech/blogs/tag/ai</link><lastBuildDate>Sat, 07 Mar 2026 11:20:50 -0800</lastBuildDate><generator>http://zoho.com/sites/</generator><item><title><![CDATA[TextQL Citi Bike Data Interactive Dashboard]]></title><link>https://www.highperformance.tech/blogs/post/textql-citi-bike-data-interactive-dashboard</link><description><![CDATA[<img align="left" hspace="5" src="https://www.highperformance.tech/Blog Images/TextQL Dashboard blog/image -14-.png"/>TextQL's AI agent Ana explored Citi Bike data, built weather-correlation charts, and generated an interactive dashboard — all in under an hour with minimal prompting.]]></description><content:encoded><![CDATA[<div class="zpcontent-container blogpost-container "><div data-element-id="elm_hdItKa9XQmy0Su-zIxT3ag" data-element-type="section" class="zpsection "><style type="text/css"></style><div class="zpcontainer-fluid zpcontainer"><div data-element-id="elm_7g4OjdjaSz2XyucLQ63hBA" data-element-type="row" class="zprow zprow-container zpalign-items-flex-start zpjustify-content- " data-equal-column="false"><style type="text/css"></style><div data-element-id="elm_ihxqkS8fRNes811_MrenJA" data-element-type="column" class="zpelem-col zpcol-12 zpcol-md-12 zpcol-sm-12 zpalign-self- "><style type="text/css"></style><div data-element-id="elm_epFHT4YrTa-QK7OWK_ZHuw" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-center zptext-align-mobile-center zptext-align-tablet-center " data-editor="true"><p style="text-align:left;"><span>If you have talked to me at all about my work in the last 3 months, it’s safe to say I’ve brought up TextQL to you — I continue to be amazed at its capabilities and what it can do for data integration, analysis...and now visualization. As a Tableau developer and data viz enthusiast I was super intrigued this week when TextQL announced the launch of interactive dashboards in their platform. I had been exploring TextQL's capabilities recently, but with this announcement I just had to get back into the tool and see what Ana could do. Come along with me as we explore some data and 'build' a dashboard in TextQL.&nbsp;</span></p></div>
</div><div data-element-id="elm_cwvmgOUGVkkW7frlWK7lSQ" data-element-type="iconHeading" class="zpelement zpelem-iconheading "><style type="text/css"> [data-element-id="elm_cwvmgOUGVkkW7frlWK7lSQ"].zpelem-iconheading h4.zpicon-heading{ color:#6A5ACD ; } [data-element-id="elm_cwvmgOUGVkkW7frlWK7lSQ"].zpelem-iconheading{ background-color:rgba(106,90,205,0.29); background-image:unset; } </style><div class="zpicon-container zpicon-align-left zpicon-align-mobile-center zpicon-align-tablet-center "><style>[data-element-id="elm_cwvmgOUGVkkW7frlWK7lSQ"] .zpicon-common svg{ fill:#6A5ACD !important }</style><a class="zpicon-anchor" href="https://textql.com/pricing" target="_blank" rel=""><span class="zpicon zpicon-common zpicon-size-md zpicon-style-none "><svg viewBox="0 0 24 24" height="24" width="24" aria-label="hidden" xmlns="http://www.w3.org/2000/svg"><path d="M12.0519 14.8285L13.4661 16.2427L17.7088 12L13.4661 7.7574L12.0519 9.17161L13.8804 11H6.34321V13H13.8803L12.0519 14.8285Z"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M19.7782 19.7782C24.0739 15.4824 24.0739 8.51759 19.7782 4.22183C15.4824 -0.0739417 8.51759 -0.0739417 4.22183 4.22183C-0.0739417 8.51759 -0.0739417 15.4824 4.22183 19.7782C8.51759 24.0739 15.4824 24.0739 19.7782 19.7782ZM18.364 18.364C21.8787 14.8492 21.8787 9.15076 18.364 5.63604C14.8492 2.12132 9.15076 2.12132 5.63604 5.63604C2.12132 9.15076 2.12132 14.8492 5.63604 18.364C9.15076 21.8787 14.8492 21.8787 18.364 18.364Z"></path></svg></span></a><h4 class="zpicon-heading " data-editor="true"><span>If you want to follow along with this analysis and try it yourself, you can sign up for a trial of TextQL here on the Analyst track: <a href="https://textql.com/pricing">https://textql.com/pricing</a> → get started with a $100/mo free credit</span></h4></div>
</div><div data-element-id="elm_K4fbo0_WG_IggrNZk2Vutw" data-element-type="heading" class="zpelement zpelem-heading "><style></style><h2
 class="zpheading zpheading-style-none zpheading-align-left zpheading-align-mobile-left zpheading-align-tablet-left " data-editor="true">Tell Me About My Data</h2></div>
<div data-element-id="elm_lL2rQD8f7EzGOIabkP6fOw" data-element-type="row" class="zprow zprow-container zpalign-items-flex-start zpjustify-content-flex-start zpdefault-section zpdefault-section-bg " data-equal-column="false"><style type="text/css"></style><div data-element-id="elm_QtB4xH3TmeIDKH5rv9BKcA" data-element-type="column" class="zpelem-col zpcol-12 zpcol-md-12 zpcol-sm-12 zpalign-self- zpdefault-section zpdefault-section-bg "><style type="text/css"></style><div data-element-id="elm_97HUk1K6eQMruskt7PN9mA" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><p><span>I started out pretty simple. I wanted to explore the sample data set TextQL provides: Citi Bike NYC data. <br/><br/>Since I had never worked with this data set before, I asked Ana (TextQL’s analytics agent) to tell me about the data set.&nbsp;</span></p></div>
</div></div></div><div data-element-id="elm_BInIw0PswqQZjbneKrtWIQ" data-element-type="image" class="zpelement zpelem-image "><style> @media (min-width: 992px) { [data-element-id="elm_BInIw0PswqQZjbneKrtWIQ"] .zpimage-container figure img { width: 506.25px !important ; height: 404px !important ; } } </style><div data-caption-color="" data-size-tablet="" data-size-mobile="" data-align="center" data-tablet-image-separate="false" data-mobile-image-separate="false" class="zpimage-container zpimage-align-center zpimage-tablet-align-center zpimage-mobile-align-center zpimage-size-original zpimage-tablet-fallback-fit zpimage-mobile-fallback-fit hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/Blog%20Images/TextQL%20Dashboard%20blog/image.png" size="original" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_aZqNn5YerXWw2lBUSBdWOQ" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><p><span>She ran 8 tools and came back with a summary:</span></p></div>
</div><div data-element-id="elm_xbhY-FLlZWeGFqRHoww1kw" data-element-type="image" class="zpelement zpelem-image "><style> @media (min-width: 992px) { [data-element-id="elm_xbhY-FLlZWeGFqRHoww1kw"] .zpimage-container figure img { width: 577.99px !important ; height: 483px !important ; } } </style><div data-caption-color="" data-size-tablet="" data-size-mobile="" data-align="center" data-tablet-image-separate="false" data-mobile-image-separate="false" class="zpimage-container zpimage-align-center zpimage-tablet-align-center zpimage-mobile-align-center zpimage-size-original zpimage-tablet-fallback-fit zpimage-mobile-fallback-fit hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/Blog%20Images/TextQL%20Dashboard%20blog/image%20-1-.png" size="original" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_1Ovr-bzLWzuazQW-XEDjkA" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><p><span>What I love about Ana is that she shows her work, so I can click into any of these steps and see what she was up to. After 7 SQL queries to explore the data, she ran Python to create the output for the summary. <br/><br/>As part of the summary she included a “What You Can Analyze” list at the end. I took her suggestion and asked to see the most popular routes in July 2017 (she had informed me that the data was available for July 2013 to May 2018).&nbsp;</span></p></div>
</div><div data-element-id="elm_eHAPrGcx7opsTCeC55FsWg" data-element-type="image" class="zpelement zpelem-image "><style> @media (min-width: 992px) { [data-element-id="elm_eHAPrGcx7opsTCeC55FsWg"] .zpimage-container figure img { width: 623.53px !important ; height: 313px !important ; } } </style><div data-caption-color="" data-size-tablet="" data-size-mobile="" data-align="center" data-tablet-image-separate="false" data-mobile-image-separate="false" class="zpimage-container zpimage-align-center zpimage-tablet-align-center zpimage-mobile-align-center zpimage-size-original zpimage-tablet-fallback-fit zpimage-mobile-fallback-fit hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/Blog%20Images/TextQL%20Dashboard%20blog/image%20-2-.png" size="original" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_VZl8IYxuS5hykkQJO6WP1g" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><p><span>Now, in my past life as a business analyst, if someone had asked me this question, I would grab the data, throw it into a bar chart, and rank by number of trips, which is exactly what Ana did — and she did it quickly. Hooray!</span></p></div>
</div><div data-element-id="elm_DXFdF5-A16nxFbIRKXIhyQ" data-element-type="image" class="zpelement zpelem-image "><style> @media (min-width: 992px) { [data-element-id="elm_DXFdF5-A16nxFbIRKXIhyQ"] .zpimage-container figure img { width: 645.64px !important ; height: 289px !important ; } } </style><div data-caption-color="" data-size-tablet="" data-size-mobile="" data-align="center" data-tablet-image-separate="false" data-mobile-image-separate="false" class="zpimage-container zpimage-align-center zpimage-tablet-align-center zpimage-mobile-align-center zpimage-size-original zpimage-tablet-fallback-fit zpimage-mobile-fallback-fit hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/Blog%20Images/TextQL%20Dashboard%20blog/image%20-3-.png" size="original" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_woXKmgMJPu4E3fRGWaglrg" data-element-type="row" class="zprow zprow-container zpalign-items-flex-start zpjustify-content-flex-start zpdefault-section zpdefault-section-bg " data-equal-column="false"><style type="text/css"></style><div data-element-id="elm_nqWLUf0Xt7EYhMbYqWDIWw" data-element-type="column" class="zpelem-col zpcol-12 zpcol-md-6 zpcol-sm-12 zpalign-self- zpdefault-section zpdefault-section-bg "><style type="text/css"></style><div data-element-id="elm_ssQy-j7NexpihQWWiNeL5w" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><p><span>But then, this is where Ana really excels. In addition to the bar chart .png she provided, she also provided a summary of the results in natural language text and included some key insights about potential reasons <b>WHY</b> these particular routes were so popular, including commuter patterns, proximity to subway stations, and leisure rides in Central Park.</span></p><p><span><br/></span></p><p><span><span>In the same amount of time it would have taken me to just <span style="font-style:italic;">build the chart,</span> Ana provided the chart to answer my question and then got to the next level of the analysis — something that would have taken me, a non-New Yorker, many minutes to read, process, research, and integrate.<br/><br/>Now, within a few minutes, I can speak intelligently about a data source that just previously I knew nothing about. And I can begin to think more analytically about the data at hand. What other angles can I explore for what this data means? What actions / decisions can I make from it?</span><br/></span></p></div>
</div></div><div data-element-id="elm_3qYnDUmczsfPOgCtIraX6w" data-element-type="column" class="zpelem-col zpcol-12 zpcol-md-6 zpcol-sm-12 zpalign-self- zpdefault-section zpdefault-section-bg "><style type="text/css"></style><div data-element-id="elm_RxghtWdH7gSf0sbDtzmeGw" data-element-type="image" class="zpelement zpelem-image "><style> @media (min-width: 992px) { [data-element-id="elm_RxghtWdH7gSf0sbDtzmeGw"] .zpimage-container figure img { width: 245px !important ; height: 349px !important ; } } </style><div data-caption-color="" data-size-tablet="" data-size-mobile="" data-align="center" data-tablet-image-separate="false" data-mobile-image-separate="false" class="zpimage-container zpimage-align-center zpimage-tablet-align-center zpimage-mobile-align-center zpimage-size-custom zpimage-tablet-fallback-fit zpimage-mobile-fallback-fit zpimage-overlay zpimage-overlay-effect-static-bottom hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/Blog%20Images/TextQL%20Dashboard%20blog/image%20-4-.png" size="custom" data-lightbox="true"/></picture></span><figcaption class="zpimage-caption zpimage-caption-align-center"><span class="zpimage-caption-content">Click to see Ana's analysis</span></figcaption></figure></div>
</div></div><div data-element-id="elm_zQ9LhT58A6BcuO2vWbFj7w" data-element-type="column" class="zpelem-col zpcol-12 zpcol-md-12 zpcol-sm-12 zpalign-self- zpdefault-section zpdefault-section-bg "><style type="text/css"></style><div data-element-id="elm_lqMfgYfwWc4IgyEjD0ZVtw" data-element-type="divider" class="zpelement zpelem-divider "><style type="text/css"></style><style></style><div class="zpdivider-container zpdivider-line zpdivider-align-center zpdivider-align-mobile-center zpdivider-align-tablet-center zpdivider-width100 zpdivider-line-style-solid "><div class="zpdivider-common"></div>
</div></div></div></div><div data-element-id="elm_BFwN6aJsCYvbhJvEl3f6fQ" data-element-type="heading" class="zpelement zpelem-heading "><style></style><h2
 class="zpheading zpheading-style-none zpheading-align-left zpheading-align-mobile-left zpheading-align-tablet-left " data-editor="true"><span>Exploring Further</span></h2></div>
<div data-element-id="elm_oBHlDUHsd3-G3RQuOG1h1A" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><p><span>I decide that I want to know more about how weather impacts the usage of the bikes. My hypothesis is that there is a strong correlation between good weather and high bike usage, but I want to see the data to prove I am right. ;)&nbsp;<br/><br/>Now, I don’t have any weather data myself. I don’t even know where to go get this data. And as far as I know, Ana doesn’t have this information in her available connectors set up in my environment. But I figure I’ll ask her anyways to see how she responds to inform me that she doesn't have the data...<br/><br/>At first she tries to run a SQL Query against the Citi Bike data connector I included in my Thread. But that doesn’t return anything weather related. At this point, I expect her to say “No go - I don’t have the data in this Thread.” But she surprises me and goes straight to an open source free weather API! How cool is that?</span></p></div>
</div><div data-element-id="elm_KPcb2awUBre1FobJ5w-Row" data-element-type="image" class="zpelement zpelem-image "><style> @media (min-width: 992px) { [data-element-id="elm_KPcb2awUBre1FobJ5w-Row"] .zpimage-container figure img { width: 535px !important ; height: 591px !important ; } } </style><div data-caption-color="" data-size-tablet="" data-size-mobile="" data-align="center" data-tablet-image-separate="false" data-mobile-image-separate="false" class="zpimage-container zpimage-align-center zpimage-tablet-align-center zpimage-mobile-align-center zpimage-size-custom zpimage-tablet-fallback-fit zpimage-mobile-fallback-fit hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/Blog%20Images/TextQL%20Dashboard%20blog/image%20-5-.png" size="custom" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_Vpl3X3Goe3NEwaFLCAan1A" data-element-type="row" class="zprow zprow-container zpalign-items-flex-start zpjustify-content-flex-start zpdefault-section zpdefault-section-bg " data-equal-column="false"><style type="text/css"></style><div data-element-id="elm_iwc_Op4VILosqzfc1jGUsw" data-element-type="column" class="zpelem-col zpcol-12 zpcol-md-5 zpcol-sm-12 zpalign-self- zpdefault-section zpdefault-section-bg "><style type="text/css"></style><div data-element-id="elm_9jwaiCndbrhWFitRbV917Q" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><p><span style="font-family:Arial, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, sans-serif;">She pulls down the data for a subset of the Citi bike data and merges the two together.</span><span></span></p><div>Remember this is ALL still happening in the same one question I asked: “can you compare usage of bikes vs weather for the same dates in 2017?” I have not had to intervene yet.<br/><br/>And voila! In a matter of minutes, Ana has:<br/><ul><li>Reviewed the data she already has</li><li>Gone to find the additional data I requested that wasn’t included</li><li>Found a free data source she could use and brought in the data</li><li>Merged it with my existing data</li><li>Analyzed it and returned the results with a detailed statistical analysis&nbsp;</li></ul></div><p></p><p><span>Now, while the visualizations in this example are not interactive or the prettiest, they are pretty damn good for an output with less than ~15 minutes of work. They give me the information I wanted, plus more. And they open up other avenues for me to keep exploring and drilling into my data. (And let’s face it, Stats was never my jam in school so having Ana do the heavy lifting for me is a relief.)<br/>I can now say my hypothesis was correct: better weather = more bike rides!&nbsp;</span></p></div>
</div></div><div data-element-id="elm_JVAtrXw-wBuOsl7ZVpBF0g" data-element-type="column" class="zpelem-col zpcol-12 zpcol-md-7 zpcol-sm-12 zpalign-self- zpdefault-section zpdefault-section-bg "><style type="text/css"></style><div data-element-id="elm_0ye-ypXcD10AAxK0kStm8w" data-element-type="image" class="zpelement zpelem-image "><style> @media (min-width: 992px) { [data-element-id="elm_0ye-ypXcD10AAxK0kStm8w"] .zpimage-container figure img { width: 660px !important ; height: 553px !important ; } } </style><div data-caption-color="" data-size-tablet="" data-size-mobile="" data-align="center" data-tablet-image-separate="false" data-mobile-image-separate="false" class="zpimage-container zpimage-align-center zpimage-tablet-align-center zpimage-mobile-align-center zpimage-size-custom zpimage-tablet-fallback-fit zpimage-mobile-fallback-fit hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/Blog%20Images/TextQL%20Dashboard%20blog/image%20-6-.png" size="custom" data-lightbox="true"/></picture></span></figure></div>
</div></div></div><div data-element-id="elm_TELBRqQepD4MKMrVGZoC4g" data-element-type="divider" class="zpelement zpelem-divider "><style type="text/css"></style><style></style><div class="zpdivider-container zpdivider-line zpdivider-align-center zpdivider-align-mobile-center zpdivider-align-tablet-center zpdivider-width100 zpdivider-line-style-solid "><div class="zpdivider-common"></div>
</div></div><div data-element-id="elm_anJ3ptrpUnn4StkQGPWG1A" data-element-type="heading" class="zpelement zpelem-heading "><style></style><h2
 class="zpheading zpheading-style-none zpheading-align-left zpheading-align-mobile-left zpheading-align-tablet-left " data-editor="true"><span>Level Up</span></h2></div>
<div data-element-id="elm_1UARsHCXnCyyGs8DOOSq3A" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><p><span>As I mentioned before, just this week, TextQL released Dashboards. So of course, I had to jump back in and see how Ana would handle my previous analysis with the Dashboard capability.&nbsp;<br/><br/>In the Dashboard window in TextQL, I select “+ New Dashboard” which opens up a Thread with Ana with the Dashboards output tool selected. I give her a pretty vague prompt because I want to see what she can do.&nbsp;</span></p></div>
</div><div data-element-id="elm_kgAXJmg-L_mkGPmWdb-UWg" data-element-type="image" class="zpelement zpelem-image "><style> @media (min-width: 992px) { [data-element-id="elm_kgAXJmg-L_mkGPmWdb-UWg"] .zpimage-container figure img { width: 508px !important ; height: 192px !important ; } } </style><div data-caption-color="" data-size-tablet="" data-size-mobile="" data-align="center" data-tablet-image-separate="false" data-mobile-image-separate="false" class="zpimage-container zpimage-align-center zpimage-tablet-align-center zpimage-mobile-align-center zpimage-size-custom zpimage-tablet-fallback-fit zpimage-mobile-fallback-fit hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/Blog%20Images/TextQL%20Dashboard%20blog/image%20-7-.png" size="custom" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_iGoWWcTva4XIjCQcNnX1JQ" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><p><span>About a minute and thirty seconds in, Ana lets me know to hang tight.&nbsp;</span></p></div>
</div><div data-element-id="elm_Co3O4rn1NIBpHFtH0fH8Pw" data-element-type="image" class="zpelement zpelem-image "><style> @media (min-width: 992px) { [data-element-id="elm_Co3O4rn1NIBpHFtH0fH8Pw"] .zpimage-container figure img { width: 515px !important ; height: 125px !important ; } } </style><div data-caption-color="" data-size-tablet="" data-size-mobile="" data-align="center" data-tablet-image-separate="false" data-mobile-image-separate="false" class="zpimage-container zpimage-align-center zpimage-tablet-align-center zpimage-mobile-align-center zpimage-size-original zpimage-tablet-fallback-fit zpimage-mobile-fallback-fit hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/Blog%20Images/TextQL%20Dashboard%20blog/image%20-8-.png" size="original" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_GKaCCb5y2WNzKj0w8HHtqQ" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><p><span>And one minute later I get my results....</span></p></div>
</div><div data-element-id="elm_0nw6yDIlI31KZnK21Aw89g" data-element-type="image" class="zpelement zpelem-image "><style> @media (min-width: 992px) { [data-element-id="elm_0nw6yDIlI31KZnK21Aw89g"] .zpimage-container figure img { width: 1110px ; height: 500.19px ; } } </style><div data-caption-color="" data-size-tablet="" data-size-mobile="" data-align="center" data-tablet-image-separate="false" data-mobile-image-separate="false" class="zpimage-container zpimage-align-center zpimage-tablet-align-center zpimage-mobile-align-center zpimage-size-fit zpimage-tablet-fallback-fit zpimage-mobile-fallback-fit hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/Blog%20Images/TextQL%20Dashboard%20blog/image%20-9-.png" size="fit" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_VHaP9_AhM7ueyfCQcxJ_Rg" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><p></p><div>Ana did all of this before Taylor Swift’s “I Wish You Would” ended.... so less than 3 min 27 seconds for those wondering. <br/><br/>I now have an interactive, multi-tabbed dashboard exploring the impact weather has on the Citi Bike rentals in 2015 (Ana must have chosen that time range for me.) <br/><br/>From a Tableau developer’s perspective, these visualizations are pretty good. I certainly prefer them over the static images that Ana provided in the .png in my previous Thread. The colors are fine and (possibly?) color blind friendly. I like the use of icons in the Tab names. And the dashboard elements easily scale as I resize my window. There are some spacing things that need slight adjusting, but it has a good use of white space and text hierarchy. The filtering is decent but needs some tweaking, though I mostly like the experience.<br/></div><p></p></div>
</div><div data-element-id="elm_uRFTtgY8es54f7Pc-b19Qg" data-element-type="row" class="zprow zprow-container zpalign-items-flex-start zpjustify-content-flex-start zpdefault-section zpdefault-section-bg " data-equal-column="false"><style type="text/css"></style><div data-element-id="elm_eibFscuQka7crgSFk3tgqQ" data-element-type="column" class="zpelem-col zpcol-12 zpcol-md-6 zpcol-sm-12 zpalign-self- zpdefault-section zpdefault-section-bg "><style type="text/css"></style><div data-element-id="elm_0NxE-yO98Tm2Qiike6dElw" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><p></p><div>Let’s give Ana some feedback and see what she can do:<br/><ul><li>Change Seasons to Months for the time filter</li><li>Remove Temp filter</li><li>Add in Neighborhoods</li><li>Add in “Select All” options on Filters for easy UX</li></ul></div><p></p></div>
</div></div><div data-element-id="elm_lyw_qoaitdh01g_YEe66Lw" data-element-type="column" class="zpelem-col zpcol-12 zpcol-md-6 zpcol-sm-12 zpalign-self- zpdefault-section zpdefault-section-bg "><style type="text/css"></style><div data-element-id="elm_pYOAIJTj8WElFY2Qs5nw3Q" data-element-type="image" class="zpelement zpelem-image "><style> @media (min-width: 992px) { [data-element-id="elm_pYOAIJTj8WElFY2Qs5nw3Q"] .zpimage-container figure img { width: 469.57px !important ; height: 257px !important ; } } </style><div data-caption-color="" data-size-tablet="" data-size-mobile="" data-align="center" data-tablet-image-separate="false" data-mobile-image-separate="false" class="zpimage-container zpimage-align-center zpimage-tablet-align-center zpimage-mobile-align-center zpimage-size-custom zpimage-tablet-fallback-fit zpimage-mobile-fallback-fit hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/Blog%20Images/TextQL%20Dashboard%20blog/image%20-10-.png" size="custom" data-lightbox="true"/></picture></span></figure></div>
</div></div></div><div data-element-id="elm_MwXiGR7Ys2sHX_JpXbgtMw" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><p><span>Here is the updated dashboard - peek the new filters on the left pane:</span></p></div>
</div><div data-element-id="elm_en5nZZOf9zwrlSZMlJuiWQ" data-element-type="image" class="zpelement zpelem-image "><style> @media (min-width: 992px) { [data-element-id="elm_en5nZZOf9zwrlSZMlJuiWQ"] .zpimage-container figure img { width: 808px !important ; height: 610px !important ; } } </style><div data-caption-color="" data-size-tablet="" data-size-mobile="" data-align="center" data-tablet-image-separate="false" data-mobile-image-separate="false" class="zpimage-container zpimage-align-center zpimage-tablet-align-center zpimage-mobile-align-center zpimage-size-custom zpimage-tablet-fallback-fit zpimage-mobile-fallback-fit hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/Blog%20Images/TextQL%20Dashboard%20blog/image%20-11-.png" size="custom" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_Osxz7vKxcrQpoZlFuHT8iQ" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><p><span>Things are looking good at first glance, though upon interaction with my new filters I find some bugs in how the Select All options work. I give Ana that feedback (luckily she doesn’t mind some typos!).&nbsp;</span></p></div>
</div><div data-element-id="elm__nKEVT1xNeyOKDBMt8uD-g" data-element-type="image" class="zpelement zpelem-image "><style> @media (min-width: 992px) { [data-element-id="elm__nKEVT1xNeyOKDBMt8uD-g"] .zpimage-container figure img { width: 602px !important ; height: 441px !important ; } } </style><div data-caption-color="" data-size-tablet="" data-size-mobile="" data-align="center" data-tablet-image-separate="false" data-mobile-image-separate="false" class="zpimage-container zpimage-align-center zpimage-tablet-align-center zpimage-mobile-align-center zpimage-size-custom zpimage-tablet-fallback-fit zpimage-mobile-fallback-fit hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/Blog%20Images/TextQL%20Dashboard%20blog/image%20-12-.png" size="custom" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_w5XnR8J7QYBvkiERLFurgQ" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><p><span>Okay now we are getting somewhere exciting! Everything is looking really good. I want to see what happens when I ask Ana to change the colors to match a random swatch I found online, took a screenshot of, and pasted into my chat with Ana asking her to update the colors to match the swatch.&nbsp;</span></p></div>
</div><div data-element-id="elm_ujHGKItvE_QsaRA6Cz2hbw" data-element-type="image" class="zpelement zpelem-image "><style> @media (min-width: 992px) { [data-element-id="elm_ujHGKItvE_QsaRA6Cz2hbw"] .zpimage-container figure img { width: 195px !important ; height: 46px !important ; } } </style><div data-caption-color="" data-size-tablet="" data-size-mobile="" data-align="center" data-tablet-image-separate="false" data-mobile-image-separate="false" class="zpimage-container zpimage-align-center zpimage-tablet-align-center zpimage-mobile-align-center zpimage-size-original zpimage-tablet-fallback-fit zpimage-mobile-fallback-fit hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/Blog%20Images/TextQL%20Dashboard%20blog/image%20-13-.png" size="original" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_VtjCyTmHE9WZB6sBquKJZA" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><p><span>Alright - she’s got the dashboard updated. Surprisingly, that one seemed to take longer than some of the other requests.</span></p></div>
</div><div data-element-id="elm_iQtlnp0WuoxaCqrYkcE5DA" data-element-type="image" class="zpelement zpelem-image "><style> @media (min-width: 992px) { [data-element-id="elm_iQtlnp0WuoxaCqrYkcE5DA"] .zpimage-container figure img { width: 921px !important ; height: 779px !important ; } } </style><div data-caption-color="" data-size-tablet="" data-size-mobile="" data-align="center" data-tablet-image-separate="false" data-mobile-image-separate="false" class="zpimage-container zpimage-align-center zpimage-tablet-align-center zpimage-mobile-align-center zpimage-size-custom zpimage-tablet-fallback-fit zpimage-mobile-fallback-fit hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/Blog%20Images/TextQL%20Dashboard%20blog/image%20-14-.png" size="custom" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_9TM8mjW1_EIcBZ32eEuyHw" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><p><span>I love it!&nbsp;</span></p><p><span><br/></span></p><p><span><span>From here, I can publish the dashboard to users in my organization and let them see and interact with it. I’d say that was an hour well spent to not only explore the data, create a dashboard, AND write this blog post!&nbsp;</span><br/></span></p></div>
</div><div data-element-id="elm_6Olx9QOpUemOaJaOzqFraw" data-element-type="image" class="zpelement zpelem-image "><style> @media (min-width: 992px) { [data-element-id="elm_6Olx9QOpUemOaJaOzqFraw"] .zpimage-container figure img { width: 720px !important ; height: 118px !important ; } } </style><div data-caption-color="" data-size-tablet="" data-size-mobile="" data-align="center" data-tablet-image-separate="false" data-mobile-image-separate="false" class="zpimage-container zpimage-align-center zpimage-tablet-align-center zpimage-mobile-align-center zpimage-size-custom zpimage-tablet-fallback-fit zpimage-mobile-fallback-fit hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/Blog%20Images/TextQL%20Dashboard%20blog/image%20-15-.png" size="custom" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_dS0vrkbkyuYHvtr7XvMr4Q" data-element-type="divider" class="zpelement zpelem-divider "><style type="text/css"></style><style></style><div class="zpdivider-container zpdivider-line zpdivider-align-center zpdivider-align-mobile-center zpdivider-align-tablet-center zpdivider-width100 zpdivider-line-style-solid "><div class="zpdivider-common"></div>
</div></div><div data-element-id="elm_6YUq_i-XcstonF2sNhohYA" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><h4 style="text-align:center;">If you want to see a Live Demo with Ana connected to your data, reach out below and we can help you get started!</h4></div>
</div><div data-element-id="elm_osb7SELgQpS0Y1qbHiEY_A" data-element-type="button" class="zpelement zpelem-button "><style></style><div class="zpbutton-container zpbutton-align-center zpbutton-align-mobile-center zpbutton-align-tablet-center"><style type="text/css"></style><a class="zpbutton-wrapper zpbutton zpbutton-type-primary zpbutton-size-md zpbutton-style-none " href="/contact-us" target="_blank"><span class="zpbutton-content">Request a Live Demo of TextQL</span></a></div>
</div></div></div></div></div></div> ]]></content:encoded><pubDate>Thu, 05 Mar 2026 16:37:37 -0600</pubDate></item><item><title><![CDATA[Bring Tableau and Agentic Analytics Together with the VDS API]]></title><link>https://www.highperformance.tech/blogs/post/bring-tableau-and-agentic-analytics-together-with-the-vds-api</link><description><![CDATA[We talk with a lot of companies that want AI in their analytics practice, but aren't totally sure what that looks like. Many of them want it enough ]]></description><content:encoded><![CDATA[<div class="zpcontent-container blogpost-container "><div data-element-id="elm_RMAPxqigS92nnBj0B8_cOg" data-element-type="section" class="zpsection "><style type="text/css"></style><div class="zpcontainer-fluid zpcontainer"><div data-element-id="elm_V1oLFlDNSM-to5AuuosMdQ" data-element-type="row" class="zprow zprow-container zpalign-items-flex-start zpjustify-content- " data-equal-column="false"><style type="text/css"></style><div data-element-id="elm_m0kg8GLPQxC9duxaZjzdwA" data-element-type="column" class="zpelem-col zpcol-12 zpcol-md-8 zpcol-sm-12 zpalign-self- "><style type="text/css"></style><div data-element-id="elm_74ibrWaaGUOh2W1vw4r7sA" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><div>We talk with a lot of companies that want AI in their analytics practice, but aren't totally sure what that looks like. Many of them want it enough that they are tolerating some oddities they shouldn't be, especially as they're exploring feature sets that haven't yet proven their worth. Specifically, they're having to build/define the same data sources and metrics in the AI system, simply because the AI system can't handle connecting to what's already there.</div></div>
</div><div data-element-id="elm_70qtiLwgHa-FY-VkdqH8Rg" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><div><div style="text-align:left;">I've been working a lot with Ana, the agentic AI analyst made by TextQL, and have been extremely impressed by how it's able to navigate querying and connecting data from many different data sources, including APIs. Its command of Python and the iterative nature of analytics is the best I've seen. So I thought it might make sense for me to have Ana use Tableau's VizQL Data Service API to connect to Published Data Sources on Tableau Server (or Cloud), and see how it handles interacting with and querying the very same data sources that Tableau dashboards use. It took some iteration but worked out well. So I'm showing you how I did it!</div></div></div>
</div><div data-element-id="elm_aoW7YLHj1ghC5RoHo7Kxsw" data-element-type="text" class="zpelement zpelem-text zp-hidden-md zp-hidden-sm zp-hidden-xs "><style> [data-element-id="elm_aoW7YLHj1ghC5RoHo7Kxsw"].zpelem-text { background-color:#F3CECE; background-image:unset; border-style:solid; border-color:#D42B2B !important; border-width:1px; border-radius:4px; padding-inline-start:10px; } </style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><span style="font-style:italic;"><span style="font-weight:bold;">pssst.</span> if you'd like to see me&nbsp;actually&nbsp;do this live, register for the webinar on the right. i'd love to see you there</span></div>
</div><div data-element-id="elm_XYyrUMIK19BL3MSMHy9PLw" data-element-type="codeSnippet" class="zpelement zpelem-codesnippet zp-hidden-md zp-hidden-sm zp-hidden-xs "><div class="zpsnippet-container"><!-- Webinar Inline Snippet 1 - Compact Banner --><!-- For Zoho Sites: Add as Custom HTML element between paragraphs --><style> .hpt-webinar-inline-1 { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif; background: #f7f7f7; border-radius: 10px; padding: 20px 24px; margin: 32px 0; display: flex; align-items: center; justify-content: space-between; gap: 20px; flex-wrap: wrap; position: relative; overflow: hidden; border: 1px solid #e8e8e8; } .hpt-webinar-inline-1::before { content: ''; position: absolute; left: 0; top: 0; bottom: 0; width: 4px; background: rgb(235, 77, 94); } .hpt-webinar-inline-1 .content { flex: 1; min-width: 250px; } .hpt-webinar-inline-1 .label { display: inline-flex; align-items: center; gap: 6px; font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.8px; color: rgb(200, 60, 75); margin-bottom: 6px; } .hpt-webinar-inline-1 .label svg { width: 14px; height: 14px; } .hpt-webinar-inline-1 h4 { font-size: 16px; font-weight: 600; color: #2a2a2a; margin: 0 0 4px 0; line-height: 1.4; } .hpt-webinar-inline-1 .meta { font-size: 13px; color: #666; } .hpt-webinar-inline-1 .cta-btn { display: inline-block; background: rgb(235, 77, 94); color: #fff; padding: 12px 24px; border-radius: 6px; text-decoration: none; font-weight: 600; font-size: 14px; white-space: nowrap; transition: background 0.2s, transform 0.2s; } .hpt-webinar-inline-1 .cta-btn:hover { background: rgb(210, 65, 80); transform: translateY(-1px); } </style><div class="hpt-webinar-inline-1"><div class="content"><div class="label"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polygon points="23 7 16 12 23 17 23 7"></polygon><rect x="1" y="5" width="15" height="14" rx="2" ry="2"></rect></svg> Live Webinar · Dec 18 </div>
<h4>Unlock AI-Powered Analytics on Your Existing Tableau Data</h4><div class="meta">Live demo of Ana + Tableau VDS Integration · 11:00 AM CST</div>
</div><a href="https://go.highperformance.tech/ana-tableau-vds-webinar-dec-2025/" class="cta-btn" target="_blank" rel="noopener"> Register Free </a></div>
</div></div><div data-element-id="elm_32fGC8sMVPl4os-XJoYyGA" data-element-type="heading" class="zpelement zpelem-heading "><style></style><h3
 class="zpheading zpheading-style-none zpheading-align-left zpheading-align-mobile-left zpheading-align-tablet-left " data-editor="true">What's VDS?</h3></div>
<div data-element-id="elm_dqTBNg-2ryy0Hc9qpcNbbw" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><div>Tableau's&nbsp;<a href="https://help.tableau.com/current/api/vizql-data-service/en-us/index.html">VizQL Data Service</a>&nbsp;API (VDS) gives you programmatic access to Published Data Sources on Tableau Server/Cloud. Since it's the same data sources your dashboards use (and therefore the same data model), you can reuse the field names, calculations, and relationships you've already defined. It automatically respects row-level security and permissions. There's no need to download extracts or hit underlying databases directly, risking bypassing the governance you've already established in Tableau. Instead, everything goes through Tableau's governance.</div></div>
</div><div data-element-id="elm_QYCAokRwW-YjX9Ag3PzF3Q" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><div>In contrast to the REST API, which is powerful for managing metadata and performing administrative operations, VDS provides a more direct way to access data. While the REST API allows you to download detail or summary data from specific visualizations, it requires an extra step. VDS lets you query the Published Data Source itself, just like the dashboards do, making it a more seamless option for accessing data.</div></div>
</div><div data-element-id="elm_oPNX3X_uMOX2zFRIbXy5Rg" data-element-type="heading" class="zpelement zpelem-heading "><style></style><h3
 class="zpheading zpheading-style-none zpheading-align-left zpheading-align-mobile-left zpheading-align-tablet-left " data-editor="true">Who or What is Ana?</h3></div>
<div data-element-id="elm_k9w5bEuJmrBJp3ZSoi304g" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><div>Ana is an agentic AI analyst built by TextQL. It's excellent at querying and coding (especially making API requests), tool calling, and iterative analysis. It understands data structures and relationships intuitively, and can reason about analysis steps. It can hold context across many many steps, build on previous queries, and create artifacts like Streamlit apps, static visualizations, downloadable reports... even playbooks that email you or Slack you their results after they run. (Yes, it supports Teams too...)</div></div>
</div><div data-element-id="elm_RnPVsIw7Vpbvk3KbxYMfjQ" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><div><div>And it's observable: you can see what it's doing, how it's doing it, and thanks to inline comments, <i>why</i> it's doing what it's doing.</div></div></div>
</div><div data-element-id="elm_GHb4XYkxtdXC_RHUoiFDaQ" data-element-type="heading" class="zpelement zpelem-heading "><style></style><h3
 class="zpheading zpheading-style-none zpheading-align-left zpheading-align-mobile-left zpheading-align-tablet-left " data-editor="true">Connecting Ana to Tableau with the VDS API</h3></div>
<div data-element-id="elm_9X70gTY71aA-hwfUhl9KUQ" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><div>To connect Ana to Tableau's Viz Data Service, we need:<br/><ul><li>Tableau Server/Cloud with Published Data Sources</li><li>Ana (hosted by TextQL) as the AI analyst</li><li>VDS API to let Ana query Tableau's Published Data Sources</li></ul></div></div>
</div><div data-element-id="elm_r1nC5rUqZoCePiXcL-d6sw" data-element-type="heading" class="zpelement zpelem-heading "><style></style><h4
 class="zpheading zpheading-style-none zpheading-align-left zpheading-align-mobile-left zpheading-align-tablet-left " data-editor="true">Setting Up</h4></div>
<div data-element-id="elm_u4gkPzT7u2O-6KWz9FQu7w" data-element-type="heading" class="zpelement zpelem-heading "><style></style><h5
 class="zpheading zpheading-style-none zpheading-align-left zpheading-align-mobile-left zpheading-align-tablet-left " data-editor="true"><span>Teach Ana about the relevant technologies using the Context Library</span></h5></div>
<div data-element-id="elm_Aie2u0tRQWOidKHrU81ejg" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-center zptext-align-mobile-center zptext-align-tablet-center " data-editor="true"><div></div><div></div><div style="text-align:left;"><div><div><div>To start out, we gave Ana some context that makes it better at using the relevant tools. Ana has a context library where you can store information that can be dynamically added to a chat's context based on user roles or which data connectors are selected for the chat. As TextQL admins, we can add this context from the &quot;Organization Context&quot; tab on the Settings page. It's quite straightforward:</div></div></div></div></div>
</div><div data-element-id="elm_zNk0W2i2Y9mzvmpj4NjiMg" data-element-type="image" class="zpelement zpelem-image "><style> @media (min-width: 992px) { [data-element-id="elm_zNk0W2i2Y9mzvmpj4NjiMg"] .zpimage-container figure img { width: 730px ; height: 587.65px ; } } </style><div data-caption-color="" data-size-tablet="" data-size-mobile="" data-align="center" data-tablet-image-separate="false" data-mobile-image-separate="false" class="zpimage-container zpimage-align-center zpimage-tablet-align-center zpimage-mobile-align-center zpimage-size-fit zpimage-tablet-fallback-fit zpimage-mobile-fallback-fit hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/organization-context.gif" size="fit" alt="A visual walkthrough of creating a context snippet and associating it with the Admin and Member roles." data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_YyGFZ-tSwu6kLn_TS7d6MA" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><p></p><div>To be clear, this context is not strictly required! It just allows Ana to cut through some repetition and trial-and-error, which saves us time and money. It took some iterating, and we ultimately landed on context that includes:<br/><ul><li>Authenticating to Tableau - using a Personal Access Token, in this case; more on that in a moment...</li><li>Finding the data source - using the good old-fashioned REST API</li><li>Exploring fields/metadata - using the new VDS API</li><li>Constructing queries</li><li>Analyzing results and iterating</li><li>Filtering strategies</li><li>Performance tips</li><li>Common patterns:</li><ul><li>Simple query</li><li>Searching with fuzzy matching</li><li>Complex filtering</li></ul><li>Error handling</li><li>Additional resources</li></ul>Here's the raw text we use that you can easily copy and paste into your own context library:</div><p></p></div>
</div><div data-element-id="elm_VmocnN6MRhzDHCQyk3CIzw" data-element-type="buttonicon" class="zpelement zpelem-buttonicon "><style></style><div class="zpbutton-container zpbutton-align-left zpbutton-align-mobile-center zpbutton-align-tablet-center "><style type="text/css"></style><a class="zpbutton-wrapper zpbutton zpbutton-type-link zpbutton-size-md zpbutton-icon-align-left " href="/files/ana-vds-api-context.txt" download rel="nofollow noopener"><span class="zpbutton-icon "><svg viewBox="0 0 24 24" height="24" width="24" aria-label="hidden" xmlns="http://www.w3.org/2000/svg"><path d="M11 5C11 4.44772 11.4477 4 12 4C12.5523 4 13 4.44772 13 5V12.1578L16.2428 8.91501L17.657 10.3292L12.0001 15.9861L6.34326 10.3292L7.75748 8.91501L11 12.1575V5Z"></path><path d="M4 14H6V18H18V14H20V18C20 19.1046 19.1046 20 18 20H6C4.89543 20 4 19.1046 4 18V14Z"></path></svg></span><span class="zpbutton-content">Download the Code Snippet</span></a></div>
</div><div data-element-id="elm_qXEunLlEUyj4yfSZ-RItVA" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true">With that in place, we need to ensure Ana can authenticate to the Tableau APIs when it needs to.</div>
</div><div data-element-id="elm_4-OcJY6ENpJ2rIqdYhpYdQ" data-element-type="heading" class="zpelement zpelem-heading "><style></style><h4
 class="zpheading zpheading-style-none zpheading-align-left zpheading-align-mobile-left zpheading-align-tablet-left " data-editor="true">Setting Up Authentication</h4></div>
<div data-element-id="elm_Y0xFBmwQqL4dCoQNiqFs1Q" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><p></p><div><div>Personal Access Tokens (PATs) are credentials you create in Tableau that let you authenticate to Tableau APIs without using your own username and password. They are revocable, and they keep you from exposing your actual credentials in various systems, scripts, or configuration files. If your Tableau account uses multi-factor authentication (MFA), like Tableau Cloud accounts often do, then PATs are&nbsp;<span style="font-style:italic;">required</span>&nbsp;for programmatic access since it can be difficult to complete an MFA challenge within an automated workflow.</div></div><p></p></div>
</div><div data-element-id="elm_KVi5iyfsDPIBb5EPxL5sHw" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><div>Creating a PAT in Tableau is very straightforward, and you can see a step-by-step guide here if you haven't done it before, or if you need a refresher: <a href="https://help.tableau.com/current/pro/desktop/en-us/useracct.htm#create-and-manage-personal-access-tokens" title="create and manage personal access tokens" target="_blank" rel="">create and manage personal access tokens</a>.</div><div><br/></div><div><div><span style="font-weight:bold;">Note:</span> Personal Access Tokens <span style="font-weight:bold;">do</span>&nbsp;have an expiration date on them! Based on my personal experience, it's useful to create a reminder a week or two before a PAT expires so you have a chance to create a new one and switch them out before it simply stops working. &quot;A bit of prevention is worth a byte of cure&quot;, as they say.</div></div></div>
</div><div data-element-id="elm_bGLChkXbIE0bBbvY41jYcA" data-element-type="image" class="zpelement zpelem-image "><style> @media (min-width: 992px) { [data-element-id="elm_bGLChkXbIE0bBbvY41jYcA"] .zpimage-container figure img { width: 730px ; height: 385.77px ; } } </style><div data-caption-color="" data-size-tablet="" data-size-mobile="" data-align="center" data-tablet-image-separate="false" data-mobile-image-separate="false" class="zpimage-container zpimage-align-center zpimage-tablet-align-center zpimage-mobile-align-center zpimage-size-fit zpimage-tablet-fallback-fit zpimage-mobile-fallback-fit hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/personal-access-token.png" size="fit" alt="Example of the Personal Access Token screen displaying a new PAT." data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_Ma79foOsNaqjc1xrtUcD5g" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true">Now that we have a PAT from Tableau, we need to store that in a place Ana can find it: the Environment Secrets. As the name suggests, Environment Secrets behaves like a password manager for Ana, allowing it to reference sensitive information like credentials without having to type the details out in the code verbatim.</div>
</div><div data-element-id="elm_DrmGyRQes7RXBa1s5o_LWA" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true">These secrets don't necessarily have to follow an exact pattern, because Ana can inspect them and determine the most appropriate way to use them. I prefer to store them as JSON with a little extra helpful information. In fact, if you downloaded the context snippet from earlier in the post, you'll want to follow the same structure I do. The structure is documented in the snippet, and the snippet's code examples depend on it. Here's what that looks like:</div>
</div><div data-element-id="elm__bOcSr-vhamJCFG2nC6nNg" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><div></div><code>{&quot;server&quot;: &quot;https://tableau.example.com&quot;,&quot;tokenName&quot;:&quot;YOUR_TOKEN_NAME&quot;,&quot;tokenSecret&quot;:&quot;YOUR_TOKEN_SECRET&quot;}</code></div>
</div><div data-element-id="elm_CFgJDwErwrGNgyarA3DMpw" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><div>From here, we navigate to the Settings &gt; Configuration &gt; Manage Secrets page, and create a new secret. We'll need to fill out:</div><div><ul><li>Secret Name - we refer to it as TABLEAU_PAT in our context snippet, so if you're following along, you should too.</li><li>Secret Value - the single line of JSON above, filled out with the relevant values.</li><li>Instructions - Ana sees these instructions in every chat context so it knows when to use which secret. Be sure to give it enough info to make those decisions! In this example, the instructions were: &quot;<span>Use this PAT to authenticate to Tableau Server using their REST API; the authenticated session can be used for other Tableau APIs as well.</span>&quot;</li><li>Docs Links - Any links to reference documentation that may be helpful when using the secret.</li></ul></div></div>
</div><div data-element-id="elm_0o-2fGPjqihK_LlmVbiahA" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true">Here's what the screen looks like just before we click Create:</div>
</div><div data-element-id="elm_xBoJL4gv57460WkFBOPzmg" data-element-type="image" class="zpelement zpelem-image "><style> @media (min-width: 992px) { [data-element-id="elm_xBoJL4gv57460WkFBOPzmg"] .zpimage-container figure img { width: 730px ; height: 422.03px ; } } </style><div data-caption-color="" data-size-tablet="" data-size-mobile="" data-align="center" data-tablet-image-separate="false" data-mobile-image-separate="false" class="zpimage-container zpimage-align-center zpimage-tablet-align-center zpimage-mobile-align-center zpimage-size-fit zpimage-tablet-fallback-fit zpimage-mobile-fallback-fit hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/secrets-manager.png" size="fit" alt="The &quot;Environment Secrets&quot; page with an open modal for adding a new secret." data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_u2pxtZheLU7NR7y5cSgTvQ" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><span style="font-weight:bold;">Note:</span> After you click save, you won't be able to edit or view the secret's details again. If that's a concern for you, there's an easy and more flexible solution we typically use, but that'll have to be a different blog post!</div>
</div><div data-element-id="elm_GkY9CC5JpbNDJeT3Uhi9zQ" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><div>At this point, we've given Ana enough information to:</div><div><ul><li>connect to Tableau using the URL and PAT details from the secret, and</li><li>skillfully use the relevant APIs to authenticate, search for data sources, explore their metadata and data, and query!</li></ul></div></div>
</div><div data-element-id="elm_xLNFEnvddiLTI4GUzg6wfQ" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true">Let's see how it works by creating a new thread and asking a question.</div>
</div><div data-element-id="elm_9xFRh6Utgcew20LvxzRzEw" data-element-type="heading" class="zpelement zpelem-heading "><style></style><h3
 class="zpheading zpheading-style-none zpheading-align-left zpheading-align-mobile-left zpheading-align-tablet-left " data-editor="true">Chatting With Our Data</h3></div>
<div data-element-id="elm_KRqiUVpV3Cc0XT5JmYIdxA" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><div><div>For demo purposes, <a href="https://www.kaggle.com/datasets/bhanuthakurr/cleaned-contoso-dataset?phase=FinishSSORegistration&amp;returnUrl=%2Fdatasets%2Fbhanuthakurr%2Fcleaned-contoso-dataset%2Fversions%2F8" title="we're using a demo data set based on Microsoft's Contoso data set" rel="">we're using a demo dataset based on Microsoft's Contoso dataset</a>.</div></div><div><span style="font-weight:bold;"><br/></span></div><div><div><div><span style="font-weight:normal;">We have created a Published Data Source on Tableau Server that exposes the Online Sales fact table and all of the related dimensions, as well as some calculated metrics and KPIs. We have&nbsp;<span style="font-weight:bold;">not</span>&nbsp;included any details about the data source in Ana's context library, so it will have to explore a little bit to understand how to collect the data we ask it for. Here's that data model in Tableau, for your reference:</span></div></div></div></div>
</div><div data-element-id="elm_bRAeYxCj11TIInHQBz2D9g" data-element-type="image" class="zpelement zpelem-image "><style> @media (min-width: 992px) { [data-element-id="elm_bRAeYxCj11TIInHQBz2D9g"] .zpimage-container figure img { width: 730px ; height: 299.76px ; } } </style><div data-caption-color="" data-size-tablet="" data-size-mobile="" data-align="center" data-tablet-image-separate="false" data-mobile-image-separate="false" class="zpimage-container zpimage-align-center zpimage-tablet-align-center zpimage-mobile-align-center zpimage-size-fit zpimage-tablet-fallback-fit zpimage-mobile-fallback-fit hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/contoso-online-sales-model.png" size="fit" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_TX0X0t0t9c6B-jjFIkq4BA" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true">To keep things interesting, I'm going to ask a question with an intentional but easy-to-resolve error in it:&nbsp;</div>
</div><div data-element-id="elm_cKwLENBK7PKSSZTd0ZsF2A" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><blockquote style="margin-left:40px;">&quot;Using the Contoso Online Sales data source, show me the sales over time for the customer named Tom Miller.&quot;</blockquote></div>
</div><div data-element-id="elm_Ckds2SdE8ATE0nu-bW01Dw" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true">The dataset has a &quot;Thomas Miller&quot; in it, so it will be interesting to see how Ana handles the discrepancy there. And with that background information out of the way, let's see the chat!</div>
</div><div data-element-id="elm_bqrmR4h9ILl_bqfVqLQcHw" data-element-type="row" class="zprow zprow-container zpalign-items-flex-start zpjustify-content-flex-start zpdefault-section zpdefault-section-bg " data-equal-column="false"><style type="text/css"></style><div data-element-id="elm_3g4K9B-7rERkCD1zf-sciQ" data-element-type="column" class="zpelem-col zpcol-12 zpcol-md-5 zpcol-sm-12 zpalign-self- zpdefault-section zpdefault-section-bg "><style type="text/css"></style><div data-element-id="elm_g7CybuC8UNxpiDlqQkjSPw" data-element-type="image" class="zpelement zpelem-image "><style> @media (min-width: 992px) { [data-element-id="elm_g7CybuC8UNxpiDlqQkjSPw"] .zpimage-container figure img { width: 200px ; height: 442.60px ; } } [data-element-id="elm_g7CybuC8UNxpiDlqQkjSPw"] .zpimage-container[class*='zpimage-overlay-effect-'] figure:hover figcaption , [data-element-id="elm_g7CybuC8UNxpiDlqQkjSPw"] .zpimage-container[class*='zpimage-overlay-effect-'] figure figcaption { background:rgba(1,58,81,0.8) ; } </style><div data-caption-color="" data-size-tablet="" data-size-mobile="" data-align="center" data-tablet-image-separate="false" data-mobile-image-separate="false" class="zpimage-container zpimage-align-center zpimage-tablet-align-center zpimage-mobile-align-center zpimage-size-small zpimage-tablet-fallback-fit zpimage-mobile-fallback-fit zpimage-overlay zpimage-overlay-effect-static-bottom hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/tom-miller-sales.png" size="small" data-lightbox="true"/></picture></span><figcaption class="zpimage-caption zpimage-caption-align-center"><span class="zpimage-caption-content">Click to expand</span></figcaption></figure></div>
</div></div><div data-element-id="elm_CQkDlIXbRGgyHpEjMQXGgg" data-element-type="column" class="zpelem-col zpcol-12 zpcol-md-7 zpcol-sm-12 zpalign-self- zpdefault-section zpdefault-section-bg "><style type="text/css"></style><div data-element-id="elm_m4iPkWVxJPh0qPqq2rRVqA" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true">The chat has a few components to it:</div>
</div><div data-element-id="elm_qEdz7tFmoccuuXjFjOTNBw" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><ul><li>The response messages</li><li>The tool call cells</li><li>Artifact previews</li><li>The summary response</li></ul></div>
</div><div data-element-id="elm_3PngwPocfEe0Ynj--cQ32g" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true">In my mind, the interesting things happen in the tool call cells. We can see Ana follow the overall structure we detailed in the context library. It:<p></p></div>
</div><div data-element-id="elm_eCd2LYtSGRfUR-IksIBqbg" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><ol><li>Authenticates</li><li>Lists Data Sources</li><li>Reads Metadata</li><li>Queries Data, and</li><li>Analyzes in Python</li></ol></div>
</div></div></div><div data-element-id="elm_ckS8y_zORhqXqgG-vd6xgg" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true">Overall, everything went as well as we could hope, in seven individual API calls to Tableau! It handled the name issue pretty well. It queried using filters for the First and Last name, and found no results. Since it expected results but found none, it decided to look into the customer names to find similar names. There are a handful of approaches it could have used, but in this case it decided to search for similar names, found the full list of Millers. With the relevant names in context now, it determined that &quot;Thomas&quot; was likely the one I was asking about, and proceeded from there.</div>
</div><div data-element-id="elm_W2JAWZPjozooJb-PIPaNLg" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true">It then created and saved some visualizations of the data using python, as well as wrote the underlying data to a CSV. Finally, it responded with a summary of its findings.</div>
</div><div data-element-id="elm_D5BgyOIHQnpGWkBqcWri3w" data-element-type="heading" class="zpelement zpelem-heading "><style></style><h3
 class="zpheading zpheading-style-none zpheading-align-left zpheading-align-mobile-left zpheading-align-tablet-left " data-editor="true">It Works! Now What?</h3></div>
<div data-element-id="elm_cSGdNkiQ1HPUdINLxwHl5A" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true">So we now have an agentic AI analyst capable of connecting to Tableau and querying the same Published Data Sources we use in our workbooks. We see it's capable of correcting course when things aren't exactly as it first thought. Where do we go from here? Below are a few use cases we've implemented already, and one we're about to implement:</div>
</div><div data-element-id="elm_kih1VnUoIEMggtW_TGAk-Q" data-element-type="heading" class="zpelement zpelem-heading "><style></style><h4
 class="zpheading zpheading-style-none zpheading-align-left zpheading-align-mobile-left zpheading-align-tablet-left " data-editor="true">Playbooks - Executive Summaries via Email or Slack</h4></div>
<div data-element-id="elm_RKBMBXEN2rODMNhB1kLmfA" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true">I mentioned Ana has a playbooks feature that allows you to schedule these analyses to be delivered on a recurring basis over Email, Slack, or Teams. We've implemented operational playbooks that surface actionable information around deal flow and accounts receivable aging. Users enjoy getting the relevant data delivered to them directly in Slack, and&nbsp;<span style="font-weight:bold;">really enjoy</span>&nbsp;being able to ask follow-up questions in the same thread.</div>
</div><div data-element-id="elm_y8Op77dP_RFsoon25uqIvA" data-element-type="heading" class="zpelement zpelem-heading "><style></style><h4
 class="zpheading zpheading-style-none zpheading-align-left zpheading-align-mobile-left zpheading-align-tablet-left " data-editor="true">Exploring Complicated Database Schemas</h4></div>
<div data-element-id="elm_mi5mkfs0fP0gK-axlf2CyQ" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true">We've already seen that Ana is adept at course-correction if something seems off about its findings. Similarly, it's also very good at exploring database schemas and determining how data relates. We have implemented Ana for users who need to uncover specific data without spending a ton of time digesting complicated schemas and ERDs. Ana's iterative discovery process makes easy work of that, and the context library allows users to improve Ana's efficiency over time as it discovers the relevant relationships within the data. Of course, there are several great approaches to mapping out the data models in advance, but that's out of the scope of&nbsp;<span style="font-style:italic;">this</span>&nbsp;post.</div>
</div><div data-element-id="elm_5V6VQqmHVY8z6N8_vIO7Zg" data-element-type="heading" class="zpelement zpelem-heading "><style></style><h4
 class="zpheading zpheading-style-none zpheading-align-left zpheading-align-mobile-left zpheading-align-tablet-left " data-editor="true">In-Dashboard Chats</h4></div>
<div data-element-id="elm_FqzcifuCjvMRVz1FOA5wkQ" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true">This is the one we're most excited to try next: embedding Ana&nbsp;<span style="font-style:italic;">directly inside of a dashboard<span style="font-style:normal;">, giving users a way to ask relevant questions about the data that's right in front of them at the moment.</span></span></div>
</div><div data-element-id="elm_MBGL6Lh_U0H2rDbVKVvSDA" data-element-type="heading" class="zpelement zpelem-heading zp-hidden-md zp-hidden-sm zp-hidden-xs "><style></style><h3
 class="zpheading zpheading-style-type1 zpheading-align-left zpheading-align-mobile-left zpheading-align-tablet-left " data-editor="true">Come see this demo live!</h3></div>
<div data-element-id="elm_aj298wMsmnbq39GWJOJLuQ" data-element-type="text" class="zpelement zpelem-text zp-hidden-md zp-hidden-sm zp-hidden-xs "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><p>Want to see a live end-to-end demonstration of what you just read above? Come see the process start-to-finish, so you can do this with your own Tableau environment! Click the big red button below to register. Even if you can't make it live, we'll send all registrants a recording of the webinar once it wraps up.</p></div>
</div><div data-element-id="elm_lA8Ml603zggkM998asKQUA" data-element-type="codeSnippet" class="zpelement zpelem-codesnippet zp-hidden-md zp-hidden-sm zp-hidden-xs "><div class="zpsnippet-container"><!-- Webinar Inline Snippet 1 - Compact Banner --><!-- For Zoho Sites: Add as Custom HTML element between paragraphs --><style> .hpt-webinar-inline-1 { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif; background: #f7f7f7; border-radius: 10px; padding: 20px 24px; margin: 32px 0; display: flex; align-items: center; justify-content: space-between; gap: 20px; flex-wrap: wrap; position: relative; overflow: hidden; border: 1px solid #e8e8e8; } .hpt-webinar-inline-1::before { content: ''; position: absolute; left: 0; top: 0; bottom: 0; width: 4px; background: rgb(235, 77, 94); } .hpt-webinar-inline-1 .content { flex: 1; min-width: 250px; } .hpt-webinar-inline-1 .label { display: inline-flex; align-items: center; gap: 6px; font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.8px; color: rgb(200, 60, 75); margin-bottom: 6px; } .hpt-webinar-inline-1 .label svg { width: 14px; height: 14px; } .hpt-webinar-inline-1 h4 { font-size: 16px; font-weight: 600; color: #2a2a2a; margin: 0 0 4px 0; line-height: 1.4; } .hpt-webinar-inline-1 .meta { font-size: 13px; color: #666; } .hpt-webinar-inline-1 .cta-btn { display: inline-block; background: rgb(235, 77, 94); color: #fff; padding: 12px 24px; border-radius: 6px; text-decoration: none; font-weight: 600; font-size: 14px; white-space: nowrap; transition: background 0.2s, transform 0.2s; } .hpt-webinar-inline-1 .cta-btn:hover { background: rgb(210, 65, 80); transform: translateY(-1px); } </style><div class="hpt-webinar-inline-1"><div class="content"><div class="label"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polygon points="23 7 16 12 23 17 23 7"></polygon><rect x="1" y="5" width="15" height="14" rx="2" ry="2"></rect></svg> Live Webinar · Dec 18 </div>
<h4>Unlock AI-Powered Analytics on Your Existing Tableau Data</h4><div class="meta">Live demo of Ana + Tableau VDS Integration · 11:00 AM CST</div>
</div><a href="https://go.highperformance.tech/ana-tableau-vds-webinar-dec-2025/" class="cta-btn" target="_blank" rel="noopener"> Register Free </a></div>
</div></div><div data-element-id="elm_GyJhhcV3Cy_d45TalujkWg" data-element-type="heading" class="zpelement zpelem-heading "><style></style><h3
 class="zpheading zpheading-style-type1 zpheading-align-left zpheading-align-mobile-left zpheading-align-tablet-left " data-editor="true">Want to skip the line and get started now?</h3></div>
<div data-element-id="elm_W3wDcCHLRG0BaeKqXpwVFw" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true">Schedule a time to talk with us about our Ana Quick Start, where we guide you and your users through the &quot;getting started&quot; phase so you can see immediate value.</div>
</div><div data-element-id="elm_4Zz-BA8vR-CKUALhQ3IHzw" data-element-type="button" class="zpelement zpelem-button "><style></style><div class="zpbutton-container zpbutton-align-center zpbutton-align-mobile-center zpbutton-align-tablet-center"><style type="text/css"></style><a class="zpbutton-wrapper zpbutton zpbutton-type-secondary zpbutton-size-md zpbutton-style-none " href="https://calendly.com/highperformancetechnologies/quick-call?month=2025-12" target="_blank"><span class="zpbutton-content">Schedule a Call</span></a></div>
</div></div><div data-element-id="elm_r6c2HRP3XZnvwFAl4N6J-Q" data-element-type="column" class="zpelem-col zpcol-12 zpcol-md-4 zpcol-sm-12 zpalign-self- zpdefault-section zpdefault-section-bg zp-hidden-sm zp-hidden-xs zpsticky-enabled"><style type="text/css"> @media (min-width:992px) { [data-element-id="elm_r6c2HRP3XZnvwFAl4N6J-Q"].zpelem-col{ top:150px;z-index:1; } } </style><div data-element-id="elm_Q6c4tjahsq8JYJHZM403TQ" data-element-type="row" class="zprow zprow-container zpalign-items-flex-start zpjustify-content-flex-start zpdefault-section zpdefault-section-bg " data-equal-column="false"><style type="text/css"></style><div data-element-id="elm_L5JHdlowE0ZB-3t5VFQp8A" data-element-type="column" class="zpelem-col zpcol-12 zpcol-md-12 zpcol-sm-12 zpalign-self- zpdefault-section zpdefault-section-bg "><style type="text/css"></style><div data-element-id="elm_qmHZhz5pM5QLGgy5DznhfA" data-element-type="codeSnippet" class="zpelement zpelem-codesnippet zp-hidden-md zp-hidden-sm zp-hidden-xs "><div class="zpsnippet-container"><!-- Webinar Sidebar Snippet - Tableau VDS + Ana Integration --><!-- For Zoho Sites: Add as Custom HTML element in sidebar --><!-- NOTE: Replace the placeholder image src with Brad Fair's actual photo URL --><style> .hpt-webinar-sidebar { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif; background: #ffffff; border-radius: 12px; padding: 24px; color: #333; position: relative; overflow: hidden; box-shadow: 0 4px 20px rgba(0,0,0,0.08); border: 1px solid #e8e8e8; } .hpt-webinar-sidebar::before { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 4px; background: rgb(235, 77, 94); } .hpt-webinar-sidebar .badge { display: inline-block; background: rgba(235, 77, 94, 0.1); color: rgb(200, 60, 75); font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: 1px; padding: 4px 10px; border-radius: 4px; margin-bottom: 12px; } .hpt-webinar-sidebar h3 { font-size: 18px; font-weight: 700; line-height: 1.35; margin: 0 0 14px 0; color: #2a2a2a; } .hpt-webinar-sidebar .info-row { display: flex; align-items: center; gap: 12px; margin-bottom: 16px; padding: 12px; background: #f7f7f7; border-radius: 8px; } .hpt-webinar-sidebar .date-box { background: rgb(235, 77, 94); color: #fff; text-align: center; padding: 8px 12px; border-radius: 6px; min-width: 50px; flex-shrink: 0; } .hpt-webinar-sidebar .date-box .month { font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: 1px; } .hpt-webinar-sidebar .date-box .day { font-size: 22px; font-weight: 700; line-height: 1.1; } .hpt-webinar-sidebar .date-text { flex: 1; font-size: 14px; color: #666; } .hpt-webinar-sidebar .date-text strong { display: block; color: #2a2a2a; } .hpt-webinar-sidebar .host-photo { width: 48px; height: 48px; border-radius: 50%; object-fit: cover; border: 2px solid #fff; box-shadow: 0 2px 8px rgba(0,0,0,0.1); flex-shrink: 0; } .hpt-webinar-sidebar .description { font-size: 14px; line-height: 1.55; color: #555; margin-bottom: 18px; } .hpt-webinar-sidebar .cta-btn { display: block; width: 100%; background: rgb(235, 77, 94); color: #fff; text-align: center; padding: 14px 20px; border-radius: 6px; text-decoration: none; font-weight: 600; font-size: 15px; transition: background 0.2s, transform 0.2s; box-sizing: border-box; } .hpt-webinar-sidebar .cta-btn:hover { background: rgb(210, 65, 80); transform: translateY(-1px); } .hpt-webinar-sidebar .host { margin-top: 16px; padding-top: 14px; border-top: 1px solid #eee; font-size: 12px; color: #888; } .hpt-webinar-sidebar .host strong { color: #555; } </style><div class="hpt-webinar-sidebar"><span class="badge">Free Live Webinar</span><h3>Unlock AI-Powered Analytics on Your Existing Tableau Data</h3><div class="info-row"><div class="date-box"><div class="month">Dec</div>
<div class="day">18</div></div><div class="date-text"><strong>Thursday</strong> 11:00 AM CST </div>
<!--
		<img src="https://www.highperformance.tech/files/img/brad-fair.jpg" alt="Brad Fair" class="host-photo"> --> </div>
<p class="description"> See how to connect TextQL's Ana directly to your Tableau data sources—no rebuilding metrics or governance policies required. </p><a href="https://go.highperformance.tech/ana-tableau-vds-webinar-dec-2025/" class="cta-btn" target="_blank" rel="noopener"> Register Now → </a><div class="host"> Hosted by <strong>Brad Fair</strong>, Principal Solutions Architect </div>
</div></div></div></div></div></div></div></div></div></div> ]]></content:encoded><pubDate>Fri, 12 Dec 2025 13:17:21 -0600</pubDate></item></channel></rss>