diff --git a/MANIFEST.in b/MANIFEST.in
new file mode 100644
index 00000000..ccb17336
--- /dev/null
+++ b/MANIFEST.in
@@ -0,0 +1,2 @@
+recursive-include pr_agent *.toml
+recursive-exclude pr_agent *.secrets.toml
\ No newline at end of file
diff --git a/README.md b/README.md
index ad3c0407..0f107870 100644
--- a/README.md
+++ b/README.md
@@ -6,7 +6,8 @@
-
+
+
Making pull requests less painful with an AI agent
@@ -32,16 +33,19 @@ Making pull requests less painful with an AI agent
## News and Updates
-### Jan 17, 2024
+### March 24, 2024
+PR-Agent is now available for easy installation via [pip](https://pr-agent-docs.codium.ai/installation/locally/#using-pip-package).
+
+### March 17, 2024
- A new feature is now available for the review tool: [`require_can_be_split_review`](https://pr-agent-docs.codium.ai/tools/review/#enabledisable-features).
If set to true, the tool will add a section that checks if the PR contains several themes, and can be split into smaller PRs.
-### Jan 10, 2024
+### March 10, 2024
- A new [knowledge-base website](https://pr-agent-docs.codium.ai/) for PR-Agent is now available. It includes detailed information about the different tools, usage guides and more, in an accessible and organized format.
-### Jan 8, 2024
+### March 8, 2024
- A new tool, [Find Similar Code](https://pr-agent-docs.codium.ai/tools/similar_code/) 💎 is now available.
This tool retrieves the most similar code components from inside the organization's codebase, or from open-source code:
@@ -59,7 +63,7 @@ If set to true, the tool will add a section that checks if the PR contains sever
## Overview
-CodiumAI PR-Agent is an open-source tool to help efficiently review and handle pull requests.
+CodiumAI PR-Agent aims to help efficiently review and handle pull requests, by providing AI feedbacks and suggestions
- See the [Installation Guide](https://pr-agent-docs.codium.ai/installation/) for instructions on installing and running the tool on different git platforms.
@@ -71,38 +75,38 @@ Supported commands per platform:
| | | GitHub | Gitlab | Bitbucket | Azure DevOps |
|-------|-------------------------------------------------------------------------------------------------------------------|:--------------------:|:--------------------:|:--------------------:|:--------------------:|
-| TOOLS | Review | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
-| | ⮑ Incremental | :white_check_mark: | | | |
-| | ⮑ [SOC2 Compliance](https://pr-agent-docs.codium.ai/tools/review/#soc2-ticket-compliance) 💎 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
-| | Describe | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
-| | ⮑ [Inline File Summary](https://pr-agent-docs.codium.ai/tools/describe#inline-file-summary) 💎 | :white_check_mark: | | | |
-| | Improve | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
-| | ⮑ Extended | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
-| | Ask | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
-| | ⮑ [Ask on code lines](https://pr-agent-docs.codium.ai/tools/ask#ask-lines) | :white_check_mark: | :white_check_mark: | | |
-| | [Custom Suggestions](https://pr-agent-docs.codium.ai/tools/custom_suggestions/) 💎 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
-| | [Test](https://pr-agent-docs.codium.ai/tools/test/) 💎 | :white_check_mark: | :white_check_mark: | | :white_check_mark: |
-| | Reflect and Review | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
-| | Update CHANGELOG.md | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
-| | Find Similar Issue | :white_check_mark: | | | |
-| | [Add PR Documentation](https://pr-agent-docs.codium.ai/tools/documentation/) 💎 | :white_check_mark: | :white_check_mark: | | :white_check_mark: |
-| | [Custom Labels](https://pr-agent-docs.codium.ai/tools/custom_labels/) 💎 | :white_check_mark: | :white_check_mark: | | :white_check_mark: |
-| | [Analyze](https://pr-agent-docs.codium.ai/tools/analyze/) 💎 | :white_check_mark: | :white_check_mark: | | :white_check_mark: |
-| | [CI Feedback](https://pr-agent-docs.codium.ai/tools/ci_feedback/) 💎 | :white_check_mark: | | | |
-| | [Similar Code](https://pr-agent-docs.codium.ai/tools/similar_code/) 💎 | :white_check_mark: | | | |
+| TOOLS | Review | ✅ | ✅ | ✅ | ✅ |
+| | ⮑ Incremental | ✅ | | | |
+| | ⮑ [SOC2 Compliance](https://pr-agent-docs.codium.ai/tools/review/#soc2-ticket-compliance) 💎 | ✅ | ✅ | ✅ | ✅ |
+| | Describe | ✅ | ✅ | ✅ | ✅ |
+| | ⮑ [Inline File Summary](https://pr-agent-docs.codium.ai/tools/describe#inline-file-summary) 💎 | ✅ | | | |
+| | Improve | ✅ | ✅ | ✅ | ✅ |
+| | ⮑ Extended | ✅ | ✅ | ✅ | ✅ |
+| | Ask | ✅ | ✅ | ✅ | ✅ |
+| | ⮑ [Ask on code lines](https://pr-agent-docs.codium.ai/tools/ask#ask-lines) | ✅ | ✅ | | |
+| | [Custom Suggestions](https://pr-agent-docs.codium.ai/tools/custom_suggestions/) 💎 | ✅ | ✅ | ✅ | ✅ |
+| | [Test](https://pr-agent-docs.codium.ai/tools/test/) 💎 | ✅ | ✅ | | ✅ |
+| | Reflect and Review | ✅ | ✅ | ✅ | ✅ |
+| | Update CHANGELOG.md | ✅ | ✅ | ✅ | ✅ |
+| | Find Similar Issue | ✅ | | | |
+| | [Add PR Documentation](https://pr-agent-docs.codium.ai/tools/documentation/) 💎 | ✅ | ✅ | | ✅ |
+| | [Custom Labels](https://pr-agent-docs.codium.ai/tools/custom_labels/) 💎 | ✅ | ✅ | | ✅ |
+| | [Analyze](https://pr-agent-docs.codium.ai/tools/analyze/) 💎 | ✅ | ✅ | | ✅ |
+| | [CI Feedback](https://pr-agent-docs.codium.ai/tools/ci_feedback/) 💎 | ✅ | | | |
+| | [Similar Code](https://pr-agent-docs.codium.ai/tools/similar_code/) 💎 | ✅ | | | |
| | | | | | |
-| USAGE | CLI | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
-| | App / webhook | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
-| | Tagging bot | :white_check_mark: | | | |
-| | Actions | :white_check_mark: | | :white_check_mark: | |
+| USAGE | CLI | ✅ | ✅ | ✅ | ✅ |
+| | App / webhook | ✅ | ✅ | ✅ | ✅ |
+| | Tagging bot | ✅ | | | |
+| | Actions | ✅ | | ✅ | |
| | | | | | |
-| CORE | PR compression | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
-| | Repo language prioritization | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
-| | Adaptive and token-aware file patch fitting | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
-| | Multiple models support | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
-| | [Static code analysis](https://pr-agent-docs.codium.ai/core-abilities/#static-code-analysis) 💎 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
-| | [Global and wiki configurations](https://pr-agent-docs.codium.ai/usage-guide/configuration_options/) 💎 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
-| | [PR interactive actions](https://www.codium.ai/images/pr_agent/pr-actions.mp4) 💎 | :white_check_mark: | | | |
+| CORE | PR compression | ✅ | ✅ | ✅ | ✅ |
+| | Repo language prioritization | ✅ | ✅ | ✅ | ✅ |
+| | Adaptive and token-aware file patch fitting | ✅ | ✅ | ✅ | ✅ |
+| | Multiple models support | ✅ | ✅ | ✅ | ✅ |
+| | [Static code analysis](https://pr-agent-docs.codium.ai/core-abilities/#static-code-analysis) 💎 | ✅ | ✅ | ✅ | ✅ |
+| | [Global and wiki configurations](https://pr-agent-docs.codium.ai/usage-guide/configuration_options/) 💎 | ✅ | ✅ | ✅ | ✅ |
+| | [PR interactive actions](https://www.codium.ai/images/pr_agent/pr-actions.mp4) 💎 | ✅ | | | |
- 💎 means this feature is available only in [PR-Agent Pro](https://www.codium.ai/pricing/)
[//]: # (- Support for additional git providers is described in [here](./docs/Full_environments.md))
@@ -240,7 +244,8 @@ To use your own version of PR-Agent, you first need to acquire two tokens:
There are several ways to use PR-Agent:
**Locally**
-- [Use Docker image (no installation required)](https://pr-agent-docs.codium.ai/installation/locally/#use-docker-image-no-installation-required)
+- [Using pip package](https://pr-agent-docs.codium.ai/installation/locally/#using-pip-package)
+- [Using Docker image](https://pr-agent-docs.codium.ai/installation/locally/#using-docker-image)
- [Run from source](https://pr-agent-docs.codium.ai/installation/locally/#run-from-source)
**GitHub specific methods**
diff --git a/docs/docs/installation/locally.md b/docs/docs/installation/locally.md
index 32ba77ae..e493862a 100644
--- a/docs/docs/installation/locally.md
+++ b/docs/docs/installation/locally.md
@@ -1,4 +1,45 @@
-## Use Docker image (no installation required)
+## Using pip package
+
+Install the package:
+
+```
+pip install pr-agent
+```
+
+Then run the relevant tool with the script below.
+
+Make sure to fill in the required parameters (`user_token`, `openai_key`, `pr_url`, `command`):
+
+```python
+from pr_agent import cli
+from pr_agent.config_loader import get_settings
+
+def main():
+ # Fill in the following values
+ provider = "github" # GitHub provider
+ user_token = "..." # GitHub user token
+ openai_key = "..." # OpenAI key
+ pr_url = "..." # PR URL, for example 'https://github.com/Codium-ai/pr-agent/pull/809'
+ command = "/review" # Command to run (e.g. '/review', '/describe', '/ask="What is the purpose of this PR?"', ...)
+
+ # Setting the configurations
+ get_settings().set("CONFIG.git_provider", provider)
+ get_settings().set("openai.key", openai_key)
+ get_settings().set("github.user_token", user_token)
+
+ # Preparing the command
+ run_command = f"--pr_url={pr_url} {command.lstrip('/')}"
+ args = cli.set_parser().parse_args(run_command.split())
+
+ # Run the command. Feedback will appear in GitHub PR comments
+ cli.run(args=args)
+
+
+if __name__ == '__main__':
+ main()
+```
+
+## Using Docker image
A list of the relevant tools can be found in the [tools guide](../tools/ask.md).
diff --git a/docs/docs/usage-guide/automations_and_usage.md b/docs/docs/usage-guide/automations_and_usage.md
index ba21b998..d20516fd 100644
--- a/docs/docs/usage-guide/automations_and_usage.md
+++ b/docs/docs/usage-guide/automations_and_usage.md
@@ -1,5 +1,5 @@
## Local repo (CLI)
-When running from your local repo (CLI), your local configuration file will be used.
+When running from your locally cloned PR-Agent repo (CLI), your local configuration file will be used.
Examples of invoking the different tools via the CLI:
- **Review**: `python -m pr_agent.cli --pr_url= review`
diff --git a/pr_agent/cli.py b/pr_agent/cli.py
index 83faaf8e..53feeb74 100644
--- a/pr_agent/cli.py
+++ b/pr_agent/cli.py
@@ -9,48 +9,52 @@ from pr_agent.log import setup_logger
log_level = os.environ.get("LOG_LEVEL", "INFO")
setup_logger(log_level)
-
-
-def run(inargs=None):
+def set_parser():
parser = argparse.ArgumentParser(description='AI based pull request analyzer', usage=
-"""\
-Usage: cli.py --pr-url= [].
-For example:
-- cli.py --pr_url=... review
-- cli.py --pr_url=... describe
-- cli.py --pr_url=... improve
-- cli.py --pr_url=... ask "write me a poem about this PR"
-- cli.py --pr_url=... reflect
-- cli.py --issue_url=... similar_issue
+ """\
+ Usage: cli.py --pr-url= [].
+ For example:
+ - cli.py --pr_url=... review
+ - cli.py --pr_url=... describe
+ - cli.py --pr_url=... improve
+ - cli.py --pr_url=... ask "write me a poem about this PR"
+ - cli.py --pr_url=... reflect
+ - cli.py --issue_url=... similar_issue
-Supported commands:
-- review / review_pr - Add a review that includes a summary of the PR and specific suggestions for improvement.
+ Supported commands:
+ - review / review_pr - Add a review that includes a summary of the PR and specific suggestions for improvement.
-- ask / ask_question [question] - Ask a question about the PR.
+ - ask / ask_question [question] - Ask a question about the PR.
-- describe / describe_pr - Modify the PR title and description based on the PR's contents.
+ - describe / describe_pr - Modify the PR title and description based on the PR's contents.
-- improve / improve_code - Suggest improvements to the code in the PR as pull request comments ready to commit.
-Extended mode ('improve --extended') employs several calls, and provides a more thorough feedback
+ - improve / improve_code - Suggest improvements to the code in the PR as pull request comments ready to commit.
+ Extended mode ('improve --extended') employs several calls, and provides a more thorough feedback
-- reflect - Ask the PR author questions about the PR.
+ - reflect - Ask the PR author questions about the PR.
-- update_changelog - Update the changelog based on the PR's contents.
+ - update_changelog - Update the changelog based on the PR's contents.
-- add_docs
+ - add_docs
-- generate_labels
+ - generate_labels
-Configuration:
-To edit any configuration parameter from 'configuration.toml', just add -config_path=.
-For example: 'python cli.py --pr_url=... review --pr_reviewer.extra_instructions="focus on the file: ..."'
-""")
+ Configuration:
+ To edit any configuration parameter from 'configuration.toml', just add -config_path=.
+ For example: 'python cli.py --pr_url=... review --pr_reviewer.extra_instructions="focus on the file: ..."'
+ """)
parser.add_argument('--pr_url', type=str, help='The URL of the PR to review', default=None)
parser.add_argument('--issue_url', type=str, help='The URL of the Issue to review', default=None)
parser.add_argument('command', type=str, help='The', choices=commands, default='review')
parser.add_argument('rest', nargs=argparse.REMAINDER, default=[])
- args = parser.parse_args(inargs)
+ return parser
+
+
+def run(inargs=None, args=None):
+ parser = set_parser()
+ if not args:
+ args = parser.parse_args(inargs)
if not args.pr_url and not args.issue_url:
parser.print_help()
return
diff --git a/pr_agent/cli_pip.py b/pr_agent/cli_pip.py
new file mode 100644
index 00000000..cdab37e9
--- /dev/null
+++ b/pr_agent/cli_pip.py
@@ -0,0 +1,30 @@
+from pr_agent import cli
+from pr_agent.config_loader import get_settings
+from pr_agent.log import setup_logger
+
+setup_logger()
+
+
+def main():
+ # Fill in the following values
+ provider = "github" # GitHub provider
+ user_token = "..." # GitHub user token
+ openai_key = "..." # OpenAI key
+ pr_url = "..." # PR URL, for example 'https://github.com/Codium-ai/pr-agent/pull/809'
+ command = "/review" # Command to run (e.g. '/review', '/describe', '/ask="What is the purpose of this PR?"')
+
+ # Setting the configurations
+ get_settings().set("CONFIG.git_provider", provider)
+ get_settings().set("openai.key", openai_key)
+ get_settings().set("github.user_token", user_token)
+
+ # Preparing the command
+ run_command = f"--pr_url={pr_url} {command.lstrip('/')}"
+ args = cli.set_parser().parse_args(run_command.split())
+
+ # Run the command. Feedback will appear in GitHub PR comments
+ cli.run(args=args)
+
+
+if __name__ == '__main__':
+ main()
diff --git a/pr_agent/servers/__init__.py b/pr_agent/servers/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/pr_agent/tools/pr_questions.py b/pr_agent/tools/pr_questions.py
index 3849029d..4e1d3c1e 100644
--- a/pr_agent/tools/pr_questions.py
+++ b/pr_agent/tools/pr_questions.py
@@ -17,6 +17,7 @@ from pr_agent.servers.help import HelpMessage
class PRQuestions:
def __init__(self, pr_url: str, args=None, ai_handler: partial[BaseAiHandler,] = LiteLLMAIHandler):
question_str = self.parse_args(args)
+ self.pr_url = pr_url
self.git_provider = get_git_provider()(pr_url)
self.main_pr_language = get_main_pr_language(
self.git_provider.get_languages(), self.git_provider.get_files()
@@ -49,7 +50,7 @@ class PRQuestions:
return question_str
async def run(self):
- get_logger().info('Answering a PR question...')
+ get_logger().info(f'Answering a PR question about the PR {self.pr_url} ')
relevant_configs = {'pr_questions': dict(get_settings().pr_questions),
'config': dict(get_settings().config)}
get_logger().debug("Relevant configs", artifacts=relevant_configs)
diff --git a/pr_agent/tools/pr_similar_issue.py b/pr_agent/tools/pr_similar_issue.py
index 485331c0..1a4d794a 100644
--- a/pr_agent/tools/pr_similar_issue.py
+++ b/pr_agent/tools/pr_similar_issue.py
@@ -3,9 +3,6 @@ from enum import Enum
from typing import List
import openai
-import pandas as pd
-import pinecone
-from pinecone_datasets import Dataset, DatasetMetadata
from pydantic import BaseModel, Field
from pr_agent.algo import MAX_TOKENS
@@ -36,6 +33,12 @@ class PRSimilarIssue:
index_name = self.index_name = "codium-ai-pr-agent-issues"
if get_settings().pr_similar_issue.vectordb == "pinecone":
+ try:
+ import pinecone
+ from pinecone_datasets import Dataset, DatasetMetadata
+ import pandas as pd
+ except:
+ raise Exception("Please install 'pinecone' and 'pinecone_datasets' to use pinecone as vectordb")
# assuming pinecone api key and environment are set in secrets file
try:
api_key = get_settings().pinecone.api_key
@@ -107,7 +110,10 @@ class PRSimilarIssue:
get_logger().info('No new issues to update')
elif get_settings().pr_similar_issue.vectordb == "lancedb":
- import lancedb # import lancedb only if needed
+ try:
+ import lancedb # import lancedb only if needed
+ except:
+ raise Exception("Please install lancedb to use lancedb as vectordb")
self.db = lancedb.connect(get_settings().lancedb.uri)
self.table = None
diff --git a/pyproject.toml b/pyproject.toml
index 37be93e3..f4be6371 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -3,44 +3,44 @@ requires = ["setuptools>=61.0"]
build-backend = "setuptools.build_meta"
[project]
-name = "pr_agent"
-version = "0.0.1"
+name = "pr-agent"
+version = "0.2.0"
+
+authors = [{name= "CodiumAI", email = "tal.r@codium.ai"}]
-authors = [
- {name = "Itamar Friedman", email = "itamar.f@codium.ai"},
-]
maintainers = [
- {name = "Ori Kotek", email = "ori.k@codium.ai"},
{name = "Tal Ridnik", email = "tal.r@codium.ai"},
+ {name = "Ori Kotek", email = "ori.k@codium.ai"},
{name = "Hussam Lawen", email = "hussam.l@codium.ai"},
- {name = "Sagi Medina", email = "sagi.m@codium.ai"}
]
-description = "CodiumAI PR-Agent is an open-source tool to automatically analyze a pull request and provide several types of feedback"
+
+description = "CodiumAI PR-Agent aims to help efficiently review and handle pull requests, by providing AI feedbacks and suggestions."
readme = "README.md"
requires-python = ">=3.10"
-keywords = ["ai", "tool", "developer", "review", "agent"]
-license = {file = "LICENSE", name = "Apache 2.0 License"}
+keywords = ["AI", "Agents", "Pull Request", "Automation", "Code Review"]
+license = {name = "Apache 2.0", file = "LICENSE"}
+
classifiers = [
- "Development Status :: 3 - Alpha",
"Intended Audience :: Developers",
- "Operating System :: Independent",
"Programming Language :: Python :: 3",
]
dynamic = ["dependencies"]
+
[tool.setuptools.dynamic]
dependencies = {file = ["requirements.txt"]}
[project.urls]
"Homepage" = "https://github.com/Codium-ai/pr-agent"
+"Documentation" = "https://pr-agent-docs.codium.ai/"
[tool.setuptools]
-include-package-data = false
+include-package-data = true
license-files = ["LICENSE"]
[tool.setuptools.packages.find]
where = ["."]
-include = ["pr_agent"]
+include = ["pr_agent*"] # include pr_agent and any sub-packages it finds under it.
[project.scripts]
pr-agent = "pr_agent.cli:run"
diff --git a/requirements-dev.txt b/requirements-dev.txt
index 70613be0..1af82d00 100644
--- a/requirements-dev.txt
+++ b/requirements-dev.txt
@@ -1 +1,3 @@
pytest==7.4.0
+poetry
+twine
\ No newline at end of file
diff --git a/requirements.txt b/requirements.txt
index 97df2f93..924d2bb2 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -13,9 +13,6 @@ litellm==1.31.10
loguru==0.7.2
msrest==0.7.1
openai==1.13.3
-pinecone-client
-pinecone-datasets @ git+https://github.com/mrT23/pinecone-datasets.git@main
-lancedb==0.5.1
pytest==7.4.0
PyGithub==1.59.*
PyYAML==6.0.1
@@ -26,4 +23,9 @@ tiktoken==0.5.2
ujson==5.8.0
uvicorn==0.22.0
tenacity==8.2.3
-# langchain==0.0.349 # uncomment this to support language LangChainOpenAIHandler
+# Uncomment the following lines to enable the 'similar issue' tool
+# pinecone-client
+# pinecone-datasets @ git+https://github.com/mrT23/pinecone-datasets.git@main
+# lancedb==0.5.1
+# uncomment this to support language LangChainOpenAIHandler
+# langchain==0.0.349