|
10 | 10 | from pydantic.json import pydantic_encoder |
11 | 11 |
|
12 | 12 | from codeflash.cli_cmds.console import console, logger |
13 | | -from codeflash.code_utils.env_utils import get_codeflash_api_key, is_LSP_enabled |
| 13 | +from codeflash.code_utils.env_utils import get_codeflash_api_key |
14 | 14 | from codeflash.code_utils.git_utils import get_last_commit_author_if_pr_exists, get_repo_owner_and_name |
| 15 | +from codeflash.lsp.helpers import is_LSP_enabled |
15 | 16 | from codeflash.models.ExperimentMetadata import ExperimentMetadata |
16 | 17 | from codeflash.models.models import AIServiceRefinerRequest, CodeStringsMarkdown, OptimizedCandidate |
17 | 18 | from codeflash.telemetry.posthog_cf import ph |
@@ -80,6 +81,19 @@ def make_ai_service_request( |
80 | 81 | # response.raise_for_status() # Will raise an HTTPError if the HTTP request returned an unsuccessful status code |
81 | 82 | return response |
82 | 83 |
|
| 84 | + def _get_valid_candidates(self, optimizations_json: list[dict[str, Any]]) -> list[OptimizedCandidate]: |
| 85 | + candidates: list[OptimizedCandidate] = [] |
| 86 | + for opt in optimizations_json: |
| 87 | + code = CodeStringsMarkdown.parse_markdown_code(opt["source_code"]) |
| 88 | + if not code.code_strings: |
| 89 | + continue |
| 90 | + candidates.append( |
| 91 | + OptimizedCandidate( |
| 92 | + source_code=code, explanation=opt["explanation"], optimization_id=opt["optimization_id"] |
| 93 | + ) |
| 94 | + ) |
| 95 | + return candidates |
| 96 | + |
83 | 97 | def optimize_python_code( # noqa: D417 |
84 | 98 | self, |
85 | 99 | source_code: str, |
@@ -134,14 +148,7 @@ def optimize_python_code( # noqa: D417 |
134 | 148 | console.rule() |
135 | 149 | end_time = time.perf_counter() |
136 | 150 | logger.debug(f"Generating optimizations took {end_time - start_time:.2f} seconds.") |
137 | | - return [ |
138 | | - OptimizedCandidate( |
139 | | - source_code=CodeStringsMarkdown.parse_markdown_code(opt["source_code"]), |
140 | | - explanation=opt["explanation"], |
141 | | - optimization_id=opt["optimization_id"], |
142 | | - ) |
143 | | - for opt in optimizations_json |
144 | | - ] |
| 151 | + return self._get_valid_candidates(optimizations_json) |
145 | 152 | try: |
146 | 153 | error = response.json()["error"] |
147 | 154 | except Exception: |
@@ -204,14 +211,7 @@ def optimize_python_code_line_profiler( # noqa: D417 |
204 | 211 | optimizations_json = response.json()["optimizations"] |
205 | 212 | logger.info(f"Generated {len(optimizations_json)} candidate optimizations using line profiler information.") |
206 | 213 | console.rule() |
207 | | - return [ |
208 | | - OptimizedCandidate( |
209 | | - source_code=CodeStringsMarkdown.parse_markdown_code(opt["source_code"]), |
210 | | - explanation=opt["explanation"], |
211 | | - optimization_id=opt["optimization_id"], |
212 | | - ) |
213 | | - for opt in optimizations_json |
214 | | - ] |
| 214 | + return self._get_valid_candidates(optimizations_json) |
215 | 215 | try: |
216 | 216 | error = response.json()["error"] |
217 | 217 | except Exception: |
@@ -261,14 +261,17 @@ def optimize_python_code_refinement(self, request: list[AIServiceRefinerRequest] |
261 | 261 | refined_optimizations = response.json()["refinements"] |
262 | 262 | logger.debug(f"Generated {len(refined_optimizations)} candidate refinements.") |
263 | 263 | console.rule() |
| 264 | + |
| 265 | + refinements = self._get_valid_candidates(refined_optimizations) |
264 | 266 | return [ |
265 | 267 | OptimizedCandidate( |
266 | | - source_code=CodeStringsMarkdown.parse_markdown_code(opt["source_code"]), |
267 | | - explanation=opt["explanation"], |
268 | | - optimization_id=opt["optimization_id"][:-4] + "refi", |
| 268 | + source_code=c.source_code, |
| 269 | + explanation=c.explanation, |
| 270 | + optimization_id=c.optimization_id[:-4] + "refi", |
269 | 271 | ) |
270 | | - for opt in refined_optimizations |
| 272 | + for c in refinements |
271 | 273 | ] |
| 274 | + |
272 | 275 | try: |
273 | 276 | error = response.json()["error"] |
274 | 277 | except Exception: |
|
0 commit comments