tvara


Nametvara JSON
Version 0.1.1 PyPI version JSON
download
home_pagehttps://aitvara.in
SummaryA Python package for Tvara, a tool for automating workflows.
upload_time2025-08-04 12:46:17
maintainerNone
docs_urlNone
authorAshish Lal
requires_python<4.0,>=3.8
licenseMIT
keywords agents ai workflow tvara
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Tvara
![Tvara](assets/Tvara_Stretched.png)

**Tvara** is a powerful Python SDK for building intelligent AI agents with tools, connectors, and multi-agent workflows. Create sophisticated AI systems that can interact with external services, execute code, search the web, and coordinate multiple agents seamlessly.

---

## ✨ Features

- 🤖 **Smart AI Agents** - Create agents with different models (Gemini, OpenAI, etc.)
- 🛠️ **Built-in Tools** - Web search, code execution, calculations, date/time utilities
- 🔗 **External Connectors** - GitHub, Slack integrations with more coming
- 🔄 **Multi-Agent Workflows** - Sequential and supervised agent coordination
- 📝 **Flexible Prompting** - Template-based and raw prompt support
- 🎯 **Easy Integration** - Simple API with comprehensive error handling
- 🔧 **Extensible Architecture** - Easy to add custom tools and connectors

> * Coming soon: Better workflow orchestration, multi-step agent execution, role-based behavior, and a visual interface for building agents and workflows.

---

## Roadmap
- Connectors for SQL databases, cloud storage, APIs, and more
- Workflow orchestration with multi-step agent execution
- Multi-agent coordination and role-based behavior
- Visual interface for building and deploying agents
- Improved observability and logs for debugging

Stay tuned for the official V1 launch, where these features will be included as part of our stable release.

## 🚀 Quick Start

### Installation

```bash
pip install tvara
```

## Usage Guide
You can refer to the [examples](examples/) directory for more detailed usage patterns. Below is a simple example of creating and running an agent:

```python
from tvara.core import Agent

agent = Agent(
    name="MyAgent",
    model="gemini-pro",
    api_key="your-api-key",
)

response = agent.run("Hi, how are you?")
print(response)
```

To create a more complex agent with specific tools and custom system prompts, you can do the following:

```python
from tvara.core.agent import Agent
from tvara.core.prompt import Prompt
from tvara.tools import WebSearchTool, DateTool, CodeTool

my_anxious_prompt = Prompt(
    raw_prompt="You are a very anxious AI assistant. You will answer the user's questions but in a very anxious manner. You will also use the tools provided to you.",
    tools=[WebSearchTool(api_key=os.getenv("TAVILY_API_KEY")), DateTool(), CodeTool()],
)

agent = Agent(
    name="TvaraCoder",
    model="gemini-pro",
    api_key="your-api-key",
    prompt=my_anxious_prompt,
    prompt_variables={
        "name": "TvaraCoder",
        "description": "An assistant that helps with coding tasks."
    },
    tools=["code_executor", "debugger", "api_client"],
)

response = agent.run("List out all files in my current working directory using Python.")
print(response)
```

An example of a sequential workflow with multiple agents:

```python
from tvara.core import Agent, Workflow, Prompt
from tvara.tools import DateTool, WebSearchTool
import os
from dotenv import load_dotenv

load_dotenv()

researcher_agent = Agent(
    name="Researcher Agent",
    model="gemini-2.5-flash",
    api_key=os.getenv("MODEL_API_KEY"),
    prompt=Prompt(
        raw_prompt="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.",
        tools=[WebSearchTool(api_key=os.getenv("TAVILY_API_KEY")), DateTool()]
    )
)

blog_agent = Agent(
    name="Blog Agent",
    model="gemini-2.5-flash",
    api_key=os.getenv("MODEL_API_KEY"),
    prompt=Prompt(
        raw_prompt="You are a blog writer. Use the information provided by the Researcher Agent to write a comprehensive blog post.",
    )
)

my_workflow = Workflow(
    name="Sample Sequential Workflow",
    agents=[researcher_agent, blog_agent],
    mode="sequential",
    max_iterations=3,
)

result = my_workflow.run("Write a blog post under the name of Tvara Community about the latest advancements in AI research.")

print(f"Workflow Result: {result.final_output}")
print(f"Workflow summary: {my_workflow.get_workflow_summary()}")
```

