Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Tool flow #115

Closed
wants to merge 15 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
.env
__pycache__
.venv
2 changes: 2 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
*.png filter=lfs diff=lfs merge=lfs -text
*.gif filter=lfs diff=lfs merge=lfs -text
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,7 @@ venv/
ENV/
env.bak/
venv.bak/
secret_keys.sh

# Spyder project settings
.spyderproject
Expand Down Expand Up @@ -185,4 +186,4 @@ cython_debug/
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
# and can be added to the global gitignore or merged into this file. For a more nuclear
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
#.idea/
#.idea/
1 change: 1 addition & 0 deletions .grit/.gritmodules/github.com/getgrit/hcl
Submodule hcl added at 0fe322
1 change: 1 addition & 0 deletions .grit/.gritmodules/github.com/getgrit/js
Submodule js added at 6a94ba
1 change: 1 addition & 0 deletions .grit/.gritmodules/github.com/getgrit/json
Submodule json added at a21fb2
1 change: 1 addition & 0 deletions .grit/.gritmodules/github.com/getgrit/python
Submodule python added at b98b95
75 changes: 75 additions & 0 deletions DOCS/DOCUMENTATION.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
# Swarms Documentation

## Overview
The Swarm module includes the implementation of two classes, `WorkerNode` and `BossNode`, which respectively represent a worker agent and a boss agent. A worker agent is responsible for completing given tasks, while a boss agent is responsible for creating and managing tasks for the worker agent(s).

## Key Classes

### WorkerNode
```python
class WorkerNode:
```

The WorkerNode class represents an autonomous worker agent that can perform a range of tasks.

__Methods__:

- `create_agent(ai_name: str, ai_role: str, human_in_the_loop: bool, search_kwargs: dict) -> None`:

This method creates a new autonomous agent that can complete tasks. The agent utilizes several tools such as search engines, a file writer/reader, and a multi-modal visual tool.
The agent's configuration is customizable through the method parameters.

```python
# Example usage
worker_node = WorkerNode(llm, tools, vectorstore)
worker_node.create_agent('test_agent', 'test_role', False, {})
```

- `run_agent(prompt: str) -> None`:

This method runs the agent on a given task, defined by the `prompt` parameter.

```python
# Example usage
worker_node = WorkerNode(llm, tools, vectorstore)
worker_node.create_agent('test_agent', 'test_role', False, {})
worker_node.run_agent('Calculate the square root of 144.')
```

### BossNode
```python
class BossNode:
```

The BossNode class represents a manager agent that can create tasks and control the execution of these tasks.

__Methods__:

- `create_task(objective: str) -> dict`:

This method creates a new task based on the provided `objective`. The created task is a dictionary with the objective as its value.

```python
# Example usage
boss_node = BossNode(llm, vectorstore, task_execution_chain, False, 3)
task = boss_node.create_task('Find the square root of 144.')
```

- `execute_task(task: dict) -> None`:

This method triggers the execution of a given task.

```python
# Example usage
boss_node = BossNode(llm, vectorstore, task_execution_chain, False, 3)
task = boss_node.create_task('Find the square root of 144.')
boss_node.execute_task(task)
```

### Note

Before creating the WorkerNode and BossNode, make sure to initialize the lower level model (llm), tools, and vectorstore which are used as parameters in the constructors of the two classes.

In addition, the WorkerNode class uses the MultiModalVisualAgentTool which is a custom tool that enables the worker agent to run multi-modal visual tasks. Ensure that this tool is correctly initialized before running the WorkerNode.

This documentation provides an overview of the main functionalities of the Swarm module. For additional details and advanced functionalities, please review the source code and the accompanying comments.
214 changes: 214 additions & 0 deletions DOCS/IDEAS.MD
Original file line number Diff line number Diff line change
@@ -0,0 +1,214 @@
## Swarming Architectures

Here are three examples of swarming architectures that could be applied in this context.

