mirror of
https://github.com/lancedb/lancedb.git
synced 2026-01-06 03:42:57 +00:00
The synchronous table_names function in python lancedb relies on arrow's filesystem which behaves slightly differently than object_store. As a result, the function would not work properly in GCS. However, the async table_names function uses object_store directly and thus is accurate. In most cases we can fallback to using the async table_names function and so this PR does so. The one case we cannot is if the user is already in an async context (we can't start a new async event loop). Soon, we can just redirect those users to use the async API instead of the sync API and so that case will eventually go away. For now, we fallback to the old behavior.
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 EmbeddingFunction } from "./embedding_function";
|
|
import type OpenAI from "openai";
|
|
|
|
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;
|
|
}
|