mirror of
https://github.com/openclaw/openclaw.git
synced 2026-06-02 03:14:55 +00:00
Summary: - Merged feat(plugins): add embedding provider contract after ClawSweeper review. Automerge notes: - PR branch already contained follow-up commit before automerge: chore(plugins): refresh embedding provider sdk baseline - PR branch already contained follow-up commit before automerge: docs(plugins): document embedding provider contract - PR branch already contained follow-up commit before automerge: fix(plugins): restore embedding providers after snapshot loads - PR branch already contained follow-up commit before automerge: fix(plugins): resolve embedding providers from manifests - PR branch already contained follow-up commit before automerge: fix(plugin-sdk): keep embedding provider registry mutators internal - PR branch already contained follow-up commit before automerge: chore(plugin-sdk): refresh embedding provider API baseline Validation: - ClawSweeper review passed for head41ebd66ab4. - Required merge gates passed before the squash merge. Prepared head SHA:41ebd66ab4Review: https://github.com/openclaw/openclaw/pull/84947#issuecomment-4514762026 Co-authored-by: Bob <dutifulbob@gmail.com> Co-authored-by: Mariano Belinky <mbelinky@gmail.com> Co-authored-by: clawsweeper[bot] <274271284+clawsweeper[bot]@users.noreply.github.com> Approved-by: osolmaz Co-authored-by: osolmaz <2453968+osolmaz@users.noreply.github.com>
137 lines
3.8 KiB
TypeScript
137 lines
3.8 KiB
TypeScript
import type { OpenClawConfig } from "../config/types.openclaw.js";
|
|
import type { SecretInput } from "../config/types.secrets.js";
|
|
|
|
export type EmbeddingInput =
|
|
| string
|
|
| {
|
|
text: string;
|
|
parts?: Array<
|
|
{ type: "text"; text: string } | { type: "inline-data"; mimeType: string; data: string }
|
|
>;
|
|
};
|
|
|
|
export type EmbeddingProviderCallOptions = {
|
|
signal?: AbortSignal;
|
|
inputType?: "query" | "document" | "semantic" | "classification" | "clustering";
|
|
};
|
|
|
|
export type EmbeddingProviderRuntime = {
|
|
id: string;
|
|
cacheKeyData?: Record<string, unknown>;
|
|
inlineQueryTimeoutMs?: number;
|
|
inlineBatchTimeoutMs?: number;
|
|
};
|
|
|
|
export type EmbeddingProvider = {
|
|
id: string;
|
|
model: string;
|
|
dimensions?: number;
|
|
maxInputTokens?: number;
|
|
embed: (input: EmbeddingInput, options?: EmbeddingProviderCallOptions) => Promise<number[]>;
|
|
embedBatch: (
|
|
inputs: EmbeddingInput[],
|
|
options?: EmbeddingProviderCallOptions,
|
|
) => Promise<number[][]>;
|
|
close?: () => Promise<void> | void;
|
|
};
|
|
|
|
export type EmbeddingProviderCreateOptions = {
|
|
config: OpenClawConfig;
|
|
agentDir?: string;
|
|
provider?: string;
|
|
remote?: {
|
|
baseUrl?: string;
|
|
apiKey?: SecretInput;
|
|
headers?: Record<string, string>;
|
|
};
|
|
model: string;
|
|
local?: {
|
|
modelPath?: string;
|
|
modelCacheDir?: string;
|
|
};
|
|
dimensions?: number;
|
|
taskType?: string;
|
|
};
|
|
|
|
export type EmbeddingProviderCreateResult = {
|
|
provider: EmbeddingProvider | null;
|
|
runtime?: EmbeddingProviderRuntime;
|
|
};
|
|
|
|
export type EmbeddingProviderAdapter = {
|
|
id: string;
|
|
defaultModel?: string;
|
|
transport?: "local" | "remote";
|
|
authProviderId?: string;
|
|
create: (options: EmbeddingProviderCreateOptions) => Promise<EmbeddingProviderCreateResult>;
|
|
formatSetupError?: (err: unknown) => string;
|
|
};
|
|
|
|
export type RegisteredEmbeddingProvider = {
|
|
adapter: EmbeddingProviderAdapter;
|
|
ownerPluginId?: string;
|
|
};
|
|
|
|
const EMBEDDING_PROVIDERS_KEY = Symbol.for("openclaw.embeddingProviders");
|
|
|
|
function getEmbeddingProviders(): Map<string, RegisteredEmbeddingProvider> {
|
|
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;
|
|
}
|
|
|
|
export function registerEmbeddingProvider(
|
|
adapter: EmbeddingProviderAdapter,
|
|
options?: { ownerPluginId?: string },
|
|
): void {
|
|
getEmbeddingProviders().set(adapter.id, {
|
|
adapter,
|
|
ownerPluginId: options?.ownerPluginId,
|
|
});
|
|
}
|
|
|
|
export function getRegisteredEmbeddingProvider(
|
|
id: string,
|
|
): RegisteredEmbeddingProvider | undefined {
|
|
return getEmbeddingProviders().get(id);
|
|
}
|
|
|
|
export function getEmbeddingProvider(id: string): EmbeddingProviderAdapter | undefined {
|
|
return getEmbeddingProviders().get(id)?.adapter;
|
|
}
|
|
|
|
export function listRegisteredEmbeddingProviders(): RegisteredEmbeddingProvider[] {
|
|
return Array.from(getEmbeddingProviders().values());
|
|
}
|
|
|
|
export function listEmbeddingProviders(): EmbeddingProviderAdapter[] {
|
|
return listRegisteredEmbeddingProviders().map((entry) => entry.adapter);
|
|
}
|
|
|
|
export function restoreEmbeddingProviders(adapters: EmbeddingProviderAdapter[]): void {
|
|
getEmbeddingProviders().clear();
|
|
for (const adapter of adapters) {
|
|
registerEmbeddingProvider(adapter);
|
|
}
|
|
}
|
|
|
|
export function restoreRegisteredEmbeddingProviders(entries: RegisteredEmbeddingProvider[]): void {
|
|
getEmbeddingProviders().clear();
|
|
for (const entry of entries) {
|
|
registerEmbeddingProvider(entry.adapter, {
|
|
ownerPluginId: entry.ownerPluginId,
|
|
});
|
|
}
|
|
}
|
|
|
|
export function clearEmbeddingProviders(): void {
|
|
getEmbeddingProviders().clear();
|
|
}
|
|
|
|
export const resetEmbeddingProviders = clearEmbeddingProviders;
|