You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
swarms/playground/swarms/automate_docs.py

184 lines
5.8 KiB

import inspect
import os
import threading
from typing import Callable, List
from swarms.prompts.documentation import DOCUMENTATION_WRITER_SOP
from swarms import Agent, OpenAIChat
from swarms.utils.loguru_logger import logger
import concurrent
#########
from swarms.utils.file_processing import (
load_json,
sanitize_file_path,
zip_workspace,
create_file_in_folder,
zip_folders,
)
class PythonDocumentationSwarm:
"""
A class for automating the documentation process for Python classes.
Args:
agents (List[Agent]): A list of agents used for processing the documentation.
max_loops (int, optional): The maximum number of loops to run. Defaults to 4.
docs_module_name (str, optional): The name of the module where the documentation will be saved. Defaults to "swarms.structs".
docs_directory (str, optional): The directory where the documentation will be saved. Defaults to "docs/swarms/tokenizers".
Attributes:
agents (List[Agent]): A list of agents used for processing the documentation.
max_loops (int): The maximum number of loops to run.
docs_module_name (str): The name of the module where the documentation will be saved.
docs_directory (str): The directory where the documentation will be saved.
"""
def __init__(
self,
agents: List[Agent],
max_loops: int = 4,
docs_module_name: str = "swarms.utils",
docs_directory: str = "docs/swarms/utils",
*args,
**kwargs,
):
super().__init__(*args, **kwargs)
self.agents = agents
self.max_loops = max_loops
self.docs_module_name = docs_module_name
self.docs_directory = docs_directory
# Initialize agent name logging
logger.info(
"Agents used for documentation:"
f" {', '.join([agent.name for agent in agents])}"
)
# Create the directory if it doesn't exist
dir_path = self.docs_directory
os.makedirs(dir_path, exist_ok=True)
logger.info(f"Documentation directory created at {dir_path}.")
def process_documentation(self, item):
"""
Process the documentation for a given class using OpenAI model and save it in a Markdown file.
Args:
item: The class or function for which the documentation needs to be processed.
"""
try:
doc = inspect.getdoc(item)
source = inspect.getsource(item)
is_class = inspect.isclass(item)
item_type = "Class Name" if is_class else "Name"
input_content = (
f"{item_type}:"
f" {item.__name__}\n\nDocumentation:\n{doc}\n\nSource"
f" Code:\n{source}"
)
# Process with OpenAI model (assuming the model's __call__ method takes this input and returns processed content)
for agent in self.agents:
processed_content = agent(
DOCUMENTATION_WRITER_SOP(
input_content, self.docs_module_name
)
)
doc_content = f"{processed_content}\n"
# Create the directory if it doesn't exist
dir_path = self.docs_directory
os.makedirs(dir_path, exist_ok=True)
# Write the processed documentation to a Markdown file
file_path = os.path.join(
dir_path, f"{item.__name__.lower()}.md"
)
with open(file_path, "w") as file:
file.write(doc_content)
logger.info(
f"Documentation generated for {item.__name__}."
)
except Exception as e:
logger.error(
f"Error processing documentation for {item.__name__}."
)
logger.error(e)
def run(self, python_items: List[Callable]):
"""
Run the documentation process for a list of Python items.
Args:
python_items (List[Callable]): A list of Python classes or functions for which the documentation needs to be generated.
"""
try:
threads = []
for item in python_items:
thread = threading.Thread(
target=self.process_documentation, args=(item,)
)
threads.append(thread)
thread.start()
# Wait for all threads to complete
for thread in threads:
thread.join()
logger.info(
"Documentation generated in 'swarms.structs'"
" directory."
)
except Exception as e:
logger.error("Error running documentation process.")
logger.error(e)
def run_concurrently(self, python_items: List[Callable]):
try:
with concurrent.futures.ThreadPoolExecutor() as executor:
executor.map(self.process_documentation, python_items)
logger.info(
"Documentation generated in 'swarms.structs'"
" directory."
)
except Exception as e:
logger.error("Error running documentation process.")
logger.error(e)
# Example usage
# Initialize the agents
agent = Agent(
llm=OpenAIChat(max_tokens=3000),
agent_name="Documentation Agent",
system_prompt=(
"You write documentation for Python items functions and"
" classes, return in markdown"
),
max_loops=1,
)
# Initialize the documentation swarm
doc_swarm = PythonDocumentationSwarm(
agents=[agent],
max_loops=1,
docs_module_name="swarms.structs",
docs_directory="docs/swarms/tokenizers",
)
# Run the documentation process
doc_swarm.run(
[
load_json,
sanitize_file_path,
zip_workspace,
create_file_in_folder,
zip_folders,
]
)