i18n-ai-translate
Version:
AI-powered localization CLI, Node library, and GitHub Action. Translate i18next JSON, Gettext PO, Java .properties, and iOS .strings with ChatGPT, Claude, Gemini, or local Ollama models.
90 lines • 3.12 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const utils_1 = require("../utils");
const zod_1 = require("openai/helpers/zod");
const chat_interface_1 = __importDefault(require("./chat_interface"));
const role_1 = __importDefault(require("../enums/role"));
class ChatGPT extends chat_interface_1.default {
model;
chatParams;
history;
rateLimiter;
constructor(model, rateLimiter) {
super();
this.model = model;
this.chatParams = null;
this.history = [];
this.rateLimiter = rateLimiter;
}
startChat(params) {
this.chatParams = params;
if (params.messages.length > 0) {
this.history = params.messages;
}
}
async sendMessage(message, format) {
if (!this.chatParams) {
console.trace("Chat not started");
return "";
}
// Limit the history to prevent wasting tokens
if (this.history.length > 10) {
this.history = this.history.slice(this.history.length - 10);
}
await this.rateLimiter.wait();
this.rateLimiter.apiCalled();
this.history.push({ content: message, role: role_1.default.User });
const formatSchema = format
? (0, zod_1.zodResponseFormat)(format, format.description ?? "responseObject")
: undefined;
try {
const response = await this.model.chat.completions.create({
...this.chatParams,
messages: this.history,
response_format: formatSchema,
});
const responseText = response.choices[0].message.content;
if (!responseText) {
return "";
}
this.history.push({ content: responseText, role: role_1.default.Assistant });
return responseText;
}
catch (err) {
(0, utils_1.printError)(err);
return "";
}
}
resetChatHistory() {
this.history = [];
}
rollbackLastMessage() {
if (this.history[this.history.length - 1].role === role_1.default.Assistant) {
// Remove the last two messages (user and assistant)
// so we can get back to the last successful state in history
this.history.pop();
this.history.pop();
}
else if (this.history[this.history.length - 1].role === role_1.default.User) {
// The model didn't respond, so we only need to remove the user message
this.history.pop();
}
}
invalidTranslation() {
this.history.push({
content: this.invalidTranslationMessage(),
role: role_1.default.System,
});
}
invalidStyling() {
this.history.push({
content: this.invalidStylingMessage(),
role: role_1.default.System,
});
}
}
exports.default = ChatGPT;
//# sourceMappingURL=chatgpt.js.map