mirror of
https://github.com/openclaw/openclaw.git
synced 2026-08-22 18:35:21 -06:00
158 lines
5.3 KiB
TypeScript
158 lines
5.3 KiB
TypeScript
import type { EmbeddingInput } from "../../packages/memory-host-sdk/src/engine-embeddings.js";
|
|
// Resolves plugin-provided memory embedding providers from config and registry.
|
|
import { resolveGlobalMap } from "../shared/global-singleton.js";
|
|
import type {
|
|
EmbeddingProvider,
|
|
EmbeddingProviderAdapter,
|
|
EmbeddingProviderCallOptions,
|
|
EmbeddingProviderCreateOptions,
|
|
EmbeddingProviderIndexIdentity,
|
|
EmbeddingProviderRuntime,
|
|
} from "./embedding-provider-types.js";
|
|
|
|
/** Chunk submitted to memory embedding batch processing. */
|
|
export type MemoryEmbeddingBatchChunk = {
|
|
text: string;
|
|
embeddingInput?: EmbeddingInput;
|
|
};
|
|
|
|
/** Options for batch memory embedding work. */
|
|
export type MemoryEmbeddingBatchOptions = {
|
|
agentId: string;
|
|
chunks: MemoryEmbeddingBatchChunk[];
|
|
wait: boolean;
|
|
concurrency: number;
|
|
pollIntervalMs: number;
|
|
timeoutMs: number;
|
|
debug: (message: string, data?: Record<string, unknown>) => void;
|
|
};
|
|
|
|
/** Per-call options for memory embedding providers. */
|
|
export type MemoryEmbeddingProviderCallOptions = Pick<EmbeddingProviderCallOptions, "signal">;
|
|
|
|
/** Runtime metadata returned with memory embedding providers. */
|
|
export type MemoryEmbeddingProviderRuntime = EmbeddingProviderRuntime & {
|
|
sourceWideBatchEmbed?: boolean;
|
|
batchEmbed?: (options: MemoryEmbeddingBatchOptions) => Promise<number[][] | null>;
|
|
};
|
|
|
|
/** Provider-owned canonical identity and exact aliases for persisted indexes. */
|
|
export type MemoryEmbeddingProviderIndexIdentity = EmbeddingProviderIndexIdentity;
|
|
|
|
/** Created memory embedding provider instance. */
|
|
export type MemoryEmbeddingProvider = Pick<
|
|
EmbeddingProvider,
|
|
"id" | "model" | "maxInputTokens" | "close"
|
|
> & {
|
|
embedQuery: (text: string, options?: MemoryEmbeddingProviderCallOptions) => Promise<number[]>;
|
|
embedBatch: (
|
|
texts: string[],
|
|
options?: MemoryEmbeddingProviderCallOptions,
|
|
) => Promise<number[][]>;
|
|
embedBatchInputs?: (
|
|
inputs: EmbeddingInput[],
|
|
options?: MemoryEmbeddingProviderCallOptions,
|
|
) => Promise<number[][]>;
|
|
};
|
|
|
|
/** Options passed to memory embedding provider adapters. */
|
|
export type MemoryEmbeddingProviderCreateOptions = Omit<
|
|
EmbeddingProviderCreateOptions,
|
|
"dimensions" | "local" | "taskType"
|
|
> & {
|
|
fallback?: string;
|
|
local?: {
|
|
modelPath?: string;
|
|
modelCacheDir?: string;
|
|
contextSize?: number | "auto";
|
|
};
|
|
outputDimensionality?: number;
|
|
taskType?:
|
|
| "RETRIEVAL_QUERY"
|
|
| "RETRIEVAL_DOCUMENT"
|
|
| "SEMANTIC_SIMILARITY"
|
|
| "CLASSIFICATION"
|
|
| "CLUSTERING"
|
|
| "QUESTION_ANSWERING"
|
|
| "FACT_VERIFICATION";
|
|
};
|
|
|
|
/** Result returned by a memory embedding provider adapter. */
|
|
export type MemoryEmbeddingProviderCreateResult = {
|
|
provider: MemoryEmbeddingProvider | null;
|
|
runtime?: MemoryEmbeddingProviderRuntime;
|
|
};
|
|
|
|
/** Adapter contract for registered memory embedding providers. */
|
|
export type MemoryEmbeddingProviderAdapter = Omit<
|
|
EmbeddingProviderAdapter,
|
|
"create" | "resolveIndexIdentity"
|
|
> & {
|
|
autoSelectPriority?: number;
|
|
allowExplicitWhenConfiguredAuto?: boolean;
|
|
supportsMultimodalEmbeddings?: (params: { model: string }) => boolean;
|
|
resolveIndexIdentity?: (
|
|
options: MemoryEmbeddingProviderCreateOptions,
|
|
) => MemoryEmbeddingProviderIndexIdentity;
|
|
create: (
|
|
options: MemoryEmbeddingProviderCreateOptions,
|
|
) => Promise<MemoryEmbeddingProviderCreateResult>;
|
|
shouldContinueAutoSelection?: (err: unknown) => boolean;
|
|
};
|
|
|
|
/** Registered memory embedding provider with optional owning plugin metadata. */
|
|
export type RegisteredMemoryEmbeddingProvider = {
|
|
adapter: MemoryEmbeddingProviderAdapter;
|
|
ownerPluginId?: string;
|
|
};
|
|
|
|
const MEMORY_EMBEDDING_PROVIDERS_KEY = Symbol.for("openclaw.memoryEmbeddingProviders");
|
|
|
|
function getMemoryEmbeddingProviders(): Map<string, RegisteredMemoryEmbeddingProvider> {
|
|
return resolveGlobalMap(MEMORY_EMBEDDING_PROVIDERS_KEY);
|
|
}
|
|
|
|
/** Registers a memory embedding provider adapter for the current process. */
|
|
export function registerMemoryEmbeddingProvider(
|
|
adapter: MemoryEmbeddingProviderAdapter,
|
|
options?: { ownerPluginId?: string },
|
|
): void {
|
|
getMemoryEmbeddingProviders().set(adapter.id, {
|
|
adapter,
|
|
ownerPluginId: options?.ownerPluginId,
|
|
});
|
|
}
|
|
|
|
/** Returns a registered memory embedding provider entry. */
|
|
export function getRegisteredMemoryEmbeddingProvider(
|
|
id: string,
|
|
): RegisteredMemoryEmbeddingProvider | undefined {
|
|
return getMemoryEmbeddingProviders().get(id);
|
|
}
|
|
|
|
/** Lists registered memory embedding provider entries. */
|
|
export function listRegisteredMemoryEmbeddingProviders(): RegisteredMemoryEmbeddingProvider[] {
|
|
return Array.from(getMemoryEmbeddingProviders().values());
|
|
}
|
|
|
|
/** Lists registered memory embedding provider adapters. */
|
|
export function listMemoryEmbeddingProviders(): MemoryEmbeddingProviderAdapter[] {
|
|
return listRegisteredMemoryEmbeddingProviders().map((entry) => entry.adapter);
|
|
}
|
|
/** Replaces registered memory embedding providers while preserving metadata. */
|
|
export function restoreRegisteredMemoryEmbeddingProviders(
|
|
entries: RegisteredMemoryEmbeddingProvider[],
|
|
): void {
|
|
getMemoryEmbeddingProviders().clear();
|
|
for (const entry of entries) {
|
|
registerMemoryEmbeddingProvider(entry.adapter, {
|
|
ownerPluginId: entry.ownerPluginId,
|
|
});
|
|
}
|
|
}
|
|
|
|
/** Clears registered memory embedding providers. */
|
|
export function clearMemoryEmbeddingProviders(): void {
|
|
getMemoryEmbeddingProviders().clear();
|
|
}
|