diff --git a/docs/docs/tools/describe.md b/docs/docs/tools/describe.md
index 1510b2e82..50d2af0a7 100644
--- a/docs/docs/tools/describe.md
+++ b/docs/docs/tools/describe.md
@@ -69,22 +69,6 @@ If you prefer to have the file summaries appear in the "Files changed" tab on ev
**Note**: that this feature is currently available only for GitHub.
-### Handle custom labels from the Repo's labels page 💎
-
-You can control the custom labels that will be suggested by the `describe` tool, from the repo's labels page:
-
-* GitHub : go to `https://github.com/{owner}/{repo}/labels` (or click on the "Labels" tab in the issues or PRs page)
-* GitLab : go to `https://gitlab.com/{owner}/{repo}/-/labels` (or click on "Manage" -> "Labels" on the left menu)
-
-Now add/edit the custom labels. they should be formatted as follows:
-
-* Label name: The name of the custom label.
-* Description: Start the description of with prefix `pr_agent:`, for example: `pr_agent: Description of when AI should suggest this label`.
-
-The description should be comprehensive and detailed, indicating when to add the desired label. For example:
-![Add native custom labels](https://codium.ai/images/pr_agent/add_native_custom_labels.png){width=768}
-
-
### Markers template
To enable markers, set `pr_description.use_description_markers=true`.
@@ -117,6 +101,43 @@ The marker `pr_agent:type` will be replaced with the PR type, `pr_agent:summary`
- `use_description_markers`: if set to true, the tool will use markers template. It replaces every marker of the form `pr_agent:marker_name` with the relevant content. Default is false.
- `include_generated_by_header`: if set to true, the tool will add a dedicated header: 'Generated by PR Agent at ...' to any automatic content. Default is true.
+## Custom labels
+
+The default labels of the describe tool are quite generic, since they are meant to be used in any repo: [`Bug fix`, `Tests`, `Enhancement`, `Documentation`, `Other`].
+
+You can define custom labels that are relevant for your repo and use cases.
+Custom labels can be defined in a [configuration file](https://pr-agent-docs.codium.ai/tools/custom_labels/#configuration-options), or directly in the repo's [labels page](#handle-custom-labels-from-the-repos-labels-page).
+
+Examples for custom labels:
+
+ - `Main topic:performance` - pr_agent:The main topic of this PR is performance
+ - `New endpoint` - pr_agent:A new endpoint was added in this PR
+ - `SQL query` - pr_agent:A new SQL query was added in this PR
+ - `Dockerfile changes` - pr_agent:The PR contains changes in the Dockerfile
+ - ...
+
+The list above is eclectic, and aims to give an idea of different possibilities. Define custom labels that are relevant for your repo and use cases.
+Note that Labels are not mutually exclusive, so you can add multiple label categories.
+
+Make sure to provide proper title, and a detailed and well-phrased description for each label, so the tool will know when to suggest it.
+Each label description should be a **conditional statement**, that indicates if to add the label to the PR or not, according to the PR content.
+
+
+### Handle custom labels from the Repo's labels page 💎
+
+You can control the custom labels that will be suggested by the `describe` tool, from the repo's labels page:
+
+* GitHub : go to `https://github.com/{owner}/{repo}/labels` (or click on the "Labels" tab in the issues or PRs page)
+* GitLab : go to `https://gitlab.com/{owner}/{repo}/-/labels` (or click on "Manage" -> "Labels" on the left menu)
+
+Now add/edit the custom labels. they should be formatted as follows:
+
+* Label name: The name of the custom label.
+* Description: Start the description of with prefix `pr_agent:`, for example: `pr_agent: Description of when AI should suggest this label`.
+
+The description should be comprehensive and detailed, indicating when to add the desired label. For example:
+![Add native custom labels](https://codium.ai/images/pr_agent/add_native_custom_labels.png){width=768}
+
## Usage Tips
@@ -145,20 +166,3 @@ The marker `pr_agent:type` will be replaced with the PR type, `pr_agent:summary`
* `walkthrough`: the PR walkthrough.
- Note that when markers are enabled, if the original PR description does not contain any markers, the tool will not alter the description at all.
-
-!!! tip "Custom labels"
-
- The default labels of the describe tool are quite generic, since they are meant to be used in any repo: [`Bug fix`, `Tests`, `Enhancement`, `Documentation`, `Other`].
-
- If you specify [custom labels](#handle-custom-labels-from-the-repos-labels-page) in the repo's labels page, you can get tailored labels for your use cases.
- Examples for custom labels:
-
- - `Main topic:performance` - pr_agent:The main topic of this PR is performance
- - `New endpoint` - pr_agent:A new endpoint was added in this PR
- - `SQL query` - pr_agent:A new SQL query was added in this PR
- - `Dockerfile changes` - pr_agent:The PR contains changes in the Dockerfile
- - ...
-
- The list above is eclectic, and aims to give an idea of different possibilities. Define custom labels that are relevant for your repo and use cases.
- Note that Labels are not mutually exclusive, so you can add multiple label categories.
-
Make sure to provide proper title, and a detailed and well-phrased description for each label, so the tool will know when to suggest it.
diff --git a/docs/docs/tools/help.md b/docs/docs/tools/help.md
index ac66d158d..5cfc1e81f 100644
--- a/docs/docs/tools/help.md
+++ b/docs/docs/tools/help.md
@@ -1,6 +1,8 @@
## Overview
The `help` tool provides a list of all the available tools and their descriptions.
For PR-Agent Pro users, it also enables to trigger each tool by checking the relevant box.
+
+It can be invoked manually by commenting on any PR:
```
/help
```
@@ -9,5 +11,7 @@ For PR-Agent Pro users, it also enables to trigger each tool by checking the rel
An example [result](https://github.com/Codium-ai/pr-agent/pull/546#issuecomment-1868524805):
![Help 1](https://codium.ai/images/pr_agent/help1.png){width=750}
+
→
+
![Analyze 2](https://codium.ai/images/pr_agent/help2.png){width=750}
diff --git a/docs/docs/usage-guide/mail_notifications.md b/docs/docs/usage-guide/mail_notifications.md
index 82dc10a05..f25c7eaa0 100644
--- a/docs/docs/usage-guide/mail_notifications.md
+++ b/docs/docs/usage-guide/mail_notifications.md
@@ -7,3 +7,12 @@ If you are subscribed to notifications for a repo with PR-Agent, we recommend tu
As an alternative, you can filter in your mail provider the notifications specifically from the PR-Agent bot, [see how](https://www.quora.com/How-can-you-filter-emails-for-specific-people-in-Gmail#:~:text=On%20the%20Filters%20and%20Blocked,the%20body%20of%20the%20email).
![filter_mail_notifications](https://codium.ai/images/pr_agent/filter_mail_notifications.png){width=512}
+
+
+Another option to reduce the mail overload, yet still receive notifications on PR-Agent tools, is to disable the help collapsible section in PR-Agent bot comments.
+This can done by setting `enable_help_text=false` for the relevant tool in the configuration file.
+For example, to disable the help text for the `pr_reviewer` tool, set:
+```
+[pr_reviewer]
+enable_help_text = false
+```
\ No newline at end of file
diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml
index a34c1bc0d..717f42bf3 100644
--- a/docs/mkdocs.yml
+++ b/docs/mkdocs.yml
@@ -25,6 +25,7 @@ nav:
- Ask: 'tools/ask.md'
- Update Changelog: 'tools/update_changelog.md'
- Similar Issues: 'tools/similar_issues.md'
+ - Help: 'tools/help.md'
- 💎 Analyze: 'tools/analyze.md'
- 💎 Test: 'tools/test.md'
- 💎 Improve Component: 'tools/improve_component.md'
diff --git a/pr_agent/tools/pr_code_suggestions.py b/pr_agent/tools/pr_code_suggestions.py
index 926edf000..ed14d225d 100644
--- a/pr_agent/tools/pr_code_suggestions.py
+++ b/pr_agent/tools/pr_code_suggestions.py
@@ -196,24 +196,31 @@ def _prepare_pr_code_suggestions(self) -> Dict:
suggestion_list = []
one_sentence_summary_list = []
for i, suggestion in enumerate(data['code_suggestions']):
- if get_settings().pr_code_suggestions.summarize:
- if not suggestion or 'one_sentence_summary' not in suggestion or 'label' not in suggestion or 'relevant_file' not in suggestion:
- get_logger().debug(f"Skipping suggestion {i + 1}, because it is invalid: {suggestion}")
- continue
+ try:
+ if get_settings().pr_code_suggestions.summarize:
+ if not suggestion or 'one_sentence_summary' not in suggestion or 'label' not in suggestion or 'relevant_file' not in suggestion:
+ get_logger().debug(f"Skipping suggestion {i + 1}, because it is invalid: {suggestion}")
+ continue
+
+ if suggestion['one_sentence_summary'] in one_sentence_summary_list:
+ get_logger().debug(f"Skipping suggestion {i + 1}, because it is a duplicate: {suggestion}")
+ continue
- if suggestion['one_sentence_summary'] in one_sentence_summary_list:
- get_logger().debug(f"Skipping suggestion {i + 1}, because it is a duplicate: {suggestion}")
+ if 'const' in suggestion['suggestion_content'] and 'instead' in suggestion['suggestion_content'] and 'let' in suggestion['suggestion_content']:
+ get_logger().debug(f"Skipping suggestion {i + 1}, because it uses 'const instead let': {suggestion}")
continue
- if ('existing_code' in suggestion) and ('improved_code' in suggestion) and (
- suggestion['existing_code'] != suggestion['improved_code']):
- suggestion = self._truncate_if_needed(suggestion)
- if get_settings().pr_code_suggestions.summarize:
- one_sentence_summary_list.append(suggestion['one_sentence_summary'])
- suggestion_list.append(suggestion)
- else:
- get_logger().debug(
- f"Skipping suggestion {i + 1}, because existing code is equal to improved code {suggestion['existing_code']}")
+ if ('existing_code' in suggestion) and ('improved_code' in suggestion) and (
+ suggestion['existing_code'] != suggestion['improved_code']):
+ suggestion = self._truncate_if_needed(suggestion)
+ if get_settings().pr_code_suggestions.summarize:
+ one_sentence_summary_list.append(suggestion['one_sentence_summary'])
+ suggestion_list.append(suggestion)
+ else:
+ get_logger().debug(
+ f"Skipping suggestion {i + 1}, because existing code is equal to improved code {suggestion['existing_code']}")
+ except Exception as e:
+ get_logger().error(f"Error processing suggestion {i + 1}: {suggestion}, error: {e}")
data['code_suggestions'] = suggestion_list
return data