@autobe/agent
Version:
AI backend server code generator
160 lines • 7.79 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
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());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.LocalEmbeddingProvider = void 0;
const node_crypto_1 = require("node:crypto");
const typia_1 = __importDefault(require("typia"));
class LocalEmbeddingProvider {
constructor(options) {
this.options = options;
this.cache = new Map();
this.extractorPromise = this.init();
}
embed(texts) {
return __awaiter(this, void 0, void 0, function* () {
var _a, _b, _c;
if (texts.length === 0)
return [];
const extractor = yield this.extractorPromise;
const batchSize = (_a = this.options.batchSize) !== null && _a !== void 0 ? _a : 32;
const useCache = (_b = this.options.enableCache) !== null && _b !== void 0 ? _b : true;
const out = new Array(texts.length);
const misses = [];
for (let i = 0; i < texts.length; i++) {
const t = (_c = texts[i]) !== null && _c !== void 0 ? _c : "";
const key = hashText(t);
const hit = useCache ? this.cache.get(key) : undefined;
if (hit)
out[i] = hit;
else
misses.push({ idx: i, text: t, key });
}
for (let i = 0; i < misses.length; i += batchSize) {
const chunk = misses.slice(i, i + batchSize);
const chunkTexts = chunk.map((c) => c.text);
const result = yield extractor(chunkTexts, {
pooling: "mean",
normalize: true,
});
const vecs = toVectors(result);
if (vecs.length !== chunk.length) {
throw new Error(`[LocalEmbeddingProvider] batch mismatch: in=${chunk.length}, out=${vecs.length}`);
}
if (!this.dim && vecs[0])
this.dim = vecs[0].length;
for (let j = 0; j < chunk.length; j++) {
const v = vecs[j];
const { idx, key } = chunk[j];
out[idx] = v;
if (useCache)
this.cache.set(key, v);
}
}
for (let i = 0; i < out.length; i++) {
if (!out[i])
throw new Error(`[LocalEmbeddingProvider] missing vector at i=${i}`);
}
return out;
});
}
init() {
return __awaiter(this, void 0, void 0, function* () {
const t = yield Promise.resolve().then(() => __importStar(require("@huggingface/transformers")));
const env = t.env;
if (env && this.options.cacheDir)
env.cacheDir = this.options.cacheDir;
const pipeline = yield t.pipeline("feature-extraction", this.options.modelIdOrPath, {
dtype: this.options.quantized === false ? "fp32" : "q8",
});
return pipeline;
});
}
}
exports.LocalEmbeddingProvider = LocalEmbeddingProvider;
function hashText(text) {
return (0, node_crypto_1.createHash)("sha256").update(text).digest("hex");
}
function toVectors(result) {
var _a, _b, _c;
if ((() => { return input => Array.isArray(input) && input.every(elem => Array.isArray(elem) && elem.every(elem => "number" === typeof elem)); })()(result)) {
return result;
}
if ((() => { return input => Array.isArray(input) && input.every(elem => "number" === typeof elem); })()(result)) {
return [result];
}
if ((() => { const _io0 = input => (undefined === input.tolist || true) && (undefined === input.data || "object" === typeof input.data && null !== input.data && _io1(input.data)) && (undefined === input.dims || Array.isArray(input.dims) && input.dims.every(elem => "number" === typeof elem)) && (undefined === input.shape || Array.isArray(input.shape) && input.shape.every(elem => "number" === typeof elem)); const _io1 = input => "number" === typeof input.length && Object.keys(input).every(key => {
if (["length"].some(prop => key === prop))
return true;
const value = input[key];
if (undefined === value)
return true;
if ("number" === typeof Number(key))
return "number" === typeof value;
return true;
}); return input => "object" === typeof input && null !== input && false === Array.isArray(input) && _io0(input); })()(result)) {
if (typeof result.tolist === "function") {
const arr = result.tolist();
if ((() => { return input => Array.isArray(input) && input.every(elem => Array.isArray(elem) && elem.every(elem => "number" === typeof elem)); })()(arr))
return arr;
if ((() => { return input => Array.isArray(input) && input.every(elem => "number" === typeof elem); })()(arr))
return [arr];
}
const data = Array.from((_a = result.data) !== null && _a !== void 0 ? _a : []);
const dims = Array.from((_c = (_b = result.dims) !== null && _b !== void 0 ? _b : result.shape) !== null && _c !== void 0 ? _c : []);
if (dims.length === 2) {
const [B, D] = dims;
const out = [];
for (let b = 0; b < B; b++)
out.push(data.slice(b * D, (b + 1) * D));
return out;
}
if (dims.length === 1)
return [data];
}
throw new Error("[LocalEmbeddingProvider] unsupported embedding output");
}
//# sourceMappingURL=LocalEmbeddingProvider.js.map