mirror of
https://github.com/openclaw/openclaw.git
synced 2026-07-23 10:21:12 +00:00
* refactor(plugins): trim activation and contract exports * test(plugins): restore fixture cleanup * refactor(plugins): trim install and loader exports * test(plugins): fully reset loader caches * refactor(plugins): trim metadata and catalog exports * test(plugins): preserve catalog trust coverage * refactor(plugins): trim provider and plugin exports * refactor(plugins): trim runtime and tool exports * test(plugins): update dead-export consumers * test(plugins): remove empty dead-export suites * refactor(plugins): align exports with split registry * refactor(plugins): trim drifted loader exports * style(plugins): format test fixtures * refactor(scripts): use supported plugin APIs * refactor(plugins): finish dead export cleanup * chore(deadcode): refresh export baseline * test(cli): mock production memory state * chore(deadcode): sync latest export baseline * fix(tests): keep plugin fixtures inside core * chore(deadcode): refresh rebased export baseline * chore(deadcode): sync current ratchets * fix(plugins): retain reserved slot invariant * fix(plugins): preserve dead-export invariants * test(plugins): use neutral catalog query fixture * test(plugins): satisfy catalog lint * test(plugins): preserve integrity drift coverage * fix(ci): register skill experience live proof
95 lines
3.3 KiB
TypeScript
95 lines
3.3 KiB
TypeScript
/** Registry for plugin-contributed embedding providers. */
|
|
import type {
|
|
EmbeddingProviderAdapter,
|
|
RegisteredEmbeddingProvider,
|
|
} from "./embedding-provider-types.js";
|
|
import { openAICompatibleEmbeddingProviderAdapter } from "./openai-compatible-embedding-provider.js";
|
|
|
|
export type {
|
|
EmbeddingInput,
|
|
EmbeddingProvider,
|
|
EmbeddingProviderAdapter,
|
|
EmbeddingProviderCallOptions,
|
|
EmbeddingProviderCreateOptions,
|
|
EmbeddingProviderCreateResult,
|
|
EmbeddingProviderIndexIdentity,
|
|
EmbeddingProviderRuntime,
|
|
RegisteredEmbeddingProvider,
|
|
} from "./embedding-provider-types.js";
|
|
|
|
const EMBEDDING_PROVIDERS_KEY = Symbol.for("openclaw.embeddingProviders");
|
|
const CORE_EMBEDDING_PROVIDERS: RegisteredEmbeddingProvider[] = [
|
|
{
|
|
adapter: openAICompatibleEmbeddingProviderAdapter,
|
|
ownerPluginId: "core",
|
|
},
|
|
];
|
|
|
|
function getEmbeddingProviders(): Map<string, RegisteredEmbeddingProvider> {
|
|
// The registry is global so tests and lazy-loaded plugin modules share one provider table.
|
|
const globalStore = globalThis as Record<PropertyKey, unknown>;
|
|
const existing = globalStore[EMBEDDING_PROVIDERS_KEY];
|
|
if (existing instanceof Map) {
|
|
return existing as Map<string, RegisteredEmbeddingProvider>;
|
|
}
|
|
const created = new Map<string, RegisteredEmbeddingProvider>();
|
|
globalStore[EMBEDDING_PROVIDERS_KEY] = created;
|
|
return created;
|
|
}
|
|
|
|
function getCoreEmbeddingProvider(id: string): RegisteredEmbeddingProvider | undefined {
|
|
return CORE_EMBEDDING_PROVIDERS.find((entry) => entry.adapter.id === id);
|
|
}
|
|
|
|
/** Registers an embedding provider adapter for plugin and built-in memory callers. */
|
|
export function registerEmbeddingProvider(
|
|
adapter: EmbeddingProviderAdapter,
|
|
options?: { ownerPluginId?: string },
|
|
): void {
|
|
const coreEntry = getCoreEmbeddingProvider(adapter.id);
|
|
if (coreEntry) {
|
|
if (adapter !== coreEntry.adapter) {
|
|
throw new Error(`embedding provider already registered: ${adapter.id} (owner: core)`);
|
|
}
|
|
getEmbeddingProviders().delete(adapter.id);
|
|
return;
|
|
}
|
|
|
|
getEmbeddingProviders().set(adapter.id, {
|
|
adapter,
|
|
ownerPluginId: options?.ownerPluginId,
|
|
});
|
|
}
|
|
|
|
/** Looks up the registered embedding provider entry, including owner metadata. */
|
|
export function getRegisteredEmbeddingProvider(
|
|
id: string,
|
|
): RegisteredEmbeddingProvider | undefined {
|
|
return getCoreEmbeddingProvider(id) ?? getEmbeddingProviders().get(id);
|
|
}
|
|
/** Lists registered embedding providers with core defaults merged first. */
|
|
export function listRegisteredEmbeddingProviders(): RegisteredEmbeddingProvider[] {
|
|
const merged = new Map<string, RegisteredEmbeddingProvider>(
|
|
CORE_EMBEDDING_PROVIDERS.map((entry) => [entry.adapter.id, entry]),
|
|
);
|
|
for (const entry of getEmbeddingProviders().values()) {
|
|
if (!merged.has(entry.adapter.id)) {
|
|
merged.set(entry.adapter.id, entry);
|
|
}
|
|
}
|
|
return Array.from(merged.values());
|
|
} /** Replaces non-core embedding providers while preserving registration metadata. */
|
|
export function restoreRegisteredEmbeddingProviders(entries: RegisteredEmbeddingProvider[]): void {
|
|
getEmbeddingProviders().clear();
|
|
for (const entry of entries) {
|
|
registerEmbeddingProvider(entry.adapter, {
|
|
ownerPluginId: entry.ownerPluginId,
|
|
});
|
|
}
|
|
}
|
|
|
|
/** Clears non-core embedding providers from the process registry. */
|
|
export function clearEmbeddingProviders(): void {
|
|
getEmbeddingProviders().clear();
|
|
}
|