anylang
Version:
A translator's kit that uses the free APIs of Google Translate, Yandex, Bing, ChatGPT, and other LLMs
66 lines (64 loc) • 8.47 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 GeminiLLMResponseSchema = z.object({
candidates: z
.object({
content: z.object({
parts: z.object({ text: z.string() }).array(),
}),
})
.array()
.min(1),
});
export class GeminiLLMFetcher {
constructor({ apiKey, model, apiOrigin, }) {
this.config = {
apiKey: apiKey,
model: model !== null && model !== void 0 ? model : 'gemini-2.0-flash',
apiOrigin: apiOrigin !== null && apiOrigin !== void 0 ? apiOrigin : `https://generativelanguage.googleapis.com`,
};
this.url = new URL(`/v1beta/models/${this.config.model}:generateContent?key=${this.config.apiKey}`, 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.url, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
contents: [{ role: 'user', parts: [{ text: prompt }] }],
}),
});
if (!response.ok) {
throw new Error(`Request failed with status ${response.status}: ${response.statusText}`);
}
// validate response structure
const parseResult = GeminiLLMResponseSchema.parse(yield response.json());
// content.parts contains ordered segments that together may form a complete response from the LLM
// each segment may contain different types of data (e.g., text, functions, etc.), we join all text parts to get the complete response
// documentation source: https://ai.google.dev/api/caching#Content
// join all parts in one string
const text = parseResult.candidates[0].content.parts
.map((part) => part.text)
.join('');
// for large, poorly structured code, the gemini add extraneous characters
return text.replace(/^```json\s*?|\s*?```$/g, '').trim();
});
}
}
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRyYW5zbGF0b3JzL0xMTVRyYW5zbGF0b3JzL0dlbWluaUxMTVRyYW5zbGF0b3IvR2VtaW5pTExNRmV0Y2hlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBSXhCLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDL0MsVUFBVSxFQUFFLENBQUM7U0FDWCxNQUFNLENBQUM7UUFDUCxPQUFPLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQztZQUNqQixLQUFLLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRTtTQUM3QyxDQUFDO0tBQ0YsQ0FBQztTQUNELEtBQUssRUFBRTtTQUNQLEdBQUcsQ0FBQyxDQUFDLENBQUM7Q0FDUixDQUFDLENBQUM7QUFFSCxNQUFNLE9BQU8sZ0JBQWdCO0lBSTVCLFlBQVksRUFDWCxNQUFNLEVBQ04sS0FBSyxFQUNMLFNBQVMsR0FLVDtRQUNBLElBQUksQ0FBQyxNQUFNLEdBQUc7WUFDYixNQUFNLEVBQUUsTUFBTTtZQUNkLEtBQUssRUFBRSxLQUFLLGFBQUwsS0FBSyxjQUFMLEtBQUssR0FBSSxrQkFBa0I7WUFDbEMsU0FBUyxFQUFFLFNBQVMsYUFBVCxTQUFTLGNBQVQsU0FBUyxHQUFJLDJDQUEyQztTQUNuRSxDQUFDO1FBRUYsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FDakIsa0JBQWtCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyx3QkFBd0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFDL0UsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQ3JCLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDZCxDQUFDO0lBRU0sY0FBYztRQUNwQixPQUFPLElBQUksQ0FBQztJQUNiLENBQUM7SUFFTSxrQkFBa0I7UUFDeEIsT0FBTyxHQUFHLENBQUM7SUFDWixDQUFDO0lBRVksS0FBSyxDQUFDLE1BQWM7O1lBQ2hDLE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7Z0JBQ3RDLE1BQU0sRUFBRSxNQUFNO2dCQUNkLE9BQU8sRUFBRTtvQkFDUixjQUFjLEVBQUUsa0JBQWtCO2lCQUNsQztnQkFDRCxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQztvQkFDcEIsUUFBUSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQztpQkFDdkQsQ0FBQzthQUNGLENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ2xCLE1BQU0sSUFBSSxLQUFLLENBQ2QsOEJBQThCLFFBQVEsQ0FBQyxNQUFNLEtBQUssUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUN2RSxDQUFDO1lBQ0gsQ0FBQztZQUVELDhCQUE4QjtZQUM5QixNQUFNLFdBQVcsR0FBRyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUV6RSxrR0FBa0c7WUFDbEcsc0lBQXNJO1lBQ3RJLGtFQUFrRTtZQUVsRSwrQkFBK0I7WUFDL0IsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSztpQkFDbEQsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO2lCQUN4QixJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFFWCwwRUFBMEU7WUFDMUUsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLHdCQUF3QixFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzFELENBQUM7S0FBQTtDQUNEIiwiZmlsZSI6InRyYW5zbGF0b3JzL0xMTVRyYW5zbGF0b3JzL0dlbWluaUxMTVRyYW5zbGF0b3IvR2VtaW5pTExNRmV0Y2hlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuXG5pbXBvcnQgeyBMTE1GZXRjaGVyIH0gZnJvbSAnLi4nO1xuXG5leHBvcnQgY29uc3QgR2VtaW5pTExNUmVzcG9uc2VTY2hlbWEgPSB6Lm9iamVjdCh7XG5cdGNhbmRpZGF0ZXM6IHpcblx0XHQub2JqZWN0KHtcblx0XHRcdGNvbnRlbnQ6IHoub2JqZWN0KHtcblx0XHRcdFx0cGFydHM6IHoub2JqZWN0KHsgdGV4dDogei5zdHJpbmcoKSB9KS5hcnJheSgpLFxuXHRcdFx0fSksXG5cdFx0fSlcblx0XHQuYXJyYXkoKVxuXHRcdC5taW4oMSksXG59KTtcblxuZXhwb3J0IGNsYXNzIEdlbWluaUxMTUZldGNoZXIgaW1wbGVtZW50cyBMTE1GZXRjaGVyIHtcblx0cHJpdmF0ZSByZWFkb25seSB1cmw7XG5cdHByaXZhdGUgcmVhZG9ubHkgY29uZmlnO1xuXG5cdGNvbnN0cnVjdG9yKHtcblx0XHRhcGlLZXksXG5cdFx0bW9kZWwsXG5cdFx0YXBpT3JpZ2luLFxuXHR9OiB7XG5cdFx0YXBpS2V5OiBzdHJpbmc7XG5cdFx0bW9kZWw/OiBzdHJpbmc7XG5cdFx0YXBpT3JpZ2luPzogc3RyaW5nO1xuXHR9KSB7XG5cdFx0dGhpcy5jb25maWcgPSB7XG5cdFx0XHRhcGlLZXk6IGFwaUtleSxcblx0XHRcdG1vZGVsOiBtb2RlbCA/PyAnZ2VtaW5pLTIuMC1mbGFzaCcsXG5cdFx0XHRhcGlPcmlnaW46IGFwaU9yaWdpbiA/PyBgaHR0cHM6Ly9nZW5lcmF0aXZlbGFuZ3VhZ2UuZ29vZ2xlYXBpcy5jb21gLFxuXHRcdH07XG5cblx0XHR0aGlzLnVybCA9IG5ldyBVUkwoXG5cdFx0XHRgL3YxYmV0YS9tb2RlbHMvJHt0aGlzLmNvbmZpZy5tb2RlbH06Z2VuZXJhdGVDb250ZW50P2tleT0ke3RoaXMuY29uZmlnLmFwaUtleX1gLFxuXHRcdFx0dGhpcy5jb25maWcuYXBpT3JpZ2luLFxuXHRcdCkudG9TdHJpbmcoKTtcblx0fVxuXG5cdHB1YmxpYyBnZXRMZW5ndGhMaW1pdCgpIHtcblx0XHRyZXR1cm4gNTAwMDtcblx0fVxuXG5cdHB1YmxpYyBnZXRSZXF1ZXN0c1RpbWVvdXQoKSB7XG5cdFx0cmV0dXJuIDUwMDtcblx0fVxuXG5cdHB1YmxpYyBhc3luYyBmZXRjaChwcm9tcHQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG5cdFx0Y29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh0aGlzLnVybCwge1xuXHRcdFx0bWV0aG9kOiAnUE9TVCcsXG5cdFx0XHRoZWFkZXJzOiB7XG5cdFx0XHRcdCdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG5cdFx0XHR9LFxuXHRcdFx0Ym9keTogSlNPTi5zdHJpbmdpZnkoe1xuXHRcdFx0XHRjb250ZW50czogW3sgcm9sZTogJ3VzZXInLCBwYXJ0czogW3sgdGV4dDogcHJvbXB0IH1dIH1dLFxuXHRcdFx0fSksXG5cdFx0fSk7XG5cblx0XHRpZiAoIXJlc3BvbnNlLm9rKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHRcdGBSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyAke3Jlc3BvbnNlLnN0YXR1c306ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH1gLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHQvLyB2YWxpZGF0ZSByZXNwb25zZSBzdHJ1Y3R1cmVcblx0XHRjb25zdCBwYXJzZVJlc3VsdCA9IEdlbWluaUxMTVJlc3BvbnNlU2NoZW1hLnBhcnNlKGF3YWl0IHJlc3BvbnNlLmpzb24oKSk7XG5cblx0XHQvLyBjb250ZW50LnBhcnRzIGNvbnRhaW5zIG9yZGVyZWQgc2VnbWVudHMgdGhhdCB0b2dldGhlciBtYXkgZm9ybSBhIGNvbXBsZXRlIHJlc3BvbnNlIGZyb20gdGhlIExMTVxuXHRcdC8vIGVhY2ggc2VnbWVudCBtYXkgY29udGFpbiBkaWZmZXJlbnQgdHlwZXMgb2YgZGF0YSAoZS5nLiwgdGV4dCwgZnVuY3Rpb25zLCBldGMuKSwgd2Ugam9pbiBhbGwgdGV4dCBwYXJ0cyB0byBnZXQgdGhlIGNvbXBsZXRlIHJlc3BvbnNlXG5cdFx0Ly8gZG9jdW1lbnRhdGlvbiBzb3VyY2U6IGh0dHBzOi8vYWkuZ29vZ2xlLmRldi9hcGkvY2FjaGluZyNDb250ZW50XG5cblx0XHQvLyBqb2luIGFsbCBwYXJ0cyBpbiBvbmUgc3RyaW5nXG5cdFx0Y29uc3QgdGV4dCA9IHBhcnNlUmVzdWx0LmNhbmRpZGF0ZXNbMF0uY29udGVudC5wYXJ0c1xuXHRcdFx0Lm1hcCgocGFydCkgPT4gcGFydC50ZXh0KVxuXHRcdFx0LmpvaW4oJycpO1xuXG5cdFx0Ly8gZm9yIGxhcmdlLCBwb29ybHkgc3RydWN0dXJlZCBjb2RlLCB0aGUgZ2VtaW5pIGFkZCBleHRyYW5lb3VzIGNoYXJhY3RlcnNcblx0XHRyZXR1cm4gdGV4dC5yZXBsYWNlKC9eYGBganNvblxccyo/fFxccyo/YGBgJC9nLCAnJykudHJpbSgpO1xuXHR9XG59XG4iXX0=