<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Tvara]]></title><description><![CDATA[Tvara]]></description><link>https://blog.tvarahq.com</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1755697021689/1cae9f11-c084-4bd0-8995-7a05bfa12677.png</url><title>Tvara</title><link>https://blog.tvarahq.com</link></image><generator>RSS for Node</generator><lastBuildDate>Wed, 20 May 2026 01:59:34 GMT</lastBuildDate><atom:link href="https://blog.tvarahq.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Meet Tvara v1: Build Agents and Workflows Without the Hassle]]></title><description><![CDATA[Introduction
We’re excited to announce the launch of Tvara SDK v1 on PyPI 🎉 – your open-source toolkit to build agents and workflows without getting locked into a single vendor.
Whether you’re a student developer hacking at night, a corporate dev sh...]]></description><link>https://blog.tvarahq.com/meet-tvara-v1-build-agents-and-workflows-without-the-hassle</link><guid isPermaLink="true">https://blog.tvarahq.com/meet-tvara-v1-build-agents-and-workflows-without-the-hassle</guid><category><![CDATA[Artificial Intelligence]]></category><dc:creator><![CDATA[Ashish Lal]]></dc:creator><pubDate>Sun, 17 Aug 2025 11:26:47 GMT</pubDate><content:encoded><![CDATA[<h2 id="heading-introduction">Introduction</h2>
<p>We’re excited to announce the launch of <strong>Tvara SDK v1 on PyPI</strong> 🎉 – your open-source toolkit to build <strong>agents and workflows</strong> without getting locked into a single vendor.</p>
<p>Whether you’re a <strong>student developer hacking at night</strong>, a <strong>corporate dev shipping fast</strong>, or an <strong>enterprise team scaling automation</strong>, Tvara gives you a clean, extensible way to connect models, tools, and workflows.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://youtu.be/kqg5lR47zH8">https://youtu.be/kqg5lR47zH8</a></div>
<p> </p>
<h2 id="heading-why-tvara">Why Tvara?</h2>
<p>We’ve watched too many devs, from students to enterprises, burn hours fighting with agent frameworks.</p>
<ul>
<li><p>LangChain? Bloated boilerplate.</p>
</li>
<li><p>LangGraph? Endless nodes and wiring diagrams.</p>
</li>
</ul>
<p>All you wanted was an agent that <em>just works</em>.</p>
<p><strong>Tvara flips that.</strong></p>
<ul>
<li><p><strong>Multi-LLM freedom</strong> → OpenAI, Claude, Gemini, whatever you prefer.</p>
</li>
<li><p><strong>Plug-and-play connectors</strong> → Gmail, Notion, GitHub, Salesforce, and more.</p>
</li>
<li><p><strong>Agents + Workflows out of the box</strong> → No over-engineering, no 50 lines of setup.</p>
</li>
<li><p><strong>Truly open-source</strong> → No vendor lock-in, no walls around your ideas.</p>
</li>
</ul>
<blockquote>
<p>Stop configuring graphs. Start building agents.</p>
</blockquote>
<h2 id="heading-whos-it-for">Who’s It For?</h2>
<h3 id="heading-students-amp-indie-devs">Students &amp; Indie Devs</h3>
<ul>
<li><p>Example 1: Build a <strong>personal study assistant</strong> that fetches lecture notes from Notion and emails you a summary every morning.</p>
</li>
<li><p>Example 2: Create a <strong>mini research agent</strong> that scrapes GitHub issues + academic APIs, then formats insights into a doc automatically.</p>
</li>
</ul>
<blockquote>
<p>No more long boilerplates. Just mention your tools and you’re good to go.</p>
</blockquote>
<h3 id="heading-corporate-devs">Corporate Devs</h3>
<ul>
<li><p>Example 1: Automate <strong>meeting scheduling</strong>: an agent that parses incoming meeting requests (emails), checks calendar availability, and suggests a slot back.</p>
</li>
<li><p>Example 2: Build a <strong>CI/CD agent</strong> that comments on PRs by analyzing test results + code style.</p>
</li>
</ul>
<blockquote>
<p>Useful side-projects that save hours while making you look like the “AI guy” on the team.</p>
</blockquote>
<h3 id="heading-enterprises">Enterprises</h3>
<ul>
<li><p>Example 1: <strong>Supervised workflow</strong> for lead intake — gather details from multiple sources (Salesforce + Slack + email), then auto-log into CRM.</p>
</li>
<li><p>Example 2: <strong>Multi-step workflow</strong> that routes support tickets based on priority, fetches relevant docs, and escalates high-severity ones to Slack.</p>
</li>
</ul>
<blockquote>
<p>Secure, flexible, and works with your stack.</p>
</blockquote>
<h2 id="heading-one-agent-one-workflow-example">One Agent. One Workflow. Example</h2>
<h3 id="heading-agent-example">Agent Example</h3>
<p><strong>A Notion agent to fetch your data</strong></p>
<pre><code class="lang-python"><span class="hljs-keyword">from</span> tvara.core <span class="hljs-keyword">import</span> Agent

