mirror of
https://github.com/openclaw/openclaw.git
synced 2026-03-25 08:52:12 +00:00
Memory: share runtime backend definitions
This commit is contained in:
34
src/extension-host/embedding-runtime-backends.test.ts
Normal file
34
src/extension-host/embedding-runtime-backends.test.ts
Normal file
@@ -0,0 +1,34 @@
|
||||
import { describe, expect, it } from "vitest";
|
||||
import {
|
||||
DEFAULT_EXTENSION_HOST_LOCAL_EMBEDDING_MODEL,
|
||||
EXTENSION_HOST_EMBEDDING_RUNTIME_BACKEND_IDS,
|
||||
EXTENSION_HOST_REMOTE_EMBEDDING_PROVIDER_IDS,
|
||||
isExtensionHostEmbeddingRuntimeBackendAutoSelectable,
|
||||
} from "./embedding-runtime-backends.js";
|
||||
|
||||
describe("embedding-runtime-backends", () => {
|
||||
it("keeps the built-in embedding backend order stable", () => {
|
||||
expect(DEFAULT_EXTENSION_HOST_LOCAL_EMBEDDING_MODEL).toContain("embeddinggemma");
|
||||
expect(EXTENSION_HOST_REMOTE_EMBEDDING_PROVIDER_IDS).toEqual([
|
||||
"openai",
|
||||
"gemini",
|
||||
"voyage",
|
||||
"mistral",
|
||||
]);
|
||||
expect(EXTENSION_HOST_EMBEDDING_RUNTIME_BACKEND_IDS).toEqual([
|
||||
"local",
|
||||
"openai",
|
||||
"gemini",
|
||||
"voyage",
|
||||
"mistral",
|
||||
"ollama",
|
||||
]);
|
||||
});
|
||||
|
||||
it("marks only local and remote embedding backends as auto-selectable", () => {
|
||||
expect(isExtensionHostEmbeddingRuntimeBackendAutoSelectable("local")).toBe(true);
|
||||
expect(isExtensionHostEmbeddingRuntimeBackendAutoSelectable("openai")).toBe(true);
|
||||
expect(isExtensionHostEmbeddingRuntimeBackendAutoSelectable("mistral")).toBe(true);
|
||||
expect(isExtensionHostEmbeddingRuntimeBackendAutoSelectable("ollama")).toBe(false);
|
||||
});
|
||||
});
|
||||
23
src/extension-host/embedding-runtime-backends.ts
Normal file
23
src/extension-host/embedding-runtime-backends.ts
Normal file
@@ -0,0 +1,23 @@
|
||||
import type { EmbeddingProviderId } from "./embedding-runtime-types.js";
|
||||
|
||||
export const DEFAULT_EXTENSION_HOST_LOCAL_EMBEDDING_MODEL =
|
||||
"hf:ggml-org/embeddinggemma-300m-qat-q8_0-GGUF/embeddinggemma-300m-qat-Q8_0.gguf";
|
||||
|
||||
export const EXTENSION_HOST_REMOTE_EMBEDDING_PROVIDER_IDS = [
|
||||
"openai",
|
||||
"gemini",
|
||||
"voyage",
|
||||
"mistral",
|
||||
] as const satisfies readonly EmbeddingProviderId[];
|
||||
|
||||
export const EXTENSION_HOST_EMBEDDING_RUNTIME_BACKEND_IDS = [
|
||||
"local",
|
||||
...EXTENSION_HOST_REMOTE_EMBEDDING_PROVIDER_IDS,
|
||||
"ollama",
|
||||
] as const satisfies readonly EmbeddingProviderId[];
|
||||
|
||||
export function isExtensionHostEmbeddingRuntimeBackendAutoSelectable(
|
||||
backendId: EmbeddingProviderId,
|
||||
): boolean {
|
||||
return backendId === "local" || EXTENSION_HOST_REMOTE_EMBEDDING_PROVIDER_IDS.includes(backendId);
|
||||
}
|
||||
@@ -25,6 +25,10 @@ import {
|
||||
} from "../memory/embeddings-voyage.js";
|
||||
import { importNodeLlamaCpp } from "../memory/node-llama.js";
|
||||
import { resolveUserPath } from "../utils.js";
|
||||
import {
|
||||
DEFAULT_EXTENSION_HOST_LOCAL_EMBEDDING_MODEL,
|
||||
EXTENSION_HOST_REMOTE_EMBEDDING_PROVIDER_IDS,
|
||||
} from "./embedding-runtime-backends.js";
|
||||
import type {
|
||||
EmbeddingProvider,
|
||||
EmbeddingProviderId,
|
||||
@@ -41,16 +45,6 @@ export type {
|
||||
VoyageEmbeddingClient,
|
||||
};
|
||||
|
||||
export const DEFAULT_EXTENSION_HOST_LOCAL_EMBEDDING_MODEL =
|
||||
"hf:ggml-org/embeddinggemma-300m-qat-q8_0-GGUF/embeddinggemma-300m-qat-Q8_0.gguf";
|
||||
|
||||
export const EXTENSION_HOST_REMOTE_EMBEDDING_PROVIDER_IDS = [
|
||||
"openai",
|
||||
"gemini",
|
||||
"voyage",
|
||||
"mistral",
|
||||
] as const satisfies readonly EmbeddingProviderId[];
|
||||
|
||||
export function canAutoSelectExtensionHostLocalEmbedding(
|
||||
options: EmbeddingProviderOptions,
|
||||
): boolean {
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
import {
|
||||
DEFAULT_EXTENSION_HOST_LOCAL_EMBEDDING_MODEL,
|
||||
createExtensionHostEmbeddingProvider,
|
||||
} from "./embedding-runtime-registry.js";
|
||||
import { DEFAULT_EXTENSION_HOST_LOCAL_EMBEDDING_MODEL } from "./embedding-runtime-backends.js";
|
||||
import { createExtensionHostEmbeddingProvider } from "./embedding-runtime-registry.js";
|
||||
import type {
|
||||
EmbeddingProviderOptions,
|
||||
EmbeddingProviderResult,
|
||||
|
||||
@@ -1,7 +1,18 @@
|
||||
import { beforeEach, describe, expect, it, vi } from "vitest";
|
||||
|
||||
vi.mock("./embedding-runtime-registry.js", () => ({
|
||||
vi.mock("./embedding-runtime-backends.js", () => ({
|
||||
EXTENSION_HOST_EMBEDDING_RUNTIME_BACKEND_IDS: [
|
||||
"local",
|
||||
"openai",
|
||||
"gemini",
|
||||
"voyage",
|
||||
"mistral",
|
||||
"ollama",
|
||||
],
|
||||
EXTENSION_HOST_REMOTE_EMBEDDING_PROVIDER_IDS: ["openai", "gemini", "voyage", "mistral"],
|
||||
isExtensionHostEmbeddingRuntimeBackendAutoSelectable: vi.fn(
|
||||
(backendId: string) => backendId !== "ollama",
|
||||
),
|
||||
}));
|
||||
|
||||
vi.mock("./media-runtime-registry.js", () => ({
|
||||
|
||||
@@ -7,7 +7,10 @@ import {
|
||||
DEFAULT_IMAGE_MODELS,
|
||||
} from "../media-understanding/defaults.js";
|
||||
import type { MediaUnderstandingCapability } from "../media-understanding/types.js";
|
||||
import { EXTENSION_HOST_REMOTE_EMBEDDING_PROVIDER_IDS } from "./embedding-runtime-registry.js";
|
||||
import {
|
||||
EXTENSION_HOST_EMBEDDING_RUNTIME_BACKEND_IDS,
|
||||
isExtensionHostEmbeddingRuntimeBackendAutoSelectable,
|
||||
} from "./embedding-runtime-backends.js";
|
||||
import type { EmbeddingProviderId } from "./embedding-runtime-types.js";
|
||||
import {
|
||||
buildExtensionHostMediaUnderstandingRegistry,
|
||||
@@ -43,12 +46,6 @@ type ExtensionHostMediaRuntimeSubsystemId = Extract<
|
||||
"media.audio" | "media.image" | "media.video"
|
||||
>;
|
||||
|
||||
const EXTENSION_HOST_EMBEDDING_BACKEND_IDS = [
|
||||
"local",
|
||||
...EXTENSION_HOST_REMOTE_EMBEDDING_PROVIDER_IDS,
|
||||
"ollama",
|
||||
] as const satisfies readonly EmbeddingProviderId[];
|
||||
|
||||
const EXTENSION_HOST_MEDIA_AUTO_PROVIDER_IDS: Record<
|
||||
MediaUnderstandingCapability,
|
||||
readonly string[]
|
||||
@@ -124,7 +121,7 @@ function resolveExtensionHostMediaRuntimeDefaultModelFromDefaults(params: {
|
||||
}
|
||||
|
||||
export function listExtensionHostEmbeddingRuntimeBackendCatalogEntries(): readonly ExtensionHostRuntimeBackendCatalogEntry[] {
|
||||
return EXTENSION_HOST_EMBEDDING_BACKEND_IDS.map((backendId, defaultRank) => ({
|
||||
return EXTENSION_HOST_EMBEDDING_RUNTIME_BACKEND_IDS.map((backendId, defaultRank) => ({
|
||||
id: buildRuntimeBackendCatalogId("embedding", backendId),
|
||||
family: EXTENSION_HOST_RUNTIME_BACKEND_FAMILY,
|
||||
subsystemId: "embedding",
|
||||
@@ -134,8 +131,7 @@ export function listExtensionHostEmbeddingRuntimeBackendCatalogEntries(): readon
|
||||
selectorKeys: [backendId],
|
||||
capabilities: ["embed.query", "embed.batch"],
|
||||
metadata: {
|
||||
autoSelectable:
|
||||
backendId === "local" || EXTENSION_HOST_REMOTE_EMBEDDING_PROVIDER_IDS.includes(backendId),
|
||||
autoSelectable: isExtensionHostEmbeddingRuntimeBackendAutoSelectable(backendId),
|
||||
},
|
||||
}));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user