1. **Hierarchical Swarms**: In this architecture, a 'lead' agent coordinates the efforts of other agents, distributing tasks based on each agent's unique strengths. The lead agent might be equipped with additional functionality or decision-making capabilities to effectively manage the swarm.

2. **Collaborative Swarms**: Here, each agent in the swarm works in parallel, potentially on different aspects of a task. They then collectively determine the best output, often through a voting or consensus mechanism.

3. **Competitive Swarms**: In this setup, multiple agents work on the same task independently. The output from the agent which produces the highest confidence or quality result is then selected. This can often lead to more robust outputs, as the competition drives each agent to perform at its best.

4. **Multi-Agent Debate**: Here, multiple agents debate a topic. The output from the agent which produces the highest confidence or quality result is then selected. This can lead to more robust outputs, as the competition drives each agent to perform it's best.


# Ideas

A swarm, particularly in the context of distributed computing, refers to a large number of coordinated agents or nodes that work together to solve a problem. The specific requirements of a swarm might vary depending on the task at hand, but some of the general requirements include:

1. **Distributed Nature**: The swarm should consist of multiple individual units or nodes, each capable of functioning independently.

2. **Coordination**: The nodes in the swarm need to coordinate with each other to ensure they're working together effectively. This might involve communication between nodes, or it could be achieved through a central orchestrator.

3. **Scalability**: A well-designed swarm system should be able to scale up or down as needed, adding or removing nodes based on the task load.

4. **Resilience**: If a node in the swarm fails, it shouldn't bring down the entire system. Instead, other nodes should be able to pick up the slack.

5. **Load Balancing**: Tasks should be distributed evenly across the nodes in the swarm to avoid overloading any single node.

6. **Interoperability**: Each node should be able to interact with others, regardless of differences in underlying hardware or software.

Integrating these requirements with Large Language Models (LLMs) can be done as follows:

1. **Distributed Nature**: Each LLM agent can be considered as a node in the swarm. These agents can be distributed across multiple servers or even geographically dispersed data centers.

2. **Coordination**: An orchestrator can manage the LLM agents, assigning tasks, coordinating responses, and ensuring effective collaboration between agents.

3. **Scalability**: As the demand for processing power increases or decreases, the number of LLM agents can be adjusted accordingly.

4. **Resilience**: If an LLM agent goes offline or fails, the orchestrator can assign its tasks to other agents, ensuring the swarm continues functioning smoothly.

5. **Load Balancing**: The orchestrator can also handle load balancing, ensuring tasks are evenly distributed amongst the LLM agents.

6. **Interoperability**: By standardizing the input and output formats of the LLM agents, they can effectively communicate and collaborate, regardless of the specific model or configuration of each agent.

In terms of architecture, the swarm might look something like this:

```
(Orchestrator)
/ \
Tools + Vector DB -- (LLM Agent)---(Communication Layer) (Communication Layer)---(LLM Agent)-- Tools + Vector DB
/ | | \
(Task Assignment) (Task Completion) (Task Assignment) (Task Completion)
```

Each LLM agent communicates with the orchestrator through a dedicated communication layer. The orchestrator assigns tasks to each LLM agent, which the agents then complete and return. This setup allows for a high degree of flexibility, scalability, and robustness.


## Communication Layer

Communication layers play a critical role in distributed systems, enabling interaction between different nodes (agents) and the orchestrator. Here are three potential communication layers for a distributed system, including their strengths and weaknesses:

1. **Message Queuing Systems (like RabbitMQ, Kafka)**:

- Strengths: They are highly scalable, reliable, and designed for high-throughput systems. They also ensure delivery of messages and can persist them if necessary. Furthermore, they support various messaging patterns like publish/subscribe, which can be highly beneficial in a distributed system. They also have robust community support.

- Weaknesses: They can add complexity to the system, including maintenance of the message broker. Moreover, they require careful configuration to perform optimally, and handling failures can sometimes be challenging.

