diff --git a/README.md b/README.md index 44ab208e..380132e1 100644 --- a/README.md +++ b/README.md @@ -89,9 +89,8 @@ See the [usage guide](./Usage.md) for instructions how to run the different tool - [Overview](#overview) - [Try it now](#try-it-now) - [Installation](#installation) -- [Usage guide](./Usage.md) - [How it works](#how-it-works) -- [Why use PR-Agent](#why-use-pr-agent) +- [Why use PR-Agent?](#why-use-pr-agent) - [Roadmap](#roadmap) @@ -105,8 +104,8 @@ See the [usage guide](./Usage.md) for instructions how to run the different tool | | Auto-Description | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | | Improve Code | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | :white_check_mark: | | | ⮑ Extended | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | :white_check_mark: | -| | Reflect and Review | :white_check_mark: | | :white_check_mark: | | :white_check_mark: | :white_check_mark: | -| | Update CHANGELOG.md | :white_check_mark: | | :white_check_mark: | | | | +| | Reflect and Review | :white_check_mark: | :white_check_mark: | :white_check_mark: | | :white_check_mark: | :white_check_mark: | +| | Update CHANGELOG.md | :white_check_mark: | :white_check_mark: | :white_check_mark: | | | | | | Find similar issue | :white_check_mark: | | | | | | | | | | | | | | | USAGE | CLI | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | diff --git a/pr_agent/tools/pr_code_suggestions.py b/pr_agent/tools/pr_code_suggestions.py index ba45598e..4ba27dd8 100644 --- a/pr_agent/tools/pr_code_suggestions.py +++ b/pr_agent/tools/pr_code_suggestions.py @@ -48,27 +48,33 @@ class PRCodeSuggestions: get_settings().pr_code_suggestions_prompt.user) async def run(self): - logging.info('Generating code suggestions for PR...') - if get_settings().config.publish_output: - self.git_provider.publish_comment("Preparing review...", is_temporary=True) + try: + logging.info('Generating code suggestions for PR...') + if get_settings().config.publish_output: + self.git_provider.publish_comment("Preparing review...", is_temporary=True) - logging.info('Preparing PR review...') - if not self.is_extended: - await retry_with_fallback_models(self._prepare_prediction) - data = self._prepare_pr_code_suggestions() - else: - data = await retry_with_fallback_models(self._prepare_prediction_extended) + logging.info('Preparing PR review...') + if not self.is_extended: + await retry_with_fallback_models(self._prepare_prediction) + data = self._prepare_pr_code_suggestions() + else: + data = await retry_with_fallback_models(self._prepare_prediction_extended) + if (not data) or (not 'Code suggestions' in data): + logging.info('No code suggestions found for PR.') + return - if (not self.is_extended and get_settings().pr_code_suggestions.rank_suggestions) or \ - (self.is_extended and get_settings().pr_code_suggestions.rank_extended_suggestions): - logging.info('Ranking Suggestions...') - data['Code suggestions'] = await self.rank_suggestions(data['Code suggestions']) + if (not self.is_extended and get_settings().pr_code_suggestions.rank_suggestions) or \ + (self.is_extended and get_settings().pr_code_suggestions.rank_extended_suggestions): + logging.info('Ranking Suggestions...') + data['Code suggestions'] = await self.rank_suggestions(data['Code suggestions']) - if get_settings().config.publish_output: - logging.info('Pushing PR review...') - self.git_provider.remove_initial_comment() - logging.info('Pushing inline code suggestions...') - self.push_inline_code_suggestions(data) + if get_settings().config.publish_output: + logging.info('Pushing PR review...') + self.git_provider.remove_initial_comment() + logging.info('Pushing inline code suggestions...') + self.push_inline_code_suggestions(data) + except Exception as e: + logging.error(f"Failed to generate code suggestions for PR, error: {e}") async def _prepare_prediction(self, model: str): logging.info('Getting PR diff...') diff --git a/pr_agent/tools/pr_description.py b/pr_agent/tools/pr_description.py index 3c388eb4..d9600a2e 100644 --- a/pr_agent/tools/pr_description.py +++ b/pr_agent/tools/pr_description.py @@ -63,40 +63,44 @@ class PRDescription: """ Generates a PR description using an AI model and publishes it to the PR. """ - logging.info(f"Generating a PR description {self.pr_id}") - if get_settings().config.publish_output: - self.git_provider.publish_comment("Preparing pr description...", is_temporary=True) - await retry_with_fallback_models(self._prepare_prediction) + try: + logging.info(f"Generating a PR description {self.pr_id}") + if get_settings().config.publish_output: + self.git_provider.publish_comment("Preparing pr description...", is_temporary=True) - logging.info(f"Preparing answer {self.pr_id}") - if self.prediction: - self._prepare_data() - else: - return None + await retry_with_fallback_models(self._prepare_prediction) - pr_labels = [] - if get_settings().pr_description.publish_labels: - pr_labels = self._prepare_labels() - - if get_settings().pr_description.use_description_markers: - pr_title, pr_body = self._prepare_pr_answer_with_markers() - else: - pr_title, pr_body, = self._prepare_pr_answer() - full_markdown_description = f"## Title\n\n{pr_title}\n\n___\n{pr_body}" - - if get_settings().config.publish_output: - logging.info(f"Pushing answer {self.pr_id}") - if get_settings().pr_description.publish_description_as_comment: - self.git_provider.publish_comment(full_markdown_description) + logging.info(f"Preparing answer {self.pr_id}") + if self.prediction: + self._prepare_data() else: - self.git_provider.publish_description(pr_title, pr_body) - if get_settings().pr_description.publish_labels and self.git_provider.is_supported("get_labels"): - current_labels = self.git_provider.get_labels() - if current_labels is None: - current_labels = [] - self.git_provider.publish_labels(pr_labels + current_labels) - self.git_provider.remove_initial_comment() + return None + + pr_labels = [] + if get_settings().pr_description.publish_labels: + pr_labels = self._prepare_labels() + + if get_settings().pr_description.use_description_markers: + pr_title, pr_body = self._prepare_pr_answer_with_markers() + else: + pr_title, pr_body, = self._prepare_pr_answer() + full_markdown_description = f"## Title\n\n{pr_title}\n\n___\n{pr_body}" + + if get_settings().config.publish_output: + logging.info(f"Pushing answer {self.pr_id}") + if get_settings().pr_description.publish_description_as_comment: + self.git_provider.publish_comment(full_markdown_description) + else: + self.git_provider.publish_description(pr_title, pr_body) + if get_settings().pr_description.publish_labels and self.git_provider.is_supported("get_labels"): + current_labels = self.git_provider.get_labels() + if current_labels is None: + current_labels = [] + self.git_provider.publish_labels(pr_labels + current_labels) + self.git_provider.remove_initial_comment() + except Exception as e: + logging.error(f"Error generating PR description {self.pr_id}: {e}") return "" diff --git a/pr_agent/tools/pr_reviewer.py b/pr_agent/tools/pr_reviewer.py index b6bca536..01e3f276 100644 --- a/pr_agent/tools/pr_reviewer.py +++ b/pr_agent/tools/pr_reviewer.py @@ -95,28 +95,32 @@ class PRReviewer: """ Review the pull request and generate feedback. """ - if self.is_auto and not get_settings().pr_reviewer.automatic_review: - logging.info(f'Automatic review is disabled {self.pr_url}') - return None - logging.info(f'Reviewing PR: {self.pr_url} ...') + try: + if self.is_auto and not get_settings().pr_reviewer.automatic_review: + logging.info(f'Automatic review is disabled {self.pr_url}') + return None - if get_settings().config.publish_output: - self.git_provider.publish_comment("Preparing review...", is_temporary=True) - - await retry_with_fallback_models(self._prepare_prediction) - - logging.info('Preparing PR review...') - pr_comment = self._prepare_pr_review() - - if get_settings().config.publish_output: - logging.info('Pushing PR review...') - self.git_provider.publish_comment(pr_comment) - self.git_provider.remove_initial_comment() - - if get_settings().pr_reviewer.inline_code_comments: - logging.info('Pushing inline code comments...') - self._publish_inline_code_comments() + logging.info(f'Reviewing PR: {self.pr_url} ...') + + if get_settings().config.publish_output: + self.git_provider.publish_comment("Preparing review...", is_temporary=True) + + await retry_with_fallback_models(self._prepare_prediction) + + logging.info('Preparing PR review...') + pr_comment = self._prepare_pr_review() + + if get_settings().config.publish_output: + logging.info('Pushing PR review...') + self.git_provider.publish_comment(pr_comment) + self.git_provider.remove_initial_comment() + + if get_settings().pr_reviewer.inline_code_comments: + logging.info('Pushing inline code comments...') + self._publish_inline_code_comments() + except Exception as e: + logging.error(f"Failed to review PR: {e}") async def _prepare_prediction(self, model: str) -> None: """