openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
71 lines (70 loc) • 2.69 kB
JavaScript
import { n as resolveRemoteEmbeddingClient, r as fetchRemoteEmbeddingVectors } from "./memory-core-host-engine-embeddings-nTgmnTkX.js";
import { r as OPENAI_DEFAULT_EMBEDDING_MODEL } from "./default-models-CV6ZCMki.js";
//#region extensions/openai/embedding-provider.ts
const DEFAULT_OPENAI_BASE_URL = "https://api.openai.com/v1";
const DEFAULT_OPENAI_EMBEDDING_MODEL = OPENAI_DEFAULT_EMBEDDING_MODEL;
const OPENAI_MAX_INPUT_TOKENS = {
"text-embedding-3-small": 8192,
"text-embedding-3-large": 8192,
"text-embedding-ada-002": 8191
};
function normalizeOpenAiModel(model) {
const trimmed = model.trim();
if (!trimmed) return DEFAULT_OPENAI_EMBEDDING_MODEL;
return trimmed.startsWith("openai/") ? trimmed.slice(7) : trimmed;
}
async function createOpenAiEmbeddingProvider(options) {
const client = await resolveOpenAiEmbeddingClient(options);
const url = `${client.baseUrl.replace(/\/$/, "")}/embeddings`;
const resolveInputType = (kind) => {
const value = (kind === "query" ? client.queryInputType : client.documentInputType) ?? client.inputType;
return typeof value === "string" && value.trim().length > 0 ? value.trim() : void 0;
};
const embed = async (input, kind, signal) => {
if (input.length === 0) return [];
const inputType = resolveInputType(kind);
return await fetchRemoteEmbeddingVectors({
url,
headers: client.headers,
ssrfPolicy: client.ssrfPolicy,
fetchImpl: client.fetchImpl,
signal,
body: {
model: client.model,
input,
...typeof client.outputDimensionality === "number" ? { dimensions: client.outputDimensionality } : {},
...inputType ? { input_type: inputType } : {}
},
errorPrefix: "openai embeddings failed"
});
};
return {
provider: {
id: "openai",
model: client.model,
...typeof OPENAI_MAX_INPUT_TOKENS[client.model] === "number" ? { maxInputTokens: OPENAI_MAX_INPUT_TOKENS[client.model] } : {},
embedQuery: async (text, optionsValue) => {
const [vec] = await embed([text], "query", optionsValue?.signal);
return vec ?? [];
},
embedBatch: async (texts, optionsLocal) => await embed(texts, "document", optionsLocal?.signal)
},
client
};
}
async function resolveOpenAiEmbeddingClient(options) {
return {
...await resolveRemoteEmbeddingClient({
provider: options.provider ?? "openai",
options,
defaultBaseUrl: DEFAULT_OPENAI_BASE_URL,
normalizeModel: normalizeOpenAiModel
}),
inputType: options.inputType,
queryInputType: options.queryInputType,
documentInputType: options.documentInputType,
outputDimensionality: options.outputDimensionality
};
}
//#endregion
export { createOpenAiEmbeddingProvider as n, DEFAULT_OPENAI_EMBEDDING_MODEL as t };