2. **RESTful APIs**:

- Strengths: REST is widely adopted, and most programming languages have libraries to easily create RESTful APIs. They leverage standard HTTP(S) protocols and methods and are straightforward to use. Also, they can be stateless, meaning each request contains all the necessary information, enabling scalability.

- Weaknesses: For real-time applications, REST may not be the best fit due to its synchronous nature. Additionally, handling a large number of API requests can put a strain on the system, causing slowdowns or timeouts.

3. **gRPC (Google Remote Procedure Call)**:

- Strengths: gRPC uses Protocol Buffers as its interface definition language, leading to smaller payloads and faster serialization/deserialization compared to JSON (commonly used in RESTful APIs). It supports bidirectional streaming and can use HTTP/2 features, making it excellent for real-time applications.

- Weaknesses: gRPC is more complex to set up compared to REST. Protocol Buffers' binary format can be more challenging to debug than JSON. It's also not as widely adopted as REST, so tooling and support might be limited in some environments.

In the context of swarm LLMs, one could consider an **Omni-Vector Embedding Database** for communication. This database could store and manage the high-dimensional vectors produced by each LLM agent.

- Strengths: This approach would allow for similarity-based lookup and matching of LLM-generated vectors, which can be particularly useful for tasks that involve finding similar outputs or recognizing patterns.

- Weaknesses: An Omni-Vector Embedding Database might add complexity to the system in terms of setup and maintenance. It might also require significant computational resources, depending on the volume of data being handled and the complexity of the vectors. The handling and transmission of high-dimensional vectors could also pose challenges in terms of network load.




# Technical Analysis Document: Particle Swarm of AI Agents using Ocean Database

## Overview

The goal is to create a particle swarm of AI agents using the OpenAI API for the agents and the Ocean database as the communication space, where the embeddings act as particles. The swarm will work collectively to perform tasks and optimize their behavior based on the interaction with the Ocean database.

## Algorithmic Overview

1. Initialize the AI agents and the Ocean database.
2. Assign tasks to the AI agents.
3. AI agents use the OpenAI API to perform tasks and generate embeddings.
4. AI agents store their embeddings in the Ocean database.
5. AI agents query the Ocean database for relevant embeddings.
6. AI agents update their positions based on the retrieved embeddings.
7. Evaluate the performance of the swarm and update the agents' behavior accordingly.
8. Repeat steps 3-7 until a stopping criterion is met.

## Python Implementation Logic

1. **Initialize the AI agents and the Ocean database.**

```python
import openai
import oceandb
from oceandb.utils.embedding_functions import ImageBindEmbeddingFunction

# Initialize Ocean database
client = oceandb.Client()
text_embedding_function = ImageBindEmbeddingFunction(modality="text")
collection = client.create_collection("all-my-documents", embedding_function=text_embedding_function)

# Initialize AI agents
agents = initialize_agents(...)
```

2. **Assign tasks to the AI agents.**

```python
tasks = assign_tasks_to_agents(agents, ...)
```

3. **AI agents use the OpenAI API to perform tasks and generate embeddings.**

```python
def agent_perform_task(agent, task):
# Perform the task using the OpenAI API
result = perform_task_with_openai_api(agent, task)
# Generate the embedding
embedding = generate_embedding(result)
return embedding

embeddings = [agent_perform_task(agent, task) for agent, task in zip(agents, tasks)]
```

4. **AI agents store their embeddings in the Ocean database.**

```python
def store_embeddings_in_database(embeddings, collection):
for i, embedding in enumerate(embeddings):
document_id = f"agent_{i}"
collection.add(documents=[embedding], ids=[document_id])

store_embeddings_in_database(embeddings, collection)
```

5. **AI agents query the Ocean database for relevant embeddings.**

