anylang
Version:
A translator's kit that uses the free APIs of Google Translate, Yandex, Bing, ChatGPT, and other LLMs
58 lines (56 loc) • 7.1 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());
});
};
import { z } from 'zod';
export const ChatGPTLLMResponseSchema = z.object({
choices: z
.object({ message: z.object({ content: z.string() }) })
.array()
.min(1),
});
export class ChatGPTLLMFetcher {
constructor({ apiKey, model, apiOrigin, }) {
this.config = {
apiKey: apiKey,
model: model !== null && model !== void 0 ? model : 'gpt-4o-mini',
apiOrigin: apiOrigin !== null && apiOrigin !== void 0 ? apiOrigin : 'https://api.openai.com',
};
this.apiUrl = new URL('/v1/chat/completions', this.config.apiOrigin).toString();
}
getLengthLimit() {
return 5000;
}
getRequestsTimeout() {
return 500;
}
fetch(prompt) {
return __awaiter(this, void 0, void 0, function* () {
const response = yield fetch(this.apiUrl, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${this.config.apiKey}`,
},
body: JSON.stringify({
model: this.config.model,
messages: [{ role: 'user', content: prompt }],
}),
});
if (!response.ok) {
throw new Error(`Request failed with status ${response.status}: ${response.statusText}`);
}
// validate response structure
const parseResult = ChatGPTLLMResponseSchema.parse(yield response.json());
// a list of chat completion choices, there can be more than one only if specified directly.
// source: https://platform.openai.com/docs/api-reference/chat/object#chat/object-choices
return parseResult.choices[0].message.content;
});
}
}
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRyYW5zbGF0b3JzL0xMTVRyYW5zbGF0b3JzL0NoYXRHUFRMTE1UcmFuc2xhdG9yL0NoYXRHUFRMTE1GZXRjaGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFJeEIsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNoRCxPQUFPLEVBQUUsQ0FBQztTQUNSLE1BQU0sQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztTQUN0RCxLQUFLLEVBQUU7U0FDUCxHQUFHLENBQUMsQ0FBQyxDQUFDO0NBQ1IsQ0FBQyxDQUFDO0FBRUgsTUFBTSxPQUFPLGlCQUFpQjtJQUk3QixZQUFZLEVBQ1gsTUFBTSxFQUNOLEtBQUssRUFDTCxTQUFTLEdBS1Q7UUFDQSxJQUFJLENBQUMsTUFBTSxHQUFHO1lBQ2IsTUFBTSxFQUFFLE1BQU07WUFDZCxLQUFLLEVBQUUsS0FBSyxhQUFMLEtBQUssY0FBTCxLQUFLLEdBQUksYUFBYTtZQUM3QixTQUFTLEVBQUUsU0FBUyxhQUFULFNBQVMsY0FBVCxTQUFTLEdBQUksd0JBQXdCO1NBQ2hELENBQUM7UUFDRixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksR0FBRyxDQUFDLHNCQUFzQixFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDakYsQ0FBQztJQUVNLGNBQWM7UUFDcEIsT0FBTyxJQUFJLENBQUM7SUFDYixDQUFDO0lBRU0sa0JBQWtCO1FBQ3hCLE9BQU8sR0FBRyxDQUFDO0lBQ1osQ0FBQztJQUVZLEtBQUssQ0FBQyxNQUFjOztZQUNoQyxNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO2dCQUN6QyxNQUFNLEVBQUUsTUFBTTtnQkFDZCxPQUFPLEVBQUU7b0JBQ1IsY0FBYyxFQUFFLGtCQUFrQjtvQkFDbEMsYUFBYSxFQUFFLFVBQVUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUU7aUJBQzdDO2dCQUNELElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDO29CQUNwQixLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLO29CQUN4QixRQUFRLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDO2lCQUM3QyxDQUFDO2FBQ0YsQ0FBQyxDQUFDO1lBRUgsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDbEIsTUFBTSxJQUFJLEtBQUssQ0FDZCw4QkFBOEIsUUFBUSxDQUFDLE1BQU0sS0FBSyxRQUFRLENBQUMsVUFBVSxFQUFFLENBQ3ZFLENBQUM7WUFDSCxDQUFDO1lBRUQsOEJBQThCO1lBQzlCLE1BQU0sV0FBVyxHQUFHLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBRTFFLDRGQUE0RjtZQUM1Rix5RkFBeUY7WUFDekYsT0FBTyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7UUFDL0MsQ0FBQztLQUFBO0NBQ0QiLCJmaWxlIjoidHJhbnNsYXRvcnMvTExNVHJhbnNsYXRvcnMvQ2hhdEdQVExMTVRyYW5zbGF0b3IvQ2hhdEdQVExMTUZldGNoZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcblxuaW1wb3J0IHsgTExNRmV0Y2hlciB9IGZyb20gJy4uJztcblxuZXhwb3J0IGNvbnN0IENoYXRHUFRMTE1SZXNwb25zZVNjaGVtYSA9IHoub2JqZWN0KHtcblx0Y2hvaWNlczogelxuXHRcdC5vYmplY3QoeyBtZXNzYWdlOiB6Lm9iamVjdCh7IGNvbnRlbnQ6IHouc3RyaW5nKCkgfSkgfSlcblx0XHQuYXJyYXkoKVxuXHRcdC5taW4oMSksXG59KTtcblxuZXhwb3J0IGNsYXNzIENoYXRHUFRMTE1GZXRjaGVyIGltcGxlbWVudHMgTExNRmV0Y2hlciB7XG5cdHByaXZhdGUgcmVhZG9ubHkgYXBpVXJsOiBzdHJpbmc7XG5cdHByaXZhdGUgcmVhZG9ubHkgY29uZmlnO1xuXG5cdGNvbnN0cnVjdG9yKHtcblx0XHRhcGlLZXksXG5cdFx0bW9kZWwsXG5cdFx0YXBpT3JpZ2luLFxuXHR9OiB7XG5cdFx0YXBpS2V5OiBzdHJpbmc7XG5cdFx0bW9kZWw/OiBzdHJpbmc7XG5cdFx0YXBpT3JpZ2luPzogc3RyaW5nO1xuXHR9KSB7XG5cdFx0dGhpcy5jb25maWcgPSB7XG5cdFx0XHRhcGlLZXk6IGFwaUtleSxcblx0XHRcdG1vZGVsOiBtb2RlbCA/PyAnZ3B0LTRvLW1pbmknLFxuXHRcdFx0YXBpT3JpZ2luOiBhcGlPcmlnaW4gPz8gJ2h0dHBzOi8vYXBpLm9wZW5haS5jb20nLFxuXHRcdH07XG5cdFx0dGhpcy5hcGlVcmwgPSBuZXcgVVJMKCcvdjEvY2hhdC9jb21wbGV0aW9ucycsIHRoaXMuY29uZmlnLmFwaU9yaWdpbikudG9TdHJpbmcoKTtcblx0fVxuXG5cdHB1YmxpYyBnZXRMZW5ndGhMaW1pdCgpIHtcblx0XHRyZXR1cm4gNTAwMDtcblx0fVxuXG5cdHB1YmxpYyBnZXRSZXF1ZXN0c1RpbWVvdXQoKSB7XG5cdFx0cmV0dXJuIDUwMDtcblx0fVxuXG5cdHB1YmxpYyBhc3luYyBmZXRjaChwcm9tcHQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG5cdFx0Y29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh0aGlzLmFwaVVybCwge1xuXHRcdFx0bWV0aG9kOiAnUE9TVCcsXG5cdFx0XHRoZWFkZXJzOiB7XG5cdFx0XHRcdCdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG5cdFx0XHRcdEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0aGlzLmNvbmZpZy5hcGlLZXl9YCxcblx0XHRcdH0sXG5cdFx0XHRib2R5OiBKU09OLnN0cmluZ2lmeSh7XG5cdFx0XHRcdG1vZGVsOiB0aGlzLmNvbmZpZy5tb2RlbCxcblx0XHRcdFx0bWVzc2FnZXM6IFt7IHJvbGU6ICd1c2VyJywgY29udGVudDogcHJvbXB0IH1dLFxuXHRcdFx0fSksXG5cdFx0fSk7XG5cblx0XHRpZiAoIXJlc3BvbnNlLm9rKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHRcdGBSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyAke3Jlc3BvbnNlLnN0YXR1c306ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH1gLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHQvLyB2YWxpZGF0ZSByZXNwb25zZSBzdHJ1Y3R1cmVcblx0XHRjb25zdCBwYXJzZVJlc3VsdCA9IENoYXRHUFRMTE1SZXNwb25zZVNjaGVtYS5wYXJzZShhd2FpdCByZXNwb25zZS5qc29uKCkpO1xuXG5cdFx0Ly8gYSBsaXN0IG9mIGNoYXQgY29tcGxldGlvbiBjaG9pY2VzLCB0aGVyZSBjYW4gYmUgbW9yZSB0aGFuIG9uZSBvbmx5IGlmIHNwZWNpZmllZCBkaXJlY3RseS5cblx0XHQvLyBzb3VyY2U6IGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvY2hhdC9vYmplY3QjY2hhdC9vYmplY3QtY2hvaWNlc1xuXHRcdHJldHVybiBwYXJzZVJlc3VsdC5jaG9pY2VzWzBdLm1lc3NhZ2UuY29udGVudDtcblx0fVxufVxuIl19