Files
AIclinicalresearch/backend/src/modules/iit-manager/test-chatservice-dify.ts
HaHafeng 96290d2f76 feat(aia): Implement Protocol Agent MVP with reusable Agent framework
Sprint 1-3 Completed (Backend + Frontend):

Backend (Sprint 1-2):
- Implement 5-layer Agent framework (Query->Planner->Executor->Tools->Reflection)
- Create agent_schema with 6 tables (agent_definitions, stages, prompts, sessions, traces, reflexion_rules)
- Create protocol_schema with 2 tables (protocol_contexts, protocol_generations)
- Implement Protocol Agent core services (Orchestrator, ContextService, PromptBuilder)
- Integrate LLM service adapter (DeepSeek/Qwen/GPT-5/Claude)
- 6 API endpoints with full authentication
- 10/10 API tests passed

Frontend (Sprint 3):
- Add Protocol Agent entry in AgentHub (indigo theme card)
- Implement ProtocolAgentPage with 3-column layout
- Collapsible sidebar (Gemini style, 48px <-> 280px)
- StatePanel with 5 stage cards (scientific_question, pico, study_design, sample_size, endpoints)
- ChatArea with sync button and action cards integration
- 100% prototype design restoration (608 lines CSS)
- Detailed endpoints structure: baseline, exposure, outcomes, confounders

Features:
- 5-stage dialogue flow for research protocol design
- Conversation-driven interaction with sync-to-protocol button
- Real-time context state management
- One-click protocol generation button (UI ready, backend pending)

Database:
- agent_schema: 6 tables for reusable Agent framework
- protocol_schema: 2 tables for Protocol Agent
- Seed data: 1 agent + 5 stages + 9 prompts + 4 reflexion rules

Code Stats:
- Backend: 13 files, 4338 lines
- Frontend: 14 files, 2071 lines
- Total: 27 files, 6409 lines

Status: MVP core functionality completed, pending frontend-backend integration testing

Next: Sprint 4 - One-click protocol generation + Word export
2026-01-24 17:29:24 +08:00

161 lines
3.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* 测试ChatService的Dify知识库集成
*
* 测试场景:
* 1. 询问研究方案相关问题触发Dify检索
* 2. 询问患者数据触发REDCap查询
* 3. 混合查询(同时涉及文档和数据)
*/
import { ChatService } from './services/ChatService.js';
const chatService = new ChatService();
async function testDifyIntegration() {
console.log('='.repeat(80));
console.log('🧪 测试ChatService的Dify知识库集成');
console.log('='.repeat(80));
console.log('');
const testUserId = 'FengZhiBo';
// 测试1研究方案相关问题应该触发Dify检索
console.log('📝 测试1询问研究的纳入排除标准应触发Dify检索');
console.log('-'.repeat(80));
try {
const answer1 = await chatService.handleMessage(
testUserId,
'这个研究的排除标准是什么?'
);
console.log('✅ AI回答:');
console.log(answer1);
console.log('');
} catch (error: any) {
console.error('❌ 测试1失败:', error.message);
console.log('');
}
// 等待2秒
await new Promise(resolve => setTimeout(resolve, 2000));
// 测试2CRF相关问题应该触发Dify检索
console.log('📝 测试2询问CRF表格内容应触发Dify检索');
console.log('-'.repeat(80));
try {
const answer2 = await chatService.handleMessage(
testUserId,
'CRF表格中有哪些观察指标'
);
console.log('✅ AI回答:');
console.log(answer2);
console.log('');
} catch (error: any) {
console.error('❌ 测试2失败:', error.message);
console.log('');
}
// 等待2秒
await new Promise(resolve => setTimeout(resolve, 2000));
// 测试3患者数据查询应该触发REDCap查询
console.log('📊 测试3询问患者记录应触发REDCap查询');
console.log('-'.repeat(80));
try {
const answer3 = await chatService.handleMessage(
testUserId,
'查询一下ID 7的患者情况'
);
console.log('✅ AI回答:');
console.log(answer3);
console.log('');
} catch (error: any) {
console.error('❌ 测试3失败:', error.message);
console.log('');
}
// 等待2秒
await new Promise(resolve => setTimeout(resolve, 2000));
// 测试4混合查询可能同时触发Dify和REDCap
console.log('🔀 测试4混合查询询问研究目的');
console.log('-'.repeat(80));
try {
const answer4 = await chatService.handleMessage(
testUserId,
'这个研究的主要研究目的是什么?'
);
console.log('✅ AI回答:');
console.log(answer4);
console.log('');
} catch (error: any) {
console.error('❌ 测试4失败:', error.message);
console.log('');
}
// 测试5统计查询REDCap
console.log('📈 测试5统计查询应触发REDCap查询');
console.log('-'.repeat(80));
try {
const answer5 = await chatService.handleMessage(
testUserId,
'目前有多少位患者入组?'
);
console.log('✅ AI回答:');
console.log(answer5);
console.log('');
} catch (error: any) {
console.error('❌ 测试5失败:', error.message);
console.log('');
}
console.log('='.repeat(80));
console.log('✅ 测试完成!');
console.log('='.repeat(80));
console.log('');
console.log('📝 测试总结:');
console.log(' - Dify知识库检索研究方案、CRF');
console.log(' - REDCap数据查询患者记录、统计');
console.log(' - 上下文记忆SessionMemory');
console.log('');
console.log('🚀 下一步:企业微信端到端测试');
}
// 执行测试
testDifyIntegration().catch(error => {
console.error('❌ 测试脚本执行失败:', error);
process.exit(1);
});