mirror of
https://github.com/memohai/Memoh.git
synced 2026-04-25 07:00:48 +09:00
refactor: multi-provider memory adapters with scan-based builtin (#227)
* refactor: restructure memory into multi-provider adapters, remove manifest.json dependency - Rename internal/memory/provider to internal/memory/adapters with per-provider subdirectories (builtin, mem0, openviking) - Replace manifest.json-based delete/update with scan-based index from daily files - Add mem0 and openviking provider adapters with HTTP client, chat hooks, MCP tools, and CRUD - Wire provider lifecycle into registry (auto-instantiate on create, evict on update/delete) - Split docker-compose into base stack + optional overlays (qdrant, browser, mem0, openviking) - Update admin UI to support dynamic provider config schema rendering * chore(lint): fix all golangci-lint issues for clean CI * refactor(docker): replace compose overlay files with profiles * feat(memory): add built-in memory multi modes * fix(ci): golangci lint * feat(memory): edit built-in memory sparse design
This commit is contained in:
+22
-6
@@ -70,7 +70,11 @@ import (
|
||||
mcpwebfetch "github.com/memohai/memoh/internal/mcp/providers/webfetch"
|
||||
mcpfederation "github.com/memohai/memoh/internal/mcp/sources/federation"
|
||||
"github.com/memohai/memoh/internal/media"
|
||||
memprovider "github.com/memohai/memoh/internal/memory/provider"
|
||||
memprovider "github.com/memohai/memoh/internal/memory/adapters"
|
||||
membuiltin "github.com/memohai/memoh/internal/memory/adapters/builtin"
|
||||
memmem0 "github.com/memohai/memoh/internal/memory/adapters/mem0"
|
||||
memopenviking "github.com/memohai/memoh/internal/memory/adapters/openviking"
|
||||
storefs "github.com/memohai/memoh/internal/memory/storefs"
|
||||
"github.com/memohai/memoh/internal/message"
|
||||
"github.com/memohai/memoh/internal/message/event"
|
||||
"github.com/memohai/memoh/internal/models"
|
||||
@@ -349,13 +353,24 @@ func provideMemoryLLM(modelsService *models.Service, queries *dbsqlc.Queries, lo
|
||||
}
|
||||
}
|
||||
|
||||
func provideMemoryProviderRegistry(log *slog.Logger, chatService *conversation.Service, accountService *accounts.Service, manager *mcp.Manager) *memprovider.Registry {
|
||||
func provideMemoryProviderRegistry(log *slog.Logger, chatService *conversation.Service, accountService *accounts.Service, manager *mcp.Manager, queries *dbsqlc.Queries, cfg config.Config) *memprovider.Registry {
|
||||
registry := memprovider.NewRegistry(log)
|
||||
builtinRuntime := handlers.NewBuiltinMemoryRuntime(manager)
|
||||
registry.RegisterFactory(memprovider.BuiltinType, func(_ string, _ map[string]any) (memprovider.Provider, error) {
|
||||
return memprovider.NewBuiltinProvider(log, builtinRuntime, chatService, accountService), nil
|
||||
fileRuntime := handlers.NewBuiltinMemoryRuntime(manager)
|
||||
fileStore := storefs.New(log, manager)
|
||||
registry.RegisterFactory(string(memprovider.ProviderBuiltin), func(_ string, providerConfig map[string]any) (memprovider.Provider, error) {
|
||||
runtime, err := membuiltin.NewBuiltinRuntimeFromConfig(log, providerConfig, fileRuntime, fileStore, queries, cfg)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return membuiltin.NewBuiltinProvider(log, runtime, chatService, accountService), nil
|
||||
})
|
||||
registry.Register("__builtin_default__", memprovider.NewBuiltinProvider(log, builtinRuntime, chatService, accountService))
|
||||
registry.RegisterFactory(string(memprovider.ProviderMem0), func(_ string, providerConfig map[string]any) (memprovider.Provider, error) {
|
||||
return memmem0.NewMem0Provider(log, providerConfig, fileStore)
|
||||
})
|
||||
registry.RegisterFactory(string(memprovider.ProviderOpenViking), func(_ string, providerConfig map[string]any) (memprovider.Provider, error) {
|
||||
return memopenviking.NewOpenVikingProvider(log, providerConfig)
|
||||
})
|
||||
registry.Register("__builtin_default__", membuiltin.NewBuiltinProvider(log, fileRuntime, chatService, accountService))
|
||||
return registry
|
||||
}
|
||||
|
||||
@@ -724,6 +739,7 @@ func provideServer(params serverParams) *server.Server {
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
func startMemoryProviderBootstrap(lc fx.Lifecycle, log *slog.Logger, mpService *memprovider.Service, registry *memprovider.Registry) {
|
||||
mpService.SetRegistry(registry)
|
||||
lc.Append(fx.Hook{
|
||||
OnStart: func(ctx context.Context) error {
|
||||
resp, err := mpService.EnsureDefault(ctx)
|
||||
|
||||
+1
-1
@@ -108,7 +108,7 @@ func (*containerServer) ReadFile(_ context.Context, req *pb.ReadFileRequest) (*p
|
||||
|
||||
return &pb.ReadFileResponse{
|
||||
Content: out.String(),
|
||||
TotalLines: int32(totalLines),
|
||||
TotalLines: int32(totalLines), //nolint:gosec // file line count won't exceed int32
|
||||
}, nil
|
||||
}
|
||||
|
||||
|
||||
+21
-5
@@ -72,7 +72,11 @@ import (
|
||||
mcpwebfetch "github.com/memohai/memoh/internal/mcp/providers/webfetch"
|
||||
mcpfederation "github.com/memohai/memoh/internal/mcp/sources/federation"
|
||||
"github.com/memohai/memoh/internal/media"
|
||||
memprovider "github.com/memohai/memoh/internal/memory/provider"
|
||||
memprovider "github.com/memohai/memoh/internal/memory/adapters"
|
||||
membuiltin "github.com/memohai/memoh/internal/memory/adapters/builtin"
|
||||
memmem0 "github.com/memohai/memoh/internal/memory/adapters/mem0"
|
||||
memopenviking "github.com/memohai/memoh/internal/memory/adapters/openviking"
|
||||
storefs "github.com/memohai/memoh/internal/memory/storefs"
|
||||
"github.com/memohai/memoh/internal/message"
|
||||
"github.com/memohai/memoh/internal/message/event"
|
||||
"github.com/memohai/memoh/internal/models"
|
||||
@@ -253,17 +257,29 @@ func provideMemoryLLM(modelsService *models.Service, queries *dbsqlc.Queries, lo
|
||||
return &lazyLLMClient{modelsService: modelsService, queries: queries, timeout: 30 * time.Second, logger: log}
|
||||
}
|
||||
|
||||
func provideMemoryProviderRegistry(log *slog.Logger, chatService *conversation.Service, accountService *accounts.Service, manager *mcp.Manager) *memprovider.Registry {
|
||||
func provideMemoryProviderRegistry(log *slog.Logger, chatService *conversation.Service, accountService *accounts.Service, manager *mcp.Manager, queries *dbsqlc.Queries, cfg config.Config) *memprovider.Registry {
|
||||
registry := memprovider.NewRegistry(log)
|
||||
builtinRuntime := handlers.NewBuiltinMemoryRuntime(manager)
|
||||
registry.RegisterFactory(memprovider.BuiltinType, func(_ string, _ map[string]any) (memprovider.Provider, error) {
|
||||
return memprovider.NewBuiltinProvider(log, builtinRuntime, chatService, accountService), nil
|
||||
fileStore := storefs.New(log, manager)
|
||||
registry.RegisterFactory(string(memprovider.ProviderBuiltin), func(_ string, providerConfig map[string]any) (memprovider.Provider, error) {
|
||||
runtime, err := membuiltin.NewBuiltinRuntimeFromConfig(log, providerConfig, builtinRuntime, fileStore, queries, cfg)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return membuiltin.NewBuiltinProvider(log, runtime, chatService, accountService), nil
|
||||
})
|
||||
registry.Register("__builtin_default__", memprovider.NewBuiltinProvider(log, builtinRuntime, chatService, accountService))
|
||||
registry.RegisterFactory(string(memprovider.ProviderMem0), func(_ string, config map[string]any) (memprovider.Provider, error) {
|
||||
return memmem0.NewMem0Provider(log, config, fileStore)
|
||||
})
|
||||
registry.RegisterFactory(string(memprovider.ProviderOpenViking), func(_ string, config map[string]any) (memprovider.Provider, error) {
|
||||
return memopenviking.NewOpenVikingProvider(log, config)
|
||||
})
|
||||
registry.Register("__builtin_default__", membuiltin.NewBuiltinProvider(log, builtinRuntime, chatService, accountService))
|
||||
return registry
|
||||
}
|
||||
|
||||
func startMemoryProviderBootstrap(lc fx.Lifecycle, log *slog.Logger, mpService *memprovider.Service, registry *memprovider.Registry) {
|
||||
mpService.SetRegistry(registry)
|
||||
lc.Append(fx.Hook{
|
||||
OnStart: func(ctx context.Context) error {
|
||||
resp, err := mpService.EnsureDefault(ctx)
|
||||
|
||||
Reference in New Issue
Block a user