An example of a supervised workflow with multiple agents:

```python
from tvara.core import Agent, Workflow, Prompt
from tvara.tools import DateTool, WebSearchTool, CodeTool
from tvara.connectors import GitHubConnector, SlackConnector
from dotenv import load_dotenv
import os

load_dotenv()

basic_agent = Agent(
    name="GitHub Agent",
    model="gemini-2.5-flash",
    api_key=os.getenv("MODEL_API_KEY"),
    tools=[WebSearchTool(api_key=os.getenv("TAVILY_API_KEY")), DateTool(), CodeTool()],
    connectors=[GitHubConnector(name="github", token=os.getenv("GITHUB_PAT"))]
)

summarizer_agent = Agent(
    name="Summarizer",
    model="gemini-2.5-flash",
    api_key=os.getenv("MODEL_API_KEY"),
)

slack_agent = Agent(
    name="Slack Agent",
    model="gemini-2.5-flash",
    api_key=os.getenv("MODEL_API_KEY"),
    connectors=[SlackConnector(name="slack", token=os.getenv("SLACK_BOT_TOKEN"))]
)

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

my_workflow = Workflow(
    name= "Sample Workflow",
    agents=[basic_agent, summarizer_agent, slack_agent],
    mode= "supervised",
    manager_agent=manager_agent,
    max_iterations=3,
)

result = my_workflow.run("Send the latest readme file of the tvara repository by tvarahq on GitHub to the Slack channel #test-conn. Ensure you send a summary only which is in a cheerful product launch business tone!")

print(f"Workflow Result: {result.final_output}")
print(f"Workflow summary: {my_workflow.get_workflow_summary()}")
```

### 🛠️ Available Tools

| Tool             | Description                      | Usage                   | Required Setup     |
|------------------|----------------------------------|--------------------------|---------------------|
| `WebSearchTool`  | Search the web using Tavily API | Research, fact-checking | `TAVILY_API_KEY`    |
| `CodeTool`       | Execute Python code snippets     | Code execution          | None                |
| `CalculatorTool` | Perform mathematical calculations| Basic math operations   | None                |
| `DateTool`       | Get current date and time        | Time-based queries      | None                |

---

### 🔗 Available Connectors

| Connector         | Description                    | Actions                              | Required Setup      |
|-------------------|--------------------------------|--------------------------------------|----------------------|
| `GitHubConnector` | Interact with GitHub repos     | List repos, manage issues, contents | `GITHUB_PAT`         |
| `SlackConnector`  | Interact with Slack workspace  | Send messages, upload files         | `SLACK_BOT_TOKEN`    |

To create your own tools, you can subclass `BaseTool` and implement the `run` method. For example:

```python
from tvara.tools.base import BaseTool
import requests
import json

class WeatherTool(BaseTool):
    def __init__(self, api_key: str):
        super().__init__(
            name="weather_tool", 
            description="Gets current weather information for any city"
        )
        self.api_key = api_key
        self.base_url = "http://api.openweathermap.org/data/2.5/weather"
    
    def run(self, input_data: str) -> str:
        try:
            params = {
                'q': input_data.strip(),
                'appid': self.api_key,
                'units': 'metric'
            }
            response = requests.get(self.base_url, params=params)
            response.raise_for_status()
            data = response.json()
            return f"""Weather in {data['name']}, {data['sys']['country']}:
Temperature: {data['main']['temp']}°C
Condition: {data['weather'][0]['description'].title()}
Humidity: {data['main']['humidity']}%
Wind Speed: {data['wind']['speed']} m/s"""
        except Exception as e:
            return f"Error: {str(e)}"
```

To create your own connectors, you can subclass `BaseConnector` and implement the necessary methods. For example:

```python
from tvara.connectors.base import BaseConnector
import requests
from typing import Dict, Any, Union

class DiscordConnector(BaseConnector):
    def __init__(self, name: str, bot_token: str):
        super().__init__(name)
        self.bot_token = bot_token
        self.base_url = "https://discord.com/api/v10"
        self.headers = {
            "Authorization": f"Bot {bot_token}",
            "Content-Type": "application/json"
        }
    
    def get_action_schema(self) -> dict:
        return {
            "send_message": {
                "description": "Send a message to a Discord channel",
                "parameters": {
                    "channel_id": {"type": "string", "required": True},
                    "content": {"type": "string", "required": True}
                }
            },
            "get_guild_info": {
                "description": "Get information about a Discord server/guild",
                "parameters": {
                    "guild_id": {"type": "string", "required": True}
                }
            },
            "list_channels": {
                "description": "List all channels in a Discord server",
                "parameters": {
                    "guild_id": {"type": "string", "required": True}
                }
            }
        }

    def run(self, action: str, input: dict) -> Union[Dict[Any, Any], str]:
        # Implementation similar to earlier
        pass
```

