Optimizing the Plugin Prompt—the generated interface that explains your plugin to ChatGPT—can significantly enhance your ChatGPT plugin’s performance. In this blog post, we’ll dive into how ChatGPT Plugins compile your OpenAPI specification and ai-plugin.json
 files into a Plugin Prompt. We’ll also explore strategies for optimizing the available space in the prompt, resulting in more accurate and contextually relevant plugin interactions.
The Significance of the Plugin Prompt
The Plugin Prompt is a dynamically generated Typescript pseudo-code that serves as a vital link between ChatGPT and your plugin. Its construction relies primarily on the description_for_model
 property in the ai-plugin.json
 file and the information contained in your OpenAPI specification.
The Plugin Prompt plays an essential role in determining how ChatGPT interprets and interacts with your plugin. By fine-tuning the Plugin Prompt, you can significantly improve the accuracy and context-awareness of your plugin’s responses, leading to an enhanced user experience.
Capitalizing on the Prompt Space
While the DESCRIPTION_FOR_MODEL
 property offers the most space with 8,000 characters, it’s crucial not to underestimate the importance of other properties from the OpenAPI spec in the Plugin Prompt.
Each API endpoint defined in the OpenAPI spec includes two description properties that are also incorporated into the Plugin Prompt. Since each description can be up to 200–300 characters (200 according to the docs, 300 in my tests), that means an API with ten endpoints could gain an additional 4,000–6,000 characters of prompt space with efficient use of the properties in the OpenAPI spec.
Notable OpenAPI Properties in the Plugin Prompt
Path/Type Descriptions
The OpenAPI Path Description, if available, appears immediately before the type declaration in the dynamically generated pseudo-code namespace of the Plugin Prompt. If the Path Description is unavailable, the OpenAPI Summary is used instead. This ensures that the prompt has relevant information about the specific API endpoint.
Component/Property Descriptions
Each pseudo-code type contains properties generated from OpenAPI component property descriptions. It’s important to note that only descriptions specific to request properties are included. This approach is advantageous because it provides more prompt space per component, as each description can be another 300-character prompt. Schema-level descriptions and properties of response objects are not included in the Plugin Prompt.
Decoding the Plugin Prompt
To gain a better understanding of the Plugin Prompt output, let’s examine an example using a simple OpenAPI spec and an ai-plugin.json
 file. The main experiment below tests all common properties in the OpenAPI spec to determine which properties are included in the Plugin Prompt.
Example Plugin Prompt
// DESCRIPTION_FOR_MODEL
namespace NAME_FOR_MODEL {
// PATH_GET_DESCRIPTION
type getPath = (_: {
// PATH_GET_PARAMETER_DESCRIPTION
PARAMETER_NAME: string,
}) => any;
// PATH_POST_DESCRIPTION
type postPath = (_: {
// COMPONENT_SCHEMAS_REQUEST_SCHEMA_DATA_DESCRIPTION
data: string, // default: COMPONENT_SCHEMAS_REQUEST_SCHEMA_DATA_DEFAULT
}) => any;
} // namespace NAME_FOR_MODEL
Let’s look at an OpenAPI specification and ai-plugin.json
 file to see how these files are converted into the Plugin Prompt above. Property values are in ALL CAPS for easy mapping between the source files and the Plugin Prompt.
