mirror of
https://github.com/qodo-ai/pr-agent.git
synced 2025-07-01 19:30:40 +08:00
Format files by pre-commit run -a
Signed-off-by: Yu Ishikawa <yu-iskw@users.noreply.github.com>
This commit is contained in:
2
.github/workflows/build-and-test.yaml
vendored
2
.github/workflows/build-and-test.yaml
vendored
@ -37,5 +37,3 @@ jobs:
|
|||||||
name: Test dev docker
|
name: Test dev docker
|
||||||
run: |
|
run: |
|
||||||
docker run --rm codiumai/pr-agent:test pytest -v tests/unittest
|
docker run --rm codiumai/pr-agent:test pytest -v tests/unittest
|
||||||
|
|
||||||
|
|
||||||
|
4
.github/workflows/code_coverage.yaml
vendored
4
.github/workflows/code_coverage.yaml
vendored
@ -37,7 +37,7 @@ jobs:
|
|||||||
- id: code_cov
|
- id: code_cov
|
||||||
name: Test dev docker
|
name: Test dev docker
|
||||||
run: |
|
run: |
|
||||||
docker run --name test_container codiumai/pr-agent:test pytest tests/unittest --cov=pr_agent --cov-report term --cov-report xml:coverage.xml
|
docker run --name test_container codiumai/pr-agent:test pytest tests/unittest --cov=pr_agent --cov-report term --cov-report xml:coverage.xml
|
||||||
docker cp test_container:/app/coverage.xml coverage.xml
|
docker cp test_container:/app/coverage.xml coverage.xml
|
||||||
docker rm test_container
|
docker rm test_container
|
||||||
|
|
||||||
@ -51,4 +51,4 @@ jobs:
|
|||||||
- name: Upload coverage to Codecov
|
- name: Upload coverage to Codecov
|
||||||
uses: codecov/codecov-action@v4.0.1
|
uses: codecov/codecov-action@v4.0.1
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.CODECOV_TOKEN }}
|
token: ${{ secrets.CODECOV_TOKEN }}
|
||||||
|
6
.github/workflows/docs-ci.yaml
vendored
6
.github/workflows/docs-ci.yaml
vendored
@ -1,4 +1,4 @@
|
|||||||
name: docs-ci
|
name: docs-ci
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
@ -20,14 +20,14 @@ jobs:
|
|||||||
- uses: actions/setup-python@v5
|
- uses: actions/setup-python@v5
|
||||||
with:
|
with:
|
||||||
python-version: 3.x
|
python-version: 3.x
|
||||||
- run: echo "cache_id=$(date --utc '+%V')" >> $GITHUB_ENV
|
- run: echo "cache_id=$(date --utc '+%V')" >> $GITHUB_ENV
|
||||||
- uses: actions/cache@v4
|
- uses: actions/cache@v4
|
||||||
with:
|
with:
|
||||||
key: mkdocs-material-${{ env.cache_id }}
|
key: mkdocs-material-${{ env.cache_id }}
|
||||||
path: .cache
|
path: .cache
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
mkdocs-material-
|
mkdocs-material-
|
||||||
- run: pip install mkdocs-material
|
- run: pip install mkdocs-material
|
||||||
- run: pip install "mkdocs-material[imaging]"
|
- run: pip install "mkdocs-material[imaging]"
|
||||||
- run: pip install mkdocs-glightbox
|
- run: pip install mkdocs-glightbox
|
||||||
- run: mkdocs gh-deploy -f docs/mkdocs.yml --force
|
- run: mkdocs gh-deploy -f docs/mkdocs.yml --force
|
||||||
|
2
.github/workflows/e2e_tests.yaml
vendored
2
.github/workflows/e2e_tests.yaml
vendored
@ -43,4 +43,4 @@ jobs:
|
|||||||
- id: test3
|
- id: test3
|
||||||
name: E2E bitbucket app
|
name: E2E bitbucket app
|
||||||
run: |
|
run: |
|
||||||
docker run -e BITBUCKET.USERNAME=${{ secrets.BITBUCKET_USERNAME }} -e BITBUCKET.PASSWORD=${{ secrets.BITBUCKET_PASSWORD }} --rm codiumai/pr-agent:test pytest -v tests/e2e_tests/test_bitbucket_app.py
|
docker run -e BITBUCKET.USERNAME=${{ secrets.BITBUCKET_USERNAME }} -e BITBUCKET.PASSWORD=${{ secrets.BITBUCKET_PASSWORD }} --rm codiumai/pr-agent:test pytest -v tests/e2e_tests/test_bitbucket_app.py
|
||||||
|
5
.github/workflows/pr-agent-review.yaml
vendored
5
.github/workflows/pr-agent-review.yaml
vendored
@ -1,4 +1,4 @@
|
|||||||
# This workflow enables developers to call PR-Agents `/[actions]` in PR's comments and upon PR creation.
|
# This workflow enables developers to call PR-Agents `/[actions]` in PR's comments and upon PR creation.
|
||||||
# Learn more at https://www.codium.ai/pr-agent/
|
# Learn more at https://www.codium.ai/pr-agent/
|
||||||
# This is v0.2 of this workflow file
|
# This is v0.2 of this workflow file
|
||||||
|
|
||||||
@ -30,6 +30,3 @@ jobs:
|
|||||||
GITHUB_ACTION_CONFIG.AUTO_DESCRIBE: true
|
GITHUB_ACTION_CONFIG.AUTO_DESCRIBE: true
|
||||||
GITHUB_ACTION_CONFIG.AUTO_REVIEW: true
|
GITHUB_ACTION_CONFIG.AUTO_REVIEW: true
|
||||||
GITHUB_ACTION_CONFIG.AUTO_IMPROVE: true
|
GITHUB_ACTION_CONFIG.AUTO_IMPROVE: true
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
2
.gitignore
vendored
2
.gitignore
vendored
@ -8,4 +8,4 @@ dist/
|
|||||||
*.egg-info/
|
*.egg-info/
|
||||||
build/
|
build/
|
||||||
.DS_Store
|
.DS_Store
|
||||||
docs/.cache/
|
docs/.cache/
|
||||||
|
@ -13,10 +13,10 @@ repos:
|
|||||||
- id: check-yaml
|
- id: check-yaml
|
||||||
- id: end-of-file-fixer
|
- id: end-of-file-fixer
|
||||||
- id: trailing-whitespace
|
- id: trailing-whitespace
|
||||||
- repo: https://github.com/rhysd/actionlint
|
# - repo: https://github.com/rhysd/actionlint
|
||||||
rev: v1.7.3
|
# rev: v1.7.3
|
||||||
hooks:
|
# hooks:
|
||||||
- id: actionlint
|
# - id: actionlint
|
||||||
- repo: https://github.com/pycqa/isort
|
- repo: https://github.com/pycqa/isort
|
||||||
# rev must match what's in dev-requirements.txt
|
# rev must match what's in dev-requirements.txt
|
||||||
rev: 5.13.2
|
rev: 5.13.2
|
||||||
|
2
LICENSE
2
LICENSE
@ -199,4 +199,4 @@
|
|||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
See the License for the specific language governing permissions and
|
See the License for the specific language governing permissions and
|
||||||
limitations under the License.
|
limitations under the License.
|
||||||
|
@ -1,2 +1,2 @@
|
|||||||
recursive-include pr_agent *.toml
|
recursive-include pr_agent *.toml
|
||||||
recursive-exclude pr_agent *.secrets.toml
|
recursive-exclude pr_agent *.secrets.toml
|
||||||
|
@ -40,7 +40,7 @@ Qode Merge PR-Agent aims to help efficiently review and handle pull requests, by
|
|||||||
- [PR-Agent Pro 💎](https://pr-agent-docs.codium.ai/overview/pr_agent_pro/)
|
- [PR-Agent Pro 💎](https://pr-agent-docs.codium.ai/overview/pr_agent_pro/)
|
||||||
- [How it works](#how-it-works)
|
- [How it works](#how-it-works)
|
||||||
- [Why use PR-Agent?](#why-use-pr-agent)
|
- [Why use PR-Agent?](#why-use-pr-agent)
|
||||||
|
|
||||||
## News and Updates
|
## News and Updates
|
||||||
|
|
||||||
### October 27, 2024
|
### October 27, 2024
|
||||||
@ -55,7 +55,7 @@ Read more about this novel feature [here](https://qodo-merge-docs.qodo.ai/tools/
|
|||||||
|
|
||||||
|
|
||||||
### October 21, 2024
|
### October 21, 2024
|
||||||
**Disable publishing labels by default:**
|
**Disable publishing labels by default:**
|
||||||
|
|
||||||
The default setting for `pr_description.publish_labels` has been updated to `false`. This means that labels generated by the `/describe` tool will no longer be published, unless this configuration is explicitly set to `true`.
|
The default setting for `pr_description.publish_labels` has been updated to `false`. This means that labels generated by the `/describe` tool will no longer be published, unless this configuration is explicitly set to `true`.
|
||||||
|
|
||||||
@ -258,7 +258,7 @@ Note that when you set your own PR-Agent or use CodiumAI hosted PR-Agent, there
|
|||||||
1. **Fully managed** - We take care of everything for you - hosting, models, regular updates, and more. Installation is as simple as signing up and adding the PR-Agent app to your GitHub\GitLab\BitBucket repo.
|
1. **Fully managed** - We take care of everything for you - hosting, models, regular updates, and more. Installation is as simple as signing up and adding the PR-Agent app to your GitHub\GitLab\BitBucket repo.
|
||||||
2. **Improved privacy** - No data will be stored or used to train models. PR-Agent Pro will employ zero data retention, and will use an OpenAI account with zero data retention.
|
2. **Improved privacy** - No data will be stored or used to train models. PR-Agent Pro will employ zero data retention, and will use an OpenAI account with zero data retention.
|
||||||
3. **Improved support** - PR-Agent Pro users will receive priority support, and will be able to request new features and capabilities.
|
3. **Improved support** - PR-Agent Pro users will receive priority support, and will be able to request new features and capabilities.
|
||||||
4. **Extra features** -In addition to the benefits listed above, PR-Agent Pro will emphasize more customization, and the usage of static code analysis, in addition to LLM logic, to improve results.
|
4. **Extra features** -In addition to the benefits listed above, PR-Agent Pro will emphasize more customization, and the usage of static code analysis, in addition to LLM logic, to improve results.
|
||||||
See [here](https://qodo-merge-docs.qodo.ai/overview/pr_agent_pro/) for a list of features available in PR-Agent Pro.
|
See [here](https://qodo-merge-docs.qodo.ai/overview/pr_agent_pro/) for a list of features available in PR-Agent Pro.
|
||||||
|
|
||||||
|
|
||||||
|
@ -88,7 +88,7 @@ Significant documentation updates (see [Installation Guide](https://github.com/C
|
|||||||
- codiumai/pr-agent:0.7-gitlab_webhook
|
- codiumai/pr-agent:0.7-gitlab_webhook
|
||||||
- codiumai/pr-agent:0.7-github_polling
|
- codiumai/pr-agent:0.7-github_polling
|
||||||
- codiumai/pr-agent:0.7-github_action
|
- codiumai/pr-agent:0.7-github_action
|
||||||
|
|
||||||
### Added::Algo
|
### Added::Algo
|
||||||
- New tool /similar_issue - Currently on GitHub app and CLI: indexes the issues in the repo, find the most similar issues to the target issue.
|
- New tool /similar_issue - Currently on GitHub app and CLI: indexes the issues in the repo, find the most similar issues to the target issue.
|
||||||
- Describe markers: Empower the /describe tool with a templating capability (see more details in https://github.com/Codium-ai/pr-agent/pull/273).
|
- Describe markers: Empower the /describe tool with a templating capability (see more details in https://github.com/Codium-ai/pr-agent/pull/273).
|
||||||
|
@ -1 +1 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?><svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 109.77 81.94"><defs><style>.cls-1{fill:#7968fa;}.cls-1,.cls-2{stroke-width:0px;}.cls-2{fill:#5ae3ae;}</style></defs><path class="cls-2" d="m109.77,40.98c0,22.62-7.11,40.96-15.89,40.96-3.6,0-6.89-3.09-9.58-8.31,6.82-7.46,11.22-19.3,11.22-32.64s-4.4-25.21-11.22-32.67C86.99,3.09,90.29,0,93.89,0c8.78,0,15.89,18.33,15.89,40.97"/><path class="cls-1" d="m95.53,40.99c0,13.35-4.4,25.19-11.23,32.64-3.81-7.46-6.28-19.3-6.28-32.64s2.47-25.21,6.28-32.67c6.83,7.46,11.23,19.32,11.23,32.67"/><path class="cls-2" d="m55.38,78.15c-4.99,2.42-10.52,3.79-16.38,3.79C17.46,81.93,0,63.6,0,40.98S17.46,0,39,0C44.86,0,50.39,1.37,55.38,3.79c-9.69,6.47-16.43,20.69-16.43,37.19s6.73,30.7,16.43,37.17"/><path class="cls-1" d="m78.02,40.99c0,16.48-9.27,30.7-22.65,37.17-9.69-6.47-16.43-20.69-16.43-37.17S45.68,10.28,55.38,3.81c13.37,6.49,22.65,20.69,22.65,37.19"/><path class="cls-2" d="m84.31,73.63c-4.73,5.22-10.64,8.31-17.06,8.31-4.24,0-8.27-1.35-11.87-3.79,13.37-6.48,22.65-20.7,22.65-37.17,0,13.35,2.47,25.19,6.28,32.64"/><path class="cls-2" d="m84.31,8.31c-3.81,7.46-6.28,19.32-6.28,32.67,0-16.5-9.27-30.7-22.65-37.19,3.6-2.45,7.63-3.8,11.87-3.8,6.43,0,12.33,3.09,17.06,8.31"/></svg>
|
<?xml version="1.0" encoding="UTF-8"?><svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 109.77 81.94"><defs><style>.cls-1{fill:#7968fa;}.cls-1,.cls-2{stroke-width:0px;}.cls-2{fill:#5ae3ae;}</style></defs><path class="cls-2" d="m109.77,40.98c0,22.62-7.11,40.96-15.89,40.96-3.6,0-6.89-3.09-9.58-8.31,6.82-7.46,11.22-19.3,11.22-32.64s-4.4-25.21-11.22-32.67C86.99,3.09,90.29,0,93.89,0c8.78,0,15.89,18.33,15.89,40.97"/><path class="cls-1" d="m95.53,40.99c0,13.35-4.4,25.19-11.23,32.64-3.81-7.46-6.28-19.3-6.28-32.64s2.47-25.21,6.28-32.67c6.83,7.46,11.23,19.32,11.23,32.67"/><path class="cls-2" d="m55.38,78.15c-4.99,2.42-10.52,3.79-16.38,3.79C17.46,81.93,0,63.6,0,40.98S17.46,0,39,0C44.86,0,50.39,1.37,55.38,3.79c-9.69,6.47-16.43,20.69-16.43,37.19s6.73,30.7,16.43,37.17"/><path class="cls-1" d="m78.02,40.99c0,16.48-9.27,30.7-22.65,37.17-9.69-6.47-16.43-20.69-16.43-37.17S45.68,10.28,55.38,3.81c13.37,6.49,22.65,20.69,22.65,37.19"/><path class="cls-2" d="m84.31,73.63c-4.73,5.22-10.64,8.31-17.06,8.31-4.24,0-8.27-1.35-11.87-3.79,13.37-6.48,22.65-20.7,22.65-37.17,0,13.35,2.47,25.19,6.28,32.64"/><path class="cls-2" d="m84.31,8.31c-3.81,7.46-6.28,19.32-6.28,32.67,0-16.5-9.27-30.7-22.65-37.19,3.6-2.45,7.63-3.8,11.87-3.8,6.43,0,12.33,3.09,17.06,8.31"/></svg>
|
||||||
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
@ -2,4 +2,3 @@ We take your code's security and privacy seriously:
|
|||||||
|
|
||||||
- The Chrome extension will not send your code to any external servers.
|
- The Chrome extension will not send your code to any external servers.
|
||||||
- For private repositories, we will first validate the user's identity and permissions. After authentication, we generate responses using the existing Qodo Merge Pro integration.
|
- For private repositories, we will first validate the user's identity and permissions. After authentication, we generate responses using the existing Qodo Merge Pro integration.
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
With a single-click installation you will gain access to a context-aware chat on your pull requests code, a toolbar extension with multiple AI feedbacks, Qodo Merge filters, and additional abilities.
|
With a single-click installation you will gain access to a context-aware chat on your pull requests code, a toolbar extension with multiple AI feedbacks, Qodo Merge filters, and additional abilities.
|
||||||
|
|
||||||
The extension is powered by top code models like Claude 3.5 Sonnet and GPT4. All the extension's features are free to use on public repositories.
|
The extension is powered by top code models like Claude 3.5 Sonnet and GPT4. All the extension's features are free to use on public repositories.
|
||||||
|
|
||||||
For private repositories, you will need to install [Qodo Merge Pro](https://github.com/apps/codiumai-pr-agent-pro) in addition to the extension (Quick GitHub app setup with a 14-day free trial. No credit card needed).
|
For private repositories, you will need to install [Qodo Merge Pro](https://github.com/apps/codiumai-pr-agent-pro) in addition to the extension (Quick GitHub app setup with a 14-day free trial. No credit card needed).
|
||||||
For a demonstration of how to install Qodo Merge Pro and use it with the Chrome extension, please refer to the tutorial video at the provided [link](https://codium.ai/images/pr_agent/private_repos.mp4).
|
For a demonstration of how to install Qodo Merge Pro and use it with the Chrome extension, please refer to the tutorial video at the provided [link](https://codium.ai/images/pr_agent/private_repos.mp4).
|
||||||
|
@ -1,2 +1,2 @@
|
|||||||
## Overview
|
## Overview
|
||||||
TBD
|
TBD
|
||||||
|
@ -12,9 +12,9 @@ We prioritize the languages of the repo based on the following criteria:
|
|||||||
|
|
||||||
1. Exclude binary files and non code files (e.g. images, pdfs, etc)
|
1. Exclude binary files and non code files (e.g. images, pdfs, etc)
|
||||||
2. Given the main languages used in the repo
|
2. Given the main languages used in the repo
|
||||||
3. We sort the PR files by the most common languages in the repo (in descending order):
|
3. We sort the PR files by the most common languages in the repo (in descending order):
|
||||||
* ```[[file.py, file2.py],[file3.js, file4.jsx],[readme.md]]```
|
* ```[[file.py, file2.py],[file3.js, file4.jsx],[readme.md]]```
|
||||||
|
|
||||||
|
|
||||||
### Small PR
|
### Small PR
|
||||||
In this case, we can fit the entire PR in a single prompt:
|
In this case, we can fit the entire PR in a single prompt:
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
## TL;DR
|
## TL;DR
|
||||||
|
|
||||||
Qodo Merge uses an **asymmetric and dynamic context strategy** to improve AI analysis of code changes in pull requests.
|
Qodo Merge uses an **asymmetric and dynamic context strategy** to improve AI analysis of code changes in pull requests.
|
||||||
It provides more context before changes than after, and dynamically adjusts the context based on code structure (e.g., enclosing functions or classes).
|
It provides more context before changes than after, and dynamically adjusts the context based on code structure (e.g., enclosing functions or classes).
|
||||||
This approach balances providing sufficient context for accurate analysis, while avoiding needle-in-the-haystack information overload that could degrade AI performance or exceed token limits.
|
This approach balances providing sufficient context for accurate analysis, while avoiding needle-in-the-haystack information overload that could degrade AI performance or exceed token limits.
|
||||||
|
|
||||||
## Introduction
|
## Introduction
|
||||||
@ -17,12 +17,12 @@ Pull request code changes are retrieved in a unified diff format, showing three
|
|||||||
code line that already existed in the file...
|
code line that already existed in the file...
|
||||||
code line that already existed in the file...
|
code line that already existed in the file...
|
||||||
code line that already existed in the file...
|
code line that already existed in the file...
|
||||||
|
|
||||||
@@ -26,2 +26,4 @@ def func2():
|
@@ -26,2 +26,4 @@ def func2():
|
||||||
...
|
...
|
||||||
```
|
```
|
||||||
|
|
||||||
This unified diff format can be challenging for AI models to interpret accurately, as it provides limited context for understanding the full scope of code changes.
|
This unified diff format can be challenging for AI models to interpret accurately, as it provides limited context for understanding the full scope of code changes.
|
||||||
The presentation of code using '+', '-', and ' ' symbols to indicate additions, deletions, and unchanged lines respectively also differs from the standard code formatting typically used to train AI models.
|
The presentation of code using '+', '-', and ' ' symbols to indicate additions, deletions, and unchanged lines respectively also differs from the standard code formatting typically used to train AI models.
|
||||||
|
|
||||||
|
|
||||||
@ -37,7 +37,7 @@ Pros:
|
|||||||
Cons:
|
Cons:
|
||||||
|
|
||||||
- Excessive context may overwhelm the model with extraneous information, creating a "needle in a haystack" scenario where focusing on the relevant details (the code that actually changed) becomes challenging.
|
- Excessive context may overwhelm the model with extraneous information, creating a "needle in a haystack" scenario where focusing on the relevant details (the code that actually changed) becomes challenging.
|
||||||
LLM quality is known to degrade when the context gets larger.
|
LLM quality is known to degrade when the context gets larger.
|
||||||
Pull requests often encompass multiple changes across many files, potentially spanning hundreds of lines of modified code. This complexity presents a genuine risk of overwhelming the model with excessive context.
|
Pull requests often encompass multiple changes across many files, potentially spanning hundreds of lines of modified code. This complexity presents a genuine risk of overwhelming the model with excessive context.
|
||||||
|
|
||||||
- Increased context expands the token count, increasing processing time and cost, and may prevent the model from processing the entire pull request in a single pass.
|
- Increased context expands the token count, increasing processing time and cost, and may prevent the model from processing the entire pull request in a single pass.
|
||||||
@ -47,18 +47,18 @@ To address these challenges, Qodo Merge employs an **asymmetric** and **dynamic*
|
|||||||
|
|
||||||
**Asymmetric:**
|
**Asymmetric:**
|
||||||
|
|
||||||
We start by recognizing that the context preceding a code change is typically more crucial for understanding the modification than the context following it.
|
We start by recognizing that the context preceding a code change is typically more crucial for understanding the modification than the context following it.
|
||||||
Consequently, Qodo Merge implements an asymmetric context policy, decoupling the context window into two distinct segments: one for the code before the change and another for the code after.
|
Consequently, Qodo Merge implements an asymmetric context policy, decoupling the context window into two distinct segments: one for the code before the change and another for the code after.
|
||||||
|
|
||||||
By independently adjusting each context window, Qodo Merge can supply the model with a more tailored and pertinent context for individual code changes.
|
By independently adjusting each context window, Qodo Merge can supply the model with a more tailored and pertinent context for individual code changes.
|
||||||
|
|
||||||
**Dynamic:**
|
**Dynamic:**
|
||||||
|
|
||||||
We also employ a "dynamic" context strategy.
|
We also employ a "dynamic" context strategy.
|
||||||
We start by recognizing that the optimal context for a code change often corresponds to its enclosing code component (e.g., function, class), rather than a fixed number of lines.
|
We start by recognizing that the optimal context for a code change often corresponds to its enclosing code component (e.g., function, class), rather than a fixed number of lines.
|
||||||
Consequently, we dynamically adjust the context window based on the code's structure, ensuring the model receives the most pertinent information for each modification.
|
Consequently, we dynamically adjust the context window based on the code's structure, ensuring the model receives the most pertinent information for each modification.
|
||||||
|
|
||||||
To prevent overwhelming the model with excessive context, we impose a limit on the number of lines searched when identifying the enclosing component.
|
To prevent overwhelming the model with excessive context, we impose a limit on the number of lines searched when identifying the enclosing component.
|
||||||
This balance allows for comprehensive understanding while maintaining efficiency and limiting context token usage.
|
This balance allows for comprehensive understanding while maintaining efficiency and limiting context token usage.
|
||||||
|
|
||||||
## Appendix - relevant configuration options
|
## Appendix - relevant configuration options
|
||||||
@ -69,4 +69,4 @@ allow_dynamic_context=true # Allow dynamic context extension
|
|||||||
max_extra_lines_before_dynamic_context = 8 # will try to include up to X extra lines before the hunk in the patch, until we reach an enclosing function or class
|
max_extra_lines_before_dynamic_context = 8 # will try to include up to X extra lines before the hunk in the patch, until we reach an enclosing function or class
|
||||||
patch_extra_lines_before = 3 # Number of extra lines (+3 default ones) to include before each hunk in the patch
|
patch_extra_lines_before = 3 # Number of extra lines (+3 default ones) to include before each hunk in the patch
|
||||||
patch_extra_lines_after = 1 # Number of extra lines (+3 default ones) to include after each hunk in the patch
|
patch_extra_lines_after = 1 # Number of extra lines (+3 default ones) to include after each hunk in the patch
|
||||||
```
|
```
|
||||||
|
@ -41,4 +41,4 @@ Here are key metrics that the dashboard tracks:
|
|||||||
|
|
||||||
#### Suggestion Score Distribution
|
#### Suggestion Score Distribution
|
||||||
{width=512}
|
{width=512}
|
||||||
> Explanation: The distribution of the suggestion score for the implemented suggestions, ensuring that higher-scored suggestions truly represent more significant improvements.
|
> Explanation: The distribution of the suggestion score for the implemented suggestions, ensuring that higher-scored suggestions truly represent more significant improvements.
|
||||||
|
@ -13,7 +13,7 @@ Qodo Merge utilizes a variety of core abilities to provide a comprehensive and e
|
|||||||
|
|
||||||
## Blogs
|
## Blogs
|
||||||
|
|
||||||
Here are some additional technical blogs from Qodo, that delve deeper into the core capabilities and features of Large Language Models (LLMs) when applied to coding tasks.
|
Here are some additional technical blogs from Qodo, that delve deeper into the core capabilities and features of Large Language Models (LLMs) when applied to coding tasks.
|
||||||
These resources provide more comprehensive insights into leveraging LLMs for software development.
|
These resources provide more comprehensive insights into leveraging LLMs for software development.
|
||||||
|
|
||||||
### Code Generation and LLMs
|
### Code Generation and LLMs
|
||||||
@ -25,4 +25,4 @@ These resources provide more comprehensive insights into leveraging LLMs for sof
|
|||||||
- [Introduction to Code Coverage Testing](https://www.qodo.ai/blog/introduction-to-code-coverage-testing/)
|
- [Introduction to Code Coverage Testing](https://www.qodo.ai/blog/introduction-to-code-coverage-testing/)
|
||||||
|
|
||||||
### Cost Optimization
|
### Cost Optimization
|
||||||
- [Reduce Your Costs by 30% When Using GPT for Python Code](https://www.qodo.ai/blog/reduce-your-costs-by-30-when-using-gpt-3-for-python-code/)
|
- [Reduce Your Costs by 30% When Using GPT for Python Code](https://www.qodo.ai/blog/reduce-your-costs-by-30-when-using-gpt-3-for-python-code/)
|
||||||
|
@ -1,2 +1,2 @@
|
|||||||
## Interactive invocation 💎
|
## Interactive invocation 💎
|
||||||
TBD
|
TBD
|
||||||
|
@ -53,4 +53,4 @@ __old hunk__
|
|||||||
|
|
||||||
|
|
||||||
(4) All the metadata described above represents several level of cumulative analysis - ranging from hunk level, to file level, to PR level, to organization level.
|
(4) All the metadata described above represents several level of cumulative analysis - ranging from hunk level, to file level, to PR level, to organization level.
|
||||||
This comprehensive approach enables Qodo Merge AI models to generate more precise and contextually relevant suggestions and feedback.
|
This comprehensive approach enables Qodo Merge AI models to generate more precise and contextually relevant suggestions and feedback.
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
## TL;DR
|
## TL;DR
|
||||||
|
|
||||||
Qodo Merge implements a **self-reflection** process where the AI model reflects, scores, and re-ranks its own suggestions, eliminating irrelevant or incorrect ones.
|
Qodo Merge implements a **self-reflection** process where the AI model reflects, scores, and re-ranks its own suggestions, eliminating irrelevant or incorrect ones.
|
||||||
This approach improves the quality and relevance of suggestions, saving users time and enhancing their experience.
|
This approach improves the quality and relevance of suggestions, saving users time and enhancing their experience.
|
||||||
Configuration options allow users to set a score threshold for further filtering out suggestions.
|
Configuration options allow users to set a score threshold for further filtering out suggestions.
|
||||||
|
|
||||||
## Introduction - Efficient Review with Hierarchical Presentation
|
## Introduction - Efficient Review with Hierarchical Presentation
|
||||||
@ -24,7 +24,7 @@ The AI model is initially tasked with generating suggestions, and outputting the
|
|||||||
However, in practice we observe that models often struggle to simultaneously generate high-quality code suggestions and rank them well in a single pass.
|
However, in practice we observe that models often struggle to simultaneously generate high-quality code suggestions and rank them well in a single pass.
|
||||||
Furthermore, the initial set of generated suggestions sometimes contains easily identifiable errors.
|
Furthermore, the initial set of generated suggestions sometimes contains easily identifiable errors.
|
||||||
|
|
||||||
To address these issues, we implemented a "self-reflection" process that refines suggestion ranking and eliminates irrelevant or incorrect proposals.
|
To address these issues, we implemented a "self-reflection" process that refines suggestion ranking and eliminates irrelevant or incorrect proposals.
|
||||||
This process consists of the following steps:
|
This process consists of the following steps:
|
||||||
|
|
||||||
1. Presenting the generated suggestions to the model in a follow-up call.
|
1. Presenting the generated suggestions to the model in a follow-up call.
|
||||||
@ -48,4 +48,4 @@ This results in a more refined and valuable set of suggestions for the user, sav
|
|||||||
[pr_code_suggestions]
|
[pr_code_suggestions]
|
||||||
self_reflect_on_suggestions = true # Enable self-reflection on code suggestions
|
self_reflect_on_suggestions = true # Enable self-reflection on code suggestions
|
||||||
suggestions_score_threshold = 0 # Filter out suggestions with a score below this threshold (0-10)
|
suggestions_score_threshold = 0 # Filter out suggestions with a score below this threshold (0-10)
|
||||||
```
|
```
|
||||||
|
@ -31,11 +31,11 @@ ___
|
|||||||
|
|
||||||
|
|
||||||
- The hierarchical structure of the suggestions is designed to help the user to _quickly_ understand them, and to decide which ones are relevant and which are not:
|
- The hierarchical structure of the suggestions is designed to help the user to _quickly_ understand them, and to decide which ones are relevant and which are not:
|
||||||
|
|
||||||
- Only if the `Category` header is relevant, the user should move to the summarized suggestion description.
|
- Only if the `Category` header is relevant, the user should move to the summarized suggestion description.
|
||||||
- Only if the summarized suggestion description is relevant, the user should click on the collapsible, to read the full suggestion description with a code preview example.
|
- Only if the summarized suggestion description is relevant, the user should click on the collapsible, to read the full suggestion description with a code preview example.
|
||||||
|
|
||||||
- In addition, we recommend to use the [`extra_instructions`](https://qodo-merge-docs.qodo.ai/tools/improve/#extra-instructions-and-best-practices) field to guide the model to suggestions that are more relevant to the specific needs of the project.
|
- In addition, we recommend to use the [`extra_instructions`](https://qodo-merge-docs.qodo.ai/tools/improve/#extra-instructions-and-best-practices) field to guide the model to suggestions that are more relevant to the specific needs of the project.
|
||||||
- The interactive [PR chat](https://qodo-merge-docs.qodo.ai/chrome-extension/) also provides an easy way to get more tailored suggestions and feedback from the AI model.
|
- The interactive [PR chat](https://qodo-merge-docs.qodo.ai/chrome-extension/) also provides an easy way to get more tailored suggestions and feedback from the AI model.
|
||||||
|
|
||||||
___
|
___
|
||||||
@ -51,7 +51,7 @@ ___
|
|||||||
#### Answer:<span style="display:none;">4</span>
|
#### Answer:<span style="display:none;">4</span>
|
||||||
|
|
||||||
No. Qodo Merge strict privacy policy ensures that your code is not stored or used for training purposes.
|
No. Qodo Merge strict privacy policy ensures that your code is not stored or used for training purposes.
|
||||||
|
|
||||||
For a detailed overview of our data privacy policy, please refer to [this link](https://qodo-merge-docs.qodo.ai/overview/data_privacy/)
|
For a detailed overview of our data privacy policy, please refer to [this link](https://qodo-merge-docs.qodo.ai/overview/data_privacy/)
|
||||||
|
|
||||||
___
|
___
|
||||||
@ -59,9 +59,9 @@ ___
|
|||||||
??? note "Question: Can I use my own LLM keys with Qodo Merge?"
|
??? note "Question: Can I use my own LLM keys with Qodo Merge?"
|
||||||
#### Answer:<span style="display:none;">5</span>
|
#### Answer:<span style="display:none;">5</span>
|
||||||
|
|
||||||
When you self-host, you use your own keys.
|
When you self-host, you use your own keys.
|
||||||
|
|
||||||
Qodo Merge Pro with SaaS deployment is a hosted version of Qodo Merge, where Qodo manages the infrastructure and the keys.
|
Qodo Merge Pro with SaaS deployment is a hosted version of Qodo Merge, where Qodo manages the infrastructure and the keys.
|
||||||
For enterprise customers, on-prem deployment is also available. [Contact us](https://www.codium.ai/contact/#pricing) for more information.
|
For enterprise customers, on-prem deployment is also available. [Contact us](https://www.codium.ai/contact/#pricing) for more information.
|
||||||
|
|
||||||
___
|
___
|
||||||
|
@ -84,10 +84,10 @@ command: improve
|
|||||||
model1_score: 9,
|
model1_score: 9,
|
||||||
model2_score: 6,
|
model2_score: 6,
|
||||||
why: |
|
why: |
|
||||||
Response 1 is better because it provides more actionable and specific suggestions that directly
|
Response 1 is better because it provides more actionable and specific suggestions that directly
|
||||||
enhance the code's maintainability, performance, and best practices. For example, it suggests
|
enhance the code's maintainability, performance, and best practices. For example, it suggests
|
||||||
using a variable for reusable widget instances and using named routes for navigation, which
|
using a variable for reusable widget instances and using named routes for navigation, which
|
||||||
are practical improvements. In contrast, Response 2 focuses more on general advice and less
|
are practical improvements. In contrast, Response 2 focuses more on general advice and less
|
||||||
actionable suggestions, such as changing variable names and adding comments, which are less
|
actionable suggestions, such as changing variable names and adding comments, which are less
|
||||||
critical for immediate code improvement."
|
critical for immediate code improvement."
|
||||||
```
|
```
|
||||||
|
@ -40,7 +40,7 @@ stages:
|
|||||||
|
|
||||||
export azure_devops__org="$ORG_URL"
|
export azure_devops__org="$ORG_URL"
|
||||||
export config__git_provider="azure"
|
export config__git_provider="azure"
|
||||||
|
|
||||||
pr-agent --pr_url="$PR_URL" describe
|
pr-agent --pr_url="$PR_URL" describe
|
||||||
pr-agent --pr_url="$PR_URL" review
|
pr-agent --pr_url="$PR_URL" review
|
||||||
pr-agent --pr_url="$PR_URL" improve
|
pr-agent --pr_url="$PR_URL" improve
|
||||||
@ -65,11 +65,11 @@ git_provider="azure"
|
|||||||
```
|
```
|
||||||
|
|
||||||
Azure DevOps provider supports [PAT token](https://learn.microsoft.com/en-us/azure/devops/organizations/accounts/use-personal-access-tokens-to-authenticate?view=azure-devops&tabs=Windows) or [DefaultAzureCredential](https://learn.microsoft.com/en-us/azure/developer/python/sdk/authentication-overview#authentication-in-server-environments) authentication.
|
Azure DevOps provider supports [PAT token](https://learn.microsoft.com/en-us/azure/devops/organizations/accounts/use-personal-access-tokens-to-authenticate?view=azure-devops&tabs=Windows) or [DefaultAzureCredential](https://learn.microsoft.com/en-us/azure/developer/python/sdk/authentication-overview#authentication-in-server-environments) authentication.
|
||||||
PAT is faster to create, but has build in expiration date, and will use the user identity for API calls.
|
PAT is faster to create, but has build in expiration date, and will use the user identity for API calls.
|
||||||
Using DefaultAzureCredential you can use managed identity or Service principle, which are more secure and will create separate ADO user identity (via AAD) to the agent.
|
Using DefaultAzureCredential you can use managed identity or Service principle, which are more secure and will create separate ADO user identity (via AAD) to the agent.
|
||||||
|
|
||||||
If PAT was chosen, you can assign the value in .secrets.toml.
|
If PAT was chosen, you can assign the value in .secrets.toml.
|
||||||
If DefaultAzureCredential was chosen, you can assigned the additional env vars like AZURE_CLIENT_SECRET directly,
|
If DefaultAzureCredential was chosen, you can assigned the additional env vars like AZURE_CLIENT_SECRET directly,
|
||||||
or use managed identity/az cli (for local development) without any additional configuration.
|
or use managed identity/az cli (for local development) without any additional configuration.
|
||||||
in any case, 'org' value must be assigned in .secrets.toml:
|
in any case, 'org' value must be assigned in .secrets.toml:
|
||||||
```
|
```
|
||||||
@ -80,7 +80,7 @@ org = "https://dev.azure.com/YOUR_ORGANIZATION/"
|
|||||||
|
|
||||||
### Azure DevOps Webhook
|
### Azure DevOps Webhook
|
||||||
|
|
||||||
To trigger from an Azure webhook, you need to manually [add a webhook](https://learn.microsoft.com/en-us/azure/devops/service-hooks/services/webhooks?view=azure-devops).
|
To trigger from an Azure webhook, you need to manually [add a webhook](https://learn.microsoft.com/en-us/azure/devops/service-hooks/services/webhooks?view=azure-devops).
|
||||||
Use the "Pull request created" type to trigger a review, or "Pull request commented on" to trigger any supported comment with /<command> <args> comment on the relevant PR. Note that for the "Pull request commented on" trigger, only API v2.0 is supported.
|
Use the "Pull request created" type to trigger a review, or "Pull request commented on" to trigger any supported comment with /<command> <args> comment on the relevant PR. Note that for the "Pull request commented on" trigger, only API v2.0 is supported.
|
||||||
|
|
||||||
|
|
||||||
|
@ -60,7 +60,7 @@ See detailed usage instructions in the [USAGE GUIDE](https://qodo-merge-docs.qod
|
|||||||
uses: docker://codiumai/pr-agent:0.23-github_action
|
uses: docker://codiumai/pr-agent:0.23-github_action
|
||||||
...
|
...
|
||||||
```
|
```
|
||||||
|
|
||||||
For enhanced security, you can also specify the Docker image by its [digest](https://hub.docker.com/repository/docker/codiumai/pr-agent/tags):
|
For enhanced security, you can also specify the Docker image by its [digest](https://hub.docker.com/repository/docker/codiumai/pr-agent/tags):
|
||||||
```yaml
|
```yaml
|
||||||
...
|
...
|
||||||
@ -71,17 +71,17 @@ See detailed usage instructions in the [USAGE GUIDE](https://qodo-merge-docs.qod
|
|||||||
...
|
...
|
||||||
```
|
```
|
||||||
|
|
||||||
### Action for GitHub enterprise server
|
### Action for GitHub enterprise server
|
||||||
!!! tip ""
|
!!! tip ""
|
||||||
To use the action with a GitHub enterprise server, add an environment variable `GITHUB.BASE_URL` with the API URL of your GitHub server.
|
To use the action with a GitHub enterprise server, add an environment variable `GITHUB.BASE_URL` with the API URL of your GitHub server.
|
||||||
|
|
||||||
For example, if your GitHub server is at `https://github.mycompany.com`, add the following to your workflow file:
|
For example, if your GitHub server is at `https://github.mycompany.com`, add the following to your workflow file:
|
||||||
```yaml
|
```yaml
|
||||||
env:
|
env:
|
||||||
# ... previous environment values
|
# ... previous environment values
|
||||||
GITHUB.BASE_URL: "https://github.mycompany.com/api/v3"
|
GITHUB.BASE_URL: "https://github.mycompany.com/api/v3"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@ -118,7 +118,7 @@ git clone https://github.com/Codium-ai/pr-agent.git
|
|||||||
```
|
```
|
||||||
|
|
||||||
5) Copy the secrets template file and fill in the following:
|
5) Copy the secrets template file and fill in the following:
|
||||||
|
|
||||||
```
|
```
|
||||||
cp pr_agent/settings/.secrets_template.toml pr_agent/settings/.secrets.toml
|
cp pr_agent/settings/.secrets_template.toml pr_agent/settings/.secrets.toml
|
||||||
# Edit .secrets.toml file
|
# Edit .secrets.toml file
|
||||||
@ -147,7 +147,7 @@ cp pr_agent/settings/.secrets_template.toml pr_agent/settings/.secrets.toml
|
|||||||
- mountPath: /app/pr_agent/settings_prod
|
- mountPath: /app/pr_agent/settings_prod
|
||||||
name: settings-volume
|
name: settings-volume
|
||||||
```
|
```
|
||||||
|
|
||||||
> Another option is to set the secrets as environment variables in your deployment environment, for example `OPENAI.KEY` and `GITHUB.USER_TOKEN`.
|
> Another option is to set the secrets as environment variables in your deployment environment, for example `OPENAI.KEY` and `GITHUB.USER_TOKEN`.
|
||||||
|
|
||||||
6) Build a Docker image for the app and optionally push it to a Docker repository. We'll use Dockerhub as an example:
|
6) Build a Docker image for the app and optionally push it to a Docker repository. We'll use Dockerhub as an example:
|
||||||
|
@ -74,4 +74,4 @@ docker push codiumai/pr-agent:gitlab_webhook # Push to your Docker repository
|
|||||||
6. Create a webhook in GitLab. Set the URL to ```http[s]://<PR_AGENT_HOSTNAME>/webhook```, the secret token to the generated secret from step 2, and enable the triggers `push`, `comments` and `merge request events`.
|
6. Create a webhook in GitLab. Set the URL to ```http[s]://<PR_AGENT_HOSTNAME>/webhook```, the secret token to the generated secret from step 2, and enable the triggers `push`, `comments` and `merge request events`.
|
||||||
|
|
||||||
7. Test your installation by opening a merge request or commenting on a merge request using one of CodiumAI's commands.
|
7. Test your installation by opening a merge request or commenting on a merge request using one of CodiumAI's commands.
|
||||||
boxes
|
boxes
|
||||||
|
@ -15,7 +15,7 @@ There are several ways to use self-hosted Qodo Merge:
|
|||||||
- [Azure DevOps](./azure.md)
|
- [Azure DevOps](./azure.md)
|
||||||
|
|
||||||
## Qodo Merge Pro 💎
|
## Qodo Merge Pro 💎
|
||||||
Qodo Merge Pro, an app hosted by CodiumAI for GitHub\GitLab\BitBucket, is also available.
|
Qodo Merge Pro, an app hosted by CodiumAI for GitHub\GitLab\BitBucket, is also available.
|
||||||
<br>
|
<br>
|
||||||
With Qodo Merge Pro, installation is as simple as signing up and adding the Qodo Merge app to your relevant repo.
|
With Qodo Merge Pro, installation is as simple as signing up and adding the Qodo Merge app to your relevant repo.
|
||||||
See [here](https://qodo-merge-docs.qodo.ai/installation/pr_agent_pro/) for more details.
|
See [here](https://qodo-merge-docs.qodo.ai/installation/pr_agent_pro/) for more details.
|
||||||
|
@ -45,7 +45,7 @@ To invoke a tool (for example `review`), you can run directly from the Docker im
|
|||||||
```
|
```
|
||||||
docker run --rm -it -e OPENAI.KEY=<your key> -e GITHUB.USER_TOKEN=<your token> codiumai/pr-agent:latest --pr_url <pr_url> review
|
docker run --rm -it -e OPENAI.KEY=<your key> -e GITHUB.USER_TOKEN=<your token> codiumai/pr-agent:latest --pr_url <pr_url> review
|
||||||
```
|
```
|
||||||
If you are using GitHub enterprise server, you need to specify the custom url as variable.
|
If you are using GitHub enterprise server, you need to specify the custom url as variable.
|
||||||
For example, if your GitHub server is at `https://github.mycompany.com`, add the following to the command:
|
For example, if your GitHub server is at `https://github.mycompany.com`, add the following to the command:
|
||||||
```
|
```
|
||||||
-e GITHUB.BASE_URL=https://github.mycompany.com/api/v3
|
-e GITHUB.BASE_URL=https://github.mycompany.com/api/v3
|
||||||
@ -58,7 +58,7 @@ To invoke a tool (for example `review`), you can run directly from the Docker im
|
|||||||
|
|
||||||
If you have a dedicated GitLab instance, you need to specify the custom url as variable:
|
If you have a dedicated GitLab instance, you need to specify the custom url as variable:
|
||||||
```
|
```
|
||||||
-e GITLAB.URL=<your gitlab instance url>
|
-e GITLAB.URL=<your gitlab instance url>
|
||||||
```
|
```
|
||||||
|
|
||||||
- For BitBucket:
|
- For BitBucket:
|
||||||
@ -110,4 +110,4 @@ python3 -m pr_agent.cli --issue_url <issue_url> similar_issue
|
|||||||
[Optional] Add the pr_agent folder to your PYTHONPATH
|
[Optional] Add the pr_agent folder to your PYTHONPATH
|
||||||
```
|
```
|
||||||
export PYTHONPATH=$PYTHONPATH:<PATH to pr_agent folder>
|
export PYTHONPATH=$PYTHONPATH:<PATH to pr_agent folder>
|
||||||
```
|
```
|
||||||
|
@ -4,12 +4,12 @@
|
|||||||
Qodo Merge Pro is a versatile application compatible with GitHub, GitLab, and BitBucket, hosted by CodiumAI.
|
Qodo Merge Pro is a versatile application compatible with GitHub, GitLab, and BitBucket, hosted by CodiumAI.
|
||||||
See [here](https://qodo-merge-docs.qodo.ai/overview/pr_agent_pro/) for more details about the benefits of using Qodo Merge Pro.
|
See [here](https://qodo-merge-docs.qodo.ai/overview/pr_agent_pro/) for more details about the benefits of using Qodo Merge Pro.
|
||||||
|
|
||||||
Interested parties can subscribe to Qodo Merge Pro through the following [link](https://www.codium.ai/pricing/).
|
Interested parties can subscribe to Qodo Merge Pro through the following [link](https://www.codium.ai/pricing/).
|
||||||
After subscribing, you are granted the ability to easily install the application across any of your repositories.
|
After subscribing, you are granted the ability to easily install the application across any of your repositories.
|
||||||
|
|
||||||
{width=468}
|
{width=468}
|
||||||
|
|
||||||
Each user who wants to use Qodo Merge pro needs to buy a seat.
|
Each user who wants to use Qodo Merge pro needs to buy a seat.
|
||||||
Initially, CodiumAI offers a two-week trial period at no cost, after which continued access requires each user to secure a personal seat.
|
Initially, CodiumAI offers a two-week trial period at no cost, after which continued access requires each user to secure a personal seat.
|
||||||
Once a user acquires a seat, they gain the flexibility to use Qodo Merge Pro across any repository where it was enabled.
|
Once a user acquires a seat, they gain the flexibility to use Qodo Merge Pro across any repository where it was enabled.
|
||||||
|
|
||||||
@ -65,4 +65,4 @@ Enable SSL verification: Check the box.
|
|||||||
|
|
||||||
You’re all set!
|
You’re all set!
|
||||||
|
|
||||||
Open a new merge request or add a MR comment with one of Qodo Merge’s commands such as /review, /describe or /improve.
|
Open a new merge request or add a MR comment with one of Qodo Merge’s commands such as /review, /describe or /improve.
|
||||||
|
@ -90,4 +90,4 @@ The following diagram illustrates Qodo Merge tools and their flow:
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
Check out the [PR Compression strategy](core-abilities/index.md) page for more details on how we convert a code diff to a manageable LLM prompt
|
Check out the [PR Compression strategy](core-abilities/index.md) page for more details on how we convert a code diff to a manageable LLM prompt
|
||||||
|
@ -19,7 +19,7 @@ Here are some of the additional features and capabilities that Qodo Merge Pro of
|
|||||||
|
|
||||||
| Feature | Description |
|
| Feature | Description |
|
||||||
|----------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
|----------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
| [**Model selection**](https://qodo-merge-docs.qodo.ai/usage-guide/PR_agent_pro_models/) | Choose the model that best fits your needs, among top models like `GPT4` and `Claude-Sonnet-3.5`
|
| [**Model selection**](https://qodo-merge-docs.qodo.ai/usage-guide/PR_agent_pro_models/) | Choose the model that best fits your needs, among top models like `GPT4` and `Claude-Sonnet-3.5`
|
||||||
| [**Global and wiki configuration**](https://qodo-merge-docs.qodo.ai/usage-guide/configuration_options/) | Control configurations for many repositories from a single location; <br>Edit configuration of a single repo without committing code |
|
| [**Global and wiki configuration**](https://qodo-merge-docs.qodo.ai/usage-guide/configuration_options/) | Control configurations for many repositories from a single location; <br>Edit configuration of a single repo without committing code |
|
||||||
| [**Apply suggestions**](https://qodo-merge-docs.qodo.ai/tools/improve/#overview) | Generate committable code from the relevant suggestions interactively by clicking on a checkbox |
|
| [**Apply suggestions**](https://qodo-merge-docs.qodo.ai/tools/improve/#overview) | Generate committable code from the relevant suggestions interactively by clicking on a checkbox |
|
||||||
| [**Suggestions impact**](https://qodo-merge-docs.qodo.ai/tools/improve/#assessing-impact) | Automatically mark suggestions that were implemented by the user (either directly in GitHub, or indirectly in the IDE) to enable tracking of the impact of the suggestions |
|
| [**Suggestions impact**](https://qodo-merge-docs.qodo.ai/tools/improve/#assessing-impact) | Automatically mark suggestions that were implemented by the user (either directly in GitHub, or indirectly in the IDE) to enable tracking of the impact of the suggestions |
|
||||||
@ -45,7 +45,7 @@ Here are additional tools that are available only for Qodo Merge Pro users:
|
|||||||
|
|
||||||
### Supported languages
|
### Supported languages
|
||||||
|
|
||||||
Qodo Merge Pro leverages the world's leading code models - Claude 3.5 Sonnet and GPT-4.
|
Qodo Merge Pro leverages the world's leading code models - Claude 3.5 Sonnet and GPT-4.
|
||||||
As a result, its primary tools such as `describe`, `review`, and `improve`, as well as the PR-chat feature, support virtually all programming languages.
|
As a result, its primary tools such as `describe`, `review`, and `improve`, as well as the PR-chat feature, support virtually all programming languages.
|
||||||
|
|
||||||
For specialized commands that require static code analysis, Qodo Merge Pro offers support for specific languages. For more details about features that require static code analysis, please refer to the [documentation](https://qodo-merge-docs.qodo.ai/tools/analyze/#overview).
|
For specialized commands that require static code analysis, Qodo Merge Pro offers support for specific languages. For more details about features that require static code analysis, please refer to the [documentation](https://qodo-merge-docs.qodo.ai/tools/analyze/#overview).
|
||||||
|
@ -16,4 +16,4 @@ An example result:
|
|||||||
|
|
||||||
**Notes**
|
**Notes**
|
||||||
|
|
||||||
- Language that are currently supported: Python, Java, C++, JavaScript, TypeScript, C#.
|
- Language that are currently supported: Python, Java, C++, JavaScript, TypeScript, C#.
|
||||||
|
@ -16,7 +16,7 @@ It can be invoked manually by commenting on any PR:
|
|||||||
|
|
||||||
You can run `/ask` on specific lines of code in the PR from the PR's diff view. The tool will answer questions based on the code changes in the selected lines.
|
You can run `/ask` on specific lines of code in the PR from the PR's diff view. The tool will answer questions based on the code changes in the selected lines.
|
||||||
- Click on the '+' sign next to the line number to select the line.
|
- Click on the '+' sign next to the line number to select the line.
|
||||||
- To select multiple lines, click on the '+' sign of the first line and then hold and drag to select the rest of the lines.
|
- To select multiple lines, click on the '+' sign of the first line and then hold and drag to select the rest of the lines.
|
||||||
- write `/ask "..."` in the comment box and press `Add single comment` button.
|
- write `/ask "..."` in the comment box and press `Add single comment` button.
|
||||||
|
|
||||||
{width=512}
|
{width=512}
|
||||||
@ -56,4 +56,4 @@ To get a direct link to an image, we recommend using the following scheme:
|
|||||||
{width=512}
|
{width=512}
|
||||||
|
|
||||||
|
|
||||||
See a full video tutorial [here](https://codium.ai/images/pr_agent/ask_image_video.mov)
|
See a full video tutorial [here](https://codium.ai/images/pr_agent/ask_image_video.mov)
|
||||||
|
@ -28,7 +28,7 @@ When working from CLI, you need to apply the [configuration changes](#configurat
|
|||||||
To enable custom labels, you need to apply the [configuration changes](#configuration-options) to the local `.pr_agent.toml` file in your repository.
|
To enable custom labels, you need to apply the [configuration changes](#configuration-options) to the local `.pr_agent.toml` file in your repository.
|
||||||
|
|
||||||
#### 3. Handle custom labels from the Repo's labels page 💎
|
#### 3. Handle custom labels from the Repo's labels page 💎
|
||||||
> This feature is available only in Qodo Merge Pro
|
> This feature is available only in Qodo Merge Pro
|
||||||
|
|
||||||
* GitHub : `https://github.com/{owner}/{repo}/labels`, or click on the "Labels" tab in the issues or PRs page.
|
* GitHub : `https://github.com/{owner}/{repo}/labels`, or click on the "Labels" tab in the issues or PRs page.
|
||||||
* GitLab : `https://gitlab.com/{owner}/{repo}/-/labels`, or click on "Manage" -> "Labels" on the left menu.
|
* GitLab : `https://gitlab.com/{owner}/{repo}/-/labels`, or click on "Manage" -> "Labels" on the left menu.
|
||||||
|
@ -41,7 +41,7 @@ The code suggestions should focus only on the following:
|
|||||||
- make sure every variable has a meaningful name
|
- make sure every variable has a meaningful name
|
||||||
- make sure the code is efficient
|
- make sure the code is efficient
|
||||||
"""
|
"""
|
||||||
```
|
```
|
||||||
|
|
||||||
(The instructions above are just an example. We want to emphasize that the prompt should be specific and clear, and be tailored to the needs of your project)
|
(The instructions above are just an example. We want to emphasize that the prompt should be specific and clear, and be tailored to the needs of your project)
|
||||||
|
|
||||||
@ -55,4 +55,4 @@ Results obtained with the prompt above:
|
|||||||
|
|
||||||
`num_code_suggestions`: number of code suggestions provided by the 'custom_prompt' tool. Default is 4.
|
`num_code_suggestions`: number of code suggestions provided by the 'custom_prompt' tool. Default is 4.
|
||||||
|
|
||||||
`enable_help_text`: if set to true, the tool will display a help text in the comment. Default is true.
|
`enable_help_text`: if set to true, the tool will display a help text in the comment. Default is true.
|
||||||
|
@ -30,4 +30,4 @@ You can state a name of a specific component in the PR to get documentation only
|
|||||||
**Notes**
|
**Notes**
|
||||||
|
|
||||||
- Language that are currently fully supported: Python, Java, C++, JavaScript, TypeScript, C#.
|
- Language that are currently fully supported: Python, Java, C++, JavaScript, TypeScript, C#.
|
||||||
- This tool can also be triggered interactively by using the [`analyze`](./analyze.md) tool.
|
- This tool can also be triggered interactively by using the [`analyze`](./analyze.md) tool.
|
||||||
|
@ -83,15 +83,15 @@ This feature is controlled by a boolean configuration parameter: `pr_code_sugges
|
|||||||
|
|
||||||
!!! note "Wiki must be enabled"
|
!!! note "Wiki must be enabled"
|
||||||
While the aggregation process is automatic, GitHub repositories require a one-time manual wiki setup.
|
While the aggregation process is automatic, GitHub repositories require a one-time manual wiki setup.
|
||||||
|
|
||||||
To initialize the wiki: navigate to `Wiki`, select `Create the first page`, then click `Save page`.
|
To initialize the wiki: navigate to `Wiki`, select `Create the first page`, then click `Save page`.
|
||||||
|
|
||||||
{width=768}
|
{width=768}
|
||||||
|
|
||||||
Once a wiki repo is created, the tool will automatically use this wiki for tracking suggestions.
|
Once a wiki repo is created, the tool will automatically use this wiki for tracking suggestions.
|
||||||
|
|
||||||
!!! note "Why a wiki page?"
|
!!! note "Why a wiki page?"
|
||||||
Your code belongs to you, and we respect your privacy. Hence, we won't store any code suggestions in an external database.
|
Your code belongs to you, and we respect your privacy. Hence, we won't store any code suggestions in an external database.
|
||||||
|
|
||||||
Instead, we leverage a dedicated private page, within your repository wiki, to track suggestions. This approach offers convenient secure suggestion tracking while avoiding pull requests or any noise to the main repository.
|
Instead, we leverage a dedicated private page, within your repository wiki, to track suggestions. This approach offers convenient secure suggestion tracking while avoiding pull requests or any noise to the main repository.
|
||||||
|
|
||||||
@ -109,10 +109,10 @@ In addition to mistakes (which may happen, but are rare), sometimes the presente
|
|||||||
In such cases, we recommend prioritizing the suggestion's detailed description, using the diff snippet primarily as a supporting reference.
|
In such cases, we recommend prioritizing the suggestion's detailed description, using the diff snippet primarily as a supporting reference.
|
||||||
|
|
||||||
### Dual publishing mode
|
### Dual publishing mode
|
||||||
Our recommended approach for presenting code suggestions is through a [table](https://qodo-merge-docs.qodo.ai/tools/improve/#overview) (`--pr_code_suggestions.commitable_code_suggestions=false`).
|
Our recommended approach for presenting code suggestions is through a [table](https://qodo-merge-docs.qodo.ai/tools/improve/#overview) (`--pr_code_suggestions.commitable_code_suggestions=false`).
|
||||||
This method significantly reduces the PR footprint and allows for quick and easy digestion of multiple suggestions.
|
This method significantly reduces the PR footprint and allows for quick and easy digestion of multiple suggestions.
|
||||||
|
|
||||||
We also offer a complementary **dual publishing mode**. When enabled, suggestions exceeding a certain score threshold are not only displayed in the table, but also presented as commitable PR comments.
|
We also offer a complementary **dual publishing mode**. When enabled, suggestions exceeding a certain score threshold are not only displayed in the table, but also presented as commitable PR comments.
|
||||||
This mode helps highlight suggestions deemed more critical.
|
This mode helps highlight suggestions deemed more critical.
|
||||||
|
|
||||||
To activate dual publishing mode, use the following setting:
|
To activate dual publishing mode, use the following setting:
|
||||||
@ -165,9 +165,9 @@ code_suggestions_self_review_text = "... (your text here) ..."
|
|||||||
{width=512}
|
{width=512}
|
||||||
|
|
||||||
- If you keep the number of required reviewers for a PR to 1 and enable this configuration, this effectively means that the PR author can approve the PR by actively clicking the self-review checkbox.
|
- If you keep the number of required reviewers for a PR to 1 and enable this configuration, this effectively means that the PR author can approve the PR by actively clicking the self-review checkbox.
|
||||||
|
|
||||||
To prevent unauthorized approvals, this configuration defaults to false, and cannot be altered through online comments; enabling requires a direct update to the configuration file and a commit to the repository. This ensures that utilizing the feature demands a deliberate documented decision by the repository owner.
|
To prevent unauthorized approvals, this configuration defaults to false, and cannot be altered through online comments; enabling requires a direct update to the configuration file and a commit to the repository. This ensures that utilizing the feature demands a deliberate documented decision by the repository owner.
|
||||||
|
|
||||||
|
|
||||||
### How many code suggestions are generated?
|
### How many code suggestions are generated?
|
||||||
Qodo Merge uses a dynamic strategy to generate code suggestions based on the size of the pull request (PR). Here's how it works:
|
Qodo Merge uses a dynamic strategy to generate code suggestions based on the size of the pull request (PR). Here's how it works:
|
||||||
@ -199,7 +199,7 @@ Note: Chunking is primarily relevant for large PRs. For most PRs (up to 500 line
|
|||||||
|
|
||||||
You can use the `extra_instructions` configuration option to give the AI model additional instructions for the `improve` tool.
|
You can use the `extra_instructions` configuration option to give the AI model additional instructions for the `improve` tool.
|
||||||
Be specific, clear, and concise in the instructions. With extra instructions, you are the prompter. Specify relevant aspects that you want the model to focus on.
|
Be specific, clear, and concise in the instructions. With extra instructions, you are the prompter. Specify relevant aspects that you want the model to focus on.
|
||||||
|
|
||||||
Examples for possible instructions:
|
Examples for possible instructions:
|
||||||
```toml
|
```toml
|
||||||
[pr_code_suggestions]
|
[pr_code_suggestions]
|
||||||
@ -216,11 +216,11 @@ Use triple quotes to write multi-line instructions. Use bullet points or numbers
|
|||||||
|
|
||||||
>`Platforms supported: GitHub, GitLab`
|
>`Platforms supported: GitHub, GitLab`
|
||||||
|
|
||||||
Another option to give additional guidance to the AI model is by creating a dedicated [**wiki page**](https://github.com/Codium-ai/pr-agent/wiki) called `best_practices.md`.
|
Another option to give additional guidance to the AI model is by creating a dedicated [**wiki page**](https://github.com/Codium-ai/pr-agent/wiki) called `best_practices.md`.
|
||||||
This page can contain a list of best practices, coding standards, and guidelines that are specific to your repo/organization.
|
This page can contain a list of best practices, coding standards, and guidelines that are specific to your repo/organization.
|
||||||
|
|
||||||
The AI model will use this wiki page as a reference, and in case the PR code violates any of the guidelines, it will suggest improvements accordingly, with a dedicated label: `Organization
|
The AI model will use this wiki page as a reference, and in case the PR code violates any of the guidelines, it will suggest improvements accordingly, with a dedicated label: `Organization
|
||||||
best practice`.
|
best practice`.
|
||||||
|
|
||||||
Example for a `best_practices.md` content can be found [here](https://github.com/Codium-ai/pr-agent/blob/main/docs/docs/usage-guide/EXAMPLE_BEST_PRACTICE.md) (adapted from Google's [pyguide](https://google.github.io/styleguide/pyguide.html)).
|
Example for a `best_practices.md` content can be found [here](https://github.com/Codium-ai/pr-agent/blob/main/docs/docs/usage-guide/EXAMPLE_BEST_PRACTICE.md) (adapted from Google's [pyguide](https://google.github.io/styleguide/pyguide.html)).
|
||||||
This file is only an example. Since it is used as a prompt for an AI model, we want to emphasize the following:
|
This file is only an example. Since it is used as a prompt for an AI model, we want to emphasize the following:
|
||||||
@ -230,7 +230,7 @@ This file is only an example. Since it is used as a prompt for an AI model, we w
|
|||||||
- Recommended to limit the text to 800 lines or fewer. Here’s why:
|
- Recommended to limit the text to 800 lines or fewer. Here’s why:
|
||||||
|
|
||||||
1) Extremely long best practices documents may not be fully processed by the AI model.
|
1) Extremely long best practices documents may not be fully processed by the AI model.
|
||||||
|
|
||||||
2) A lengthy file probably represent a more "**generic**" set of guidelines, which the AI model is already familiar with. The objective is to focus on a more targeted set of guidelines tailored to the specific needs of this project.
|
2) A lengthy file probably represent a more "**generic**" set of guidelines, which the AI model is already familiar with. The objective is to focus on a more targeted set of guidelines tailored to the specific needs of this project.
|
||||||
|
|
||||||
##### Local and global best practices
|
##### Local and global best practices
|
||||||
@ -261,7 +261,7 @@ Using a combination of both can help the AI model to provide relevant and tailor
|
|||||||
## Configuration options
|
## Configuration options
|
||||||
|
|
||||||
??? example "General options"
|
??? example "General options"
|
||||||
|
|
||||||
<table>
|
<table>
|
||||||
<tr>
|
<tr>
|
||||||
<td><b>extra_instructions</b></td>
|
<td><b>extra_instructions</b></td>
|
||||||
@ -335,5 +335,5 @@ Using a combination of both can help the AI model to provide relevant and tailor
|
|||||||
- Only if the `Category` header is relevant, the user should move to the summarized suggestion description
|
- Only if the `Category` header is relevant, the user should move to the summarized suggestion description
|
||||||
- Only if the summarized suggestion description is relevant, the user should click on the collapsible, to read the full suggestion description with a code preview example.
|
- Only if the summarized suggestion description is relevant, the user should click on the collapsible, to read the full suggestion description with a code preview example.
|
||||||
|
|
||||||
- In addition, we recommend to use the [`extra_instructions`](https://qodo-merge-docs.qodo.ai/tools/improve/#extra-instructions-and-best-practices) field to guide the model to suggestions that are more relevant to the specific needs of the project.
|
- In addition, we recommend to use the [`extra_instructions`](https://qodo-merge-docs.qodo.ai/tools/improve/#extra-instructions-and-best-practices) field to guide the model to suggestions that are more relevant to the specific needs of the project.
|
||||||
- The interactive [PR chat](https://qodo-merge-docs.qodo.ai/chrome-extension/) also provides an easy way to get more tailored suggestions and feedback from the AI model.
|
- The interactive [PR chat](https://qodo-merge-docs.qodo.ai/chrome-extension/) also provides an easy way to get more tailored suggestions and feedback from the AI model.
|
||||||
|
@ -26,4 +26,4 @@ The tool will generate code suggestions for the selected component (if no compon
|
|||||||
- `num_code_suggestions`: number of code suggestions to provide. Default is 4
|
- `num_code_suggestions`: number of code suggestions to provide. Default is 4
|
||||||
- `extra_instructions`: Optional extra instructions to the tool. For example: "focus on ...".
|
- `extra_instructions`: Optional extra instructions to the tool. For example: "focus on ...".
|
||||||
- `file`: in case there are several components with the same name, you can specify the relevant file.
|
- `file`: in case there are several components with the same name, you can specify the relevant file.
|
||||||
- `class_name`: in case there are several methods with the same name in the same file, you can specify the relevant class name.
|
- `class_name`: in case there are several methods with the same name in the same file, you can specify the relevant class name.
|
||||||
|
@ -19,4 +19,4 @@ Here is a list of Qodo Merge tools, each with a dedicated page that explains how
|
|||||||
| **💎 [Improve Component (`/improve_component component_name`](./improve_component.md))** | Generates code suggestions for a specific code component that changed in the PR |
|
| **💎 [Improve Component (`/improve_component component_name`](./improve_component.md))** | Generates code suggestions for a specific code component that changed in the PR |
|
||||||
| **💎 [CI Feedback (`/checks ci_job`](./ci_feedback.md))** | Automatically generates feedback and analysis for a failed CI job |
|
| **💎 [CI Feedback (`/checks ci_job`](./ci_feedback.md))** | Automatically generates feedback and analysis for a failed CI job |
|
||||||
|
|
||||||
Note that the tools marked with 💎 are available only for Qodo Merge Pro users.
|
Note that the tools marked with 💎 are available only for Qodo Merge Pro users.
|
||||||
|
@ -180,10 +180,10 @@ If enabled, the `review` tool can approve a PR when a specific comment, `/review
|
|||||||
|
|
||||||
The `review` tool provides a collection of configurable feedbacks about a PR.
|
The `review` tool provides a collection of configurable feedbacks about a PR.
|
||||||
It is recommended to review the [Configuration options](#configuration-options) section, and choose the relevant options for your use case.
|
It is recommended to review the [Configuration options](#configuration-options) section, and choose the relevant options for your use case.
|
||||||
|
|
||||||
Some of the features that are disabled by default are quite useful, and should be considered for enabling. For example:
|
Some of the features that are disabled by default are quite useful, and should be considered for enabling. For example:
|
||||||
`require_score_review`, and more.
|
`require_score_review`, and more.
|
||||||
|
|
||||||
On the other hand, if you find one of the enabled features to be irrelevant for your use case, disable it. No default configuration can fit all use cases.
|
On the other hand, if you find one of the enabled features to be irrelevant for your use case, disable it. No default configuration can fit all use cases.
|
||||||
|
|
||||||
!!! tip "Automation"
|
!!! tip "Automation"
|
||||||
@ -197,19 +197,19 @@ If enabled, the `review` tool can approve a PR when a specific comment, `/review
|
|||||||
!!! tip "Possible labels from the review tool"
|
!!! tip "Possible labels from the review tool"
|
||||||
|
|
||||||
The `review` tool can auto-generate two specific types of labels for a PR:
|
The `review` tool can auto-generate two specific types of labels for a PR:
|
||||||
|
|
||||||
- a `possible security issue` label that detects if a possible [security issue](https://github.com/Codium-ai/pr-agent/blob/tr/user_description/pr_agent/settings/pr_reviewer_prompts.toml#L136) exists in the PR code (`enable_review_labels_security` flag)
|
- a `possible security issue` label that detects if a possible [security issue](https://github.com/Codium-ai/pr-agent/blob/tr/user_description/pr_agent/settings/pr_reviewer_prompts.toml#L136) exists in the PR code (`enable_review_labels_security` flag)
|
||||||
- a `Review effort [1-5]: x` label, where x is the estimated effort to review the PR (`enable_review_labels_effort` flag)
|
- a `Review effort [1-5]: x` label, where x is the estimated effort to review the PR (`enable_review_labels_effort` flag)
|
||||||
|
|
||||||
Both modes are useful, and we recommended to enable them.
|
Both modes are useful, and we recommended to enable them.
|
||||||
|
|
||||||
!!! tip "Extra instructions"
|
!!! tip "Extra instructions"
|
||||||
|
|
||||||
Extra instructions are important.
|
Extra instructions are important.
|
||||||
The `review` tool can be configured with extra instructions, which can be used to guide the model to a feedback tailored to the needs of your project.
|
The `review` tool can be configured with extra instructions, which can be used to guide the model to a feedback tailored to the needs of your project.
|
||||||
|
|
||||||
Be specific, clear, and concise in the instructions. With extra instructions, you are the prompter. Specify the relevant sub-tool, and the relevant aspects of the PR that you want to emphasize.
|
Be specific, clear, and concise in the instructions. With extra instructions, you are the prompter. Specify the relevant sub-tool, and the relevant aspects of the PR that you want to emphasize.
|
||||||
|
|
||||||
Examples of extra instructions:
|
Examples of extra instructions:
|
||||||
```
|
```
|
||||||
[pr_reviewer]
|
[pr_reviewer]
|
||||||
@ -227,22 +227,22 @@ If enabled, the `review` tool can approve a PR when a specific comment, `/review
|
|||||||
!!! tip "Auto-approval"
|
!!! tip "Auto-approval"
|
||||||
|
|
||||||
Qodo Merge can approve a PR when a specific comment is invoked.
|
Qodo Merge can approve a PR when a specific comment is invoked.
|
||||||
|
|
||||||
To ensure safety, the auto-approval feature is disabled by default. To enable auto-approval, you need to actively set in a pre-defined configuration file the following:
|
To ensure safety, the auto-approval feature is disabled by default. To enable auto-approval, you need to actively set in a pre-defined configuration file the following:
|
||||||
```
|
```
|
||||||
[pr_reviewer]
|
[pr_reviewer]
|
||||||
enable_auto_approval = true
|
enable_auto_approval = true
|
||||||
```
|
```
|
||||||
(this specific flag cannot be set with a command line argument, only in the configuration file, committed to the repository)
|
(this specific flag cannot be set with a command line argument, only in the configuration file, committed to the repository)
|
||||||
|
|
||||||
|
|
||||||
After enabling, by commenting on a PR:
|
After enabling, by commenting on a PR:
|
||||||
```
|
```
|
||||||
/review auto_approve
|
/review auto_approve
|
||||||
```
|
```
|
||||||
Qodo Merge will automatically approve the PR, and add a comment with the approval.
|
Qodo Merge will automatically approve the PR, and add a comment with the approval.
|
||||||
|
|
||||||
|
|
||||||
You can also enable auto-approval only if the PR meets certain requirements, such as that the `estimated_review_effort` label is equal or below a certain threshold, by adjusting the flag:
|
You can also enable auto-approval only if the PR meets certain requirements, such as that the `estimated_review_effort` label is equal or below a certain threshold, by adjusting the flag:
|
||||||
```
|
```
|
||||||
[pr_reviewer]
|
[pr_reviewer]
|
||||||
@ -258,4 +258,3 @@ If enabled, the `review` tool can approve a PR when a specific comment, `/review
|
|||||||
[//]: # ( Notice If you are interested **only** in the code suggestions, it is recommended to use the [`improve`](./improve.md) feature instead, since it is a dedicated only to code suggestions, and usually gives better results.)
|
[//]: # ( Notice If you are interested **only** in the code suggestions, it is recommended to use the [`improve`](./improve.md) feature instead, since it is a dedicated only to code suggestions, and usually gives better results.)
|
||||||
|
|
||||||
[//]: # ( Use the `review` tool if you want to get more comprehensive feedback, which includes code suggestions as well.)
|
[//]: # ( Use the `review` tool if you want to get more comprehensive feedback, which includes code suggestions as well.)
|
||||||
|
|
||||||
|
@ -51,7 +51,7 @@ It can be invoked automatically from the analyze table, can be accessed by:
|
|||||||
Choose the components you want to find similar code for, and click on the `similar` checkbox.
|
Choose the components you want to find similar code for, and click on the `similar` checkbox.
|
||||||
{width=768}
|
{width=768}
|
||||||
|
|
||||||
If you are looking to search for similar code in the organization's codebase, you can click on the `Organization` checkbox, and it will invoke a new search command just for the organization's codebase.
|
If you are looking to search for similar code in the organization's codebase, you can click on the `Organization` checkbox, and it will invoke a new search command just for the organization's codebase.
|
||||||
|
|
||||||
{width=768}
|
{width=768}
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@ It can be invoked manually by commenting on any PR:
|
|||||||
Note that to perform retrieval, the `similar_issue` tool indexes all the repo previous issues (once).
|
Note that to perform retrieval, the `similar_issue` tool indexes all the repo previous issues (once).
|
||||||
|
|
||||||
|
|
||||||
**Select VectorDBs** by changing `pr_similar_issue` parameter in `configuration.toml` file
|
**Select VectorDBs** by changing `pr_similar_issue` parameter in `configuration.toml` file
|
||||||
|
|
||||||
2 VectorDBs are available to switch in
|
2 VectorDBs are available to switch in
|
||||||
1. LanceDB
|
1. LanceDB
|
||||||
@ -40,4 +40,4 @@ These parameters can be obtained by registering to [Pinecone](https://app.pineco
|
|||||||
- To invoke the 'similar' issue tool via online usage, [comment](https://github.com/Codium-ai/pr-agent/issues/178#issuecomment-1716934893) on a PR:
|
- To invoke the 'similar' issue tool via online usage, [comment](https://github.com/Codium-ai/pr-agent/issues/178#issuecomment-1716934893) on a PR:
|
||||||
`/similar_issue`
|
`/similar_issue`
|
||||||
|
|
||||||
- You can also enable the 'similar issue' tool to run automatically when a new issue is opened, by adding it to the [pr_commands list in the github_app section](https://github.com/Codium-ai/pr-agent/blob/main/pr_agent/settings/configuration.toml#L66)
|
- You can also enable the 'similar issue' tool to run automatically when a new issue is opened, by adding it to the [pr_commands list in the github_app section](https://github.com/Codium-ai/pr-agent/blob/main/pr_agent/settings/configuration.toml#L66)
|
||||||
|
@ -29,4 +29,4 @@ The tool will generate tests for the selected component (if no component is stat
|
|||||||
- `extra_instructions`: Optional extra instructions to the tool. For example: "use the following mock injection scheme: ...".
|
- `extra_instructions`: Optional extra instructions to the tool. For example: "use the following mock injection scheme: ...".
|
||||||
- `file`: in case there are several components with the same name, you can specify the relevant file.
|
- `file`: in case there are several components with the same name, you can specify the relevant file.
|
||||||
- `class_name`: in case there are several methods with the same name in the same file, you can specify the relevant class name.
|
- `class_name`: in case there are several methods with the same name in the same file, you can specify the relevant class name.
|
||||||
- `enable_help_text`: if set to true, the tool will add a help text to the PR comment. Default is true.
|
- `enable_help_text`: if set to true, the tool will add a help text to the PR comment. Default is true.
|
||||||
|
@ -16,4 +16,4 @@ It can be invoked manually by commenting on any PR:
|
|||||||
Under the section `pr_update_changelog`, the [configuration file](https://github.com/Codium-ai/pr-agent/blob/main/pr_agent/settings/configuration.toml#L50) contains options to customize the 'update changelog' tool:
|
Under the section `pr_update_changelog`, the [configuration file](https://github.com/Codium-ai/pr-agent/blob/main/pr_agent/settings/configuration.toml#L50) contains options to customize the 'update changelog' tool:
|
||||||
|
|
||||||
- `push_changelog_changes`: whether to push the changes to CHANGELOG.md, or just print them. Default is false (print only).
|
- `push_changelog_changes`: whether to push the changes to CHANGELOG.md, or just print them. Default is false (print only).
|
||||||
- `extra_instructions`: Optional extra instructions to the tool. For example: "focus on the changes in the file X. Ignore change in ...
|
- `extra_instructions`: Optional extra instructions to the tool. For example: "focus on the changes in the file X. Ignore change in ...
|
||||||
|
@ -186,4 +186,4 @@ Do not rely on the atomicity of built-in types.
|
|||||||
|
|
||||||
While Python’s built-in data types such as dictionaries appear to have atomic operations, there are corner cases where they aren’t atomic (e.g. if `__hash__` or `__eq__` are implemented as Python methods) and their atomicity should not be relied upon. Neither should you rely on atomic variable assignment (since this in turn depends on dictionaries).
|
While Python’s built-in data types such as dictionaries appear to have atomic operations, there are corner cases where they aren’t atomic (e.g. if `__hash__` or `__eq__` are implemented as Python methods) and their atomicity should not be relied upon. Neither should you rely on atomic variable assignment (since this in turn depends on dictionaries).
|
||||||
|
|
||||||
Use the `queue` module’s `Queue` data type as the preferred way to communicate data between threads. Otherwise, use the `threading` module and its locking primitives. Prefer condition variables and `threading.Condition` instead of using lower-level locks.
|
Use the `queue` module’s `Queue` data type as the preferred way to communicate data between threads. Otherwise, use the `threading` module and its locking primitives. Prefer condition variables and `threading.Condition` instead of using lower-level locks.
|
||||||
|
@ -66,7 +66,7 @@ Any configuration value in [configuration file](https://github.com/Codium-ai/pr-
|
|||||||
|
|
||||||
### GitHub app automatic tools when a new PR is opened
|
### GitHub app automatic tools when a new PR is opened
|
||||||
|
|
||||||
The [github_app](https://github.com/Codium-ai/pr-agent/blob/main/pr_agent/settings/configuration.toml#L108) section defines GitHub app specific configurations.
|
The [github_app](https://github.com/Codium-ai/pr-agent/blob/main/pr_agent/settings/configuration.toml#L108) section defines GitHub app specific configurations.
|
||||||
|
|
||||||
The configuration parameter `pr_commands` defines the list of tools that will be **run automatically** when a new PR is opened.
|
The configuration parameter `pr_commands` defines the list of tools that will be **run automatically** when a new PR is opened.
|
||||||
```
|
```
|
||||||
@ -77,10 +77,10 @@ pr_commands = [
|
|||||||
"/improve",
|
"/improve",
|
||||||
]
|
]
|
||||||
```
|
```
|
||||||
This means that when a new PR is opened/reopened or marked as ready for review, Qodo Merge will run the `describe`, `review` and `improve` tools.
|
This means that when a new PR is opened/reopened or marked as ready for review, Qodo Merge will run the `describe`, `review` and `improve` tools.
|
||||||
For the `review` tool, for example, the `num_code_suggestions` parameter will be set to 0.
|
For the `review` tool, for example, the `num_code_suggestions` parameter will be set to 0.
|
||||||
|
|
||||||
You can override the default tool parameters by using one the three options for a [configuration file](https://qodo-merge-docs.qodo.ai/usage-guide/configuration_options/): **wiki**, **local**, or **global**.
|
You can override the default tool parameters by using one the three options for a [configuration file](https://qodo-merge-docs.qodo.ai/usage-guide/configuration_options/): **wiki**, **local**, or **global**.
|
||||||
For example, if your local `.pr_agent.toml` file contains:
|
For example, if your local `.pr_agent.toml` file contains:
|
||||||
```
|
```
|
||||||
[pr_description]
|
[pr_description]
|
||||||
@ -98,7 +98,7 @@ pr_commands = []
|
|||||||
|
|
||||||
In addition to running automatic tools when a PR is opened, the GitHub app can also respond to new code that is pushed to an open PR.
|
In addition to running automatic tools when a PR is opened, the GitHub app can also respond to new code that is pushed to an open PR.
|
||||||
|
|
||||||
The configuration toggle `handle_push_trigger` can be used to enable this feature.
|
The configuration toggle `handle_push_trigger` can be used to enable this feature.
|
||||||
The configuration parameter `push_commands` defines the list of tools that will be **run automatically** when new code is pushed to the PR.
|
The configuration parameter `push_commands` defines the list of tools that will be **run automatically** when new code is pushed to the PR.
|
||||||
```
|
```
|
||||||
[github_app]
|
[github_app]
|
||||||
@ -112,7 +112,7 @@ This means that when new code is pushed to the PR, the Qodo Merge will run the `
|
|||||||
|
|
||||||
## GitHub Action
|
## GitHub Action
|
||||||
`GitHub Action` is a different way to trigger Qodo Merge tools, and uses a different configuration mechanism than `GitHub App`.<br>
|
`GitHub Action` is a different way to trigger Qodo Merge tools, and uses a different configuration mechanism than `GitHub App`.<br>
|
||||||
You can configure settings for `GitHub Action` by adding environment variables under the env section in `.github/workflows/pr_agent.yml` file.
|
You can configure settings for `GitHub Action` by adding environment variables under the env section in `.github/workflows/pr_agent.yml` file.
|
||||||
Specifically, start by setting the following environment variables:
|
Specifically, start by setting the following environment variables:
|
||||||
```yaml
|
```yaml
|
||||||
env:
|
env:
|
||||||
@ -129,7 +129,7 @@ If not set, the default configuration is for all three tools to run automaticall
|
|||||||
`github_action_config.pr_actions` is used to configure which `pull_requests` events will trigger the enabled auto flags
|
`github_action_config.pr_actions` is used to configure which `pull_requests` events will trigger the enabled auto flags
|
||||||
If not set, the default configuration is `["opened", "reopened", "ready_for_review", "review_requested"]`
|
If not set, the default configuration is `["opened", "reopened", "ready_for_review", "review_requested"]`
|
||||||
|
|
||||||
`github_action_config.enable_output` are used to enable/disable github actions [output parameter](https://docs.github.com/en/actions/creating-actions/metadata-syntax-for-github-actions#outputs-for-docker-container-and-javascript-actions) (default is `true`).
|
`github_action_config.enable_output` are used to enable/disable github actions [output parameter](https://docs.github.com/en/actions/creating-actions/metadata-syntax-for-github-actions#outputs-for-docker-container-and-javascript-actions) (default is `true`).
|
||||||
Review result is output as JSON to `steps.{step-id}.outputs.review` property.
|
Review result is output as JSON to `steps.{step-id}.outputs.review` property.
|
||||||
The JSON structure is equivalent to the yaml data structure defined in [pr_reviewer_prompts.toml](https://github.com/idubnori/pr-agent/blob/main/pr_agent/settings/pr_reviewer_prompts.toml).
|
The JSON structure is equivalent to the yaml data structure defined in [pr_reviewer_prompts.toml](https://github.com/idubnori/pr-agent/blob/main/pr_agent/settings/pr_reviewer_prompts.toml).
|
||||||
|
|
||||||
@ -154,7 +154,7 @@ pr_commands = [
|
|||||||
```
|
```
|
||||||
|
|
||||||
the GitLab webhook can also respond to new code that is pushed to an open MR.
|
the GitLab webhook can also respond to new code that is pushed to an open MR.
|
||||||
The configuration toggle `handle_push_trigger` can be used to enable this feature.
|
The configuration toggle `handle_push_trigger` can be used to enable this feature.
|
||||||
The configuration parameter `push_commands` defines the list of tools that will be **run automatically** when new code is pushed to the MR.
|
The configuration parameter `push_commands` defines the list of tools that will be **run automatically** when new code is pushed to the MR.
|
||||||
```
|
```
|
||||||
[gitlab]
|
[gitlab]
|
||||||
@ -210,11 +210,11 @@ git_provider="azure"
|
|||||||
```
|
```
|
||||||
|
|
||||||
Azure DevOps provider supports [PAT token](https://learn.microsoft.com/en-us/azure/devops/organizations/accounts/use-personal-access-tokens-to-authenticate?view=azure-devops&tabs=Windows) or [DefaultAzureCredential](https://learn.microsoft.com/en-us/azure/developer/python/sdk/authentication-overview#authentication-in-server-environments) authentication.
|
Azure DevOps provider supports [PAT token](https://learn.microsoft.com/en-us/azure/devops/organizations/accounts/use-personal-access-tokens-to-authenticate?view=azure-devops&tabs=Windows) or [DefaultAzureCredential](https://learn.microsoft.com/en-us/azure/developer/python/sdk/authentication-overview#authentication-in-server-environments) authentication.
|
||||||
PAT is faster to create, but has build in expiration date, and will use the user identity for API calls.
|
PAT is faster to create, but has build in expiration date, and will use the user identity for API calls.
|
||||||
Using DefaultAzureCredential you can use managed identity or Service principle, which are more secure and will create separate ADO user identity (via AAD) to the agent.
|
Using DefaultAzureCredential you can use managed identity or Service principle, which are more secure and will create separate ADO user identity (via AAD) to the agent.
|
||||||
|
|
||||||
If PAT was chosen, you can assign the value in .secrets.toml.
|
If PAT was chosen, you can assign the value in .secrets.toml.
|
||||||
If DefaultAzureCredential was chosen, you can assigned the additional env vars like AZURE_CLIENT_SECRET directly,
|
If DefaultAzureCredential was chosen, you can assigned the additional env vars like AZURE_CLIENT_SECRET directly,
|
||||||
or use managed identity/az cli (for local development) without any additional configuration.
|
or use managed identity/az cli (for local development) without any additional configuration.
|
||||||
in any case, 'org' value must be assigned in .secrets.toml:
|
in any case, 'org' value must be assigned in .secrets.toml:
|
||||||
```
|
```
|
||||||
|
@ -9,7 +9,7 @@ model_turbo = "..."
|
|||||||
fallback_models = ["..."]
|
fallback_models = ["..."]
|
||||||
```
|
```
|
||||||
|
|
||||||
For models and environments not from OpenAI, you might need to provide additional keys and other parameters.
|
For models and environments not from OpenAI, you might need to provide additional keys and other parameters.
|
||||||
You can give parameters via a configuration file (see below for instructions), or from environment variables. See [litellm documentation](https://litellm.vercel.app/docs/proxy/quick_start#supported-llms) for the environment variables relevant per model.
|
You can give parameters via a configuration file (see below for instructions), or from environment variables. See [litellm documentation](https://litellm.vercel.app/docs/proxy/quick_start#supported-llms) for the environment variables relevant per model.
|
||||||
|
|
||||||
### Azure
|
### Azure
|
||||||
@ -108,7 +108,7 @@ To use Llama3 model with Groq, for example, set:
|
|||||||
[config] # in configuration.toml
|
[config] # in configuration.toml
|
||||||
model = "llama3-70b-8192"
|
model = "llama3-70b-8192"
|
||||||
model_turbo = "llama3-70b-8192"
|
model_turbo = "llama3-70b-8192"
|
||||||
fallback_models = ["groq/llama3-70b-8192"]
|
fallback_models = ["groq/llama3-70b-8192"]
|
||||||
[groq] # in .secrets.toml
|
[groq] # in .secrets.toml
|
||||||
key = ... # your Groq api key
|
key = ... # your Groq api key
|
||||||
```
|
```
|
||||||
@ -118,7 +118,7 @@ key = ... # your Groq api key
|
|||||||
|
|
||||||
To use Google's Vertex AI platform and its associated models (chat-bison/codechat-bison) set:
|
To use Google's Vertex AI platform and its associated models (chat-bison/codechat-bison) set:
|
||||||
|
|
||||||
```
|
```
|
||||||
[config] # in configuration.toml
|
[config] # in configuration.toml
|
||||||
model = "vertex_ai/codechat-bison"
|
model = "vertex_ai/codechat-bison"
|
||||||
model_turbo = "vertex_ai/codechat-bison"
|
model_turbo = "vertex_ai/codechat-bison"
|
||||||
@ -170,7 +170,7 @@ KEY = "..."
|
|||||||
|
|
||||||
To use Amazon Bedrock and its foundational models, add the below configuration:
|
To use Amazon Bedrock and its foundational models, add the below configuration:
|
||||||
|
|
||||||
```
|
```
|
||||||
[config] # in configuration.toml
|
[config] # in configuration.toml
|
||||||
model="bedrock/anthropic.claude-3-sonnet-20240229-v1:0"
|
model="bedrock/anthropic.claude-3-sonnet-20240229-v1:0"
|
||||||
model_turbo="bedrock/anthropic.claude-3-sonnet-20240229-v1:0"
|
model_turbo="bedrock/anthropic.claude-3-sonnet-20240229-v1:0"
|
||||||
|
@ -20,7 +20,7 @@ In terms of precedence, wiki configurations will override local configurations,
|
|||||||
|
|
||||||
`Platforms supported: GitHub, GitLab, Bitbucket`
|
`Platforms supported: GitHub, GitLab, Bitbucket`
|
||||||
|
|
||||||
With Qodo Merge Pro, you can set configurations by creating a page called `.pr_agent.toml` in the [wiki](https://github.com/Codium-ai/pr-agent/wiki/pr_agent.toml) of the repo.
|
With Qodo Merge Pro, you can set configurations by creating a page called `.pr_agent.toml` in the [wiki](https://github.com/Codium-ai/pr-agent/wiki/pr_agent.toml) of the repo.
|
||||||
The advantage of this method is that it allows to set configurations without needing to commit new content to the repo - just edit the wiki page and **save**.
|
The advantage of this method is that it allows to set configurations without needing to commit new content to the repo - just edit the wiki page and **save**.
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
# Usage guide
|
# Usage guide
|
||||||
|
|
||||||
This page provides a detailed guide on how to use Qodo Merge.
|
This page provides a detailed guide on how to use Qodo Merge.
|
||||||
It includes information on how to adjust Qodo Merge configurations, define which tools will run automatically, and other advanced configurations.
|
It includes information on how to adjust Qodo Merge configurations, define which tools will run automatically, and other advanced configurations.
|
||||||
|
|
||||||
|
|
||||||
@ -23,4 +23,4 @@ It includes information on how to adjust Qodo Merge configurations, define which
|
|||||||
- [Changing a model](./additional_configurations.md#changing-a-model)
|
- [Changing a model](./additional_configurations.md#changing-a-model)
|
||||||
- [Patch Extra Lines](./additional_configurations.md#patch-extra-lines)
|
- [Patch Extra Lines](./additional_configurations.md#patch-extra-lines)
|
||||||
- [Editing the prompts](./additional_configurations.md#editing-the-prompts)
|
- [Editing the prompts](./additional_configurations.md#editing-the-prompts)
|
||||||
- [Qodo Merge Pro Models](./PR_agent_pro_models.md)
|
- [Qodo Merge Pro Models](./PR_agent_pro_models.md)
|
||||||
|
@ -10,4 +10,3 @@ Specifically, CLI commands can be issued by invoking a pre-built [docker image](
|
|||||||
|
|
||||||
For online usage, you will need to setup either a [GitHub App](https://qodo-merge-docs.qodo.ai/installation/github/#run-as-a-github-app) or a [GitHub Action](https://qodo-merge-docs.qodo.ai/installation/github/#run-as-a-github-action) (GitHub), a [GitLab webhook](https://qodo-merge-docs.qodo.ai/installation/gitlab/#run-a-gitlab-webhook-server) (GitLab), or a [BitBucket App](https://qodo-merge-docs.qodo.ai/installation/bitbucket/#run-using-codiumai-hosted-bitbucket-app) (BitBucket).
|
For online usage, you will need to setup either a [GitHub App](https://qodo-merge-docs.qodo.ai/installation/github/#run-as-a-github-app) or a [GitHub Action](https://qodo-merge-docs.qodo.ai/installation/github/#run-as-a-github-action) (GitHub), a [GitLab webhook](https://qodo-merge-docs.qodo.ai/installation/gitlab/#run-a-gitlab-webhook-server) (GitLab), or a [BitBucket App](https://qodo-merge-docs.qodo.ai/installation/bitbucket/#run-using-codiumai-hosted-bitbucket-app) (BitBucket).
|
||||||
These platforms also enable to run Qodo Merge specific tools automatically when a new PR is opened, or on each push to a branch.
|
These platforms also enable to run Qodo Merge specific tools automatically when a new PR is opened, or on each push to a branch.
|
||||||
|
|
||||||
|
@ -9,10 +9,10 @@ As an alternative, you can filter in your mail provider the notifications specif
|
|||||||
{width=512}
|
{width=512}
|
||||||
|
|
||||||
|
|
||||||
Another option to reduce the mail overload, yet still receive notifications on Qodo Merge tools, is to disable the help collapsible section in Qodo Merge bot comments.
|
Another option to reduce the mail overload, yet still receive notifications on Qodo Merge tools, is to disable the help collapsible section in Qodo Merge bot comments.
|
||||||
This can done by setting `enable_help_text=false` for the relevant tool in the configuration file.
|
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:
|
For example, to disable the help text for the `pr_reviewer` tool, set:
|
||||||
```
|
```
|
||||||
[pr_reviewer]
|
[pr_reviewer]
|
||||||
enable_help_text = false
|
enable_help_text = false
|
||||||
```
|
```
|
||||||
|
@ -144,8 +144,8 @@ markdown_extensions:
|
|||||||
- md_in_html
|
- md_in_html
|
||||||
- attr_list
|
- attr_list
|
||||||
- pymdownx.emoji:
|
- pymdownx.emoji:
|
||||||
emoji_index: !!python/name:material.extensions.emoji.twemoji
|
emoji_index: "!!python/name:material.extensions.emoji.twemoji"
|
||||||
emoji_generator: !!python/name:material.extensions.emoji.to_svg
|
emoji_generator: "!!python/name:material.extensions.emoji.to_svg"
|
||||||
- toc:
|
- toc:
|
||||||
title: On this page
|
title: On this page
|
||||||
toc_depth: 3
|
toc_depth: 3
|
||||||
|
@ -2,9 +2,9 @@
|
|||||||
|
|
||||||
{% block scripts %}
|
{% block scripts %}
|
||||||
{{ super() }}
|
{{ super() }}
|
||||||
|
|
||||||
<!-- Google Tag Manager (noscript) -->
|
<!-- Google Tag Manager (noscript) -->
|
||||||
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-5C9KZBM3"
|
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-5C9KZBM3"
|
||||||
height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
|
height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
|
||||||
<!-- End Google Tag Manager (noscript) -->
|
<!-- End Google Tag Manager (noscript) -->
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
@ -42,7 +42,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.social-icons svg {
|
.social-icons svg {
|
||||||
width: 24px;
|
width: 24px;
|
||||||
height: auto;
|
height: auto;
|
||||||
fill: white;
|
fill: white;
|
||||||
}
|
}
|
||||||
|
@ -4,4 +4,4 @@
|
|||||||
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
|
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
|
||||||
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
|
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
|
||||||
})(window,document,'script','dataLayer','GTM-5C9KZBM3');</script>
|
})(window,document,'script','dataLayer','GTM-5C9KZBM3');</script>
|
||||||
<!-- End Google Tag Manager -->
|
<!-- End Google Tag Manager -->
|
||||||
|
@ -1 +0,0 @@
|
|||||||
|
|
||||||
|
@ -3,7 +3,6 @@ from functools import partial
|
|||||||
|
|
||||||
from pr_agent.algo.ai_handlers.base_ai_handler import BaseAiHandler
|
from pr_agent.algo.ai_handlers.base_ai_handler import BaseAiHandler
|
||||||
from pr_agent.algo.ai_handlers.litellm_ai_handler import LiteLLMAIHandler
|
from pr_agent.algo.ai_handlers.litellm_ai_handler import LiteLLMAIHandler
|
||||||
|
|
||||||
from pr_agent.algo.utils import update_settings_from_args
|
from pr_agent.algo.utils import update_settings_from_args
|
||||||
from pr_agent.config_loader import get_settings
|
from pr_agent.config_loader import get_settings
|
||||||
from pr_agent.git_providers.utils import apply_repo_settings
|
from pr_agent.git_providers.utils import apply_repo_settings
|
||||||
|
@ -3,7 +3,7 @@ from abc import ABC, abstractmethod
|
|||||||
|
|
||||||
class BaseAiHandler(ABC):
|
class BaseAiHandler(ABC):
|
||||||
"""
|
"""
|
||||||
This class defines the interface for an AI handler to be used by the PR Agents.
|
This class defines the interface for an AI handler to be used by the PR Agents.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
@ -23,6 +23,6 @@ class BaseAiHandler(ABC):
|
|||||||
model (str): the name of the model to use for the chat completion
|
model (str): the name of the model to use for the chat completion
|
||||||
system (str): the system message string to use for the chat completion
|
system (str): the system message string to use for the chat completion
|
||||||
user (str): the user message string to use for the chat completion
|
user (str): the user message string to use for the chat completion
|
||||||
temperature (float): the temperature to use for the chat completion
|
temperature (float): the temperature to use for the chat completion
|
||||||
"""
|
"""
|
||||||
pass
|
pass
|
||||||
|
@ -1,17 +1,18 @@
|
|||||||
try:
|
try:
|
||||||
from langchain_openai import ChatOpenAI, AzureChatOpenAI
|
from langchain_core.messages import HumanMessage, SystemMessage
|
||||||
from langchain_core.messages import SystemMessage, HumanMessage
|
from langchain_openai import AzureChatOpenAI, ChatOpenAI
|
||||||
except: # we don't enforce langchain as a dependency, so if it's not installed, just move on
|
except: # we don't enforce langchain as a dependency, so if it's not installed, just move on
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
import functools
|
||||||
|
|
||||||
|
from openai import APIError, RateLimitError, Timeout
|
||||||
|
from retry import retry
|
||||||
|
|
||||||
from pr_agent.algo.ai_handlers.base_ai_handler import BaseAiHandler
|
from pr_agent.algo.ai_handlers.base_ai_handler import BaseAiHandler
|
||||||
from pr_agent.config_loader import get_settings
|
from pr_agent.config_loader import get_settings
|
||||||
from pr_agent.log import get_logger
|
from pr_agent.log import get_logger
|
||||||
|
|
||||||
from openai import APIError, RateLimitError, Timeout
|
|
||||||
from retry import retry
|
|
||||||
import functools
|
|
||||||
|
|
||||||
OPENAI_RETRIES = 5
|
OPENAI_RETRIES = 5
|
||||||
|
|
||||||
|
|
||||||
@ -73,4 +74,3 @@ class LangChainOpenAIHandler(BaseAiHandler):
|
|||||||
raise ValueError(f"OpenAI {e.name} is required") from e
|
raise ValueError(f"OpenAI {e.name} is required") from e
|
||||||
else:
|
else:
|
||||||
raise e
|
raise e
|
||||||
|
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
import os
|
import os
|
||||||
import requests
|
|
||||||
import litellm
|
import litellm
|
||||||
import openai
|
import openai
|
||||||
|
import requests
|
||||||
from litellm import acompletion
|
from litellm import acompletion
|
||||||
from tenacity import retry, retry_if_exception_type, stop_after_attempt
|
from tenacity import retry, retry_if_exception_type, stop_after_attempt
|
||||||
|
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
from pr_agent.algo.ai_handlers.base_ai_handler import BaseAiHandler
|
|
||||||
import openai
|
import openai
|
||||||
from openai.error import APIError, RateLimitError, Timeout, TryAgain
|
from openai.error import APIError, RateLimitError, Timeout, TryAgain
|
||||||
from retry import retry
|
from retry import retry
|
||||||
|
|
||||||
|
from pr_agent.algo.ai_handlers.base_ai_handler import BaseAiHandler
|
||||||
from pr_agent.config_loader import get_settings
|
from pr_agent.config_loader import get_settings
|
||||||
from pr_agent.log import get_logger
|
from pr_agent.log import get_logger
|
||||||
|
|
||||||
|
@ -3,8 +3,8 @@ from __future__ import annotations
|
|||||||
import re
|
import re
|
||||||
import traceback
|
import traceback
|
||||||
|
|
||||||
from pr_agent.config_loader import get_settings
|
|
||||||
from pr_agent.algo.types import EDIT_TYPE, FilePatchInfo
|
from pr_agent.algo.types import EDIT_TYPE, FilePatchInfo
|
||||||
|
from pr_agent.config_loader import get_settings
|
||||||
from pr_agent.log import get_logger
|
from pr_agent.log import get_logger
|
||||||
|
|
||||||
|
|
||||||
@ -388,4 +388,4 @@ def extract_hunk_lines_from_patch(patch: str, file_name, line_start, line_end, s
|
|||||||
if not line.startswith('-'): # currently we don't support /ask line for deleted lines
|
if not line.startswith('-'): # currently we don't support /ask line for deleted lines
|
||||||
selected_lines_num += 1
|
selected_lines_num += 1
|
||||||
|
|
||||||
return patch_with_lines_str.rstrip(), selected_lines.rstrip()
|
return patch_with_lines_str.rstrip(), selected_lines.rstrip()
|
||||||
|
@ -4,8 +4,6 @@ from typing import Dict
|
|||||||
from pr_agent.config_loader import get_settings
|
from pr_agent.config_loader import get_settings
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def filter_bad_extensions(files):
|
def filter_bad_extensions(files):
|
||||||
# Bad Extensions, source: https://github.com/EleutherAI/github-downloader/blob/345e7c4cbb9e0dc8a0615fd995a08bf9d73b3fe6/download_repo_text.py # noqa: E501
|
# Bad Extensions, source: https://github.com/EleutherAI/github-downloader/blob/345e7c4cbb9e0dc8a0615fd995a08bf9d73b3fe6/download_repo_text.py # noqa: E501
|
||||||
bad_extensions = get_settings().bad_extensions.default
|
bad_extensions = get_settings().bad_extensions.default
|
||||||
|
@ -5,14 +5,15 @@ from typing import Callable, List, Tuple
|
|||||||
|
|
||||||
from github import RateLimitExceededException
|
from github import RateLimitExceededException
|
||||||
|
|
||||||
from pr_agent.algo.git_patch_processing import convert_to_hunks_with_lines_numbers, extend_patch, handle_patch_deletions
|
|
||||||
from pr_agent.algo.language_handler import sort_files_by_main_languages
|
|
||||||
from pr_agent.algo.file_filter import filter_ignored
|
from pr_agent.algo.file_filter import filter_ignored
|
||||||
|
from pr_agent.algo.git_patch_processing import (
|
||||||
|
convert_to_hunks_with_lines_numbers, extend_patch, handle_patch_deletions)
|
||||||
|
from pr_agent.algo.language_handler import sort_files_by_main_languages
|
||||||
from pr_agent.algo.token_handler import TokenHandler
|
from pr_agent.algo.token_handler import TokenHandler
|
||||||
from pr_agent.algo.utils import get_max_tokens, clip_tokens, ModelType
|
from pr_agent.algo.types import EDIT_TYPE, FilePatchInfo
|
||||||
|
from pr_agent.algo.utils import ModelType, clip_tokens, get_max_tokens
|
||||||
from pr_agent.config_loader import get_settings
|
from pr_agent.config_loader import get_settings
|
||||||
from pr_agent.git_providers.git_provider import GitProvider
|
from pr_agent.git_providers.git_provider import GitProvider
|
||||||
from pr_agent.algo.types import EDIT_TYPE, FilePatchInfo
|
|
||||||
from pr_agent.log import get_logger
|
from pr_agent.log import get_logger
|
||||||
|
|
||||||
DELETED_FILES_ = "Deleted files:\n"
|
DELETED_FILES_ = "Deleted files:\n"
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
from jinja2 import Environment, StrictUndefined
|
|
||||||
from tiktoken import encoding_for_model, get_encoding
|
|
||||||
from pr_agent.config_loader import get_settings
|
|
||||||
from threading import Lock
|
from threading import Lock
|
||||||
|
|
||||||
|
from jinja2 import Environment, StrictUndefined
|
||||||
|
from tiktoken import encoding_for_model, get_encoding
|
||||||
|
|
||||||
|
from pr_agent.config_loader import get_settings
|
||||||
from pr_agent.log import get_logger
|
from pr_agent.log import get_logger
|
||||||
|
|
||||||
|
|
||||||
@ -85,4 +86,4 @@ class TokenHandler:
|
|||||||
Returns:
|
Returns:
|
||||||
The number of tokens in the patch string.
|
The number of tokens in the patch string.
|
||||||
"""
|
"""
|
||||||
return len(self.encoder.encode(patch, disallowed_special=()))
|
return len(self.encoder.encode(patch, disallowed_special=()))
|
||||||
|
@ -14,7 +14,6 @@ from datetime import datetime
|
|||||||
from enum import Enum
|
from enum import Enum
|
||||||
from typing import Any, List, Tuple
|
from typing import Any, List, Tuple
|
||||||
|
|
||||||
|
|
||||||
import html2text
|
import html2text
|
||||||
import requests
|
import requests
|
||||||
import yaml
|
import yaml
|
||||||
@ -23,10 +22,11 @@ from starlette_context import context
|
|||||||
|
|
||||||
from pr_agent.algo import MAX_TOKENS
|
from pr_agent.algo import MAX_TOKENS
|
||||||
from pr_agent.algo.token_handler import TokenEncoder
|
from pr_agent.algo.token_handler import TokenEncoder
|
||||||
from pr_agent.config_loader import get_settings, global_settings
|
|
||||||
from pr_agent.algo.types import FilePatchInfo
|
from pr_agent.algo.types import FilePatchInfo
|
||||||
|
from pr_agent.config_loader import get_settings, global_settings
|
||||||
from pr_agent.log import get_logger
|
from pr_agent.log import get_logger
|
||||||
|
|
||||||
|
|
||||||
class Range(BaseModel):
|
class Range(BaseModel):
|
||||||
line_start: int # should be 0-indexed
|
line_start: int # should be 0-indexed
|
||||||
line_end: int
|
line_end: int
|
||||||
|
@ -4,7 +4,7 @@ import os
|
|||||||
|
|
||||||
from pr_agent.agent.pr_agent import PRAgent, commands
|
from pr_agent.agent.pr_agent import PRAgent, commands
|
||||||
from pr_agent.config_loader import get_settings
|
from pr_agent.config_loader import get_settings
|
||||||
from pr_agent.log import setup_logger, get_logger
|
from pr_agent.log import get_logger, setup_logger
|
||||||
|
|
||||||
log_level = os.environ.get("LOG_LEVEL", "INFO")
|
log_level = os.environ.get("LOG_LEVEL", "INFO")
|
||||||
setup_logger(log_level)
|
setup_logger(log_level)
|
||||||
|
@ -1,14 +1,16 @@
|
|||||||
|
from starlette_context import context
|
||||||
|
|
||||||
from pr_agent.config_loader import get_settings
|
from pr_agent.config_loader import get_settings
|
||||||
|
from pr_agent.git_providers.azuredevops_provider import AzureDevopsProvider
|
||||||
from pr_agent.git_providers.bitbucket_provider import BitbucketProvider
|
from pr_agent.git_providers.bitbucket_provider import BitbucketProvider
|
||||||
from pr_agent.git_providers.bitbucket_server_provider import BitbucketServerProvider
|
from pr_agent.git_providers.bitbucket_server_provider import \
|
||||||
|
BitbucketServerProvider
|
||||||
from pr_agent.git_providers.codecommit_provider import CodeCommitProvider
|
from pr_agent.git_providers.codecommit_provider import CodeCommitProvider
|
||||||
|
from pr_agent.git_providers.gerrit_provider import GerritProvider
|
||||||
from pr_agent.git_providers.git_provider import GitProvider
|
from pr_agent.git_providers.git_provider import GitProvider
|
||||||
from pr_agent.git_providers.github_provider import GithubProvider
|
from pr_agent.git_providers.github_provider import GithubProvider
|
||||||
from pr_agent.git_providers.gitlab_provider import GitLabProvider
|
from pr_agent.git_providers.gitlab_provider import GitLabProvider
|
||||||
from pr_agent.git_providers.local_git_provider import LocalGitProvider
|
from pr_agent.git_providers.local_git_provider import LocalGitProvider
|
||||||
from pr_agent.git_providers.azuredevops_provider import AzureDevopsProvider
|
|
||||||
from pr_agent.git_providers.gerrit_provider import GerritProvider
|
|
||||||
from starlette_context import context
|
|
||||||
|
|
||||||
_GIT_PROVIDERS = {
|
_GIT_PROVIDERS = {
|
||||||
'github': GithubProvider,
|
'github': GithubProvider,
|
||||||
|
@ -2,33 +2,33 @@ import os
|
|||||||
from typing import Optional, Tuple
|
from typing import Optional, Tuple
|
||||||
from urllib.parse import urlparse
|
from urllib.parse import urlparse
|
||||||
|
|
||||||
from ..algo.file_filter import filter_ignored
|
|
||||||
from ..log import get_logger
|
|
||||||
from ..algo.language_handler import is_valid_file
|
|
||||||
from ..algo.utils import clip_tokens, find_line_number_of_relevant_line_in_file, load_large_diff, PRDescriptionHeader
|
|
||||||
from ..config_loader import get_settings
|
|
||||||
from .git_provider import GitProvider
|
|
||||||
from pr_agent.algo.types import EDIT_TYPE, FilePatchInfo
|
from pr_agent.algo.types import EDIT_TYPE, FilePatchInfo
|
||||||
|
|
||||||
|
from ..algo.file_filter import filter_ignored
|
||||||
|
from ..algo.language_handler import is_valid_file
|
||||||
|
from ..algo.utils import (PRDescriptionHeader, clip_tokens,
|
||||||
|
find_line_number_of_relevant_line_in_file,
|
||||||
|
load_large_diff)
|
||||||
|
from ..config_loader import get_settings
|
||||||
|
from ..log import get_logger
|
||||||
|
from .git_provider import GitProvider
|
||||||
|
|
||||||
AZURE_DEVOPS_AVAILABLE = True
|
AZURE_DEVOPS_AVAILABLE = True
|
||||||
ADO_APP_CLIENT_DEFAULT_ID = "499b84ac-1321-427f-aa17-267ca6975798/.default"
|
ADO_APP_CLIENT_DEFAULT_ID = "499b84ac-1321-427f-aa17-267ca6975798/.default"
|
||||||
MAX_PR_DESCRIPTION_AZURE_LENGTH = 4000-1
|
MAX_PR_DESCRIPTION_AZURE_LENGTH = 4000-1
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# noinspection PyUnresolvedReferences
|
# noinspection PyUnresolvedReferences
|
||||||
from msrest.authentication import BasicAuthentication
|
|
||||||
# noinspection PyUnresolvedReferences
|
# noinspection PyUnresolvedReferences
|
||||||
from azure.devops.connection import Connection
|
from azure.devops.connection import Connection
|
||||||
# noinspection PyUnresolvedReferences
|
# noinspection PyUnresolvedReferences
|
||||||
from azure.identity import DefaultAzureCredential
|
from azure.devops.v7_1.git.models import (Comment, CommentThread,
|
||||||
|
GitPullRequest,
|
||||||
|
GitPullRequestIterationChanges,
|
||||||
|
GitVersionDescriptor)
|
||||||
# noinspection PyUnresolvedReferences
|
# noinspection PyUnresolvedReferences
|
||||||
from azure.devops.v7_1.git.models import (
|
from azure.identity import DefaultAzureCredential
|
||||||
Comment,
|
from msrest.authentication import BasicAuthentication
|
||||||
CommentThread,
|
|
||||||
GitVersionDescriptor,
|
|
||||||
GitPullRequest,
|
|
||||||
GitPullRequestIterationChanges,
|
|
||||||
)
|
|
||||||
except ImportError:
|
except ImportError:
|
||||||
AZURE_DEVOPS_AVAILABLE = False
|
AZURE_DEVOPS_AVAILABLE = False
|
||||||
|
|
||||||
@ -620,4 +620,3 @@ class AzureDevopsProvider(GitProvider):
|
|||||||
|
|
||||||
def publish_file_comments(self, file_comments: list) -> bool:
|
def publish_file_comments(self, file_comments: list) -> bool:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@ -6,13 +6,14 @@ import requests
|
|||||||
from atlassian.bitbucket import Cloud
|
from atlassian.bitbucket import Cloud
|
||||||
from starlette_context import context
|
from starlette_context import context
|
||||||
|
|
||||||
from pr_agent.algo.types import FilePatchInfo, EDIT_TYPE
|
from pr_agent.algo.types import EDIT_TYPE, FilePatchInfo
|
||||||
|
|
||||||
from ..algo.file_filter import filter_ignored
|
from ..algo.file_filter import filter_ignored
|
||||||
from ..algo.language_handler import is_valid_file
|
from ..algo.language_handler import is_valid_file
|
||||||
from ..algo.utils import find_line_number_of_relevant_line_in_file
|
from ..algo.utils import find_line_number_of_relevant_line_in_file
|
||||||
from ..config_loader import get_settings
|
from ..config_loader import get_settings
|
||||||
from ..log import get_logger
|
from ..log import get_logger
|
||||||
from .git_provider import GitProvider, MAX_FILES_ALLOWED_FULL
|
from .git_provider import MAX_FILES_ALLOWED_FULL, GitProvider
|
||||||
|
|
||||||
|
|
||||||
def _gef_filename(diff):
|
def _gef_filename(diff):
|
||||||
|
@ -1,16 +1,17 @@
|
|||||||
from distutils.version import LooseVersion
|
from distutils.version import LooseVersion
|
||||||
from requests.exceptions import HTTPError
|
|
||||||
from typing import Optional, Tuple
|
from typing import Optional, Tuple
|
||||||
from urllib.parse import quote_plus, urlparse
|
from urllib.parse import quote_plus, urlparse
|
||||||
|
|
||||||
from atlassian.bitbucket import Bitbucket
|
from atlassian.bitbucket import Bitbucket
|
||||||
|
from requests.exceptions import HTTPError
|
||||||
|
|
||||||
from .git_provider import GitProvider
|
|
||||||
from ..algo.types import EDIT_TYPE, FilePatchInfo
|
|
||||||
from ..algo.language_handler import is_valid_file
|
from ..algo.language_handler import is_valid_file
|
||||||
from ..algo.utils import load_large_diff, find_line_number_of_relevant_line_in_file
|
from ..algo.types import EDIT_TYPE, FilePatchInfo
|
||||||
|
from ..algo.utils import (find_line_number_of_relevant_line_in_file,
|
||||||
|
load_large_diff)
|
||||||
from ..config_loader import get_settings
|
from ..config_loader import get_settings
|
||||||
from ..log import get_logger
|
from ..log import get_logger
|
||||||
|
from .git_provider import GitProvider
|
||||||
|
|
||||||
|
|
||||||
class BitbucketServerProvider(GitProvider):
|
class BitbucketServerProvider(GitProvider):
|
||||||
|
@ -4,13 +4,15 @@ from collections import Counter
|
|||||||
from typing import List, Optional, Tuple
|
from typing import List, Optional, Tuple
|
||||||
from urllib.parse import urlparse
|
from urllib.parse import urlparse
|
||||||
|
|
||||||
from pr_agent.git_providers.codecommit_client import CodeCommitClient
|
from pr_agent.algo.language_handler import is_valid_file
|
||||||
from pr_agent.algo.types import EDIT_TYPE, FilePatchInfo
|
from pr_agent.algo.types import EDIT_TYPE, FilePatchInfo
|
||||||
|
from pr_agent.git_providers.codecommit_client import CodeCommitClient
|
||||||
|
|
||||||
from ..algo.utils import load_large_diff
|
from ..algo.utils import load_large_diff
|
||||||
from .git_provider import GitProvider
|
|
||||||
from ..config_loader import get_settings
|
from ..config_loader import get_settings
|
||||||
from ..log import get_logger
|
from ..log import get_logger
|
||||||
from pr_agent.algo.language_handler import is_valid_file
|
from .git_provider import GitProvider
|
||||||
|
|
||||||
|
|
||||||
class PullRequestCCMimic:
|
class PullRequestCCMimic:
|
||||||
"""
|
"""
|
||||||
@ -162,7 +164,7 @@ class CodeCommitProvider(GitProvider):
|
|||||||
pr_body=CodeCommitProvider._add_additional_newlines(pr_body),
|
pr_body=CodeCommitProvider._add_additional_newlines(pr_body),
|
||||||
)
|
)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise ValueError(f"CodeCommit Cannot publish description for PR: {self.pr_num}") from e
|
raise ValueError(f"CodeCommit Cannot publish description for PR: {self.pr_num}") from e
|
||||||
|
|
||||||
def publish_comment(self, pr_comment: str, is_temporary: bool = False):
|
def publish_comment(self, pr_comment: str, is_temporary: bool = False):
|
||||||
if is_temporary:
|
if is_temporary:
|
||||||
@ -190,7 +192,7 @@ class CodeCommitProvider(GitProvider):
|
|||||||
if not all(key in suggestion for key in ["body", "relevant_file", "relevant_lines_start"]):
|
if not all(key in suggestion for key in ["body", "relevant_file", "relevant_lines_start"]):
|
||||||
get_logger().warning(f"Skipping code suggestion #{counter}: Each suggestion must have 'body', 'relevant_file', 'relevant_lines_start' keys")
|
get_logger().warning(f"Skipping code suggestion #{counter}: Each suggestion must have 'body', 'relevant_file', 'relevant_lines_start' keys")
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# Publish the code suggestion to CodeCommit
|
# Publish the code suggestion to CodeCommit
|
||||||
try:
|
try:
|
||||||
get_logger().debug(f"Code Suggestion #{counter} in file: {suggestion['relevant_file']}: {suggestion['relevant_lines_start']}")
|
get_logger().debug(f"Code Suggestion #{counter} in file: {suggestion['relevant_file']}: {suggestion['relevant_lines_start']}")
|
||||||
@ -205,12 +207,12 @@ class CodeCommitProvider(GitProvider):
|
|||||||
)
|
)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise ValueError(f"CodeCommit Cannot publish code suggestions for PR: {self.pr_num}") from e
|
raise ValueError(f"CodeCommit Cannot publish code suggestions for PR: {self.pr_num}") from e
|
||||||
|
|
||||||
counter += 1
|
counter += 1
|
||||||
|
|
||||||
# The calling function passes in a list of code suggestions, and this function publishes each suggestion one at a time.
|
# The calling function passes in a list of code suggestions, and this function publishes each suggestion one at a time.
|
||||||
# If we were to return False here, the calling function will attempt to publish the same list of code suggestions again, one at a time.
|
# If we were to return False here, the calling function will attempt to publish the same list of code suggestions again, one at a time.
|
||||||
# Since this function publishes the suggestions one at a time anyway, we always return True here to avoid the retry.
|
# Since this function publishes the suggestions one at a time anyway, we always return True here to avoid the retry.
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def publish_labels(self, labels):
|
def publish_labels(self, labels):
|
||||||
@ -238,7 +240,7 @@ class CodeCommitProvider(GitProvider):
|
|||||||
def get_pr_id(self):
|
def get_pr_id(self):
|
||||||
"""
|
"""
|
||||||
Returns the PR ID in the format: "repo_name/pr_number".
|
Returns the PR ID in the format: "repo_name/pr_number".
|
||||||
Note: This is an internal identifier for PR-Agent,
|
Note: This is an internal identifier for PR-Agent,
|
||||||
and is not the same as the CodeCommit PR identifier.
|
and is not the same as the CodeCommit PR identifier.
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
@ -246,7 +248,7 @@ class CodeCommitProvider(GitProvider):
|
|||||||
return pr_id
|
return pr_id
|
||||||
except:
|
except:
|
||||||
return ""
|
return ""
|
||||||
|
|
||||||
def get_languages(self):
|
def get_languages(self):
|
||||||
"""
|
"""
|
||||||
Returns a dictionary of languages, containing the percentage of each language used in the PR.
|
Returns a dictionary of languages, containing the percentage of each language used in the PR.
|
||||||
@ -348,7 +350,7 @@ class CodeCommitProvider(GitProvider):
|
|||||||
"""
|
"""
|
||||||
Check if the provided hostname is a valid AWS CodeCommit hostname.
|
Check if the provided hostname is a valid AWS CodeCommit hostname.
|
||||||
|
|
||||||
This is not an exhaustive check of AWS region names,
|
This is not an exhaustive check of AWS region names,
|
||||||
but instead uses a regex to check for matching AWS region patterns.
|
but instead uses a regex to check for matching AWS region patterns.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
|
@ -12,9 +12,9 @@ import requests
|
|||||||
import urllib3.util
|
import urllib3.util
|
||||||
from git import Repo
|
from git import Repo
|
||||||
|
|
||||||
|
from pr_agent.algo.types import EDIT_TYPE, FilePatchInfo
|
||||||
from pr_agent.config_loader import get_settings
|
from pr_agent.config_loader import get_settings
|
||||||
from pr_agent.git_providers.git_provider import GitProvider
|
from pr_agent.git_providers.git_provider import GitProvider
|
||||||
from pr_agent.algo.types import EDIT_TYPE, FilePatchInfo
|
|
||||||
from pr_agent.git_providers.local_git_provider import PullRequestMimic
|
from pr_agent.git_providers.local_git_provider import PullRequestMimic
|
||||||
from pr_agent.log import get_logger
|
from pr_agent.log import get_logger
|
||||||
|
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
from abc import ABC, abstractmethod
|
from abc import ABC, abstractmethod
|
||||||
|
|
||||||
# enum EDIT_TYPE (ADDED, DELETED, MODIFIED, RENAMED)
|
# enum EDIT_TYPE (ADDED, DELETED, MODIFIED, RENAMED)
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
|
from pr_agent.algo.types import FilePatchInfo
|
||||||
from pr_agent.algo.utils import Range, process_description
|
from pr_agent.algo.utils import Range, process_description
|
||||||
from pr_agent.config_loader import get_settings
|
from pr_agent.config_loader import get_settings
|
||||||
from pr_agent.algo.types import FilePatchInfo
|
|
||||||
from pr_agent.log import get_logger
|
from pr_agent.log import get_logger
|
||||||
|
|
||||||
MAX_FILES_ALLOWED_FULL = 50
|
MAX_FILES_ALLOWED_FULL = 50
|
||||||
|
|
||||||
class GitProvider(ABC):
|
class GitProvider(ABC):
|
||||||
@ -62,8 +62,8 @@ class GitProvider(ABC):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
def get_pr_description(self, full: bool = True, split_changes_walkthrough=False) -> str or tuple:
|
def get_pr_description(self, full: bool = True, split_changes_walkthrough=False) -> str or tuple:
|
||||||
from pr_agent.config_loader import get_settings
|
|
||||||
from pr_agent.algo.utils import clip_tokens
|
from pr_agent.algo.utils import clip_tokens
|
||||||
|
from pr_agent.config_loader import get_settings
|
||||||
max_tokens_description = get_settings().get("CONFIG.MAX_DESCRIPTION_TOKENS", None)
|
max_tokens_description = get_settings().get("CONFIG.MAX_DESCRIPTION_TOKENS", None)
|
||||||
description = self.get_pr_description_full() if full else self.get_user_description()
|
description = self.get_pr_description_full() if full else self.get_user_description()
|
||||||
if split_changes_walkthrough:
|
if split_changes_walkthrough:
|
||||||
|
@ -1,10 +1,11 @@
|
|||||||
|
import hashlib
|
||||||
import itertools
|
import itertools
|
||||||
import time
|
import time
|
||||||
import hashlib
|
|
||||||
import traceback
|
import traceback
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from typing import Optional, Tuple
|
from typing import Optional, Tuple
|
||||||
from urllib.parse import urlparse
|
from urllib.parse import urlparse
|
||||||
|
|
||||||
from github import AppAuthentication, Auth, Github
|
from github import AppAuthentication, Auth, Github
|
||||||
from retry import retry
|
from retry import retry
|
||||||
from starlette_context import context
|
from starlette_context import context
|
||||||
@ -12,11 +13,14 @@ from starlette_context import context
|
|||||||
from ..algo.file_filter import filter_ignored
|
from ..algo.file_filter import filter_ignored
|
||||||
from ..algo.language_handler import is_valid_file
|
from ..algo.language_handler import is_valid_file
|
||||||
from ..algo.types import EDIT_TYPE
|
from ..algo.types import EDIT_TYPE
|
||||||
from ..algo.utils import PRReviewHeader, load_large_diff, clip_tokens, find_line_number_of_relevant_line_in_file, Range
|
from ..algo.utils import (PRReviewHeader, Range, clip_tokens,
|
||||||
|
find_line_number_of_relevant_line_in_file,
|
||||||
|
load_large_diff)
|
||||||
from ..config_loader import get_settings
|
from ..config_loader import get_settings
|
||||||
from ..log import get_logger
|
from ..log import get_logger
|
||||||
from ..servers.utils import RateLimitExceeded
|
from ..servers.utils import RateLimitExceeded
|
||||||
from .git_provider import FilePatchInfo, GitProvider, IncrementalPR, MAX_FILES_ALLOWED_FULL
|
from .git_provider import (MAX_FILES_ALLOWED_FULL, FilePatchInfo, GitProvider,
|
||||||
|
IncrementalPR)
|
||||||
|
|
||||||
|
|
||||||
class GithubProvider(GitProvider):
|
class GithubProvider(GitProvider):
|
||||||
|
@ -7,13 +7,16 @@ import gitlab
|
|||||||
import requests
|
import requests
|
||||||
from gitlab import GitlabGetError
|
from gitlab import GitlabGetError
|
||||||
|
|
||||||
|
from pr_agent.algo.types import EDIT_TYPE, FilePatchInfo
|
||||||
|
|
||||||
from ..algo.file_filter import filter_ignored
|
from ..algo.file_filter import filter_ignored
|
||||||
from ..algo.language_handler import is_valid_file
|
from ..algo.language_handler import is_valid_file
|
||||||
from ..algo.utils import load_large_diff, clip_tokens, find_line_number_of_relevant_line_in_file
|
from ..algo.utils import (clip_tokens,
|
||||||
|
find_line_number_of_relevant_line_in_file,
|
||||||
|
load_large_diff)
|
||||||
from ..config_loader import get_settings
|
from ..config_loader import get_settings
|
||||||
from .git_provider import GitProvider, MAX_FILES_ALLOWED_FULL
|
|
||||||
from pr_agent.algo.types import EDIT_TYPE, FilePatchInfo
|
|
||||||
from ..log import get_logger
|
from ..log import get_logger
|
||||||
|
from .git_provider import MAX_FILES_ALLOWED_FULL, GitProvider
|
||||||
|
|
||||||
|
|
||||||
class DiffNotFoundError(Exception):
|
class DiffNotFoundError(Exception):
|
||||||
|
@ -4,9 +4,9 @@ from typing import List
|
|||||||
|
|
||||||
from git import Repo
|
from git import Repo
|
||||||
|
|
||||||
|
from pr_agent.algo.types import EDIT_TYPE, FilePatchInfo
|
||||||
from pr_agent.config_loader import _find_repository_root, get_settings
|
from pr_agent.config_loader import _find_repository_root, get_settings
|
||||||
from pr_agent.git_providers.git_provider import GitProvider
|
from pr_agent.git_providers.git_provider import GitProvider
|
||||||
from pr_agent.algo.types import EDIT_TYPE, FilePatchInfo
|
|
||||||
from pr_agent.log import get_logger
|
from pr_agent.log import get_logger
|
||||||
|
|
||||||
|
|
||||||
|
@ -3,11 +3,12 @@ import os
|
|||||||
import tempfile
|
import tempfile
|
||||||
|
|
||||||
from dynaconf import Dynaconf
|
from dynaconf import Dynaconf
|
||||||
|
from starlette_context import context
|
||||||
|
|
||||||
from pr_agent.config_loader import get_settings
|
from pr_agent.config_loader import get_settings
|
||||||
from pr_agent.git_providers import get_git_provider, get_git_provider_with_context
|
from pr_agent.git_providers import (get_git_provider,
|
||||||
|
get_git_provider_with_context)
|
||||||
from pr_agent.log import get_logger
|
from pr_agent.log import get_logger
|
||||||
from starlette_context import context
|
|
||||||
|
|
||||||
|
|
||||||
def apply_repo_settings(pr_url):
|
def apply_repo_settings(pr_url):
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
from pr_agent.config_loader import get_settings
|
from pr_agent.config_loader import get_settings
|
||||||
from pr_agent.identity_providers.default_identity_provider import DefaultIdentityProvider
|
from pr_agent.identity_providers.default_identity_provider import \
|
||||||
|
DefaultIdentityProvider
|
||||||
|
|
||||||
_IDENTITY_PROVIDERS = {
|
_IDENTITY_PROVIDERS = {
|
||||||
'default': DefaultIdentityProvider
|
'default': DefaultIdentityProvider
|
||||||
@ -10,4 +11,4 @@ def get_identity_provider():
|
|||||||
identity_provider_id = get_settings().get("CONFIG.IDENTITY_PROVIDER", "default")
|
identity_provider_id = get_settings().get("CONFIG.IDENTITY_PROVIDER", "default")
|
||||||
if identity_provider_id not in _IDENTITY_PROVIDERS:
|
if identity_provider_id not in _IDENTITY_PROVIDERS:
|
||||||
raise ValueError(f"Unknown identity provider: {identity_provider_id}")
|
raise ValueError(f"Unknown identity provider: {identity_provider_id}")
|
||||||
return _IDENTITY_PROVIDERS[identity_provider_id]()
|
return _IDENTITY_PROVIDERS[identity_provider_id]()
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
from pr_agent.identity_providers.identity_provider import Eligibility, IdentityProvider
|
from pr_agent.identity_providers.identity_provider import (Eligibility,
|
||||||
|
IdentityProvider)
|
||||||
|
|
||||||
|
|
||||||
class DefaultIdentityProvider(IdentityProvider):
|
class DefaultIdentityProvider(IdentityProvider):
|
||||||
|
@ -8,12 +8,10 @@ def get_secret_provider():
|
|||||||
provider_id = get_settings().config.secret_provider
|
provider_id = get_settings().config.secret_provider
|
||||||
if provider_id == 'google_cloud_storage':
|
if provider_id == 'google_cloud_storage':
|
||||||
try:
|
try:
|
||||||
from pr_agent.secret_providers.google_cloud_storage_secret_provider import GoogleCloudStorageSecretProvider
|
from pr_agent.secret_providers.google_cloud_storage_secret_provider import \
|
||||||
|
GoogleCloudStorageSecretProvider
|
||||||
return GoogleCloudStorageSecretProvider()
|
return GoogleCloudStorageSecretProvider()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise ValueError(f"Failed to initialize google_cloud_storage secret provider {provider_id}") from e
|
raise ValueError(f"Failed to initialize google_cloud_storage secret provider {provider_id}") from e
|
||||||
else:
|
else:
|
||||||
raise ValueError("Unknown SECRET_PROVIDER")
|
raise ValueError("Unknown SECRET_PROVIDER")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -9,9 +9,9 @@ import secrets
|
|||||||
from urllib.parse import unquote
|
from urllib.parse import unquote
|
||||||
|
|
||||||
import uvicorn
|
import uvicorn
|
||||||
from fastapi import APIRouter, Depends, FastAPI, HTTPException
|
from fastapi import APIRouter, Depends, FastAPI, HTTPException, Request
|
||||||
from fastapi.security import HTTPBasic, HTTPBasicCredentials
|
|
||||||
from fastapi.encoders import jsonable_encoder
|
from fastapi.encoders import jsonable_encoder
|
||||||
|
from fastapi.security import HTTPBasic, HTTPBasicCredentials
|
||||||
from starlette import status
|
from starlette import status
|
||||||
from starlette.background import BackgroundTasks
|
from starlette.background import BackgroundTasks
|
||||||
from starlette.middleware import Middleware
|
from starlette.middleware import Middleware
|
||||||
@ -23,9 +23,6 @@ from pr_agent.agent.pr_agent import PRAgent, command2class
|
|||||||
from pr_agent.algo.utils import update_settings_from_args
|
from pr_agent.algo.utils import update_settings_from_args
|
||||||
from pr_agent.config_loader import get_settings
|
from pr_agent.config_loader import get_settings
|
||||||
from pr_agent.git_providers.utils import apply_repo_settings
|
from pr_agent.git_providers.utils import apply_repo_settings
|
||||||
from pr_agent.log import get_logger
|
|
||||||
from fastapi import Request, Depends
|
|
||||||
from fastapi.security import HTTPBasic, HTTPBasicCredentials
|
|
||||||
from pr_agent.log import LoggingFormat, get_logger, setup_logger
|
from pr_agent.log import LoggingFormat, get_logger, setup_logger
|
||||||
|
|
||||||
setup_logger(fmt=LoggingFormat.JSON, level="DEBUG")
|
setup_logger(fmt=LoggingFormat.JSON, level="DEBUG")
|
||||||
|
@ -6,20 +6,20 @@ from typing import List
|
|||||||
import uvicorn
|
import uvicorn
|
||||||
from fastapi import APIRouter, FastAPI
|
from fastapi import APIRouter, FastAPI
|
||||||
from fastapi.encoders import jsonable_encoder
|
from fastapi.encoders import jsonable_encoder
|
||||||
|
from fastapi.responses import RedirectResponse
|
||||||
from starlette import status
|
from starlette import status
|
||||||
from starlette.background import BackgroundTasks
|
from starlette.background import BackgroundTasks
|
||||||
from starlette.middleware import Middleware
|
from starlette.middleware import Middleware
|
||||||
from starlette.requests import Request
|
from starlette.requests import Request
|
||||||
from starlette.responses import JSONResponse
|
from starlette.responses import JSONResponse
|
||||||
from starlette_context.middleware import RawContextMiddleware
|
from starlette_context.middleware import RawContextMiddleware
|
||||||
|
|
||||||
from pr_agent.agent.pr_agent import PRAgent
|
from pr_agent.agent.pr_agent import PRAgent
|
||||||
from pr_agent.algo.utils import update_settings_from_args
|
from pr_agent.algo.utils import update_settings_from_args
|
||||||
from pr_agent.config_loader import get_settings
|
from pr_agent.config_loader import get_settings
|
||||||
from pr_agent.git_providers.utils import apply_repo_settings
|
from pr_agent.git_providers.utils import apply_repo_settings
|
||||||
from pr_agent.log import LoggingFormat, get_logger, setup_logger
|
from pr_agent.log import LoggingFormat, get_logger, setup_logger
|
||||||
from pr_agent.servers.utils import verify_signature
|
from pr_agent.servers.utils import verify_signature
|
||||||
from fastapi.responses import RedirectResponse
|
|
||||||
|
|
||||||
|
|
||||||
setup_logger(fmt=LoggingFormat.JSON, level="DEBUG")
|
setup_logger(fmt=LoggingFormat.JSON, level="DEBUG")
|
||||||
router = APIRouter()
|
router = APIRouter()
|
||||||
|
@ -15,7 +15,8 @@ from starlette_context.middleware import RawContextMiddleware
|
|||||||
from pr_agent.agent.pr_agent import PRAgent
|
from pr_agent.agent.pr_agent import PRAgent
|
||||||
from pr_agent.algo.utils import update_settings_from_args
|
from pr_agent.algo.utils import update_settings_from_args
|
||||||
from pr_agent.config_loader import get_settings, global_settings
|
from pr_agent.config_loader import get_settings, global_settings
|
||||||
from pr_agent.git_providers import get_git_provider, get_git_provider_with_context
|
from pr_agent.git_providers import (get_git_provider,
|
||||||
|
get_git_provider_with_context)
|
||||||
from pr_agent.git_providers.git_provider import IncrementalPR
|
from pr_agent.git_providers.git_provider import IncrementalPR
|
||||||
from pr_agent.git_providers.utils import apply_repo_settings
|
from pr_agent.git_providers.utils import apply_repo_settings
|
||||||
from pr_agent.identity_providers import get_identity_provider
|
from pr_agent.identity_providers import get_identity_provider
|
||||||
|
@ -1,11 +1,12 @@
|
|||||||
import asyncio
|
import asyncio
|
||||||
import multiprocessing
|
import multiprocessing
|
||||||
from collections import deque
|
|
||||||
import traceback
|
|
||||||
from datetime import datetime, timezone
|
|
||||||
import time
|
import time
|
||||||
import requests
|
import traceback
|
||||||
|
from collections import deque
|
||||||
|
from datetime import datetime, timezone
|
||||||
|
|
||||||
import aiohttp
|
import aiohttp
|
||||||
|
import requests
|
||||||
|
|
||||||
from pr_agent.agent.pr_agent import PRAgent
|
from pr_agent.agent.pr_agent import PRAgent
|
||||||
from pr_agent.config_loader import get_settings
|
from pr_agent.config_loader import get_settings
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import copy
|
import copy
|
||||||
import re
|
|
||||||
import json
|
import json
|
||||||
|
import re
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
import uvicorn
|
import uvicorn
|
||||||
|
@ -82,7 +82,7 @@ the tool will replace every marker of the form `pr_agent:marker_name` in the PR
|
|||||||
- `walkthrough`: the PR walkthrough.
|
- `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.
|
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.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
output += "\n\n</details></td></tr>\n\n"
|
output += "\n\n</details></td></tr>\n\n"
|
||||||
|
|
||||||
@ -101,7 +101,7 @@ Examples for custom labels:
|
|||||||
|
|
||||||
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.
|
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.
|
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.
|
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.
|
||||||
"""
|
"""
|
||||||
output += "\n\n</details></td></tr>\n\n"
|
output += "\n\n</details></td></tr>\n\n"
|
||||||
|
|
||||||
@ -126,7 +126,7 @@ Be specific, clear, and concise in the instructions. With extra instructions, yo
|
|||||||
|
|
||||||
Examples for extra instructions:
|
Examples for extra instructions:
|
||||||
```
|
```
|
||||||
[pr_description]
|
[pr_description]
|
||||||
extra_instructions="""\
|
extra_instructions="""\
|
||||||
- The PR title should be in the format: '<PR type>: <title>'
|
- The PR title should be in the format: '<PR type>: <title>'
|
||||||
- The title should be short and concise (up to 10 words)
|
- The title should be short and concise (up to 10 words)
|
||||||
@ -159,8 +159,8 @@ It can be invoked manually by commenting on any PR:
|
|||||||
/ask "..."
|
/ask "..."
|
||||||
```
|
```
|
||||||
|
|
||||||
Note that the tool does not have "memory" of previous questions, and answers each question independently.
|
Note that the tool does not have "memory" of previous questions, and answers each question independently.
|
||||||
You can ask questions about the entire PR, about specific code lines, or about an image related to the PR code changes.
|
You can ask questions about the entire PR, about specific code lines, or about an image related to the PR code changes.
|
||||||
"""
|
"""
|
||||||
# output += "\n\n<table>"
|
# output += "\n\n<table>"
|
||||||
#
|
#
|
||||||
@ -195,9 +195,9 @@ You can ask questions about the entire PR, about specific code lines, or about a
|
|||||||
some_config1=...
|
some_config1=...
|
||||||
some_config2=...
|
some_config2=...
|
||||||
```
|
```
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
output += f"\n\nSee the improve [usage page](https://pr-agent-docs.codium.ai/tools/improve/) for a comprehensive guide on using this tool.\n\n"
|
output += f"\n\nSee the improve [usage page](https://pr-agent-docs.codium.ai/tools/improve/) for a comprehensive guide on using this tool.\n\n"
|
||||||
|
|
||||||
return output
|
return output
|
||||||
|
@ -5,7 +5,6 @@ from starlette_context.middleware import RawContextMiddleware
|
|||||||
|
|
||||||
from pr_agent.servers.github_app import router
|
from pr_agent.servers.github_app import router
|
||||||
|
|
||||||
|
|
||||||
middleware = [Middleware(RawContextMiddleware)]
|
middleware = [Middleware(RawContextMiddleware)]
|
||||||
app = FastAPI(middleware=middleware)
|
app = FastAPI(middleware=middleware)
|
||||||
app.include_router(router)
|
app.include_router(router)
|
||||||
|
@ -2,7 +2,7 @@ import hashlib
|
|||||||
import hmac
|
import hmac
|
||||||
import time
|
import time
|
||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
from typing import Callable, Any
|
from typing import Any, Callable
|
||||||
|
|
||||||
from fastapi import HTTPException
|
from fastapi import HTTPException
|
||||||
|
|
||||||
|
@ -87,7 +87,7 @@ org = ""
|
|||||||
pat = ""
|
pat = ""
|
||||||
|
|
||||||
[azure_devops_server]
|
[azure_devops_server]
|
||||||
# For Azure devops Server basic auth - configured in the webhook creation
|
# For Azure devops Server basic auth - configured in the webhook creation
|
||||||
# Optional, uncomment if you want to use Azure devops webhooks. Value assinged when you create the webhook
|
# Optional, uncomment if you want to use Azure devops webhooks. Value assinged when you create the webhook
|
||||||
# webhook_username = "<basic auth user>"
|
# webhook_username = "<basic auth user>"
|
||||||
# webhook_password = "<basic auth password>"
|
# webhook_password = "<basic auth password>"
|
||||||
|
@ -13,4 +13,4 @@ enable_custom_labels=false
|
|||||||
#[custom_labels."Documentation"]
|
#[custom_labels."Documentation"]
|
||||||
#description = """Adds or modifies documentation"""
|
#description = """Adds or modifies documentation"""
|
||||||
#[custom_labels."Other"]
|
#[custom_labels."Other"]
|
||||||
#description = """Other changes that do not fit in any of the above categories"""
|
#description = """Other changes that do not fit in any of the above categories"""
|
||||||
|
@ -437,4 +437,4 @@ xBase = [".prg", ".prw", ]
|
|||||||
|
|
||||||
[docs_blacklist_extensions]
|
[docs_blacklist_extensions]
|
||||||
# Disable docs for these extensions of text files and scripts that are not programming languages of function, classes and methods
|
# Disable docs for these extensions of text files and scripts that are not programming languages of function, classes and methods
|
||||||
docs_blacklist = ['sql', 'txt', 'yaml', 'json', 'xml', 'md', 'rst', 'rest', 'rest.txt', 'rst.txt', 'mdpolicy', 'mdown', 'markdown', 'mdwn', 'mkd', 'mkdn', 'mkdown', 'sh']
|
docs_blacklist = ['sql', 'txt', 'yaml', 'json', 'xml', 'md', 'rst', 'rest', 'rest.txt', 'rst.txt', 'mdpolicy', 'mdown', 'markdown', 'mdwn', 'mkd', 'mkdn', 'mkdown', 'sh']
|
||||||
|
@ -118,4 +118,4 @@ The PR Diff:
|
|||||||
|
|
||||||
Response (should be a valid YAML, and nothing else):
|
Response (should be a valid YAML, and nothing else):
|
||||||
```yaml
|
```yaml
|
||||||
"""
|
"""
|
||||||
|
@ -1,25 +1,29 @@
|
|||||||
import asyncio
|
import asyncio
|
||||||
import copy
|
import copy
|
||||||
|
import difflib
|
||||||
|
import re
|
||||||
import textwrap
|
import textwrap
|
||||||
from functools import partial
|
from functools import partial
|
||||||
from typing import Dict, List
|
from typing import Dict, List
|
||||||
|
|
||||||
from jinja2 import Environment, StrictUndefined
|
from jinja2 import Environment, StrictUndefined
|
||||||
|
|
||||||
from pr_agent.algo.ai_handlers.base_ai_handler import BaseAiHandler
|
from pr_agent.algo.ai_handlers.base_ai_handler import BaseAiHandler
|
||||||
from pr_agent.algo.ai_handlers.litellm_ai_handler import LiteLLMAIHandler
|
from pr_agent.algo.ai_handlers.litellm_ai_handler import LiteLLMAIHandler
|
||||||
from pr_agent.algo.pr_processing import get_pr_diff, get_pr_multi_diffs, retry_with_fallback_models, \
|
from pr_agent.algo.pr_processing import (add_ai_metadata_to_diff_files,
|
||||||
add_ai_metadata_to_diff_files
|
get_pr_diff, get_pr_multi_diffs,
|
||||||
|
retry_with_fallback_models)
|
||||||
from pr_agent.algo.token_handler import TokenHandler
|
from pr_agent.algo.token_handler import TokenHandler
|
||||||
from pr_agent.algo.utils import load_yaml, replace_code_tags, ModelType, show_relevant_configurations
|
from pr_agent.algo.utils import (ModelType, load_yaml, replace_code_tags,
|
||||||
|
show_relevant_configurations)
|
||||||
from pr_agent.config_loader import get_settings
|
from pr_agent.config_loader import get_settings
|
||||||
from pr_agent.git_providers import get_git_provider, get_git_provider_with_context, GithubProvider, GitLabProvider, \
|
from pr_agent.git_providers import (AzureDevopsProvider, GithubProvider,
|
||||||
AzureDevopsProvider
|
GitLabProvider, get_git_provider,
|
||||||
|
get_git_provider_with_context)
|
||||||
from pr_agent.git_providers.git_provider import get_main_pr_language
|
from pr_agent.git_providers.git_provider import get_main_pr_language
|
||||||
from pr_agent.log import get_logger
|
from pr_agent.log import get_logger
|
||||||
from pr_agent.servers.help import HelpMessage
|
from pr_agent.servers.help import HelpMessage
|
||||||
from pr_agent.tools.pr_description import insert_br_after_x_chars
|
from pr_agent.tools.pr_description import insert_br_after_x_chars
|
||||||
import difflib
|
|
||||||
import re
|
|
||||||
|
|
||||||
|
|
||||||
class PRCodeSuggestions:
|
class PRCodeSuggestions:
|
||||||
@ -726,7 +730,7 @@ class PRCodeSuggestions:
|
|||||||
|
|
||||||
[{relevant_file} {range_str}]({code_snippet_link})
|
[{relevant_file} {range_str}]({code_snippet_link})
|
||||||
|
|
||||||
{example_code.rstrip()}
|
{example_code.rstrip()}
|
||||||
"""
|
"""
|
||||||
if get_settings().pr_code_suggestions.self_reflect_on_suggestions:
|
if get_settings().pr_code_suggestions.self_reflect_on_suggestions:
|
||||||
pr_body += f"<details><summary>Suggestion importance[1-10]: {suggestion['score']}</summary>\n\n"
|
pr_body += f"<details><summary>Suggestion importance[1-10]: {suggestion['score']}</summary>\n\n"
|
||||||
@ -778,4 +782,3 @@ class PRCodeSuggestions:
|
|||||||
get_logger().info(f"Could not reflect on suggestions, error: {e}")
|
get_logger().info(f"Could not reflect on suggestions, error: {e}")
|
||||||
return ""
|
return ""
|
||||||
return response_reflect
|
return response_reflect
|
||||||
|
|
||||||
|
@ -9,19 +9,24 @@ from jinja2 import Environment, StrictUndefined
|
|||||||
|
|
||||||
from pr_agent.algo.ai_handlers.base_ai_handler import BaseAiHandler
|
from pr_agent.algo.ai_handlers.base_ai_handler import BaseAiHandler
|
||||||
from pr_agent.algo.ai_handlers.litellm_ai_handler import LiteLLMAIHandler
|
from pr_agent.algo.ai_handlers.litellm_ai_handler import LiteLLMAIHandler
|
||||||
from pr_agent.algo.pr_processing import get_pr_diff, retry_with_fallback_models, get_pr_diff_multiple_patchs, \
|
from pr_agent.algo.pr_processing import (OUTPUT_BUFFER_TOKENS_HARD_THRESHOLD,
|
||||||
OUTPUT_BUFFER_TOKENS_HARD_THRESHOLD
|
get_pr_diff,
|
||||||
|
get_pr_diff_multiple_patchs,
|
||||||
|
retry_with_fallback_models)
|
||||||
from pr_agent.algo.token_handler import TokenHandler
|
from pr_agent.algo.token_handler import TokenHandler
|
||||||
from pr_agent.algo.utils import set_custom_labels, PRDescriptionHeader
|
from pr_agent.algo.utils import (ModelType, PRDescriptionHeader, clip_tokens,
|
||||||
from pr_agent.algo.utils import load_yaml, get_user_labels, ModelType, show_relevant_configurations, get_max_tokens, \
|
get_max_tokens, get_user_labels, load_yaml,
|
||||||
clip_tokens
|
set_custom_labels,
|
||||||
|
show_relevant_configurations)
|
||||||
from pr_agent.config_loader import get_settings
|
from pr_agent.config_loader import get_settings
|
||||||
from pr_agent.git_providers import get_git_provider, GithubProvider, get_git_provider_with_context
|
from pr_agent.git_providers import (GithubProvider, get_git_provider,
|
||||||
|
get_git_provider_with_context)
|
||||||
from pr_agent.git_providers.git_provider import get_main_pr_language
|
from pr_agent.git_providers.git_provider import get_main_pr_language
|
||||||
from pr_agent.log import get_logger
|
from pr_agent.log import get_logger
|
||||||
from pr_agent.servers.help import HelpMessage
|
from pr_agent.servers.help import HelpMessage
|
||||||
from pr_agent.tools.ticket_pr_compliance_check import extract_ticket_links_from_pr_description, extract_tickets, \
|
from pr_agent.tools.ticket_pr_compliance_check import (
|
||||||
extract_and_cache_pr_tickets
|
extract_and_cache_pr_tickets, extract_ticket_links_from_pr_description,
|
||||||
|
extract_tickets)
|
||||||
|
|
||||||
|
|
||||||
class PRDescription:
|
class PRDescription:
|
||||||
@ -297,7 +302,7 @@ class PRDescription:
|
|||||||
files_walkthrough = files_walkthrough.strip() + "\n" + extra_file_yaml.strip()
|
files_walkthrough = files_walkthrough.strip() + "\n" + extra_file_yaml.strip()
|
||||||
if i >= MAX_EXTRA_FILES_TO_OUTPUT:
|
if i >= MAX_EXTRA_FILES_TO_OUTPUT:
|
||||||
files_walkthrough += f"""\
|
files_walkthrough += f"""\
|
||||||
extra_file_yaml =
|
extra_file_yaml =
|
||||||
- filename: |
|
- filename: |
|
||||||
Additional {len(remaining_files_list) - MAX_EXTRA_FILES_TO_OUTPUT} files not shown
|
Additional {len(remaining_files_list) - MAX_EXTRA_FILES_TO_OUTPUT} files not shown
|
||||||
changes_summary: |
|
changes_summary: |
|
||||||
@ -611,7 +616,7 @@ extra_file_yaml =
|
|||||||
</td>
|
</td>
|
||||||
<td><a href="{link}">{diff_plus_minus}</a>{delta_nbsp}</td>
|
<td><a href="{link}">{diff_plus_minus}</a>{delta_nbsp}</td>
|
||||||
|
|
||||||
</tr>
|
</tr>
|
||||||
"""
|
"""
|
||||||
if use_collapsible_file_list:
|
if use_collapsible_file_list:
|
||||||
pr_body += """</table></details></td></tr>"""
|
pr_body += """</table></details></td></tr>"""
|
||||||
|
@ -9,7 +9,7 @@ from pr_agent.algo.ai_handlers.base_ai_handler import BaseAiHandler
|
|||||||
from pr_agent.algo.ai_handlers.litellm_ai_handler import LiteLLMAIHandler
|
from pr_agent.algo.ai_handlers.litellm_ai_handler import LiteLLMAIHandler
|
||||||
from pr_agent.algo.pr_processing import get_pr_diff, retry_with_fallback_models
|
from pr_agent.algo.pr_processing import get_pr_diff, retry_with_fallback_models
|
||||||
from pr_agent.algo.token_handler import TokenHandler
|
from pr_agent.algo.token_handler import TokenHandler
|
||||||
from pr_agent.algo.utils import load_yaml, set_custom_labels, get_user_labels
|
from pr_agent.algo.utils import get_user_labels, load_yaml, set_custom_labels
|
||||||
from pr_agent.config_loader import get_settings
|
from pr_agent.config_loader import get_settings
|
||||||
from pr_agent.git_providers import get_git_provider
|
from pr_agent.git_providers import get_git_provider
|
||||||
from pr_agent.git_providers.git_provider import get_main_pr_language
|
from pr_agent.git_providers.git_provider import get_main_pr_language
|
||||||
@ -57,7 +57,7 @@ class PRGenerateLabels:
|
|||||||
get_settings().pr_custom_labels_prompt.system,
|
get_settings().pr_custom_labels_prompt.system,
|
||||||
get_settings().pr_custom_labels_prompt.user,
|
get_settings().pr_custom_labels_prompt.user,
|
||||||
)
|
)
|
||||||
|
|
||||||
# Initialize patches_diff and prediction attributes
|
# Initialize patches_diff and prediction attributes
|
||||||
self.patches_diff = None
|
self.patches_diff = None
|
||||||
self.prediction = None
|
self.prediction = None
|
||||||
@ -98,7 +98,7 @@ class PRGenerateLabels:
|
|||||||
self.git_provider.remove_initial_comment()
|
self.git_provider.remove_initial_comment()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
get_logger().error(f"Error generating PR labels {self.pr_id}: {e}")
|
get_logger().error(f"Error generating PR labels {self.pr_id}: {e}")
|
||||||
|
|
||||||
return ""
|
return ""
|
||||||
|
|
||||||
async def _prepare_prediction(self, model: str) -> None:
|
async def _prepare_prediction(self, model: str) -> None:
|
||||||
|
@ -9,10 +9,10 @@ from pr_agent.algo.ai_handlers.base_ai_handler import BaseAiHandler
|
|||||||
from pr_agent.algo.ai_handlers.litellm_ai_handler import LiteLLMAIHandler
|
from pr_agent.algo.ai_handlers.litellm_ai_handler import LiteLLMAIHandler
|
||||||
from pr_agent.algo.pr_processing import retry_with_fallback_models
|
from pr_agent.algo.pr_processing import retry_with_fallback_models
|
||||||
from pr_agent.algo.token_handler import TokenHandler
|
from pr_agent.algo.token_handler import TokenHandler
|
||||||
from pr_agent.algo.utils import ModelType, load_yaml, clip_tokens
|
from pr_agent.algo.utils import ModelType, clip_tokens, load_yaml
|
||||||
from pr_agent.config_loader import get_settings
|
from pr_agent.config_loader import get_settings
|
||||||
from pr_agent.git_providers import GithubProvider, BitbucketServerProvider, \
|
from pr_agent.git_providers import (BitbucketServerProvider, GithubProvider,
|
||||||
get_git_provider_with_context
|
get_git_provider_with_context)
|
||||||
from pr_agent.log import get_logger
|
from pr_agent.log import get_logger
|
||||||
|
|
||||||
|
|
||||||
|
@ -6,8 +6,8 @@ from jinja2 import Environment, StrictUndefined
|
|||||||
|
|
||||||
from pr_agent.algo.ai_handlers.base_ai_handler import BaseAiHandler
|
from pr_agent.algo.ai_handlers.base_ai_handler import BaseAiHandler
|
||||||
from pr_agent.algo.ai_handlers.litellm_ai_handler import LiteLLMAIHandler
|
from pr_agent.algo.ai_handlers.litellm_ai_handler import LiteLLMAIHandler
|
||||||
from pr_agent.algo.git_patch_processing import convert_to_hunks_with_lines_numbers, \
|
from pr_agent.algo.git_patch_processing import (
|
||||||
extract_hunk_lines_from_patch
|
convert_to_hunks_with_lines_numbers, extract_hunk_lines_from_patch)
|
||||||
from pr_agent.algo.pr_processing import get_pr_diff, retry_with_fallback_models
|
from pr_agent.algo.pr_processing import get_pr_diff, retry_with_fallback_models
|
||||||
from pr_agent.algo.token_handler import TokenHandler
|
from pr_agent.algo.token_handler import TokenHandler
|
||||||
from pr_agent.algo.utils import ModelType
|
from pr_agent.algo.utils import ModelType
|
||||||
|
@ -4,19 +4,27 @@ import traceback
|
|||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
from functools import partial
|
from functools import partial
|
||||||
from typing import List, Tuple
|
from typing import List, Tuple
|
||||||
|
|
||||||
from jinja2 import Environment, StrictUndefined
|
from jinja2 import Environment, StrictUndefined
|
||||||
|
|
||||||
from pr_agent.algo.ai_handlers.base_ai_handler import BaseAiHandler
|
from pr_agent.algo.ai_handlers.base_ai_handler import BaseAiHandler
|
||||||
from pr_agent.algo.ai_handlers.litellm_ai_handler import LiteLLMAIHandler
|
from pr_agent.algo.ai_handlers.litellm_ai_handler import LiteLLMAIHandler
|
||||||
from pr_agent.algo.pr_processing import get_pr_diff, retry_with_fallback_models, add_ai_metadata_to_diff_files
|
from pr_agent.algo.pr_processing import (add_ai_metadata_to_diff_files,
|
||||||
|
get_pr_diff,
|
||||||
|
retry_with_fallback_models)
|
||||||
from pr_agent.algo.token_handler import TokenHandler
|
from pr_agent.algo.token_handler import TokenHandler
|
||||||
from pr_agent.algo.utils import github_action_output, load_yaml, ModelType, \
|
from pr_agent.algo.utils import (ModelType, PRReviewHeader,
|
||||||
show_relevant_configurations, convert_to_markdown_v2, PRReviewHeader
|
convert_to_markdown_v2, github_action_output,
|
||||||
|
load_yaml, show_relevant_configurations)
|
||||||
from pr_agent.config_loader import get_settings
|
from pr_agent.config_loader import get_settings
|
||||||
from pr_agent.git_providers import get_git_provider, get_git_provider_with_context
|
from pr_agent.git_providers import (get_git_provider,
|
||||||
from pr_agent.git_providers.git_provider import IncrementalPR, get_main_pr_language
|
get_git_provider_with_context)
|
||||||
|
from pr_agent.git_providers.git_provider import (IncrementalPR,
|
||||||
|
get_main_pr_language)
|
||||||
from pr_agent.log import get_logger
|
from pr_agent.log import get_logger
|
||||||
from pr_agent.servers.help import HelpMessage
|
from pr_agent.servers.help import HelpMessage
|
||||||
from pr_agent.tools.ticket_pr_compliance_check import extract_tickets, extract_and_cache_pr_tickets
|
from pr_agent.tools.ticket_pr_compliance_check import (
|
||||||
|
extract_and_cache_pr_tickets, extract_tickets)
|
||||||
|
|
||||||
|
|
||||||
class PRReviewer:
|
class PRReviewer:
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user