mirror of
https://github.com/lancedb/lancedb.git
synced 2026-01-07 20:32:59 +00:00
I've been noticing a lot of friction with the current toolchain for '/nodejs'. Particularly with the usage of eslint and prettier. [Biome](https://biomejs.dev/) is an all in one formatter & linter that replaces the need for two different ones that can potentially clash with one another. I've been using it in the [nodejs-polars](https://github.com/pola-rs/nodejs-polars) repo for quite some time & have found it much more pleasant to work with. --- One other small change included in this PR: use [ts-jest](https://www.npmjs.com/package/ts-jest) so we can run our tests without having to rebuild typescript code first
63 lines
1.8 KiB
TypeScript
63 lines
1.8 KiB
TypeScript
// Copyright 2023 Lance Developers.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
import type OpenAI from "openai";
|
|
import { type EmbeddingFunction } from "./embedding_function";
|
|
|
|
export class OpenAIEmbeddingFunction implements EmbeddingFunction<string> {
|
|
private readonly _openai: OpenAI;
|
|
private readonly _modelName: string;
|
|
|
|
constructor(
|
|
sourceColumn: string,
|
|
openAIKey: string,
|
|
modelName: string = "text-embedding-ada-002",
|
|
) {
|
|
/**
|
|
* @type {import("openai").default}
|
|
*/
|
|
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
let Openai;
|
|
try {
|
|
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
Openai = require("openai");
|
|
} catch {
|
|
throw new Error("please install openai@^4.24.1 using npm install openai");
|
|
}
|
|
|
|
this.sourceColumn = sourceColumn;
|
|
const configuration = {
|
|
apiKey: openAIKey,
|
|
};
|
|
|
|
this._openai = new Openai(configuration);
|
|
this._modelName = modelName;
|
|
}
|
|
|
|
async embed(data: string[]): Promise<number[][]> {
|
|
const response = await this._openai.embeddings.create({
|
|
model: this._modelName,
|
|
input: data,
|
|
});
|
|
|
|
const embeddings: number[][] = [];
|
|
for (let i = 0; i < response.data.length; i++) {
|
|
embeddings.push(response.data[i].embedding);
|
|
}
|
|
return embeddings;
|
|
}
|
|
|
|
sourceColumn: string;
|
|
}
|