Name | tvara JSON |
Version |
0.1.1
JSON |
| download |
home_page | https://aitvara.in |
Summary | A Python package for Tvara, a tool for automating workflows. |
upload_time | 2025-08-04 12:46:17 |
maintainer | None |
docs_url | None |
author | Ashish Lal |
requires_python | <4.0,>=3.8 |
license | MIT |
keywords |
agents
ai
workflow
tvara
|
VCS |
 |
bugtrack_url |
|
requirements |
No requirements were recorded.
|
Travis-CI |
No Travis.
|
coveralls test coverage |
No coveralls.
|
# Tvara

**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\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"
}