```python
def query_database_for_embeddings(agent, collection, n_results=1):
query_result = collection.query(query_texts=[agent], n_results=n_results)
return query_result

queried_embeddings = [query_database_for_embeddings(agent, collection) for agent in agents]
```

6. **AI agents update their positions based on the retrieved embeddings.**

```python
def update_agent_positions(agents, queried_embeddings):
for agent, embedding in zip(agents, queried_embeddings):
agent.update_position(embedding)

update_agent_positions(agents, queried_embeddings)
```

7. **Evaluate the performance of the swarm and update the agents' behavior accordingly.**

```python
def evaluate_swarm_performance(agents, ...):
# Evaluate the performance of the swarm
performance = compute_performance_metric(agents, ...)
return performance

def update_agent_behavior(agents, performance):
# Update agents' behavior based on swarm performance
for agent in agents:
agent.adjust_behavior(performance)

performance = evaluate_swarm_performance(agents, ...)
update_agent_behavior(agents, performance)
```

8. **Repeat steps 3-7 until a stopping criterion is met.**

```python
while not stopping_criterion_met():
# Perform tasks and generate embeddings
embeddings = [agent_perform_task(agent, task) for agent, task in zip(agents, tasks)]

# Store embeddings in the Ocean database
store_embeddings_in_database(embeddings, collection)

# Query the Ocean database for relevant embeddings
queried_embeddings = [query_database_for_embeddings(agent, collection) for agent in agents]

# Update AI agent positions based on the retrieved embeddings
update_agent_positions(agents, queried_embeddings)

# Evaluate the performance of the swarm and update the agents' behavior accordingly
performance = evaluate_swarm_performance(agents, ...)
update_agent_behavior(agents, performance)
```

This code demonstrates the complete loop to repeat steps 3-7 until a stopping criterion is met. You will need to define the `stopping_criterion_met()` function, which could be based on a predefined number of iterations, a target performance level, or any other condition that indicates that the swarm has reached a desired state.



13 changes: 13 additions & 0 deletions DOCS/MANIFESTO.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
Today, we stand at the verge of a revolution in artificial intelligence and machine learning. Individual models have accomplished incredible feats, achieving unprecedented levels of understanding and generating incredibly human-like text. But this is just the beginning.

In the future, we should expect more. These models, which we've seen perform so admirably in isolation, should be able to work together, as a team, a swarm. However, this kind of collaborative intelligence doesn't exist today. That's because the technology to seamlessly integrate these models and foster true inter-model collaboration has been missing, until now.

In attempting to create this swarm, we face numerous challenges, such as developing the necessary infrastructure, ensuring seamless integration between the agents, and overcoming the practical limitations of our current computing capabilities. These are daunting tasks, and many have shied away from them because of the sheer complexity of the problem. But, if we can overcome these challenges, the rewards will be unimaginable, all digital activities will be automated.

We envision a future where swarms of Language Learning Model (LLM) agents revolutionize fields like customer support, content creation, and research. Imagine an AI system that could work cohesively, understand complex problems, and deliver multi-faceted solutions. We estimate this could lead to a 100-fold improvement in AI effectiveness, and up to a trillion-dollar impact on the global economy.

The secret to achieving this lies in our open-source approach and the power of the collective. By embracing open-source, we are enabling hundreds of thousands of minds worldwide to contribute to this vision, each bringing unique insights and solutions. Our bug bounty program and automated testing environments will act as catalysts, motivating and rewarding contributors while ensuring the robustness and reliability of our technology.

At Agora, we believe in the transformative potential of this technology, and we are committed to making it a reality. Our world-class team of researchers, engineers, and AI enthusiasts are singularly focused on this mission. With a proven track record of success, and the tenacity to tackle the most complex problems, we are best positioned to lead this charge.

We invite you to join us on this exciting journey. Let's come together to create swarms, advance humanity, and redefine what is possible with artificial intelligence. Our future is in our hands. Let's shape it together.
Loading
Loading