Skip to content

Gateway startup does not load the plugin owning a configured memory embedding provider (memorySearch.provider) #89651

@joeykrug

Description

@joeykrug

Summary

When agents.defaults.memorySearch.provider selects a plugin-owned memory embedding provider (for example "openai"), Gateway startup planning does not load the plugin that owns that provider. As a result active-memory can start without a registered memory embedding provider and silently drops to keyword/FTS-only recall.

Environment

  • Component: Gateway startup plugin planning
  • Config: agents.defaults.memorySearch.provider = "openai"

Steps to reproduce

  1. Configure semantic memory with a plugin-owned remote embedding provider:
    {
      "agents": { "defaults": { "memorySearch": { "provider": "openai" } } }
    }
  2. Start the Gateway with no other config that would independently pull the OpenAI plugin into the startup plan (no openai/* model, speech/image/voice provider, etc.).
  3. Inspect loaded plugins / memory status.

Expected

The plugin that declares contracts.memoryEmbeddingProviders: ["openai"] (the OpenAI plugin) is included in the Gateway startup plugin set, registers openAiMemoryEmbeddingProviderAdapter via api.registerMemoryEmbeddingProvider(...), and semantic recall uses embeddings.

Actual

Startup planning only pulls provider plugins into the plan for speech / web search / model / image / voice providers. There is no capability-specific startup loading keyed on agents.*.memorySearch.provider against contracts.memoryEmbeddingProviders. The OpenAI plugin is therefore not started, no memory embedding provider is registered, and active-memory falls back to keyword/FTS-only search with no clear signal to the operator.

Root cause

src/plugins/gateway-startup-plugin-ids.ts collects configured provider ids and matches them against manifest contracts for several capabilities (speechProviders, webSearchProviders, model providers, imageGenerationProviders/videoGenerationProviders/musicGenerationProviders, voice providers) inside resolveGatewayStartupPluginPlanFromRegistry, and mirrors that in the metadata-scope fast path (resolveGatewayStartupMetadataPluginIds). Memory embedding providers are absent from both paths, so a configured memorySearch.provider never pulls its owning plugin into the startup plan.

Proposed fix

Add capability-specific startup loading for memory embedding providers, analogous to the existing speech/web/model/image/voice provider startup loading:

  • Collect agents.*.memorySearch.provider (defaults + per-agent), ignoring sentinel values (auto/local/none) and disabled memory-search blocks.
  • Match configured ids against plugin contracts.memoryEmbeddingProviders.
  • Include the owning plugin in the Gateway startup plugin ids, respecting plugin allow/deny/enabled policy exactly like the neighboring provider-startup functions.
  • Add a health warning at Gateway startup when memorySearch.provider=<x> is configured but no loaded plugin registered memory embedding provider <x> (so the silent keyword/FTS fallback is diagnosable).

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions