Skip to content

Commit 834b600

Browse files
authored
fix: remove MultiAIProvider (#555)
1 parent 95e8400 commit 834b600

File tree

20 files changed

+199
-794
lines changed

20 files changed

+199
-794
lines changed

pyproject.toml

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ readme = "README.md"
66
# renovate: datasource=python-version depName=python
77
requires-python = ">=3.12, <3.14"
88
dependencies = [
9-
"backoff==2.2.1",
109
"openai==1.63.2",
1110
"tiktoken<1.0.0,>=0.5.1",
1211
"tabulate>=0.9.0,<1.0.0",
@@ -31,14 +30,12 @@ dependencies = [
3130
"plotly>=5.24.0,<7.0.0",
3231
"humanize<5.0.0,>=4.10.0",
3332
"pytest-snapshot>=0.9.0",
34-
"anthropic==0.23.1",
3533
"pyjson5==1.6.8",
3634
"mini-racer>=0.12.4",
3735
"rustworkx>=0.15.1",
3836
"typing-extensions>=4.12.2",
3937
"termcolor>=2.4.0",
4038
"sentry-sdk==2.22.0",
41-
"tenacity>=9.0.0",
4239
"click>=8.1.7",
4340
"requests>=2.32.3",
4441
"lazy-object-proxy>=0.0.0",
@@ -72,6 +69,7 @@ dependencies = [
7269
"neo4j",
7370
"modal>=0.73.45",
7471
"slack-sdk",
72+
"langchain-anthropic>=0.3.7",
7573
]
7674

7775
license = { text = "Apache-2.0" }

src/codegen/extensions/events/linear.py

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

66
import modal # deptry: ignore
7-
from anthropic import BaseModel
7+
from pydantic import BaseModel
88

99
from codegen.extensions.clients.linear import LinearClient
1010
from codegen.extensions.events.interface import EventHandlerManagerProtocol

src/codegen/extensions/langchain/agent.py

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
"""Demo implementation of an agent with Codegen tools."""
22

3-
from langchain.agents import AgentExecutor
3+
from langchain.agents import AgentExecutor, create_tool_calling_agent
44
from langchain.agents.openai_functions_agent.base import OpenAIFunctionsAgent
55
from langchain.hub import pull
66
from langchain.tools import BaseTool
7+
from langchain_anthropic import ChatAnthropic
78
from langchain_core.chat_history import InMemoryChatMessageHistory
89
from langchain_core.messages import BaseMessage
910
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
@@ -29,7 +30,7 @@
2930

3031
def create_codebase_agent(
3132
codebase: Codebase,
32-
model_name: str = "gpt-4o",
33+
model_name: str = "claude-3-5-sonnet-latest",
3334
temperature: float = 0,
3435
verbose: bool = True,
3536
chat_history: list[BaseMessage] = [],
@@ -46,8 +47,13 @@ def create_codebase_agent(
4647
Initialized agent with message history
4748
"""
4849
# Initialize language model
49-
llm = ChatOpenAI(
50-
model_name=model_name,
50+
# llm = ChatOpenAI(
51+
# model_name=model_name,
52+
# temperature=temperature,
53+
# )
54+
55+
llm = ChatAnthropic(
56+
model="claude-3-5-sonnet-latest",
5157
temperature=temperature,
5258
)
5359

@@ -64,7 +70,8 @@ def create_codebase_agent(
6470
RevealSymbolTool(codebase),
6571
SemanticEditTool(codebase),
6672
SemanticSearchTool(codebase),
67-
# CommitTool(codebase),
73+
# =====[ Github Integration ]=====
74+
# Enable Github integration
6875
# GithubCreatePRTool(codebase),
6976
# GithubViewPRTool(codebase),
7077
# GithubCreatePRCommentTool(codebase),
@@ -128,7 +135,12 @@ def create_codebase_agent(
128135
)
129136

130137
# Create the agent
131-
agent = OpenAIFunctionsAgent(
138+
# agent = OpenAIFunctionsAgent(
139+
# llm=llm,
140+
# tools=tools,
141+
# prompt=prompt,
142+
# )
143+
agent = create_tool_calling_agent(
132144
llm=llm,
133145
tools=tools,
134146
prompt=prompt,

src/codegen/extensions/tools/reveal_symbol.py

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,12 @@
33
import tiktoken
44

55
from codegen import Codebase
6+
from codegen.sdk.ai.utils import count_tokens
67
from codegen.sdk.core.external_module import ExternalModule
78
from codegen.sdk.core.import_resolution import Import
89
from codegen.sdk.core.symbol import Symbol
910

1011

11-
def count_tokens(text: str) -> int:
12-
"""Count the number of tokens in a string using GPT tokenizer."""
13-
enc = tiktoken.get_encoding("cl100k_base") # GPT-4 encoding
14-
return len(enc.encode(text))
15-
16-
1712
def truncate_source(source: str, max_tokens: int) -> str:
1813
"""Truncate source code to fit within max_tokens while preserving meaning.
1914

src/codegen/extensions/tools/semantic_edit.py

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,13 @@
33
import difflib
44
import re
55

6+
from langchain_anthropic import ChatAnthropic
67
from langchain_core.prompts import ChatPromptTemplate
7-
from langchain_openai import ChatOpenAI
88

99
from codegen import Codebase
1010

1111
from .tool_prompts import _HUMAN_PROMPT_DRAFT_EDITOR, _SYSTEM_PROMPT_DRAFT_EDITOR
12+
from .view_file import add_line_numbers
1213

1314

1415
def generate_diff(original: str, modified: str) -> str:
@@ -117,15 +118,25 @@ def semantic_edit(codebase: Codebase, filepath: str, edit_content: str, start: i
117118
original_content = file.content
118119
original_lines = original_content.split("\n")
119120

121+
# Check if file is too large for full edit
122+
MAX_LINES = 300
123+
if len(original_lines) > MAX_LINES and start == 1 and end == -1:
124+
return {
125+
"error": (
126+
f"File is {len(original_lines)} lines long. For files longer than {MAX_LINES} lines, "
127+
"please specify a line range using start and end parameters. "
128+
"You may need to make multiple targeted edits."
129+
),
130+
"status": "error",
131+
"line_count": len(original_lines),
132+
}
133+
120134
# Handle append mode
121135
if start == -1 and end == -1:
122136
try:
123137
file.add_symbol_from_source(edit_content)
124138
codebase.commit()
125139

126-
# Analyze changes for append
127-
new_lines = file.content.split("\n")
128-
129140
return {"filepath": filepath, "content": file.content, "diff": generate_diff(original_content, file.content), "status": "success"}
130141
except Exception as e:
131142
msg = f"Failed to append content: {e!s}"
@@ -144,10 +155,10 @@ def semantic_edit(codebase: Codebase, filepath: str, edit_content: str, start: i
144155
system_message = _SYSTEM_PROMPT_DRAFT_EDITOR
145156
human_message = _HUMAN_PROMPT_DRAFT_EDITOR
146157
prompt = ChatPromptTemplate.from_messages([system_message, human_message])
147-
llm = ChatOpenAI(
148-
model="gpt-4o",
158+
llm = ChatAnthropic(
159+
model="claude-3-5-sonnet-latest",
149160
temperature=0,
150-
max_tokens=10000,
161+
max_tokens=5000,
151162
)
152163
chain = prompt | llm
153164
response = chain.invoke({"original_file_section": original_file_section, "edit_content": edit_content})
@@ -173,4 +184,4 @@ def semantic_edit(codebase: Codebase, filepath: str, edit_content: str, start: i
173184
file.edit(new_content)
174185
codebase.commit()
175186

176-
return {"filepath": filepath, "diff": diff, "status": "success"}
187+
return {"filepath": filepath, "diff": diff, "status": "success", "new_content": add_line_numbers(new_content)}

src/codegen/extensions/tools/semantic_search.py

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -69,18 +69,12 @@ def semantic_search(
6969

7070
# Format results with previews
7171
formatted_results = []
72-
for filepath, score in results:
73-
try:
74-
file = codebase.get_file(filepath)
75-
preview = file.content[:preview_length].replace("\n", " ").strip()
76-
if len(file.content) > preview_length:
77-
preview += "..."
72+
for file, score in results:
73+
preview = file.content[:preview_length].replace("\n", " ").strip()
74+
if len(file.content) > preview_length:
75+
preview += "..."
7876

79-
formatted_results.append({"filepath": filepath, "score": float(score), "preview": preview})
80-
except Exception as e:
81-
# Skip files that can't be read
82-
print(f"Warning: Could not read file {filepath}: {e}")
83-
continue
77+
formatted_results.append({"filepath": file.filepath, "score": float(score), "preview": preview})
8478

8579
return {"status": "success", "query": query, "results": formatted_results}
8680

src/codegen/gscli/generate/commands.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from codegen.gscli.generate.runner_imports import _generate_runner_imports
1212
from codegen.gscli.generate.system_prompt import get_system_prompt
1313
from codegen.gscli.generate.utils import LanguageType, generate_builtins_file
14-
from codegen.sdk.ai.helpers import AnthropicHelper
14+
from codegen.sdk.ai.client import get_openai_client
1515
from codegen.sdk.code_generation.changelog_generation import generate_changelog
1616
from codegen.sdk.code_generation.codegen_sdk_codebase import get_codegen_sdk_codebase
1717
from codegen.sdk.code_generation.doc_utils.generate_docs_json import generate_docs_json
@@ -201,9 +201,9 @@ def generate_codegen_sdk_docs(docs_dir: str) -> None:
201201

202202
@generate.command()
203203
@click.option("--docs-dir", default="docs", required=False)
204-
@click.option("--anthropic-key", required=True)
204+
@click.option("--openai-key", required=True)
205205
@click.option("--complete", is_flag=True, help="Generate a complete changelog for the codegen_sdk API")
206-
def changelog(docs_dir: str, anthropic_key: str, complete: bool = False) -> None:
206+
def changelog(docs_dir: str, openai_key: str, complete: bool = False) -> None:
207207
"""Generate the changelog for the codegen_sdk API and update the changelog.mdx file"""
208208
print(colored("Generating changelog", "green"))
209209
header = """---
@@ -212,8 +212,8 @@ def changelog(docs_dir: str, anthropic_key: str, complete: bool = False) -> None
212212
iconType: "solid"
213213
---
214214
"""
215-
# Generate the changelog for the codegen_sdk API and update the changelog.mdx file
216-
client = AnthropicHelper(anthropic_key=anthropic_key, cache=True, openai_anthropic_translation=False)
215+
216+
client = get_openai_client(openai_key)
217217

218218
if complete:
219219
entire_release_history = generate_changelog(client)

src/codegen/runner/sandbox/runner.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111
from codegen.sdk.codebase.config import CodebaseConfig, ProjectConfig, SessionOptions
1212
from codegen.sdk.codebase.factory.codebase_factory import CodebaseType
1313
from codegen.sdk.core.codebase import Codebase
14-
from codegen.sdk.secrets import Secrets
1514
from codegen.shared.compilation.string_to_code import create_execute_function_from_codeblock
15+
from codegen.shared.configs.models.secrets import SecretsConfig
1616
from codegen.shared.configs.session_configs import config
1717
from codegen.shared.performance.stopwatch_utils import stopwatch
1818

@@ -47,7 +47,7 @@ async def warmup(self) -> None:
4747
async def _build_graph(self) -> Codebase:
4848
logger.info("> Building graph...")
4949
projects = [ProjectConfig(programming_language=self.repo.language, repo_operator=self.op, base_path=self.repo.base_path, subdirectories=self.repo.subdirectories)]
50-
secrets = Secrets(openai_key=config.secrets.openai_api_key)
50+
secrets = SecretsConfig(openai_api_key=config.secrets.openai_api_key)
5151
codebase_config = CodebaseConfig(secrets=secrets, feature_flags=config.feature_flags.codebase)
5252
return Codebase(projects=projects, config=codebase_config)
5353

src/codegen/sdk/ai/client.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from openai import OpenAI
2+
3+
4+
def get_openai_client(key: str) -> OpenAI:
5+
return OpenAI(api_key=key)

src/codegen/sdk/ai/converters.py

Lines changed: 0 additions & 105 deletions
This file was deleted.

0 commit comments

Comments
 (0)