├── CNAME ├── tools ├── __init__.py ├── README.md ├── monitor.py ├── results.py └── results_browser.py ├── extensions ├── __init__.py ├── requirements.txt ├── dotenvext.py ├── human_mode.py ├── ray_objectives.py ├── ray_tasks.py ├── pinecone_storage.py ├── weaviate_storage.py └── argparseext.py ├── .gitattributes ├── classic ├── requirements.txt ├── ABOUT.md ├── README.md ├── babyagi.py └── BabyBeeAGI ├── docs ├── babyagi.png ├── baby-agi-fig-ar.png ├── weaviate.md ├── README-zh-tw.md ├── README-cn.md ├── README-ja.md ├── README-fa.md ├── README-ko.md ├── README-si.md ├── README-ua.md ├── README-ru.md ├── README-ar.md ├── README-tr.md ├── README-pt-br.md ├── inspired-projects.md ├── README-ro.md ├── README-pl.md ├── README-es.md ├── README-fr.md ├── README-de.md └── README-hu.md ├── requirements.txt ├── .gitignore ├── docker-compose.yml ├── Dockerfile ├── _config.yml ├── node ├── .env.example ├── package.json ├── README.md ├── package-lock.json └── babyagi.js ├── .pre-commit-config.yaml ├── LICENSE ├── .env.example └── README.md /CNAME: -------------------------------------------------------------------------------- 1 | babyagi.org -------------------------------------------------------------------------------- /tools/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /extensions/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | *.py text eol=lf -------------------------------------------------------------------------------- /classic/requirements.txt: -------------------------------------------------------------------------------- 1 | openai==0.27.2 2 | pinecone-client==2.2.1 3 | -------------------------------------------------------------------------------- /docs/babyagi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ekryski/babyagi/main/docs/babyagi.png -------------------------------------------------------------------------------- /docs/baby-agi-fig-ar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ekryski/babyagi/main/docs/baby-agi-fig-ar.png -------------------------------------------------------------------------------- /extensions/requirements.txt: -------------------------------------------------------------------------------- 1 | ray==2.3.1 2 | pinecone-client==2.2.1 3 | llama-cpp-python>=0.1.35 4 | weaviate-client>=3.16.1 -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | argparse==1.4.0 2 | openai==0.27.4 3 | chromadb==0.3.21 4 | pre-commit>=3.2.0 5 | python-dotenv==1.0.0 6 | tiktoken==0.3.3 7 | llama-cpp-python==0.1.36 8 | -------------------------------------------------------------------------------- /extensions/dotenvext.py: -------------------------------------------------------------------------------- 1 | from dotenv import load_dotenv 2 | 3 | def load_dotenv_extensions(dotenv_files): 4 | for dotenv_file in dotenv_files: 5 | load_dotenv(dotenv_file) 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | __pycache__/ 2 | *.py[cod] 3 | *$py.class 4 | 5 | .env 6 | .env.* 7 | env/ 8 | .venv 9 | *venv/ 10 | 11 | .vscode/ 12 | .idea/ 13 | 14 | models 15 | llama/ 16 | 17 | # for node 18 | chroma/ 19 | node_modules/ 20 | .DS_Store -------------------------------------------------------------------------------- /classic/ABOUT.md: -------------------------------------------------------------------------------- 1 | # BabyAgi Classic 2 | 3 | This folder contains the classic version of BabyAGI as a single script. You can use this as a starting point for your own projects built on the original BabyAGI reasoning engine, if the mainline version is too complex for your needs. -------------------------------------------------------------------------------- /tools/README.md: -------------------------------------------------------------------------------- 1 | Monitor requires curses library. To install it on Ubuntu, run: 2 | 3 | ```sh 4 | sudo apt update && sudo apt install libncurses5-dev libncursesw5-dev -y 5 | ``` 6 | 7 | Also, install keyboard library: 8 | 9 | ```sh 10 | pip3 install keyboard 11 | ``` 12 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3.9" 2 | 3 | services: 4 | babyagi: 5 | build: ./ 6 | container_name: babyagi 7 | restart: unless-stopped 8 | ports: 9 | - 127.0.0.1:8080:8080 10 | volumes: 11 | - "./:/app" 12 | stdin_open: true 13 | tty: true 14 | ulimits: 15 | memlock: -1 16 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:3.11-slim 2 | 3 | ENV PIP_NO_CACHE_DIR=true 4 | WORKDIR /tmp 5 | RUN apt-get update && apt-get install build-essential -y 6 | 7 | COPY requirements.txt /tmp/requirements.txt 8 | RUN pip install -r requirements.txt 9 | 10 | WORKDIR /app 11 | COPY . /app 12 | ENTRYPOINT ["./babyagi.py"] 13 | EXPOSE 8080 14 | -------------------------------------------------------------------------------- /extensions/human_mode.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | def user_input_await(prompt: str) -> str: 4 | print("\033[94m\033[1m" + "\n> COPY FOLLOWING TEXT TO CHATBOT\n" + "\033[0m\033[0m") 5 | print(prompt) 6 | print("\033[91m\033[1m" + "\n AFTER PASTING, PRESS: (ENTER), (CTRL+Z), (ENTER) TO FINISH\n" + "\033[0m\033[0m") 7 | print("\033[96m\033[1m" + "\n> PASTE YOUR RESPONSE:\n" + "\033[0m\033[0m") 8 | input_text = sys.stdin.read() 9 | return input_text.strip() -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | title: BabyAGI 2 | email: 3 | description: >- 4 | BabyAGI is an AI-powered task management system that uses OpenAI and Pinecone APIs to create, prioritize, and execute tasks. 5 | baseurl: "" 6 | url: "https://babyagi.org" 7 | logo: docs/babyagi.png 8 | twitter_username: babyagi_ 9 | github_username: yoheinakajima 10 | show_downloads: false 11 | remote_theme: pages-themes/minimal@v0.2.0 12 | include: [docs] 13 | plugins: 14 | - jekyll-remote-theme 15 | -------------------------------------------------------------------------------- /docs/weaviate.md: -------------------------------------------------------------------------------- 1 | # How to setup 2 | 3 | ## Setup 4 | 5 | 1. Install weaviate client: 6 | 7 | ```bash 8 | pip -r extensions/requirements.txt 9 | ``` 10 | 11 | 2. Configure the following environment variables: 12 | 13 | ```bash 14 | TABLE_NAME=BabyAGITableInWeaviate 15 | 16 | # Weaviate config 17 | # Uncomment and fill these to switch from local ChromaDB to Weaviate 18 | WEAVIATE_USE_EMBEDDED=true 19 | WEAVIATE_URL= 20 | WEAVIATE_API_KEY= 21 | ``` 22 | Follow step 4 onwards in main README 23 | -------------------------------------------------------------------------------- /node/.env.example: -------------------------------------------------------------------------------- 1 | # cp .env.example .env 2 | # Edit your .env file with your own values 3 | # Don't commit your .env file to git/push to GitHub! 4 | # Don't modify/delete .env.example unless adding extensions to the project 5 | # which require new variable to be added to the .env file 6 | 7 | # API CONFIG 8 | OPENAI_API_KEY= 9 | OPENAI_API_MODEL=gpt-3.5-turbo # alternatively, gpt-4, text-davinci-003, etc 10 | 11 | # Collection CONFIG 12 | TABLE_NAME=test-collection 13 | 14 | # INSTANCE CONFIG 15 | BABY_NAME=BabyAGI 16 | 17 | -------------------------------------------------------------------------------- /node/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "babyagi", 3 | "version": "1.0.0", 4 | "description": "babyagi", 5 | "main": "babyagi.js", 6 | "type": "module", 7 | "author": { 8 | "name": "Yohei Nakajima", 9 | "url": "https://twitter.com/yoheinakajima" 10 | }, 11 | "scripts": { 12 | "babyagi": "node babyagi.js", 13 | "start": "npm run chroma-up && node babyagi.js", 14 | "chroma-up": "docker-compose -f ./chroma/docker-compose.yml up -d --build", 15 | "chroma-down": "docker-compose -f ./chroma/docker-compose.yml down" 16 | }, 17 | "keywords": [], 18 | "license": "ISC", 19 | "dependencies": { 20 | "chromadb": "^1.4.1", 21 | "dotenv": "^16.0.3", 22 | "openai": "^3.2.1", 23 | "prompt-sync": "^4.2.0" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | repos: 2 | - repo: https://github.com/pre-commit/pre-commit-hooks 3 | rev: v4.4.0 4 | hooks: 5 | - id: trailing-whitespace 6 | - id: end-of-file-fixer 7 | - id: check-yaml 8 | - id: check-added-large-files 9 | - id: check-merge-conflict 10 | - id: debug-statements 11 | - id: requirements-txt-fixer 12 | files: requirements.txt 13 | 14 | - repo: https://github.com/psf/black 15 | rev: 23.3.0 16 | hooks: 17 | - id: black 18 | 19 | - repo: https://github.com/pycqa/isort 20 | rev: 5.11.5 21 | hooks: 22 | - id: isort 23 | 24 | - repo: https://github.com/pycqa/flake8 25 | rev: 6.0.0 26 | hooks: 27 | - id: flake8 28 | args: ["--max-line-length=140"] 29 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Yohei Nakajima 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /tools/monitor.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | import sys 3 | import time 4 | import curses 5 | 6 | from pathlib import Path 7 | sys.path.append(str(Path(__file__).resolve().parent.parent)) 8 | from extensions.ray_objectives import CooperativeObjectivesListStorage 9 | from extensions.ray_tasks import CooperativeTaskListStorage 10 | 11 | def print_buffer(stdscr, lines): 12 | stdscr.clear() 13 | y = 0 14 | x = 0 15 | for line in lines: 16 | stdscr.addstr(y, x, line) 17 | y += 1 18 | stdscr.refresh() 19 | 20 | def main(stdscr): 21 | objectives = CooperativeObjectivesListStorage() 22 | while True: 23 | objectives_list = objectives.get_objective_names() 24 | buffer = [] 25 | if not objectives_list: 26 | buffer.append("No objectives") 27 | for objective in objectives_list: 28 | buffer.append("-----------------") 29 | buffer.append(f"Objective: {objective}") 30 | buffer.append("-----------------") 31 | tasks = CooperativeTaskListStorage(objective) 32 | tasks_list = tasks.get_task_names() 33 | buffer.append(f"Tasks:") 34 | for t in tasks_list: 35 | buffer.append(f" * {t}") 36 | buffer.append("-----------------") 37 | print_buffer(stdscr, buffer) 38 | time.sleep(30) 39 | 40 | curses.wrapper(main) 41 | -------------------------------------------------------------------------------- /extensions/ray_objectives.py: -------------------------------------------------------------------------------- 1 | import logging 2 | import ray 3 | from collections import deque 4 | 5 | ACTOR_NAME="BabyAGI Objectives" 6 | 7 | try: 8 | ray.init(address="auto", namespace="babyagi", logging_level=logging.FATAL, ignore_reinit_error=True) 9 | except: 10 | ray.init(namespace="babyagi", logging_level=logging.FATAL, ignore_reinit_error=True) 11 | 12 | @ray.remote 13 | class CooperativeObjectivesListStorageActor: 14 | def __init__(self): 15 | self.objectives = deque([]) 16 | 17 | def append(self, objective: str): 18 | if not objective in self.objectives: 19 | self.objectives.append(objective) 20 | 21 | def is_empty(self): 22 | return False if self.objectives else True 23 | 24 | def get_objective_names(self): 25 | return [t for t in self.objectives] 26 | 27 | class CooperativeObjectivesListStorage: 28 | def __init__(self): 29 | try: 30 | self.actor = ray.get_actor(name=ACTOR_NAME, namespace="babyagi") 31 | except ValueError: 32 | self.actor = CooperativeObjectivesListStorageActor.options(name=ACTOR_NAME, namespace="babyagi", lifetime="detached").remote() 33 | 34 | def append(self, objective: str): 35 | self.actor.append.remote(objective) 36 | 37 | def is_empty(self): 38 | return ray.get(self.actor.is_empty.remote()) 39 | 40 | def get_objective_names(self): 41 | return ray.get(self.actor.get_objective_names.remote()) 42 | -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | # cp .env.example .env 2 | # Edit your .env file with your own values 3 | # Don't commit your .env file to git/push to GitHub! 4 | # Don't modify/delete .env.example unless adding extensions to the project 5 | # which require new variable to be added to the .env file 6 | 7 | # API CONFIG 8 | # OPENAI_API_MODEL can be used instead 9 | # Special values: 10 | # human - use human as intermediary with custom LLMs 11 | # llama - use llama.cpp with Llama, Alpaca, Vicuna, GPT4All, etc 12 | LLM_MODEL=gpt-3.5-turbo # alternatively, gpt-4, text-davinci-003, etc 13 | 14 | LLAMA_MODEL_PATH= # ex. models/llama-13B/ggml-model.bin 15 | #LLAMA_THREADS_NUM=8 # Set the number of threads for llama (optional) 16 | 17 | OPENAI_API_KEY= 18 | OPENAI_TEMPERATURE=0.0 19 | 20 | # STORE CONFIG 21 | # TABLE_NAME can be used instead 22 | RESULTS_STORE_NAME=baby-agi-test-table 23 | 24 | # Weaviate config 25 | # Uncomment and fill these to switch from local ChromaDB to Weaviate 26 | # WEAVIATE_USE_EMBEDDED=true 27 | # WEAVIATE_URL= 28 | # WEAVIATE_API_KEY= 29 | 30 | # Pinecone config 31 | # Uncomment and fill these to switch from local ChromaDB to Pinecone 32 | # PINECONE_API_KEY= 33 | # PINECONE_ENVIRONMENT= 34 | 35 | # COOPERATIVE MODE CONFIG 36 | # BABY_NAME can be used instead 37 | INSTANCE_NAME=BabyAGI 38 | COOPERATIVE_MODE=none # local 39 | 40 | # RUN CONFIG 41 | OBJECTIVE=Solve world hunger 42 | # For backwards compatibility 43 | # FIRST_TASK can be used instead of INITIAL_TASK 44 | INITIAL_TASK=Develop a task list 45 | 46 | # Extensions 47 | # List additional extension .env files to load (except .env.example!) 48 | DOTENV_EXTENSIONS= 49 | # Set to true to enable command line args support 50 | ENABLE_COMMAND_LINE_ARGS=false 51 | 52 | 53 | -------------------------------------------------------------------------------- /tools/results.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | import os 3 | import argparse 4 | import openai 5 | import pinecone 6 | from dotenv import load_dotenv 7 | 8 | load_dotenv() 9 | 10 | OPENAI_API_KEY = os.getenv("OPENAI_API_KEY", "") 11 | assert OPENAI_API_KEY, "OPENAI_API_KEY environment variable is missing from .env" 12 | 13 | PINECONE_API_KEY = os.getenv("PINECONE_API_KEY", "") 14 | assert PINECONE_API_KEY, "PINECONE_API_KEY environment variable is missing from .env" 15 | 16 | PINECONE_ENVIRONMENT = os.getenv("PINECONE_ENVIRONMENT", "us-east1-gcp") 17 | assert PINECONE_ENVIRONMENT, "PINECONE_ENVIRONMENT environment variable is missing from .env" 18 | 19 | # Table config 20 | PINECONE_TABLE_NAME = os.getenv("TABLE_NAME", "") 21 | assert PINECONE_TABLE_NAME, "TABLE_NAME environment variable is missing from .env" 22 | 23 | # Function to query records from the Pinecone index 24 | def query_records(index, query, top_k=1000): 25 | results = index.query(query, top_k=top_k, include_metadata=True) 26 | return [f"{task.metadata['task']}:\n{task.metadata['result']}\n------------------" for task in results.matches] 27 | 28 | # Get embedding for the text 29 | def get_ada_embedding(text): 30 | text = text.replace("\n", " ") 31 | return openai.Embedding.create(input=[text], model="text-embedding-ada-002")["data"][0]["embedding"] 32 | 33 | def main(): 34 | # Parse command-line arguments 35 | parser = argparse.ArgumentParser(description="Query Pinecone index using a string.") 36 | parser.add_argument('objective', nargs='*', metavar='', help=''' 37 | main objective description. Doesn\'t need to be quoted. 38 | if not specified, get objective from environment. 39 | ''', default=[os.getenv("OBJECTIVE", "")]) 40 | args = parser.parse_args() 41 | 42 | # Initialize Pinecone 43 | pinecone.init(api_key=PINECONE_API_KEY) 44 | 45 | # Connect to the objective index 46 | index = pinecone.Index(PINECONE_TABLE_NAME) 47 | 48 | # Query records from the index 49 | query = get_ada_embedding(' '.join(args.objective).strip()) 50 | retrieved_tasks = query_records(index, query) 51 | for r in retrieved_tasks: 52 | print(r) 53 | 54 | if __name__ == "__main__": 55 | main() 56 | -------------------------------------------------------------------------------- /extensions/ray_tasks.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import logging 3 | import ray 4 | from collections import deque 5 | from typing import Dict, List 6 | 7 | from pathlib import Path 8 | sys.path.append(str(Path(__file__).resolve().parent.parent)) 9 | from extensions.ray_objectives import CooperativeObjectivesListStorage 10 | 11 | try: 12 | ray.init(address="auto", namespace="babyagi", logging_level=logging.FATAL, ignore_reinit_error=True) 13 | except: 14 | ray.init(namespace="babyagi", logging_level=logging.FATAL, ignore_reinit_error=True) 15 | 16 | @ray.remote 17 | class CooperativeTaskListStorageActor: 18 | def __init__(self): 19 | self.tasks = deque([]) 20 | self.task_id_counter = 0 21 | 22 | def append(self, task: Dict): 23 | self.tasks.append(task) 24 | 25 | def replace(self, tasks: List[Dict]): 26 | self.tasks = deque(tasks) 27 | 28 | def popleft(self): 29 | return self.tasks.popleft() 30 | 31 | def is_empty(self): 32 | return False if self.tasks else True 33 | 34 | def next_task_id(self): 35 | self.task_id_counter += 1 36 | return self.task_id_counter 37 | 38 | def get_task_names(self): 39 | return [t["task_name"] for t in self.tasks] 40 | 41 | class CooperativeTaskListStorage: 42 | def __init__(self, name: str): 43 | self.name = name 44 | 45 | try: 46 | self.actor = ray.get_actor(name=self.name, namespace="babyagi") 47 | except ValueError: 48 | self.actor = CooperativeTaskListStorageActor.options(name=self.name, namespace="babyagi", lifetime="detached").remote() 49 | 50 | objectives = CooperativeObjectivesListStorage() 51 | objectives.append(self.name) 52 | 53 | def append(self, task: Dict): 54 | self.actor.append.remote(task) 55 | 56 | def replace(self, tasks: List[Dict]): 57 | self.actor.replace.remote(tasks) 58 | 59 | def popleft(self): 60 | return ray.get(self.actor.popleft.remote()) 61 | 62 | def is_empty(self): 63 | return ray.get(self.actor.is_empty.remote()) 64 | 65 | def next_task_id(self): 66 | return ray.get(self.actor.next_task_id.remote()) 67 | 68 | def get_task_names(self): 69 | return ray.get(self.actor.get_task_names.remote()) 70 | -------------------------------------------------------------------------------- /extensions/pinecone_storage.py: -------------------------------------------------------------------------------- 1 | from typing import Dict, List 2 | import importlib 3 | import openai 4 | import pinecone 5 | import re 6 | 7 | def can_import(module_name): 8 | try: 9 | importlib.import_module(module_name) 10 | return True 11 | except ImportError: 12 | return False 13 | 14 | assert ( 15 | can_import("pinecone") 16 | ), "\033[91m\033[1m"+"Pinecone storage requires package pinecone-client.\nInstall: pip install -r extensions/requirements.txt" 17 | 18 | class PineconeResultsStorage: 19 | def __init__(self, openai_api_key: str, pinecone_api_key: str, pinecone_environment: str, llm_model: str, llama_model_path: str, results_store_name: str, objective: str): 20 | openai.api_key = openai_api_key 21 | pinecone.init(api_key=pinecone_api_key, environment=pinecone_environment) 22 | 23 | # Pinecone namespaces are only compatible with ascii characters (used in query and upsert) 24 | self.namespace = re.sub(re.compile('[^\x00-\x7F]+'), '', objective) 25 | 26 | self.llm_model = llm_model 27 | self.llama_model_path = llama_model_path 28 | 29 | results_store_name = results_store_name 30 | dimension = 1536 if not self.llm_model.startswith("llama") else 5120 31 | metric = "cosine" 32 | pod_type = "p1" 33 | if results_store_name not in pinecone.list_indexes(): 34 | pinecone.create_index( 35 | results_store_name, dimension=dimension, metric=metric, pod_type=pod_type 36 | ) 37 | 38 | self.index = pinecone.Index(results_store_name) 39 | index_stats_response = self.index.describe_index_stats() 40 | assert dimension == index_stats_response['dimension'], "Dimension of the index does not match the dimension of the LLM embedding" 41 | 42 | def add(self, task: Dict, result: str, result_id: int): 43 | vector = self.get_embedding( 44 | result 45 | ) 46 | self.index.upsert( 47 | [(result_id, vector, {"task": task["task_name"], "result": result})], namespace=self.namespace 48 | ) 49 | 50 | def query(self, query: str, top_results_num: int) -> List[dict]: 51 | query_embedding = self.get_embedding(query) 52 | results = self.index.query(query_embedding, top_k=top_results_num, include_metadata=True, namespace=self.namespace) 53 | sorted_results = sorted(results.matches, key=lambda x: x.score, reverse=True) 54 | return [(str(item.metadata["task"])) for item in sorted_results] 55 | 56 | # Get embedding for the text 57 | def get_embedding(self, text: str) -> list: 58 | text = text.replace("\n", " ") 59 | 60 | if self.llm_model.startswith("llama"): 61 | from llama_cpp import Llama 62 | 63 | llm_embed = Llama( 64 | model_path=self.llama_model_path, 65 | n_ctx=2048, n_threads=4, 66 | embedding=True, use_mlock=True, 67 | ) 68 | return llm_embed.embed(text) 69 | 70 | return openai.Embedding.create(input=[text], model="text-embedding-ada-002")["data"][0]["embedding"] 71 | -------------------------------------------------------------------------------- /classic/README.md: -------------------------------------------------------------------------------- 1 | # babyagi 2 | 3 | 4 | # Objective 5 | This Python script is an example of an AI-powered task management system. The system uses OpenAI and Pinecone APIs to create, prioritize, and execute tasks. The main idea behind this system is that it creates tasks based on the result of previous tasks and a predefined objective. The script then uses OpenAI's natural language processing (NLP) capabilities to create new tasks based on the objective, and Pinecone to store and retrieve task results for context. This is a paired-down version of the original [Task-Driven Autonomous Agent](https://twitter.com/yoheinakajima/status/1640934493489070080?s=20) (Mar 28, 2023). 6 | 7 | This README will cover the following: 8 | 9 | * How the script works 10 | 11 | * How to use the script 12 | * Warning about running the script continuously 13 | # How It Works 14 | The script works by running an infinite loop that does the following steps: 15 | 16 | 1. Pulls the first task from the task list. 17 | 2. Sends the task to the execution agent, which uses OpenAI's API to complete the task based on the context. 18 | 3. Enriches the result and stores it in Pinecone. 19 | 4. Creates new tasks and reprioritizes the task list based on the objective and the result of the previous task. 20 | The execution_agent() function is where the OpenAI API is used. It takes two parameters: the objective and the task. It then sends a prompt to OpenAI's API, which returns the result of the task. The prompt consists of a description of the AI system's task, the objective, and the task itself. The result is then returned as a string. 21 | 22 | The task_creation_agent() function is where OpenAI's API is used to create new tasks based on the objective and the result of the previous task. The function takes four parameters: the objective, the result of the previous task, the task description, and the current task list. It then sends a prompt to OpenAI's API, which returns a list of new tasks as strings. The function then returns the new tasks as a list of dictionaries, where each dictionary contains the name of the task. 23 | 24 | The prioritization_agent() function is where OpenAI's API is used to reprioritize the task list. The function takes one parameter, the ID of the current task. It sends a prompt to OpenAI's API, which returns the reprioritized task list as a numbered list. 25 | 26 | Finally, the script uses Pinecone to store and retrieve task results for context. The script creates a Pinecone index based on the table name specified in YOUR_TABLE_NAME variable. Pinecone is then used to store the results of the task in the index, along with the task name and any additional metadata. 27 | 28 | # How to Use 29 | To use the script, you will need to follow these steps: 30 | 31 | 1. Install the required packages: `pip install -r requirements.txt` 32 | 2. Set your OpenAI and Pinecone API keys in the OPENAI_API_KEY and PINECONE_API_KEY variables. 33 | 3. Set the Pinecone environment in the PINECONE_ENVIRONMENT variable. 34 | 4. Set the name of the table where the task results will be stored in the YOUR_TABLE_NAME variable. 35 | 5. Set the objective of the task management system in the OBJECTIVE variable. 36 | 6. Set the first task of the system in the YOUR_FIRST_TASK variable. 37 | 7. Run the script. 38 | 39 | # Warning 40 | This script is designed to be run continuously as part of a task management system. Running this script continuously can result in high API usage, so please use it responsibly. Additionally, the script requires the OpenAI and Pinecone APIs to be set up correctly, so make sure you have set up the APIs before running the script. 41 | 42 | #Backstory 43 | BabyAGI is a paired-down version of the original [Task-Driven Autonomous Agent](https://twitter.com/yoheinakajima/status/1640934493489070080?s=20) (Mar 28, 2023) shared on Twitter. This version is down to 140 lines: 13 comments, 22 blank, 105 code. The name of the repo came up in the reaction to the original autonomous agent - the author does not mean to imply that this is AGI. 44 | 45 | Made with love by [@yoheinakajima](https://twitter.com/yoheinakajima), who happens to be a VC - so if you use this build a startup, ping him! 46 | -------------------------------------------------------------------------------- /tools/results_browser.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | import os 3 | import curses 4 | import argparse 5 | import openai 6 | import pinecone 7 | from dotenv import load_dotenv 8 | import textwrap 9 | 10 | load_dotenv() 11 | 12 | OPENAI_API_KEY = os.getenv("OPENAI_API_KEY", "") 13 | assert OPENAI_API_KEY, "OPENAI_API_KEY environment variable is missing from .env" 14 | 15 | PINECONE_API_KEY = os.getenv("PINECONE_API_KEY", "") 16 | assert PINECONE_API_KEY, "PINECONE_API_KEY environment variable is missing from .env" 17 | 18 | PINECONE_ENVIRONMENT = os.getenv("PINECONE_ENVIRONMENT", "us-east1-gcp") 19 | assert PINECONE_ENVIRONMENT, "PINECONE_ENVIRONMENT environment variable is missing from .env" 20 | 21 | # Table config 22 | PINECONE_TABLE_NAME = os.getenv("TABLE_NAME", "") 23 | assert PINECONE_TABLE_NAME, "TABLE_NAME environment variable is missing from .env" 24 | 25 | # Function to query records from the Pinecone index 26 | def query_records(index, query, top_k=1000): 27 | results = index.query(query, top_k=top_k, include_metadata=True) 28 | return [{"name": f"{task.metadata['task']}", "result": f"{task.metadata['result']}"} for task in results.matches] 29 | 30 | # Get embedding for the text 31 | def get_ada_embedding(text): 32 | return openai.Embedding.create(input=[text], model="text-embedding-ada-002")["data"][0]["embedding"] 33 | 34 | def draw_tasks(stdscr, tasks, scroll_pos, selected): 35 | y = 0 36 | h, w = stdscr.getmaxyx() 37 | for idx, task in enumerate(tasks[scroll_pos:], start=scroll_pos): 38 | if y >= h: 39 | break 40 | task_name = f'{task["name"]}' 41 | truncated_str = task_name[:w-1] 42 | if idx == selected: 43 | stdscr.addstr(y, 0, truncated_str, curses.A_REVERSE) 44 | else: 45 | stdscr.addstr(y, 0, truncated_str) 46 | y += 1 47 | 48 | def draw_result(stdscr, task): 49 | task_name = f'Task: {task["name"]}' 50 | task_result = f'Result: {task["result"]}' 51 | 52 | _, w = stdscr.getmaxyx() 53 | task_name_wrapped = textwrap.wrap(task_name, width=w) 54 | 55 | for i, line in enumerate(task_name_wrapped): 56 | stdscr.addstr(i, 0, line) 57 | 58 | y, _ = stdscr.getyx() 59 | stdscr.addstr(y+1, 0, '------------------') 60 | stdscr.addstr(y+2, 0, task_result) 61 | 62 | def draw_summary(stdscr, objective, tasks, start, num): 63 | stdscr.box() 64 | summary_text = f'{len(tasks)} tasks ({start}-{num}) | {objective}' 65 | stdscr.addstr(1, 1, summary_text[:stdscr.getmaxyx()[1] - 2]) 66 | 67 | def main(stdscr): 68 | # Initialize Pinecone 69 | pinecone.init(api_key=PINECONE_API_KEY) 70 | 71 | # Connect to the objective index 72 | index = pinecone.Index(PINECONE_TABLE_NAME) 73 | 74 | curses.curs_set(0) 75 | stdscr.timeout(1000) 76 | 77 | h, w = stdscr.getmaxyx() 78 | left_w = w // 2 79 | visible_lines = h - 3 80 | 81 | scroll_pos = 0 82 | selected = 0 83 | 84 | # Parse command-line arguments 85 | parser = argparse.ArgumentParser(description="Query Pinecone index using a string.") 86 | parser.add_argument('objective', nargs='*', metavar='', help=''' 87 | main objective description. Doesn\'t need to be quoted. 88 | if not specified, get objective from environment. 89 | ''', default=[os.getenv("OBJECTIVE", "")]) 90 | args = parser.parse_args() 91 | 92 | # Query records from the index 93 | objective = ' '.join(args.objective).strip().replace("\n", " ") 94 | retrieved_tasks = query_records(index, get_ada_embedding(objective)) 95 | 96 | while True: 97 | stdscr.clear() 98 | draw_tasks(stdscr.subwin(h-3, left_w, 0, 0), retrieved_tasks, scroll_pos, selected) 99 | draw_result(stdscr.subwin(h, w - left_w, 0, left_w), retrieved_tasks[selected]) 100 | draw_summary(stdscr.subwin(3, left_w, h - 3, 0), objective, retrieved_tasks, scroll_pos+1, scroll_pos+h-3) 101 | 102 | stdscr.refresh() 103 | key = stdscr.getch() 104 | 105 | if key == ord('q') or key == 27: 106 | break 107 | elif key == curses.KEY_UP and selected > 0: 108 | selected -= 1 109 | if selected < scroll_pos: 110 | scroll_pos -= 1 111 | elif key == curses.KEY_DOWN and selected < len(retrieved_tasks) - 1: 112 | selected += 1 113 | if selected - scroll_pos >= visible_lines: 114 | scroll_pos += 1 115 | 116 | curses.wrapper(main) -------------------------------------------------------------------------------- /docs/README-zh-tw.md: -------------------------------------------------------------------------------- 1 |

2 | babyagi 3 | 4 |

