No project description provided
Project description
OpenVela
OpenVela is an open‐source Python library for designing and executing agentic workflows. It leverages modern language models to create dynamic, interactive, and multi‐agent systems that collaboratively solve complex tasks. OpenVela supports multiple workflow paradigms—including Chain of Thought, Tree of Thought, Fluid Chain of Thought, and AutoSelect workflows—as well as a variety of agents, memory management techniques, and integrations with popular language model providers such as OpenAI, Groq, and Ollama.
Note: When you run
pip install openvela, you install the OpenVela CLI, which provides the following commands:
openvela serve– Run the API server.openvela run [parameters]– Execute a workflow with custom parameters.openvela interface– Launch the interactive workflow interface.
Table of Contents
- Introduction
- Features
- Installation
- Quick Start Guide
- Workflows
- SupervisorAgent: Types and Roles
- Language Model Integrations
- Agents
- Memory Management
- Command Line Interface (CLI)
- Server API
- Advanced Examples Using All Parameters
- Contributing
- License
Introduction
OpenVela is designed to streamline the creation of multi-agent systems using state-of-the-art language models. Whether you are building a storytelling engine, a data analysis tool, or an interactive chatbot network, OpenVela provides a modular framework that allows you to define tasks, instantiate agents, manage conversation history, and integrate with various language model providers.
Features
- Agentic Workflows: Supports sequential (Chain of Thought), branching (Tree of Thought), dynamic (Fluid Chain of Thought), and adaptive (AutoSelectWorkflow) modes.
- Multi-Agent Support: Create, manage, and orchestrate different types of agents (e.g., StartAgent, EndAgent, SupervisorAgent, FluidAgent).
Agent Type Parameter: Many agents, particularly theSupervisorAgent, accept anagent_typeparameter ("simple"or"selector") to control how the next agent is selected. - Memory Management: Built-in support for short-term and workflow memory using JSON-based formats.
- LLM Integrations: Integrates with OpenAI, Groq, and Ollama language models.
- CLI & Server API: Run workflows via command line (
openvela run,openvela serve,openvela interface) or expose them as RESTful endpoints. - File Processing: Handle audio and image files for advanced interactions.
Installation
Install OpenVela via pip:
pip install openvela
This installs the OpenVela CLI with the following commands:
openvela serve– Run the API server.openvela run [parameters]– Execute a workflow.openvela interface– Launch the interactive workflow interface.
Quick Start Guide
Here’s a minimal example to get you started with a Chain of Thought workflow using OpenVela with the OpenAI provider:
-
Prepare Your Agents’ Definitions
Create a JSON file (e.g.,
agents.json) with your agent definitions:{ "agents": [ { "name": "StartAgent", "prompt": "You are the StartAgent. Begin by outlining the main objectives of the task.", "input": "What are the primary goals for this task?" }, { "name": "MiddleAgent", "prompt": "You are the MiddleAgent. Expand on the ideas presented by the StartAgent.", "input": "Provide further details on the objectives." }, { "name": "EndAgent", "prompt": "You are the EndAgent. Conclude by synthesizing the information into a final answer.", "input": "Integrate the insights and deliver the final response." } ] }
-
Run the Interactive Interface
Launch the interactive workflow interface:
openvela interfaceFollow the prompts to select:
- Workflow type (e.g., Chain of Thought)
- Provider (e.g., OpenAI)
- API Key
- Agents JSON file path
- Task description
-
View the Output
After the workflow completes, the final output and memory ID will be displayed on screen and optionally saved to a file.
Workflows
OpenVela provides several workflow types to suit different use cases.
Chain of Thought Workflow
Agents process data sequentially. The output of one agent becomes the input of the next. This workflow supports an optional output validation loop.
Example Usage
from openvela.agents import Agent, StartAgent, EndAgent, SupervisorAgent, FluidValidator
from openvela.tasks import Task
from openvela.workflows import ChainOfThoughtWorkflow
from openvela.llms import OpenAIModel
# Initialize model instance
model_instance = OpenAIModel(api_key="YOUR_API_KEY", model="gpt-4o-mini")
# Define agent settings with all parameters
start_settings = {
"name": "StartAgent",
"prompt": "You are the StartAgent. Begin by outlining the main objectives in detail.",
"input": "What are the primary goals for this task? Please be specific."
}
middle_settings = {
"name": "MiddleAgent",
"prompt": "You are the MiddleAgent. Expand on the objectives by providing detailed insights.",
"input": "Add further details to the objectives."
}
end_settings = {
"name": "EndAgent",
"prompt": "You are the EndAgent. Conclude by synthesizing all information into a final answer.",
"input": "Summarize and integrate all insights."
}
# Instantiate agents
start_agent = StartAgent(settings=start_settings, model=model_instance)
middle_agent = Agent(settings=middle_settings, model=model_instance)
end_agent = EndAgent(settings=end_settings, model=model_instance)
# Create a FluidValidator instance for output validation
validator = FluidValidator(settings={"name": "FluidValidator"}, model=model_instance)
# Prepare intermediary agents and the supervisor (using simple mode by default)
supervisor = SupervisorAgent(
settings={"name": "SupervisorAgent", "prompt": "Oversee the workflow and select the next agent in order."},
start_agent=start_agent,
end_agent=end_agent,
agents=[middle_agent],
model=model_instance
)
# Define the task
task = Task(prompt="Tell a creative story about a hero overcoming challenges with unexpected twists.")
# Initialize and run the workflow with output validation enabled
workflow = ChainOfThoughtWorkflow(
task=task,
agents=[middle_agent],
supervisor=supervisor,
start_agent=start_agent,
end_agent=end_agent,
validate_output=True, # Enable output validation
max_attempts=3, # Maximum attempts for valid output
validator=validator # Provide a custom validator
)
final_output, memory_id = workflow.run()
print("Chain of Thought Final Output:", final_output)
print("Memory ID:", memory_id)
Tree of Thought Workflow
This workflow generates multiple parallel thoughts, evaluates them, and may combine the best outputs.
Example Usage
from openvela.agents import Agent, StartAgent, EndAgent, SupervisorAgent
from openvela.tasks import Task
from openvela.workflows import TreeOfThoughtWorkflow
from openvela.llms import OpenAIModel
# Initialize model instance
model_instance = OpenAIModel(api_key="YOUR_API_KEY", model="gpt-4o-mini")
# Define agents
start_agent = StartAgent(settings={
"name": "StartAgent",
"prompt": "You are the StartAgent. Initiate the task by outlining key points.",
"input": "What is the main challenge?"
}, model=model_instance)
end_agent = EndAgent(settings={
"name": "EndAgent",
"prompt": "You are the EndAgent. Synthesize all insights into a final answer.",
"input": "Provide the final synthesis."
}, model=model_instance)
middle_agent = Agent(settings={
"name": "MiddleAgent",
"prompt": "You are the MiddleAgent. Develop multiple ideas from the StartAgent's input.",
"input": "Expand on the challenge with several possibilities."
}, model=model_instance)
supervisor = SupervisorAgent(
settings={"name": "SupervisorAgent", "prompt": "Evaluate the generated thoughts and choose the best ones."},
start_agent=start_agent,
end_agent=end_agent,
agents=[middle_agent],
model=model_instance
)
# Define task
task = Task(prompt="Outline multiple innovative solutions for climate change mitigation.")
# Run Tree of Thought workflow
workflow = TreeOfThoughtWorkflow(
task=task,
agents=[middle_agent],
supervisor=supervisor,
start_agent=start_agent,
end_agent=end_agent
)
final_output, memory_id = workflow.run()
print("Tree of Thought Final Output:", final_output)
print("Memory ID:", memory_id)
Fluid Chain of Thought Workflow
This workflow dynamically generates agents based on the task description and allows parameters such as max_attempts and max_previous_messages for adaptive processing.
Example Usage
from openvela.agents import FluidAgent, SupervisorAgent
from openvela.tasks import Task
from openvela.workflows import FluidChainOfThoughtWorkflow
from openvela.llms import OpenAIModel
# Initialize model instance
model_instance = OpenAIModel(api_key="YOUR_API_KEY", model="gpt-4o-mini")
# FluidAgent generates agents on the fly
fluid_agent = FluidAgent(settings={"name": "FluidAgent"}, model=model_instance)
# Supervisor for fluid workflows (without predefined agents)
supervisor = SupervisorAgent(
settings={"name": "SupervisorAgent", "prompt": "Guide the fluid workflow and choose the best agent dynamically."},
start_agent=None,
end_agent=None,
agents=[], # Empty list as FluidAgent generates agents dynamically
model=model_instance
)
# Define task
task = Task(prompt="Generate an innovative business strategy for a tech startup in a competitive market.")
# Run Fluid Chain of Thought workflow with additional parameters
workflow = FluidChainOfThoughtWorkflow(
task=task,
fluid_agent=fluid_agent,
supervisor=supervisor,
max_attempts=3, # Maximum iterations for valid output
max_previous_messages=5 # Limit on previous messages passed to agents
)
final_output, memory_id = workflow.run()
print("Fluid Chain of Thought Final Output:", final_output)
print("Memory ID:", memory_id)
AutoSelectWorkflow
The AutoSelectWorkflow dynamically selects the next agent based on the supervisor’s evaluation of the latest output. It is adaptive and supports integrated output validation. In this workflow, the SupervisorAgent plays a key role in choosing the next agent using either a sequential or an LLM-driven dynamic approach.
Below, we explore how the agent_type parameter in the SupervisorAgent affects this selection process.
Example Usage
from openvela.agents import Agent, StartAgent, EndAgent, SupervisorAgent, FluidValidator
from openvela.tasks import Task
from openvela.workflows import AutoSelectWorkflow
from openvela.llms import OpenAIModel
# Initialize model instance
model_instance = OpenAIModel(api_key="YOUR_API_KEY", model="gpt-4o-mini")
# Define agents
start_agent = StartAgent(settings={
"name": "StartAgent",
"prompt": "You are the StartAgent. Begin by asking an open-ended question.",
"input": "What is your initial thought on the task?"
}, model=model_instance)
middle_agent = Agent(settings={
"name": "MiddleAgent",
"prompt": "You are the MiddleAgent. Process the previous output and add further detail.",
"input": "Expand on the idea."
}, model=model_instance)
end_agent = EndAgent(settings={
"name": "EndAgent",
"prompt": "You are the EndAgent. Conclude by summarizing all information.",
"input": "Provide the final synthesis."
}, model=model_instance)
# Create a SupervisorAgent in selector mode for dynamic selection
supervisor = SupervisorAgent(
settings={
"name": "SupervisorAgent",
"prompt": "Dynamically select the next agent based on the current output.",
"agent_type": "selector" # Use "selector" for LLM-driven decision-making
},
start_agent=start_agent,
end_agent=end_agent,
agents=[middle_agent],
model=model_instance
)
# Create a FluidValidator for output validation
validator = FluidValidator(settings={"name": "FluidValidator"}, model=model_instance)
# Define task
task = Task(prompt="Discuss the impact of artificial intelligence on modern society.")
# Run AutoSelectWorkflow with adaptive agent selection and integrated validation
workflow = AutoSelectWorkflow(
task=task,
agents=[middle_agent],
supervisor=supervisor,
validate_output=True, # Enable validation loop
max_attempts=3, # Maximum number of iterations
validator=validator # Custom validator instance
)
auto_output = workflow.run()
print("AutoSelectWorkflow Final Output:", auto_output)
SupervisorAgent: Types and Roles
The SupervisorAgent orchestrates the workflow by deciding which agent should process the next piece of information. It supports two primary modes, determined by the agent_type parameter:
Simple Mode (agent_type: "simple")
-
Sequential Selection:
The supervisor selects the next agent based on the defined order. For example, if the current agent is the StartAgent, it will choose the first intermediary agent; if not, it selects the agent immediately following the current one. -
Deterministic Behavior:
This mode is ideal for workflows with a clear, fixed sequence. It does not involve additional LLM-based reasoning. -
Example Usage:
supervisor = SupervisorAgent( settings={ "name": "SupervisorAgent", "prompt": "Select the next agent in sequence.", "agent_type": "simple" # Sequential selection mode }, start_agent=start_agent, end_agent=end_agent, agents=[middle_agent], model=model_instance )
Selector Mode (agent_type: "selector")
-
Dynamic, LLM-Driven Decision Making:
In this mode, the supervisor leverages the language model to analyze the conversation history, the latest output, and the overall task. It then produces a JSON response indicating:- next_agent: The selected agent's name (or
"FINISH"to conclude the workflow). - next_input: Detailed instructions or context for the selected agent.
- thinking (optional): The reasoning behind the decision.
- next_agent: The selected agent's name (or
-
Adaptive and Flexible:
Selector mode is particularly useful for complex or ambiguous tasks where the optimal next step is not obvious. The dynamic decision-making enables the workflow to adapt by choosing the agent best suited to handle the current context. -
Example Usage:
supervisor = SupervisorAgent( settings={ "name": "SupervisorAgent", "prompt": "Analyze the conversation and select the next agent based on the current output.", "agent_type": "selector" # Use dynamic, LLM-driven selection }, start_agent=start_agent, end_agent=end_agent, agents=[middle_agent], model=model_instance )
In summary, while Simple Mode offers a straightforward, deterministic selection of agents in a fixed sequence, Selector Mode provides a dynamic and adaptive mechanism that leverages the language model to guide the workflow based on the evolving context.
Language Model Integrations
OpenVela abstracts LLM integrations via a common interface. Currently supported models include:
OpenAIModel
from openvela.llms import OpenAIModel
model = OpenAIModel(api_key="YOUR_API_KEY", model="gpt-4o-mini")
messages = [{"role": "user", "content": "Hello, world!"}]
response = model.generate_response(messages)
print(response)
GroqModel
from openvela.llms import GroqModel
model = GroqModel(api_key="YOUR_API_KEY", model="llama-3.3-70b-versatile")
messages = [{"role": "user", "content": "Explain quantum physics."}]
response = model.generate_response(messages, format="json")
print(response)
OllamaModel
from openvela.llms import OllamaModel
model = OllamaModel(base_url="http://localhost:11434", model="llama3.2")
messages = [{"role": "user", "content": "Summarize the latest news."}]
response = model.generate_response(messages)
print(response)
Agents
Agents are the building blocks of your workflows. They encapsulate prompts, process inputs, and interact with the language model.
Basic Agent
from openvela.agents import Agent
from openvela.llms import OpenAIModel
model = OpenAIModel(api_key="YOUR_API_KEY", model="gpt-4o-mini")
agent_settings = {
"name": "BasicAgent",
"prompt": "You are a basic agent that processes user input.",
"input": "What information do you need?"
}
agent = Agent(settings=agent_settings, model=model)
response = agent.generate(max_previous_messages=3) # Passing extra kwargs
print(response)
StartAgent & EndAgent
These agents mark the beginning and end of a workflow.
from openvela.agents import StartAgent, EndAgent
from openvela.llms import OpenAIModel
model = OpenAIModel(api_key="YOUR_API_KEY", model="gpt-4o-mini")
start_agent = StartAgent(settings={
"name": "StartAgent",
"prompt": "You are the StartAgent. Begin by asking a clarifying question.",
"input": "What is the task?"
}, model=model)
end_agent = EndAgent(settings={
"name": "EndAgent",
"prompt": "You are the EndAgent. Conclude the conversation with a summary.",
"input": "Summarize the discussion."
}, model=model)
SupervisorAgent
Orchestrates the workflow by selecting the next agent based on the latest output. See the section above for details on the agent_type parameter.
from openvela.agents import SupervisorAgent
from openvela.llms import OpenAIModel
model = OpenAIModel(api_key="YOUR_API_KEY", model="gpt-4o-mini")
supervisor = SupervisorAgent(
settings={
"name": "SupervisorAgent",
"prompt": "Select the next best agent based on the latest output.",
"agent_type": "selector" # or "simple" for sequential selection
},
start_agent=start_agent,
end_agent=end_agent,
agents=[{"name": "DummyAgent", "prompt": "Dummy", "input": "Dummy"}], # Example placeholder
model=model
)
FluidAgent & FluidValidator
FluidAgent dynamically generates agents based on the task. FluidValidator is used to validate the output.
from openvela.agents import FluidAgent, FluidValidator
from openvela.llms import OpenAIModel
model = OpenAIModel(api_key="YOUR_API_KEY", model="gpt-4o-mini")
fluid_agent = FluidAgent(settings={"name": "FluidAgent"}, model=model)
validator = FluidValidator(settings={"name": "FluidValidator"}, model=model)
# FluidAgent can generate agent definitions based on task description
agents_definitions = fluid_agent.generate_agents_from_task(
"Describe a new marketing strategy for a product launch, considering competitive analysis and market trends."
)
print("Generated Agent Definitions:", agents_definitions)
SQLAgent
A specialized agent for generating read-only SQL queries and executing them via SQLAlchemy.
from openvela.agents import SQLAgent
from openvela.llms import OpenAIModel
model = OpenAIModel(api_key="YOUR_API_KEY", model="gpt-4o-mini")
sql_agent = SQLAgent(
settings={
"name": "SQLAgent",
"prompt": "Generate a SELECT query based on the user's input.",
"input": "Show me the top 10 customers by revenue."
},
model=model,
example_queries=[{"question": "Get all users", "sql_query": "SELECT * FROM users;"}],
sql_dialect="postgresql",
sqlalchemy_engine_url="postgresql://user:password@localhost/dbname",
database_structure="Tables: users, orders, products",
formatter_prompt="Format the SQL query results in a neat JSON output."
)
result = sql_agent.generate()
print("SQL Query Result:", result)
Memory Management
OpenVela provides a flexible memory management system to store and recall messages across workflows.
JSON Memory Format & Short-Term Memory
from openvela.memory import JsonMemoryFormat, JsonShortTermMemory
# Create a JSON memory format instance
memory_format = JsonMemoryFormat()
# Initialize a short-term memory with a system prompt
memory = JsonShortTermMemory(prompt="System: This is the base prompt for the workflow.")
# Remember and recall messages
memory.remember("user", "Hello, how can I help?")
messages = memory.recall()
print("Short-Term Memory Messages:", messages)
Workflow Memory
Keeps track of the conversation history within a workflow.
from openvela.memory import WorkflowMemory
workflow_memory = WorkflowMemory(memory_id="workflow-123")
workflow_memory.add_message("AgentName", "assistant", "This is an output message.")
loaded_messages = workflow_memory.load()
print("Workflow Memory:", loaded_messages)
Command Line Interface (CLI)
After installing OpenVela via pip, the CLI commands are available:
Running a Workflow
openvela run \
--provider openai \
--workflow_type cot \
--base_url_or_api_key YOUR_API_KEY \
--model gpt-4o-mini \
--agents path/to/agents.json \
--task "Draft a creative story about adventure and discovery." \
--options '{"max_attempts": 3, "other_option": "value"}'
Running the Server
openvela serve --host 0.0.0.0 --port 8000
Launching the Interactive Interface
openvela interface
Server API
The server (built with FastAPI) exposes two endpoints:
/run_workflow: Accepts workflow configuration and returns the workflow output./completion: Accepts messages and returns a language model completion.
Example Request
curl -X POST "http://localhost:8000/run_workflow" \
-H "Content-Type: application/json" \
-d '{
"provider": "openai",
"workflow_type": "cot",
"base_url_or_api_key": "YOUR_API_KEY",
"model": "gpt-4o-mini",
"options": {"max_attempts": 3},
"agents": [ ... ], // JSON array of agent definitions
"task": "Explain the theory of relativity."
}'
Advanced Examples Using All Parameters
This section combines various parameters from workflows, agents, memory, CLI, and LLM integrations to demonstrate a comprehensive use case.
Comprehensive Workflow Example
from openvela.agents import (
Agent, StartAgent, EndAgent, SupervisorAgent, FluidAgent, FluidValidator, SQLAgent
)
from openvela.tasks import Task
from openvela.workflows import (
ChainOfThoughtWorkflow, TreeOfThoughtWorkflow, FluidChainOfThoughtWorkflow, AutoSelectWorkflow
)
from openvela.memory import JsonShortTermMemory, WorkflowMemory
from openvela.llms import OpenAIModel
# Initialize model with all parameters
model_instance = OpenAIModel(api_key="YOUR_API_KEY", model="gpt-4o-mini")
# Initialize memory for agents and workflow
short_term_memory = JsonShortTermMemory(prompt="System: Base prompt for conversation.")
workflow_memory = WorkflowMemory(memory_id="advanced-workflow-001")
# Define detailed agent settings with extra options
start_settings = {
"name": "StartAgent",
"prompt": "You are the StartAgent. Begin by outlining the objectives in detail.",
"input": "What is the initial strategy?"
}
middle_settings = {
"name": "MiddleAgent",
"prompt": "You are the MiddleAgent. Develop ideas based on the initial strategy.",
"input": "Provide deeper analysis."
}
end_settings = {
"name": "EndAgent",
"prompt": "You are the EndAgent. Conclude by synthesizing all information.",
"input": "Summarize the final output."
}
# Instantiate agents with memory and additional options
start_agent = StartAgent(settings=start_settings, model=model_instance)
middle_agent = Agent(settings=middle_settings, model=model_instance, options={"extra_detail": True})
end_agent = EndAgent(settings=end_settings, model=model_instance)
# Create a supervisor in selector mode (LLM-driven decision making)
supervisor = SupervisorAgent(
settings={"name": "SupervisorAgent", "prompt": "Analyze conversation history and select the next agent.", "agent_type": "selector"},
start_agent=start_agent,
end_agent=end_agent,
agents=[middle_agent],
model=model_instance
)
# Create a FluidValidator for workflows that support output validation
validator = FluidValidator(settings={"name": "FluidValidator"}, model=model_instance)
# Define the task with a detailed description
task = Task(prompt="Develop a comprehensive marketing strategy for a new product launch, considering market trends and competitor analysis.")
# Example 1: Run a Chain of Thought Workflow with validation
cot_workflow = ChainOfThoughtWorkflow(
task=task,
agents=[middle_agent],
supervisor=supervisor,
start_agent=start_agent,
end_agent=end_agent,
validate_output=True,
max_attempts=3,
validator=validator
)
cot_output, cot_memory_id = cot_workflow.run()
print("Chain of Thought Output:", cot_output)
# Example 2: Run a Fluid Chain of Thought Workflow with dynamic agent generation
fluid_workflow = FluidChainOfThoughtWorkflow(
task=task,
fluid_agent=FluidAgent(settings={"name": "FluidAgent"}, model=model_instance),
supervisor=supervisor,
max_attempts=3,
max_previous_messages=5
)
fluid_output, fluid_memory_id = fluid_workflow.run()
print("Fluid Chain of Thought Output:", fluid_output)
# Example 3: Run an AutoSelectWorkflow with adaptive agent selection and integrated validation
autoselect_workflow = AutoSelectWorkflow(
task=task,
agents=[middle_agent],
supervisor=supervisor,
validate_output=True,
max_attempts=3,
validator=validator
)
auto_output = autoselect_workflow.run()
print("AutoSelectWorkflow Output:", auto_output)
# Example 4: Use SQLAgent to generate a read-only SQL query
sql_agent = SQLAgent(
settings={
"name": "SQLAgent",
"prompt": "Generate a SELECT query based on the user's input.",
"input": "Retrieve the top 5 products by sales."
},
model=model_instance,
example_queries=[{"question": "List all products", "sql_query": "SELECT * FROM products;"}],
sql_dialect="postgresql",
sqlalchemy_engine_url="postgresql://user:password@localhost/dbname",
database_structure="Tables: products, sales, customers",
formatter_prompt="Format the SQL query results in a well-structured JSON format."
)
sql_result = sql_agent.generate()
print("SQLAgent Result:", sql_result)
Contributing
Contributions are welcome! Please refer to the CONTRIBUTING.md file for guidelines on how to contribute to OpenVela.
License
OpenVela is released under the MIT License.
Happy coding and enjoy building agentic workflows with OpenVela!
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file openvela-0.4.6.tar.gz.
File metadata
- Download URL: openvela-0.4.6.tar.gz
- Upload date:
- Size: 48.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3e388e198dd710dad2b1f44f157e4c075fa74b6c3d61f6039a5a95c13b15abfe
|
|
| MD5 |
23ec21a0ca63a01ea161ac672d114652
|
|
| BLAKE2b-256 |
f583d0cc245999df19c935ac44f71740f0fbc0aa6d7fb2de955aa082ffabf872
|
File details
Details for the file openvela-0.4.6-py3-none-any.whl.
File metadata
- Download URL: openvela-0.4.6-py3-none-any.whl
- Upload date:
- Size: 49.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7244ba1a293ecf0324ceb7e190e5f3d08793b9fd2cb9e30c45464b9e043badb3
|
|
| MD5 |
0a74a731d964c470fe86e39d588d56a0
|
|
| BLAKE2b-256 |
45ca08a0c952f06eff9e46dafdcc5fce88d391c657a94e5439ddcbb3ac05fb83
|