后端: - 新增 ai_intent_router 意图路由 - 新增 AiEntryDraft 草稿存储 + EF 迁移 - 新增 Prompts 模块化(global/modules/rag/router) - AI Agent handlers 扩展 前端: - 新增 AI 同意门 (ai_consent_gate/provider/details_page) - HealthMetricVisuals 视觉统一 - 设备扫描/管理页面优化 - agent 插图替换 + 趋势指标图标 配置: - DeepSeek 模型改 deepseek-v4-flash - .gitignore 加 artifacts/audit - build.gradle.kts 签名配置调整
70 lines
2.9 KiB
C#
70 lines
2.9 KiB
C#
using Health.Infrastructure.AI;
|
|
|
|
namespace Health.Tests;
|
|
|
|
public sealed class PromptManagerTests
|
|
{
|
|
private readonly PromptManager _prompts = new();
|
|
|
|
[Fact]
|
|
public void RouterPrompt_DistinguishesEntryConsultationAndDraftContinuation()
|
|
{
|
|
var prompt = _prompts.GetIntentRouterPrompt();
|
|
|
|
Assert.Contains("只负责识别意图,不回答用户问题", prompt);
|
|
Assert.Contains("帮我记录血压 116/89", prompt);
|
|
Assert.Contains("血压 116/89 正常吗", prompt);
|
|
Assert.Contains("同时包含 health_entry 和 medical_consultation", prompt);
|
|
Assert.Contains("存在草稿不代表所有后续消息都必须继续草稿", prompt);
|
|
}
|
|
|
|
[Fact]
|
|
public void HealthEntryPrompt_RequiresWholeBatchDraftAndOneConfirmationCard()
|
|
{
|
|
var prompt = _prompts.ComposeForIntents(["health_entry"]);
|
|
|
|
Assert.Contains("113/86、113-86、113—86", prompt);
|
|
Assert.Contains("多指标属于同一录入批次", prompt);
|
|
Assert.Contains("record_health_data_batch", prompt);
|
|
Assert.Contains("每个录入批次只调用一次", prompt);
|
|
Assert.Contains("先根据后端结果追问缺失或错误部分", prompt);
|
|
Assert.Contains("全部补齐后再生成整批确认卡", prompt);
|
|
Assert.Contains("只有后端明确提供的待补充草稿", prompt);
|
|
Assert.DoesNotContain("医学知识库使用规则", prompt);
|
|
}
|
|
|
|
[Fact]
|
|
public void EntryPrompts_DoNotInventRequiredPlanFields()
|
|
{
|
|
var medication = _prompts.ComposeForIntents(["medication_entry"]);
|
|
var exercise = _prompts.ComposeForIntents(["exercise_entry"]);
|
|
|
|
Assert.Contains("药品名称、每次剂量、频率、具体服药时间、开始日期", medication);
|
|
Assert.Contains("不自行新增药品、猜测剂量", medication);
|
|
Assert.Contains("运动项目、每天运动时长、持续天数、开始日期和具体提醒时间", exercise);
|
|
Assert.Contains("当前产品不自动补默认", exercise);
|
|
}
|
|
|
|
[Fact]
|
|
public void RagRules_AreOnlyComposedForMedicalKnowledgeModules()
|
|
{
|
|
var consultation = _prompts.ComposeForIntents(["medical_consultation"]);
|
|
var query = _prompts.ComposeForIntents(["personal_query"]);
|
|
var chat = _prompts.ComposeForIntents(["general_chat"]);
|
|
|
|
Assert.Contains("医学知识库使用规则", consultation);
|
|
Assert.DoesNotContain("医学知识库使用规则", query);
|
|
Assert.DoesNotContain("医学知识库使用规则", chat);
|
|
}
|
|
|
|
[Fact]
|
|
public void MixedIntentPrompt_ComposesBothEntryAndConsultationRules()
|
|
{
|
|
var prompt = _prompts.ComposeForIntents(["health_entry", "medical_consultation"]);
|
|
|
|
Assert.Contains("健康指标录入模块", prompt);
|
|
Assert.Contains("医疗咨询与健康建议模块", prompt);
|
|
Assert.Contains("医学知识库使用规则", prompt);
|
|
}
|
|
}
|