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
+489 -284
View File
@@ -2889,7 +2889,7 @@
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/provider.SearchResponse"
"$ref": "#/definitions/adapters.SearchResponse"
}
},
"400": {
@@ -2952,7 +2952,7 @@
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/provider.SearchResponse"
"$ref": "#/definitions/adapters.SearchResponse"
}
},
"400": {
@@ -3014,7 +3014,7 @@
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/provider.DeleteResponse"
"$ref": "#/definitions/adapters.DeleteResponse"
}
},
"400": {
@@ -3079,7 +3079,7 @@
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/provider.CompactResult"
"$ref": "#/definitions/adapters.CompactResult"
}
},
"400": {
@@ -3132,7 +3132,7 @@
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/provider.RebuildResult"
"$ref": "#/definitions/adapters.RebuildResult"
}
},
"400": {
@@ -3147,6 +3147,12 @@
"$ref": "#/definitions/handlers.ErrorResponse"
}
},
"409": {
"description": "Conflict",
"schema": {
"$ref": "#/definitions/handlers.ErrorResponse"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
@@ -3197,7 +3203,7 @@
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/provider.SearchResponse"
"$ref": "#/definitions/adapters.SearchResponse"
}
},
"400": {
@@ -3233,6 +3239,65 @@
}
}
},
"/bots/{bot_id}/memory/status": {
"get": {
"description": "Get the resolved memory runtime status for a bot, including index health and source counts",
"produces": [
"application/json"
],
"tags": [
"memory"
],
"summary": "Get memory runtime status",
"parameters": [
{
"type": "string",
"description": "Bot ID",
"name": "bot_id",
"in": "path",
"required": true
}
],
"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"
}
}
}
}
},
"/bots/{bot_id}/memory/usage": {
"get": {
"description": "Query the estimated storage usage of current memories",
@@ -3256,7 +3321,7 @@
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/provider.UsageResponse"
"$ref": "#/definitions/adapters.UsageResponse"
}
},
"400": {
@@ -3316,7 +3381,7 @@
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/provider.DeleteResponse"
"$ref": "#/definitions/adapters.DeleteResponse"
}
},
"400": {
@@ -6029,7 +6094,7 @@
"schema": {
"type": "array",
"items": {
"$ref": "#/definitions/provider.ProviderGetResponse"
"$ref": "#/definitions/adapters.ProviderGetResponse"
}
}
},
@@ -6060,7 +6125,7 @@
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/provider.ProviderCreateRequest"
"$ref": "#/definitions/adapters.ProviderCreateRequest"
}
}
],
@@ -6068,7 +6133,7 @@
"201": {
"description": "Created",
"schema": {
"$ref": "#/definitions/provider.ProviderGetResponse"
"$ref": "#/definitions/adapters.ProviderGetResponse"
}
},
"400": {
@@ -6099,7 +6164,7 @@
"schema": {
"type": "array",
"items": {
"$ref": "#/definitions/provider.ProviderMeta"
"$ref": "#/definitions/adapters.ProviderMeta"
}
}
}
@@ -6129,7 +6194,7 @@
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/provider.ProviderGetResponse"
"$ref": "#/definitions/adapters.ProviderGetResponse"
}
},
"400": {
@@ -6172,7 +6237,7 @@
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/provider.ProviderUpdateRequest"
"$ref": "#/definitions/adapters.ProviderUpdateRequest"
}
}
],
@@ -6180,7 +6245,7 @@
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/provider.ProviderGetResponse"
"$ref": "#/definitions/adapters.ProviderGetResponse"
}
},
"400": {
@@ -6231,6 +6296,53 @@
}
}
},
"/memory-providers/{id}/status": {
"get": {
"description": "Get runtime status data for a memory provider",
"produces": [
"application/json"
],
"tags": [
"memory-providers"
],
"summary": "Get memory provider status",
"parameters": [
{
"type": "string",
"description": "Provider ID",
"name": "id",
"in": "path",
"required": true
}
],
"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"
}
}
}
}
},
"/models": {
"get": {
"description": "Get a list of all configured models, optionally filtered by type or client type",
@@ -8538,6 +8650,367 @@
}
}
},
"adapters.CDFPoint": {
"type": "object",
"properties": {
"cumulative": {
"description": "cumulative weight fraction [0.0, 1.0]",
"type": "number"
},
"k": {
"description": "rank position (1-based, sorted by value desc)",
"type": "integer"
}
}
},
"adapters.CompactResult": {
"type": "object",
"properties": {
"after_count": {
"type": "integer"
},
"before_count": {
"type": "integer"
},
"ratio": {
"type": "number"
},
"results": {
"type": "array",
"items": {
"$ref": "#/definitions/adapters.MemoryItem"
}
}
}
},
"adapters.DeleteResponse": {
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
},
"adapters.HealthStatus": {
"type": "object",
"properties": {
"error": {
"type": "string"
},
"ok": {
"type": "boolean"
}
}
},
"adapters.MemoryItem": {
"type": "object",
"properties": {
"agent_id": {
"type": "string"
},
"bot_id": {
"type": "string"
},
"cdf_curve": {
"type": "array",
"items": {
"$ref": "#/definitions/adapters.CDFPoint"
}
},
"created_at": {
"type": "string"
},
"hash": {
"type": "string"
},
"id": {
"type": "string"
},
"memory": {
"type": "string"
},
"metadata": {
"type": "object",
"additionalProperties": {}
},
"run_id": {
"type": "string"
},
"score": {
"type": "number"
},
"top_k_buckets": {
"type": "array",
"items": {
"$ref": "#/definitions/adapters.TopKBucket"
}
},
"updated_at": {
"type": "string"
}
}
},
"adapters.MemoryStatusResponse": {
"type": "object",
"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"
}
}
},
"adapters.Message": {
"type": "object",
"properties": {
"content": {
"type": "string"
},
"role": {
"type": "string"
}
}
},
"adapters.ProviderCollectionStatus": {
"type": "object",
"properties": {
"exists": {
"type": "boolean"
},
"name": {
"type": "string"
},
"points": {
"type": "integer"
},
"qdrant": {
"$ref": "#/definitions/adapters.HealthStatus"
}
}
},
"adapters.ProviderConfigSchema": {
"type": "object",
"properties": {
"fields": {
"type": "object",
"additionalProperties": {
"$ref": "#/definitions/adapters.ProviderFieldSchema"
}
}
}
},
"adapters.ProviderCreateRequest": {
"type": "object",
"properties": {
"config": {
"type": "object",
"additionalProperties": {}
},
"name": {
"type": "string"
},
"provider": {
"$ref": "#/definitions/adapters.ProviderType"
}
}
},
"adapters.ProviderFieldSchema": {
"type": "object",
"properties": {
"description": {
"type": "string"
},
"example": {},
"required": {
"type": "boolean"
},
"secret": {
"type": "boolean"
},
"title": {
"type": "string"
},
"type": {
"type": "string"
}
}
},
"adapters.ProviderGetResponse": {
"type": "object",
"properties": {
"config": {
"type": "object",
"additionalProperties": {}
},
"created_at": {
"type": "string"
},
"id": {
"type": "string"
},
"is_default": {
"type": "boolean"
},
"name": {
"type": "string"
},
"provider": {
"type": "string"
},
"updated_at": {
"type": "string"
}
}
},
"adapters.ProviderMeta": {
"type": "object",
"properties": {
"config_schema": {
"$ref": "#/definitions/adapters.ProviderConfigSchema"
},
"display_name": {
"type": "string"
},
"provider": {
"type": "string"
}
}
},
"adapters.ProviderStatusResponse": {
"type": "object",
"properties": {
"collections": {
"type": "array",
"items": {
"$ref": "#/definitions/adapters.ProviderCollectionStatus"
}
},
"embedding_model_id": {
"type": "string"
},
"memory_mode": {
"type": "string"
},
"provider_type": {
"type": "string"
}
}
},
"adapters.ProviderType": {
"type": "string",
"enum": [
"builtin",
"mem0",
"openviking"
],
"x-enum-varnames": [
"ProviderBuiltin",
"ProviderMem0",
"ProviderOpenViking"
]
},
"adapters.ProviderUpdateRequest": {
"type": "object",
"properties": {
"config": {
"type": "object",
"additionalProperties": {}
},
"name": {
"type": "string"
}
}
},
"adapters.RebuildResult": {
"type": "object",
"properties": {
"fs_count": {
"type": "integer"
},
"missing_count": {
"type": "integer"
},
"restored_count": {
"type": "integer"
},
"storage_count": {
"type": "integer"
}
}
},
"adapters.SearchResponse": {
"type": "object",
"properties": {
"relations": {
"type": "array",
"items": {}
},
"results": {
"type": "array",
"items": {
"$ref": "#/definitions/adapters.MemoryItem"
}
}
}
},
"adapters.TopKBucket": {
"type": "object",
"properties": {
"index": {
"description": "sparse dimension index (term hash)",
"type": "integer"
},
"value": {
"description": "weight (term frequency)",
"type": "number"
}
}
},
"adapters.UsageResponse": {
"type": "object",
"properties": {
"avg_text_bytes": {
"type": "integer"
},
"count": {
"type": "integer"
},
"estimated_storage_bytes": {
"type": "integer"
},
"total_text_bytes": {
"type": "integer"
}
}
},
"bots.Bot": {
"type": "object",
"properties": {
@@ -10194,7 +10667,7 @@
"messages": {
"type": "array",
"items": {
"$ref": "#/definitions/provider.Message"
"$ref": "#/definitions/adapters.Message"
}
},
"metadata": {
@@ -10921,274 +11394,6 @@
}
}
},
"provider.CDFPoint": {
"type": "object",
"properties": {
"cumulative": {
"description": "cumulative weight fraction [0.0, 1.0]",
"type": "number"
},
"k": {
"description": "rank position (1-based, sorted by value desc)",
"type": "integer"
}
}
},
"provider.CompactResult": {
"type": "object",
"properties": {
"after_count": {
"type": "integer"
},
"before_count": {
"type": "integer"
},
"ratio": {
"type": "number"
},
"results": {
"type": "array",
"items": {
"$ref": "#/definitions/provider.MemoryItem"
}
}
}
},
"provider.DeleteResponse": {
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
},
"provider.MemoryItem": {
"type": "object",
"properties": {
"agent_id": {
"type": "string"
},
"bot_id": {
"type": "string"
},
"cdf_curve": {
"type": "array",
"items": {
"$ref": "#/definitions/provider.CDFPoint"
}
},
"created_at": {
"type": "string"
},
"hash": {
"type": "string"
},
"id": {
"type": "string"
},
"memory": {
"type": "string"
},
"metadata": {
"type": "object",
"additionalProperties": {}
},
"run_id": {
"type": "string"
},
"score": {
"type": "number"
},
"top_k_buckets": {
"type": "array",
"items": {
"$ref": "#/definitions/provider.TopKBucket"
}
},
"updated_at": {
"type": "string"
}
}
},
"provider.Message": {
"type": "object",
"properties": {
"content": {
"type": "string"
},
"role": {
"type": "string"
}
}
},
"provider.ProviderConfigSchema": {
"type": "object",
"properties": {
"fields": {
"type": "object",
"additionalProperties": {
"$ref": "#/definitions/provider.ProviderFieldSchema"
}
}
}
},
"provider.ProviderCreateRequest": {
"type": "object",
"properties": {
"config": {
"type": "object",
"additionalProperties": {}
},
"name": {
"type": "string"
},
"provider": {
"$ref": "#/definitions/provider.ProviderType"
}
}
},
"provider.ProviderFieldSchema": {
"type": "object",
"properties": {
"description": {
"type": "string"
},
"example": {},
"required": {
"type": "boolean"
},
"title": {
"type": "string"
},
"type": {
"type": "string"
}
}
},
"provider.ProviderGetResponse": {
"type": "object",
"properties": {
"config": {
"type": "object",
"additionalProperties": {}
},
"created_at": {
"type": "string"
},
"id": {
"type": "string"
},
"is_default": {
"type": "boolean"
},
"name": {
"type": "string"
},
"provider": {
"type": "string"
},
"updated_at": {
"type": "string"
}
}
},
"provider.ProviderMeta": {
"type": "object",
"properties": {
"config_schema": {
"$ref": "#/definitions/provider.ProviderConfigSchema"
},
"display_name": {
"type": "string"
},
"provider": {
"type": "string"
}
}
},
"provider.ProviderType": {
"type": "string",
"enum": [
"builtin"
],
"x-enum-varnames": [
"ProviderBuiltin"
]
},
"provider.ProviderUpdateRequest": {
"type": "object",
"properties": {
"config": {
"type": "object",
"additionalProperties": {}
},
"name": {
"type": "string"
}
}
},
"provider.RebuildResult": {
"type": "object",
"properties": {
"fs_count": {
"type": "integer"
},
"missing_count": {
"type": "integer"
},
"qdrant_count": {
"type": "integer"
},
"restored_count": {
"type": "integer"
}
}
},
"provider.SearchResponse": {
"type": "object",
"properties": {
"relations": {
"type": "array",
"items": {}
},
"results": {
"type": "array",
"items": {
"$ref": "#/definitions/provider.MemoryItem"
}
}
}
},
"provider.TopKBucket": {
"type": "object",
"properties": {
"index": {
"description": "sparse dimension index (term hash)",
"type": "integer"
},
"value": {
"description": "weight (term frequency)",
"type": "number"
}
}
},
"provider.UsageResponse": {
"type": "object",
"properties": {
"avg_text_bytes": {
"type": "integer"
},
"count": {
"type": "integer"
},
"estimated_storage_bytes": {
"type": "integer"
},
"total_text_bytes": {
"type": "integer"
}
}
},
"providers.CountResponse": {
"type": "object",
"properties": {