How to set up a generic AI model integration for P4 Code Review

To integrate a generic AI model with P4 Code Review, do the following:

  1. Modify the AI configuration for P4 Code Review

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

Modify the AI related configuration for P4 Code Review

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' => false, // set to true to enable the AI review feature 'data_retention_lifetime' => '30 days', // Delete AI summary records that are older than the // value provided. By default, this value is 30 days. // Enter a value in 'days' or 'months'. // For example, '30 days' or '2 months'. // A cron job is required to remove the // AI summaries on a schedule. // See Set up a cron job to delete AI summaries. 'timeout' => 30, // Setting timeout for the request sent from p4 code review to AI vendor // Timeout set in seconds 'ai_vendors' => array( 'ai_model1' => array( 'ai_vendor' => genericAI', // Name of the AI provider being used 'ai_package_id' => '1', // Ensure this remains as '1'. // Do not modify the ai_package_id. '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 // 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. You can modify the prompt // for purposes other than // explaining the code, or to // request the output in a // specific language. 'api_end_point' => 'https://apitoconnectaimodel.com/dummyAnalyzeCode', // Replace with // you AI vendor // end point 'ai_min_char_limit'=> 4, // Minimum number of characters required in the content // 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. The following example is for the OpenAI model, however, you should configure the API request to match your the request and response structure of your AI vendor.

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"
  }
}