Memory: share runtime backend definitions

This commit is contained in:
Gustavo Madeira Santana
2026-03-15 21:18:53 +00:00
parent d651cdd609
commit b8e6bab3fe
6 changed files with 81 additions and 25 deletions

View 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);
});
});

View 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);
}

View File

@@ -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 {

View File

@@ -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,

View File

@@ -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", () => ({

View File

@@ -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),
},
}));
}