diff --git a/README.md b/README.md index 720277a0..12252194 100644 --- a/README.md +++ b/README.md @@ -86,14 +86,12 @@ See the [usage guide](./Usage.md) for instructions how to run the different tool
## Table of Contents -- [Table of Contents](#table-of-contents) - [Overview](#overview) - [Try it now](#try-it-now) - [Installation](#installation) - [How it works](#how-it-works) - [Why use PR-Agent?](#why-use-pr-agent) - [Roadmap](#roadmap) -- [Similar Projects](#similar-projects)
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: """