You may view the existing tools and connectors in the `tvara/tools` and `tvara/connectors` directories respectively.

For detailed documentation on how to create custom agents, tools, and prompts, we will be adding a comprehensive guide soon on our website.

## Environment Variables
To run Tvara, you may need to set up your environment variables for certain models, tools and connectors. Create a `.env` file in the root directory of your project with the following content:

```plaintext
MODEL_API_KEY
TAVILY_API_KEY
GITHUB_PAT
SLACK_BOT_TOKEN
```

## Prompt Templates
Tvara supports pre-defined prompt templates using a template registry:

```python
from tvara.utils.prompt_templates import template_registry

print(template_registry.keys())  # e.g., ['basic_prompt_template', 'tool_aware_template']
```

To write your own custom prompt, you can make use of the special `prompt_template` called `custom_prompt_template`:

```python
template_registry['custom_prompt_template']
```

## Requirements
- Python 3.8+
- API keys for chosen AI model (Gemini, OpenAI, etc.)
- Optional: Tavily API key for web search
- Optional: GitHub Personal Access Token
- Optional: Slack Bot Token

## Contributing
We welcome contributions to Tvara! Feel free to open issues, suggest features, or submit pull requests. Check the [CONTRIBUTING.md](CONTRIBUTING.md) (coming soon) for more details.

## License
Tvara is licensed under the MIT License. See the [LICENSE](LICENSE) file for more details.

Built with ❤️ by the Tvara Community
            

