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:
晨苒
2026-03-14 06:04:13 +08:00
committed by GitHub
parent 27607d582d
commit 627b673a5c
75 changed files with 8253 additions and 2107 deletions
+330 -193
View File
@@ -76,6 +76,245 @@ definitions:
display_name:
type: string
type: object
adapters.CDFPoint:
properties:
cumulative:
description: cumulative weight fraction [0.0, 1.0]
type: number
k:
description: rank position (1-based, sorted by value desc)
type: integer
type: object
adapters.CompactResult:
properties:
after_count:
type: integer
before_count:
type: integer
ratio:
type: number
results:
items:
$ref: '#/definitions/adapters.MemoryItem'
type: array
type: object
adapters.DeleteResponse:
properties:
message:
type: string
type: object
adapters.HealthStatus:
properties:
error:
type: string
ok:
type: boolean
type: object
adapters.MemoryItem:
properties:
agent_id:
type: string
bot_id:
type: string
cdf_curve:
items:
$ref: '#/definitions/adapters.CDFPoint'
type: array
created_at:
type: string
hash:
type: string
id:
type: string
memory:
type: string
metadata:
additionalProperties: {}
type: object
run_id:
type: string
score:
type: number
top_k_buckets:
items:
$ref: '#/definitions/adapters.TopKBucket'
type: array
updated_at:
type: string
type: object
adapters.MemoryStatusResponse:
properties:
can_manual_sync:
type: boolean
encoder:
$ref: '#/definitions/adapters.HealthStatus'
indexed_count:
type: integer
markdown_file_count:
type: integer
memory_mode:
type: string
overview_path:
type: string
provider_type:
type: string
qdrant:
$ref: '#/definitions/adapters.HealthStatus'
qdrant_collection:
type: string
source_count:
type: integer
source_dir:
type: string
type: object
adapters.Message:
properties:
content:
type: string
role:
type: string
type: object
adapters.ProviderCollectionStatus:
properties:
exists:
type: boolean
name:
type: string
points:
type: integer
qdrant:
$ref: '#/definitions/adapters.HealthStatus'
type: object
adapters.ProviderConfigSchema:
properties:
fields:
additionalProperties:
$ref: '#/definitions/adapters.ProviderFieldSchema'
type: object
type: object
adapters.ProviderCreateRequest:
properties:
config:
additionalProperties: {}
type: object
name:
type: string
provider:
$ref: '#/definitions/adapters.ProviderType'
type: object
adapters.ProviderFieldSchema:
properties:
description:
type: string
example: {}
required:
type: boolean
secret:
type: boolean
title:
type: string
type:
type: string
type: object
adapters.ProviderGetResponse:
properties:
config:
additionalProperties: {}
type: object
created_at:
type: string
id:
type: string
is_default:
type: boolean
name:
type: string
provider:
type: string
updated_at:
type: string
type: object
adapters.ProviderMeta:
properties:
config_schema:
$ref: '#/definitions/adapters.ProviderConfigSchema'
display_name:
type: string
provider:
type: string
type: object
adapters.ProviderStatusResponse:
properties:
collections:
items:
$ref: '#/definitions/adapters.ProviderCollectionStatus'
type: array
embedding_model_id:
type: string
memory_mode:
type: string
provider_type:
type: string
type: object
adapters.ProviderType:
enum:
- builtin
- mem0
- openviking
type: string
x-enum-varnames:
- ProviderBuiltin
- ProviderMem0
- ProviderOpenViking
adapters.ProviderUpdateRequest:
properties:
config:
additionalProperties: {}
type: object
name:
type: string
type: object
adapters.RebuildResult:
properties:
fs_count:
type: integer
missing_count:
type: integer
restored_count:
type: integer
storage_count:
type: integer
type: object
adapters.SearchResponse:
properties:
relations:
items: {}
type: array
results:
items:
$ref: '#/definitions/adapters.MemoryItem'
type: array
type: object
adapters.TopKBucket:
properties:
index:
description: sparse dimension index (term hash)
type: integer
value:
description: weight (term frequency)
type: number
type: object
adapters.UsageResponse:
properties:
avg_text_bytes:
type: integer
count:
type: integer
estimated_storage_bytes:
type: integer
total_text_bytes:
type: integer
type: object
bots.Bot:
properties:
allow_guest:
@@ -1175,7 +1414,7 @@ definitions:
type: string
messages:
items:
$ref: '#/definitions/provider.Message'
$ref: '#/definitions/adapters.Message'
type: array
metadata:
additionalProperties: {}
@@ -1655,183 +1894,6 @@ definitions:
type:
$ref: '#/definitions/models.ModelType'
type: object
provider.CDFPoint:
properties:
cumulative:
description: cumulative weight fraction [0.0, 1.0]
type: number
k:
description: rank position (1-based, sorted by value desc)
type: integer
type: object
provider.CompactResult:
properties:
after_count:
type: integer
before_count:
type: integer
ratio:
type: number
results:
items:
$ref: '#/definitions/provider.MemoryItem'
type: array
type: object
provider.DeleteResponse:
properties:
message:
type: string
type: object
provider.MemoryItem:
properties:
agent_id:
type: string
bot_id:
type: string
cdf_curve:
items:
$ref: '#/definitions/provider.CDFPoint'
type: array
created_at:
type: string
hash:
type: string
id:
type: string
memory:
type: string
metadata:
additionalProperties: {}
type: object
run_id:
type: string
score:
type: number
top_k_buckets:
items:
$ref: '#/definitions/provider.TopKBucket'
type: array
updated_at:
type: string
type: object
provider.Message:
properties:
content:
type: string
role:
type: string
type: object
provider.ProviderConfigSchema:
properties:
fields:
additionalProperties:
$ref: '#/definitions/provider.ProviderFieldSchema'
type: object
type: object
provider.ProviderCreateRequest:
properties:
config:
additionalProperties: {}
type: object
name:
type: string
provider:
$ref: '#/definitions/provider.ProviderType'
type: object
provider.ProviderFieldSchema:
properties:
description:
type: string
example: {}
required:
type: boolean
title:
type: string
type:
type: string
type: object
provider.ProviderGetResponse:
properties:
config:
additionalProperties: {}
type: object
created_at:
type: string
id:
type: string
is_default:
type: boolean
name:
type: string
provider:
type: string
updated_at:
type: string
type: object
provider.ProviderMeta:
properties:
config_schema:
$ref: '#/definitions/provider.ProviderConfigSchema'
display_name:
type: string
provider:
type: string
type: object
provider.ProviderType:
enum:
- builtin
type: string
x-enum-varnames:
- ProviderBuiltin
provider.ProviderUpdateRequest:
properties:
config:
additionalProperties: {}
type: object
name:
type: string
type: object
provider.RebuildResult:
properties:
fs_count:
type: integer
missing_count:
type: integer
qdrant_count:
type: integer
restored_count:
type: integer
type: object
provider.SearchResponse:
properties:
relations:
items: {}
type: array
results:
items:
$ref: '#/definitions/provider.MemoryItem'
type: array
type: object
provider.TopKBucket:
properties:
index:
description: sparse dimension index (term hash)
type: integer
value:
description: weight (term frequency)
type: number
type: object
provider.UsageResponse:
properties:
avg_text_bytes:
type: integer
count:
type: integer
estimated_storage_bytes:
type: integer
total_text_bytes:
type: integer
type: object
providers.CountResponse:
properties:
count:
@@ -4307,7 +4369,7 @@ paths:
"200":
description: OK
schema:
$ref: '#/definitions/provider.DeleteResponse'
$ref: '#/definitions/adapters.DeleteResponse'
"400":
description: Bad Request
schema:
@@ -4345,7 +4407,7 @@ paths:
"200":
description: OK
schema:
$ref: '#/definitions/provider.SearchResponse'
$ref: '#/definitions/adapters.SearchResponse'
"400":
description: Bad Request
schema:
@@ -4387,7 +4449,7 @@ paths:
"200":
description: OK
schema:
$ref: '#/definitions/provider.SearchResponse'
$ref: '#/definitions/adapters.SearchResponse'
"400":
description: Bad Request
schema:
@@ -4427,7 +4489,7 @@ paths:
"200":
description: OK
schema:
$ref: '#/definitions/provider.DeleteResponse'
$ref: '#/definitions/adapters.DeleteResponse'
"400":
description: Bad Request
schema:
@@ -4478,7 +4540,7 @@ paths:
"200":
description: OK
schema:
$ref: '#/definitions/provider.CompactResult'
$ref: '#/definitions/adapters.CompactResult'
"400":
description: Bad Request
schema:
@@ -4514,7 +4576,7 @@ paths:
"200":
description: OK
schema:
$ref: '#/definitions/provider.RebuildResult'
$ref: '#/definitions/adapters.RebuildResult'
"400":
description: Bad Request
schema:
@@ -4523,6 +4585,10 @@ paths:
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"409":
description: Conflict
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
@@ -4557,7 +4623,7 @@ paths:
"200":
description: OK
schema:
$ref: '#/definitions/provider.SearchResponse'
$ref: '#/definitions/adapters.SearchResponse'
"400":
description: Bad Request
schema:
@@ -4581,6 +4647,46 @@ paths:
summary: Search memory
tags:
- memory
/bots/{bot_id}/memory/status:
get:
description: Get the resolved memory runtime status for a bot, including index
health and source counts
parameters:
- description: Bot ID
in: path
name: bot_id
required: true
type: string
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/adapters.MemoryStatusResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"403":
description: Forbidden
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"409":
description: Conflict
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"503":
description: Service Unavailable
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Get memory runtime status
tags:
- memory
/bots/{bot_id}/memory/usage:
get:
description: Query the estimated storage usage of current memories
@@ -4596,7 +4702,7 @@ paths:
"200":
description: OK
schema:
$ref: '#/definitions/provider.UsageResponse'
$ref: '#/definitions/adapters.UsageResponse'
"400":
description: Bad Request
schema:
@@ -6396,7 +6502,7 @@ paths:
description: OK
schema:
items:
$ref: '#/definitions/provider.ProviderGetResponse'
$ref: '#/definitions/adapters.ProviderGetResponse'
type: array
"500":
description: Internal Server Error
@@ -6415,14 +6521,14 @@ paths:
name: request
required: true
schema:
$ref: '#/definitions/provider.ProviderCreateRequest'
$ref: '#/definitions/adapters.ProviderCreateRequest'
produces:
- application/json
responses:
"201":
description: Created
schema:
$ref: '#/definitions/provider.ProviderGetResponse'
$ref: '#/definitions/adapters.ProviderGetResponse'
"400":
description: Bad Request
schema:
@@ -6471,7 +6577,7 @@ paths:
"200":
description: OK
schema:
$ref: '#/definitions/provider.ProviderGetResponse'
$ref: '#/definitions/adapters.ProviderGetResponse'
"400":
description: Bad Request
schema:
@@ -6498,14 +6604,14 @@ paths:
name: request
required: true
schema:
$ref: '#/definitions/provider.ProviderUpdateRequest'
$ref: '#/definitions/adapters.ProviderUpdateRequest'
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/provider.ProviderGetResponse'
$ref: '#/definitions/adapters.ProviderGetResponse'
"400":
description: Bad Request
schema:
@@ -6517,6 +6623,37 @@ paths:
summary: Update a memory provider
tags:
- memory-providers
/memory-providers/{id}/status:
get:
description: Get runtime status data for a memory provider
parameters:
- description: Provider ID
in: path
name: id
required: true
type: string
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/adapters.ProviderStatusResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/handlers.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/handlers.ErrorResponse'
summary: Get memory provider status
tags:
- memory-providers
/memory-providers/meta:
get:
description: List available memory provider types and config schemas
@@ -6525,7 +6662,7 @@ paths:
description: OK
schema:
items:
$ref: '#/definitions/provider.ProviderMeta'
$ref: '#/definitions/adapters.ProviderMeta'
type: array
summary: List memory provider metadata
tags: