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.
67 lines • 2.2 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const chat_factory_1 = __importDefault(require("./chats/chat_factory"));
class ChatPool {
rateLimiter;
available;
waiters;
slots;
constructor(triples, rateLimiter) {
this.slots = triples;
this.available = [...triples];
this.waiters = [];
this.rateLimiter = rateLimiter;
}
static create(options) {
const triples = [];
for (let i = 0; i < options.concurrency; i++) {
triples.push({
generateTranslationChat: chat_factory_1.default.newChat(options.engine, options.model, options.rateLimiter, options.apiKey, options.host, options.chatParams),
verifyStylingChat: chat_factory_1.default.newChat(options.engine, options.model, options.rateLimiter, options.apiKey, options.host, options.chatParams),
verifyTranslationChat: chat_factory_1.default.newChat(options.engine, options.model, options.rateLimiter, options.apiKey, options.host, options.chatParams),
});
}
return new ChatPool(triples, options.rateLimiter);
}
get size() {
return this.slots.length;
}
/** Returns every triple, in order. Used for per-worker sharding. */
all() {
return [...this.slots];
}
async run(fn) {
const chats = await this.acquire();
try {
return await fn(chats);
}
finally {
this.release(chats);
}
}
acquire() {
return new Promise((resolve) => {
const chats = this.available.pop();
if (chats) {
resolve(chats);
}
else {
this.waiters.push(resolve);
}
});
}
release(chats) {
const waiter = this.waiters.shift();
if (waiter) {
waiter(chats);
}
else {
this.available.push(chats);
}
}
}
exports.default = ChatPool;
//# sourceMappingURL=chat_pool.js.map