ai-plugin.json
{
"schema_version": "v1",
"name_for_model": "NAME_FOR_MODEL",
"description_for_model": "DESCRIPTION_FOR_MODEL",
…
}
OpenAPI spec
openapi: 3.0.0
info:
title: EXAMPLE_API_TITLE
description: EXAMPLE_API_DESCRIPTION
version: 1.0.0
servers:
- url: http://localhost:5003
variables:
apiDomain:
default: example.com
description: EXAMPLE_SERVER_VARIABLE_API_DOMAIN_DESCRIPTION
paths:
/path:
get:
tags:
- PATH_GET_TAG
summary: PATH_GET_SUMMARY
description: PATH_GET_DESCRIPTION
operationId: getPath
parameters:
- name: PARAMETER_NAME
in: query
description: PATH_GET_PARAMETER_DESCRIPTION
required: true
schema:
type: string
responses:
200:
description: PATH_GET_RESPONSE_200_DESCRIPTION
content:
application/json:
schema:
$ref: "#/components/schemas/ResponseSchema"
400:
description: PATH_GET_RESPONSE_400_DESCRIPTION
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorSchema"
default:
description: PATH_GET_RESPONSE_DEFAULT_DESCRIPTION
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorSchema"
post:
tags:
- PATH_POST_TAG
summary: PATH_POST_SUMMARY
description: PATH_POST_DESCRIPTION
operationId: postPath
requestBody:
description: PATH_POST_REQUEST_BODY_DESCRIPTION
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/RequestSchema"
responses:
200:
description: PATH_POST_RESPONSE_200_DESCRIPTION
content:
application/json:
schema:
$ref: "#/components/schemas/ResponseSchema"
400:
description: PATH_POST_RESPONSE_400_DESCRIPTION
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorSchema"
default:
description: PATH_POST_RESPONSE_DEFAULT_DESCRIPTION
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorSchema"
components:
schemas:
RequestSchema:
type: object
properties:
data:
type: string
description: COMPONENT_SCHEMAS_REQUEST_SCHEMA_DATA_DESCRIPTION
default: COMPONENT_SCHEMAS_REQUEST_SCHEMA_DATA_DEFAULT
description: COMPONENT_SCHEMAS_REQUEST_SCHEMA_DESCRIPTION
required:
- data
ResponseSchema:
type: object
properties:
data:
type: array
items:
$ref: "#/components/schemas/DataSchema"
description: COMPONENT_SCHEMAS_RESPONSE_SCHEMA_DESCRIPTION
DataSchema:
type: object
properties:
id:
type: string
description: COMPONENT_SCHEMAS_DATA_SCHEMA_ID_DESCRIPTION
name:
type: string
description: COMPONENT_SCHEMAS_DATA_SCHEMA_NAME_DESCRIPTION
default: COMPONENT_SCHEMAS_DATA_SCHEMA_NAME_DEFAULT
description: COMPONENT_SCHEMAS_DATA_SCHEMA_DESCRIPTION
required:
- id
- name
ErrorSchema:
type: object
properties:
message:
type: string
description: COMPONENT_SCHEMAS_ERROR_SCHEMA_MESSAGE_DESCRIPTION
code:
type: integer
format: int32
description: COMPONENT_SCHEMAS_ERROR_SCHEMA_CODE_DESCRIPTION
description: COMPONENT_SCHEMAS_ERROR_SCHEMA_DESCRIPTION
required:
- message
- code
Description vs. Summary Experiment
In cases where the Path Description is not provided, the OpenAPI Summary is used instead. The following example demonstrates this scenario:
Plugin Prompt
// DESCRIPTION_FOR_MODEL
namespace NAME_FOR_MODEL {
// PATH_GET_SUMMARY <---- [**THE CHANGE: REPLACED DESCRIPTION WITH SUMMARY**]
type getPath = (_: {
// PATH_GET_PARAMETER_DESCRIPTION
PARAMETER_NAME: string,
}) => any;
// PATH_POST_DESCRIPTION
type postPath = (_: {
// COMPONENT_SCHEMAS_REQUEST_SCHEMA_DATA_DESCRIPTION
data: string, // default: COMPONENT_SCHEMAS_REQUEST_SCHEMA_DATA_DEFAULT
}) => any;
} // namespace NAME_FOR_MODEL
OpenAPI spec
openapi: 3.0.0
info:
title: EXAMPLE_API_TITLE
description: EXAMPLE_API_DESCRIPTION
version: 1.0.0
servers:
- url: http://localhost:5003
variables:
apiDomain:
default: example.com
description: EXAMPLE_SERVER_VARIABLE_API_DOMAIN_DESCRIPTION
paths:
/path:
get:
tags:
- PATH_GET_TAG
summary: PATH_GET_SUMMARY
# description: PATH_GET_DESCRIPTION <---- [**THE CHANGE: REMOVED DESCRIPTION**]
operationId: getPath
parameters:
- name: PARAMETER_NAME
in: query
description: PATH_GET_PARAMETER_DESCRIPTION
Wrapping Up
Optimizing the Plugin Prompt is crucial for enhancing the performance and user experience of your ChatGPT plugin. You can create more precise and contextually relevant plugin interactions by understanding what is included in the Plugin Prompt and how to use the available space effectively. As you develop your ChatGPT plugin, remember that the OpenAPI spec should be considered prompt engineering space to build the best possible user experience for your ChatGPT plugin.