feat: align agent preview user context

This commit is contained in:
2026-07-31 15:48:40 +08:00
parent 3e60a6da42
commit 79094d0832
6 changed files with 168 additions and 3 deletions

View File

@@ -111,6 +111,7 @@ class AgentDebugHistoryMessage(BaseModel):
class AgentDebugRequest(BaseModel):
promptContent: str = Field(min_length=1)
modelId: int = Field(gt=0)
userId: int | None = Field(default=None, gt=0)
knowledgeIds: list[int] = Field(default_factory=list)
knowledgeVersions: dict[int, int] = Field(default_factory=dict)
question: str = Field(min_length=1, max_length=2000)

View File

@@ -6,14 +6,18 @@ from types import SimpleNamespace
from sqlalchemy.orm import Session
from app.models.user import User
from app.models.admin import Admin
from app.models.ai_config import ModelConfig
from app.schemas.admin import AgentDebugRequest
from app.services.admin_service import OperationLogService
from app.services.entitlement_service import EntitlementService, entitlement_dict
from app.services.growth_profile_service import GrowthProfileService
from app.services.knowledge_agent_service import KnowledgeAgentService
from app.services.model_stream_service import ModelStreamService
from app.services.reasoning_policy_service import ReasoningPolicyService
from app.services.rag_service import RagResult
from app.services.topic_session_service import TopicSessionService
class AgentDebugService:
@@ -25,14 +29,18 @@ class AgentDebugService:
]
preview_knowledge_ids = payload.knowledgeIds or None
version_overrides = payload.knowledgeVersions or None
debug_context = AgentDebugService._debug_user_context(db, payload.userId)
rag_result = await KnowledgeAgentService.build_result(
db,
question=payload.question,
history=history,
version_overrides=version_overrides,
preview_knowledge_ids=preview_knowledge_ids,
user_id=payload.userId,
context_trace=debug_context["trace"],
prompt_override=payload.promptContent,
response_depth=payload.responseDepth,
growth_context=debug_context["growth_context"],
)
return RagResult(
question=rag_result.question,
@@ -45,6 +53,51 @@ class AgentDebugService:
messages=rag_result.messages,
)
@staticmethod
def _debug_user_context(db: Session, user_id: int | None) -> dict:
if user_id is None:
return {"growth_context": None, "trace": []}
user = db.get(User, user_id)
if user is None or user.is_deleted:
return {
"growth_context": None,
"trace": [
{
"tool": "load_debug_user_context",
"order": 1,
"request": {"userId": user_id},
"status": "failed",
"durationMs": 0,
"response": None,
"error": "模拟学员不存在或已删除",
}
],
}
entitlement = EntitlementService.active_entitlement(
db,
user,
monthly_topic_used=TopicSessionService.monthly_used_count(db, user.id),
)
growth_context = GrowthProfileService.prompt_context(db, user) if entitlement.enable_growth_profile else None
return {
"growth_context": growth_context,
"trace": [
{
"tool": "load_debug_user_context",
"order": 1,
"request": {"userId": user.id},
"status": "success",
"durationMs": 0,
"response": {
"userId": user.id,
"userName": user.name,
"entitlement": entitlement_dict(entitlement),
"growthProfileUsed": bool(growth_context),
},
}
],
}
@staticmethod
def overrides(payload: AgentDebugRequest) -> dict:
return {

View File

@@ -0,0 +1,57 @@
from __future__ import annotations
import asyncio
from sqlalchemy import create_engine
from sqlalchemy.orm import Session
from sqlalchemy.pool import StaticPool
from app.models import Base
from app.models.entitlement import EntitlementPlan
from app.models.growth import UserGrowthProfile
from app.models.user import User
from app.schemas.admin import AgentDebugRequest
from app.services.agent_debug_service import AgentDebugService
def _db() -> Session:
engine = create_engine("sqlite:///:memory:", connect_args={"check_same_thread": False}, poolclass=StaticPool)
Base.metadata.create_all(engine)
return Session(engine)
def test_agent_debug_can_simulate_user_growth_profile_context():
with _db() as db:
user = User(id=1, phone="13800000001", name="测试学员", daily_chat_limit=100, daily_chat_used=0)
db.add(user)
db.add(
EntitlementPlan(
id=10,
name="深度陪伴版",
plan_type="deep",
monthly_topic_limit=90,
enable_growth_profile=1,
status=1,
)
)
db.add(UserGrowthProfile(user_id=1, profile_text="用户在表达障碍主题上反复出现身体紧绷。"))
db.commit()
result = asyncio.run(
AgentDebugService.build_result(
db,
AgentDebugRequest(
promptContent="你是测试 Agent",
modelId=1,
userId=1,
question="我又表达不出来了怎么办",
),
)
)
rendered = "\n".join(item["content"] for item in result.messages)
assert "[长期成长档案]" in rendered
assert "表达障碍" in rendered
assert result.tool_trace[0]["tool"] == "load_debug_user_context"
assert result.tool_trace[0]["response"]["growthProfileUsed"] is True