File size: 1,917 Bytes
7236cee
 
 
c7eea5d
7236cee
 
 
c7eea5d
7236cee
c7eea5d
7236cee
 
 
 
 
 
c7eea5d
7236cee
 
 
 
 
c7eea5d
7236cee
c7eea5d
7236cee
 
 
c7eea5d
 
 
7236cee
 
c7eea5d
7236cee
 
 
c7eea5d
7236cee
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
from langchain_core.messages import HumanMessage, SystemMessage
from agents.coder.prompts import prompt, system_message
from langgraph.prebuilt import create_react_agent
from agents.utils.coder import initialize_project
from agents.coder.states import CoderState
from agents.models import llm_sub_agents
from langchain.tools import tool
from agents.coder import tools
from dotenv import load_dotenv
import shutil
import os

load_dotenv()

agent = create_react_agent(
    llm_sub_agents,
    tools=tools.tools,
    prompt=prompt,
    state_schema=CoderState,
)

@tool
def coder_agent(project_name: str, task_description: str, repo_owner: str = None, branch: str = "main", private: bool = False):
    """
    Coder Agent, used as a tool for any coding tasks, it creates a new project or downloads repo from GitHub to further adjust it, tests it and saves to GitHub.

    Args:
        project_name (str): The name of the GitHub repository and directory for the project.
        repo_owner (str): The owner of the GitHub repository, used only if we want to download the existing repo, not create a new project from scratch. Defaults to None (user's GitHub account)
        branch (str): The branch of the GitHub repository. Defaults to "main".
        task_description (str): A detailed description of the project for the coder to create or adjust.
        private (bool, optional): Whether the coder should be private or public. Defaults to False.
    """
    initialize_project(project_name=project_name, repo_owner=repo_owner, branch=branch, private=private)
    path = f"agents/coder/projects/{project_name}"
    messages = agent.invoke({'messages': [SystemMessage(system_message(project_name, private)), HumanMessage(content=task_description)], 'project_name': project_name, 'private': private})
    if os.path.isdir(path):
        shutil.rmtree(path, ignore_errors=True)
    return messages['messages'][-1].content