5 | 6 | # Readme 翻譯 7 | 8 | [Portuguese](docs/README-pt-br.md) 9 | [Russian](docs/README-ru.md) 10 | [Slovenian](docs/README-si.md) 11 | [Turkish](docs/README-tr.md) 12 | [Ukrainian](docs/README-ua.md) 13 | [繁體中文 (Traditional Chinese)](docs/README-zh-tw.md) 14 | 15 | # 目標 16 | 17 | 這個 Python 腳本是一個 AI 驅動的任務管理系統的範例。系統使用 OpenAI 和 Pinecone API 來創建、優先排序和執行任務。這個系統的主要概念是根據先前任務的結果和預定義的目標創建任務。腳本接著使用 OpenAI 的自然語言處理(NLP)能力根據目標創建新任務,並使用 Pinecone 存儲和檢索任務結果以獲取上下文。這是原始 [Task-Driven Autonomous Agent](https://twitter.com/yoheinakajima/status/1640934493489070080?s=20)(2023 年 3 月 28 日)的簡化版本。 18 | 19 | - [腳本如何運作](#工作原理) 20 | - [如何使用腳本](#如何使用) 21 | - [支持的模型](#支持的模型) 22 | - [連續運行腳本的警告](#警告) 23 | 24 | 此 README 將涵蓋以下內容: 25 | 26 | # 工作原理 27 | 28 | 腳本通過運行一個無限循環來執行以下步驟: 29 | 30 | 從任務列表中提取第一個任務。 31 | 將任務發送到執行代理,該代理使用 OpenAI 的 API 根據上下文完成任務。 32 | 豐富結果並將其存儲在 Pinecone 中。 33 | 根據目標和先前任務的結果創建新任務並重新排序任務列表。 34 |
35 | `execution_agent()` 函數是使用 OpenAI API 的地方。它需要兩個參數: 36 | 37 | 1. 目標 (objective) 38 | 2. 任務 (task)。 39 | 40 | 然後將提示發送到 OpenAI 的 API,該 API 返回任務的結果。提示包括 AI 系統任務的描述、目標和任務本身。然後將結果作為 string (字串) 返回。 41 |
42 | `task_creation_agent()` 函數是使用 OpenAI 的 API 根據目標和先前任務的結果創建新任務的地方。該函數需要四個參數: 43 | 44 | 1. 目標 (objective) 45 | 2. 先前任務的結果 (result of the previous task) 46 | 3. 任務描述 (task description) 47 | 4. 當前任務列表 (current task list) 48 | 49 | 然後將提示發送到 OpenAI 的 API,該 API 返回一個新任務的 string 列表。然後將新任務作為一個 list of dictionaries (字典列表) 返回,其中每個字典包含任務的名稱。 50 |
51 | `prioritization_agent()` 函數是使用 OpenAI 的 API 重新排序任務列表的地方。該函數需要一個參數,即當前任務的 ID。它將提示發送到 OpenAI 的 API,該 API 以編號列表的形式返回重新排序的任務列表。 52 | 53 | 最後,腳本使用 Pinecone 存儲和檢索任務結果以獲取上下文。腳本根據 `YOUR_TABLE_NAME` 變數中指定的表名創建一個 Pinecone 索引。然後使用 Pinecone 將任務的結果存儲在索引中,以及任務名稱和任何其他元數據。 54 | 55 | # 如何使用 56 | 57 | 要使用腳本,您需要執行以下步驟: 58 | 59 | 1. 通過 `git clone https://github.com/yoheinakajima/babyagi.git` 複製存儲庫並 cd 進入複製的存儲庫。 60 | 2. 安裝所需的軟件包:`pip install -r requirements.txt` 61 | 3. 將 `.env.example` 文件複製到 `.env`:`cp .env.example .env`。這是您將設置以下變數的地方。 62 | 4. 在 `OPENAI_API_KEY`, `OPENAPI_API_MODEL` 和 `PINECONE_API_KEY` 變數中設置您的 OpenAI 和 Pinecone API 密鑰。 63 | 5. 在 `PINECONE_ENVIRONMENT` 變數中設置 Pinecone 環境。 64 | 6. 在 `TABLE_NAME` 變數中設置將存儲任務結果的表名。 65 | 7. (可選)在 `OBJECTIVE` 變數中設置任務管理系統的目標。 66 | 8. (可選)在 `INITIAL_TASK` 變數中設置系統的第一個任務。 67 | 9. 運行腳本。 68 | 上述所有可選值也可以在命令行上指定。 69 | 70 | # 支持的模型 71 | 72 | 此腳本適用於所有 OpenAI 模型,以及通過 [Llama.cpp](https://github.com/ggerganov/llama.cpp) 的 Llama。默認模型是 `gpt-3.5-turbo`。要使用其他模型,通過 `OPENAI_API_MODEL` 指定,或使用命令行。 73 | 74 | 下載 Llama.cpp 的最新版本並按照說明進行製作。您還需要 Llama 模型權重。 75 | 76 | - **在任何情況下都不要在此存儲庫中的任何地方共享 IPFS、磁力鏈接 (magnet links) 或模型下載的任何其他鏈接,包括在問題、討論或拉取請求 (PR) 中。它們將立即被刪除。** 77 | 78 | 之後將 `llama/main` 鏈接到 `llama.cpp/main`,將 `models` 鏈接到您擁有 Llama 模型權重的文件夾。然後使用 `OPENAI_API_MODEL=llama` 或 `-l` 參數運行腳本。 79 | 80 | # 警告 81 | 82 | 此腳本旨在作為任務管理系統的一部分連續運行。連續運行此腳本可能導致高 API 使用率,因此請負起使用責任。此外,腳本要求正確設置 OpenAI 和 Pinecone API,因此在運行腳本之前請確保已設置 API。 83 | 84 | # 貢獻 85 | 86 | 不用說,BabyAGI 仍處於起步階段,因此我們仍在確定其方向和實現的步驟。目前,對於 BabyAGI 的一個關鍵設計目標是保持 _簡單_,以便易於理解和構建。為了保持這種簡單性,當提交 PR 時,請遵循以下準則: 87 | 88 | - 專注於小型、模塊化的修改,而不是大規模重構。 89 | - 在引入新功能時,提供有關您正在解決的特定使用案例 (use case) 的詳細描述。 90 | 91 | @yoheinakajima(2023 年 4 月 5 日)的一條說明: 92 | 93 | > 我知道越來越多的 PR,感謝您的耐心 - 因為我既是 GitHub/OpenSource 的新手,又沒有妥善安排本周的時間。關於方向,我一直在簡單與擴展之間猶豫不決 - 目前傾向於保持核心 Baby AGI 簡單,並使用這個平台來支持和推廣擴展的不同方法(例如 BabyAGIxLangchain 作為一個方向)。我認為有各種有意義的方法值得探索,我認為在一個中心地方進行比較和討論具有價值。即將有更多更新。 94 | 95 | 我是 GitHub 和開源的新手,所以在我學會如何正確管理這個項目時,請耐心等待。我白天經營一家創投公司,所以晚上在孩子們入睡後我通常會檢查 PR 和問題,這可能不是每天晚上。我們正在考慮引入支持,將很快更新這部分(期望、願景等)。我正在與很多人交流並學習,請耐心等待更新! 96 | 97 | # 背景故事 98 | 99 | BabyAGI 是原始 [Task-Driven Autonomous Agent](https://twitter.com/yoheinakajima/status/1640934493489070080?s=20)(2023 年 3 月 28 日)在 Twitter 上分享的精簡版本。這個版本縮減到了 140 行:13 條註釋、22 個空白和 105 個代碼。存儲庫的名字出現在對原始自主代理的反應中 - 作者並不意味著這是 AGI。 100 | 101 | 由 [@yoheinakajima](https://twitter.com/yoheinakajima) 製作,他碰巧是一位創投者(很想看到您在打造什麼!) 102 | -------------------------------------------------------------------------------- /docs/README-cn.md: -------------------------------------------------------------------------------- 1 |

2 | babyagi 3 | 4 |

5 | 6 | # Readme 翻译: 7 | 8 | [Portuguese](docs/README-pt-br.md) 9 | [Russian](docs/README-ru.md) 10 | [Slovenian](docs/README-si.md) 11 | [Turkish](docs/README-tr.md) 12 | [Ukrainian](docs/README-ua.md) 13 | [Chinese](docs/README-cn.md) 14 | 15 | # 目标 16 | 17 | 此 Python 脚本是一个 AI 支持的任务管理系统示例. 该系统使用 OpenAI 和 Pinecone API 创建, 优先级排序和执行任务. 该系统背后的主要思想是基于先前任务的结果和预定义的目标创建任务. 脚本然后使用 OpenAI 的自然语言处理(NLP)能力根据目标创建新任务, 并使用 Pinecone 存储和检索任务结果以获得上下文. 这是原始的[任务驱动的自驱代理](https://twitter.com/yoheinakajima/status/1640934493489070080?s=20)(2023 年 3 月 28 日)的简化版本. 18 | 19 | README 将涵盖以下内容: 20 | 21 | - [脚本如何运行](#how-it-works) 22 | 23 | - [如何使用脚本](#how-to-use) 24 | 25 | - [支持的模型](#supported-models) 26 | 27 | - [关于连续运行脚本的警告](#continous-script-warning) 28 | 29 | # 这怎么玩? 30 | 31 | 脚本通过运行一个无限循环来工作, 该循环执行以下步骤: 32 | 33 | 1. 从任务列表中提取第一个任务. 34 | 2. 将任务发送给执行代理, 该代理使用 OpenAI API 根据上下文完成任务. 35 | 3. 丰润结果并将其存储在 Pinecone 中. 36 | 4. 基于目标和前一个任务的结果创建新任务, 并根据优先级对任务列表进行排序. 37 |
38 | 39 | 函数 execution_agent()使用 OpenAI API. 它接受两个参数:目标和任务. 然后它向 OpenAI 的 API 发送一个 prompt(提示), 该 API 返回任务的结果. Prompt 包括 AI 系统任务的描述, 目标和任务本身. 结果然后以 string 形式返回. 40 |
41 | task_creation_agent()函数使用 OpenAI API 根据目标和前一个任务的结果创建新任务. 该函数接受 4 个参数:目标, 前一个任务的结果, 任务描述和当前任务列表. 然后它向 OpenAI 的 API 发送一个 prompt, 该 API 返回一个新任务的 string 列表. 函数然后将新任务作为字典列表返回, 其中每个字典包含任务的名称. 42 |
43 | prioritization_agent()函数使用 OpenAI API 对任务列表进行重新排序. 该函数接受一个参数, 即当前任务的 ID. 它向 OpenAI 的 API 发送一个 prompt, 该 API 返回一个重新排序的任务列表(以数字编号). 44 | 45 | 最后, 脚本使用 Pinecone 存储和检索任务结果以获取上下文. 脚本根据 YOUR_TABLE_NAME 变量中指定的表名创建一个 Pinecone 索引. 然后 Pinecone 将任务结果与任务名称和任何其他元数据(metadata)一起存储在索引中. 46 | 47 | # 咋用 48 | 49 | 要使用此脚本, 您需要按照以下步骤操作: 50 | 51 | 1. 通过 `git clone https://github.com/yoheinakajima/babyagi.git` 克隆 repository(仓库), 然后使用`cd`进入克隆的 repo. 52 | 2. 安装所需的包:`pip install -r requirements.txt` 53 | 3. 将.env.example 文件复制到.env: `cp .env.example .env`. 在这里, 您将设置以下变量. 54 | 4. 在 OPENAI_API_KEY, OPENAPI_API_MODEL 和 PINECONE_API_KEY 变量中设置您的 OpenAI 和 Pinecone API 密钥. 55 | 5. 在 PINECONE_ENVIRONMENT 变量中设置 Pinecone 环境. 56 | 6. 在 TABLE_NAME 变量中设置存储任务结果的表的名称. 7.(可选)在 OBJECTIVE 变量中设置任务管理系统的目标. 8.(可选)在 INITIAL_TASK 变量中设置系统的第一个任务. 57 | 7. 运行脚本. 58 | 59 | 上面的所有可选值也可以在命令行中指定. 60 | 61 | # 支持的模型 62 | 63 | 此脚本适用于所有 OpenAI 模型, 以及 Llama (通过 Llama.cp). 默认模型是 gpt-3.5-turbo. 要使用不同的模型, 请通过 OPENAI_API_MODEL 指定, 或者使用命令行. 64 | 65 | ## Llama 66 | 67 | 下载最新版的[Llama.cpp](https://github.com/ggerganov/llama.cpp) 并按照说明进行编译. 您还需要 Llama 模型的权重. 68 | 69 | - **在任何情况下, 都不要在此 repo(仓库)的任何地方(包括问题, 讨论或拉取请求中)分享 IPFS, 磁力链接或任何其他模型下载链接. 它们将立即被删除.** 70 | 71 | 然后将 `llama/main` 链接到 llama.cpp/main, 将 `models` 链接到存放 Llama 模型权重的文件夹. 接着传入参数 `OPENAI_API_MODEL=llama` 或 `-l` 运行脚本. 72 | 73 | # 高能警告 74 | 75 | 该脚本被设计为作为任务管理系统的一部分持续运行. 持续运行此脚本可能导致 API 的**使用费超高**, 请务必谨慎使用并后果自负. 此外, 脚本需要正确设置 OpenAI 和 Pinecone API, 因此请确保在运行脚本之前已经设置了 API. 76 | 77 | # 贡献 78 | 79 | 不管咋说, BabyAGI 还处于起步阶段, 我们仍在确定其发展方向以及实现目标所需的步骤. 目前, BabyAGI 的一个关键设计目标是保持 **简单**, 以便于理解和构建. 为了保持这种简单性, 我们恳请您在提交 PR 时遵循以下准则: 80 | 81 | - 集中于小型, 模块化的修改, 而不是大规模的重构. 82 | - 在引入新功能时, 提供详细的描述, 说明您要解决的具体用例. 83 | 84 | @yoheinakajima 发的的小纸条 (Apr 5th, 2023): 85 | 86 | > 我知道 PR 的数量在不断增加, 感谢你们的耐心 - 因为我既是 GitHub/OpenSource 的新手, 又没有合理安排本周的时间. Re: 关于发展方向, 我一直在保持简单与扩展之间徘徊 - 目前倾向于保持 核心的 Baby AGI 尽量简单, 并将其作为支持和推广扩展的不同方法的平台(例如, 将 BabyAGIxLangchain 作为一个方向). 我相信有各种有建设性的方法值得探索, 那么在专门的地方进行比较和讨论能够见证价值的. 更多更新即将到来. 87 | 88 | 我是 GitHub 和 open source 的新手, 所以请耐心等待, 因为我正在学习如何管理好这个项目. 白天我经营一家风投公司, 所以我通常会在晚上哄娃睡着之后检查 PR 和 issues - 可能不是每个晚上. 我对引入支持的想法持开放态度, 将很快更新这一部分(期望, 愿景等). 正在与很多人交流学习 - 敬请期待更新! 89 | 90 | # 背景故事 91 | 92 | BabyAGI 是一个精简版本, 它的原版[Task-Driven Autonomous Agent(任务驱动的自驱代理)](https://twitter.com/yoheinakajima/status/1640934493489070080?s=20) 是在 Twitter 分享的(Mar 28, 2023). 这个版本缩减到了 140 行:13 条注释, 22 个空白行, 以及 105 行代码. Repo 的名称源于对原始自驱代理的反馈 - 作者并不是想暗示这就是 AGI. 93 | 94 | [@yoheinakajima](https://twitter.com/yoheinakajima)用爱发电创作此 repo, 他碰巧是一位 VC(风险投资人) (很想看看你们在创造什么!) 95 | -------------------------------------------------------------------------------- /extensions/weaviate_storage.py: -------------------------------------------------------------------------------- 1 | import importlib 2 | import logging 3 | import re 4 | from typing import Dict, List 5 | 6 | import openai 7 | import weaviate 8 | from weaviate.embedded import EmbeddedOptions 9 | 10 | 11 | def can_import(module_name): 12 | try: 13 | importlib.import_module(module_name) 14 | return True 15 | except ImportError: 16 | return False 17 | 18 | 19 | assert can_import("weaviate"), ( 20 | "\033[91m\033[1m" 21 | + "Weaviate storage requires package weaviate-client.\nInstall: pip install -r extensions/requirements.txt" 22 | ) 23 | 24 | 25 | def create_client( 26 | weaviate_url: str, weaviate_api_key: str, weaviate_use_embedded: bool 27 | ): 28 | if weaviate_use_embedded: 29 | client = weaviate.Client(embedded_options=EmbeddedOptions()) 30 | else: 31 | auth_config = ( 32 | weaviate.auth.AuthApiKey(api_key=weaviate_api_key) 33 | if weaviate_api_key 34 | else None 35 | ) 36 | client = weaviate.Client(weaviate_url, auth_client_secret=auth_config) 37 | 38 | return client 39 | 40 | 41 | class WeaviateResultsStorage: 42 | schema = { 43 | "properties": [ 44 | {"name": "result_id", "dataType": ["string"]}, 45 | {"name": "task", "dataType": ["string"]}, 46 | {"name": "result", "dataType": ["text"]}, 47 | ] 48 | } 49 | 50 | def __init__( 51 | self, 52 | openai_api_key: str, 53 | weaviate_url: str, 54 | weaviate_api_key: str, 55 | weaviate_use_embedded: bool, 56 | llm_model: str, 57 | llama_model_path: str, 58 | results_store_name: str, 59 | objective: str, 60 | ): 61 | openai.api_key = openai_api_key 62 | self.client = create_client( 63 | weaviate_url, weaviate_api_key, weaviate_use_embedded 64 | ) 65 | self.index_name = None 66 | self.create_schema(results_store_name) 67 | 68 | self.llm_model = llm_model 69 | self.llama_model_path = llama_model_path 70 | 71 | def create_schema(self, results_store_name: str): 72 | valid_class_name = re.compile(r"^[A-Z][a-zA-Z0-9_]*$") 73 | if not re.match(valid_class_name, results_store_name): 74 | raise ValueError( 75 | f"Invalid index name: {results_store_name}. " 76 | "Index names must start with a capital letter and " 77 | "contain only alphanumeric characters and underscores." 78 | ) 79 | 80 | self.schema["class"] = results_store_name 81 | if self.client.schema.contains(self.schema): 82 | logging.info( 83 | f"Index named {results_store_name} already exists. Reusing it." 84 | ) 85 | else: 86 | logging.info(f"Creating index named {results_store_name}") 87 | self.client.schema.create_class(self.schema) 88 | 89 | self.index_name = results_store_name 90 | 91 | def add(self, task: Dict, result: Dict, result_id: int, vector: List): 92 | enriched_result = {"data": result} 93 | vector = self.get_embedding(enriched_result["data"]) 94 | 95 | with self.client.batch as batch: 96 | data_object = { 97 | "result_id": result_id, 98 | "task": task["task_name"], 99 | "result": result, 100 | } 101 | batch.add_data_object( 102 | data_object=data_object, class_name=self.index_name, vector=vector 103 | ) 104 | 105 | def query(self, query: str, top_results_num: int) -> List[dict]: 106 | query_embedding = self.get_embedding(query) 107 | 108 | results = ( 109 | self.client.query.get(self.index_name, ["task"]) 110 | .with_hybrid(query=query, alpha=0.5, vector=query_embedding) 111 | .with_limit(top_results_num) 112 | .do() 113 | ) 114 | 115 | return self._extract_tasks(results) 116 | 117 | def _extract_tasks(self, data): 118 | task_data = data.get("data", {}).get("Get", {}).get(self.index_name, []) 119 | return [item["task"] for item in task_data] 120 | 121 | # Get embedding for the text 122 | def get_embedding(self, text: str) -> list: 123 | text = text.replace("\n", " ") 124 | 125 | if self.llm_model.startswith("llama"): 126 | from llama_cpp import Llama 127 | 128 | llm_embed = Llama( 129 | model_path=self.llama_model_path, 130 | n_ctx=2048, 131 | n_threads=4, 132 | embedding=True, 133 | use_mlock=True, 134 | ) 135 | return llm_embed.embed(text) 136 | 137 | return openai.Embedding.create(input=[text], model="text-embedding-ada-002")[ 138 | "data" 139 | ][0]["embedding"] 140 | -------------------------------------------------------------------------------- /node/README.md: -------------------------------------------------------------------------------- 1 | # node-chroma babyagi 2 | 3 | # Objective 4 | 5 | This Node script is an example of an AI-powered task management system. The system uses OpenAI and Chroma APIs to create, prioritize, and execute tasks. The main idea behind this system is that it creates tasks based on the result of previous tasks and a predefined objective. The script then uses OpenAI's natural language processing (NLP) capabilities to create new tasks based on the objective, and Chroma to store and retrieve task results for context. This is a paired-down version of the original [Task-Driven Autonomous Agent](https://twitter.com/yoheinakajima/status/1640934493489070080?s=20) (Mar 28, 2023). 6 | 7 | This README will cover the following: 8 | 9 | - How the script works 10 | 11 | - How to use the script 12 | - Warning about running the script continuously 13 | 14 | # How It Works 15 | 16 | The script works by running an infinite loop that does the following steps: 17 | 18 | 1. Pulls the first task from the task list. 19 | 2. Sends the task to the execution agent, which uses OpenAI's API to complete the task based on the context. 20 | 3. Enriches the result and stores it in [Chroma](docs.trychroma.com). 21 | 4. Creates new tasks and reprioritizes the task list based on the objective and the result of the previous task. 22 | The execution_agent() function is where the OpenAI API is used. It takes two parameters: the objective and the task. It then sends a prompt to OpenAI's API, which returns the result of the task. The prompt consists of a description of the AI system's task, the objective, and the task itself. The result is then returned as a string. 23 | 24 | The task_creation_agent() function is where OpenAI's API is used to create new tasks based on the objective and the result of the previous task. The function takes four parameters: the objective, the result of the previous task, the task description, and the current task list. It then sends a prompt to OpenAI's API, which returns a list of new tasks as strings. The function then returns the new tasks as a list of dictionaries, where each dictionary contains the name of the task. 25 | 26 | The prioritization_agent() function is where OpenAI's API is used to reprioritize the task list. The function takes one parameter, the ID of the current task. It sends a prompt to OpenAI's API, which returns the reprioritized task list as a numbered list. 27 | 28 | Finally, the script uses Chroma to store and retrieve task results for context. The script creates a Chroma collection based on the table name specified in the TABLE_NAME variable. Chroma is then used to store the results of the task in the collection, along with the task name and any additional metadata. 29 | 30 | # How to Use 31 | 32 | To use the script, you will need to follow these steps: 33 | 34 | 1. Install the required packages: `npm install` 35 | 2. Install chroma in this directory (based on the Chroma [docs](https://docs.trychroma.com/getting-started)) : 36 | ``` 37 | git clone git@github.com:chroma-core/chroma.git 38 | ``` 39 | 3. Make sure Docker is running on your machine 40 | 4. Set your OpenAI and in the OPENAI_API_KEY variables. 41 | 5. Set your OpenAI API key in the OPENAI_API_KEY and OPENAPI_API_MODEL variables. 42 | 6. Set the name of the table where the task results will be stored in the TABLE_NAME variable. 43 | 7. Run the script with 'npm run babyagi'. This will handle 'docker compose up.' 44 | 8. Provide the objective of the task management system when prompted. 45 | 9. Provide the objective of the task management system when prompted. 46 | 47 | # Warning 48 | 49 | This script is designed to be run continuously as part of a task management system. Running this script continuously can result in high API usage, so please use it responsibly. Additionally, the script requires the OpenAI and Pinecone APIs to be set up correctly, so make sure you have set up the APIs before running the script. 50 | 51 | # Backstory 52 | 53 | BabyAGI is a paired-down version of the original [Task-Driven Autonomous Agent](https://twitter.com/yoheinakajima/status/1640934493489070080?s=20) (Mar 28, 2023) shared on Twitter. This version is down to 140 lines: 13 comments, 22 blank, 105 code. The name of the repo came up in the reaction to the original autonomous agent - the author does not mean to imply that this is AGI. 54 | 55 | # TODO 56 | 57 | - [x] Implement BabyAGI in nodex 58 | - [x] Switch Pinecome to Chroma 59 | - [ ] Add LLaMA support 60 | - [ ] Allow users to modify model params 61 | - [ ] Support command line args 62 | - [ ] Allow agent to request additional input from user ( could be an interesting strategy to mitigate looping ) 63 | 64 | Made with love by : 65 | 66 | - [@yoheinakajima](https://twitter.com/yoheinakajima) (0->1), who happens to be a VC - so if you use this build a startup, ping him! 67 | 68 | Contributions from: 69 | 70 | - [@anton](https://twitter.com/atroyn) (pinecone->chroma), who happens to be a founder at [Chroma](https://www.trychroma.com/) 71 | - [@aidanjrauscher](https://twitter.com/aidanjrauscher) (python->node), who happens to be trying to find a job 72 | -------------------------------------------------------------------------------- /extensions/argparseext.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | import importlib 4 | import argparse 5 | 6 | def can_import(module_name): 7 | try: 8 | importlib.import_module(module_name) 9 | return True 10 | except ImportError: 11 | return False 12 | 13 | # Extract the env filenames in the -e flag only 14 | # Ignore any other arguments 15 | def parse_dotenv_extensions(argv): 16 | env_argv = [] 17 | if '-e' in argv: 18 | tmp_argv = argv[argv.index('-e') + 1:] 19 | parsed_args = [] 20 | for arg in tmp_argv: 21 | if arg.startswith('-'): 22 | break 23 | parsed_args.append(arg) 24 | env_argv = ['-e'] + parsed_args 25 | 26 | parser = argparse.ArgumentParser() 27 | parser.add_argument('-e', '--env', nargs='+', help=''' 28 | filenames for additional env variables to load 29 | ''', default=os.getenv("DOTENV_EXTENSIONS", "").split(' ')) 30 | 31 | return parser.parse_args(env_argv).env 32 | 33 | def parse_arguments(): 34 | dotenv_extensions = parse_dotenv_extensions(sys.argv) 35 | # Check if we need to load any additional env files 36 | # This allows us to override the default .env file 37 | # and update the default values for any command line arguments 38 | if dotenv_extensions: 39 | from extensions.dotenvext import load_dotenv_extensions 40 | load_dotenv_extensions(parse_dotenv_extensions(sys.argv)) 41 | 42 | # Now parse the full command line arguments 43 | parser = argparse.ArgumentParser( 44 | add_help=False, 45 | ) 46 | parser.add_argument('objective', nargs='*', metavar='', help=''' 47 | main objective description. Doesn\'t need to be quoted. 48 | if not specified, get objective from environment. 49 | ''', default=[os.getenv("OBJECTIVE", "")]) 50 | parser.add_argument('-n', '--name', required=False, help=''' 51 | instance name. 52 | if not specified, get the instance name from environment. 53 | ''', default=os.getenv("INSTANCE_NAME", os.getenv("BABY_NAME", "BabyAGI"))) 54 | parser.add_argument('-m', '--mode', choices=['n', 'none', 'l', 'local', 'd', 'distributed'], help=''' 55 | cooperative mode type 56 | ''', default='none') 57 | group = parser.add_mutually_exclusive_group() 58 | group.add_argument('-t', '--task', metavar='', help=''' 59 | initial task description. must be quoted. 60 | if not specified, get initial_task from environment. 61 | ''', default=os.getenv("INITIAL_TASK", os.getenv("FIRST_TASK", ""))) 62 | group.add_argument('-j', '--join', action='store_true', help=''' 63 | join an existing objective. 64 | install cooperative requirements. 65 | ''') 66 | group2 = parser.add_mutually_exclusive_group() 67 | group2.add_argument('-4', '--gpt-4', dest='llm_model', action='store_const', const="gpt-4", help=''' 68 | use GPT-4 instead of the default model. 69 | ''') 70 | group2.add_argument('-l', '--llama', dest='llm_model', action='store_const', const="llama", help=''' 71 | use LLaMa instead of the default model. Requires llama.cpp. 72 | ''') 73 | # This will parse -e again, which we want, because we need 74 | # to load those in the main file later as well 75 | parser.add_argument('-e', '--env', nargs='+', help=''' 76 | filenames for additional env variables to load 77 | ''', default=os.getenv("DOTENV_EXTENSIONS", "").split(' ')) 78 | parser.add_argument('-h', '-?', '--help', action='help', help=''' 79 | show this help message and exit 80 | ''') 81 | 82 | args = parser.parse_args() 83 | 84 | llm_model = args.llm_model if args.llm_model else os.getenv("LLM_MODEL", os.getenv("OPENAI_API_MODEL", "gpt-3.5-turbo")).lower() 85 | 86 | dotenv_extensions = args.env 87 | 88 | instance_name = args.name 89 | if not instance_name: 90 | print("\033[91m\033[1m" + "BabyAGI instance name missing\n" + "\033[0m\033[0m") 91 | parser.print_help() 92 | parser.exit() 93 | 94 | module_name = "ray" 95 | cooperative_mode = args.mode 96 | if cooperative_mode in ['l', 'local'] and not can_import(module_name): 97 | print("\033[91m\033[1m"+f"Local cooperative mode requires package {module_name}\nInstall: pip install -r extensions/requirements.txt\n" + "\033[0m\033[0m") 98 | parser.print_help() 99 | parser.exit() 100 | elif cooperative_mode in ['d', 'distributed']: 101 | print("\033[91m\033[1m" + "Distributed cooperative mode is not implemented yet\n" + "\033[0m\033[0m") 102 | parser.print_help() 103 | parser.exit() 104 | 105 | join_existing_objective = args.join 106 | if join_existing_objective and cooperative_mode in ['n', 'none']: 107 | print("\033[91m\033[1m"+f"Joining existing objective requires local or distributed cooperative mode\n" + "\033[0m\033[0m") 108 | parser.print_help() 109 | parser.exit() 110 | 111 | objective = ' '.join(args.objective).strip() 112 | if not objective: 113 | print("\033[91m\033[1m" + "No objective specified or found in environment.\n" + "\033[0m\033[0m") 114 | parser.print_help() 115 | parser.exit() 116 | 117 | initial_task = args.task 118 | if not initial_task and not join_existing_objective: 119 | print("\033[91m\033[1m" + "No initial task specified or found in environment.\n" + "\033[0m\033[0m") 120 | parser.print_help() 121 | parser.exit() 122 | 123 | return objective, initial_task, llm_model, dotenv_extensions, instance_name, cooperative_mode, join_existing_objective -------------------------------------------------------------------------------- /node/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "babyagi", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "babyagi", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "chromadb": "^1.4.1", 13 | "dotenv": "^16.0.3", 14 | "openai": "^3.2.1", 15 | "prompt-sync": "^4.2.0" 16 | } 17 | }, 18 | "node_modules/ansi-regex": { 19 | "version": "4.1.1", 20 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", 21 | "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", 22 | "engines": { 23 | "node": ">=6" 24 | } 25 | }, 26 | "node_modules/asynckit": { 27 | "version": "0.4.0", 28 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 29 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 30 | }, 31 | "node_modules/axios": { 32 | "version": "0.26.1", 33 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", 34 | "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", 35 | "dependencies": { 36 | "follow-redirects": "^1.14.8" 37 | } 38 | }, 39 | "node_modules/chromadb": { 40 | "version": "1.4.1", 41 | "resolved": "https://registry.npmjs.org/chromadb/-/chromadb-1.4.1.tgz", 42 | "integrity": "sha512-vRcig4CJxJXs++cKMt9tHmk9YjQprxzLK9sVYD6iXfqRJBoXeoFzk/RS95Dz1J6/7aSfBwDsyx3AE2ePP9FnYA==", 43 | "dependencies": { 44 | "axios": "^0.26.0" 45 | } 46 | }, 47 | "node_modules/combined-stream": { 48 | "version": "1.0.8", 49 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 50 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 51 | "dependencies": { 52 | "delayed-stream": "~1.0.0" 53 | }, 54 | "engines": { 55 | "node": ">= 0.8" 56 | } 57 | }, 58 | "node_modules/delayed-stream": { 59 | "version": "1.0.0", 60 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 61 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 62 | "engines": { 63 | "node": ">=0.4.0" 64 | } 65 | }, 66 | "node_modules/dotenv": { 67 | "version": "16.0.3", 68 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", 69 | "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", 70 | "engines": { 71 | "node": ">=12" 72 | } 73 | }, 74 | "node_modules/follow-redirects": { 75 | "version": "1.15.2", 76 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", 77 | "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", 78 | "funding": [ 79 | { 80 | "type": "individual", 81 | "url": "https://github.com/sponsors/RubenVerborgh" 82 | } 83 | ], 84 | "engines": { 85 | "node": ">=4.0" 86 | }, 87 | "peerDependenciesMeta": { 88 | "debug": { 89 | "optional": true 90 | } 91 | } 92 | }, 93 | "node_modules/form-data": { 94 | "version": "4.0.0", 95 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 96 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 97 | "dependencies": { 98 | "asynckit": "^0.4.0", 99 | "combined-stream": "^1.0.8", 100 | "mime-types": "^2.1.12" 101 | }, 102 | "engines": { 103 | "node": ">= 6" 104 | } 105 | }, 106 | "node_modules/mime-db": { 107 | "version": "1.52.0", 108 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 109 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 110 | "engines": { 111 | "node": ">= 0.6" 112 | } 113 | }, 114 | "node_modules/mime-types": { 115 | "version": "2.1.35", 116 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 117 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 118 | "dependencies": { 119 | "mime-db": "1.52.0" 120 | }, 121 | "engines": { 122 | "node": ">= 0.6" 123 | } 124 | }, 125 | "node_modules/openai": { 126 | "version": "3.2.1", 127 | "resolved": "https://registry.npmjs.org/openai/-/openai-3.2.1.tgz", 128 | "integrity": "sha512-762C9BNlJPbjjlWZi4WYK9iM2tAVAv0uUp1UmI34vb0CN5T2mjB/qM6RYBmNKMh/dN9fC+bxqPwWJZUTWW052A==", 129 | "dependencies": { 130 | "axios": "^0.26.0", 131 | "form-data": "^4.0.0" 132 | } 133 | }, 134 | "node_modules/prompt-sync": { 135 | "version": "4.2.0", 136 | "resolved": "https://registry.npmjs.org/prompt-sync/-/prompt-sync-4.2.0.tgz", 137 | "integrity": "sha512-BuEzzc5zptP5LsgV5MZETjDaKSWfchl5U9Luiu8SKp7iZWD5tZalOxvNcZRwv+d2phNFr8xlbxmFNcRKfJOzJw==", 138 | "dependencies": { 139 | "strip-ansi": "^5.0.0" 140 | } 141 | }, 142 | "node_modules/strip-ansi": { 143 | "version": "5.2.0", 144 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 145 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 146 | "dependencies": { 147 | "ansi-regex": "^4.1.0" 148 | }, 149 | "engines": { 150 | "node": ">=6" 151 | } 152 | } 153 | } 154 | } 155 | -------------------------------------------------------------------------------- /docs/README-ja.md: -------------------------------------------------------------------------------- 1 | # 翻訳: 2 | 3 | [Français](docs/README-fr.md) 4 | [Portuguese](docs/README-pt-br.md) 5 | [Romanian](docs/README-ro.md) 6 | [Russian](docs/README-ru.md) 7 | [Slovenian](docs/README-si.md) 8 | [Spanish](docs/README-es.md) 9 | [Turkish](docs/README-tr.md) 10 | [Ukrainian](docs/README-ua.md) 11 | [Simplified Chinese](docs/README-cn.md) 12 | [繁體中文 (Traditional Chinese)](docs/README-zh-tw.md) 13 | 14 | # 目的 15 | 16 | このPythonスクリプトは、AIを活用したタスク管理システムの一例です。このシステムは、OpenAIとPinecone APIを使用して、タスクの作成、優先順位付け、および実行を行います。このシステムの主な考え方は、以前のタスクの結果と事前に定義された目的に基づいてタスクを作成することです。その後、スクリプトはOpenAIの自然言語処理(NLP)機能を使って目的に基づいて新しいタスクを作成し、Pineconeでタスクの結果を保存してコンテキストを取得する。これは、オリジナルの[Task-Driven Autonomous Agent](https://twitter.com/yoheinakajima/status/1640934493489070080?s=20) (Mar 28, 2023)の縮小版です。 17 | 18 | このREADMEでは、次のことを説明します: 19 | 20 | - [スクリプトの動作について](#スクリプトの動作について) 21 | 22 | - [スクリプトの使用方法について](#使用方法について) 23 | 24 | - [サポートされるモデル](#サポートされるモデル) 25 | 26 | - [スクリプトの連続実行に関する警告](#連続使用スクリプト警告) 27 | 28 | # 仕組みについて 29 | 30 | このスクリプトは、以下のステップを実行する無限ループによって動作します: 31 | 32 | 1. タスクリストから最初のタスクを引き出します。 33 | 2. タスクを実行エージェントに送り、実行エージェントは OpenAI の API を使用して、コンテキストに基づいてタスクを完了させる。 34 | 3. 結果をエンリッチし、Pinecone に保存する。 35 | 4. 新しいタスクを作成し、目的と前のタスクの結果に基づいて、タスクリストを再優先化する。 36 |
37 | 38 | execution_agent() 関数は、OpenAI API が使用される場所です。この関数は、目的とタスクという2つのパラメータを受け取ります。そして、OpenAI の API にプロンプトを送信し、タスクの結果を返します。プロンプトは、AI システムのタスクの説明、目的、タスクそのものから構成されています。そして、結果は文字列として返されます。 39 |
40 | task_creation_agent() 関数は、OpenAI の API を使用して、目的と前のタスクの結果に基づいて、新しいタスクを作成するところです。この関数は、目的、前のタスクの結果、タスクの説明、現在のタスクリストという4つのパラメータを受け取ります。そして、OpenAI の API にプロンプトを送信し、新しいタスクのリストを文字列として返します。そして、この関数は、新しいタスクを辞書のリストとして返し、各辞書にはタスクの名前が含まれています。 41 |
42 | prioritization_agent() 関数は、OpenAI の API を使用して、タスクリストの再優先順位を決定するところです。この関数は、現在のタスクの ID を1つのパラメータとして受け取ります。OpenAI の API にプロンプトを送信し、再優先化されたタスクリストを番号付きリストとして返します。 43 | 44 | 最後に、スクリプトは Pinecone を使用して、コンテキストのためにタスクの結果を保存および取得します。スクリプトは YOUR_TABLE_NAME 変数で指定されたテーブル名に基づいて Pinecone のインデックスを作成します。そして、Pinecone を使用して、タスクの結果をタスク名と追加のメタデータと一緒にインデックスに格納します。 45 | 46 | # 使用方法について 47 | 48 | スクリプトを使用するには、次の手順が必要です: 49 | 50 | 1. `git clone https://github.com/yoheinakajima/babyagi.git` でリポジトリをクローンし、クローンしたリポジトリに `cd` を入れる。 51 | 2. 必要なパッケージをインストールします: `pip install -r requirements.txt` を実行します。 52 | 3. .env.example ファイルを .env にコピーします: `cp .env.example .env`。ここで、以下の変数を設定します。 53 | 4. OPENAI_API_KEY、OPENAPI_API_MODEL、PINECONE_API_KEY 変数に、OpenAI と Pinecone API キーを設定します。 54 | 5. PINECONE_ENVIRONMENT 変数に Pinecone の環境を設定します。 55 | 6. TABLE_NAME 変数にタスクの結果を保存するテーブルの名前を設定します。 56 | 7. (オプション)OBJECTIVE 変数にタスク管理システムの目的を設定します。 57 | 8. (オプション)INITIAL_TASK 変数に、システムの最初のタスクを設定する。 58 | 9. スクリプトを実行する。 59 | 60 | 上記のすべてのオプション値は、コマンドラインで指定することも可能です。 61 | 62 | # Docker コンテナ内での実行 63 | 64 | 前提条件として、docker と docker-compose がインストールされている必要があります。Docker desktop は最もシンプルなオプションです https://www.docker.com/products/docker-desktop/ 65 | 66 | Docker コンテナ内でシステムを実行するには、上記の手順で .env ファイルを設定し、以下を実行します: 67 | 68 | ``` 69 | docker-compose up 70 | ``` 71 | 72 | # サポートされるモデル 73 | 74 | このスクリプトは、OpenAI の全モデルと、Llama.cpp を介した Llama で動作します。デフォルトのモデルは **gpt-3.5-turbo** です。別のモデルを使用するには、OPENAI_API_MODEL で指定するか、コマンドラインを使用します。 75 | 76 | ## Llama 77 | 78 | 最新版の [Llama.cpp](https://github.com/ggerganov/llama.cpp) をダウンロードし、指示に従って作成してください。また、Llama モデルのウェイトが必要です。 79 | 80 | - **いかなる場合においても、IPFS、マグネットリンク、またはモデルダウンロードへのその他のリンクを、このリポジトリのいかなる場所(issue、discussion または pull request を含む)でも共有しないでください。それらは即座に削除されます。** 81 | 82 | その後、`llama/main` を llama.cpp/main に、`models` を Llama モデルのウェイトが入っているフォルダにリンクします。そして、`OPENAI_API_MODEL=llama` または `-l` 引数をつけてスクリプトを実行します。 83 | 84 | # 警告 85 | 86 | このスクリプトは、タスク管理システムの一部として連続的に実行されるように設計されています。このスクリプトを連続的に実行すると、API の使用量が多くなることがありますので、責任を持って使用してください。さらに、このスクリプトは OpenAI と Pinecone の API が正しく設定されている必要がありますので、スクリプトを実行する前に API の設定が完了していることを確認してください。 87 | 88 | # コントリビュート 89 | 90 | 言うまでもなく、BabyAGI はまだ初期段階にあり、その方向性とそこに到達するためのステップを決定しているところです。現在、BabyAGI が目指しているのは、「シンプル」であることです。このシンプルさを維持するために、PR を提出する際には、以下のガイドラインを遵守していただくようお願いいたします: 91 | 92 | - 大規模なリファクタリングではなく、小規模でモジュール化された修正に重点を置く。 93 | - 新機能を導入する際には、対応する特定のユースケースについて詳細な説明を行うこと。 94 | 95 | @yoheinakajima (2023年4月5日)からのメモ: 96 | 97 | > 私は GitHub/OpenSource の初心者で、今週は時間的な余裕を計画できていなかったので。現在、Baby AGI のコアをシンプルに保ち、これをプラットフォームとして拡張するためのさまざまなアプローチをサポートし、促進することに傾いています(例えば、BabyAGIxLangchain は一つの方向性です)。私は探求する価値のある様々な意見のアプローチがあると信じていますし、比較し議論するための中心的な場所を持つことに価値があると考えています。近日中にもっと更新します。 98 | 99 | 私は GitHub とオープンソースに慣れていないので、このプロジェクトを適切に管理できるようになるまで辛抱してください。昼間は VC 会社を経営しているので、PR や issue のチェックはだいたい夜、子供たちを寝かしつけた後に行うことになります(毎晩とは限りませんが)。サポートが必要な場合は、近日中にこのセクションを更新する予定です(期待、ビジョンなど)。多くの人と話し、学んでいます! 100 | 101 | # 裏話 102 | 103 | BabyAGI は、Twitter でシェアされたオリジナルの [Task-Driven Autonomous Agent](https://twitter.com/yoheinakajima/status/1640934493489070080?s=20) (Mar 28, 2023) を縮小したバージョンです。このバージョンは140行に減っています: コメント13行、空白22行、コード105行です。このリポジトリの名前は、オリジナルの自律型エージェントに対する反応から生まれたもので、作者はこれが AGI であることを意味するものではありません。 104 | 105 | 偶然にも VC である [@yoheinakajima](https://twitter.com/yoheinakajima) が愛を込めて作っています(みなさんの作っている物も見せてください!)。 106 | -------------------------------------------------------------------------------- /classic/babyagi.py: -------------------------------------------------------------------------------- 1 | import openai 2 | import pinecone 3 | import time 4 | from collections import deque 5 | from typing import Dict, List 6 | 7 | #Set API Keys 8 | OPENAI_API_KEY = "" 9 | PINECONE_API_KEY = "" 10 | PINECONE_ENVIRONMENT = "us-east1-gcp" #Pinecone Environment (eg. "us-east1-gcp") 11 | 12 | #Set Variables 13 | YOUR_TABLE_NAME = "test-table" 14 | OBJECTIVE = "Solve world hunger." 15 | YOUR_FIRST_TASK = "Develop a task list." 16 | 17 | #Print OBJECTIVE 18 | print("\033[96m\033[1m"+"\n*****OBJECTIVE*****\n"+"\033[0m\033[0m") 19 | print(OBJECTIVE) 20 | 21 | # Configure OpenAI and Pinecone 22 | openai.api_key = OPENAI_API_KEY 23 | pinecone.init(api_key=PINECONE_API_KEY, environment=PINECONE_ENVIRONMENT) 24 | 25 | # Create Pinecone index 26 | table_name = YOUR_TABLE_NAME 27 | dimension = 1536 28 | metric = "cosine" 29 | pod_type = "p1" 30 | if table_name not in pinecone.list_indexes(): 31 | pinecone.create_index(table_name, dimension=dimension, metric=metric, pod_type=pod_type) 32 | 33 | # Connect to the index 34 | index = pinecone.Index(table_name) 35 | 36 | # Task list 37 | task_list = deque([]) 38 | 39 | def add_task(task: Dict): 40 | task_list.append(task) 41 | 42 | def get_ada_embedding(text): 43 | text = text.replace("\n", " ") 44 | return openai.Embedding.create(input=[text], model="text-embedding-ada-002")["data"][0]["embedding"] 45 | 46 | def task_creation_agent(objective: str, result: Dict, task_description: str, task_list: List[str]): 47 | prompt = f"You are an task creation AI that uses the result of an execution agent to create new tasks with the following objective: {objective}, The last completed task has the result: {result}. This result was based on this task description: {task_description}. These are incomplete tasks: {', '.join(task_list)}. Based on the result, create new tasks to be completed by the AI system that do not overlap with incomplete tasks. Return the tasks as an array." 48 | response = openai.Completion.create(engine="text-davinci-003",prompt=prompt,temperature=0.5,max_tokens=100,top_p=1,frequency_penalty=0,presence_penalty=0) 49 | new_tasks = response.choices[0].text.strip().split('\n') 50 | return [{"task_name": task_name} for task_name in new_tasks] 51 | 52 | def prioritization_agent(this_task_id:int): 53 | global task_list 54 | task_names = [t["task_name"] for t in task_list] 55 | next_task_id = int(this_task_id)+1 56 | prompt = f"""You are an task prioritization AI tasked with cleaning the formatting of and reprioritizing the following tasks: {task_names}. Consider the ultimate objective of your team:{OBJECTIVE}. Do not remove any tasks. Return the result as a numbered list, like: 57 | #. First task 58 | #. Second task 59 | Start the task list with number {next_task_id}.""" 60 | response = openai.Completion.create(engine="text-davinci-003",prompt=prompt,temperature=0.5,max_tokens=1000,top_p=1,frequency_penalty=0,presence_penalty=0) 61 | new_tasks = response.choices[0].text.strip().split('\n') 62 | task_list = deque() 63 | for task_string in new_tasks: 64 | task_parts = task_string.strip().split(".", 1) 65 | if len(task_parts) == 2: 66 | task_id = task_parts[0].strip() 67 | task_name = task_parts[1].strip() 68 | task_list.append({"task_id": task_id, "task_name": task_name}) 69 | 70 | def execution_agent(objective:str,task: str) -> str: 71 | #context = context_agent(index="quickstart", query="my_search_query", n=5) 72 | context=context_agent(index=YOUR_TABLE_NAME, query=objective, n=5) 73 | #print("\n*******RELEVANT CONTEXT******\n") 74 | #print(context) 75 | response = openai.Completion.create( 76 | engine="text-davinci-003", 77 | prompt=f"You are an AI who performs one task based on the following objective: {objective}. Your task: {task}\nResponse:", 78 | temperature=0.7, 79 | max_tokens=2000, 80 | top_p=1, 81 | frequency_penalty=0, 82 | presence_penalty=0 83 | ) 84 | return response.choices[0].text.strip() 85 | 86 | def context_agent(query: str, index: str, n: int): 87 | query_embedding = get_ada_embedding(query) 88 | index = pinecone.Index(index_name=index) 89 | results = index.query(query_embedding, top_k=n, 90 | include_metadata=True) 91 | #print("***** RESULTS *****") 92 | #print(results) 93 | sorted_results = sorted(results.matches, key=lambda x: x.score, reverse=True) 94 | return [(str(item.metadata['task'])) for item in sorted_results] 95 | 96 | # Add the first task 97 | first_task = { 98 | "task_id": 1, 99 | "task_name": YOUR_FIRST_TASK 100 | } 101 | 102 | add_task(first_task) 103 | # Main loop 104 | task_id_counter = 1 105 | while True: 106 | if task_list: 107 | # Print the task list 108 | print("\033[95m\033[1m"+"\n*****TASK LIST*****\n"+"\033[0m\033[0m") 109 | for t in task_list: 110 | print(str(t['task_id'])+": "+t['task_name']) 111 | 112 | # Step 1: Pull the first task 113 | task = task_list.popleft() 114 | print("\033[92m\033[1m"+"\n*****NEXT TASK*****\n"+"\033[0m\033[0m") 115 | print(str(task['task_id'])+": "+task['task_name']) 116 | 117 | # Send to execution function to complete the task based on the context 118 | result = execution_agent(OBJECTIVE,task["task_name"]) 119 | this_task_id = int(task["task_id"]) 120 | print("\033[93m\033[1m"+"\n*****TASK RESULT*****\n"+"\033[0m\033[0m") 121 | print(result) 122 | 123 | # Step 2: Enrich result and store in Pinecone 124 | enriched_result = {'data': result} # This is where you should enrich the result if needed 125 | result_id = f"result_{task['task_id']}" 126 | vector = enriched_result['data'] # extract the actual result from the dictionary 127 | index.upsert([(result_id, get_ada_embedding(vector),{"task":task['task_name'],"result":result})]) 128 | 129 | # Step 3: Create new tasks and reprioritize task list 130 | new_tasks = task_creation_agent(OBJECTIVE,enriched_result, task["task_name"], [t["task_name"] for t in task_list]) 131 | 132 | for new_task in new_tasks: 133 | task_id_counter += 1 134 | new_task.update({"task_id": task_id_counter}) 135 | add_task(new_task) 136 | prioritization_agent(this_task_id) 137 | 138 | time.sleep(1) # Sleep before checking the task list again 139 | -------------------------------------------------------------------------------- /docs/README-fa.md: -------------------------------------------------------------------------------- 1 |