agent = Agent(
    name=<span class="hljs-string">"My Notion Agent"</span>,
    model=<span class="hljs-string">"gemini-2.5-flash"</span>, 
    api_key=<span class="hljs-string">"your_model_api_key"</span>,
    composio_api_key=<span class="hljs-string">"your_composio_api_key"</span>,
    composio_toolkits=[<span class="hljs-string">"notion"</span>],
)

response = agent.run(<span class="hljs-string">"hey hi there. can you summarize 'Pondicherry - 2025' page for me?"</span>)
</code></pre>
<h3 id="heading-workflow-example">Workflow Example</h3>
<p><strong>A weather, poet and Gmail agent who takes the latest weather, creates a poem on it and emails it to users.</strong></p>
<pre><code class="lang-python"><span class="hljs-keyword">from</span> tvara.core <span class="hljs-keyword">import</span> Agent, Workflow, Prompt

weather_agent = Agent(
    name=<span class="hljs-string">"Weather Agent"</span>,
    model=<span class="hljs-string">"gemini-2.5-flash"</span>,
    api_key=<span class="hljs-string">"your_model_api_key"</span>,
    composio_api_key=<span class="hljs-string">"your_composio_api_key"</span>,
    composio_toolkits=[<span class="hljs-string">"WEATHERMAP"</span>],
)

poet_agent = Agent(
    name=<span class="hljs-string">"Poet Agent"</span>,
    model=<span class="hljs-string">"gemini-2.5-flash"</span>,
    api_key=<span class="hljs-string">"your_model_api_key"</span>,
)

gmail_agent = Agent(
    name=<span class="hljs-string">"Gmail Agent"</span>,
    model=<span class="hljs-string">"gemini-2.5-flash"</span>,
    api_key=<span class="hljs-string">"your_model_api_key"</span>,
    composio_api_key=<span class="hljs-string">"your_composio_api_key"</span>,
    composio_toolkits=[<span class="hljs-string">"gmail"</span>]
)

manager_agent = Agent(
    name=<span class="hljs-string">"Manager Agent"</span>,
    model=<span class="hljs-string">"gemini-2.5-flash"</span>,
    api_key=<span class="hljs-string">"your_model_api_key"</span>,
    prompt=Prompt(
        raw_prompt=<span class="hljs-string">"You are a workflow manager coordinating multiple AI agents. Your job is to decide what should happen next."</span>
    )
)

my_workflow = Workflow(
    name= <span class="hljs-string">"Sample Workflow"</span>,
    agents=[weather_agent, poet_agent, gmail_agent],
    mode= <span class="hljs-string">"supervised"</span>,
    manager_agent=manager_agent,
)

