scraipt
Version:
Scrape away inefficient code during compile-time using AI
102 lines (101 loc) • 3.95 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.OpenAIAPI = void 0;
const openai_1 = __importDefault(require("openai"));
const tokens_1 = require("./tokens");
const OPENAI_API_KEY = process.env.OPENAI_API_KEY;
// Messages to prepend to the prompt messages
const systemMessages = [
{
role: 'system',
content: 'Generate the most efficient, opimized version of the given code using the given code context. Do not include any other text in the response. The code should be valid JavaScript.',
},
];
/**
Add system messages to the prompt messages.
* @param context The context of the code.
* @param code The code to append.
* @returns The messages to use for the completion.
*/
const createMessages = (context, code) => {
return systemMessages.concat([
{
role: 'user',
content: context,
},
{
role: 'user',
content: code,
},
]);
};
/**
A class to interact with the OpenAI API.
*/
class OpenAIAPI {
/**
* Create a new instance of the OpenAIAPI class.
* @throws An error if the OpenAI API key is not found.
*/
constructor() {
if (!OPENAI_API_KEY) {
throw new Error('OpenAI API key not found');
}
this.openai = new openai_1.default({
apiKey: OPENAI_API_KEY,
});
this.totalTokensUsed = 0;
}
/**
* Create a text completion using the given messages.
* @param code The code to optimize.
* @param context The context of the code.
* @param model The model to use for the completion.
* @returns The completion text.
*/
createTextCompletion(code, context, model) {
return __awaiter(this, void 0, void 0, function* () {
// Add system messages to the prompt messages
let messages = createMessages(context, code);
const tokenCount = (0, tokens_1.countTokens)(messages, model);
this.totalTokensUsed += tokenCount;
if (this.maxTokenCount && this.totalTokensUsed > this.maxTokenCount) {
return;
}
// Don't surpass the maximum number of tokens for the model
if (tokenCount > (0, tokens_1.getMaxModelTokens)(model)) {
const limitedCode = (0, tokens_1.limitInputTokens)(code, model);
const limitedMessages = createMessages(context, limitedCode);
messages = limitedMessages;
}
const result = yield this.openai.chat.completions.create({
messages,
model,
});
const choices = result.choices;
if (!choices) {
return;
}
const content = choices[0].message.content;
if (!content) {
return;
}
const completionTokenCount = (0, tokens_1.countTokens)([choices[0].message], model);
this.totalTokensUsed += completionTokenCount;
return content;
});
}
}
exports.OpenAIAPI = OpenAIAPI;