ai-utils.js
Version:
Build AI applications, chatbots, and agents with JavaScript and TypeScript.
86 lines (85 loc) • 2.69 kB
JavaScript
import { executeCall } from "../executeCall.js";
/**
* Generate embeddings for multiple texts.
*
* @example
* const { embeddings } = await embedTexts(
* new OpenAITextEmbeddingModel(...),
* [
* "At first, Nox didn't know what to do with the pup.",
* "He keenly observed and absorbed everything around him, from the birds in the sky to the trees in the forest.",
* ]
* );
*/
export async function embedTexts(model, texts, options) {
const result = await executeCall({
model,
options,
generateResponse: (options) => {
// split the texts into groups that are small enough to be sent in one call:
const maxTextsPerCall = model.maxTextsPerCall;
const textGroups = [];
for (let i = 0; i < texts.length; i += maxTextsPerCall) {
textGroups.push(texts.slice(i, i + maxTextsPerCall));
}
return Promise.all(textGroups.map((textGroup) => model.generateEmbeddingResponse(textGroup, options)));
},
extractOutputValue: (result) => {
const embeddings = [];
for (const response of result) {
embeddings.push(...model.extractEmbeddings(response));
}
return embeddings;
},
getStartEvent: (metadata, settings) => ({
type: "text-embedding-started",
metadata,
settings,
texts,
}),
getAbortEvent: (metadata, settings) => ({
type: "text-embedding-finished",
status: "abort",
metadata,
settings,
texts,
}),
getFailureEvent: (metadata, settings, error) => ({
type: "text-embedding-finished",
status: "failure",
metadata,
settings,
error,
texts,
}),
getSuccessEvent: (metadata, settings, response, output) => ({
type: "text-embedding-finished",
status: "success",
metadata,
settings,
texts,
response,
generatedEmbeddings: output,
}),
});
return {
embeddings: result.output,
metadata: result.metadata,
};
}
/**
* Generate an embedding for a single text.
*
* @example
* const { embedding } = await embedText(
* new OpenAITextEmbeddingModel(...),
* "At first, Nox didn't know what to do with the pup."
* );
*/
export async function embedText(model, text, options) {
const result = await embedTexts(model, [text], options);
return {
embedding: result.embeddings[0],
metadata: result.metadata,
};
}