mirror of
https://github.com/memohai/Memoh.git
synced 2026-04-27 07:16:19 +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:
+330
-193
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user