Custom Request Handler
The requestHandler
option in the registerCompletion
function acts as a middleware that allows you to customize how requests are made from the client to your specified endpoint. By default, Monacopilot handles requests internally, but with requestHandler
, you can intercept and modify both the request and response.
This is particularly useful when you need to:
- Add custom headers (like authentication)
- Modify the request body by combining Monacopilot's default
completionMetadata
with your own custom properties - Transform the response before it's processed by Monacopilot
The handler receives the endpoint URL and the request body that Monacopilot has prepared, giving you full control over how the request is made and processed.
Example
registerCompletion(monaco, editor, {
endpoint: 'https://api.example.com/code-completion',
// ... other options
requestHandler: async ({endpoint, body}) => {
const response = await fetch(endpoint, {
method: 'POST',
headers: {
// Add custom headers
'X-Custom-Header': 'custom value',
},
body: JSON.stringify({
...body,
// Add custom parameters
customProperty: 'custom value',
}),
});
const data = await response.json();
// Process and transform the response
const processedCompletion = data.completion
.trim()
.replace(/\t/g, ' '); // Convert tabs to spaces
return {
completion: processedCompletion,
};
},
});
The requestHandler
function takes an object with endpoint
and body
as parameters.
Property | Type | Description |
---|---|---|
endpoint | string | The endpoint to which the request is sent. This is the same as the endpoint in registerCompletion . |
body | object | The body of the request processed by Monacopilot. |
The requestHandler
should return an object with the following property:
Property | Type | Description |
---|---|---|
completion | string or null | The completion text to be inserted into the editor. Return null if no completion is available. |
Example of Receiving
In your request handler, you can receive the custom properties you passed like this:
app.post('/code-completion', async (req, res) => {
const {completion, error} = await copilot.complete({body: req.body});
// Recieve the custom things you passed
const customProperty = req.body.customProperty;
const xCustomHeader = req.headers['x-custom-header'];
if (error) {
return res.status(500).json({completion: null, error});
}
res.json({completion});
});