Skip to content

Commit afc2481

Browse files
authored
Merge pull request #1747 from A-Dawn/dev
增加人物画像证据纠错功能,并提高检索表现
2 parents f317bb9 + d66bc6c commit afc2481

7 files changed

Lines changed: 780 additions & 20 deletions

File tree

dashboard/src/components/memory/MemoryProfileManager.tsx

Lines changed: 257 additions & 19 deletions
Large diffs are not rendered by default.

dashboard/src/lib/memory-api.ts

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -762,6 +762,49 @@ export interface MemoryProfileQueryPayload extends Record<string, unknown> {
762762
error?: string
763763
}
764764

765+
export interface MemoryProfileEvidenceItemPayload extends Record<string, unknown> {
766+
evidence_key?: string
767+
evidence_type?: string
768+
hash?: string
769+
content?: string
770+
source?: string
771+
source_type?: string
772+
metadata?: Record<string, unknown>
773+
score?: number | null
774+
confidence?: number | null
775+
correction_mode?: string
776+
deletable?: boolean
777+
not_deletable_reason?: string
778+
}
779+
780+
export interface MemoryProfileEvidencePayload extends Record<string, unknown> {
781+
success: boolean
782+
person_id?: string
783+
person_name?: string
784+
profile_text?: string
785+
auto_profile_text?: string
786+
profile_version?: number
787+
updated_at?: number | null
788+
expires_at?: number | null
789+
profile_source?: string
790+
has_manual_override?: boolean
791+
manual_override_text?: string
792+
evidence?: MemoryProfileEvidenceItemPayload[]
793+
evidence_count?: number
794+
error?: string
795+
}
796+
797+
export interface MemoryProfileEvidenceCorrectPayload extends Record<string, unknown> {
798+
success: boolean
799+
person_id?: string
800+
evidence?: MemoryProfileEvidenceItemPayload
801+
delete_result?: Record<string, unknown>
802+
operation_id?: string
803+
refreshed_profile?: Record<string, unknown>
804+
refreshed_evidence?: MemoryProfileEvidencePayload
805+
error?: string
806+
}
807+
765808
export interface MemoryProfileOverridePayload extends Record<string, unknown> {
766809
success: boolean
767810
override?: Record<string, unknown>
@@ -1059,6 +1102,41 @@ export async function deleteMemoryProfileOverride(personId: string): Promise<Mem
10591102
})
10601103
}
10611104

1105+
export async function getMemoryProfileEvidence(options: {
1106+
personId: string
1107+
limit?: number
1108+
forceRefresh?: boolean
1109+
}): Promise<MemoryProfileEvidencePayload> {
1110+
const params = new URLSearchParams({
1111+
limit: String(options.limit ?? 12),
1112+
force_refresh: options.forceRefresh ? 'true' : 'false',
1113+
})
1114+
return requestJson<MemoryProfileEvidencePayload>(`/profiles/${encodeURIComponent(options.personId)}/evidence?${params.toString()}`)
1115+
}
1116+
1117+
export async function correctMemoryProfileEvidence(payload: {
1118+
person_id: string
1119+
evidence_type: string
1120+
hash: string
1121+
requested_by?: string
1122+
reason?: string
1123+
refresh?: boolean
1124+
limit?: number
1125+
}): Promise<MemoryProfileEvidenceCorrectPayload> {
1126+
return requestJson<MemoryProfileEvidenceCorrectPayload>(`/profiles/${encodeURIComponent(payload.person_id)}/evidence/correct`, {
1127+
method: 'POST',
1128+
headers: { 'Content-Type': 'application/json' },
1129+
body: JSON.stringify({
1130+
evidence_type: payload.evidence_type,
1131+
hash: payload.hash,
1132+
requested_by: payload.requested_by ?? 'knowledge_base',
1133+
reason: payload.reason ?? 'profile_evidence_correction',
1134+
refresh: payload.refresh ?? true,
1135+
limit: payload.limit ?? 12,
1136+
}),
1137+
})
1138+
}
1139+
10621140
export async function getMemoryRecycleBin(limit: number = 50): Promise<MemoryRecycleBinPayload> {
10631141
return requestJson<MemoryRecycleBinPayload>(`/maintenance/recycle-bin?limit=${limit}`)
10641142
}

dashboard/src/routes/resource/__tests__/knowledge-base.test.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,8 @@ vi.mock('@/lib/memory-api', () => ({
8888
getMemoryDeleteOperation: vi.fn(),
8989
getMemoryFeedbackCorrections: vi.fn(),
9090
getMemoryFeedbackCorrection: vi.fn(),
91+
getMemoryProfileEvidence: vi.fn(),
92+
correctMemoryProfileEvidence: vi.fn(),
9193
previewMemoryDelete: vi.fn(),
9294
executeMemoryDelete: vi.fn(),
9395
restoreMemoryDelete: vi.fn(),

pytests/webui/test_memory_routes.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,61 @@ async def fake_profile_admin(*, action: str, **kwargs):
220220
assert response.json()["person_id"] == "resolved-person-id"
221221

222222

223+
def test_webui_memory_profile_evidence_route(client: TestClient, monkeypatch):
224+
async def fake_profile_admin(*, action: str, **kwargs):
225+
assert action == "evidence"
226+
assert kwargs["person_id"] == "person-1"
227+
assert kwargs["limit"] == 7
228+
assert kwargs["force_refresh"] is True
229+
return {
230+
"success": True,
231+
"person_id": "person-1",
232+
"evidence": [{"evidence_type": "person_fact", "hash": "p-1"}],
233+
}
234+
235+
monkeypatch.setattr(memory_router_module.memory_service, "profile_admin", fake_profile_admin)
236+
237+
response = client.get(
238+
"/api/webui/memory/profiles/person-1/evidence",
239+
params={"limit": 7, "force_refresh": True},
240+
)
241+
242+
assert response.status_code == 200
243+
assert response.json()["success"] is True
244+
assert response.json()["evidence"][0]["hash"] == "p-1"
245+
246+
247+
def test_webui_memory_profile_evidence_correct_route(client: TestClient, monkeypatch):
248+
async def fake_profile_admin(*, action: str, **kwargs):
249+
assert action == "correct_evidence"
250+
assert kwargs["person_id"] == "person-1"
251+
assert kwargs["evidence_type"] == "relation"
252+
assert kwargs["hash"] == "rel-1"
253+
assert kwargs["requested_by"] == "tester"
254+
assert kwargs["reason"] == "wrong_relation"
255+
assert kwargs["refresh"] is True
256+
assert kwargs["limit"] == 6
257+
return {"success": True, "operation_id": "delete-1"}
258+
259+
monkeypatch.setattr(memory_router_module.memory_service, "profile_admin", fake_profile_admin)
260+
261+
response = client.post(
262+
"/api/webui/memory/profiles/person-1/evidence/correct",
263+
json={
264+
"evidence_type": "relation",
265+
"hash": "rel-1",
266+
"requested_by": "tester",
267+
"reason": "wrong_relation",
268+
"refresh": True,
269+
"limit": 6,
270+
},
271+
)
272+
273+
assert response.status_code == 200
274+
assert response.json()["success"] is True
275+
assert response.json()["operation_id"] == "delete-1"
276+
277+
223278
def test_webui_memory_profile_query_prefers_explicit_person_id(client: TestClient, monkeypatch):
224279
def fake_resolve_person_id_for_memory(**kwargs):
225280
raise AssertionError(f"不应解析平台账号: {kwargs}")

0 commit comments

Comments
 (0)