Documentation | 2025.1

# AI for code analysis

Swarm enhances the code review process by integrating AI-driven functionality. By utilizing an AI model with a similar response as an OpenAI vendor, this feature generates explanations for all code diffs in a file on request, making it easier for developers to understand and review code changes.

Only the diff, filename and the file extension are sent to OpenAI for analysis. Swarm does not send the whole file to OpenAI.

By default, the minimum diff size threshold for AI to explain the diff is four characters, up to a maximum of 31000 characters. This is also the recommended threshold for AI to explain the diffs.

The configuration to integrate AI into Swarm is specified within an ai_review block in the `SWARM_ROOT/data/config.php` file.

By default, ai_review block is disabled. To enable AI-driven code explanations for a diff, set enabled to true.

## How to set up OpenAI integration for Swarm

To integrate OpenAI with Swarm, follow these steps:

1. Create an OpenAI account or log in to your an OpenAI account here.

2. Once logged in, create a new project within the OpenAI platform.

3. Generate a secret API key:

   1. Navigate to the project settings.

   2. Create a new secret key.

   3. Copy the generated key.

4. Configure OpenAI in `SWARM_ROOT/data/config.php` file.

   Add the following example configuration to the ai_review block:

       <?php
           'ai_review' => array(
           // Please read Perforce's Generative AI policy before enabling this feature.
           // See https://www.perforce.com/generative-ai-policy
               'enabled' => true,
               'ai_vendors' => array(
                   'ai_model1' => array(
                       'ai_vendor'        => 'openAI', // Name of the AI provider being used
                       'ai_package_id'    => '1', // Ensure that it is a unique id and its value should not be modified
                       'ai_package_key'   => 'openaiwithexplaincodeongpt4', // This is intended for future use when we
                                                                            // will support multiple models and have an
                                                                            // AI configuration page in the UI.
                       'ai_package_value' => 'Open AI With Explain Code On GPT4', // This is used to display the model
                                                                                  // type in the summary of the AI
                                                                                  // vendor's response.
                       'ai_model'         => 'gpt-4',
                       'ai_package_type'  => "Explain the following code:", // This is the prompt for the AI to follow.
                                                                            // You can modify the prompt for purposes other
                                                                            // than explaining the code, or to request
                                                                            // output in a specific language.
                       'api_key'          => $SECRET_KEY, // Paste your copied OpenAI API key here
                       'ai_min_char_limit'=> 4, // Minimum number of characters required in the content to be submitted
                                                // to the AI vendor for analysis. Defaults to 4 characters.
                       'ai_max_char_limit'=> 31000, // The maximum number of characters that can be submitted to the
                                                    // AI vendor for analysis. Defaults to 31000 characters.
                   ),
               ),
           ),

   Replace $SECRET_KEY with the API key you copied earlier.

5. Make sure your OpenAI account has enough tokens to use the API. If needed, recharge your account.

This setup will enable OpenAI's GPT-4 model to explain the diff code in your Swarm.

## How to set up a generic AI model integration for Swarm

To integrate a generic AI model with Swarm, do the following:

1. Modify the AI configuration for Helix Swarm

2. Use an API endpoint which resembles the OpenAI vendor's request and response

### Modify the AI related configuration for Helix Swarm

