Skip to content

Commit d3a1dab

Browse files
authored
feat: top-level code agent (#564)
1 parent 114397e commit d3a1dab

39 files changed

+67
-82
lines changed

codegen-examples/examples/codegen-mcp-server/server.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import asyncio
22
from dataclasses import dataclass, field
3-
from typing import Annotated, Optional, Dict, Any, List
4-
from mcp.server.fastmcp import FastMCP
3+
from typing import Annotated, Any, Dict, List, Optional
4+
55
from codegen import Codebase
6+
from mcp.server.fastmcp import FastMCP
67

78

89
@dataclass

codegen-examples/examples/sqlalchemy_soft_delete/run.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,8 @@ def process_soft_deletes(codebase):
9292

9393

9494
if __name__ == "__main__":
95+
from codegen import Codebase
9596
from codegen.sdk.codebase.config import CodebaseConfig
96-
from codegen.sdk.core.codebase import Codebase
9797

9898
repo_path = Path("/tmp/core")
9999
repo_url = "https://github.com/hasgeek/funnel.git"

codegen-examples/examples/sqlalchemy_type_annotations/run.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
1-
import codegen
2-
1+
import os
2+
import shutil
3+
import subprocess
34

5+
import codegen
46
from codegen import Codebase
57
from codegen.sdk.core.detached_symbols.function_call import FunctionCall
6-
import subprocess
7-
import shutil
8-
import os
98

109

1110
def init_git_repo(repo_path: str) -> None:

src/codegen/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from codegen.agents.code_agent import CodeAgent
12
from codegen.cli.sdk.decorator import function
23
from codegen.cli.sdk.functions import Function
34

@@ -6,4 +7,4 @@
67
from codegen.sdk.core.codebase import Codebase
78
from codegen.shared.enums.programming_language import ProgrammingLanguage
89

9-
__all__ = ["Codebase", "Function", "ProgrammingLanguage", "function"]
10+
__all__ = ["CodeAgent", "Codebase", "Function", "ProgrammingLanguage", "function"]

src/codegen/agents/__init__.py

Whitespace-only changes.

src/codegen/agents/code_agent.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
from typing import Optional
2+
from uuid import uuid4
3+
4+
from codegen.extensions.langchain.agent import create_codebase_agent
5+
from codegen.sdk.core.codebase import Codebase
6+
7+
8+
class CodeAgent:
9+
"""Agent for interacting with a codebase."""
10+
11+
def __init__(self, codebase: Codebase):
12+
self.codebase = codebase
13+
self.agent = create_codebase_agent(self.codebase)
14+
15+
def run(self, prompt: str, session_id: Optional[str] = None) -> str:
16+
if session_id is None:
17+
session_id = str(uuid4())
18+
return self.agent.invoke(
19+
{"input": prompt},
20+
config={"configurable": {"session_id": session_id}},
21+
)

src/codegen/cli/codemod/convert.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
def convert_to_cli(input: str, language: str, name: str) -> str:
55
return f"""import codegen
6-
from codegen import Codebase
6+
from codegen.sdk.core.codebase import Codebase
77
88
99
@codegen.function('{name}')

src/codegen/cli/commands/agent/main.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
from rich.markdown import Markdown
88
from rich.prompt import Prompt
99

10-
from codegen import Codebase
1110
from codegen.extensions.langchain.agent import create_agent_with_tools
1211
from codegen.extensions.langchain.tools import (
1312
CreateFileTool,
@@ -20,6 +19,7 @@
2019
SearchTool,
2120
ViewFileTool,
2221
)
22+
from codegen.sdk.core.codebase import Codebase
2323

2424
# Suppress specific warnings
2525
warnings.filterwarnings("ignore", message=".*Helicone.*")

src/codegen/cli/commands/run/run_local.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44
from rich.panel import Panel
55
from rich.status import Status
66

7-
from codegen import Codebase
87
from codegen.cli.auth.session import CodegenSession
98
from codegen.cli.utils.function_finder import DecoratedFunction
9+
from codegen.sdk.core.codebase import Codebase
1010

1111

1212
def parse_codebase(repo_root: Path) -> Codebase:

src/codegen/cli/utils/default_code.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
DEFAULT_CODEMOD = '''import codegen
2-
from codegen import Codebase
2+
from codegen.sdk.core.codebase import Codebase
33
44
55
@codegen.function("{name}")

src/codegen/cli/utils/notebooks.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
DEFAULT_CELLS = [
66
{
77
"cell_type": "code",
8-
"source": """from codegen import Codebase
8+
"source": """from codegen.sdk.core.codebase import Codebase
99
1010
# Initialize codebase
1111
codebase = Codebase('../../')
@@ -33,7 +33,7 @@
3333
},
3434
{
3535
"cell_type": "code",
36-
"source": """from codegen import Codebase
36+
"source": """from codegen.sdk.core.codebase import Codebase
3737
3838
# Initialize FastAPI codebase
3939
print('Cloning and parsing FastAPI to /tmp/codegen/fastapi...')

src/codegen/extensions/graph/main.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
from codegen import Codebase
21
from codegen.extensions.graph.create_graph import create_codebase_graph
32
from codegen.extensions.graph.neo4j_exporter import Neo4jExporter
3+
from codegen.sdk.core.codebase import Codebase
44

55

66
def visualize_codebase(codebase, neo4j_uri: str, username: str, password: str):

src/codegen/extensions/index/code_index.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
import numpy as np
88

9-
from codegen import Codebase
9+
from codegen.sdk.core.codebase import Codebase
1010

1111
T = TypeVar("T") # Type of the items being indexed (e.g., File, Symbol)
1212

src/codegen/extensions/index/file_index.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99
from openai import OpenAI
1010
from tqdm import tqdm
1111

12-
from codegen import Codebase
1312
from codegen.extensions.index.code_index import CodeIndex
13+
from codegen.sdk.core.codebase import Codebase
1414
from codegen.sdk.core.file import File
1515

1616
logger = logging.getLogger(__name__)

src/codegen/extensions/index/symbol_index.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
from openai import OpenAI
99
from tqdm import tqdm
1010

11-
from codegen import Codebase
1211
from codegen.extensions.index.code_index import CodeIndex
12+
from codegen.sdk.core.codebase import Codebase
1313
from codegen.sdk.core.symbol import Symbol
1414

1515
logger = logging.getLogger(__name__)

src/codegen/extensions/langchain/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
from langchain_core.tools.base import BaseTool
44

5-
from codegen import Codebase
5+
from codegen.sdk.core.codebase import Codebase
66

77
from .tools import (
88
CommitTool,

src/codegen/extensions/langchain/agent.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from langchain_core.runnables.history import RunnableWithMessageHistory
1212
from langchain_openai import ChatOpenAI
1313

14-
from codegen import Codebase
14+
from codegen.sdk.core.codebase import Codebase
1515

1616
from .tools import (
1717
CreateFileTool,

src/codegen/extensions/langchain/tools.py

Lines changed: 2 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
from langchain_core.tools.base import BaseTool
77
from pydantic import BaseModel, Field
88

9-
from codegen import Codebase
109
from codegen.extensions.linear.linear_client import LinearClient
1110
from codegen.extensions.tools.bash import run_bash_command
1211
from codegen.extensions.tools.linear.linear import (
@@ -20,10 +19,10 @@
2019
from codegen.extensions.tools.link_annotation import add_links_to_message
2120
from codegen.extensions.tools.replacement_edit import replacement_edit
2221
from codegen.extensions.tools.reveal_symbol import reveal_symbol
23-
from codegen.extensions.tools.run_codemod import run_codemod
2422
from codegen.extensions.tools.search import search
2523
from codegen.extensions.tools.semantic_edit import semantic_edit
2624
from codegen.extensions.tools.semantic_search import semantic_search
25+
from codegen.sdk.core.codebase import Codebase
2726

2827
from ..tools import (
2928
commit,
@@ -712,8 +711,7 @@ def get_workspace_tools(codebase: Codebase) -> list["BaseTool"]:
712711
RenameFileTool(codebase),
713712
ReplacementEditTool(codebase),
714713
RevealSymbolTool(codebase),
715-
RunBashCommandTool(),
716-
RunCodemodTool(codebase),
714+
RunBashCommandTool(), # Note: This tool doesn't need the codebase
717715
SearchTool(codebase),
718716
SemanticEditTool(codebase),
719717
SemanticSearchTool(codebase),
@@ -774,38 +772,3 @@ def _run(
774772
count=count,
775773
)
776774
return json.dumps(result, indent=2)
777-
778-
779-
class RunCodemodInput(BaseModel):
780-
"""Input for running a codemod."""
781-
782-
codemod_source: str = Field(
783-
...,
784-
description="""Source code of the codemod function. Must define a 'run(codebase: Codebase)' function that makes the desired changes.
785-
Example:
786-
```python
787-
def run(codebase: Codebase):
788-
for file in codebase.files:
789-
if file.filepath.endswith('.py'):
790-
content = file.content
791-
# Make changes to content
792-
file.edit(new_content)
793-
```
794-
""",
795-
)
796-
797-
798-
class RunCodemodTool(BaseTool):
799-
"""Tool for running custom codemod functions."""
800-
801-
name: ClassVar[str] = "run_codemod"
802-
description: ClassVar[str] = "Run a custom codemod function to make systematic changes across the codebase"
803-
args_schema: ClassVar[type[BaseModel]] = RunCodemodInput
804-
codebase: Codebase = Field(exclude=True)
805-
806-
def __init__(self, codebase: Codebase) -> None:
807-
super().__init__(codebase=codebase)
808-
809-
def _run(self, codemod_source: str) -> str:
810-
result = run_codemod(self.codebase, codemod_source)
811-
return json.dumps(result, indent=2)

src/codegen/extensions/tools/commit.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
from pydantic import Field
66

7-
from codegen import Codebase
7+
from codegen.sdk.core.codebase import Codebase
88

99
from .observation import Observation
1010

src/codegen/extensions/tools/create_file.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
from pydantic import Field
66

7-
from codegen import Codebase
7+
from codegen.sdk.core.codebase import Codebase
88

99
from .observation import Observation
1010
from .view_file import ViewFileObservation, view_file

src/codegen/extensions/tools/delete_file.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
from pydantic import Field
66

7-
from codegen import Codebase
7+
from codegen.sdk.core.codebase import Codebase
88

99
from .observation import Observation
1010

src/codegen/extensions/tools/edit_file.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
from pydantic import Field
66

7-
from codegen import Codebase
7+
from codegen.sdk.core.codebase import Codebase
88

99
from .observation import Observation
1010
from .view_file import ViewFileObservation, view_file

src/codegen/extensions/tools/github/create_pr.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from github import GithubException
77
from pydantic import Field
88

9-
from codegen import Codebase
9+
from codegen.sdk.core.codebase import Codebase
1010

1111
from ..observation import Observation
1212

src/codegen/extensions/tools/github/create_pr_comment.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
from pydantic import Field
66

7-
from codegen import Codebase
7+
from codegen.sdk.core.codebase import Codebase
88

99
from ..observation import Observation
1010

src/codegen/extensions/tools/github/create_pr_review_comment.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
from pydantic import Field
66

7-
from codegen import Codebase
7+
from codegen.sdk.core.codebase import Codebase
88

99
from ..observation import Observation
1010

src/codegen/extensions/tools/github/view_pr.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
from pydantic import Field
66

7-
from codegen import Codebase
7+
from codegen.sdk.core.codebase import Codebase
88

99
from ..observation import Observation
1010

src/codegen/extensions/tools/link_annotation.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from enum import StrEnum
55
from typing import Callable
66

7-
from codegen import Codebase
7+
from codegen.sdk.core.codebase import Codebase
88

99

1010
class MessageChannel(StrEnum):

src/codegen/extensions/tools/list_directory.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
from pydantic import BaseModel, Field
66

7-
from codegen import Codebase
7+
from codegen.sdk.core.codebase import Codebase
88
from codegen.sdk.core.directory import Directory
99

1010
from .observation import Observation

src/codegen/extensions/tools/move_symbol.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
from pydantic import Field
66

7-
from codegen import Codebase
7+
from codegen.sdk.core.codebase import Codebase
88

99
from .observation import Observation
1010
from .view_file import ViewFileObservation, view_file

src/codegen/extensions/tools/rename_file.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
from pydantic import Field
66

7-
from codegen import Codebase
7+
from codegen.sdk.core.codebase import Codebase
88

99
from .observation import Observation
1010
from .view_file import ViewFileObservation, view_file

src/codegen/extensions/tools/replacement_edit.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
from pydantic import Field
88

9-
from codegen import Codebase
9+
from codegen.sdk.core.codebase import Codebase
1010

1111
from .observation import Observation
1212
from .view_file import add_line_numbers

src/codegen/extensions/tools/reveal_symbol.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
import tiktoken
66
from pydantic import Field
77

8-
from codegen import Codebase
98
from codegen.sdk.ai.utils import count_tokens
9+
from codegen.sdk.core.codebase import Codebase
1010
from codegen.sdk.core.external_module import ExternalModule
1111
from codegen.sdk.core.import_resolution import Import
1212
from codegen.sdk.core.symbol import Symbol

0 commit comments

Comments
 (0)