feat(memory): add WritePipeline and MemoryService facade

Introduce a layered pipeline architecture for the memory write flow:
- WritePipeline: orchestrates preprocess → extract → store → cluster → summarize
  with deadlock retry, resource cleanup, and pilot-run support
- MemoryService: facade that delegates to WritePipeline, placeholder methods
  for read/forget/reflect
- BearLogger: structured step-level logging with perf threshold alerts
- Shadow pipeline integration in MemoryAgentService (env-gated pilot run)

Also includes:
- Fix deprecated SQLAlchemy declarative_base import
- Extend Neo4j Entity fulltext index to cover description and aliases
- Migrate Pydantic schemas to v2 (ConfigDict, field_validator)
This commit is contained in:
lanceyq
2026-04-17 19:06:02 +08:00
parent feae2f2e1e
commit 41535c34e6
12 changed files with 1000 additions and 57 deletions

View File

@@ -4,7 +4,7 @@ Order Schema
Defines request and response models for order operations.
"""
from pydantic import BaseModel, Field
from pydantic import BaseModel, ConfigDict, Field
from typing import Any, Optional
@@ -17,8 +17,8 @@ class CreateOrderRequest(BaseModel):
customer_email: Optional[str] = Field(None, description="Customer email")
notes: Optional[str] = Field(None, description="Order notes")
class Config:
json_schema_extra = {
model_config = ConfigDict(
json_schema_extra={
"example": {
"product_id": "PROD-001",
"quantity": 2,
@@ -27,6 +27,7 @@ class CreateOrderRequest(BaseModel):
"notes": "Please deliver before 5pm"
}
}
)
class OrderResponse(BaseModel):
@@ -40,8 +41,8 @@ class OrderResponse(BaseModel):
created_at: Optional[str] = Field(None, description="Creation timestamp")
message: Optional[str] = Field(None, description="Response message")
class Config:
json_schema_extra = {
model_config = ConfigDict(
json_schema_extra={
"example": {
"order_id": "ORD-20231224-001",
"status": "pending",
@@ -52,6 +53,7 @@ class OrderResponse(BaseModel):
"message": "Order created successfully"
}
}
)
class ExternalOrderResponse(BaseModel):

View File

@@ -1,5 +1,5 @@
from dataclasses import field
from pydantic import BaseModel, EmailStr, Field, field_validator, validator, ConfigDict
from pydantic import BaseModel, EmailStr, Field, field_validator, ConfigDict
from typing import Optional, List
import datetime
import uuid
@@ -90,7 +90,8 @@ class User(UserBase):
permissions: Optional[List[str]] = None # 用户权限列表,由 external_source 的 permissions 控制
# 将 datetime 转换为毫秒时间戳
@validator("created_at", pre=True)
@field_validator("created_at", mode="before")
@classmethod
def _created_at_to_ms(cls, v):
if isinstance(v, datetime.datetime):
return int(v.timestamp() * 1000)