openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
38 lines (37 loc) • 1.78 kB
JavaScript
//#region packages/memory-host-sdk/src/host/embedding-inputs.ts
const EMBEDDING_TASK_PREFIXES = {
RETRIEVAL_QUERY: "task: search result | query:",
RETRIEVAL_DOCUMENT: "title: none | text:",
SEMANTIC_SIMILARITY: "task: sentence similarity | query:",
CLASSIFICATION: "task: classification | query:",
CLUSTERING: "task: clustering | query:",
QUESTION_ANSWERING: "task: question answering | query:",
FACT_VERIFICATION: "task: fact checking | query:"
};
function formatEmbeddingTaskText(text, taskType) {
return `${EMBEDDING_TASK_PREFIXES[taskType]} ${text}`;
}
/** Advance the model's revision when its input format changes, for index and cache upgrades. */
function resolveEmbeddingInputFormatVersion(model) {
return /(?:^|[/\\])(?:text-embedding-)?embeddinggemma(?:[-:._]|$)/iu.test(model.trim()) ? 1 : 0;
}
function formatEmbeddingModelInput(input, model, role) {
if (!resolveEmbeddingInputFormatVersion(model)) return input;
const taskType = role === "query" ? "RETRIEVAL_QUERY" : "RETRIEVAL_DOCUMENT";
if (typeof input === "string") return formatEmbeddingTaskText(input, taskType);
if (hasNonTextEmbeddingParts(input)) return input;
return {
...input,
text: formatEmbeddingTaskText(input.text, taskType),
...input.parts ? { parts: input.parts.map((part, index) => part.type === "text" && index === 0 ? {
...part,
text: formatEmbeddingTaskText(part.text, taskType)
} : part) } : {}
};
}
/** Return true when a chunk needs structured provider handling, not text splitting. */
function hasNonTextEmbeddingParts(input) {
return input?.parts?.some((part) => part.type === "inline-data") ?? false;
}
//#endregion
export { resolveEmbeddingInputFormatVersion as i, formatEmbeddingTaskText as n, hasNonTextEmbeddingParts as r, formatEmbeddingModelInput as t };