Modify the ai_review block in the `SWARM_ROOT/data/config.php` file as follows:

    <?php
        'ai_review' => array(
        // Please read Perforce's Generative AI policy before enabling this feature.
        // See https://www.perforce.com/generative-ai-policy
            'enabled' => true,
            'ai_vendors' => array(
                'ai_model1' => array(
                    'ai_vendor'        => 'genericAI', // Name of the AI provider being used
                    'ai_package_id'    => '1', // Ensure that it is a unique id and its value should not be modified
                    'ai_package_key'   => 'GenericAIPackage', // This is intended for future use when we
                                                                         // will support multiple models and have an
                                                                         // AI configuration page in the UI.
                    'ai_package_value' => 'Generic AI with explain code on custom AI model', // This is used to display the model
                                                                               // type in the summary of the AI
                                                                               // vendor's response.
                    'ai_model'         => 'GenericAIModel',
                    'ai_package_type'  => "Explain the following code:", // This is the prompt for the AI to follow.
                                                                         // You can modify the prompt for purposes other
                                                                         // than explaining the code, or to request
                                                                         // output in a specific language.
                    'api_end_point'          => 'https://apitoconnectaimodel.com/dummyAnalyzeCode', // Replace with your AI vendor end point
                    'ai_min_char_limit'=> 4, // Minimum number of characters required in the content to be submitted
                                             // to the AI vendor for analysis. Defaults to 4 characters.
                    'ai_max_char_limit'=> 31000, // The maximum number of characters that can be submitted to the
                                                 // AI vendor for analysis. Defaults to 31000 characters.
                ),
            ),
        ),

### Example API endpoint request and response format

Use an AI model that has a request and response structure similar to that of an OpenAI vendor, as follows:

#### Example API endpoint

POST /api/v11/AiAnalysis/dummyanalyzeCode

#### API endpoint request format

curl -X POST -H "Content-Type: application/json" -u "username:ticket" -d "@mybodyfilename.txt" "https://my-swarm-host/api/v11/AiAnalysis/dummyanalyzeCode"

The "mybodyfilename.txt" file contains:

    {
      "content": "Explain the following code of file nodeofNotequal.c:  static void checkForLowerCase();"
    }

#### API endpoint response format

    {
      "data": {
        "id": "chatcmpl-Aqe3vInskpD30pkUMzBTJ9ONxou7l",
        "object": "chat.completion",
        "created": 1737110419,
        "model": "gpt-4o-2024-08-06",
        "choices": [
          {
            "index": 0,
            "message": {
              "role": "assistant",
              "content": "The line of code `static void checkForLowerCase();` in a C file named `nodeofNotequal.c` is a function
                          declaration. Here's what this line signifies:\n\n1. **`static` Keyword**: \n   - In the context of a
                          function declaration, `static` means that the function has internal linkage. This means the function
                          can only be called within the same source file (in this case, `nodeofNotequal.c`). It is not visible
                          or accessible from other source files that might be linked together to form an executable.
                          \n\n2. **`void` Return Type**: \n   - `void` indicates that the function `checkForLowerCase` does not
                          return any value.\n\n3. **Function Name**: \n   - `checkForLowerCase` is the name of the function.
                          It is customary to choose a name that indicates the purpose or action of the function. In this case,
                          it suggests that the function may be used to check for lowercase characters or strings, though the
                          exact behavior would depend on the function’s implementation.\n\n4. **Parameter List**: \n   -
                          The empty parentheses `()` indicate that the function does not take any arguments.\n\nThis is just a
                          declaration, meaning it informs the compiler about the existence of the function `checkForLowerCase`
                          and its signature (return type and parameters) before it is used in the code. The actual logic or body
                          of the function would appear later in the file, outside of the declaration.\n\nTo fully understand what
                          `checkForLowerCase` does, you would need to look at the function’s definition, which would specify the
                          code that executes when the function is called.",
              "refusal": null
            },
            "logprobs": null,
            "finish_reason": "stop"
          }
        ],
        "usage": {
          "prompt_tokens": 27,
          "completion_tokens": 338,
          "total_tokens": 365,
          "prompt_tokens_details": {
            "cached_tokens": 0,
            "audio_tokens": 0
          },
          "completion_tokens_details": {
            "reasoning_tokens": 0,
            "audio_tokens": 0,
            "accepted_prediction_tokens": 0,
            "rejected_prediction_tokens": 0
          }
        },
        "service_tier": "default",
        "system_fingerprint": "fp_50cad350e4"
      }
    }

Your search for returned results