2 | babyagi 3 |

4 | 5 | # هدف 6 | 7 | این اسکریپت پایتون یک نمونه سیستم مدیریت وظایف توانمند هوش مصنوعی است. این سیستم با استفاده از API های OpenAI و Pinecone، وظایف را ایجاد، اولویت بندی و اجرا می کند. ایده اصلی پشت این سیستم این است که وظایف بر اساس نتیجه وظایف قبلی و هدف پیش تعریف شده ایجاد می شوند. سپس این اسکریپت از قابلیت های پردازش زبان طبیعی (NLP) OpenAI برای ایجاد وظایف جدید براساس هدف استفاده می کند، و از Pinecone برای ذخیره و بازیابی نتایج وظایف برای کانتکست استفاده می کند. این یک نسخه کوچکتر از [Task-Driven Autonomous Agent](https://twitter.com/yoheinakajima/status/1640934493489070080?s=20) (28 مارس 2023) است. 8 | 9 | 10 | 11 | # موضوعات 12 | 13 | - [نحوه کارایی](#how-it-works) 14 | 15 | - [نحوه استفاده](#how-to-use) 16 | 17 | - [مدل های پشتیبانی شده](#supported-models) 18 | 19 | - [ملاحظات در خصوص ران کردن اسکریپت](#continous-script-warning) 20 | 21 | # نحوه کارایی 22 | 23 | این کسریپت اینگونه کار میکند که در یک لوپ به صورت متدادم: 24 | 25 | 1. وظیفه اول رو از لیست وظایف میگیرد 26 | 2. وظیفه را به عامل اجرایی ارسال می‌کند که با استفاده از API OpenAI بر اساس متن، وظیفه را انجام می‌دهد. 27 | 3. نتیجه را تقویت کرده و در Pinecone ذخیره می‌کند.. 28 | 4. وظایف جدید را ایجاد کرده و با توجه به هدف و نتیجه وظیفه قبلی، اولویت و لیست وظایف را مجدداً تنظیم می‌کند. 29 |
30 | 31 | ![image](https://user-images.githubusercontent.com/6764957/232961802-e4c4c17d-b520-4db1-827c-a218a1647c73.png) 32 | 33 | تابع execution_agent() جایی است که از API OpenAI استفاده می‌شود. این تابع دو پارامتر دریافت می‌کند: هدف و وظیفه. سپس یک پرامپت (prompt) به API OpenAI ارسال می‌کند که نتیجه وظیفه را برمی‌گرداند. پرامپت شامل توصیفی از وظیفه سیستم هوش مصنوعی، هدف و وظیفه خود است. نتیجه به عنوان یک رشته (string) برگشت داده می‌شود. 34 |
35 | تابع task_creation_agent() جایی است که از API OpenAI برای ایجاد وظایف جدید براساس هدف و نتیجه وظیفه قبلی استفاده می‌شود. این تابع چهار پارامتر دریافت می‌کند: هدف، نتیجه وظیفه قبلی، شرح وظیفه و لیست کنونی وظایف. سپس یک پرامپت (prompt) به API OpenAI ارسال می‌شود که لیستی از وظایف جدید را به صورت رشته‌ها برمی‌گرداند. سپس تابع وظایف جدید را به عنوان یک لیست دیکشنری برمی‌گرداند، که هر دیکشنری شامل نام وظیفه است. 36 |
37 | تابع prioritization_agent() جایی است که از API OpenAI برای تنظیم مجدد اولویت لیست وظایف استفاده می‌شود. این تابع یک پارامتر، یعنی شناسه وظیفه جاری را دریافت می‌کند. سپس یک پرامپت (prompt) به API OpenAI ارسال می‌شود که لیست وظایف تنظیم شده مجدداً به صورت لیست شماره‌دار برمی‌گرداند. 38 | 39 | در نهایت، این اسکریپت از Pinecone برای ذخیره و بازیابی نتایج وظایف برای کانتکست استفاده می‌کند. اسکریپت یک فهرست Pinecone براساس نام جدول مشخص شده در متغیر YOUR_TABLE_NAME ایجاد می‌کند. Pinecone سپس برای ذخیره نتایج وظایف در این فهرست، به همراه نام وظیفه و هر فضای متادیتا اضافی استفاده می‌شود. 40 | 41 | 42 | # نحوه استفاده 43 | 44 | برای استفاده از این اسکریپت، باید مراحل زیر را دنبال کنید: 45 | 46 | 1. کلون کردن مخزن 47 | ``` 48 | git clone https://github.com/yoheinakajima/babyagi.git 49 | cd babyagi 50 | ``` 51 | 2. نصب پکیج های مورد نیاز 52 | ``` 53 | pip install -r requirements.txt 54 | ``` 55 | 56 | 3. کپی کردن فایل .env.example به .env 57 | ``` 58 | cp .env.example .env 59 | ``` 60 | 61 | 4. تنظیم کلیدهای API OpenAI و Pinecone 62 | متغیرهای زیر را در فایل .env ویرایش کنید: 63 | ``` 64 | OPENAI_API_KEY= 65 | OPENAPI_API_MODEL= 66 | PINECONE_API_KEY= 67 | ``` 68 | 69 | 5. تنظیم محیط Pinecone 70 | متغیر زیر را در فایل .env ویرایش کنید: 71 | ``` 72 | PINECONE_ENVIRONMENT= 73 | ``` 74 | 75 | 6. تنظیم نام جدول برای نتایج وظایف 76 | متغیر زیر را در فایل .env ویرایش کنید: 77 | ``` 78 | TABLE_NAME= 79 | ``` 80 | 81 | 7. (اختیاری): تنظیم نام BabyAGI 82 | متغیر زیر را در فایل .env ویرایش کنید: 83 | ``` 84 | BABY_NAME= 85 | ``` 86 | 87 | 8. (اختیاری): تنظیم هدف سیستم مدیریت وظایف 88 | متغیر زیر را در فایل .env ویرایش کنید: 89 | ``` 90 | OBJECTIVE= 91 | ``` 92 | 93 | 9. (اختیاری): تنظیم اولین وظیفه سیستم 94 | متغیر زیر را در فایل .env ویرایش کنید: 95 | ``` 96 | INITIAL_TASK= 97 | ``` 98 | 99 | 10. اجرای اسکریپت 100 | ``` 101 | python babyagi.py 102 | ``` 103 | 104 | 105 | # اجرای اسکریپت داخل یک کانتینر Docker 106 | 107 | در این روش، نیاز به نصب docker و docker-compose دارید. ساده‌ترین راه برای نصب Docker Desktop است https://www.docker.com/products/docker-desktop/ 108 | 109 | برای اجرای سیستم داخل یک کانتینر Docker، ابتدا فایل .env را مطابق با مراحل بالا تنظیم کنید، سپس دستور زیر را اجرا کنید: 110 | 111 | ``` 112 | docker-compose up 113 | ``` 114 | 115 | 116 | # مدل‌های پشتیبانی شده 117 | 118 | این اسکریپت با تمام مدل‌های OpenAI و همچنین Llama از طریق Llama.cpp کار می‌کند. مدل پیش‌فرض **gpt-3.5-turbo** است. برای استفاده از مدل دیگر، آن را از طریق OPENAI_API_MODEL مشخص کنید یا از خط فرمان استفاده کنید. 119 | 120 | ## Llama 121 | 122 | آخرین نسخه [Llama.cpp](https://github.com/ggerganov/llama.cpp) را دانلود کنید و دستورالعمل‌های نصب آن را دنبال کنید. همچنین نیاز به وزن مدل Llama دارید. 123 | 124 | - **هیچگاه لینک‌های IPFS، magnet و هرگونه لینک دانلود مدل را در هیچ قسمتی از این مخزن، از جمله issues، discussions و pull requests به اشتراک نگذارید. لینک‌ها به صورت فوری حذف می‌شوند.** 125 | 126 | پس از آن، پوشه `llama/main` را به `llama.cpp/main` و `models` را به پوشه‌ای که وزن مدل Llama در آن قرار دارد متصل کنید. سپس اسکریپت را با استفاده از `OPENAI_API_MODEL=llama` یا `-l` اجرا کنید. 127 | 128 | # هشدار 129 | 130 | این اسکریپت برای اجرای پیوسته به عنوان یک سیستم مدیریت وظایف طراحی شده است. اجرای پیوسته این اسکریپت می‌تواند منجر به استفاده بالای API شود، لطفاً با مسئولیت کاربردی از 131 | 132 | 133 | 134 | # مشارکت 135 | 136 | بدیهی است که BabyAGI هنوز در دوران نوزادی خود است و به همین دلیل هنوز داریم جهت آن و گام‌های لازم برای رسیدن به آن را تعیین می‌کنیم. هدف طراحی برای BabyAGI در حال حاضر این است که _ساده_ باشد تا به راحتی قابل فهم و گسترش باشد. برای حفظ این سادگی، لطفاً در هنگام ارسال PRs به دستورالعمل‌های زیر عمل کنید: 137 | 138 | - تمرکز بر تغییرات کوچک و ماژولار به جای بازسازی گسترده. 139 | - هنگام معرفی ویژگی‌های جدید، یک توضیح جزئیاتی از مورد کاربرد خاصی که شما در حال حاضر با آن مواجه هستید، ارائه دهید. 140 | 141 | یک نکته از طرف @yoheinakajima (۵ آوریل ۲۰۲۳): 142 | 143 | > من می‌دانم که تعداد PRها در حال افزایش است و از صبر شما قدردانی می‌کنم - زیرا من همزمان با تازه وارد بودن به GitHub/OpenSource و برنامه ریزی نکردن وقت خود در این هفته مواجه هستم. در مورد جهت، من در دو دسته نگه داشتن آن ساده یا گسترده تر بودم - در حال حاضر به سمت نگه داشتن یک Baby AGI هستم و از آن به عنوان یک پلتفرم برای پشتیبانی و ترویج رویکردهای مختلف گسترش استفاده می‌کنم (به عنوان مثال BabyAGIxLangchain به عنوان یک جهت). من معتقدم که رویکردهای نظری مختلفی وجود دارند که ارزش اکتشاف آن‌ها را دارند، و من ارزش دارم در دسترس داشتن یک مکان مرکزی برای مقایسه و بحث بین این رویکردها را می‌بینم. ب 144 | -------------------------------------------------------------------------------- /docs/README-ko.md: -------------------------------------------------------------------------------- 1 | # Translations: 2 | 3 | [Français](docs/README-fr.md) 4 | [Portuguese](docs/README-pt-br.md) 5 | [Romanian](docs/README-ro.md) 6 | [Russian](docs/README-ru.md) 7 | [Slovenian](docs/README-si.md) 8 | [Spanish](docs/README-es.md) 9 | [Turkish](docs/README-tr.md) 10 | [Ukrainian](docs/README-ua.md) 11 | [Simplified Chinese](docs/README-cn.md) 12 | [繁體中文 (Traditional Chinese)](docs/README-zh-tw.md) 13 | [日本語](docs/README-ja.md) 14 | [한국어](docs/README-ko.md) 15 | 16 | # 목표 17 | 이 Python 스크립트는 AI 기반 작업 관리 시스템의 예시입니다. 이 시스템은 OpenAI 및 Pinecone API를 사용하여 작업을 생성하고, 우선순위를 지정하고, 실행합니다. 이 시스템의 기본 아이디어는 이전 작업의 결과와 미리 정의된 목표를 기반으로 작업을 생성한다는 것입니다. 그런 다음 스크립트는 OpenAI의 자연어 처리(NLP) 기능을 사용하여 목표에 따라 새 작업을 생성하고 Pinecone은 컨텍스트에 맞게 작업 결과를 저장 및 검색합니다. 이것은 원래의 [작업 기반 자율 에이전트](https://twitter.com/yoheinakajima/status/1640934493489070080?s=20) (2023년 3월 28일)를 축소한 버전입니다. 18 | 19 | 이 README에서는 다음 내용을 다룹니다: 20 | 21 | * [스크립트 작동 방식](#how-it-works) 22 | 23 | * [스크립트 사용 방법](#how-to-use) 24 | 25 | * [지원되는 모델](#supported-models) 26 | 27 | * [스크립트 연속 실행에 대한 경고](#continuous-script-warning) 28 | # 작동 방식 29 | 스크립트는 다음 단계를 수행하는 무한 루프를 실행하여 작동합니다: 30 | 31 | 1. 작업 목록에서 첫 번째 작업을 가져옵니다. 32 | 2. 실행 에이전트로 작업을 전송하고, 실행 에이전트는 OpenAI의 API를 사용하여 컨텍스트에 따라 작업을 완료합니다. 33 | 3. 결과를 보강하여 Pinecone에 저장합니다. 34 | 4. 새 작업을 생성하고 목표와 이전 작업의 결과에 따라 작업 목록의 우선순위를 다시 지정합니다. 35 |
36 | execution_agent() 함수는 OpenAI API가 사용되는 곳입니다. 이 함수는 목표와 작업이라는 두 가지 매개 변수를 받습니다. 그런 다음 OpenAI의 API에 프롬프트를 전송하여 작업의 결과를 반환합니다. prompt는 AI 시스템의 작업, 목표 및 작업 자체에 대한 설명으로 구성됩니다. 그런 다음 결과는 문자열로 반환됩니다. 37 |
38 | task_creation_agent() 함수는 OpenAI의 API를 사용하여 목표와 이전 작업의 결과를 기반으로 새 작업을 생성하는 데 사용됩니다. 이 함수는 목표, 이전 작업의 결과, 작업 설명, 현재 작업 목록의 네 가지 매개 변수를 받습니다. 그런 다음 이 함수는 새 작업 목록을 문자열로 반환하는 OpenAI의 API에 프롬프트를 보냅니다. 그런 다음 이 함수는 새 작업을 사전 목록으로 반환하며, 각 사전에는 작업의 이름이 포함됩니다. 39 |
40 | prioritization_agent() 함수는 작업 목록의 우선순위를 재지정하기 위해 OpenAI의 API를 사용하는 곳입니다. 이 함수는 하나의 매개변수, 즉 현재 작업의 ID를 받습니다. 이 함수는 OpenAI의 API에 프롬프트를 전송하여 우선순위가 재지정된 작업 목록을 번호가 매겨진 목록으로 반환합니다. 41 |
42 | 마지막으로, 이 스크립트는 Pinecone을 사용하여 컨텍스트에 맞는 작업 결과를 저장하고 검색합니다. 이 스크립트는 YOUR_TABLE_NAME 변수에 지정된 테이블 이름을 기반으로 Pinecone 인덱스를 생성합니다. 그런 다음 Pinecone을 사용하여 작업 결과를 작업 이름 및 추가 메타데이터와 함께 인덱스에 저장합니다. 43 | 44 | # 사용 방법 45 | 스크립트를 사용하려면 다음 단계를 따라야 합니다: 46 | 47 | 1. `git clone https://github.com/yoheinakajima/babyagi.git`과 `cd`를 통해 리포지토리를 복제하고 복제된 리포지토리에 저장합니다. 48 | 2. 필요한 패키지를 설치합니다: `pip install -r requirements.txt` 49 | 3. .env.example 파일을 .env에 복사합니다: `cp .env.example .env`. 여기에서 다음 변수를 설정합니다. 50 | 4. OPENAI_API_KEY, OPENAPI_API_MODEL, PINECONE_API_KEY 변수에 OpenAI 및 Pinecone API 키를 설정합니다. 51 | 5. PINECONE_ENVIRONMENT 변수에서 Pinecone 환경을 설정합니다. 52 | 6. 작업 결과가 저장될 테이블의 이름을 TABLE_NAME 변수에 설정합니다. 53 | 7. (선택 사항) OBJECTIVE 변수에 작업 관리 시스템의 목적을 설정합니다. 54 | 8. (선택 사항) 시스템의 첫 번째 작업을 INITIAL_TASK 변수에 설정합니다. 55 | 9. 스크립트를 실행합니다. 56 | 57 | 위의 모든 옵션 값은 커맨드 라인에서도 지정할 수 있습니다. 58 | 59 | # 도커 컨테이너로 실행하기 60 | 61 | 전제 조건으로 도커와 도커-컴포즈가 설치되어 있어야 합니다. Docker 데스크톱이 가장 간단한 옵션입니다(https://www.docker.com/products/docker-desktop/). 62 | 63 | 도커 컨테이너로 시스템을 실행하려면 위의 단계에 따라 .env 파일을 설정한 다음 다음을 실행합니다: 64 | 65 | ``` 66 | docker-compose up 67 | ``` 68 | 69 | # 지원되는 모델 70 | 71 | 이 스크립트는 모든 OpenAI 모델과 Llama.cpp를 통한 Llama에서 작동합니다. 기본 모델은 **gpt-3.5-turbo**입니다. 다른 모델을 사용하려면 OPENAI_API_MODEL을 통해 지정하거나 커맨드 라인을 사용하세요. 72 | 73 | ## Llama 74 | 75 | 최신 버전의 [Llama.cpp](https://github.com/ggerganov/llama.cpp)를 다운로드하고 지침에 따라 제작하세요. 또한 Llama 모델 추가 필요합니다. 76 | 77 | - **어떠한 경우에도 이슈, 토론 또는 풀 리퀘스트를 포함하여 이 리포지토리의 어느 곳에서도 IPFS, 마그넷 링크 또는 모델 다운로드에 대한 기타 링크를 공유해서는 안 됩니다. 즉시 삭제됩니다.** 78 | 79 | 그 후 `llama/main`을 llama.cpp/main에 연결하고 `models`을 Llama 모델 가중치가 있는 폴더에 연결합니다. 그런 다음 `OPENAI_API_MODEL=llama` 또는 `-l` 인수를 사용하여 스크립트를 실행합니다. 80 | 81 | # 경고 82 | 이 스크립트는 작업 관리 시스템의 일부로서 계속적으로 실행되도록 디자인되었습니다. 이 스크립트를 계속 실행하면 API 사용량이 높아질 수 있으므로 책임감 있게 사용하시기 바랍니다. 또한 이 스크립트를 실행하려면 OpenAI 및 Pinecone API가 올바르게 설정되어 있어야 하므로 스크립트를 실행하기 전에 API를 설정했는지 확인하세요. 83 | 84 | # 기여 85 | 말할 필요도 없이, BabyAGI는 아직 초기 단계에 있으므로 아직 방향과 단계를 결정하고 있습니다. 현재 BabyAGI의 핵심 설계 목표는 이해하기 쉽고 구축하기 쉽도록 *단순하게* 만드는 것입니다. 이러한 단순성을 유지하기 위해 PR을 제출할 때 다음 가이드라인을 준수해 주시기 바랍니다: 86 | 87 | * 광범위한 리팩토링보다는 소규모의 모듈식 수정에 집중하세요. 88 | * 새로운 기능을 소개할 때는 구체적인 사용 사례에 대한 자세한 설명을 제공하세요. 89 | 90 | [@yoheinakajima](https://twitter.com/yoheinakajima)의 메모 (Apr 5, 2023): 91 | 92 | > PR이 점점 많아지고 있다는 것을 알고 있습니다. 저는 GitHub/오픈소스를 처음 접했고, 이번 주에는 그에 따라 시간 계획을 세우지 못했습니다. 기다리고 양해해 주셔서 감사합니다. 방향에 대해 말씀드리자면, 저는 단순하게 유지하는 것과 확장하는 것 사이에서 갈등을 겪어왔습니다. 현재는 BabyAGI의 코어를 단순하게 유지하고, 이를 플랫폼으로 삼아 이를 확장하기 위한 다양한 접근 방식을 지원하고 홍보하는 방향으로 기울고 있습니다(예: BabyAGIxLangchain이 하나의 방향입니다). 저는 탐구할 가치가 있는 다양한 의견 접근 방식이 있다고 생각하며, 이를 비교하고 토론할 수 있는 중심적인 장소를 갖는 것이 가치가 있다고 생각합니다. 곧 더 많은 업데이트가 있을 예정입니다. 93 | 94 | 저는 GitHub와 오픈소스를 처음 사용하므로 이 프로젝트를 제대로 관리하는 방법을 배우는 동안 조금만 기다려주세요. 저는 낮에는 벤처캐피털 회사를 운영하기 때문에 보통 아이들을 재운 후 밤에 PR과 이슈를 확인하고 있고, 매일 밤 확인하는 것은 아닐 수도 있습니다. 지원을 구하는 아이디어에 열려 있으며 곧 이 섹션을 업데이트할 예정입니다(기대, 비전 등). 많은 사람들과 이야기를 나누며 배우고 있으니 업데이트를 기대해주세요! 95 | 96 | # 영감을 받은 프로젝트 97 | 98 | 출시 이후 짧은 시간 동안 BabyAGI는 많은 프로젝트에 영감을 주었습니다. [여기](docs/inspired-projects.md)에서 모두 확인할 수 있습니다. 99 | 100 | # 배경 스토리 101 | BabyAGI는 트위터에 공유된 원본 [작업 기반 자율 에이전트](https://twitter.com/yoheinakajima/status/1640934493489070080?s=20)(2023년 3월 28일)의 축소 버전입니다. 이 버전은 140줄로 줄었습니다: 주석 13줄, 공백 22줄, 코드 105줄입니다. 이 리포지토리의 이름은 오리지널 자율 에이전트에 대한 반응에서 나온 것으로, 작성자가 이것이 AGI라는 것을 암시하려는 의도는 아닙니다. 102 | 103 | 벤처캐피털리스트인 [@yoheinakajima](https://twitter.com/yoheinakajima)가 애정을 담아 만들었습니다(여러분이 만들고 있는 것을 보고 싶습니다!). -------------------------------------------------------------------------------- /docs/README-si.md: -------------------------------------------------------------------------------- 1 |

2 | babyagi 3 | 4 |

5 | 6 | # Cilj 7 | 8 | Ta Python skripta je primer sistema za upravljanje opravil, ki ga poganja AI oz. umetna inteligenca (UI). Sistem uporablja OpenAI-jev API in Pinecone za ustvarjanje in določanje prioritet ter izvajanje nalog. Glavna ideja tega sistema je, da ustvarja naloge na podlagi rezultatov prejšnjih nalog in vnaprej določenega cilja. Skripta nato uporabi obdelavo naravnega jezika (NLP) ponudnika OpenAI za ustvarjanje novih nalog na podlagi cilja ter Pinecone za shranjevanje in pridobivanje rezultatov nalog za kontekst. To je poenostavljena različica izvirnega [avtonomnega agenta, ki temelji na opravilih](https://twitter.com/yoheinakajima/status/1640934493489070080?s=20) (28. marec 2023). 9 | 10 | Ta README zajema naslednje: 11 | 12 | - [Kako deluje skripta](#how-it-works) 13 | 14 | - [Kako uporabljati skripto](#how-to-use) 15 | 16 | - [Podprti modeli](#supported-models) 17 | 18 | – [Opozorilo o neprekinjenem izvajanju skripte](#continous-script-warning) 19 | 20 | # Kako deluje 21 | 22 | Skripta deluje tako, da izvaja neskončno zanko, ki izvaja naslednje korake: 23 | 24 | 1. Izvleče prvo opravilo s seznama opravil. 25 | 2. Pošlje nalogo izvršilnemu posredniku (agentu), ki uporablja API OpenAI za dokončanje naloge glede na kontekst. 26 | 3. Obogati rezultat in ga shrani v Pinecone. 27 | 4. Ustvari nove naloge in ponovno določi prednost seznama nalog glede na cilj in rezultat prejšnje naloge. 28 | V funkciji execution_agent() se uporablja OpenAI API. Zajema dva parametra: cilj in nalogo. Nato pošlje poziv API-ju OpenAI, ki vrne rezultat naloge. Poziv je sestavljen iz opisa naloge sistema AI, cilja in same naloge. Rezultat je nato vrnjen kot niz. 29 | 30 | Funkcija task_creation_agent() je mesto, kjer se API OpenAI uporablja za ustvarjanje novih nalog na podlagi cilja in rezultata prejšnje naloge. Funkcija ima štiri parametre: cilj, rezultat prejšnje naloge, opis naloge in trenutni seznam nalog. Nato pošlje poziv API-ju OpenAI, ki vrne seznam novih nalog kot nize. Funkcija nato vrne nova opravila kot seznam slovarjev, kjer vsak slovar vsebuje ime opravila. 31 | 32 | Funkcija prioritization_agent() je mesto, kjer se API OpenAI uporablja za ponovno določanje prioritet seznama opravil. Funkcija sprejme en parameter, ID trenutne naloge. Pošlje poziv API-ju OpenAI, ki vrne ponovno prednostni seznam opravil kot oštevilčen seznam. 33 | 34 | Skripta uporablja Pinecone za shranjevanje in pridobivanje rezultatov nalog za kontekst. Skripta ustvari Pinecone indeks na podlagi imena tabele, določenega v spremenljivki YOUR_TABLE_NAME. Pinecone se nato uporabi za shranjevanje rezultatov opravila v indeksu, skupaj z imenom opravila in vsemi dodatnimi metapodatki. 35 | 36 | # Navodila za uporabo 37 | 38 | Za uporabo skripte sledite naslednjim korakom: 39 | 40 | 1. Klonirajte repozitorij prek `git clone https://github.com/yoheinakajima/babyagi.git` in `cd` v klonirano repozitorij. 41 | 2. Namestite zahtevane pakete: `pip install -r requirements.txt` 42 | 3. Kopirajte datoteko .env.example v .env: `cp .env.example .env`. Tukaj nastavite naslednje spremenljivke. 43 | 4. Nastavite API ključe za OpenAI in Pinecone v spremenljivkah OPENAI_API_KEY, OPENAPI_API_MODEL in PINECONE_API_KEY. 44 | 5. Nastavite okolje Pinecone v spremenljivki PINECONE_ENVIRONMENT. 45 | 6. V spremenljivki TABLE_NAME nastavite ime tabele, v katero bodo shranjeni rezultati naloge. 46 | 7. (Izbirno) Nastavite cilj sistema za upravljanje opravil v spremenljivki OBJECTIVE. 47 | 8. (Izbirno) Nastavite prvo nalogo sistema v spremenljivki INITIAL_TASK. 48 | 9. Zaženite skripto. 49 | 50 | Vse izbirne vrednosti zgoraj lahko podate tudi v ukazni vrstici. 51 | 52 | # Podprti modeli 53 | 54 | Skripta deluje z vsemi modeli OpenAI, pa tudi z Llamo prek Llama.cpp. Privzeti model je **gpt-3.5-turbo**. Če želite uporabiti drug model, ga določite prek OPENAI_API_MODEL ali uporabite ukazno vrstico (CLI). 55 | 56 | ## Llama 57 | 58 | Prenesite najnovejšo različico [Llama.cpp](https://github.com/ggerganov/llama.cpp) in sledite navodilom za namestitev. Potrebovali boste tudi uteži za model Llama. 59 | 60 | - **Pod nobenim pogojem ne delite IPFS, magnetnih povezav ali kakršnih koli drugih povezav do prenosov modelov kjer koli v tem repozitoriju, vključno z vprašanji, razpravami ali pull requesti. Objave bodo nemudoma izbrisane.** 61 | 62 | Po tem povežite `llama/main` na llama.cpp/main in `models` v mapo, kjer imate uteži modela Llama. Nato zaženite skripto z argumentom `OPENAI_API_MODEL=llama` ali `-l`. 63 | 64 | # Opozorilo 65 | 66 | Skripta je zasnovana tako, da se neprekinjeno izvaja kot del sistema za upravljanje opravil. Neprekinjeno izvajanje tega skripta lahko povzroči visoko uporabo API-ja, zato ga uporabljajte odgovorno. Poleg tega skripta zahteva, da sta API-ja OpenAI in Pinecone pravilno nastavljena, zato se prepričajte, da ste nastavili API-je preden zaženete skripto. 67 | 68 | # Prispevanje 69 | 70 | BabyAGI je še vedno v povojih, zato še vedno določamo njegovo smer in korake. Trenutno je ključni cilj oblikovanja za BabyAGI biti _preprost_, tako da ga je enostavno razumeti in graditi na njem. Da bi ohranili to preprostost, vas vljudno prosimo, da pri oddaji PR-jev upoštevate naslednje smernice: 71 | 72 | - Osredotočite se na majhne, modularne spremembe namesto na obsežno preoblikovanje. 73 | - Ko uvajate nove funkcije, navedite podroben opis specifičnega primera uporabe, ki ga obravnavate. 74 | 75 | Zapis od @yoheinakajima (5. april 2023): 76 | 77 | > I know there are a growing number of PRs, appreciate your patience - as I am both new to GitHub/OpenSource, and did not plan my time availability accordingly this week. Re:direction, I've been torn on keeping it simple vs expanding - currently leaning towards keeping a core Baby AGI simple, and using this as a platform to support and promote different approaches to expanding this (eg. BabyAGIxLangchain as one direction). I believe there are various opinionated approaches that are worth exploring, and I see value in having a central place to compare and discuss. More updates coming shortly. 78 | 79 | Sem (@yoheinkajima) nov uporabnik GitHub-a in odprtokodnih programov ter okolja, zato bodite potrpežljivi, da se naučim pravilno upravljati ta projekt. Podnevi vodim podjetje za tvegani kapital, zato bom ponoči, potem ko spravim svoje otroke, na splošno preverjal PR-je in težave – kar morda ne bo vsako noč. Odprt sem za idejo o zagotavljanju podpore, kmalu bom posodobil ta razdelek (pričakovanja, vizije itd.). Pogovarjam se z veliko ljudmi in se še učim – počakajte na novosti! 80 | 81 | # Backstory 82 | 83 | BabyAGI je poenostavljena različica izvirnega [avtonomnega agenta, ki temelji na opravilih](https://twitter.com/yoheinakajima/status/1640934493489070080?s=20) (28. marec 2023), ki je bil predstavljen na Twitterju. Ta različica ima 140 vrstic: 13 komentarjev, 22 presledkov in 105 kode. Ime repozitorija se je pojavilo kot odziv na prvotnega avtonomnega agenta - avtor ne želi namigovati, da je to AGI (splošna umetna inteligenca). 84 | 85 | Z ljubeznijo naredil [@yoheinakajima](https://twitter.com/yoheinakajima), ki je po naključju VC (rad bi videl, kaj gradite!) 86 | -------------------------------------------------------------------------------- /docs/README-ua.md: -------------------------------------------------------------------------------- 1 |

2 | babyagi 3 | 4 |

5 | 6 | 7 | # Мета 8 | Цей Python-скрипт є прикладом системи управління задачами на основі штучного інтелекту. Система використовує API OpenAI та Pinecone для створення, пріоритезації та виконання задач. Основна ідея цієї системи полягає в тому, що вона створює задачі на основі результату попередніх задач та попередньо визначеної мети. Після цього скрипт використовує можливості обробки природньої мови (NLP) OpenAI для створення нових задач на основі мети та Pinecone для збереження та отримання результатів задач для контексту. Це спрощена версія оригінального [Task-Driven Autonomous Agent](https://twitter.com/yoheinakajima/status/1640934493489070080?s=20) (28 березня 2023 року). 9 | 10 | This README will cover the following: 11 | 12 | * [Як працює скрипт](#how-it-works) 13 | 14 | * [Як використовувати скрипт](#how-to-use) 15 | 16 | * [Підтримувані моделі](#supported-models) 17 | 18 | * [Попередження про постійну роботу скрипту](#continous-script-warning) 19 | # Як це працює 20 | Скрипт працює за допомогою безкінечного циклу, який виконує наступні кроки: 21 | 22 | 1. Витягує першу задачу зі списку задач. 23 | 2. Надсилає задачу до виконавчого агента, який використовує API OpenAI для виконання задачі на основі контексту. 24 | 3. Збагачує результат та зберігає його в Pinecone. 25 | 4. Створює нові задачі та змінює пріоритети списку задач на основі мети та результату попередньої задачі. 26 | Функція execution_agent() є місцем, де використовується API OpenAI. Вона приймає два параметри: мету та задачу. Далі вона відправляє запит до API OpenAI, який повертає результат задачі. Запит складається з опису задачі системи штучного інтелекту, мети та самої задачі. Результат повертається у вигляді строки(string). 27 | 28 | Функція task_creation_agent() - це місце, де використовується API OpenAI для створення нових завдань на основі цілей та результатів попереднього завдання. Функція приймає чотири параметри: мету, результат попереднього завдання, опис завдання та поточний список завдань. Після цього вона надсилає запит до API OpenAI, який повертає список нових завдань у вигляді строк(strings). Функція повертає нові завдання у вигляді списку словників(dictionary), де кожен словник містить назву завдання. 29 | 30 | Функція prioritization_agent() - це місце, де використовується API OpenAI для перепріоритизації списку завдань. Функція приймає один параметр - ID поточного завдання. Вона надсилає запит до API OpenAI, який повертає перепріоритизований список завдань у вигляді нумерованого списку. 31 | 32 | Наостанку, скрипт використовує Pinecone для зберігання та отримання результатів завдань для контексту. Скрипт створює індекс Pinecone на основі імені таблиці, яке вказано у змінній YOUR_TABLE_NAME. Pinecone використовується для зберігання результатів завдання в індексі, разом з назвою завдання та будь-якою додатковою метаданою. 33 | 34 | # Як використовувати скрипт 35 | Для використання скрипту вам потрібно виконати наступні кроки: 36 | 37 | 1. Зклонуйте репозиторій через `git clone https://github.com/yoheinakajima/babyagi.git` та перейдіть до клонованого репозиторію за допомогою команди `cd`. 38 | 2. Встановіть необхідні пакети: `pip install -r requirements.txt` 39 | 3. Скопіюйте файл .env.example в .env: `cp .env.example .env`. Тут треба встановити наступні змінні. 40 | 4. Встановіть свої ключі OpenAI та Pinecone API в змінні OPENAI_API_KEY, OPENAPI_API_MODEL та PINECONE_API_KEY. 41 | 5. Встановіть середовище Pinecone у змінну PINECONE_ENVIRONMENT. 42 | 6. Встановіть ім'я таблиці, де будуть зберігатись результати задач, у змінну TABLE_NAME. 43 | 7. (Опціонально) Встановіть мету системи управління завданнями в змінну OBJECTIVE. 44 | 8. (Опціонально) Встановіть перше завдання системи у змінну INITIAL_TASK. 45 | 9. Запустіть скрипт. 46 | 47 | Всі необов'язкові значення вище також можна вказати через командний рядок. 48 | 49 | # Підтримувані моделі 50 | 51 | Цей скрипт працює з усіма моделями OpenAI, а також Llama через Llama.cpp. Модель за замовчуванням - **gpt-3.5-turbo**. Щоб використовувати іншу модель, вкажіть її через OPENAI_API_MODEL або використайте командний рядок. 52 | 53 | 54 | ## Llama 55 | 56 | Завантажте останню версію [Llama.cpp](https://github.com/ggerganov/llama.cpp) та дотримуйтеся інструкцій для його компіляції. Вам також знадобляться вагові коефіцієнти моделі Llama. 57 | 58 | - **Ні за яких обставин не діліться IPFS, magnet-посиланнями або будь-якими іншими посиланнями на завантаження моделі ніде в цьому репозиторії, включаючи issues, discussions або pull requests. Вони будуть негайно видалені.** 59 | 60 | Після цього прив'яжіть `llama/main` до `llama.cpp/main` та `models` до папки, де ви маєте вагові коефіцієнти моделі Llama. Потім запустіть скрипт з аргументом `OPENAI_API_MODEL=llama` або `-l`. 61 | 62 | # Попередження 63 | Цей скрипт призначений для постійної роботи в рамках системи управління завданнями. Постійний запуск цього скрипту може призвести до високого використання API, тому використовуйте його з обережністю. Крім того, для правильної роботи скрипту необхідно налаштувати API OpenAI та Pinecone, тому переконайтеся, що ви налаштували API перед запуском скрипту. 64 | 65 | # Контрибуція 66 | Звичайно, BabyAGI ще на початковому етапі, тому ми все ще визначаємо його напрямок та кроки для досягнення цілей. На даний момент ключовою ціллю дизайну BabyAGI є те, щоб він був *простим*, щоб його було легко зрозуміти та розширювати. Щоб зберегти цю простоту, ми люб'язно просимо дотримуватися наступних принципів надсилаючи PR: 67 | * Фокусуйтеся на невеликих, модульних змінах, а не на обширних рефакторингах. 68 | * При введенні нових функцій(features) надавайте детальний опис конкретного випадку використання(use case), який ви розглядаєте. 69 | 70 | Примітка від @yoheinakajima (5 квітня 2023 року): 71 | 72 | > Я знаю, що кількість запитів на злиття зростає, і дякую вам за терпіння - я ще новачок у GitHub/OpenSource, і не вдалося правильно розпланувати свій час на цей тиждень. Щодо напрямку, я роздираюся між збереженням простоти та розширенням - на даний момент нахил полягає на збереженні основної простої Baby AGI та використанні її як платформи для підтримки та просування різних підходів до розширення (наприклад, BabyAGIxLangchain як один з напрямків). Я вважаю, що є різні підходи, які варто досліджувати, і бачу цінність в тому, щоб мати центральне місце для порівняння та обговорення. Незабаром очікуються більш докладні оновлення. 73 | 74 | Я новачок на GitHub і у відкритому програмному забезпеченні, тому будь ласка, будьте терплячими, поки я вивчу правильне управління цим проектом. Я працюю в венчурній фірмі вдень, тому, як правило, перевірятиму PR та проблеми ввечері після того, як я вкладу спати своїх дітей - що може не бути кожної ночі. Готовий до ідеї залучення підтримки, скоро оновлю цей розділ (очікування, бачення і т.д.). Говорю з багатьма людьми та навчаюся - чекайте оновлень! 75 | 76 | # Передісторія 77 | BabyAGI - це спрощена версія оригінального [Task-Driven Autonomous Agent](https://twitter.com/yoheinakajima/status/1640934493489070080?s=20) (28 березня 2023 року) опублікованого на Twitter. Ця версія містить 140 рядків: 13 коментарів, 22 порожніх та 105 коду. Назва репозиторію виникла в реакції на оригінальний автономний агент - автор не має на меті натякати на AGI. 78 | 79 | Створено з любов'ю [@yoheinakajima](https://twitter.com/yoheinakajima), який виявилось є VC (було б цікаво побачити, що ви будуєте!) 80 | -------------------------------------------------------------------------------- /docs/README-ru.md: -------------------------------------------------------------------------------- 1 |

2 | babyagi 3 | 4 |

5 | 6 | # Задача 7 | Этот Python-скрипт является примером системы управления задачами на основе искусственного интеллекта. Система использует API OpenAI и Pinecone для создания, определения приоритетов и выполнения задач. Основная идея этой системы заключается в том, что она создает задачи на основе результатов предыдущих задач и заранее определенной цели. Затем скрипт использует возможности обработки естественного языка (NLP) OpenAI для создания новых задач на основе цели, а Pinecone - для хранения и извлечения результатов задач в контексте. Это урезанная версия оригинального [Task-Driven Autonomous Agent](https://twitter.com/yoheinakajima/status/1640934493489070080?s=20) (Mar 28, 2023). 8 | 9 | В этом README будет описано следующее: 10 | 11 | * [Как работает скрипт](#как-это-работает) 12 | 13 | * [Как использовать скрипт](#как-этим-пользоваться) 14 | 15 | * [Поддерживаемые Модели](#поддерживаемые-модели) 16 | 17 | * [Предупреждение о непрерывном запуске скрипта](#предупреждение-о-запуске-скрипта) 18 | # Как это работает 19 | Скрипт работает путем запуска бесконечного цикла, который выполняет следующие действия: 20 | 21 | 1. Вытаскивает первую задачу из списка задач. 22 | 2. Отправляет задачу агенту выполнения, который использует API OpenAI для выполнения задачи на основе контекста. 23 | 3. Обогащает результат и сохраняет его в Pinecone. 24 | 4. Создает новые задачи и изменяет приоритеты в списке задач на основе цели и результата предыдущей задачи. 25 | 26 | Функция execution_agent() является тем местом, где используется API OpenAI. Она принимает два параметра: цель и задачу. Затем она посылает подсказку API OpenAI, который возвращает результат выполнения задачи. Подсказка состоит из описания задачи системы искусственного интеллекта, цели и самой задачи. Результат возвращается в виде строки. 27 | 28 | Функция task_creation_agent() - это функция, в которой API OpenAI используется для создания новых задач на основе цели и результата предыдущей задачи. Функция принимает четыре параметра: цель, результат предыдущей задачи, описание задачи и текущий список задач. Затем она отправляет запрос в API OpenAI, который возвращает список новых задач в виде строк. Затем функция возвращает новые задачи в виде списка словарей, где каждый словарь содержит название задачи. 29 | 30 | Функция prioritization_agent() - это функция, в которой API OpenAI используется для изменения приоритетов списка задач. Функция принимает один параметр - идентификатор текущей задачи. Она отправляет запрос в API OpenAI, который возвращает список задач с измененными приоритетами в виде нумерованного списка. 31 | 32 | Наконец, скрипт использует Pinecone для хранения и извлечения результатов задач в контексте. Скрипт создает индекс Pinecone на основе имени таблицы, указанной в переменной YOUR_TABLE_NAME. Затем Pinecone используется для хранения результатов задачи в индексе, вместе с именем задачи и любыми дополнительными метаданными. 33 | 34 | # Как этим пользоваться 35 | Чтобы воспользоваться скриптом, необходимо выполнить следующие шаги: 36 | 37 | 1. Клонируйте репозиторий с помощью `git clone https://github.com/yoheinakajima/babyagi.git` и `cd` в клонированный репозиторий. 38 | 2. Установите необходимые пакеты: `pip install -r requirements.txt`. 39 | 3. Скопируйте файл .env.example в .env: `cp .env.example .env`. Здесь вы установите следующие переменные. 40 | 4. Задайте ключи API OpenAI и Pinecone в переменных OPENAI_API_KEY, OPENAPI_API_MODEL и PINECONE_API_KEY. 41 | 5. Установите окружение Pinecone в переменной PINECONE_ENVIRONMENT. 42 | 6. Задайте имя таблицы, в которой будут храниться результаты задачи, в переменной TABLE_NAME. 43 | 7. (Необязательно) Задайте цель системы управления задачами в переменной OBJECTIVE. 44 | 8. (Необязательно) Задайте первую задачу системы в переменной INITIAL_TASK. 45 | 9. Запустите скрипт. 46 | 47 | Все необязательные значения, указанные выше, могут быть также заданы в командной строке. 48 | 49 | # Поддерживаемые Модели 50 | 51 | Этот скрипт работает со всеми моделями OpenAI, а также с Llama через Llama.cpp. Модель по умолчанию - **gpt-3.5-turbo**. Чтобы использовать другую модель, укажите ее через OPENAI_API_MODEL или используйте командную строку. 52 | 53 | ## Llama 54 | 55 | Скачайте последнюю версию [Llama.cpp](https://github.com/ggerganov/llama.cpp) и следуйте инструкциям для ее создания. Вам также понадобятся модельные грузы (model weights) Llama. 56 | - **Ни при каких обстоятельствах не делитесь IPFS, magnet-ссылками или любыми другими ссылками на загрузку моделей в этом репозитории, в том числе в вопросах, обсуждениях или запросах. Они будут немедленно удалены.** 57 | 58 | После этого соедините `llama/main` с llama.cpp/main и `models` с папкой, где у вас лежат веса моделей Llama. Затем запустите скрипт с аргументом `OPENAI_API_MODEL=llama` или `-l`. 59 | 60 | # Предупреждение 61 | Этот скрипт предназначен для непрерывного выполнения в рамках системы управления задачами. Постоянный запуск этого скрипта может привести к высокому использованию API поэтому, пожалуйста, используйте его ответственно. Кроме того, скрипт требует правильной настройки API OpenAI и Pinecone, поэтому убедитесь, что вы настроили API перед запуском скрипта. 62 | 63 | # Вклад в развитие проекта 64 | 65 | BabyAGI все еще находится в зачаточном состоянии, поэтому мы определяем его направление и шаги развития. В настоящее время основная цель дизайна BabyAGI - быть *простым*, чтобы его было легко понять и развивать. Чтобы сохранить эту простоту, мы просим вас придерживаться следующих правил при подаче PR: 66 | * Сосредоточьтесь на небольших модульных модификациях, а не на обширном рефакторинге. 67 | * При введении новых функций предоставляйте подробное описание конкретного случая использования, который вы рассматриваете. 68 | 69 | Заметка от @yoheinakajima (Apr 5th, 2023): 70 | 71 | > Я знаю, что количество PR растет, ценю ваше терпение - поскольку я новичок на GitHub/OpenSource и не планировал свое время на этой неделе. Что касается направления, я размышлял о сохранении простоты и расширении - сейчас я склоняюсь к сохранению простоты ядра Baby AGI и использованию его в качестве платформы для поддержки и продвижения различных подходов к его расширению (например, BabyAGIxLangchain как одно из направлений). Я считаю, что существуют различные подходы, которые стоит изучить, и я вижу ценность в наличии центрального места для сравнения и обсуждения. Больше обновлений будет в ближайшее время. 72 | 73 | Я новичок в GitHub и Open Source поэтому, пожалуйста, будьте терпеливы, пока я учусь правильно управлять этим проектом. Днем я работаю в венчурной фирме, так что обычно я буду проверять PR и проблемы по ночам, после того как уложу своих детей - что может происходить не каждый вечер. Открыт для идеи привлечения поддержки, скоро обновлю этот раздел (ожидания, видение проекта и т.д.). Общаюсь со многими людьми и учусь - следите за обновлениями! 74 | 75 | # Предистория 76 | BabyAGI - это сокращенная версия оригинального [Task-Driven Autonomous Agent](https://twitter.com/yoheinakajima/status/1640934493489070080?s=20) (Mar 28, 2023), опубликованного в Twitter. Эта версия сократилась до 140 строк: 13 комментариев, 22 пробела и 105 кода. Название репозитория появилось в реакции на оригинальный автономный агент - автор не хочет сказать, что это AGI. 77 | 78 | Сделано с любовью [@yoheinakajima](https://twitter.com/yoheinakajima), который, как оказалось, является VC (хотел бы посмотреть, что вы создаете!). -------------------------------------------------------------------------------- /docs/README-ar.md: -------------------------------------------------------------------------------- 1 | 6 | 7 |

8 | BabyAGI 9 |

10 |
(ذكاء عام اصطناعي صغير)
11 | 12 | # الهدف 13 | 14 | هذا البرنامج يعتبر مثال تطبيقي لنظام إدارة مهام يعمل بواسطة الذكاء الاصطناعي. يستخدم النظام OpenAI و Chroma DB لإنشاء وترتيب المهام حسب الأولوية و ثم تنفيذها. الفكرة الرئيسية هي إنشاء مهام Tasks جديدة بناءً على هدف محدد مسبقاً بمساعدة الذكاء الاصطناعي -تحديداً، قدرات المعالجة اللغوية التي تقدمها النماذج التوليدية المدربة مسبقاً GPTs- من OpanAI وتخزين هذه المهام و نتائجها في قاعدة بيانات Chroma لاسترجاعها لاحقاً حسب السياق. هذه نسخة مختصرة من المقترح الأصلي [Task-Driven Autonomous Agent](https://twitter.com/yoheinakajima/status/1640934493489070080?s=20) (Mar 28, 2023). 15 | 16 | هذا الملف (README) سوف يغطي: 17 | 18 | - [كيف يعمل البرنامج](#how-it-works) 19 | 20 | - [كيف تستخدم البرنامج](#how-to-use) 21 | 22 | - [النماذج المدعومة](#supported-models) 23 | 24 | - [تحذير بشأن تشغيل البرنامج بشكل مستمر](#continous-script-warning) 25 | 26 | # كيف يعمل 27 | 28 | يعمل البرنامج عبر تشغيل دورة لا نهائية loop تقوم بالخطوات التالية: 29 | 1. جلب المهمة الأولى من قائمة المهام. 30 | 2. إرسال المهمة إلى "وكيل تنفيذ" والذي يستخدم API لـ OpenAI لإكمال المهمة بناءً على السياق. 31 | 3. تحسين النتيجة وتخزينها في [Chroma](docs.trychroma.com). 32 | 4. إنشاء مهام جديدة وإعادة ترتيب قائمة المهام بناءً على الهدف ونتيجة المهمة السابقة. 33 |
34 | 35 | > يتم استخدام "وكيل Agent" للتعبير عن الوظيفة Function التي يقوم بها البرنامج بناءً على الهدف. 36 | 37 | ![fig 1](baby-agi-fig-ar.png) 38 | 39 | وظيفة تنفيذ مهمة `execution_agent()` ، تأخذ (هدف محدد، مهمة محددة): هنا يتم إرسال Prompt تحتوي على وصف وظيفة التنفيذ كتعليمات، والهدف الذي تم تحديده والمهمة التي تم إنشائها كسياق لطلب توليدي إلى OpenAI API حيث يقوم بتوليد نتيجة تنفيذ المهمة نصياً. 40 | 41 |
42 | 43 | وظيفة إنشاء مهمة `task_creation_agent()` ، تأخذ (هدف محدد، نتيجة المهمة السابقة، وصف المهمة، قائمة المهام الحالية): هنا يتم إرسال Prompt تحتوي على وصف وظيفة إنشاء المهام كتعليمات، وباقي المتغيرات كسياق لطلب توليدي إلى OpenAI API حيث يقوم بتوليد قائمة مهام على شكل نص. 44 | 45 |
46 | 47 | وظيفة ترتيب المهام حسب الأولية `prioritization_agent()` ، تأخذ (معرّف المهمة الحالية): هنا يتم إرسال Prompt تحتوي على وصف وظيفة ترتيب المهام كتعليمات، وقائمة المهام و المهمة الحالية كسياق لطلب توليدي إلى Open AI API حيث يقوم بتوليد قائمة مهام جديدة -معاد ترتيبها- على شكل نص. 48 | 49 |
50 | 51 | أخيراً، يستخدم التطبيق قاعدة بيانات Chroma لتخزين قوائم المهام، ونتائج المهام المكتملة وبيانات إضافية Metadata لاستخدامها لاحقاً كسياق. التخزين يتم بمجموعة (جدول) يتم إنشاؤه بناءً على الاسم الذي تم تحديده عبر المتغير `TABLE_NAME` 52 | 53 | 54 | # طريقة الإستخدام 55 | 56 | لاستخدام البرنامج، ستحتاج إلى إتباع هذه الخطوات: 57 | 58 | 1. استنسخ المستودع عن طريق الأمر `git clone https://github.com/yoheinakajima/babyagi.git` وانتقل إلى المجلد الجديد باستخدام الأمر `cd` 59 | 2. قم بتثبيت الحزم المطلوبة: ` pip install -r requirements.txt` (يفضل استخدام بيئة Python افتراضية) 60 | 3. قم بنسخ ملف `.env.example` إلى `.env` حيث يجب تعديل عدة متغيرات: 61 | - قم بتعيين مفتاح API OpenAI الخاص بك في المتغير ` OPENAI_API_KEY` والنموذج عبر المتغير ` OPENAPI_API_MODEL` 62 | - قم بتعيين اسم الجدول الذي سيتم تخزين نتائج المهام فيه في المتغير ` TABLE_NAME` 63 | - (اختياري) قم بتعيين اسم BabyAGI في المتغير ` BABY_NAME` 64 | - (اختياري) قم بتعيين هدف نظام إدارة المهام في المتغير ` OBJECTIVE` 65 | - (اختياري) قم بتعيين أول مهمة للنظام في المتغير ` INITIAL_TASK` 66 | 4. قم بتشغيل البرنامج باستخدام الأمر `python babyagi.py` 67 | كل القيم الاختيارية يمكن ايضاً تمريرها عبر أمر تشغيل البرنامج. 68 | 69 | 70 | # التشغيل عبر Docker 71 | 72 | ستحتاج إلى تثبيت Docker و Docker Compose. 73 | Docker Desktop هو الخيار الأسهل https://www.docker.com/products/docker-desktop 74 | 75 | لتشغيل النظام داخل حاوية Docker ، قم بتعيين ملف .env الخاص بك وفقًا لخطوات أعلاه ثم قم بتشغيل الأمر التالي: 76 | 77 | ``` 78 | docker-compose up 79 | ``` 80 | 81 | # النماذج المدعومة 82 | 83 | هذا البرنامج يدعم جميع النماذج المتوفرة عبر OpenAI API وايضاً نماذج Llama عبر Llama.cpp. النموذج الافتراضي هو **gpt-3.5-turbo**. لتغيير النموذج، قم بتغيير قيمة المتغير `LLM_MODEL` او عبر واجهة الأوامر. 84 | 85 | 86 | ## Llama 87 | 88 | لاستخدام نموذج Llama، ستحتاج إلى تثبيت الحزمة llama-cpp. ستحتاج أيضاً إلى أوزان النموذج. 89 | 90 | - **لا تقم بمشاركة أي روابط IPFS أو تورينت أو أي روابط أخرى لتحميل النماذج في أي مكان في هذا المستودع، بما في ذلك في المشاكل والنقاشات أو طلبات المساهمة PRs. سيتم حذفها على الفور.** 91 | 92 | اذا كنت تملك المتطلبات لتشغيل Llama.cpp قم بتغيير قيمة المتغير `LLAMA_MODEL_PATH` لموقع النموذج المراد استخدامه. للسهولة، يمكنك ربط مجلد `models` في مستودع BabyAGI بالمجلد الذي يحتوي على أوزان النموذج. ثم قم بتشغيل البرنامج مع تحديد قيمة المتغير `LLM_MODEL=llama` أو عبر متغير `-l` في واجهة الأوامر. 93 | 94 | # تحذير 95 | 96 | هذا البرنامج مصمم ليعمل بشكل مستمر كجزء من نظام إدارة المهام. يمكن أن يؤدي تشغيل هذا البرنامج بشكل مستمر إلى استهلاك عالي من واجهة برمجة التطبيقات (API) من OpenAI، لذا يرجى استخدامه بحذر. بالإضافة إلى ذلك، يتطلب البرنامج أن يتم إعداد واجهات برمجة التطبيقات APIs لكلٍ من OpenAI و Chroma بشكل صحيح، لذا يرجى التأكد من الإعدادات قبل تشغيل البرنامج. 97 | 98 | 99 | # المساهمة 100 | 101 | 102 | لا يوجد شك في أن BabyAGI لا يزال في مرحلة الطفولة وبالتالي نحن لا نزال نحدد اتجاهه والخطوات اللازمة للوصول إليه. حاليًا، الهدف التصميمي الرئيسي لـ BabyAGI هو أن يكون _بسيطًا_ بحيث يكون من السهل فهمه والبناء عليه. للحفاظ على هذه البساطة، نطلب بلطف منك الالتزام بالإرشادات التالية عند تقديم الـ PRs: 103 | 104 | - ركّز على التعديلات الصغيرة و المتفرقة بدلاً من إعادة التصميم الشاملة. 105 | - عند إدخال ميزات جديدة، يرجى تقديم وصفًا مفصلاً لحالة الاستخدام المحددة التي تعمل عليها. 106 | 107 | ملاحظة من @yoheinakajima (5 أبريل 2023): 108 | > أنا أعرف أن هناك عدد كبير من الـPRs، وأقدر صبركم -كما أنني جديد في البرمجيات مفتوحة المصدر وGitHub، ولم أقم بتخطيط وقت توفري بشكل مناسب هذا الأسبوع. إعادة توجيه: كنت مشتتا بين البساطة والتوسع- أنا أميل حاليًا إلى الحفاظ على BabyAGI الأساسي ببساطة، و استخدامه كمنصة لدعم وتعزيز مختلف الطرق للتوسع في هذا الصدد (على سبيل المثال BabyAGIxLangchain كاتجاه واحد) اعتقد أن هناك عدة طرق مثيرة التي تستحق الاستكشاف، وأرى قيمة في وجود مكان مركزي للمقارنة والنقاش. المزيد من التحديثات قادمة قريبًا. 109 | 110 | 111 | أنا جديد في GitHub والبرمجيات مفتوحة المصدر، لذلك يرجى التحلي بالصبر أثناء تعلمي لإدارة هذا المشروع بشكل صحيح. أنا أدير شركة استثمار مالي VC بالنهار، لذلك سأقوم بمراجعة طلبات المساهمة والمشاكل في الليل بعد أن أقوم بوضع أولادي في السرير - مما قد لا يكون كل ليلة. مفتوح لفكرة دعم إضافي، وسأكون تحديث هذا القسم قريبًا (التوقعات، الأفكار، الخ). أقوم بالتحدث إلى الكثير من الناس والتعلم - انتظروا التحديثات! 112 | 113 | # مشاريع مستوحاة من BabyAGI 114 | 115 | منذ صدوره، أثار BabyAGI اهتماما كبيرًا. يمكنك مشاهدة جميع المشاريع المستوحاة من BabyAGI [هنا](docs/inspired-projects.md). 116 | 117 | # قصة BabyAGI 118 | 119 | BabyAGI هو برنامج مبسط من الفكرة الرئيسية التي تم تقديمها في [Task-Driven Autonomous Agent](https://twitter.com/yoheinakajima/status/1640934493489070080?s=20) (28 مارس 2023). هذه النسخة البسيطة تتكون من 140 سطرًا: 13 تعليقات، 22 خطًا فارغًا = 105 سطرًا من التعليمات البرمجية. 120 | 121 | الاسم تم اقتراحه من قبل الناس ضمن الردود على التغريدة الأصلية، والمؤلف لا يدّعي ان هذا ذكاء عام اصطناعي. 122 | 123 | 124 | صُنع بحب من قبل [@yoheinakajima](https://twitter.com/yoheinakajima)، أعمل كمستثمر VC و سأحب سماع ما تقوم ببناؤه! 125 | 126 | -------------------------------------------------------------------------------- /docs/README-tr.md: -------------------------------------------------------------------------------- 1 |

2 | babyagi 3 | 4 |

5 | 6 | # Diğer README çevirileri: 7 | [Rusça](docs/README-ru.md) 8 | [İngilizce](README.md) 9 | 10 | # Kullanım 11 | Bu Python scripti, LLM tabanlı task üretim ve yönetme sistemi odaklı bir çalışmadır. Sistem, istenen konu hakkında taskları oluşturmak, önceliklendirmek ve sorgulamak için OpenAI ve Pinecone API'lerini kullanır. Bu sistemin arkasındaki temel fikir, önceki görevlerin sonuçlarına ve önceden tanımlanmış bir hedefe dayalı görevler oluşturmasıdır. Komut dosyası daha sonra hedefe dayalı yeni görevler oluşturmak için OpenAI'nin doğal dil işleme (NLP) yeteneklerini ve bağlam için görev sonuçlarını depolamak ve almak için Pinecone'u kullanır. Bu çalışma, [BabyAGI-twitter.com](https://twitter.com/yoheinakajima/status/1640934493489070080?s=20) (28 Mart 2023) paylaşımının basit bir kopyasıdır. 12 | 13 | Bu README aşağıdakileri kapsayacaktır: 14 | 15 | * [Nasıl çalışır](#nasil-calisir) 16 | 17 | * [Nasıl kullanılır](#nasil-kullanilir) 18 | 19 | * [Desteklenen Modeller](#desteklenen-modeller) 20 | 21 | * [Döngüsel çalıştırma ile ilgili uyarı](#uyari) 22 | 23 | # Nasıl Çalışır 24 | 25 | Script, aşağıdaki adımları gerçekleştiren sonsuz bir döngü çalıştırarak çalışır: 26 | 27 | 1. Görev listesinden ilk görevi çeker. 28 | 2. Görevi, ilk girdiye dayalı olarak görevi tamamlamak için OpenAI'nin API'sini kullanan yürütme aracısına gönderir. 29 | 3. Sonucu zenginleştirir ve Pinecone'da saklar. 30 | 4. Yeni görevler oluşturur ve önceki görevin amacına ve sonucuna göre görev listesini yeniden önceliklendirir. 31 | execution_agent() işlevi, OpenAI API'nin kullanıldığı yerdir. İki parametre alır: amaç ve görev. Ardından OpenAI'nin API'sine görevin sonucunu döndüren bir bilgi istemi gönderir. İstem, AI sisteminin görevinin, amacının ve görevin kendisinin bir açıklamasından oluşur. Sonuç daha sonra bir dizi olarak döndürülür. 32 | 33 | task_creation_agent() işlevi, önceki görevin amacına ve sonucuna dayalı olarak yeni görevler oluşturmak için OpenAI'nin API'sinin kullanıldığı yerdir. İşlev dört parametre alır: amaç, önceki görevin sonucu, görev açıklaması ve geçerli görev listesi. Ardından, OpenAI'nin API'sine yeni görevlerin bir listesini dizeler olarak döndüren bir bilgi istemi gönderir. İşlev daha sonra yeni görevleri, her bir sözlüğün görevin adını içerdiği bir sözlük listesi olarak döndürür. 34 | 35 | Prioritization_agent() işlevi, görev listesini yeniden önceliklendirmek için OpenAI'nin API'sinin kullanıldığı yerdir. İşlev, geçerli görevin kimliği olan bir parametre alır. OpenAI'nin API'sine, yeniden önceliklendirilen görev listesini numaralı bir liste olarak döndüren bir bilgi istemi gönderir. 36 | 37 | Son olarak, betik, bağlam için görev sonuçlarını depolamak ve almak için Pinecone'u kullanır. Komut dosyası, YOUR_TABLE_NAME değişkeninde belirtilen tablo adını temel alan bir Çam Kozası dizini oluşturur. Çam kozası daha sonra görevin sonuçlarını, görev adı ve herhangi bir ek meta veri ile birlikte dizinde depolamak için kullanılır. 38 | 39 | # Nasıl Kullanılır 40 | Scripti kullanmak için şu adımları izlemeniz gerekir: 41 | 42 | 1. `git clone https://github.com/yoheinakajima/babyagi.git` ve `cd` aracılığıyla repoyu lokal bilgisayarınıza kopyalayın. 43 | 2. Gerekli paketleri kurun: `pip install -r gereksinimleri.txt` 44 | 3. .env.example dosyasını .env'ye kopyalayın: `cp .env.example .env`. Aşağıdaki değişkenleri ayarlayacağınız yer burasıdır. 45 | 4. OpenAI ve Pinecone API anahtarlarınızı OPENAI_API_KEY, OPENAPI_API_MODEL ve PINECONE_API_KEY değişkenlerinde ayarlayın. 46 | 5. PINECONE_ENVIRONMENT değişkeninde Pinecone ortamını ayarlayın. 47 | 6. TABLE_NAME değişkeninde görev sonuçlarının saklanacağı tablonun adını belirleyin. 48 | 7. (İsteğe bağlı) OBJECTIVE değişkeninde görev yönetimi sisteminin hedefini belirleyin. 49 | 8. (İsteğe bağlı) INITIAL_TASK değişkeninde sistemin ilk görevini ayarlayın. 50 | 9. Scripti çalıştırın. 51 | 52 | # Desteklenen Modeller 53 | 54 | Bu script, tüm OpenAI modellerinin yanı sıra Llama.cpp aracılığıyla Llama modelleri ile de çalışmaktadır. Varsayılan olarak temelde çalışan model **gpt-3.5-turbo**'dur. Farklı bir model kullanmak için OPENAI_API_MODEL üzerinden model ismini belirtmeniz gerekmektedir. 55 | 56 | ## Lama kullanmak için 57 | 58 | [Llama.cpp](https://github.com/ggerganov/llama.cpp) dosyasının en son sürümünü indirin ve oluşturmak için talimatları izleyiniz. Ek olarak, Llama model-weights dosyasına da ihtiyacınız olacaktır. 59 | 60 | - **Issues, discussions veya pull requests gibi bu reponun herhangi bir yerinde IPFS paylaşımı, magnet linkleri, yada diğer tüm model indirme bağlantılarını hiçbir şekilde paylaşmayınız. Hızlı bir şekilde silineceklerdir.** 61 | 62 | Daha sonra `llama/main`i llama.cpp/main'e ve `models`i Lama model ağırlıklarının olduğu klasöre bağlayın. Ardından scripti `OPENAI_API_MODEL=llama` veya `-l` argümanı ile çalıştırın. 63 | 64 | # Uyarı 65 | Bu komut dosyası, bir görev yönetim sisteminin parçası olarak sürekli olarak (for loop mantığı ile) çalıştırılmak üzere tasarlanmıştır. Bu komut dosyasının sürekli olarak çalıştırılması yüksek sayıda API request isteği kullanımına neden olabilir, bu nedenle lütfen kullanım sürenize dikkat ediniz. Ayrıca script, OpenAI ve Pinecone API'lerinin doğru şekilde kurulmasını gerektirir, bu nedenle betiği çalıştırmadan önce API'leri sırasıyla ve düzgün şekilde kurduğunuzdan emin olmanız tavsiye edilmektedir. 66 | 67 | # Katkılarınız 68 | BabyAGI henüz emekleme aşamasında olan bir çalışmadır ve bu nedenle hala ileri adımların belirlenmesine ihtiyaç duymaktadır. Şu anda, BabyAGI için en önemli hedefimiz, anlaşılması ve üzerine geliştirilmesi konusunda *basit* olmaktır. Bu sadeliği korumak için, PR'ları gönderirken aşağıdaki yönergelere uymanızı rica ederiz: 69 | * Kapsamlı yeniden düzenleme yerine küçük, modüler değişikliklere odaklanın. 70 | * Yeni özellikler eklerken, kullanım durumunu ayrıntılı bir açıklamasını sağlayın. 71 | 72 | Ana geliştiricinin Twitter'dan paylaştığı güncelleme @yoheinakajima (Apr 5th, 2023): 73 | 74 | > I know there are a growing number of PRs, appreciate your patience - as I am both new to GitHub/OpenSource, and did not plan my time availability accordingly this week. Re:direction, I've been torn on keeping it simple vs expanding - currently leaning towards keeping a core Baby AGI simple, and using this as a platform to support and promote different approaches to expanding this (eg. BabyAGIxLangchain as one direction). I believe there are various opinionated approaches that are worth exploring, and I see value in having a central place to compare and discuss. More updates coming shortly. 75 | 76 | I am new to GitHub and open source, so please be patient as I learn to manage this project properly. I run a VC firm by day, so I will generally be checking PRs and issues at night after I get my kids down - which may not be every night. Open to the idea of bringing in support, will be updating this section soon (expectations, visions, etc). Talking to lots of people and learning - hang tight for updates! 77 | 78 | # İlk zamanlar 79 | BabyAGI, Twitter'da paylaşılan [Task-Driven Autonomous Agent](https://twitter.com/yoheinakajima/status/1640934493489070080?s=20)'nin (28 Mart 2023) sadeleştirilmiş bir sürümüdür. Reponun adı, orijinal otonom aracıya tepki olarak ortaya çıkmıştır ve ana geliştiricimiz, bunun bir AGI olduğunu tam anlamıyla iddia etmemektedir. 80 | 81 | Bir VC olan [@yoheinakajima](https://twitter.com/yoheinakajima) tarafından sevgiyle yapılmıştır (ne inşa ettiğinizi görmek ister!) 82 | -------------------------------------------------------------------------------- /docs/README-pt-br.md: -------------------------------------------------------------------------------- 1 |

babyagi

2 | 3 | # Objetivo 4 | 5 | Este script Python é um exemplo de um sistema de gerenciamento de tarefas orquestrado por uma IA. O sistema utiliza as APIs da OpenAI e Pinecone para criar, priorizar e executar tarefas. A ideia principal por trás deste sistema é criar tarefas com base no resultado das tarefas anteriores e em direção a um objetivo predefinido. 6 | 7 | O script usa então os recursos de processamento de linguagem natural (NLP) da OpenAI para criar novas tarefas com base no objetivo e o Pinecone para armazenar e recuperar resultados das tarefas para o contexto atual. Esta é uma versão simplificada do original [Agente Autônomo Orientado a Tarefas](https://twitter.com/yoheinakajima/status/1640934493489070080?s=20) (28 de março de 2023). 8 | 9 | Este README abordará os seguintes tópicos: 10 | 11 | * [Como o script funciona](#como-funciona) 12 | 13 | * [Como usar o script](#como-usar) 14 | 15 | * [Modelos suportados](#modelos-suportados) 16 | 17 | * [Aviso sobre a execução contínua do script](#aviso-execucao-continua) 18 | 19 | # Como funciona 20 | 21 | Quando iniciado, o script executa um loop infinito que realiza as seguintes funçōes: 22 | 23 | 1. Pega a primeira tarefa da lista de tarefas. 24 | 2. Envia a tarefa para o agente de execução, que usa a API da OpenAI para concluir a tarefa com base no contexto. 25 | 3. Enriquece o resultado e armazena-o no Pinecone. 26 | 4. Cria novas tarefas e reprioriza a lista de tarefas com base no objetivo e no resultado da tarefa anterior. A função `execution_agent()` é onde a API da OpenAI é utilizada. Ela recebe dois parâmetros: o objetivo e a tarefa. Em seguida, envia um prompt para a API da OpenAI, que retorna o resultado da tarefa. O prompt consiste em uma descrição da tarefa do sistema de IA, o objetivo e a própria tarefa. O resultado é então retornado como uma string. 27 | 28 | A função `task_creation_agent()` é onde a API da OpenAI é usada para criar novas tarefas com base no objetivo e no resultado da tarefa anterior. A função recebe quatro parâmetros: o objetivo, o resultado da tarefa anterior, a descrição da tarefa e a lista de tarefas atual. Em seguida, envia um prompt para a API da OpenAI, que retorna uma lista de novas tarefas como strings. A função retorna as novas tarefas como uma lista de dicionários, onde cada dicionário contém o nome da tarefa. 29 | 30 | A função `prioritization_agent()` é onde a API da OpenAI é usada para repriorizar a lista de tarefas. A função recebe um parâmetro, o ID da tarefa atual. Envia um prompt para a API da OpenAI, que retorna a lista de tarefas repriorizada como uma lista numerada. 31 | 32 | Por fim, o script utiliza o Pinecone para armazenar e recuperar resultados de tarefas para contexto. O script cria um índice Pinecone com base no nome da tabela especificado na variável `YOUR_TABLE_NAME`. Pinecone é então usado para armazenar os resultados da tarefa no índice, juntamente com o nome da tarefa e quaisquer metadados adicionais. 33 | 34 | # Como usar 35 | 36 | Para usar o script, siga estas etapas: 37 | 38 | 1. Clone o repositório via `git clone https://github.com/yoheinakajima/babyagi.git` e entre no repositório clonado. 39 | 2. Instale os pacotes necessários: `pip install -r requirements.txt` 40 | 3. Copie o arquivo .env.example para .env: `cp .env.example .env`. É aqui que você definirá as seguintes variáveis. 41 | 4. Defina suas chaves de API da OpenAI e Pinecone nas variáveis `OPENAI_API_KEY`, `OPENAPI_API_MODEL` e `PINECONE_API_KEY`. 42 | 5. Defina o ambiente Pinecone na variável `PINECONE_ENVIRONMENT`. 43 | 6. Defina o nome da tabela onde os resultados das tarefas serão armazenados na variável `TABLE_NAME`. 44 | 7. (Opcional) Defina o objetivo do sistema de gerenciamento de tarefas na variável `OBJECTIVE`. 45 | 8. (Opcional) Defina a primeira tarefa do sistema na variável `INITIAL_TASK`. 46 | 9. Execute o script. 47 | 48 | Todos os valores opcionais acima também podem ser especificados na linha de comando. 49 | 50 | # Modelos suportados 51 | 52 | Este script funciona com todos os modelos da OpenAI, bem como com Llama através do Llama.cpp. O modelo padrão é **gpt-3.5-turbo**. Para usar um modelo diferente, especifique-o através da variável de ambiente `OPENAI_API_MODEL` ou use a linha de comando. 53 | 54 | ## Llama 55 | 56 | Baixe a versão mais recente do [Llama.cpp](https://github.com/ggerganov/llama.cpp) e siga as instruções para compilá-lo. Você também precisará dos pesos do modelo Llama. 57 | 58 | - **Em hipótese alguma compartilhe IPFS, links magnéticos ou quaisquer outros links para downloads de modelos em qualquer lugar neste repositório, incluindo em issues, discussões ou solicitações pull request. Eles serão imediatamente excluídos.** 59 | 60 | Depois disso, vincule `llama/main` ao llama.cpp/main e `models` à pasta onde você possui os pesos do modelo Llama. Em seguida, execute o script com `OPENAI_API_MODEL=llama` ou argumento `-l`. 61 | 62 | # Aviso 63 | 64 | Este script foi projetado para ser executado continuamente como parte de um sistema de gerenciamento de tarefas. Executar este script continuamente pode resultar em alto uso da API, o que pode acarretar em grandes custos ao usuário, então, por favor, use-o com responsabilidade. Além disso, o script requer que as APIs da OpenAI e Pinecone sejam configuradas corretamente, portanto, certifique-se de ter configurado as APIs antes de executar o script. 65 | 66 | # Contribuição 67 | 68 | Obviamente, o BabyAGI ainda está em sua infância e, portanto, ainda estamos determinando sua direção e as etapas para chegar lá. Atualmente, um objetivo-chave de design para o BabyAGI é ser *simples* de forma que seja fácil de entender e desenvolver a partir dele. Para manter essa simplicidade, pedimos gentilmente que você siga as seguintes diretrizes ao enviar PRs: 69 | 70 | - Concentre-se em modificações pequenas e modulares em vez de refatorações extensas. 71 | - Ao introduzir novos recursos, forneça uma descrição detalhada do caso de uso específico que você está abordando. 72 | 73 | Um recado de @yoheinakajima (5 de abril de 2023): 74 | 75 | > Eu sei que há um número crescente de PRs, agradeço sua paciência - já que sou novo no GitHub/OpenSource e não planejei adequadamente minha disponibilidade de tempo nesta semana. Re:direction Estive dividido entre manter a simplicidade e expandir - atualmente, estou inclinado a manter um Baby AGI central simples e usar isso como plataforma para apoiar e promover diferentes abordagens para expandir (por exemplo, BabyAGIxLangchain como uma direção). Acredito que existem várias abordagens que valem a pena ser exploradas, e vejo valor em ter um local central para comparar e discutir. Em breve, mais atualizações. 76 | 77 | Sou novo no GitHub e no código aberto, então, por favor, seja paciente enquanto aprendo a gerenciar este projeto adequadamente. Eu gerencio uma empresa de capital de risco durante o dia, então geralmente estarei verificando PRs e Issues à noite depois de colocar meus filhos para dormir - o que pode não ser todas as noites. Estou aberto à ideias de trazer apoio, atualizarei esta seção em breve (expectativas, visões, etc). Estou conversando com muitas pessoas e aprendendo - aguarde atualizações! 78 | 79 | # Histórico 80 | 81 | BabyAGI é uma versão simplificada do original [Agente Autônomo Orientado a Tarefas](https://twitter.com/yoheinakajima/status/1640934493489070080?s=20) (28 de março de 2023) compartilhado no Twitter. Esta versão está reduzida a 140 linhas: 13 comentários, 22 espaços em branco e 105 de código. O nome do repositório surgiu na reação ao agente autônomo original - o autor não pretende insinuar que isso seja AGI. 82 | 83 | Feito com amor por [@yoheinakajima](https://twitter.com/yoheinakajima), que por acaso é um VC (adoraria ver o que você está construindo!) -------------------------------------------------------------------------------- /docs/inspired-projects.md: -------------------------------------------------------------------------------- 1 | # Inspired Projects 2 | 3 | This document highlights a curated selection of remarkable projects inspired by or built upon the concepts and ideas of BabyAGI. Our aim is to showcase the diversity and creativity of the community, foster collaboration, and provide inspiration for future projects. By exploring these examples, we hope you will gain valuable insights and ideas to enhance your own work. 4 | 5 | ## Projects List 6 | 7 | 1. [BabyAGI on Slack](https://twitter.com/frankc/status/1645898312594382848) 8 | - Description: An implementation of BabyAGI in Slack! Each thread represents a new objective. 9 | - Author: [Frank Chen](https://frankc.net) 10 | - Twitter: https://twitter.com/frankc 11 | 1. [AgentGPT](https://github.com/reworkd/AgentGPT) 12 | - Description: Assemble, configure, and deploy autonomous AI Agents in your browser. 13 | - Author: [Asim Shrestha](https://github.com/asim-shrestha) 14 | - Twitter: https://twitter.com/asimdotshrestha 15 | 1. [AgentLLM](https://github.com/idosal/AgentLLM) 16 | - Description: AgentGPT that uses a browser-native LLM instead of ChatGPT. 17 | - Author: [Ido Salomon](https://github.com/idosal) 18 | - Twitter: https://twitter.com/idosal1 19 | 1. [BabyAGI-asi](https://github.com/oliveirabruno01/babyagi-asi) 20 | - Description: A modification that runs arbitrary python code to perform tasks - It manages to create routines for pyautogui, webscrapping, manages to execute actions on the computer and even controls its own memory 21 | - Author: [Bruno De Oliveira](https://github.com/oliveirabruno01) 22 | - Twitter: https://twitter.com/LatentLich 23 | 1. [ai-legion](https://github.com/eumemic/ai-legion) 24 | - Description: Similar in spirit to AutoGPT and Baby AGI, but written in the superior language that is TypeScript (Author's Description). 25 | - Author: [eumemic](https://github.com/eumemic) 26 | - Twitter: https://twitter.com/dysmemic 27 | 1. [yourgoal](https://github.com/pj4533/yourgoal) 28 | - Description: Swift implementation of BabyAGI. 29 | - Author: [PJ Gray](https://github.com/pj4533) 30 | - Twitter: https://twitter.com/pj4533 31 | 1. [BabyAGIChatGPT](https://replit.com/@Skirano/BabyAGIChatGPT?v=1) 32 | - Description: Plug-in to run autonomous agents directly within ChatGPT 33 | - Author: [Pietro Schirano](https://replit.com/@Skirano) 34 | - Twitter: https://twitter.com/skirano 35 | 1. [Cognosys](https://www.cognosys.ai/) 36 | - Description: web based version of AutoGPT/babyAGI 37 | - Author: [Sully Omarr](https://github.com/sullyo) 38 | - Twitter: https://twitter.com/SullyOmarr 39 | 1. [Godmode](https://godmode.space/) 40 | - Description: web based version of AutoGPT/babyAGI 41 | - Authors: [Lonis](https://twitter.com/_Lonis_), [Emil Ahlbäck](https://github.com/FOLLGAD), and [fant](https://twitter.com/da_fant) 42 | - Twitter: https://twitter.com/SullyOmarr 43 | 1. [alphakit](https://alphakit.ai/) 44 | - Description: A team of autonomous AI agents for everyone 45 | - Author: [Andrew Yu](https://github.com/andrewyu0) 46 | - Twitter: https://twitter.com/andrewcyu 47 | 1. [Xircuits](https://github.com/XpressAI/xai-gpt-agent-toolkit) 48 | - Description: This toolkit provides a comprehensive set of Xircuits components that allow you to experiment with and create Collaborative Large Language Model-based automatons (Agents) in the style of BabyAGI and Auto-GPT. By default, the toolkit comes with BabyAGI agents, but it is designed to be easily customizable with your own prompts. 49 | - Author: [Eduardo Gonzalez](https://github.com/wmeddie) 50 | - Twitter: https://twitter.com/wm_eddie 51 | 1. [babyagijs](https://github.com/ericciarla/babyagijs) 52 | - Description: BabyAGI for Javascript. 53 | - Author: [Eric Ciarla](https://github.com/ericciarla) 54 | - Twitter: https://twitter.com/ericciarla 55 | 1. [Teenage-AGI](https://github.com/seanpixel/Teenage-AGI) 56 | - Description: Inspired by the several Auto-GPT related Projects (predominently BabyAGI) and the Paper "Generative Agents: Interactive Simulacra of Human Behavior", this python project uses OpenAI and Pinecone to Give memory to an AI agent and also allows it to "think" before making an action (outputting text). Also, just by shutting down the AI, it doesn't forget its memories since it lives on Pinecone and its memory_counter saves the index that its on. 57 | - Author: [Sean Pixel](https://github.com/seanpixel) 58 | - Twitter: https://twitter.com/sean_pixel 59 | 1. [babyagi-perl](https://github.com/nferraz/babyagi-perl) 60 | - Description: BabyAGI for Perl. 61 | - Author: [Nelson Ferraz](https://github.com/nelson-ferraz) 62 | 1. [gptagent.js](https://github.com/lgrammel/gptagent.js) 63 | - Description: A composable and extensible framework for creating AI agents with TypeScript/JavaScript. 64 | - Author: [Lars Grammel](https://github.com/lgrammel) 65 | - Twitter: https://twitter.com/lgrammel 66 | 1. [babyagi-streamlit](https://github.com/dory111111/babyagi-streamlit) 67 | - Description: Streamlit web app to make it more accessible. 68 | - Author: [Dory](https://github.com/dory111111) 69 | - Twitter: https://twitter.com/dory111111 70 | 1. [Do Anything Machine](https://www.doanythingmachine.com/) 71 | - Description: The Do Anything Machine helps you keep track of your tasks, prioritize them, and allows you to deploy AI agents to get your work done for you. 72 | - Author: Garrett Scott 73 | - Twitter: https://twitter.com/thegarrettscott 74 | 1. [Babyagi-as-a-service](https://github.com/jina-ai/langchain-serve#-babyagi-as-a-service) 75 | - Description: Integrate babyagi with your own applications - thanks to langchain-serve with one simple command - 𝐥𝐜-𝐬𝐞𝐫𝐯𝐞 𝐝𝐞𝐩𝐥𝐨𝐲 𝐛𝐚𝐛𝐲𝐚𝐠𝐢 76 | - Author: [Deepankar Mahapatro](https://github.com/deepankarm) 77 | - Twitter: https://twitter.com/_deepankarm_ 78 | 1. [gptrpg](https://github.com/dzoba/gptrpg) 79 | - Description: A simple RPG-like environment for an LLM-enabled AI Agent to exist in 80 | - Author: [Chris Dzoba](https://github.com/dzoba) 81 | - Twitter: https://twitter.com/ChrisDzoba_ 82 | 1. [BabyAGI-ts](https://github.com/context-labs/babyagi-ts) 83 | - Description: Port BabyAGI from Python to TypeScript and provide a friendly CLI tool that can be installed as a global NPM module 84 | - Author: [Sam Hogan](https://github.com/samheutmaker) 85 | - Twitter: https://twitter.com/0xSamHogan 86 | 1. [LLMitlessAPI](https://github.com/adamcohenhillel/LLMitlessAPI) 87 | - Description: API with one endpoint that does everything. 88 | - Author: [Adam Cohen Hillel](https://github.com/adamcohenhillel) 89 | - Twitter: https://twitter.com/adamcohenhillel 90 | 1. [PuttyGPT](https://github.com/webgrip/PuttyGPT) 91 | - Description: Wiring all this good stuff together. Weaviate, langchain, the ideas I see popping up everywhere, new concepts AI thinks off. Agents deploying other agents, concurrent requests, continuously training new finetuned models on data that's being gathered from its activities. It's FAR from a working prototype, but 100% worth a look. 92 | - Author: [Ryan William Grippeling](https://github.com/ryangr0) 93 | - Twitter: https://twitter.com/ryangrippeling 94 | 1. [Chippr-AGI](https://github.com/chippr-robotics/chippr-agi) 95 | - Description: Chippr-AGI is an open-source framework that uses AI models to automate task creation and prioritization. NodeJS, Redis, OpenAI/LLAMA 96 | - Author: [Cody Burns](https://github.com/realcodywburns) 97 | - Twitter: https://twitter.com/DontPanicBurns 98 | 1. [sharpagi](https://github.com/sathyarajv/sharpagi) 99 | - Description: C# dotnet implementation of BabyAGI. 100 | - Author: [Sathyaraj Vadivel](https://github.com/sathyarajv) 101 | - Twitter: https://twitter.com/sathyarajv 102 | -------------------------------------------------------------------------------- /docs/README-ro.md: -------------------------------------------------------------------------------- 1 |

2 | babyagi 3 | 4 |

5 | 6 | # Obiectiv 7 | Acest script Python este un exemplu de sistem de gestionare a sarcinilor alimentat de AI. Sistemul utilizează API-urile OpenAI și Pinecone pentru a crea, prioritiza și executa sarcini. Ideea principală din spatele acestui sistem este de a creea sarcini pe baza rezultatelor sarcinilor anterioare și a unui obiectiv predefinit. Apoi, scriptul utilizează capacitățile de procesare a limbajului natural (NLP) ale OpenAI pentru a crea sarcini noi pe baza obiectivului și a Pinecone pentru a stoca și recupera rezultatele sarcinilor pentru context. Aceasta este o versiune redusă a [Task-Driven Autonomous Agent](https://twitter.com/yoheinakajima/status/1640934493489070080?s=20) (28 martie 2023). 8 | 9 | Acest README va acoperi următoarele: 10 | 11 | * [Cum funcționează scriptul](#cum-functioneaza) 12 | 13 | * [Cum se utilizează scriptul](#cum-se-utilizeaza) 14 | 15 | * [Modele acceptate](#modele-acceptate) 16 | 17 | * [Avertisment despre rularea continuă a scriptului](#avertisment-rulare-continua) 18 | # Cum funcționează 19 | Scriptul funcționează prin executarea unei bucle infinite care face următorii pași: 20 | 21 | 1. Extrage prima sarcină din lista de sarcini. 22 | 2. Trimite sarcina la agentul de execuție, care utilizează API-ul OpenAI pentru a finaliza sarcina în funcție de context. 23 | 3. Îmbogățește rezultatul și îl stochează în Pinecone. 24 | 4. Creează noi sarcini și reprioritizează lista de sarcini în funcție de obiectiv și de rezultatul sarcinii anterioare. 25 | Funcția execution_agent() este locul unde se utilizează API-ul OpenAI. Aceasta primește doi parametri: obiectivul și sarcina. Apoi, trimite o solicitare către API-ul OpenAI, care returnează rezultatul sarcinii. Solicitarea constă dintr-o descriere a sarcinii sistemului AI, a obiectivul și a sarcina însași. Rezultatul este apoi returnat sub forma unui șir de caractere. 26 | 27 | Funcția task_creation_agent() este locul unde se utilizează API-ul OpenAI pentru a crea sarcini noi în funcție de obiectivul și rezultatul sarcinii anterioare. Funcția primește patru parametri: obiectivul, rezultatul sarcinii anterioare, descrierea sarcinii și lista de sarcini curentă. Apoi, trimite o solicitare către API-ul OpenAI, care returnează o listă de sarcini noi sub formă de șiruri de caractere. Funcția returnează apoi sarcinile noi sub forma unei liste de dicționare, unde fiecare dicționar conține numele sarcinii. 28 | 29 | Funcția prioritization_agent() este locul unde se utilizează API-ul OpenAI pentru a reprioritiza lista de sarcini. Funcția primește un singur parametru, ID-ul sarcinii curente. Aceasta trimite o solicitare către API-ul OpenAI, care returnează lista de sarcini reprioritizează sub forma unei liste de numere. 30 | 31 | În cele din urmă, scriptul utilizează Pinecone pentru a stoca și recupera rezultatele sarcinilor pentru context. Scriptul creează un index Pinecone bazat pe numele tabelului specificat în variabila YOUR_TABLE_NAME. Pinecone este apoi utilizat pentru a stoca rezultatele sarcinilor în index, împreună cu numele sarcinii și orice metadate suplimentare. 32 | 33 | # Cum se utilizează 34 | Pentru a utiliza acest script, trebuie să faceți următorii pași: 35 | 36 | 1. Clonați repository-ul folosind comanda `git clone https://github.com/yoheinakajima/babyagi.git` și navigați în directorul clonat cu comanda `cd`. 37 | 2. Instalați pachetele necesare: `pip install -r requirements.txt` 38 | 3. Copiați fișierul .env.example în .env cu comanda `cp .env.example .env`. Acesta este locul unde veți seta variabilele următoare. 39 | 4. Setați-vă cheile API OpenAI și Pinecone în variabilele OPENAI_API_KEY, OPENAPI_API_MODEL și PINECONE_API_KEY. 40 | 5. Setați mediul Pinecone în variabila PINECONE_ENVIRONMENT. 41 | 6. Setați numele tabelului, unde vor fi stocate rezultatele sarcinilor, în variabila TABLE_NAME. 42 | 7. (Opțional) Setați obiectivul sistemului de gestionare a sarcinilor în variabila OBJECTIVE. 43 | 8. (Opțional) Setați prima sarcină a sistemului în variabila INITIAL_TASK. 44 | 9. Rulați scriptul. 45 | 46 | Toate valorile opționale de mai sus pot fi specificate și în linia de comandă. 47 | 48 | # Modele acceptate 49 | 50 | Acest script funcționează cu toate modelele OpenAI, precum și cu Llama prin intermediul Llama.cpp. Modelul implicit este **gpt-3.5-turbo**. Pentru a utiliza un alt model, specificați-l prin intermediul variabilei OPENAI_API_MODEL sau utilizați linia de comandă. 51 | 52 | ## Llama 53 | 54 | Descărcați ultima versiune a [Llama.cpp](https://github.com/ggerganov/llama.cpp) și urmați instrucțiunile. De asemenea, veți avea nevoie si de ponderile (weights) modelului Llama. 55 | 56 | - **Sub nicio formă să nu partajați IPFS, link-uri magnetice sau orice alte link-uri către descărcări de modele în niciun loc din acest repository, inclusiv în issues, discussions sau pull requests. Acestea vor fi șterse imediat.** 57 | 58 | După aceea, legați `llama/main` de llama.cpp/main și `models` de folderul în care aveți ponderile modelului Llama. Apoi rulați scriptul cu `OPENAI_API_MODEL=llama` sau cu argumentul `-l`. 59 | 60 | # Avertisment 61 | Acest script este conceput să fie rulat continuu ca parte a unui sistem de gestionare a sarcinilor. Rularea continuă a acestui script poate duce la utilizarea ridicată a API-ului, deci vă rugăm să-l utilizați responsabil. În plus, scriptul necesită ca API-urile OpenAI și Pinecone să fie configurate corect, deci asigurați-vă de asta înainte de a rula scriptul. 62 | 63 | # Contribuție 64 | 65 | Nu mai e nevoie sa spun că BabyAGI este încă în stadiul său incipient, și de aceea încă încercam să-i determinăm direcția și pașii necesari pentru a ajunge acolo. În prezent, un obiectiv de design cheie pentru BabyAGI este să fie *simplu*, astfel încât să fie ușor de înțeles și de dezvoltat pe el. Pentru a menține această simplitate, vă rugăm să respectați următoarele instrucțiuni atunci când trimiteți PR-uri: 66 | 67 | * Concentrați-vă pe modificări mici și modulare, în loc să refactorizați extensiv. 68 | * Când introduceți noi funcționalități, furnizați o descriere detaliată a cazului specific pe care îl abordați. 69 | 70 | Un mesaj de la @yoheinakajima (5 aprilie 2023): 71 | 72 | > Știu că există un număr crescut de PR-uri și vă apreciez răbdarea - sunt nou în GitHub/OpenSource și nu mi-am planificat disponibilitatea timpului corespunzător în această săptămână. Re: direcție: sunt în dubii dacă să păstrez BabyAGI simplu sau să-l extind - în prezent, sunt înclinat să mențin un nucleu de Baby AGI simplu și să-l folosesc ca platformă pentru a susține și promova diferite abordări de extindere a acestuia (de ex. BabyAGIxLangchain ca o direcție). Cred că există diverse abordări opinate care merită explorate și văd valoare în a avea un loc central pentru a le compara și discuta. Mai multe actualizări în curând. 73 | Sunt nou pe GitHub și în lumea open source, deci vă rog să fiți răbdători în timp ce învăț să gestionez acest proiect în mod corespunzător. În timpul zilei, conduc o firmă de capital de risc (VC), astfel încât în general voi verifica PR-urile și problemele noaptea, după ce îmi culc copiii - ceea ce s-ar putea să nu fie în fiecare noapte. Sunt deschis ideii de a aduce suport, voi actualiza această secțiune în curând (așteptări, viziuni, etc.). Vorbind cu mulți oameni și învățând - țineți aproape pentru actualizări! 74 | 75 | # Povestea din spate 76 | BabyAGI este o versiune simplificată a originalului [Task-Driven Autonomous Agent](https://twitter.com/yoheinakajima/status/1640934493489070080?s=20) (28 martie 2023), fiind distribuit pe Twitter. Această versiune este redusă la 140 de linii de cod: 13 comentarii, 22 blank-uri și 105 linii de cod efectiv. Numele repo-ului a apărut ca o reacție la agentul autonom original - autorul nu intenționează să sugereze că acesta este AGI. 77 | 78 | Realizat cu dragoste de [@yoheinakajima](https://twitter.com/yoheinakajima), care se întâmplă să fie un VC (ar fi încântat să vadă ce construiți!) 79 | -------------------------------------------------------------------------------- /docs/README-pl.md: -------------------------------------------------------------------------------- 1 | # Cel 2 | 3 | Ten skrypt Pythona jest przykładem systemu zarządzania zadaniami napędzanego przez AI. System wykorzystuje API OpenAI i Pinecone do tworzenia zadań, ustalania ich priorytetów i wykonywania. Główną ideą tego systemu jest to, że tworzy on zadania na podstawie wyników poprzednich zadań i predefiniowanego celu. Następnie skrypt wykorzystuje możliwości OpenAI w zakresie przetwarzania języka naturalnego (NLP) do tworzenia nowych zadań w oparciu o cel, a Pinecone do przechowywania i pobierania wyników zadań w kontekście. Jest to okrojona wersja oryginalnego [Task-Driven Autonomous Agent](https://twitter.com/yoheinakajima/status/1640934493489070080?s=20) (28 marca 2023). 4 | 5 | W tym README zostaną omówione następujące kwestie: 6 | 7 | - [Jak działa skrypt](#how-it-works) 8 | 9 | - [Jak korzystać ze skryptu](#how-to-use) 10 | 11 | - [Obsługiwane modele](#supported-models) 12 | 13 | - [Ostrzeżenie przed ciągłym działaniem skryptu](#continous-script-warning) 14 | 15 | # Jak działa skrypt 16 | 17 | Skrypt zbudowany jest w formie nieskończonej pętli, która wykonuje następujące czynności: 18 | 19 | 1. Pobiera pierwsze zadanie z listy zadań. 20 | 2. Wysyła zadanie do agenta wykonawczego, który używa API OpenAI do wykonania zadania w oparciu o kontekst. 21 | 3. Wzbogaca wynik i zapisuje go w Pinecone. 22 | 4. Tworzy nowe zadania i dokonuje repriorytetyzacji listy zadań w oparciu o cel i wynik poprzedniego zadania. 23 |
24 | 25 | Funkcja execution_agent() jest miejscem, w którym wykorzystywane jest API OpenAI. Przyjmuje ona dwa parametry: cel i zadanie. Następnie wysyła monit do API OpenAI, które zwraca wynik zadania. Zachęta składa się z opisu zadania systemu AI, celu oraz samego zadania. Wynik jest następnie zwracany jako ciąg znaków. 26 |
27 | Funkcja task_creation_agent() jest miejscem, w którym API OpenAI jest wykorzystywane do tworzenia nowych zadań na podstawie celu i wyniku poprzedniego zadania. Funkcja przyjmuje cztery parametry: cel, wynik poprzedniego zadania, opis zadania oraz aktualną listę zadań. Następnie wysyła monit do API OpenAI, które zwraca listę nowych zadań jako ciągi znaków. Następnie funkcja zwraca nowe zadania jako listę słowników, gdzie każdy słownik zawiera nazwę zadania. 28 |
29 | Funkcja prioritization_agent() jest miejscem, w którym API OpenAI jest wykorzystywane do zmiany priorytetów na liście zadań. Funkcja przyjmuje jeden parametr, ID bieżącego zadania. Wysyła ona monit do API OpenAI, które zwraca listę zadań do ponownego ustalenia priorytetów w postaci listy numerycznej. 30 | 31 | Na koniec skrypt wykorzystuje Pinecone do przechowywania i pobierania wyników zadań w kontekście. Skrypt tworzy indeks Pinecone na podstawie nazwy tabeli określonej w zmiennej YOUR_TABLE_NAME. Pinecone jest następnie używany do przechowywania wyników zadania w indeksie, wraz z nazwą zadania i wszelkimi dodatkowymi metadanymi. 32 | 33 | # Jak korzystać ze skryptu 34 | 35 | Aby skorzystać ze skryptu, należy wykonać następujące kroki: 36 | 37 | 1. Sklonuj repozytorium poprzez `git clone https://github.com/yoheinakajima/babyagi.git` i przejdź (`cd`) do sklonowanego repozytorium. 38 | 2. Zainstaluj wymagane pakiety: `pip install -r requirements.txt`. 39 | 3. Skopiuj plik .env.example do .env: `cp .env.example .env`. W tym miejscu ustawisz następujące zmienne. 40 | 4. Ustaw swoje klucze API OpenAI i Pinecone w zmiennych OPENAI_API_KEY, OPENAPI_API_MODEL oraz PINECONE_API_KEY. 41 | 5. Ustaw środowisko Pinecone w zmiennej PINECONE_ENVIRONMENT. 42 | 6. Ustaw nazwę tabeli, w której będą przechowywane wyniki zadań w zmiennej TABLE_NAME. 43 | 7. (Opcjonalnie) Ustaw cel systemu zarządzania zadaniami w zmiennej OBJECTIVE. 44 | 8. (Opcjonalnie) Ustaw pierwsze zadanie systemu w zmiennej INITIAL_TASK. 45 | 9. Uruchom skrypt. 46 | 47 | Wszystkie powyższe wartości opcjonalne mogą być również określone w linii poleceń. 48 | 49 | # Uruchomienie wewnątrz kontenera docker 50 | 51 | Jako warunek wstępny, będziesz potrzebował mieć zainstalowany docker i docker-compose. Najprostszą opcją jest docker desktop: https://www.docker.com/products/docker-desktop/. 52 | 53 | Aby uruchomić system wewnątrz kontenera docker, skonfiguruj swój plik .env jak w krokach powyżej, a następnie uruchom poniższe polecenie: 54 | 55 | ``` 56 | docker-compose up 57 | ``` 58 | 59 | # Obsługiwane modele 60 | 61 | Ten skrypt działa ze wszystkimi modelami OpenAI, a także z Llama poprzez Llama.cpp. Domyślnym modelem jest **gpt-3.5-turbo**. Aby użyć innego modelu, określ go poprzez parametr OPENAI_API_MODEL lub użyj linii poleceń. 62 | 63 | ## Llama 64 | 65 | Pobierz najnowszą wersję [Llama.cpp](https://github.com/ggerganov/llama.cpp) i postępuj zgodnie z instrukcjami, aby ją zbudować. Do modelu Llama będziesz również potrzebował wag. 66 | 67 | - **W żadnym wypadku nie udostępniaj IPFS, linków magnet ani żadnych innych linków do pobierania modeli w tym repozytorium, włączając w to issues, dyskusje i pull requesty. Zostaną one natychmiast usunięte.** 68 | 69 | Następnie podlinkuj `llama/main` z llama.cpp/main i `models` do folderu, w którym masz wagi modelu Llama. Następnie uruchom skrypt z argumentem `OPENAI_API_MODEL=llama` lub `-l`. 70 | 71 | # Ostrzeżenie 72 | 73 | Ten skrypt został zaprojektowany do ciągłego działania jako część systemu zarządzania zadaniami. Uruchomienie tego skryptu w trybie ciągłym może powodować duże zużycie API, więc proszę korzystać z niego w sposób odpowiedzialny. Dodatkowo, skrypt wymaga poprawnego skonfigurowania API OpenAI i Pinecone, dlatego przed uruchomieniem skryptu upewnij się, że skonfigurowałeś te API. 74 | 75 | # Twój wkład 76 | 77 | Nie trzeba dodawać, że BabyAGI jest wciąż w powijakach i dlatego wciąż określamy jego kierunek i kroki, które należy podjąć, aby go osiągnąć. Obecnie, głównym celem BabyAGI jest bycie _prostym_, tak aby było łatwe do zrozumienia i rozwijania. Aby utrzymać tę prostotę, prosimy o przestrzeganie następujących wytycznych przy wysyłaniu PR-ów: 78 | 79 | - Skup się na małych, modularnych modyfikacjach, a nie na rozległych przeróbkach / refaktoryzacji. 80 | - Przy wprowadzaniu nowych funkcji przedstaw szczegółowy opis konkretnego przypadku użycia, do którego się odnosisz. 81 | 82 | Uwaga od @yoheinakajima (5. kwietnia 2023): 83 | 84 | > Wiem, że jest coraz więcej PR-ów, doceniam waszą cierpliwość - jestem nowy na GitHubie/OpenSource i nie zaplanowałem odpowiednio mojego czasu w tym tygodniu. Re:kierunek, byłem rozdarty w kwestii utrzymania prostoty vs rozszerzania - obecnie skłaniam się ku utrzymaniu prostoty rdzenia Baby AGI i użyciu tego jako platformy do wspierania i promowania różnych podejść do rozszerzania tego (np. BabyAGIxLangchain jako jeden kierunek). Wierzę, że istnieją różne opiniotwórcze podejścia, które są warte zbadania i widzę wartość w posiadaniu centralnego miejsca do porównania i dyskusji. Więcej aktualizacji wkrótce. 85 | 86 | Jestem nowy w GitHubie i open source, więc proszę o cierpliwość, gdy będę się uczyć, jak prawidłowo zarządzać tym projektem. W dzień prowadzę firmę VC, więc generalnie będę sprawdzał PR-y i problemy w nocy, po tym jak zejdą mi dzieci - co może nie być codziennością. Jestem otwarty na pomysł wprowadzenia wsparcia, wkrótce będę aktualizował tę sekcję (oczekiwania, wizje, itp.). Rozmawiam z wieloma ludźmi i uczę się - czekajcie na aktualizacje! 87 | 88 | # Inne projekty zainspirowane tym projektem 89 | 90 | W krótkim czasie od premiery, BabyAGI zainspirowało wiele projektów. Możesz zobaczyć je wszystkie [tutaj](docs/inspired-projects.md). 91 | 92 | # Tło 93 | 94 | BabyAGI to okrojona wersja oryginalnego [Task-Driven Autonomous Agent](https://twitter.com/yoheinakajima/status/1640934493489070080?s=20) (28 marca 2023) udostępnionego na Twitterze. Ta wersja sprowadza się do 140 linii: 13 komentarzy, 22 puste miejsca i 105 kodu. Nazwa repo pojawiła się w reakcji na oryginalnego autonomicznego agenta - autor nie ma zamiaru sugerować, że jest to AGI. 95 | 96 | Wykonane z miłością przez [@yoheinakajima](https://twitter.com/yoheinakajima), który tak się składa jest też VC (chętnie zobaczyłbym, co budujesz!). 97 | -------------------------------------------------------------------------------- /docs/README-es.md: -------------------------------------------------------------------------------- 1 |

2 | babyagi 3 | 4 |

5 | 6 | # Objetivo 7 | 8 | Este script de Python es un ejemplo de un sistema de gestión de tareas impulsado por inteligencia artificial. El sistema utiliza las API de OpenAI y Pinecone para crear, priorizar y ejecutar tareas. La idea principal detrás de este sistema es que crea tareas basadas en el resultado de tareas anteriores y un objetivo predefinido. Luego, el script utiliza las capacidades de procesamiento del lenguaje natural (NLP) de OpenAI para crear nuevas tareas basadas en el objetivo, y Pinecone para almacenar y recuperar los resultados de las tareas para el contexto. Esta es una versión simplificada del original [Task-Driven Autonomous Agent](https://twitter.com/yoheinakajima/status/1640934493489070080?s=20) (28 de marzo de 2023). 9 | 10 | Este README cubrirá lo siguiente: 11 | 12 | - [Cómo funciona el script](#como-funciona) 13 | 14 | - [Cómo utilizar el script](#como-utilizar) 15 | 16 | - [Modelos compatibles](#modelos-compatibles) 17 | 18 | - [Advertencia sobre la ejecución continua del script](#advertencia-script-continuo) 19 | 20 | # Cómo funciona 21 | 22 | El script funciona ejecutando un bucle infinito que realiza los siguientes pasos: 23 | 24 | 1. Extrae la primera tarea de la lista de tareas. 25 | 2. Envía la tarea al agente de ejecución, que utiliza la API de OpenAI para completar la tarea según el contexto. 26 | 3. Enriquece el resultado y lo almacena en Pinecone. 27 | 4. Crea nuevas tareas y prioriza la lista de tareas en función del objetivo y el resultado de la tarea anterior. 28 |
29 | 30 | La función execution_agent() es donde se utiliza la API de OpenAI. Esta toma dos parámetros: el objetivo y la tarea. Luego envía una solicitud a la API de OpenAI, que devuelve el resultado de la tarea. La solicitud consta de una descripción de la tarea del sistema de IA, el objetivo y la tarea en sí. Luego se devuelve el resultado como una cadena. 31 |
32 | La función task_creation_agent() es donde se utiliza la API de OpenAI para crear nuevas tareas basadas en el objetivo y el resultado de la tarea anterior. La función toma cuatro parámetros: el objetivo, el resultado de la tarea anterior, la descripción de la tarea y la lista de tareas actual. Luego envía una solicitud a la API de OpenAI, que devuelve una lista de nuevas tareas como strings. Luego, la función devuelve las nuevas tareas como una lista de diccionarios, donde cada diccionario contiene el nombre de la tarea. 33 |
34 | La función prioritization_agent() es donde se utiliza la API de OpenAI para priorizar la lista de tareas. La función toma un parámetro, el ID de la tarea actual. Luego envía una solicitud a la API de OpenAI, que devuelve la lista de tareas repriorizadas como una lista numerada. 35 | 36 | Finalmente, el script utiliza Pinecone para almacenar y recuperar los resultados de las tareas para el contexto. El script crea un índice Pinecone basado en el nombre de la tabla especificado en la variable YOUR_TABLE_NAME. Luego, Pinecone se utiliza para almacenar los resultados de la tarea en el índice, junto con el nombre de la tarea y cualquier metadato adicional. 37 | 38 | # Cómo utilizar el script 39 | 40 | Para utilizar el script, deberá seguir estos pasos: 41 | 42 | 1. Clonar el repositorio a través de `git clone https://github.com/yoheinakajima/babyagi.git` y `cd` en el repositorio clonado. 43 | 2. Instalar los paquetes requeridos: `pip install -r requirements.txt` 44 | 3. Copiar el archivo .env.example a .env: `cp .env.example .env`. Aquí es donde establecerá las siguientes variables. 45 | 4. Establezca sus claves de API de OpenAI y Pinecone en las variables OPENAI_API_KEY, OPENAPI_API_MODEL y PINECONE_API_KEY. 46 | 5. Establezca el entorno de Pinecone en la variable PINECONE_ENVIRONMENT. 47 | 6. Establezca el nombre de la tabla donde se almacenarán los resultados de la tareas en la variable TABLE_NAME. 48 | 7. (Opcional) Establezca el objetivo del sistema de gestión de tareas en la variable OBJECTIVE. 49 | 8. (Opcional) Establezca la primera tarea del sistema en la variable INITIAL_TASK. 50 | 9. Ejecute el script. 51 | 52 | Todos los valores opcionales anteriores también se pueden especificar en la línea de comando. 53 | 54 | # Modelos compatibles 55 | 56 | Este script funciona con todos los modelos de OpenAI, así como con Llama a través de Llama.cpp. El modelo predeterminado es **gpt-3.5-turbo**. Para utilizar un modelo diferente, especifíquelo a través de OPENAI_API_MODEL o utilice la línea de comando. 57 | 58 | ## Llama 59 | 60 | Descargue la última versión de [Llama.cpp](https://github.com/ggerganov/llama.cpp) y siga las instrucciones para compilarla. También necesitará los pesos del modelo Llama. 61 | 62 | - **Bajo ninguna circunstancia comparta enlaces IPFS, enlaces magnet o cualquier otro enlace para descargar modelos en cualquier lugar de este repositorio, incluyendo propuestas (issues), debates (discussions) o solicitudes de extracción (pull requests). Serán eliminados de inmediato.** 63 | 64 | Después de eso, enlace `llama/main` a llama.cpp/main y `models` a la carpeta donde tenga los pesos del modelo Llama. Luego ejecute el script con `OPENAI_API_MODEL=llama` o el argumento `-l`. 65 | 66 | # Advertencia 67 | 68 | Este script está diseñado para ser ejecutado continuamente como parte de un sistema de gestión de tareas. La ejecución continua de este script puede resultar en un alto uso de la API, así que úselo responsablemente. Además, el script requiere que las APIs de OpenAI y Pinecone estén configuradas correctamente, así que asegúrese de haber configurado las APIs antes de ejecutar el script. 69 | 70 | # Contribución 71 | 72 | Como es obvio, BabyAGI todavía está en su infancia y, por lo tanto, todavía estamos determinando su dirección y los pasos a seguir. Actualmente, un objetivo de diseño clave para BabyAGI es ser _simple_ para que sea fácil de entender y construir sobre ella. Para mantener esta simplicidad, solicitamos amablemente que se adhiera a las siguientes pautas al enviar solicitudes de extracción (PR): 73 | 74 | - Enfóquese en modificaciones pequeñas y modulares en lugar de refactorizaciones extensas. 75 | - Al introducir nuevas funciones, proporcione una descripción detallada del caso de uso específico que está abordando. 76 | 77 | Una nota de @yoheinakajima (5 de abril de 2023): 78 | 79 | > I know there are a growing number of PRs, appreciate your patience - as I am both new to GitHub/OpenSource, and did not plan my time availability accordingly this week. Re:direction, I've been torn on keeping it simple vs expanding - currently leaning towards keeping a core Baby AGI simple, and using this as a platform to support and promote different approaches to expanding this (eg. BabyAGIxLangchain as one direction). I believe there are various opinionated approaches that are worth exploring, and I see value in having a central place to compare and discuss. More updates coming shortly. 80 | 81 | Soy nuevo en GitHub y en código abierto, así que por favor tenga paciencia mientras aprendo a administrar este proyecto adecuadamente. Dirijo una empresa de capital de riesgo durante el día, por lo que generalmente revisaré las solicitudes de extracción y los problemas por la noche después de acostar a mis hijos, lo que puede no ser todas las noches. Estoy abierto a la idea de traer soporte y actualizaré esta sección pronto (expectativas, visiones, etc). Estoy hablando con muchas personas y aprendiendo, ¡esperen actualizaciones pronto! 82 | 83 | # Antecedentes 84 | 85 | BabyAGI es una versión simplificada de [Task-Driven Autonomous Agent](https://twitter.com/yoheinakajima/status/1640934493489070080?s=20) (28 de marzo de 2023) compartido en Twitter. Esta versión se ha reducido a 140 líneas: 13 comentarios, 22 líneas en blanco y 105 líneas de código. El nombre del repositorio surgió como reacción al agente autónomo original, y el autor no pretende implicar que esto sea AGI. 86 | 87 | Hecho con amor por [@yoheinakajima](https://twitter.com/yoheinakajima), que casualmente es un VC (¡me encantaría ver lo que estás construyendo!). 88 | -------------------------------------------------------------------------------- /docs/README-fr.md: -------------------------------------------------------------------------------- 1 |

2 | babyagi 3 |

4 | 5 | # Objectif 6 | 7 | Ce script Python est un exemple de système de gestion de tâches alimenté par l'IA. Le système utilise les API OpenAI et Pinecone pour créer, hiérarchiser et exécuter des tâches. L'idée principale derrière ce système est qu'il crée des tâches en fonction du résultat des tâches précédentes et d'un objectif prédéfini. Le script utilise ensuite les capacités de traitement du langage naturel (NLP) d'OpenAI pour créer de nouvelles tâches en fonction de l'objectif, et Pinecone pour stocker et récupérer les résultats des tâches pour le contexte. Il s'agit d'une version simplifiée du [Task-Driven Autonomous Agent (Agent Autonome Piloté par les Tâches)](https://twitter.com/yoheinakajima/status/1640934493489070080?s=20) (28 mars 2023). 8 | 9 | Ce fichier README couvrira les éléments suivants : 10 | 11 | - [Comment fonctionne le script](#how-it-works) 12 | 13 | - [Comment utiliser le script](#how-to-use) 14 | 15 | - [Les modèles pris en charge](#supported-models) 16 | 17 | - [Avertissement concernant l'exécution continue du script](#continous-script-warning) 18 | 19 | # Comment ça marche 20 | 21 | Le script fonctionne en exécutant une boucle infinie qui effectue les étapes suivantes : 22 | 23 | 1. Récupère la première tâche de la liste des tâches. 24 | 2. Envoie la tâche à l'agent d'exécution, qui utilise l'API d'OpenAI pour effectuer la tâche en fonction du contexte. 25 | 3. Enrichit le résultat et le stocke dans Pinecone. 26 | 4. Crée de nouvelles tâches et réorganise la liste des tâches en fonction de l'objectif et du résultat de la tâche précédente. 27 |
28 | 29 | La fonction `execution_agent()` est l'endroit où l'API d'OpenAI est utilisée. Elle prend deux paramètres : l'objectif et la tâche. Ensuite, elle envoie une requête à l'API d'OpenAI, qui renvoie le résultat de la tâche. La requête est constituée d'une description de la tâche du système d'IA, de l'objectif et de la tâche elle-même. Le résultat est ensuite renvoyé sous forme de chaîne de caractères. 30 |
31 | 32 | La fonction `task_creation_agent()` est l'endroit où l'API d'OpenAI est utilisée pour créer de nouvelles tâches en fonction de l'objectif et du résultat de la tâche précédente. La fonction prend quatre paramètres : l'objectif, le résultat de la tâche précédente, la description de la tâche et la liste des tâches actuelles. Ensuite, elle envoie une requête à l'API d'OpenAI, qui renvoie une liste de nouvelles tâches sous forme de chaînes de caractères. La fonction renvoie ensuite les nouvelles tâches sous forme d'une liste de dictionnaires, où chaque dictionnaire contient le nom de la tâche. 33 |
34 | 35 | La fonction `prioritization_agent()` est l'endroit où l'API d'OpenAI est utilisée pour réorganiser la liste des tâches. La fonction prend un paramètre, l'ID de la tâche actuelle. Elle envoie une requête à l'API d'OpenAI, qui renvoie la liste des tâches réorganisée sous forme d'une liste numérotée. 36 | 37 | Enfin, le script utilise Pinecone pour stocker et récupérer les résultats des tâches pour le contexte. Le script crée un index Pinecone basé sur le nom de la table spécifié dans la variable YOUR_TABLE_NAME. Pinecone est ensuite utilisé pour stocker les résultats de la tâche dans l'index, ainsi que le nom de la tâche et tout métadonnées supplémentaires. 38 | 39 | # Comment l'utiliser 40 | 41 | Pour utiliser le script, vous devrez suivre les étapes suivantes : 42 | 43 | 1. Clonez le dépôt en utilisant la commande `git clone https://github.com/yoheinakajima/babyagi.git` et allez dans le répertoire cloné avec la commande `cd babyagi`. 44 | 2. Installez les packages requis : `pip install -r requirements.txt`. 45 | 3. Copiez le fichier .env.example en .env : cp .env.example .env. C'est là que vous définirez les variables suivantes. 46 | 4. Définissez vos clés d'API OpenAI et Pinecone dans les variables OPENAI_API_KEY, OPENAPI_API_MODEL et PINECONE_API_KEY. 47 | 5. Définissez l'environnement Pinecone dans la variable PINECONE_ENVIRONMENT. 48 | 6. Définissez le nom de la table où les résultats de la tâche seront stockés dans la variable TABLE_NAME. 49 | 7. (Optionnel) Définissez l'objectif du système de gestion de tâches dans la variable OBJECTIVE. 50 | 8. (Optionnel) Définissez la première tâche du système dans la variable INITIAL_TASK. 51 | 9. Exécutez le script. 52 | 53 | Toutes les valeurs facultatives ci-dessus peuvent également être spécifiées en ligne de commande. 54 | 55 | # Exécution à l'intérieur d'un conteneur Docker. 56 | 57 | Assurez-vous d'avoir docker et docker-compose installés. Docker Desktop est l'option la plus simple https://www.docker.com/products/docker-desktop/. 58 | 59 | Pour exécuter le système à l'intérieur d'un conteneur Docker, configurez votre fichier .env comme indiqué dans les étapes ci-dessus, puis exécutez ce qui suit : 60 | 61 | ``` 62 | docker-compose up 63 | ``` 64 | 65 | # Les modèles pris en charge 66 | 67 | Ce script fonctionne avec tous les modèles OpenAI, ainsi qu'avec Llama via Llama.cpp. Le modèle par défaut est gpt-3.5-turbo. Pour utiliser un modèle différent, spécifiez-le via OPENAI_API_MODEL ou utilisez la ligne de commande. 68 | 69 | ## Llama 70 | 71 | Téléchargez la dernière version de [Llama.cpp](https://github.com/ggerganov/llama.cpp) puis suivez les instructions pour la compiler. Vous aurez également besoin des données pour allimenter le modèle Llama. 72 | 73 | - **Ne partagez sous saucun prétexte des liens IPFS, des liens magnet ou tout autre lien de téléchargement de modèles nulle part dans ce dépôt, y compris dans la section 'Issues', les discussions ou les 'pull request'. Ils seront immédiatement supprimés.** 74 | 75 | Après cela, liez `llama/main` à `llama.cpp/main` et `models` au dossier où vous avez données du modèle Llama. Ensuite, exécutez le script avec `OPENAI_API_MODEL=llama` ou l'argument `-l`. 76 | 77 | # Avertissement 78 | 79 | Ce script est conçu pour être exécuté en continu dans le cadre d'un système de gestion de tâches. L'exécution continue de ce script peut entraîner une utilisation élevée de l'API, veuillez donc l'utiliser de manière responsable. De plus, le script nécessite que les API OpenAI et Pinecone soient correctement configurées, veuillez donc vous assurer d'avoir configuré les API avant d'exécuter le script. 80 | 81 | # Contribution 82 | 83 | Il va sans dire que BabyAGI en est à ses débuts et que nous sommes donc en train de déterminer sa direction et les étapes à suivre. Actuellement, un objectif de conception clé pour BabyAGI est d'être simple de manière à ce qu'il soit facile à comprendre et à développer. Pour maintenir cette simplicité, nous vous demandons gentiment de respecter les directives suivantes lorsque vous soumettez des PR : 84 | 85 | - Concentrez-vous sur des modifications modulaires et petites plutôt que sur des changements (refactoring) importants. 86 | - Lorsque vous implémentez de nouvelles fonctionnalités, fournissez une description détaillée du cas d'utilisation spécifique que vous voulez adresser. 87 | 88 | Une note de @yoheinakajima (Apr 5th, 2023): 89 | 90 | > Je sais qu'il y a de plus en plus de pull requests, j'apprécie votre patience - étant donné que je suis nouveau sur GitHub/OpenSource et que je n'ai pas planifié correctement ma disponibilité cette semaine. En ce qui concerne l'orientation, j'ai été tiraillé entre la volonté de maintenir la simplicité de BabyAGI et celle de l'étendre - je penche actuellement pour la première option, en gardant un noyau central simple pour BabyAGI et en utilisant cela comme une plate-forme pour soutenir et promouvoir différentes approches d'expansion (par exemple, BabyAGIxLangchain comme une direction possible). Je crois qu'il existe différentes approches argumentées qui valent la peine d'être explorées, et je vois de la valeur dans le fait d'avoir un lieu central pour les comparer et en discuter. Plus de mises à jour à venir sous peu. 91 | 92 | Je suis nouveau sur GitHub et l'open source, donc veuillez être patient pendant que j'apprends à gérer ce projet correctement. Je dirige une entreprise de capital-risque le jour, donc je vérifierai généralement les PRs et Issues le soir après avoir couché mes enfants - ce qui ne sera peut-être pas tous les soirs. Je suis ouvert à l'idée d'apporter un soutien, je mettrai bientôt à jour cette section (attentes, visions, etc.). Je parle à beaucoup de gens et j'apprends - restez à l'écoute pour les mises à jour ! 93 | 94 | # Contexte 95 | 96 | BabyAGI est a une version simplifiée du [Task-Driven Autonomous Agent (Agent Autonome Piloté par les Tâches)](https://twitter.com/yoheinakajima/status/1640934493489070080?s=20) (28 mars 2023) partagé sur Twitter. Cette version ne contient plus que 140 lignes : 13 commentaires, 22 espaces, et 105 lignes de code. Le nom du référentiel est apparu en réaction à l'agent autonome original - l'auteur ne veut pas impliquer que ceci est un AGI. 97 | 98 | Fait avec amour par [@yoheinakajima](https://twitter.com/yoheinakajima), qui se trouve être un investisseur (j'aimerais voir ce sur quoi vous travaillez !) -------------------------------------------------------------------------------- /docs/README-de.md: -------------------------------------------------------------------------------- 1 |

2 | babyagi 3 |

4 | 5 | # Ziel 6 | 7 | Dieses Python-Skript ist ein Beispiel für ein KI-gestütztes Aufgabenverwaltungssystem. Das System verwendet OpenAI und Chroma, um Aufgaben zu erstellen, zu priorisieren und auszuführen. Die Hauptidee hinter diesem System ist, dass es Aufgaben basierend auf dem Ergebnis vorheriger Aufgaben und einem vordefinierten Ziel erstellt. Das Skript verwendet dann die Funktionen zur Verarbeitung natürlicher Sprache (NLP) von OpenAI, um neue Aufgaben basierend auf dem Ziel zu erstellen, und Chroma, um Aufgabenergebnisse für den Kontext zu speichern und abzurufen. Dies ist eine abgespeckte Version des ursprünglichen [Task-Driven Autonomous Agent](https://twitter.com/yoheinakajima/status/1640934493489070080?s=20) (28. März 2023). 8 | 9 | Diese README-Datei behandelt Folgendes: 10 | 11 | - [Wie das Skript funktioniert](#how-it-works) 12 | 13 | - [So verwendet man das Skript](#how-to-use) 14 | 15 | - [Unterstützte Modelle](#supported-models) 16 | 17 | - [Warnung vor der kontinuierlichen Ausführung des Skripts](#continous-script-warning) 18 | 19 | # Wie es funktioniert 20 | 21 | Das Skript funktioniert, indem es eine Endlosschleife ausführt, die die folgenden Schritte abarbeitet: 22 | 23 | 1. Zieht die erste Aufgabe aus der Aufgabenliste. 24 | 2. Sendet die Aufgabe an den Ausführungsagenten, der die API von OpenAI verwendet, um die Aufgabe basierend auf dem Kontext abzuschließen. 25 | 3. Reichert das Ergebnis an und speichert es in [Chroma](https://github.com/yoheinakajima/babyagi/blob/main/docs.trychroma.com). 26 | 4. Erstellt neue Aufgaben und priorisiert die Aufgabenliste basierend auf dem Ziel und dem Ergebnis der vorherigen Aufgabe neu. 27 |
28 | 29 | Die Funktion `execute_agent()` ist die Stelle, an dem die OpenAI-API verwendet wird. Sie benötigt zwei Parameter: das Ziel und die Aufgabe. Anschließend sendet sie eine Eingabeaufforderung an die API von OpenAI, die das Ergebnis der Aufgabe zurückgibt. Die Aufforderung besteht aus einer Beschreibung der Aufgabe des KI-Systems, des Ziels und der Aufgabe selbst. Das Ergebnis wird dann als String zurückgegeben. 30 |
31 | 32 | In der Funktion `task_creation_agent()` wird die API von OpenAI verwendet, um neue Aufgaben basierend auf dem Ziel und dem Ergebnis der vorherigen Aufgabe zu erstellen. Die Funktion nimmt vier Parameter entgegen: das Ziel, das Ergebnis der vorherigen Aufgabe, die Aufgabenbeschreibung und die aktuelle Aufgabenliste. Anschließend sendet es eine Eingabeaufforderung an die API von OpenAI, die eine Liste neuer Aufgaben als Zeichenfolgen zurückgibt. Die Funktion gibt dann die neuen Aufgaben als Liste von Wörterbüchern zurück, wobei jedes Wörterbuch den Namen der Aufgabe enthält. 33 |
34 | 35 | In der Funktion `prioritization_agent()` wird die API von OpenAI verwendet, um die Aufgabenliste neu zu priorisieren. Die Funktion übernimmt einen Parameter, die ID der aktuellen Aufgabe. Sie sendet eine Eingabeaufforderung an die API von OpenAI, die die neu priorisierte Aufgabenliste als nummerierte Liste zurückgibt. 36 |
37 | 38 | Schließlich verwendet das Skript Chroma, um Aufgabenergebnisse für den Kontext zu speichern und abzurufen. Das Skript erstellt eine Chroma-Sammlung basierend auf dem Tabellennamen, der in der Variablen TABLE_NAME angegeben ist. Chroma wird dann verwendet, um die Ergebnisse der Aufgabe zusammen mit dem Aufgabennamen und allen zusätzlichen Metadaten in der Sammlung zu speichern. 39 | 40 | # Wie man es benutzt 41 | 42 | Um das Skript zu verwenden, müssen die folgenden Schritte ausgeführt werden: 43 | 44 | 1. Klone das Repository über den Befehl `git glone https://github.com/yoheinakajima/babyagi.git` und wechsle mit `cd` in das geklonte Repository. 45 | 2. Installiere die erforderlichen Pakete: `pip install -r requirements.txt` 46 | 3. Kopiere die .env.example-Datei nach .env: `cp .env.example .env`. Hier werden die folgenden Variablen gesetzt. 47 | 4. Lege deinen OpenAI-API-Schlüssel in den Variablen OPENAI_API_KEY und OPENAPI_API_MODEL fest. 48 | 5. Lege den Namen der Tabelle fest, in der die Aufgabenergebnisse in der Variablen TABLE_NAME gespeichert werden. 49 | 6. (Optional) Lege den Namen der BabyAGI-Instanz in der Variablen BABY_NAME fest. 50 | 7. (Optional) Lege das Ziel des Task-Management-Systems in der Variablen OBJECTIVE fest. 51 | 8. (Optional) Lege die erste Aufgabe des Systems in der Variablen INITIAL_TASK fest. 52 | 9. Führe das Skript aus: `python babyagi.py` 53 | 54 | Alle obigen optionalen Werte können auch in der Befehlszeile angegeben werden. 55 | 56 | # In einem Docker-Container ausführen 57 | 58 | Als Voraussetzung müssen Docker und Docker-Compose installiert sein. Docker-Desktop ist die einfachste Option: [https://www.docker.com/products/docker-desktop/](https://www.docker.com/products/docker-desktop/). 59 | 60 | Um das System in einem Docker-Container auszuführen, richte deine .env-Datei wie oben beschrieben ein und führe dann folgenden Befehl aus: 61 | 62 | ``` 63 | docker-compose up 64 | ``` 65 | 66 | # Unterstützte Modelle 67 | 68 | Dieses Skript funktioniert mit allen OpenAI-Modellen sowie mit Llama und seinen Variationen über Llama.cpp. Das Standardmodell ist **gpt-3.5-turbo**. Um ein anderes Modell zu verwenden, geben Sie es über LLM_MODEL an oder verwenden Sie die Befehlszeile. 69 | 70 | ## Llama 71 | 72 | Die Llama-Integration erfordert das Paket [Llama.cpp](https://github.com/ggerganov/llama.cpp). Sie benötigen auch die Gewichte des Llama-Modells. 73 | 74 | - **Teilen Sie unter keinen Umständen IPFS, magnet-Links oder andere Links zu Modell-Downloads irgendwo in diesem Repository, auch nicht in Issues, Diskussionen oder Pull-Requests. Sie werden umgehend gelöscht.** 75 | 76 | Sobald verfügbar, setze die LLAMA_MODEL_PATH auf den Pfad des spezifischen zu verwendenden Modells. Der Einfachheit halber können Sie `models` im BabyAGI-Repo mit dem Ordner verknüpfen, in dem Sie die Llama-Modellgewichte haben. Führen Sie dann das Skript mit dem Argument `LLM_MODEL=llama` oder `-l` aus. 77 | 78 | # Warnung 79 | 80 | Dieses Skript wurde entwickelt, um als Teil eines Aufgabenverwaltungssystems kontinuierlich ausgeführt zu werden. Die kontinuierliche Ausführung dieses Skripts kann zu einer hohen API-Nutzung führen, gehe also bitte verantwortungsvoll damit um. Darüber hinaus erfordert das Skript die korrekte Einrichtung der OpenAI-API. Stelle also sicher, dass du die API eingerichtet hast, bevor du das Skript ausführst. 81 | 82 | # Beiträge 83 | 84 | Unnötig zu sagen, dass BabyAGI noch in den Kinderschuhen steckt und wir daher immer noch die Richtung und die Schritte dorthin bestimmen. Derzeit ist es ein wichtiges Designziel für BabyAGI, so einfach zu sein, dass es leicht zu verstehen und darauf aufzubauen ist. Um diese Einfachheit zu wahren, bitten wir, sich beim Einreichen von PRs an die folgenden Richtlinien zu halten: 85 | 86 | - Konzentriere dich auf kleine, modulare Modifikationen statt auf umfangreiches Refactoring. 87 | - Gebe bei der Einführung neuer Funktionen eine detaillierte Beschreibung des spezifischen Anwendungsfalls an, der angesprochen wird. 88 | 89 | Ein Hinweis von @yoheinakajima (Apr 5th, 2023): 90 | 91 | > Ich weiß, dass es eine wachsende Zahl von PRs gibt, danke für Ihre Geduld – da ich neu bei GitHub/OpenSource bin und meine zeitliche Verfügbarkeit diese Woche nicht entsprechend geplant habe. Re:direction, ich war hin- und hergerissen, es einfach zu halten oder zu erweitern – derzeit neige ich dazu, ein Kern-Baby-AGI einfach zu halten und dies als Plattform zu verwenden, um verschiedene Ansätze zur Erweiterung zu unterstützen und zu fördern (z. B. BabyAGIxLangchain als eine Richtung). Ich glaube, dass es verschiedene eigensinnige Ansätze gibt, die es wert sind, erkundet zu werden, und ich sehe Wert darin, einen zentralen Ort zum Vergleichen und Diskutieren zu haben. Weitere Updates folgen in Kürze. 92 | 93 | Ich bin neu bei GitHub und Open Source, also haben Sie bitte etwas Geduld, während ich lerne, dieses Projekt richtig zu verwalten. Ich leite tagsüber eine VC-Firma, also überprüfe ich im Allgemeinen nachts PRs und Probleme, nachdem ich meine Kinder ins Bett gebracht habe – was möglicherweise nicht jede Nacht der Fall ist. Offen für die Idee, Unterstützung einzubringen, wird dieser Abschnitt bald aktualisiert (Erwartungen, Visionen usw.). Mit vielen Leuten reden und lernen – bleiben Sie dran für Updates! 94 | 95 | # Inspirierte Projekte 96 | 97 | In der kurzen Zeit seit der Veröffentlichung hat BabyAGI viele Projekte inspiriert. Sie können [hier](https://github.com/yoheinakajima/babyagi/blob/main/docs/inspired-projects.md) angesehen werden. 98 | 99 | # Hintergrundgeschichte 100 | 101 | BabyAGI ist eine abgespeckte Version des ursprünglichen [Task-Driven Autonomous Agent](https://twitter.com/yoheinakajima/status/1640934493489070080?s=20)(28. März 2023), der auf Twitter geteilt wurde. Diese Version ist auf 140 Zeilen reduziert: 13 Kommentare, 22 Leerzeichen und 105 Code. Der Name des Repos tauchte in der Reaktion auf den ursprünglichen autonomen Agenten auf – der Autor will damit nicht implizieren, dass es sich um AGI handelt. 102 | 103 | Mit Liebe gemacht von [@yoheinakajima](https://twitter.com/yoheinakajima), der zufällig ein VC ist (würde gerne sehen, was du baust!) 104 | -------------------------------------------------------------------------------- /node/babyagi.js: -------------------------------------------------------------------------------- 1 | import { Configuration, OpenAIApi } from "openai" 2 | import { ChromaClient, OpenAIEmbeddingFunction } from "chromadb" 3 | import prompt from "prompt-sync" 4 | import assert from "assert" 5 | import * as dotenv from "dotenv" 6 | dotenv.config() 7 | 8 | // const client = new ChromaClient("http://localhost:8000") 9 | 10 | // API Keys 11 | const OPENAI_API_KEY = process.env.OPENAI_API_KEY || "" 12 | assert(OPENAI_API_KEY, "OPENAI_API_KEY environment variable is missing from .env") 13 | 14 | const OPENAI_API_MODEL = process.env.OPENAI_API_MODEL || "gpt-3.5-turbo" 15 | 16 | // Table config 17 | const TABLE_NAME = process.env.TABLE_NAME || "" 18 | assert(TABLE_NAME, "TABLE_NAME environment variable is missing from .env") 19 | 20 | // Run config 21 | const BABY_NAME = process.env.BABY_NAME || "BabyAGI" 22 | 23 | // Goal config 24 | const p = prompt() 25 | const OBJECTIVE = p("What is BabyAGI's objective? ") 26 | const INITIAL_TASK = p("What is the initial task to complete the objective? ") 27 | assert(OBJECTIVE, "No objective provided.") 28 | assert (INITIAL_TASK, "No initial task provided.") 29 | 30 | console.log('\x1b[95m\x1b[1m\n*****CONFIGURATION*****\n\x1b[0m\x1b[0m') 31 | console.log(`Name: ${BABY_NAME}`) 32 | console.log(`LLM: ${OPENAI_API_MODEL}`) 33 | 34 | if (OPENAI_API_MODEL.toLowerCase().includes("gpt-4")){ 35 | console.log("\x1b[91m\x1b[1m\n*****USING GPT-4. POTENTIALLY EXPENSIVE. MONITOR YOUR COSTS*****\x1b[0m\x1b[0m") 36 | } 37 | 38 | console.log("\x1b[94m\x1b[1m" + "\n*****OBJECTIVE*****\n" + "\x1b[0m\x1b[0m") 39 | console.log(`${OBJECTIVE}`) 40 | 41 | console.log(`\x1b[93m\x1b[1m \nInitial task: \x1b[0m\x1b[0m ${INITIAL_TASK}`) 42 | 43 | // Define OpenAI embedding function using Chroma 44 | const embeddingFunction = new OpenAIEmbeddingFunction(OPENAI_API_KEY) 45 | 46 | // Configure OpenAI 47 | const configuration = new Configuration({ 48 | apiKey: OPENAI_API_KEY, 49 | }); 50 | const openai = new OpenAIApi(configuration); 51 | 52 | //Task List 53 | var taskList = [] 54 | 55 | // Connect to chromadb and create/get collection 56 | const chromaConnect = async ()=>{ 57 | const chroma = new ChromaClient("http://localhost:8000") 58 | const metric = "cosine" 59 | const collections = await chroma.listCollections() 60 | const collectionNames = collections.map((c)=>c.name) 61 | if(collectionNames.includes(TABLE_NAME)){ 62 | const collection = await chroma.getCollection(TABLE_NAME, embeddingFunction) 63 | return collection 64 | } 65 | else{ 66 | const collection = await chroma.createCollection( 67 | TABLE_NAME, 68 | { 69 | "hnsw:space": metric 70 | }, 71 | embeddingFunction 72 | ) 73 | return collection 74 | } 75 | } 76 | 77 | const add_task = (task)=>{ taskList.push(task) } 78 | 79 | const clear_tasks = ()=>{ taskList = [] } 80 | 81 | const get_ada_embedding = async (text)=>{ 82 | text = text.replace("\n", " ") 83 | const embedding = await embeddingFunction.generate(text) 84 | return embedding 85 | } 86 | 87 | const openai_completion = async (prompt, temperature=0.5, maxTokens=100)=>{ 88 | if(OPENAI_API_MODEL.startsWith("gpt-")){ 89 | const messages = [{"role": "system", "content": prompt}] 90 | const response = await openai.createChatCompletion({ 91 | model: OPENAI_API_MODEL, 92 | messages: messages, 93 | max_tokens: maxTokens, 94 | temperature: temperature, 95 | n: 1, 96 | stop: null 97 | }) 98 | return response.data.choices[0].message.content.trim() 99 | } 100 | else { 101 | const response = await openai.createCompletion({ 102 | model: OPENAI_API_MODEL, 103 | prompt: prompt, 104 | max_tokens: maxTokens, 105 | temperature: temperature, 106 | top_p: 1, 107 | frequency_penalty: 0, 108 | presence_penalty: 0 109 | }) 110 | return response.data.choices[0].text.trim() 111 | } 112 | } 113 | 114 | const task_creation_agent = async (objective, result, task_description, taskList)=>{ 115 | const prompt = ` 116 | You are an task creation AI that uses the result of an execution agent to create new tasks with the following objective: ${objective}, 117 | The last completed task has the result: ${result}. 118 | This result was based on this task description: ${task_description}. 119 | These are incomplete tasks: ${taskList.map(task=>`${task.taskId}: ${task.taskName}`).join(', ')}. 120 | Based on the result, create new tasks to be completed by the AI system that do not overlap with incomplete tasks. 121 | Return the tasks as an array.` 122 | const response = await openai_completion(prompt) 123 | const newTasks = response.trim().includes("\n") ? response.trim().split("\n") : [response.trim()]; 124 | return newTasks.map(taskName => ({ taskName: taskName })); 125 | } 126 | 127 | 128 | 129 | const prioritization_agent = async (taskId)=>{ 130 | const taskNames = taskList.map((task)=>task.taskName) 131 | const nextTaskId = taskId+1 132 | const prompt = ` 133 | You are an task prioritization AI tasked with cleaning the formatting of and reprioritizing the following tasks: ${taskNames}. 134 | Consider the ultimate objective of your team:${OBJECTIVE}. Do not remove any tasks. Return the result as a numbered list, like: 135 | #. First task 136 | #. Second task 137 | Start the task list with number ${nextTaskId}.` 138 | const response = await openai_completion(prompt) 139 | const newTasks = response.trim().includes("\n") ? response.trim().split("\n") : [response.trim()]; 140 | clear_tasks() 141 | newTasks.forEach((newTask)=>{ 142 | const newTaskParts = newTask.trim().split(/\.(?=\s)/) 143 | if (newTaskParts.length == 2){ 144 | const newTaskId = newTaskParts[0].trim() 145 | const newTaskName = newTaskParts[1].trim() 146 | add_task({ 147 | taskId: newTaskId, 148 | taskName: newTaskName 149 | }) 150 | } 151 | }) 152 | } 153 | 154 | const execution_agent = async (objective, task, chromaCollection)=>{ 155 | const context = context_agent(objective, 5, chromaCollection) 156 | const prompt = ` 157 | You are an AI who performs one task based on the following objective: ${objective}.\n 158 | Take into account these previously completed tasks: ${context}.\n 159 | Your task: ${task}\nResponse:` 160 | const response = await openai_completion(prompt, undefined, 2000) 161 | return response 162 | } 163 | 164 | const context_agent = async (query, topResultsNum, chromaCollection)=>{ 165 | const count = await chromaCollection.count() 166 | if (count == 0){ 167 | return [] 168 | } 169 | const results = await chromaCollection.query( 170 | undefined, 171 | Math.min(topResultsNum, count), 172 | undefined, 173 | query, 174 | ) 175 | return results.metadatas[0].map(item=>item.task) 176 | } 177 | 178 | function sleep(ms) { 179 | return new Promise(resolve => setTimeout(resolve, ms)) 180 | } 181 | 182 | (async()=>{ 183 | const initialTask = { 184 | taskId: 1, 185 | taskName: INITIAL_TASK 186 | } 187 | add_task(initialTask) 188 | const chromaCollection = await chromaConnect() 189 | var taskIdCounter = 1 190 | while (true){ 191 | if(taskList.length>0){ 192 | console.log("\x1b[95m\x1b[1m"+"\n*****TASK LIST*****\n"+"\x1b[0m\x1b[0m") 193 | taskList.forEach(t => { 194 | console.log(" • " + t.taskName) 195 | }) 196 | 197 | // Step 1: Pull the first task 198 | const task = taskList.shift() 199 | console.log("\x1b[92m\x1b[1m"+"\n*****NEXT TASK*****\n"+"\x1b[0m\x1b[0m") 200 | console.log(task.taskId + ": " + task.taskName) 201 | 202 | // Send to execution function to complete the task based on the context 203 | const result = await execution_agent(OBJECTIVE, task.taskName, chromaCollection) 204 | const currTaskId = task.taskId 205 | console.log("\x1b[93m\x1b[1m"+"\nTASK RESULT\n"+"\x1b[0m\x1b[0m") 206 | console.log(result) 207 | 208 | // Step 2: Enrich result and store in Chroma 209 | const enrichedResult = { data : result} // this is where you should enrich the result if needed 210 | const resultId = `result_${task.taskId}` 211 | const vector = enrichedResult.data // extract the actual result from the dictionary 212 | const collectionLength = (await chromaCollection.get([resultId])).ids?.length 213 | if(collectionLength>0){ 214 | await chromaCollection.update( 215 | resultId, 216 | undefined, 217 | {task: task.taskName, result: result}, 218 | vector 219 | ) 220 | } 221 | else{ 222 | await chromaCollection.add( 223 | resultId, 224 | undefined, 225 | {task: task.taskName, result}, 226 | vector 227 | ) 228 | } 229 | 230 | // Step 3: Create new tasks and reprioritize task list 231 | const newTasks = await task_creation_agent(OBJECTIVE, enrichedResult, task.taskName, taskList.map(task=>task.taskName)) 232 | newTasks.forEach((task)=>{ 233 | taskIdCounter += 1 234 | task.taskId = taskIdCounter 235 | add_task(task) 236 | }) 237 | await prioritization_agent(currTaskId) 238 | await sleep(3000) 239 | } 240 | } 241 | })() 242 | 243 | -------------------------------------------------------------------------------- /docs/README-hu.md: -------------------------------------------------------------------------------- 1 | # További fordítások: 2 | 3 | [Français](./README-fr.md) 4 | [Portuguese](./README-pt-br.md) 5 | [Romanian](./README-ro.md) 6 | [Russian](./README-ru.md) 7 | [Slovenian](./README-si.md) 8 | [Spanish](./README-es.md) 9 | [Turkish](./README-tr.md) 10 | [Ukrainian](./README-ua.md) 11 | [Simplified Chinese](./README-cn.md) 12 | [繁體中文 (Traditional Chinese)](./README-zh-tw.md) 13 | [日本語](./README-ja.md) 14 | 15 | # Célkitűzés 16 | 17 | Ez a Python szkript egy AI-alapú feladatkezelő rendszer példája. A rendszer az OpenAI és a Pinecone API-kat használja feladatok létrehozásához, prioritizálásához és végrehajtásához. A rendszer fő ötlete az, hogy a korábbi feladatok eredményeire és egy előre meghatározott célokra alapozva hozza létre az új feladatokat. A szkript az OpenAI természetes nyelvfeldolgozási (NLP) képességeit használja feladatok létrehozásához, és a Pinecone-t tárolja és visszakeresi a feladatok eredményeit a kontextus miatt. Ez egy lecsupaszított változata az eredeti [Task-Driven Autonomous Agent](https://twitter.com/yoheinakajima/status/1640934493489070080?s=20) (2023. március 28.) programnak. 18 | 19 | Ez az OLVASSEL a következőket foglalja magába: 20 | 21 | - [Hogyan működik?](#how-it-works) 22 | 23 | - [Hogyan használható?](#how-to-use) 24 | 25 | - [Támogatott modellek](#supported-models) 26 | 27 | - [Figyelmeztetés a folyamatos futtatásra vonatkozóan](#continous-script-warning) 28 | 29 | # Hogyan működik 30 | 31 | A szkript egy végtelen ciklus futtatásával működik, amely a következő lépéseket hajtja végre: 32 | 33 | 1. Lekéri az első feladatot a feladatlistából. 34 | 2. Elküldi a feladatot a végrehajtó ügynöknek, amely az OpenAI API-ját használja a feladat teljesítéséhez a kontextus alapján. 35 | 3. Gazdagítja az eredményt, majd tárolja a Pinecone-ban. 36 | 4. Új feladatokat hoz létre és prioritást állít be a feladatlista alapján az objektív és az előző feladat eredménye szerint. 37 |
38 | 39 | A "execution_agent()" funkcióban használjuk az OpenAI API-t ami két paramétert adunk meg: az objektumot és a feladatot. Ezután küld egy lekérdezést az OpenAI API-jához, ami visszaadja az utasítás eredményét. Az lekérdezésre kerülő utasítás tartalmazza az AI rendszer feladatának leírását, az objektumot és magát a feladatot. A választ egy String formátumban kapjuk vissza. 40 |
41 | A "task_creation_agent()" funkcióban az OpenAI API-ját használjuk új lekérdezések és az azokhoz tartozó utasítások létrehozásához az objektum és az előző feladat eredménye alapján. A funkció négy paramétert vár: az objektumot, az előző feladat eredményét, a feladat leírását és a jelenlegi feladatlistát. Ezután küld egy lekérdezést az újonnan létrehozott utasítással az OpenAI API-jához, ami válaszként egy új feladatokból álló listával válaszol szintén String formátumban. A függvény ezután az új feladatokat szótárlistaként adja vissza, ahol minden szótár tartalmazza a feladat nevét. 42 |
43 | A "prioritization_agent()" funkcióban az OpenAI API-ját használjuk a feladatlista prioritizálásához. A funkció egy paramétert vár, ami az aktuális feladat azonosítója. Küld egy lekérdezést az OpenAI API-jához az utasítással, ami válaszként a prioritizált feladatlistát adja vissza számozva. 44 | 45 | Végül a szkript használja a Pinecone-t a feladat eredményeinek tárolásához és lekérdezéséhez a kontextusban. A script egy Pinecone indexet hoz létre a YOUR_TABLE_NAME változóban a megadott tábla alapján. A Pinecone ezután a feladat eredményeinek az indexben való tárolására szolgál, a feladat nevével és a további metaadatokkal együtt. 46 | 47 | # Hogyan használható? 48 | 49 | A szkript használatához kövesse a következő lépéseket: 50 | 51 | 1. Klónozza a tárat a `git clone https://github.com/yoheinakajima/babyagi.git` majd a `cd` parancs segítségével lépjen a klónozott tároló mappájába. 52 | 2. Telepítse a szükséges csomagokat: `pip install -r requirements.txt` 53 | 3. Másolja az .env.example fájlt a .env fájlba: `cp .env.example .env`. Itt állíthatja be a következőkben megadott változókat. 54 | 4. Állítsa be az OpenAI és Pinecone API-kulcsokat az OPENAI_API_KEY, OPENAPI_API_MODEL és PINECONE_API_KEY változókban. 55 | 5. Állítsa be a Pinecone környezetet a PINECONE_ENVIRONMENT változóban. 56 | 6. Adja meg a TABLE_NAME változóban annak a táblának a nevét, ahol a feladat eredményeit tárolni fogja. 57 | 7. (Opcionális) Állítsa be a feladatkezelő rendszer célját az OBJEKTÍV változóban. 58 | 8. (Opcionális) Állítsa be a rendszer első feladatát az INITIAL_TASK változóban. 59 | 9. Futtassa a szkriptet. 60 | 61 | Az összes fenti opcionális érték a parancssorban is megadható. 62 | 63 | 64 | # Futtatás Docker konténeren 65 | 66 | Előfeltételként telepítenie kell a `docker`-t és a `docker-compose`-t, ha még nem rendelkezik ezekkel. A Docker asztali verziója a legegyszerűbb lehetőség ezeknek a telepítéséhez https://www.docker.com/products/docker-desktop/ 67 | 68 | A rendszer docker-tárolón belüli futtatásához állítsa be az `.env` fájlt a fenti lépések szerint, majd futtassa a következőket: 69 | 70 | ``` 71 | docker-compose up 72 | ``` 73 | 74 | # Támogatott modellek 75 | 76 | Ez a szkript minden OpenAI modellel működik, valamint a Llama.cpp-n keresztül a Llamával is. Az alapértelmezett modell a **gpt-3.5-turbo**. Másik modell használatához adja meg az OPENAI_API_MODEL segítségével, vagy használja a parancssort. 77 | 78 | ## Llama 79 | 80 | Töltse le a [Llama.cpp](https://github.com/ggerganov/llama.cpp) legújabb verzióját, és kövesse az utasításokat az elkészítéséhez. Szükséged lesz a Llama modellsúlyokra is. 81 | 82 | - **Semmilyen körülmények között ne ossza meg az IPFS-t, a mágneses hivatkozásokat vagy a modellletöltésekhez vezető más hivatkozásokat sehol ebben a tárhelyben, beleértve a problémákat, a vitákat vagy a lekérési kéréseket mert azok azonnal törlődnek.** 83 | 84 | Ezután kapcsolja össze a `llama/main`-t a llama.cpp/main-hez, a `models`-t pedig ahhoz a mappához, ahol a Llama-modell súlyai vannak. Ezután futtassa a szkriptet `OPENAI_API_MODEL=llama` vagy `-l` argumentummal. 85 | 86 | # Figyelmeztetés 87 | 88 | Ezt a szkriptet úgy tervezték, hogy a feladatkezelő rendszer részeként folyamatosan futhasson. A szkript folyamatos futtatása magas API-használatot eredményezhet, ezért kérjük, használja felelősségteljesen! Ezenkívül a szkript megköveteli az OpenAI és Pinecone API-k megfelelő beállítását, ezért a szkript futtatása előtt győződjön meg arról, hogy megfelelően beállította a szükséges API-kra vonatkozó beállításokat. 89 | 90 | # Hozzájárulás 91 | 92 | Mondanunk sem kell, hogy a BabyAGI még gyerekcipőben jár, ezért még mindig meg kell határozzuk a szkript irányát és a lépéseit. Jelenleg a BabyAGI legfontosabb tervezési célja, hogy _egyszerű_, _könnyen érthető_ és _építhető_ legyen. Az egyszerűség megőrzése érdekében kérjük, hogy a PR-ok benyújtásakor tartsa be az alábbi irányelveket: 93 | 94 | - A kiterjedt átalakítás helyett a kis, moduláris módosításokra összpontosítson. 95 | - Új funkciók bevezetésekor részletes leírást adjon az Ön által kezelt konkrét használati esetről. 96 | 97 | Egy megjegyzés @yoheinakajima-tól (2023. április 5.): 98 | 99 | > I know there are a growing number of PRs, appreciate your patience - as I am both new to GitHub/OpenSource, and did not plan my time availability accordingly this week. Re:direction, I've been torn on keeping it simple vs expanding - currently leaning towards keeping a core Baby AGI simple, and using this as a platform to support and promote different approaches to expanding this (eg. BabyAGIxLangchain as one direction). I believe there are various opinionated approaches that are worth exploring, and I see value in having a central place to compare and discuss. More updates coming shortly. 100 | 101 | I am new to GitHub and open source, so please be patient as I learn to manage this project properly. I run a VC firm by day, so I will generally be checking PRs and issues at night after I get my kids down - which may not be every night. Open to the idea of bringing in support, will be updating this section soon (expectations, visions, etc). Talking to lots of people and learning - hang tight for updates! 102 | 103 | # Inspirált projektek 104 | 105 | A megjelenés óta eltelt rövid idő alatt a BabyAGI számos projektet inspirált. Mindegyiket megtekintheti [itt](docs/inspired-projects.md). 106 | 107 | # Háttértörténet 108 | 109 | A BabyAGI a Twitteren megosztott eredeti [Task-Driven Autonomous Agent](https://twitter.com/yoheinakajima/status/1640934493489070080?s=20) kicsinyített változata (2023. március 28.). Ez a verzió 140 soros: 13 megjegyzés, 22 üres és 105 kód. A tároló neve az eredeti autonóm ügynökre adott reakcióban merült fel – a szerző nem azt akarja sugallni, hogy ez az AGI! 110 | 111 | Szeretettel készítette [@yoheinakajima](https://twitter.com/yoheinakajima), aki nagyon szívesen látná, mit építesz! 112 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Translations: 2 | 3 | [عربي](docs/README-ar.md) 4 | [Français](docs/README-fr.md) 5 | [Polski](docs/README-pl.md) 6 | [Portuguese](docs/README-pt-br.md) 7 | [Romanian](docs/README-ro.md) 8 | [Russian](docs/README-ru.md) 9 | [Slovenian](docs/README-si.md) 10 | [Spanish](docs/README-es.md) 11 | [Turkish](docs/README-tr.md) 12 | [Ukrainian](docs/README-ua.md) 13 | [Simplified Chinese](docs/README-cn.md) 14 | [繁體中文 (Traditional Chinese)](docs/README-zh-tw.md) 15 | [日本語](docs/README-ja.md) 16 | [한국어](docs/README-ko.md) 17 | [Magyar](docs/README-hu.md) 18 | [فارسی](docs/README-fa.md) 19 | [German](docs/README-de.md) 20 | 21 | # Objective 22 | 23 | This Python script is an example of an AI-powered task management system. The system uses OpenAI and vector databases such as Chroma or Weaviate to create, prioritize, and execute tasks. The main idea behind this system is that it creates tasks based on the result of previous tasks and a predefined objective. The script then uses OpenAI's natural language processing (NLP) capabilities to create new tasks based on the objective, and Chroma/Weaviate to store and retrieve task results for context. This is a pared-down version of the original [Task-Driven Autonomous Agent](https://twitter.com/yoheinakajima/status/1640934493489070080?s=20) (Mar 28, 2023). 24 | 25 | This README will cover the following: 26 | 27 | - [How the script works](#how-it-works) 28 | 29 | - [How to use the script](#how-to-use) 30 | 31 | - [Supported Models](#supported-models) 32 | 33 | - [Warning about running the script continuously](#continous-script-warning) 34 | 35 | # How It Works 36 | 37 | The script works by running an infinite loop that does the following steps: 38 | 39 | 1. Pulls the first task from the task list. 40 | 2. Sends the task to the execution agent, which uses OpenAI's API to complete the task based on the context. 41 | 3. Enriches the result and stores it in [Chroma](https://docs.trychroma.com)/[Weaviate](https://weaviate.io/). 42 | 4. Creates new tasks and reprioritizes the task list based on the objective and the result of the previous task. 43 |
44 | 45 | ![image](https://user-images.githubusercontent.com/21254008/235015461-543a897f-70cc-4b63-941a-2ae3c9172b11.png) 46 | 47 | The `execution_agent()` function is where the OpenAI API is used. It takes two parameters: the objective and the task. It then sends a prompt to OpenAI's API, which returns the result of the task. The prompt consists of a description of the AI system's task, the objective, and the task itself. The result is then returned as a string. 48 | 49 | The `task_creation_agent()` function is where OpenAI's API is used to create new tasks based on the objective and the result of the previous task. The function takes four parameters: the objective, the result of the previous task, the task description, and the current task list. It then sends a prompt to OpenAI's API, which returns a list of new tasks as strings. The function then returns the new tasks as a list of dictionaries, where each dictionary contains the name of the task. 50 | 51 | The `prioritization_agent()` function is where OpenAI's API is used to reprioritize the task list. The function takes one parameter, the ID of the current task. It sends a prompt to OpenAI's API, which returns the reprioritized task list as a numbered list. 52 | 53 | Finally, the script uses Chroma/Weaviate to store and retrieve task results for context. The script creates a Chroma/Weaviate collection based on the table name specified in the TABLE_NAME variable. Chroma/Weaviate is then used to store the results of the task in the collection, along with the task name and any additional metadata. 54 | 55 | # How to Use 56 | 57 | To use the script, you will need to follow these steps: 58 | 59 | 1. Clone the repository via `git clone https://github.com/yoheinakajima/babyagi.git` and `cd` into the cloned repository. 60 | 2. Install the required packages: `pip install -r requirements.txt` 61 | 3. Copy the .env.example file to .env: `cp .env.example .env`. This is where you will set the following variables. 62 | 4. Set your OpenAI API key in the OPENAI_API_KEY and OPENAPI_API_MODEL variables. 63 | 5. Set the name of the table where the task results will be stored in the TABLE_NAME variable. 64 | 6. (Optional) Set the name of the BabyAGI instance in the BABY_NAME variable. 65 | 7. (Optional) Set the objective of the task management system in the OBJECTIVE variable. 66 | 8. (Optional) Set the first task of the system in the INITIAL_TASK variable. 67 | 9. Run the script: `python babyagi.py` 68 | 69 | All optional values above can also be specified on the command line. 70 | 71 | # Running inside a docker container 72 | 73 | As a prerequisite, you will need docker and docker-compose installed. Docker desktop is the simplest option https://www.docker.com/products/docker-desktop/ 74 | 75 | To run the system inside a docker container, setup your .env file as per steps above and then run the following: 76 | 77 | ``` 78 | docker-compose up 79 | ``` 80 | 81 | # Supported Models 82 | 83 | This script works with all OpenAI models, as well as Llama and its variations through Llama.cpp. Default model is **gpt-3.5-turbo**. To use a different model, specify it through LLM_MODEL or use the command line. 84 | 85 | ## Llama 86 | 87 | Llama integration requires llama-cpp package. You will also need the Llama model weights. 88 | 89 | - **Under no circumstances share IPFS, magnet links, or any other links to model downloads anywhere in this repository, including in issues, discussions or pull requests. They will be immediately deleted.** 90 | 91 | Once you have them, set LLAMA_MODEL_PATH to the path of the specific model to use. For convenience, you can link `models` in BabyAGI repo to the folder where you have the Llama model weights. Then run the script with `LLM_MODEL=llama` or `-l` argument. 92 | 93 | # Warning 94 | 95 | This script is designed to be run continuously as part of a task management system. Running this script continuously can result in high API usage, so please use it responsibly. Additionally, the script requires the OpenAI API to be set up correctly, so make sure you have set up the API before running the script. 96 | 97 | # Contribution 98 | 99 | Needless to say, BabyAGI is still in its infancy and thus we are still determining its direction and the steps to get there. Currently, a key design goal for BabyAGI is to be _simple_ such that it's easy to understand and build upon. To maintain this simplicity, we kindly request that you adhere to the following guidelines when submitting PRs: 100 | 101 | - Focus on small, modular modifications rather than extensive refactoring. 102 | - When introducing new features, provide a detailed description of the specific use case you are addressing. 103 | 104 | A note from @yoheinakajima (Apr 5th, 2023): 105 | 106 | > I know there are a growing number of PRs, appreciate your patience - as I am both new to GitHub/OpenSource, and did not plan my time availability accordingly this week. Re:direction, I've been torn on keeping it simple vs expanding - currently leaning towards keeping a core Baby AGI simple, and using this as a platform to support and promote different approaches to expanding this (eg. BabyAGIxLangchain as one direction). I believe there are various opinionated approaches that are worth exploring, and I see value in having a central place to compare and discuss. More updates coming shortly. 107 | 108 | I am new to GitHub and open source, so please be patient as I learn to manage this project properly. I run a VC firm by day, so I will generally be checking PRs and issues at night after I get my kids down - which may not be every night. Open to the idea of bringing in support, will be updating this section soon (expectations, visions, etc). Talking to lots of people and learning - hang tight for updates! 109 | 110 | # Inspired projects 111 | 112 | In the short time since it was release, BabyAGI inspired many projects. You can see them all [here](docs/inspired-projects.md). 113 | 114 | # Backstory 115 | 116 | BabyAGI is a pared-down version of the original [Task-Driven Autonomous Agent](https://twitter.com/yoheinakajima/status/1640934493489070080?s=20) (Mar 28, 2023) shared on Twitter. This version is down to 140 lines: 13 comments, 22 blanks, and 105 code. The name of the repo came up in the reaction to the original autonomous agent - the author does not mean to imply that this is AGI. 117 | 118 | Made with love by [@yoheinakajima](https://twitter.com/yoheinakajima), who happens to be a VC (would love to see what you're building!) 119 | -------------------------------------------------------------------------------- /classic/BabyBeeAGI: -------------------------------------------------------------------------------- 1 | ###### This is a modified version of OG BabyAGI, called BabyBeeAGI (future modifications will follow the pattern "BabyAGI"). This version requires GPT-4, it's very slow, and often errors out.###### 2 | ######IMPORTANT NOTE: I'm sharing this as a framework to build on top of (with lots of errors for improvement), to facilitate discussion around how to improve these. This is NOT for people who are looking for a complete solution that's ready to use. ###### 3 | 4 | import openai 5 | import pinecone 6 | import time 7 | import requests 8 | from bs4 import BeautifulSoup 9 | from collections import deque 10 | from typing import Dict, List 11 | import re 12 | import ast 13 | import json 14 | from serpapi import GoogleSearch 15 | 16 | ### SET THESE 4 VARIABLES ############################## 17 | 18 | # Add your API keys here 19 | OPENAI_API_KEY = "" 20 | SERPAPI_API_KEY = "" #If you include SERPAPI KEY, this will enable web-search. If you don't, it will automatically remove web-search capability. 21 | 22 | # Set variables 23 | OBJECTIVE = "You are an AI. Make the world a better place." 24 | YOUR_FIRST_TASK = "Develop a task list." 25 | 26 | ### UP TO HERE ############################## 27 | 28 | # Configure OpenAI and SerpAPI client 29 | openai.api_key = OPENAI_API_KEY 30 | if SERPAPI_API_KEY: 31 | serpapi_client = GoogleSearch({"api_key": SERPAPI_API_KEY}) 32 | websearch_var = "[web-search] " 33 | else: 34 | websearch_var = "" 35 | 36 | # Initialize task list 37 | task_list = [] 38 | 39 | # Initialize session_summary 40 | session_summary = "" 41 | 42 | ### Task list functions ############################## 43 | def add_task(task: Dict): 44 | task_list.append(task) 45 | 46 | def get_task_by_id(task_id: int): 47 | for task in task_list: 48 | if task["id"] == task_id: 49 | return task 50 | return None 51 | 52 | def get_completed_tasks(): 53 | return [task for task in task_list if task["status"] == "complete"] 54 | 55 | ### Tool functions ############################## 56 | def text_completion_tool(prompt: str): 57 | response = openai.Completion.create( 58 | engine="text-davinci-003", 59 | prompt=prompt, 60 | temperature=0.5, 61 | max_tokens=1500, 62 | top_p=1, 63 | frequency_penalty=0, 64 | presence_penalty=0 65 | ) 66 | return response.choices[0].text.strip() 67 | 68 | def web_search_tool(query: str): 69 | search_params = { 70 | "engine": "google", 71 | "q": query, 72 | "api_key": SERPAPI_API_KEY, 73 | "num":3 74 | } 75 | search_results = GoogleSearch(search_params) 76 | results = search_results.get_dict() 77 | 78 | return str(results["organic_results"]) 79 | 80 | def web_scrape_tool(url: str): 81 | response = requests.get(url) 82 | print(response) 83 | soup = BeautifulSoup(response.content, "html.parser") 84 | result = soup.get_text(strip=True)+"URLs: " 85 | for link in soup.findAll('a', attrs={'href': re.compile("^https://")}): 86 | result+= link.get('href')+", " 87 | return result 88 | 89 | ### Agent functions ############################## 90 | def execute_task(task, task_list, OBJECTIVE): 91 | global task_id_counter 92 | # Check if dependent_task_id is complete 93 | if task["dependent_task_id"]: 94 | dependent_task = get_task_by_id(task["dependent_task_id"]) 95 | if not dependent_task or dependent_task["status"] != "complete": 96 | return 97 | 98 | # Execute task 99 | 100 | print("\033[92m\033[1m"+"\n*****NEXT TASK*****\n"+"\033[0m\033[0m") 101 | print(str(task['id'])+": "+str(task['task'])+" ["+str(task['tool']+"]")) 102 | task_prompt = f"Complete your assigned task based on the objective: {OBJECTIVE}. Your task: {task['task']}" 103 | if task["dependent_task_id"]: 104 | dependent_task_result = dependent_task["result"] 105 | task_prompt += f"\nThe previous task ({dependent_task['id']}. {dependent_task['task']}) result: {dependent_task_result}" 106 | 107 | task_prompt += "\nResponse:" 108 | ##print("###task_prompt: "+task_prompt) 109 | if task["tool"] == "text-completion": 110 | result = text_completion_tool(task_prompt) 111 | elif task["tool"] == "web-search": 112 | result = web_search_tool(task_prompt) 113 | elif task["tool"] == "web-scrape": 114 | result = web_scrape_tool(str(task['task'])) 115 | else: 116 | result = "Unknown tool" 117 | 118 | 119 | print("\033[93m\033[1m"+"\n*****TASK RESULT*****\n"+"\033[0m\033[0m") 120 | print_result = result[0:2000] 121 | if result != result[0:2000]: 122 | print(print_result+"...") 123 | else: 124 | print(result) 125 | # Update task status and result 126 | task["status"] = "complete" 127 | task["result"] = result 128 | task["result_summary"] = summarizer_agent(result) 129 | 130 | # Update session_summary 131 | session_summary = overview_agent(task["id"]) 132 | 133 | # Increment task_id_counter 134 | task_id_counter += 1 135 | 136 | # Update task_manager_agent of tasks 137 | task_manager_agent( 138 | OBJECTIVE, 139 | result, 140 | task["task"], 141 | [t["task"] for t in task_list if t["status"] == "incomplete"], 142 | task["id"] 143 | ) 144 | 145 | 146 | def task_manager_agent(objective: str, result: str, task_description: str, incomplete_tasks: List[str], current_task_id : int) -> List[Dict]: 147 | global task_list 148 | original_task_list = task_list.copy() 149 | minified_task_list = [{k: v for k, v in task.items() if k != "result"} for task in task_list] 150 | result = result[0:4000] #come up with better solution later. 151 | 152 | prompt = ( 153 | f"You are a task management AI tasked with cleaning the formatting of and reprioritizing the following tasks: {minified_task_list}. " 154 | f"Consider the ultimate objective of your team: {OBJECTIVE}. " 155 | f"Do not remove any tasks. Return the result as a JSON-formatted list of dictionaries.\n" 156 | f"Create new tasks based on the result of last task if necessary for the objective. Limit tasks types to those that can be completed with the available tools listed below. Task description should be detailed." 157 | f"The maximum task list length is 7. Do not add an 8th task." 158 | f"The last completed task has the following result: {result}. " 159 | f"Current tool option is [text-completion] {websearch_var} and [web-scrape] only."# web-search is added automatically if SERPAPI exists 160 | f"For tasks using [web-scrape], provide only the URL to scrape as the task description. Do not provide placeholder URLs, but use ones provided by a search step or the initial objective." 161 | #f"If the objective is research related, use at least one [web-search] with the query as the task description, and after, add up to three URLs from the search result as a task with [web-scrape], then use [text-completion] to write a comprehensive summary of each site thas has been scraped.'" 162 | f"For tasks using [web-search], provide the search query, and only the search query to use (eg. not 'research waterproof shoes, but 'waterproof shoes')" 163 | f"dependent_task_id should always be null or a number." 164 | f"Do not reorder completed tasks. Only reorder and dedupe incomplete tasks.\n" 165 | f"Make sure all task IDs are in chronological order.\n" 166 | f"Do not provide example URLs for [web-scrape].\n" 167 | f"Do not include the result from the last task in the JSON, that will be added after..\n" 168 | f"The last step is always to provide a final summary report of all tasks.\n" 169 | f"An example of the desired output format is: " 170 | "[{\"id\": 1, \"task\": \"https://untapped.vc\", \"tool\": \"web-scrape\", \"dependent_task_id\": null, \"status\": \"incomplete\", \"result\": null, \"result_summary\": null}, {\"id\": 2, \"task\": \"Analyze the contents of...\", \"tool\": \"text-completion\", \"dependent_task_id\": 1, \"status\": \"incomplete\", \"result\": null, \"result_summary\": null}, {\"id\": 3, \"task\": \"Untapped Capital\", \"tool\": \"web-search\", \"dependent_task_id\": null, \"status\": \"incomplete\", \"result\": null, \"result_summary\": null}]." 171 | ) 172 | print("\033[90m\033[3m" + "\nRunning task manager agent...\n" + "\033[0m") 173 | response = openai.ChatCompletion.create( 174 | model="gpt-4", 175 | messages=[ 176 | { 177 | "role": "system", 178 | "content": "You are a task manager AI." 179 | }, 180 | { 181 | "role": "user", 182 | "content": prompt 183 | } 184 | ], 185 | temperature=0.2, 186 | max_tokens=1500, 187 | top_p=1, 188 | frequency_penalty=0, 189 | presence_penalty=0 190 | ) 191 | 192 | # Extract the content of the assistant's response and parse it as JSON 193 | result = response["choices"][0]["message"]["content"] 194 | print("\033[90m\033[3m" + "\nDone!\n" + "\033[0m") 195 | try: 196 | task_list = json.loads(result) 197 | except Exception as error: 198 | print(error) 199 | # Add the 'result' field back in 200 | for updated_task, original_task in zip(task_list, original_task_list): 201 | if "result" in original_task: 202 | updated_task["result"] = original_task["result"] 203 | task_list[current_task_id]["result"]=result 204 | #print(task_list) 205 | return task_list 206 | 207 | 208 | 209 | def summarizer_agent(text: str) -> str: 210 | text = text[0:4000] 211 | prompt = f"Please summarize the following text:\n{text}\nSummary:" 212 | response = openai.Completion.create( 213 | engine="text-davinci-003", 214 | prompt=prompt, 215 | temperature=0.5, 216 | max_tokens=100, 217 | top_p=1, 218 | frequency_penalty=0, 219 | presence_penalty=0 220 | ) 221 | return response.choices[0].text.strip() 222 | 223 | 224 | def overview_agent(last_task_id: int) -> str: 225 | global session_summary 226 | 227 | completed_tasks = get_completed_tasks() 228 | completed_tasks_text = "\n".join( 229 | [f"{task['id']}. {task['task']} - {task['result_summary']}" for task in completed_tasks] 230 | ) 231 | 232 | prompt = f"Here is the current session summary:\n{session_summary}\nThe last completed task is task {last_task_id}. Please update the session summary with the information of the last task:\n{completed_tasks_text}\nUpdated session summary, which should describe all tasks in chronological order:" 233 | response = openai.Completion.create( 234 | engine="text-davinci-003", 235 | prompt=prompt, 236 | temperature=0.5, 237 | max_tokens=200, 238 | top_p=1, 239 | frequency_penalty=0, 240 | presence_penalty=0 241 | ) 242 | session_summary = response.choices[0].text.strip() 243 | return session_summary 244 | 245 | 246 | ### Main Loop ############################## 247 | 248 | # Add the first task 249 | first_task = { 250 | "id": 1, 251 | "task": YOUR_FIRST_TASK, 252 | "tool": "text-completion", 253 | "dependent_task_id": None, 254 | "status": "incomplete", 255 | "result": "", 256 | "result_summary": "" 257 | } 258 | add_task(first_task) 259 | 260 | task_id_counter = 0 261 | #Print OBJECTIVE 262 | print("\033[96m\033[1m"+"\n*****OBJECTIVE*****\n"+"\033[0m\033[0m") 263 | print(OBJECTIVE) 264 | 265 | # Continue the loop while there are incomplete tasks 266 | while any(task["status"] == "incomplete" for task in task_list): 267 | 268 | # Filter out incomplete tasks 269 | incomplete_tasks = [task for task in task_list if task["status"] == "incomplete"] 270 | 271 | if incomplete_tasks: 272 | # Sort tasks by ID 273 | incomplete_tasks.sort(key=lambda x: x["id"]) 274 | 275 | # Pull the first task 276 | task = incomplete_tasks[0] 277 | 278 | # Execute task & call task manager from function 279 | execute_task(task, task_list, OBJECTIVE) 280 | 281 | # Print task list and session summary 282 | print("\033[95m\033[1m" + "\n*****TASK LIST*****\n" + "\033[0m") 283 | for t in task_list: 284 | dependent_task = "" 285 | if t['dependent_task_id'] is not None: 286 | dependent_task = f"\033[31m\033[0m" 287 | status_color = "\033[32m" if t['status'] == "complete" else "\033[31m" 288 | print(f"\033[1m{t['id']}\033[0m: {t['task']} {status_color}[{t['status']}]\033[0m \033[93m[{t['tool']}] {dependent_task}\033[0m") 289 | print("\033[93m\033[1m" + "\n*****SESSION SUMMARY*****\n" + "\033[0m\033[0m") 290 | print(session_summary) 291 | 292 | time.sleep(1) # Sleep before checking the task list again 293 | 294 | ### Objective complete ############################## 295 | 296 | # Print the full task list if there are no incomplete tasks 297 | if all(task["status"] != "incomplete" for task in task_list): 298 | print("\033[92m\033[1m" + "\n*****ALL TASKS COMPLETED*****\n" + "\033[0m\033[0m") 299 | for task in task_list: 300 | print(f"ID: {task['id']}, Task: {task['task']}, Result: {task['result']}") 301 | --------------------------------------------------------------------------------