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
+490 -285
View File
@@ -2898,7 +2898,7 @@ const docTemplate = `{
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/provider.SearchResponse"
"$ref": "#/definitions/adapters.SearchResponse"
}
},
"400": {
@@ -2961,7 +2961,7 @@ const docTemplate = `{
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/provider.SearchResponse"
"$ref": "#/definitions/adapters.SearchResponse"
}
},
"400": {
@@ -3023,7 +3023,7 @@ const docTemplate = `{
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/provider.DeleteResponse"
"$ref": "#/definitions/adapters.DeleteResponse"
}
},
"400": {
@@ -3088,7 +3088,7 @@ const docTemplate = `{
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/provider.CompactResult"
"$ref": "#/definitions/adapters.CompactResult"
}
},
"400": {
@@ -3141,7 +3141,7 @@ const docTemplate = `{
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/provider.RebuildResult"
"$ref": "#/definitions/adapters.RebuildResult"
}
},
"400": {
@@ -3156,6 +3156,12 @@ const docTemplate = `{
"$ref": "#/definitions/handlers.ErrorResponse"
}
},
"409": {
"description": "Conflict",
"schema": {
"$ref": "#/definitions/handlers.ErrorResponse"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
@@ -3206,7 +3212,7 @@ const docTemplate = `{
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/provider.SearchResponse"
"$ref": "#/definitions/adapters.SearchResponse"
}
},
"400": {
@@ -3242,6 +3248,65 @@ const docTemplate = `{
}
}
},
"/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",
@@ -3265,7 +3330,7 @@ const docTemplate = `{
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/provider.UsageResponse"
"$ref": "#/definitions/adapters.UsageResponse"
}
},
"400": {
@@ -3325,7 +3390,7 @@ const docTemplate = `{
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/provider.DeleteResponse"
"$ref": "#/definitions/adapters.DeleteResponse"
}
},
"400": {
@@ -6038,7 +6103,7 @@ const docTemplate = `{
"schema": {
"type": "array",
"items": {
"$ref": "#/definitions/provider.ProviderGetResponse"
"$ref": "#/definitions/adapters.ProviderGetResponse"
}
}
},
@@ -6069,7 +6134,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/provider.ProviderCreateRequest"
"$ref": "#/definitions/adapters.ProviderCreateRequest"
}
}
],
@@ -6077,7 +6142,7 @@ const docTemplate = `{
"201": {
"description": "Created",
"schema": {
"$ref": "#/definitions/provider.ProviderGetResponse"
"$ref": "#/definitions/adapters.ProviderGetResponse"
}
},
"400": {
@@ -6108,7 +6173,7 @@ const docTemplate = `{
"schema": {
"type": "array",
"items": {
"$ref": "#/definitions/provider.ProviderMeta"
"$ref": "#/definitions/adapters.ProviderMeta"
}
}
}
@@ -6138,7 +6203,7 @@ const docTemplate = `{
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/provider.ProviderGetResponse"
"$ref": "#/definitions/adapters.ProviderGetResponse"
}
},
"400": {
@@ -6181,7 +6246,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/provider.ProviderUpdateRequest"
"$ref": "#/definitions/adapters.ProviderUpdateRequest"
}
}
],
@@ -6189,7 +6254,7 @@ const docTemplate = `{
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/provider.ProviderGetResponse"
"$ref": "#/definitions/adapters.ProviderGetResponse"
}
},
"400": {
@@ -6240,6 +6305,53 @@ const docTemplate = `{
}
}
},
"/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",
@@ -8547,6 +8659,367 @@ const docTemplate = `{
}
}
},
"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": {
@@ -10203,7 +10676,7 @@ const docTemplate = `{
"messages": {
"type": "array",
"items": {
"$ref": "#/definitions/provider.Message"
"$ref": "#/definitions/adapters.Message"
}
},
"metadata": {
@@ -10930,274 +11403,6 @@ const docTemplate = `{
}
}
},
"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": {
@@ -12032,7 +12237,7 @@ const docTemplate = `{
}
}`
// SwaggerInfo holds exported Swagger Info so clients can modify it.
// SwaggerInfo holds exported Swagger Info so clients can modify it
var SwaggerInfo = &swag.Spec{
Version: "1.0.0",
Host: "",