Skip to content

Commit aeee0ae

Browse files
Merge branch 'main' into fix/git-diff-windows-path-case
2 parents de91c13 + e680f74 commit aeee0ae

3 files changed

Lines changed: 44 additions & 11 deletions

File tree

codeflash/api/aiservice.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
from codeflash.models.models import (
2222
AIServiceRefinerRequest,
2323
CodeStringsMarkdown,
24+
OptimizationReviewResult,
2425
OptimizedCandidate,
2526
OptimizedCandidateSource,
2627
)
@@ -652,7 +653,7 @@ def get_optimization_review(
652653
replay_tests: str,
653654
concolic_tests: str, # noqa: ARG002
654655
calling_fn_details: str,
655-
) -> str:
656+
) -> OptimizationReviewResult:
656657
"""Compute the optimization review of current Pull Request.
657658
658659
Args:
@@ -670,7 +671,7 @@ def get_optimization_review(
670671
671672
Returns:
672673
-------
673-
- 'high', 'medium' or 'low' optimization review
674+
OptimizationReviewResult with review ('high', 'medium', 'low', or '') and explanation
674675
675676
"""
676677
diff_str = "\n".join(
@@ -706,18 +707,21 @@ def get_optimization_review(
706707
except requests.exceptions.RequestException as e:
707708
logger.exception(f"Error generating optimization refinements: {e}")
708709
ph("cli-optimize-error-caught", {"error": str(e)})
709-
return ""
710+
return OptimizationReviewResult(review="", explanation="")
710711

711712
if response.status_code == 200:
712-
return cast("str", response.json()["review"])
713+
data = response.json()
714+
return OptimizationReviewResult(
715+
review=cast("str", data["review"]), explanation=cast("str", data.get("review_explanation", ""))
716+
)
713717
try:
714718
error = cast("str", response.json()["error"])
715719
except Exception:
716720
error = response.text
717721
logger.error(f"Error generating optimization review: {response.status_code} - {error}")
718722
ph("cli-optimize-error-response", {"response_status_code": response.status_code, "error": error})
719723
console.rule()
720-
return ""
724+
return OptimizationReviewResult(review="", explanation="")
721725

722726
def generate_workflow_steps(
723727
self,

codeflash/models/models.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
from enum import Enum, IntEnum
2121
from pathlib import Path
2222
from re import Pattern
23-
from typing import Annotated, Optional, cast
23+
from typing import Annotated, NamedTuple, Optional, cast
2424

2525
from jedi.api.classes import Name
2626
from pydantic import AfterValidator, BaseModel, ConfigDict, Field, PrivateAttr, ValidationError
@@ -95,6 +95,13 @@ class AIServiceCodeRepairRequest:
9595
test_diffs: list[TestDiff]
9696

9797

98+
class OptimizationReviewResult(NamedTuple):
99+
"""Result from the optimization review API."""
100+
101+
review: str # "high", "medium", "low", or ""
102+
explanation: str
103+
104+
98105
# If the method spam is in the class Ham, which is at the top level of the module eggs in the package foo, the fully
99106
# qualified name of the method is foo.eggs.Ham.spam, its qualified name is Ham.spam, and its name is spam. The full name
100107
# of the module is foo.eggs.

codeflash/optimization/function_optimizer.py

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@
8585
CodeOptimizationContext,
8686
GeneratedTests,
8787
GeneratedTestsList,
88+
OptimizationReviewResult,
8889
OptimizationSet,
8990
OptimizedCandidate,
9091
OptimizedCandidateResult,
@@ -1840,19 +1841,40 @@ def process_review(
18401841

18411842
raise_pr = not self.args.no_pr
18421843
staging_review = self.args.staging_review
1843-
opt_review_response = ""
1844+
opt_review_result = OptimizationReviewResult(review="", explanation="")
18441845
# this will now run regardless of pr, staging review flags
18451846
try:
1846-
opt_review_response = self.aiservice_client.get_optimization_review(
1847+
opt_review_result = self.aiservice_client.get_optimization_review(
18471848
**data, calling_fn_details=function_references
18481849
)
18491850
except Exception as e:
18501851
logger.debug(f"optimization review response failed, investigate {e}")
1851-
data["optimization_review"] = opt_review_response
1852-
self.optimization_review = opt_review_response
1852+
data["optimization_review"] = opt_review_result.review
1853+
self.optimization_review = opt_review_result.review
1854+
1855+
# Display the reviewer result to the user
1856+
if opt_review_result.review:
1857+
review_display = {
1858+
"high": ("[bold green]High[/bold green]", "green", "Recommended to merge"),
1859+
"medium": ("[bold yellow]Medium[/bold yellow]", "yellow", "Review recommended before merging"),
1860+
"low": ("[bold red]Low[/bold red]", "red", "Not recommended to merge"),
1861+
}
1862+
display_info = review_display.get(opt_review_result.review.lower(), ("[bold]Unknown[/bold]", "white", ""))
1863+
explanation_text = opt_review_result.explanation.strip() if opt_review_result.explanation else ""
1864+
if is_LSP_enabled():
1865+
md_content = f"### Reviewer Assessment: {opt_review_result.review.capitalize()}\n{display_info[2]}"
1866+
if explanation_text:
1867+
md_content += f"\n\n{explanation_text}"
1868+
lsp_log(LspMarkdownMessage(markdown=md_content))
1869+
else:
1870+
panel_content = f"Reviewer Assessment: {display_info[0]}\n{display_info[2]}"
1871+
if explanation_text:
1872+
panel_content += f"\n\n[dim]{explanation_text}[/dim]"
1873+
console.print(Panel(panel_content, title="Optimization Review", border_style=display_info[1]))
1874+
18531875
if raise_pr or staging_review:
18541876
data["root_dir"] = git_root_dir()
1855-
if raise_pr and not staging_review and opt_review_response != "low":
1877+
if raise_pr and not staging_review and opt_review_result.review != "low":
18561878
# Ensure root_dir is set for PR creation (needed for async functions that skip opt_review)
18571879
if "root_dir" not in data:
18581880
data["root_dir"] = git_root_dir()

0 commit comments

Comments
 (0)