merge: integrate ZSY customer service and profile capabilities

This commit is contained in:
张胜宇
2026-09-11 22:31:51 +08:00
94 changed files with 7933 additions and 77 deletions
@@ -12,6 +12,7 @@ from app.core.contracts import (
)
from app.core.errors import ForbiddenAgentError, RecoverableAgentError
from app.service.agent.base import BaseAgent
from app.service.agent.customer_service_agent import CustomerServiceAgent
from app.service.agent.factory import AgentFactory
from app.service.agent.governance import review_output
@@ -23,6 +24,59 @@ def test_all_governance_hooks_protected(name):
type("Bypass", (BaseAgent,), {name: lambda *args: None})
@pytest.mark.asyncio
async def test_visitor_does_not_recall_customer_memory() -> None:
"""访客不能以匿名主体标识读取任何客户记忆。"""
class Demo(BaseAgent):
async def handle(self, request, context):
return CoreResult(text="unused")
class FailingGovernance:
async def recall(self, context):
raise AssertionError("visitor memory recall is forbidden")
definition = AgentDefinition(
agent_type="demo", version="1", allowed_roles=("visitor",), allowed_portals=("api",)
)
agent = Demo(definition)
agent.bind_governance(FailingGovernance())
request = AgentRequest(
agent_type="demo", message="公开问题", session_id="visitor-session",
idempotency_key="visitor-memory-request-0001",
)
context = RequestContext(
user_id="visitor-id", trace_id="visitor-trace", roles=("visitor",),
permissions=("agent:run",), data_scope="public",
)
await agent.recall_memory(request, context)
assert agent.memories == ()
@pytest.mark.asyncio
async def test_authenticated_customer_service_does_not_recall_customer_memory() -> None:
"""客服即使面对已登录用户,也不得触发通用长期或画像记忆读取。"""
class FailingGovernance:
async def recall(self, context):
raise AssertionError("customer service memory recall is forbidden")
agent = CustomerServiceAgent()
agent.bind_governance(FailingGovernance())
request = AgentRequest(
agent_type="customer_service", message="查询我的持仓", session_id="customer-session",
idempotency_key="customer-memory-request-0001",
)
context = RequestContext(
user_id="1", trace_id="customer-trace", roles=("customer",),
permissions=("agent:run",), data_scope="self",
)
await agent.recall_memory(request, context)
assert agent.memories == ()
async def test_resolve_recall_handle_review_order_and_snapshot(governance):
calls = []
config = ResolvedAgentConfig(config_version="released", prompt_version="p", model_endpoint="m")