response = my_workflow.run(<span class="hljs-string">"get the latest weather of sanfrancisco, write about it in a poetic way and send it to team@tvarahq.com on Gmail"</span>).final_output
</code></pre>
<h2 id="heading-why-v1-matters">Why v1 Matters</h2>
<p>This is just the start. Tvara v1 brings a foundation: agents, workflows, connectors, multi-LLM. From here, we’re building towards <strong>truly reactive, supervised, deployable workflows!</strong></p>
<h2 id="heading-get-started">Get Started</h2>
<ul>
<li><p><a target="_blank" href="https://pypi.org/project/tvara/">PyPI</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tvarahq/tvara">GitHub</a></p>
</li>
</ul>
<pre><code class="lang-bash">pip install tvara
</code></pre>
<p>We can’t wait to see what you’ll build. Tag us with your projects!</p>
<h2 id="heading-contribute">Contribute</h2>
<p>Tvara is open-source, built with love, and we’d love for you to be part of its journey!<br />Whether you’re a seasoned developer or making your <strong>first ever open-source contribution</strong>, Tvara is a safe and welcoming space to learn, build, break, and improve together.</p>
<p>Here’s how you can start:</p>
<ul>
<li><p><strong>Star the repo</strong> to show your support (it really helps us grow!)</p>
</li>
<li><p>Spot a bug? Open an issue.</p>
</li>
<li><p>Got an idea? Share it or send a PR.</p>
</li>
<li><p>Improve our docs or add examples (every little bit counts!)</p>
</li>
</ul>
<p>Remember, every contribution, no matter how small, makes Tvara better. You’re not just contributing code, you’re helping shape a tool that can impact how agents and workflows are built worldwide.</p>
<p>So jump in, experiment, and let’s build something amazing together!<br />Check out our <a target="_blank" href="https://github.com/tvarahq/tvara/blob/main/CONTRIBUTING.md">CONTRIBUTING.md</a> to get started.</p>
]]></content:encoded></item><item><title><![CDATA[Enhance Workflows with Tvara Beta v0.1]]></title><description><![CDATA[Introduction
In the last post, we explored what agents are and how they operate using tools and connectors. Now, it's time to build something with them: workflows - coordinated teams of multiple agents working together to accomplish a goal.
Workflows...]]></description><link>https://blog.tvarahq.com/enhance-workflows-with-tvara-beta-v01</link><guid isPermaLink="true">https://blog.tvarahq.com/enhance-workflows-with-tvara-beta-v01</guid><category><![CDATA[tvara]]></category><category><![CDATA[tvara-sdk]]></category><category><![CDATA[AI]]></category><dc:creator><![CDATA[Ashish Lal]]></dc:creator><pubDate>Sun, 03 Aug 2025 19:10:51 GMT</pubDate><content:encoded><![CDATA[<h2 id="heading-introduction">Introduction</h2>
<p>In the last post, we explored what agents are and how they operate using tools and connectors. Now, it's time to build something with them: <strong><em>workflows</em></strong> - coordinated teams of multiple agents working together to accomplish a goal.</p>
<p>Workflows are end-to-end solutions designed to solve specific problem statements. Think of it this way: <em>You want to buy an ice cream and deliver it to your friends at a park. One agent figures out the nearest ice cream shop, another places the order, a third handles the payment, and a fourth navigates the delivery route. Each agent handles a specific task, but together, they complete the full experience. That’s a workflow.</em></p>
<p>Visually, a workflow might look like this:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1754246552699/79b9a6ca-9a3c-469d-b412-91a3561b58e3.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-types-of-workflows">Types of Workflows</h2>
<p>Hmm.. might look complex, but here’s the thing - in Tvara, we have statrted off simple by providing two types of workflows for devs - Sequential and Supervised.</p>
<ol>
<li><p><strong>Sequential Workflow:</strong> In this workflow, you define a series of agents that are tightly connected to each other, working together to solve a task step by step. The output of one agent becomes the input for the next like a chain reaction.</p>
<p> Use this for <strong>basic, linear tasks</strong> where all agents share a common context. Be aware that since the context is passed along, there's a higher chance of <strong>hallucinations</strong> if the task drifts too far from the initial input.  </p>
<p> <strong>Example:</strong><br /> <em>An agent summarizes a long article → the next agent translates the summary into Hindi → another agent extracts key points from the translated version.</em>  </p>
</li>
<li><p><strong>Supervised Workflow:</strong> Here, you define a <strong>supervisor agent</strong>, much like a project manager in a company. You assign a task to the supervisor, and it decides how to break it down, which agents are best suited to handle the sub-tasks, and how to coordinate everything.</p>
<p> The supervisor collects results from the specialized agents and assembles them into a coherent final output.</p>
<p> Use this for <strong>complex, collaborative tasks</strong> that benefit from domain-specific agents working independently under central coordination.  </p>
<p> <strong>Example:</strong><br /> A user asks for a business strategy plan. The supervisor delegates tasks like market analysis, competitor research, and pricing suggestions to different agents, then compiles all the responses into a well-structured plan.</p>
</li>
</ol>
<h2 id="heading-creating-workflows-with-tvara">Creating Workflows with Tvara</h2>
<p>Let us look at how easy it is to create workflows using Tvara. (For in-depth code understanding, I would suggest you to checkout the <em>README.md</em> on <a target="_blank" href="https://github.com/tvarahq/tvara">Tvara Repo</a>.</p>
<p>Install Tvara using the following command:</p>
<pre><code class="lang-bash">pip install tvara
</code></pre>
<h3 id="heading-sequential">Sequential</h3>
<p>Let’s create a sequential workflow where we want to <strong>research a topic</strong> and then <strong>write a blog</strong> based on that research.</p>
<pre><code class="lang-python"><span class="hljs-keyword">from</span> tvara.core <span class="hljs-keyword">import</span> Agent, Workflow, Prompt
<span class="hljs-keyword">from</span> tvara.tools <span class="hljs-keyword">import</span> DateTool, WebSearchTool
<span class="hljs-keyword">import</span> os
<span class="hljs-keyword">from</span> dotenv <span class="hljs-keyword">import</span> load_dotenv

load_dotenv()

<span class="hljs-comment"># Step 1: Researcher Agent</span>
researcher_agent = Agent(
    name=<span class="hljs-string">"Researcher Agent"</span>,
    model=<span class="hljs-string">"gemini-2.5-flash"</span>,
    api_key=os.getenv(<span class="hljs-string">"MODEL_API_KEY"</span>),
    prompt=Prompt(
        raw_prompt=<span class="hljs-string">"You are a researcher tasked with gathering information on a specific topic. Use the tools available to you to find relevant information and summarize it."</span>,
        tools=[WebSearchTool(api_key=os.getenv(<span class="hljs-string">"TAVILY_API_KEY"</span>)), DateTool()]
    )
)

<span class="hljs-comment"># Step 2: Blog Writing Agent</span>
blog_agent = Agent(
    name=<span class="hljs-string">"Blog Agent"</span>,
    model=<span class="hljs-string">"gemini-2.5-flash"</span>,
    api_key=os.getenv(<span class="hljs-string">"MODEL_API_KEY"</span>),
    prompt=Prompt(
        raw_prompt=<span class="hljs-string">"You are a blog writer. Use the information provided by the Researcher Agent to write a comprehensive blog post."</span>,
    )
)

<span class="hljs-comment"># Workflow definition</span>
my_workflow = Workflow(
    name=<span class="hljs-string">"Sample Sequential Workflow"</span>,
    agents=[researcher_agent, blog_agent],
    mode=<span class="hljs-string">"sequential"</span>,
)

<span class="hljs-comment"># Running the workflow</span>
result = my_workflow.run(<span class="hljs-string">"Write a blog post under the name of Tvara Community about the latest advancements in AI research."</span>)
</code></pre>
<p>That’s it!<br />All we had to do was define the agents in the desired sequence - <strong>and done!</strong></p>
<h3 id="heading-supervised">Supervised</h3>
<p>Now, let’s create a <strong>supervised workflow</strong> where we want to:</p>
<ol>
<li><p>Fetch the latest <em>README.md</em> of a GitHub repo</p>
</li>
<li><p>Summarize it</p>
</li>
<li><p>Send a message in a <strong>cheerful business tone</strong> to a Slack channel</p>
</li>
</ol>
<p>Sounds complex? Let’s simplify it with Tvara:</p>
<pre><code class="lang-python"><span class="hljs-keyword">from</span> tvara.core <span class="hljs-keyword">import</span> Agent, Workflow, Prompt
<span class="hljs-keyword">from</span> tvara.connectors <span class="hljs-keyword">import</span> GitHubConnector, SlackConnector
<span class="hljs-keyword">from</span> dotenv <span class="hljs-keyword">import</span> load_dotenv
<span class="hljs-keyword">import</span> os

load_dotenv()

<span class="hljs-comment"># Agent 1: GitHub Fetching</span>
github_agent = Agent(
    name=<span class="hljs-string">"GitHub Agent"</span>,
    model=<span class="hljs-string">"gemini-2.5-flash"</span>,
    api_key=os.getenv(<span class="hljs-string">"MODEL_API_KEY"</span>),
    connectors=[GitHubConnector(name=<span class="hljs-string">"github"</span>, token=os.getenv(<span class="hljs-string">"GITHUB_PAT"</span>))]
)

<span class="hljs-comment"># Agent 2: Summarization</span>
summarizer_agent = Agent(
    name=<span class="hljs-string">"Summarizer"</span>,
    model=<span class="hljs-string">"gemini-2.5-flash"</span>,
    api_key=os.getenv(<span class="hljs-string">"MODEL_API_KEY"</span>),
)

<span class="hljs-comment"># Agent 3: Slack Messaging</span>
slack_agent = Agent(
    name=<span class="hljs-string">"Slack Agent"</span>,
    model=<span class="hljs-string">"gemini-2.5-flash"</span>,
    api_key=os.getenv(<span class="hljs-string">"MODEL_API_KEY"</span>),
    connectors=[SlackConnector(name=<span class="hljs-string">"slack"</span>, token=os.getenv(<span class="hljs-string">"SLACK_BOT_TOKEN"</span>))]
)

<span class="hljs-comment"># Supervisor Agent</span>
manager_agent = Agent(
    name=<span class="hljs-string">"Manager Agent"</span>,
    model=<span class="hljs-string">"gemini-2.5-flash"</span>,
    api_key=os.getenv(<span class="hljs-string">"MODEL_API_KEY"</span>),
    prompt=Prompt(
        raw_prompt=<span class="hljs-string">"You are a workflow manager coordinating multiple AI agents. Your job is to decide what should happen next."</span>
    )
)

<span class="hljs-comment"># Supervised Workflow Definition</span>
my_workflow = Workflow(
    name=<span class="hljs-string">"Sample Workflow"</span>,
    agents=[github_agent, summarizer_agent, slack_agent],
    mode=<span class="hljs-string">"supervised"</span>,
    manager_agent=manager_agent,
    max_iterations=<span class="hljs-number">3</span>,
)

<span class="hljs-comment"># Running the workflow</span>
result = my_workflow.run(
    <span class="hljs-string">"Send the latest readme file of the tvara repository by tvarahq on GitHub to the Slack channel #test-channel. "</span>
    <span class="hljs-string">"Ensure you send a summary only, written in a cheerful product launch business tone!"</span>
)
</code></pre>
<p>And just like that, define a few agents, assign a manager… <strong>voilà!</strong><br />The message appears in your Slack channel.</p>
<p>Attaching a screenshot of this cool result:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1754247663162/ad6d56c2-3ce7-467f-bc2d-9cf560488dd2.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-whats-next">What’s Next?</h2>
<p>Based off these examples, I would want to see more examples coming out from the community along with contributions that would help and improve the SDK itself.</p>
<p>In the next post, we would look into how these workflows work under the hood. This would add more clarity for developers to create their own workflows and contribute better!</p>
<p>Until then, Enjoy!</p>
]]></content:encoded></item><item><title><![CDATA[A guide to AI Agents: Exploring Tools, Connectors and Their Interactions]]></title><description><![CDATA[Introduction
The year 2025 is shaping up to be the year of agents and there’s no surprise why. AI has evolved from just basic back-and-forth question answering to autonomously making decisions and solving real-world business use cases.
Tvara started ...]]></description><link>https://blog.tvarahq.com/a-guide-to-ai-agents-exploring-tools-connectors-and-their-interactions</link><guid isPermaLink="true">https://blog.tvarahq.com/a-guide-to-ai-agents-exploring-tools-connectors-and-their-interactions</guid><category><![CDATA[tvara]]></category><category><![CDATA[tvara-sdk]]></category><category><![CDATA[AI]]></category><category><![CDATA[#ai-tools]]></category><category><![CDATA[ai agents]]></category><category><![CDATA[llm]]></category><category><![CDATA[Developer Tools]]></category><category><![CDATA[Open Source]]></category><category><![CDATA[autonomous agents]]></category><category><![CDATA[LLM Applications]]></category><category><![CDATA[gen ai]]></category><category><![CDATA[generative ai]]></category><dc:creator><![CDATA[Ashish Lal]]></dc:creator><pubDate>Wed, 30 Jul 2025 13:06:31 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/505eectW54k/upload/fdf215c3c336040496dd1f16348a1866.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-introduction">Introduction</h2>
<p>The year 2025 is shaping up to be the <em>year of agents</em> and there’s no surprise why. AI has evolved from just basic back-and-forth question answering to autonomously making decisions and solving real-world business use cases.</p>
<p><strong>Tvara</strong> started with a simple goal:</p>
<p>Make it easy for developers to quickly <strong>build, deploy and scale agents and agentic workflows</strong> within their codebases. (And yes, we’re working on a super cool interactive playground for non-devs too. Stay tuned!)</p>
<p>So for our debut article, let’s warm up by exploring what agents really are and more importantly, where they get their data from.</p>
<h2 id="heading-agents">Agents</h2>
<p>We’ve all been using LLMs almost daily ever since ChatGPT’s launch in November 2022.</p>
<p>If you ask (or rather, asked, before tools became a norm for ChatGPT and others) an LLM for today’s date, it would probably reply back with its last knowledge cutoff’s date. Try it on any locally deployed model such as DeepSeek or Qwen and you’ll still see this in action!</p>
<p>The core issue with LLMs is this:</p>
<p>They’re great at reasoning over <em>what they already know</em> (from training), but they can’t <strong>perform real-time tasks</strong> or access <strong>live data</strong> on their own.</p>
<p>This is exactly where the concept of <strong>agents</strong> and <strong>tools</strong> comes in.</p>
<p>Agents are LLMs that are augmented with external tools and APIs (what we here call connectors) to make smarter, real-world driven decisions. This allows them to perform a web-search, query your calendar, hit an external API or fetch fresh data from a database - all on-the-go.</p>
<p>So an agent can be visually understood from the following diagram:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1753877883922/bc7c73de-51e7-4e5a-90bb-f70e772cbb30.png" alt class="image--center mx-auto" /></p>
<p>This agent is now tailored for a specific task in-hand to power your workflow! But wait, it wont solve a business use-case yet. Actual scenarios demand much more than single tasks and optimal collaboration among players to reach a shared goal.</p>
<p>That’s where <strong>multi-agent workflows</strong> come in and we’ll get there soon.</p>
<h2 id="heading-tools">Tools</h2>
<p><strong>Tools</strong> are lightweight functions that help the agent perform focused tasks by augmenting the LLM with specific capabilities.</p>
<p>Think of them as <strong>single-purpose utilities</strong>. They don’t rely on prior context and are easy to plug in and out.</p>
<p>Some common examples of tools:</p>
<ul>
<li><p>A <strong>calculator</strong> to perform math</p>
</li>
<li><p>A <strong>web search tool</strong> to pull up live results</p>
</li>
<li><p>A <strong>weather checker</strong> to fetch current forecasts</p>
</li>
<li><p>A <strong>code executor</strong> for small snippets or validation</p>
</li>
</ul>
<p>In Tvara, tools are designed to be <strong>simple Python functions or classes</strong> that can be reused across multiple agents. You are free to define your custom tools as well!</p>
<blockquote>
<p><strong>TL;DR:</strong> If your LLM just needs one quick skill to do its job, it's a tool.</p>
</blockquote>
<h2 id="heading-connectors">Connectors</h2>
<p><strong>Connectors</strong> are integrations with external systems or SaaS platforms that expose <strong>richer APIs and multiple functions</strong>. While tools are “skills,” connectors are more like <strong>portals into real-world data ecosystems.</strong></p>
<p>Examples include:</p>
<ul>
<li><p><strong>Google Calendar:</strong> fetch events, create meetings, check availability</p>
</li>
<li><p><strong>Slack:</strong> send messages, read channels, trigger workflows</p>
</li>
<li><p><strong>GitHub:</strong> fetch issues, pull requests, codebase info</p>
</li>
<li><p><strong>Jira, Notion, Airtable, Trello</strong>, etc.</p>
</li>
</ul>
<p>Connectors often involve <strong>authentication</strong>, <strong>multiple endpoints</strong>, and may even maintain <strong>state or session context</strong> depending on how the agent uses them.</p>
<p>In Tvara, you can either use <strong>prebuilt connectors</strong> or easily define your own using the base connector class.</p>
<blockquote>
<p><strong>TL;DR:</strong> If your agent needs to talk to the outside world in a structured, multi-functional way, it's a connector.</p>
</blockquote>
<p>In summary,</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td><strong>Feature</strong></td><td><strong>Tool</strong></td><td><strong>Connector</strong></td></tr>
</thead>
<tbody>
<tr>
<td>Purpose</td><td>One-off, focused function</td><td>Rich, multi-endpoint integration</td></tr>
<tr>
<td>Examples</td><td>Calculator, Search</td><td>Slack, GitHub, Google Calendar</td></tr>
<tr>
<td>Complexity</td><td>Low</td><td>Moderate–High</td></tr>
<tr>
<td>Stateful?</td><td>Stateless</td><td>May require sessions</td></tr>
<tr>
<td>Dev Effort</td><td>Simple function</td><td>Usually requires API client</td></tr>
</tbody>
</table>
</div><h2 id="heading-how-do-they-all-work-together">How do they all work together?</h2>
<p>A major question that could arise:</p>
<blockquote>
<p>How does the LLM know <em>when</em> to call a tool or connector, <em>how</em> to invoke it, and <em>what</em> to do with the result?</p>
</blockquote>
<p>Let’s break it down.</p>
<h3 id="heading-the-agent-loop">The Agent Loop</h3>
<p>Think of a user input like this:</p>
<blockquote>
<p>"Check if I have any meetings this afternoon and then tell me if I have time to go for a walk."</p>
</blockquote>
<p>Here’s what happens within the loop:</p>
<ol>
<li><p><strong>Input Parsing</strong><br /> The user prompt is passed to the LLM with some context (system prompt, history, available tools/connectors).</p>
</li>
<li><p><strong>Tool Decision</strong><br /> The LLM, based on its prompt and few-shot examples, decides:</p>
<blockquote>
<p><em>“I need to check Google Calendar to answer this.”</em></p>
</blockquote>
</li>
<li><p><strong>Tool Invocation</strong><br /> The agent framework <strong>captures</strong> the <strong>tool call/connector call</strong>, pulls out the arguments (like today's date), and <strong>executes</strong> the corresponding tool or connector.</p>
</li>
<li><p><strong>Result Handling</strong><br /> Once the tool/connector returns a result (e.g., list of calendar events), that output is <strong>fed back to the LLM</strong>.</p>
</li>
<li><p><strong>Final Response Generation</strong><br /> Now with live data in hand, the LLM composes a final reply like:</p>
<blockquote>
<p>“You have meetings till 4 PM. You’ll be free for a walk around 4:30.”</p>
</blockquote>
</li>
</ol>
<h3 id="heading-how-tvara-does-this">How Tvara does this</h3>
<p>Tvara follows a lightweight design:</p>
<ul>
<li><p>You <strong>register tools and connectors</strong> by subclassing the <strong>BaseTool</strong> or <strong>BaseConnector</strong>.</p>
</li>
<li><p>The agent generates a <strong>JSON</strong> if it feels a tool or a connector needs to be invoked.</p>
</li>
<li><p>A python function parses this JSON, detects the tool/connector, and runs it to get its result back to the agent.</p>
</li>
<li><p>You don’t need to write complex handlers or chains, it just works!</p>
</li>
</ul>
<p>Here’s a simplified code peek (We’ll go in-depth of our Tvara SDK in the next post, we promise!)</p>
<h3 id="heading-tool-definition">Tool Definition</h3>
<pre><code class="lang-python"><span class="hljs-keyword">import</span> datetime
<span class="hljs-keyword">from</span> .base <span class="hljs-keyword">import</span> BaseTool

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">DateTool</span>(<span class="hljs-params">BaseTool</span>):</span>
    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__init__</span>(<span class="hljs-params">self</span>):</span>
        super().__init__(name=<span class="hljs-string">"date_tool"</span>, description=<span class="hljs-string">"Returns the current date."</span>)

    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">run</span>(<span class="hljs-params">self, input_data: str</span>) -&gt; str:</span>
        <span class="hljs-keyword">return</span> <span class="hljs-string">f"Today's date is <span class="hljs-subst">{datetime.date.today()}</span>. Today's day is <span class="hljs-subst">{datetime.date.today().strftime(<span class="hljs-string">'%A'</span>)}</span>. The current time is <span class="hljs-subst">{datetime.datetime.now().strftime(<span class="hljs-string">'%H:%M:%S'</span>)}</span>."</span>
</code></pre>
<h3 id="heading-tool-usage">Tool Usage</h3>
<pre><code class="lang-python"><span class="hljs-keyword">from</span> tvara.core <span class="hljs-keyword">import</span> Agent
<span class="hljs-keyword">from</span> tvara.tools <span class="hljs-keyword">import</span> DateTool

my_agent = Agent(
    name=<span class="hljs-string">"Good Agent"</span>,
    model=<span class="hljs-string">"gemini-2.5-flash"</span>,
    api_key=os.getenv(<span class="hljs-string">"MODEL_API_KEY"</span>),
    tools=[DateTool()],
)

my_agent.run(<span class="hljs-string">"What would be the day of the week 13 days from now?"</span>)
</code></pre>
<blockquote>
<p>Under the hood, Tvara parses the LLM’s output, calls the <code>run</code> method of <code>DateTool</code>, and feeds the result back to the LLM.</p>
</blockquote>
<h2 id="heading-whats-next">What’s next?</h2>
<p>Now that we clearly understand what a single agent and how it works along with tools and connectors, the next step is unlocking <strong>collaboration.</strong></p>
<p>Because let’s be honest, real-world workflows rarely involve just one task or one decision-maker.</p>
<blockquote>
<p>In our next post, we’ll explore how <strong>multiple agents</strong> can work together, share context, and complete complex tasks as a <strong>team</strong>, just like humans do.</p>
</blockquote>
<p>Stay tuned! 👀</p>
]]></content:encoded></item></channel></rss>