Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactoring AI Handlers and Adding Support for Multiple AI Models #525

Merged
merged 26 commits into from
Dec 14, 2023

Conversation

mrT23
Copy link
Collaborator

@mrT23 mrT23 commented Dec 14, 2023

User description

Type

Enhancement


Description

This PR introduces significant changes to the AI handling system of the PR Agent. The main changes include:

  • Refactoring of the AI handler classes, introducing a new abstract base class BaseAiHandler to define a common interface for all AI handlers.
  • Addition of new AI handlers: OpenAIHandler, LangChainOpenAIHandler, and LiteLLMAIHandler. These handlers are designed to interact with different AI models.
  • Modification of the PRAgent and related classes to support the new AI handlers. The AI handler to be used can now be injected into these classes upon instantiation.
  • Addition of the langchain package to the requirements (commented out as it's optional).
  • Minor changes in logging and error handling.

PR changes walkthrough

Relevant files                                                                                                                                 
Enhancement
13 files
base_ai_handler.py                                                                                   
    pr_agent/algo/ai_handlers/base_ai_handler.py

    Introduced a new abstract base class `BaseAiHandler` that
    defines a common interface for all AI handlers. This class
    includes an abstract `chat_completion` method that all
    subclasses must implement.
+28/-0
openai_ai_handler.py                                                                               
    pr_agent/algo/ai_handlers/openai_ai_handler.py

    Added a new `OpenAIHandler` class that extends
    `BaseAiHandler`. This class is designed to interact with the
    OpenAI API for chat completions.
+67/-0
langchain_ai_handler.py                                                                         
    pr_agent/algo/ai_handlers/langchain_ai_handler.py

    Added a new `LangChainOpenAIHandler` class that extends
    `BaseAiHandler`. This class is designed to interact with the
    LangChain AI model.
+49/-0
litellm_ai_handler.py                                                                             
    pr_agent/algo/ai_handlers/litellm_ai_handler.py

    Renamed `AiHandler` to `LiteLLMAIHandler` and made it extend
    `BaseAiHandler`. This class is designed to interact with the
    LiteLLM AI model.
+3/-2
pr_agent.py                                                                                                 
    pr_agent/agent/pr_agent.py

    Modified the `PRAgent` class to support the new AI handlers.
    The AI handler to be used can now be injected into this
    class upon instantiation.
+10/-5
pr_reviewer.py                                                                                           
    pr_agent/tools/pr_reviewer.py

    Modified the `PRReviewer` class to support the new AI
    handlers. The AI handler to be used can now be injected into
    this class upon instantiation.
+7/-3
pr_description.py                                                                                     
    pr_agent/tools/pr_description.py

    Modified the `PRDescription` class to support the new AI
    handlers. The AI handler to be used can now be injected into
    this class upon instantiation.
+5/-3
pr_generate_labels.py                                                                             
    pr_agent/tools/pr_generate_labels.py

    Modified the `PRGenerateLabels` class to support the new AI
    handlers. The AI handler to be used can now be injected into
    this class upon instantiation.
+5/-3
pr_code_suggestions.py                                                                           
    pr_agent/tools/pr_code_suggestions.py

    Modified the `PRCodeSuggestions` class to support the new AI
    handlers. The AI handler to be used can now be injected into
    this class upon instantiation.
+5/-3
pr_update_changelog.py                                                                           
    pr_agent/tools/pr_update_changelog.py

    Modified the `PRUpdateChangelog` class to support the new AI
    handlers. The AI handler to be used can now be injected into
    this class upon instantiation.
+4/-3
pr_add_docs.py                                                                                           
    pr_agent/tools/pr_add_docs.py

    Modified the `PRAddDocs` class to support the new AI
    handlers. The AI handler to be used can now be injected into
    this class upon instantiation.
+5/-3
pr_information_from_user.py                                                                 
    pr_agent/tools/pr_information_from_user.py

    Modified the `PRInformationFromUser` class to support the
    new AI handlers. The AI handler to be used can now be
    injected into this class upon instantiation.
+5/-3
pr_questions.py                                                                                         
    pr_agent/tools/pr_questions.py

    Modified the `PRQuestions` class to support the new AI
    handlers. The AI handler to be used can now be injected into
    this class upon instantiation.
+4/-3
Dependencies
1 files
requirements.txt                                                                                       
    requirements.txt

    Added the `langchain` package to the requirements (commented
    out as it's optional).
+1/-0

Type

enhancement


Description

  • Introduced a new AI handling system with an abstract base class BaseAiHandler and specific implementations for LiteLLM (LiteLLMAIHandler), OpenAI (OpenAIHandler), and LangChain (LangChainOpenAIHandler).
  • Refactored PRAgent and related tools (PRAddDocs, PRCodeSuggestions, etc.) to use dependency injection for AI handlers, allowing for flexible AI model usage.
  • Added error handling and retry logic in AI handlers for robust operation.
  • Made LangChain dependency optional and updated requirements.txt accordingly.

Changes walkthrough

Relevant files
Enhancement
pr_agent.py
Refactor PRAgent to Use New AI Handler System                                   

pr_agent/agent/pr_agent.py

  • Introduced BaseAiHandler and LiteLLMAIHandler for AI handling.
  • Added ai_handler parameter to PRAgent constructor for dependency
    injection.
  • Modified handle_request method to use ai_handler for AI operations.
  • +9/-5     
    base_ai_handler.py
    Introduce BaseAiHandler Abstract Class                                                 

    pr_agent/algo/ai_handlers/base_ai_handler.py

  • Created an abstract base class BaseAiHandler defining the interface
    for AI handlers.
  • Defined abstract methods for AI operations.
  • +28/-0   
    langchain_ai_handler.py
    Add LangChain AI Handler Implementation                                               

    pr_agent/algo/ai_handlers/langchain_ai_handler.py

  • Implemented LangChainOpenAIHandler extending BaseAiHandler.
  • Added error handling and retry logic for AI operations.
  • +49/-0   
    litellm_ai_handler.py
    Update LiteLLM AI Handler to New Interface                                         

    pr_agent/algo/ai_handlers/litellm_ai_handler.py

  • Renamed AiHandler to LiteLLMAIHandler and made it extend
    BaseAiHandler.
  • Updated chat_completion method to align with the new interface.
  • +3/-2     
    openai_ai_handler.py
    Implement OpenAI Handler                                                                             

    pr_agent/algo/ai_handlers/openai_ai_handler.py

  • Introduced OpenAIHandler class extending BaseAiHandler.
  • Implemented AI operations with OpenAI API, including error handling
    and retries.
  • +67/-0   
    pr_add_docs.py
    Refactor PRAddDocs to Use Injected AI Handler                                   

    pr_agent/tools/pr_add_docs.py

  • Added ai_handler parameter to constructor for dependency injection.
  • Updated AI operations to use the injected AI handler.
  • +5/-3     
    Miscellaneous
    utils.py
    Minor Formatting Fix in Utils                                                                   

    pr_agent/algo/utils.py

    • Minor formatting change in clip_tokens function.
    +1/-1     
    Configuration changes
    requirements.txt
    Update Requirements with Optional LangChain Dependency                 

    requirements.txt

    • Added commented-out langchain package to requirements.
    +1/-0     

    ✨ Usage guide:

    Overview:
    The describe tool scans the PR code changes, and generates a description for the PR - title, type, summary, walkthrough and labels. The tool can be triggered automatically every time a new PR is opened, or can be invoked manually by commenting on a PR.

    When commenting, to edit configurations related to the describe tool (pr_description section), use the following template:

    /describe --pr_description.some_config1=... --pr_description.some_config2=...
    

    With a configuration file, use the following template:

    [pr_description]
    some_config1=...
    some_config2=...
    
    Enabling\disabling automation
    • When you first install the app, the default mode for the describe tool is:
    pr_commands = ["/describe --pr_description.add_original_user_description=true" 
                             "--pr_description.keep_original_user_title=true", ...]
    

    meaning the describe tool will run automatically on every PR, will keep the original title, and will add the original user description above the generated description.

    • Markers are an alternative way to control the generated description, to give maximal control to the user. If you set:
    pr_commands = ["/describe --pr_description.use_description_markers=true", ...]
    

    the tool will replace every marker of the form pr_agent:marker_name in the PR description with the relevant content, where marker_name is one of the following:

    • type: the PR type.
    • summary: the PR summary.
    • walkthrough: the PR walkthrough.

    Note that when markers are enabled, if the original PR description does not contain any markers, the tool will not alter the description at all.

    Custom labels

    The default labels of the describe tool are quite generic: [Bug fix, Tests, Enhancement, Documentation, Other].

    If you specify custom labels in the repo's labels page or via configuration file, you can get tailored labels for your use cases.
    Examples for custom labels:

    • Main topic:performance - pr_agent:The main topic of this PR is performance
    • New endpoint - pr_agent:A new endpoint was added in this PR
    • SQL query - pr_agent:A new SQL query was added in this PR
    • Dockerfile changes - pr_agent:The PR contains changes in the Dockerfile
    • ...

    The list above is eclectic, and aims to give an idea of different possibilities. Define custom labels that are relevant for your repo and use cases.
    Note that Labels are not mutually exclusive, so you can add multiple label categories.
    Make sure to provide proper title, and a detailed and well-phrased description for each label, so the tool will know when to suggest it.

    Inline File Walkthrough 💎

    For enhanced user experience, the describe tool can add file summaries directly to the "Files changed" tab in the PR page.
    This will enable you to quickly understand the changes in each file, while reviewing the code changes (diffs).

    To enable inline file summary, set pr_description.inline_file_summary in the configuration file, possible values are:

    • 'table': File changes walkthrough table will be displayed on the top of the "Files changed" tab, in addition to the "Conversation" tab.
    • true: A collapsable file comment with changes title and a changes summary for each file in the PR.
    • false (default): File changes walkthrough will be added only to the "Conversation" tab.
    Utilizing extra instructions

    The describe tool can be configured with extra instructions, 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. Notice that the general structure of the description is fixed, and cannot be changed. Extra instructions can change the content or style of each sub-section of the PR description.

    Examples for extra instructions:

    [pr_description] 
    extra_instructions="""
    - The PR title should be in the format: '<PR type>: <title>'
    - The title should be short and concise (up to 10 words)
    - ...
    """
    

    Use triple quotes to write multi-line instructions. Use bullet points to make the instructions more readable.

    More PR-Agent commands

    To invoke the PR-Agent, add a comment using one of the following commands:

    • /review: Request a review of your Pull Request.
    • /describe: Update the PR title and description based on the contents of the PR.
    • /improve [--extended]: Suggest code improvements. Extended mode provides a higher quality feedback.
    • /ask <QUESTION>: Ask a question about the PR.
    • /update_changelog: Update the changelog based on the PR's contents.
    • /add_docs 💎: Generate docstring for new components introduced in the PR.
    • /generate_labels 💎: Generate labels for the PR based on the PR's contents.
    • /analyze 💎: Automatically analyzes the PR, and presents changes walkthrough for each component.

    See the tools guide for more details.
    To list the possible configuration parameters, add a /config comment.

    See the describe usage page for a comprehensive guide on using this tool.

    brianphamsia and others added 25 commits December 10, 2023 00:25
    method
    
    This commit refactors the PRAgent class and the has_ai_handler_param
    method. The has_ai_handler_param method is moved outside the class and
    made a standalone function. This change improves code organization and
    readability. The has_ai_handler_param function now takes a class object
    as a parameter and checks if the class constructor has an "ai_handler"
    parameter. This refactoring is done to streamline the code and improve
    its maintainability.
    
    No issue references.
    @github-actions github-actions bot changed the title Tr/ai handler Refactoring AI Handlers and Adding Support for Multiple AI Models Dec 14, 2023
    @github-actions github-actions bot added the enhancement New feature or request label Dec 14, 2023
    @mrT23 mrT23 merged commit 54891ad into main Dec 14, 2023
    5 checks passed
    @mrT23 mrT23 deleted the tr/ai_handler branch December 14, 2023 15:54
    @hussam789
    Copy link
    Collaborator

    /describe

    @Codium-ai Codium-ai deleted a comment from github-actions bot Feb 10, 2024
    @Codium-ai Codium-ai deleted a comment from github-actions bot Feb 10, 2024
    @Codium-ai Codium-ai deleted a comment from mrT23 Feb 10, 2024
    @Codium-ai Codium-ai deleted a comment from github-actions bot Feb 10, 2024
    Copy link
    Contributor

    PR Description updated to latest commit (02871b1)

    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
    Labels
    Projects
    None yet
    Development

    Successfully merging this pull request may close these issues.

    4 participants