Raw data

            {
    "_id": null,
    "home_page": "https://aitvara.in",
    "name": "tvara",
    "maintainer": null,
    "docs_url": null,
    "requires_python": "<4.0,>=3.8",
    "maintainer_email": null,
    "keywords": "agents, AI, workflow, tvara",
    "author": "Ashish Lal",
    "author_email": "ashishlal2003@gmail.com",
    "download_url": "https://files.pythonhosted.org/packages/5f/74/2afe129b3af3bf9a867d6babe07dfba1c81dcb3d8c739a14dd50375d698f/tvara-0.1.1.tar.gz",
    "platform": null,
    "description": "# Tvara\n![Tvara](assets/Tvara_Stretched.png)\n\n**Tvara** is a powerful Python SDK for building intelligent AI agents with tools, connectors, and multi-agent workflows. Create sophisticated AI systems that can interact with external services, execute code, search the web, and coordinate multiple agents seamlessly.\n\n---\n\n## \u2728 Features\n\n- \ud83e\udd16 **Smart AI Agents** - Create agents with different models (Gemini, OpenAI, etc.)\n- \ud83d\udee0\ufe0f **Built-in Tools** - Web search, code execution, calculations, date/time utilities\n- \ud83d\udd17 **External Connectors** - GitHub, Slack integrations with more coming\n- \ud83d\udd04 **Multi-Agent Workflows** - Sequential and supervised agent coordination\n- \ud83d\udcdd **Flexible Prompting** - Template-based and raw prompt support\n- \ud83c\udfaf **Easy Integration** - Simple API with comprehensive error handling\n- \ud83d\udd27 **Extensible Architecture** - Easy to add custom tools and connectors\n\n> * Coming soon: Better workflow orchestration, multi-step agent execution, role-based behavior, and a visual interface for building agents and workflows.\n\n---\n\n## Roadmap\n- Connectors for SQL databases, cloud storage, APIs, and more\n- Workflow orchestration with multi-step agent execution\n- Multi-agent coordination and role-based behavior\n- Visual interface for building and deploying agents\n- Improved observability and logs for debugging\n\nStay tuned for the official V1 launch, where these features will be included as part of our stable release.\n\n## \ud83d\ude80 Quick Start\n\n### Installation\n\n```bash\npip install tvara\n```\n\n## Usage Guide\nYou can refer to the [examples](examples/) directory for more detailed usage patterns. Below is a simple example of creating and running an agent:\n\n```python\nfrom tvara.core import Agent\n\nagent = Agent(\n    name=\"MyAgent\",\n    model=\"gemini-pro\",\n    api_key=\"your-api-key\",\n)\n\nresponse = agent.run(\"Hi, how are you?\")\nprint(response)\n```\n\nTo create a more complex agent with specific tools and custom system prompts, you can do the following:\n\n```python\nfrom tvara.core.agent import Agent\nfrom tvara.core.prompt import Prompt\nfrom tvara.tools import WebSearchTool, DateTool, CodeTool\n\nmy_anxious_prompt = Prompt(\n    raw_prompt=\"You are a very anxious AI assistant. You will answer the user's questions but in a very anxious manner. You will also use the tools provided to you.\",\n    tools=[WebSearchTool(api_key=os.getenv(\"TAVILY_API_KEY\")), DateTool(), CodeTool()],\n)\n\nagent = Agent(\n    name=\"TvaraCoder\",\n    model=\"gemini-pro\",\n    api_key=\"your-api-key\",\n    prompt=my_anxious_prompt,\n    prompt_variables={\n        \"name\": \"TvaraCoder\",\n        \"description\": \"An assistant that helps with coding tasks.\"\n    },\n    tools=[\"code_executor\", \"debugger\", \"api_client\"],\n)\n\nresponse = agent.run(\"List out all files in my current working directory using Python.\")\nprint(response)\n```\n\nAn example of a sequential workflow with multiple agents:\n\n```python\nfrom tvara.core import Agent, Workflow, Prompt\nfrom tvara.tools import DateTool, WebSearchTool\nimport os\nfrom dotenv import load_dotenv\n\nload_dotenv()\n\nresearcher_agent = Agent(\n    name=\"Researcher Agent\",\n    model=\"gemini-2.5-flash\",\n    api_key=os.getenv(\"MODEL_API_KEY\"),\n    prompt=Prompt(\n        raw_prompt=\"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.\",\n        tools=[WebSearchTool(api_key=os.getenv(\"TAVILY_API_KEY\")), DateTool()]\n    )\n)\n\nblog_agent = Agent(\n    name=\"Blog Agent\",\n    model=\"gemini-2.5-flash\",\n    api_key=os.getenv(\"MODEL_API_KEY\"),\n    prompt=Prompt(\n        raw_prompt=\"You are a blog writer. Use the information provided by the Researcher Agent to write a comprehensive blog post.\",\n    )\n)\n\nmy_workflow = Workflow(\n    name=\"Sample Sequential Workflow\",\n    agents=[researcher_agent, blog_agent],\n    mode=\"sequential\",\n    max_iterations=3,\n)\n\nresult = my_workflow.run(\"Write a blog post under the name of Tvara Community about the latest advancements in AI research.\")\n\nprint(f\"Workflow Result: {result.final_output}\")\nprint(f\"Workflow summary: {my_workflow.get_workflow_summary()}\")\n```\n\nAn example of a supervised workflow with multiple agents:\n\n```python\nfrom tvara.core import Agent, Workflow, Prompt\nfrom tvara.tools import DateTool, WebSearchTool, CodeTool\nfrom tvara.connectors import GitHubConnector, SlackConnector\nfrom dotenv import load_dotenv\nimport os\n\nload_dotenv()\n\nbasic_agent = Agent(\n    name=\"GitHub Agent\",\n    model=\"gemini-2.5-flash\",\n    api_key=os.getenv(\"MODEL_API_KEY\"),\n    tools=[WebSearchTool(api_key=os.getenv(\"TAVILY_API_KEY\")), DateTool(), CodeTool()],\n    connectors=[GitHubConnector(name=\"github\", token=os.getenv(\"GITHUB_PAT\"))]\n)\n\nsummarizer_agent = Agent(\n    name=\"Summarizer\",\n    model=\"gemini-2.5-flash\",\n    api_key=os.getenv(\"MODEL_API_KEY\"),\n)\n\nslack_agent = Agent(\n    name=\"Slack Agent\",\n    model=\"gemini-2.5-flash\",\n    api_key=os.getenv(\"MODEL_API_KEY\"),\n    connectors=[SlackConnector(name=\"slack\", token=os.getenv(\"SLACK_BOT_TOKEN\"))]\n)\n\nmanager_agent = Agent(\n    name=\"Manager Agent\",\n    model=\"gemini-2.5-flash\",\n    api_key=os.getenv(\"MODEL_API_KEY\"),\n    prompt=Prompt(\n        raw_prompt=\"You are a workflow manager coordinating multiple AI agents. Your job is to decide what should happen next.\"\n    )\n)\n\nmy_workflow = Workflow(\n    name= \"Sample Workflow\",\n    agents=[basic_agent, summarizer_agent, slack_agent],\n    mode= \"supervised\",\n    manager_agent=manager_agent,\n    max_iterations=3,\n)\n\nresult = my_workflow.run(\"Send the latest readme file of the tvara repository by tvarahq on GitHub to the Slack channel #test-conn. Ensure you send a summary only which is in a cheerful product launch business tone!\")\n\nprint(f\"Workflow Result: {result.final_output}\")\nprint(f\"Workflow summary: {my_workflow.get_workflow_summary()}\")\n```\n\n### \ud83d\udee0\ufe0f Available Tools\n\n| Tool             | Description                      | Usage                   | Required Setup     |\n|------------------|----------------------------------|--------------------------|---------------------|\n| `WebSearchTool`  | Search the web using Tavily API | Research, fact-checking | `TAVILY_API_KEY`    |\n| `CodeTool`       | Execute Python code snippets     | Code execution          | None                |\n| `CalculatorTool` | Perform mathematical calculations| Basic math operations   | None                |\n| `DateTool`       | Get current date and time        | Time-based queries      | None                |\n\n---\n\n### \ud83d\udd17 Available Connectors\n\n| Connector         | Description                    | Actions                              | Required Setup      |\n|-------------------|--------------------------------|--------------------------------------|----------------------|\n| `GitHubConnector` | Interact with GitHub repos     | List repos, manage issues, contents | `GITHUB_PAT`         |\n| `SlackConnector`  | Interact with Slack workspace  | Send messages, upload files         | `SLACK_BOT_TOKEN`    |\n\nTo create your own tools, you can subclass `BaseTool` and implement the `run` method. For example:\n\n```python\nfrom tvara.tools.base import BaseTool\nimport requests\nimport json\n\nclass WeatherTool(BaseTool):\n    def __init__(self, api_key: str):\n        super().__init__(\n            name=\"weather_tool\", \n            description=\"Gets current weather information for any city\"\n        )\n        self.api_key = api_key\n        self.base_url = \"http://api.openweathermap.org/data/2.5/weather\"\n    \n    def run(self, input_data: str) -> str:\n        try:\n            params = {\n                'q': input_data.strip(),\n                'appid': self.api_key,\n                'units': 'metric'\n            }\n            response = requests.get(self.base_url, params=params)\n            response.raise_for_status()\n            data = response.json()\n            return f\"\"\"Weather in {data['name']}, {data['sys']['country']}:\nTemperature: {data['main']['temp']}\u00b0C\nCondition: {data['weather'][0]['description'].title()}\nHumidity: {data['main']['humidity']}%\nWind Speed: {data['wind']['speed']} m/s\"\"\"\n        except Exception as e:\n            return f\"Error: {str(e)}\"\n```\n\nTo create your own connectors, you can subclass `BaseConnector` and implement the necessary methods. For example:\n\n```python\nfrom tvara.connectors.base import BaseConnector\nimport requests\nfrom typing import Dict, Any, Union\n\nclass DiscordConnector(BaseConnector):\n    def __init__(self, name: str, bot_token: str):\n        super().__init__(name)\n        self.bot_token = bot_token\n        self.base_url = \"https://discord.com/api/v10\"\n        self.headers = {\n            \"Authorization\": f\"Bot {bot_token}\",\n            \"Content-Type\": \"application/json\"\n        }\n    \n    def get_action_schema(self) -> dict:\n        return {\n            \"send_message\": {\n                \"description\": \"Send a message to a Discord channel\",\n                \"parameters\": {\n                    \"channel_id\": {\"type\": \"string\", \"required\": True},\n                    \"content\": {\"type\": \"string\", \"required\": True}\n                }\n            },\n            \"get_guild_info\": {\n                \"description\": \"Get information about a Discord server/guild\",\n                \"parameters\": {\n                    \"guild_id\": {\"type\": \"string\", \"required\": True}\n                }\n            },\n            \"list_channels\": {\n                \"description\": \"List all channels in a Discord server\",\n                \"parameters\": {\n                    \"guild_id\": {\"type\": \"string\", \"required\": True}\n                }\n            }\n        }\n\n    def run(self, action: str, input: dict) -> Union[Dict[Any, Any], str]:\n        # Implementation similar to earlier\n        pass\n```\n\nYou may view the existing tools and connectors in the `tvara/tools` and `tvara/connectors` directories respectively.\n\nFor detailed documentation on how to create custom agents, tools, and prompts, we will be adding a comprehensive guide soon on our website.\n\n## Environment Variables\nTo run Tvara, you may need to set up your environment variables for certain models, tools and connectors. Create a `.env` file in the root directory of your project with the following content:\n\n```plaintext\nMODEL_API_KEY\nTAVILY_API_KEY\nGITHUB_PAT\nSLACK_BOT_TOKEN\n```\n\n## Prompt Templates\nTvara supports pre-defined prompt templates using a template registry:\n\n```python\nfrom tvara.utils.prompt_templates import template_registry\n\nprint(template_registry.keys())  # e.g., ['basic_prompt_template', 'tool_aware_template']\n```\n\nTo write your own custom prompt, you can make use of the special `prompt_template` called `custom_prompt_template`:\n\n```python\ntemplate_registry['custom_prompt_template']\n```\n\n## Requirements\n- Python 3.8+\n- API keys for chosen AI model (Gemini, OpenAI, etc.)\n- Optional: Tavily API key for web search\n- Optional: GitHub Personal Access Token\n- Optional: Slack Bot Token\n\n## Contributing\nWe welcome contributions to Tvara! Feel free to open issues, suggest features, or submit pull requests. Check the [CONTRIBUTING.md](CONTRIBUTING.md) (coming soon) for more details.\n\n## License\nTvara is licensed under the MIT License. See the [LICENSE](LICENSE) file for more details.\n\nBuilt with \u2764\ufe0f by the Tvara Community",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "A Python package for Tvara, a tool for automating workflows.",
    "version": "0.1.1",
    "project_urls": {
        "Homepage": "https://aitvara.in",
        "Repository": "https://github.com/tvarahq/tvara"
    },
    "split_keywords": [
        "agents",
        " ai",
        " workflow",
        " tvara"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "62fc19eac5e794e2a263337f1a9094b41a1e05fe1237129b44bfad8cb07ba5bf",
                "md5": "c30b0f2690269c3d86138f3336d68c98",
                "sha256": "a1fe5af2fcb9304d230649be5c42b7e66febb76a82dcad9a687d3345fd9e4707"
            },
            "downloads": -1,
            "filename": "tvara-0.1.1-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "c30b0f2690269c3d86138f3336d68c98",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": "<4.0,>=3.8",
            "size": 24539,
            "upload_time": "2025-08-04T12:46:16",
            "upload_time_iso_8601": "2025-08-04T12:46:16.104136Z",
            "url": "https://files.pythonhosted.org/packages/62/fc/19eac5e794e2a263337f1a9094b41a1e05fe1237129b44bfad8cb07ba5bf/tvara-0.1.1-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "5f742afe129b3af3bf9a867d6babe07dfba1c81dcb3d8c739a14dd50375d698f",
                "md5": "d1b5455508c9d33e8fcc59ed3a9f05e6",
                "sha256": "eb5ec4e4ac0f12c6c9b93be97c9d4b8d5d256157fc732e16bb3589e7fce14f05"
            },
            "downloads": -1,
            "filename": "tvara-0.1.1.tar.gz",
            "has_sig": false,
            "md5_digest": "d1b5455508c9d33e8fcc59ed3a9f05e6",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": "<4.0,>=3.8",
            "size": 19293,
            "upload_time": "2025-08-04T12:46:17",
            "upload_time_iso_8601": "2025-08-04T12:46:17.190498Z",
            "url": "https://files.pythonhosted.org/packages/5f/74/2afe129b3af3bf9a867d6babe07dfba1c81dcb3d8c739a14dd50375d698f/tvara-0.1.1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-08-04 12:46:17",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "tvarahq",
    "github_project": "tvara",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "tvara"
}
        
Elapsed time: 0.67133s