anylang
Version:
A translator's kit that uses the free APIs of Google Translate, Yandex, Bing, ChatGPT, and other LLMs
96 lines (94 loc) • 9.16 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.GeminiLLMResponseSchema = exports.GeminiLLMFetcher = void 0;
var _zod = require("zod");
var __awaiter = void 0 && (void 0).__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());
});
};
const GeminiLLMResponseSchema = exports.GeminiLLMResponseSchema = _zod.z.object({
candidates: _zod.z.object({
content: _zod.z.object({
parts: _zod.z.object({
text: _zod.z.string()
}).array()
})
}).array().min(1)
});
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();
});
}
}
exports.GeminiLLMFetcher = GeminiLLMFetcher;
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsYXRvcnMvTExNVHJhbnNsYXRvcnMvR2VtaW5pTExNVHJhbnNsYXRvci9HZW1pbmlMTE1GZXRjaGVyLmpzIiwibmFtZXMiOlsiX3pvZCIsInJlcXVpcmUiLCJHZW1pbmlMTE1SZXNwb25zZVNjaGVtYSIsImV4cG9ydHMiLCJ6Iiwib2JqZWN0IiwiY2FuZGlkYXRlcyIsImNvbnRlbnQiLCJwYXJ0cyIsInRleHQiLCJzdHJpbmciLCJhcnJheSIsIm1pbiIsIkdlbWluaUxMTUZldGNoZXIiLCJjb25zdHJ1Y3RvciIsImFwaUtleSIsIm1vZGVsIiwiYXBpT3JpZ2luIiwiY29uZmlnIiwidXJsIiwiVVJMIiwidG9TdHJpbmciLCJnZXRMZW5ndGhMaW1pdCIsImdldFJlcXVlc3RzVGltZW91dCIsImZldGNoIiwicHJvbXB0IiwicmVzcG9uc2UiLCJtZXRob2QiLCJoZWFkZXJzIiwiYm9keSIsIkpTT04iLCJzdHJpbmdpZnkiLCJjb250ZW50cyIsInJvbGUiLCJvayIsIkVycm9yIiwic3RhdHVzIiwic3RhdHVzVGV4dCIsInBhcnNlUmVzdWx0IiwicGFyc2UiLCJqc29uIiwibWFwIiwicGFydCIsImpvaW4iLCJyZXBsYWNlIiwidHJpbSJdLCJzb3VyY2VzIjpbInRyYW5zbGF0b3JzL0xMTVRyYW5zbGF0b3JzL0dlbWluaUxMTVRyYW5zbGF0b3IvR2VtaW5pTExNRmV0Y2hlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcblxuaW1wb3J0IHsgTExNRmV0Y2hlciB9IGZyb20gJy4uJztcblxuZXhwb3J0IGNvbnN0IEdlbWluaUxMTVJlc3BvbnNlU2NoZW1hID0gei5vYmplY3Qoe1xuXHRjYW5kaWRhdGVzOiB6XG5cdFx0Lm9iamVjdCh7XG5cdFx0XHRjb250ZW50OiB6Lm9iamVjdCh7XG5cdFx0XHRcdHBhcnRzOiB6Lm9iamVjdCh7IHRleHQ6IHouc3RyaW5nKCkgfSkuYXJyYXkoKSxcblx0XHRcdH0pLFxuXHRcdH0pXG5cdFx0LmFycmF5KClcblx0XHQubWluKDEpLFxufSk7XG5cbmV4cG9ydCBjbGFzcyBHZW1pbmlMTE1GZXRjaGVyIGltcGxlbWVudHMgTExNRmV0Y2hlciB7XG5cdHByaXZhdGUgcmVhZG9ubHkgdXJsO1xuXHRwcml2YXRlIHJlYWRvbmx5IGNvbmZpZztcblxuXHRjb25zdHJ1Y3Rvcih7XG5cdFx0YXBpS2V5LFxuXHRcdG1vZGVsLFxuXHRcdGFwaU9yaWdpbixcblx0fToge1xuXHRcdGFwaUtleTogc3RyaW5nO1xuXHRcdG1vZGVsPzogc3RyaW5nO1xuXHRcdGFwaU9yaWdpbj86IHN0cmluZztcblx0fSkge1xuXHRcdHRoaXMuY29uZmlnID0ge1xuXHRcdFx0YXBpS2V5OiBhcGlLZXksXG5cdFx0XHRtb2RlbDogbW9kZWwgPz8gJ2dlbWluaS0yLjAtZmxhc2gnLFxuXHRcdFx0YXBpT3JpZ2luOiBhcGlPcmlnaW4gPz8gYGh0dHBzOi8vZ2VuZXJhdGl2ZWxhbmd1YWdlLmdvb2dsZWFwaXMuY29tYCxcblx0XHR9O1xuXG5cdFx0dGhpcy51cmwgPSBuZXcgVVJMKFxuXHRcdFx0YC92MWJldGEvbW9kZWxzLyR7dGhpcy5jb25maWcubW9kZWx9OmdlbmVyYXRlQ29udGVudD9rZXk9JHt0aGlzLmNvbmZpZy5hcGlLZXl9YCxcblx0XHRcdHRoaXMuY29uZmlnLmFwaU9yaWdpbixcblx0XHQpLnRvU3RyaW5nKCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0TGVuZ3RoTGltaXQoKSB7XG5cdFx0cmV0dXJuIDUwMDA7XG5cdH1cblxuXHRwdWJsaWMgZ2V0UmVxdWVzdHNUaW1lb3V0KCkge1xuXHRcdHJldHVybiA1MDA7XG5cdH1cblxuXHRwdWJsaWMgYXN5bmMgZmV0Y2gocHJvbXB0OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuXHRcdGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godGhpcy51cmwsIHtcblx0XHRcdG1ldGhvZDogJ1BPU1QnLFxuXHRcdFx0aGVhZGVyczoge1xuXHRcdFx0XHQnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuXHRcdFx0fSxcblx0XHRcdGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcblx0XHRcdFx0Y29udGVudHM6IFt7IHJvbGU6ICd1c2VyJywgcGFydHM6IFt7IHRleHQ6IHByb21wdCB9XSB9XSxcblx0XHRcdH0pLFxuXHRcdH0pO1xuXG5cdFx0aWYgKCFyZXNwb25zZS5vaykge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdFx0XHRgUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgJHtyZXNwb25zZS5zdGF0dXN9OiAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Ly8gdmFsaWRhdGUgcmVzcG9uc2Ugc3RydWN0dXJlXG5cdFx0Y29uc3QgcGFyc2VSZXN1bHQgPSBHZW1pbmlMTE1SZXNwb25zZVNjaGVtYS5wYXJzZShhd2FpdCByZXNwb25zZS5qc29uKCkpO1xuXG5cdFx0Ly8gY29udGVudC5wYXJ0cyBjb250YWlucyBvcmRlcmVkIHNlZ21lbnRzIHRoYXQgdG9nZXRoZXIgbWF5IGZvcm0gYSBjb21wbGV0ZSByZXNwb25zZSBmcm9tIHRoZSBMTE1cblx0XHQvLyBlYWNoIHNlZ21lbnQgbWF5IGNvbnRhaW4gZGlmZmVyZW50IHR5cGVzIG9mIGRhdGEgKGUuZy4sIHRleHQsIGZ1bmN0aW9ucywgZXRjLiksIHdlIGpvaW4gYWxsIHRleHQgcGFydHMgdG8gZ2V0IHRoZSBjb21wbGV0ZSByZXNwb25zZVxuXHRcdC8vIGRvY3VtZW50YXRpb24gc291cmNlOiBodHRwczovL2FpLmdvb2dsZS5kZXYvYXBpL2NhY2hpbmcjQ29udGVudFxuXG5cdFx0Ly8gam9pbiBhbGwgcGFydHMgaW4gb25lIHN0cmluZ1xuXHRcdGNvbnN0IHRleHQgPSBwYXJzZVJlc3VsdC5jYW5kaWRhdGVzWzBdLmNvbnRlbnQucGFydHNcblx0XHRcdC5tYXAoKHBhcnQpID0+IHBhcnQudGV4dClcblx0XHRcdC5qb2luKCcnKTtcblxuXHRcdC8vIGZvciBsYXJnZSwgcG9vcmx5IHN0cnVjdHVyZWQgY29kZSwgdGhlIGdlbWluaSBhZGQgZXh0cmFuZW91cyBjaGFyYWN0ZXJzXG5cdFx0cmV0dXJuIHRleHQucmVwbGFjZSgvXmBgYGpzb25cXHMqP3xcXHMqP2BgYCQvZywgJycpLnRyaW0oKTtcblx0fVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxJQUFBQSxJQUFBLEdBQUFDLE9BQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFJTyxNQUFNQyx1QkFBdUIsR0FBQUMsT0FBQSxDQUFBRCx1QkFBQSxHQUFHRSxNQUFDLENBQUNDLE1BQU0sQ0FBQztFQUMvQ0MsVUFBVSxFQUFFRixNQUFDLENBQ1hDLE1BQU0sQ0FBQztJQUNQRSxPQUFPLEVBQUVILE1BQUMsQ0FBQ0MsTUFBTSxDQUFDO01BQ2pCRyxLQUFLLEVBQUVKLE1BQUMsQ0FBQ0MsTUFBTSxDQUFDO1FBQUVJLElBQUksRUFBRUwsTUFBQyxDQUFDTSxNQUFNO01BQUUsQ0FBRSxDQUFDLENBQUNDLEtBQUs7S0FDM0M7R0FDRCxDQUFDLENBQ0RBLEtBQUssRUFBRSxDQUNQQyxHQUFHLENBQUMsQ0FBQztDQUNQLENBQUM7QUFFSSxNQUFPQyxnQkFBZ0I7RUFJNUJDLFlBQVk7SUFDWEMsTUFBTTtJQUNOQyxLQUFLO0lBQ0xDO0VBQVMsQ0FLVDtJQUNBLElBQUksQ0FBQ0MsTUFBTSxHQUFHO01BQ2JILE1BQU0sRUFBRUEsTUFBTTtNQUNkQyxLQUFLLEVBQUVBLEtBQUssYUFBTEEsS0FBSyxjQUFMQSxLQUFLLEdBQUksa0JBQWtCO01BQ2xDQyxTQUFTLEVBQUVBLFNBQVMsYUFBVEEsU0FBUyxjQUFUQSxTQUFTLEdBQUk7S0FDeEI7SUFFRCxJQUFJLENBQUNFLEdBQUcsR0FBRyxJQUFJQyxHQUFHLENBQ2pCLGtCQUFrQixJQUFJLENBQUNGLE1BQU0sQ0FBQ0YsS0FBSyx3QkFBd0IsSUFBSSxDQUFDRSxNQUFNLENBQUNILE1BQU0sRUFBRSxFQUMvRSxJQUFJLENBQUNHLE1BQU0sQ0FBQ0QsU0FBUyxDQUNyQixDQUFDSSxRQUFRLEVBQUU7RUFDYjtFQUVPQyxjQUFjQSxDQUFBO0lBQ3BCLE9BQU8sSUFBSTtFQUNaO0VBRU9DLGtCQUFrQkEsQ0FBQTtJQUN4QixPQUFPLEdBQUc7RUFDWDtFQUVhQyxLQUFLQSxDQUFDQyxNQUFjOztNQUNoQyxNQUFNQyxRQUFRLEdBQUcsTUFBTUYsS0FBSyxDQUFDLElBQUksQ0FBQ0wsR0FBRyxFQUFFO1FBQ3RDUSxNQUFNLEVBQUUsTUFBTTtRQUNkQyxPQUFPLEVBQUU7VUFDUixjQUFjLEVBQUU7U0FDaEI7UUFDREMsSUFBSSxFQUFFQyxJQUFJLENBQUNDLFNBQVMsQ0FBQztVQUNwQkMsUUFBUSxFQUFFLENBQUM7WUFBRUMsSUFBSSxFQUFFLE1BQU07WUFBRXpCLEtBQUssRUFBRSxDQUFDO2NBQUVDLElBQUksRUFBRWdCO1lBQU0sQ0FBRTtVQUFDLENBQUU7U0FDdEQ7T0FDRCxDQUFDO01BRUYsSUFBSSxDQUFDQyxRQUFRLENBQUNRLEVBQUUsRUFBRTtRQUNqQixNQUFNLElBQUlDLEtBQUssQ0FDZCw4QkFBOEJULFFBQVEsQ0FBQ1UsTUFBTSxLQUFLVixRQUFRLENBQUNXLFVBQVUsRUFBRSxDQUN2RTtNQUNGO01BRUE7TUFDQSxNQUFNQyxXQUFXLEdBQUdwQyx1QkFBdUIsQ0FBQ3FDLEtBQUssQ0FBQyxNQUFNYixRQUFRLENBQUNjLElBQUksRUFBRSxDQUFDO01BRXhFO01BQ0E7TUFDQTtNQUVBO01BQ0EsTUFBTS9CLElBQUksR0FBRzZCLFdBQVcsQ0FBQ2hDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQ0MsT0FBTyxDQUFDQyxLQUFLLENBQ2xEaUMsR0FBRyxDQUFFQyxJQUFJLElBQUtBLElBQUksQ0FBQ2pDLElBQUksQ0FBQyxDQUN4QmtDLElBQUksQ0FBQyxFQUFFLENBQUM7TUFFVjtNQUNBLE9BQU9sQyxJQUFJLENBQUNtQyxPQUFPLENBQUMsd0JBQXdCLEVBQUUsRUFBRSxDQUFDLENBQUNDLElBQUksRUFBRTtJQUN6RCxDQUFDOzs7QUFDRDFDLE9BQUEsQ0FBQVUsZ0JBQUEsR0FBQUEsZ0JBQUEiLCJpZ25vcmVMaXN0IjpbXX0=