Files
AIclinicalresearch/backend/src/scripts/test-dify-client.ts
AI Clinical Dev Team 8a4c703128 feat: complete Dify client implementation (Day 19)
## Dify 瀹㈡埛绔皝瑁呭畬鎴?鉁?
### 瀹屾垚鐨勫伐浣?
1. 绫诲瀷瀹氫箟 (backend/src/clients/types.ts)
   - Dataset, Document, Retrieval 鐩稿叧绫诲瀷
   - 瀹屾暣鐨?TypeScript 绫诲瀷瀹氫箟
   - 鑷畾涔?DifyError 閿欒绫?
2. DifyClient 鏍稿績绫?(backend/src/clients/DifyClient.ts)
   - 鐭ヨ瘑搴撶鐞? createDataset, getDatasets, getDataset, deleteDataset
   - 鏂囨。绠$悊: uploadDocumentDirectly, getDocuments, getDocument, deleteDocument
   - 鐭ヨ瘑搴撴绱? retrieveKnowledge (鏀寔璇箟鎼滅储銆乼op_k銆佺浉浼煎害闃堝€?
   - 杈呭姪鏂规硶: waitForDocumentProcessing, uploadAndProcessDocument

3. 娴嬭瘯鑴氭湰 (backend/src/scripts/test-dify-client.ts)
   - 8椤瑰畬鏁存祴璇曞叏閮ㄩ€氳繃
   - 娴嬭瘯鑰楁椂绾?5绉?   - 楠岃瘉鎵€鏈堿PI鍔熻兘姝e父

### 娴嬭瘯缁撴灉

鉁?娴嬭瘯1: 鍒涘缓鐭ヨ瘑搴?鉁?娴嬭瘯2: 鑾峰彇鐭ヨ瘑搴撳垪琛?(鎵惧埌3涓?
鉁?娴嬭瘯3: 鑾峰彇鐭ヨ瘑搴撹鎯?鉁?娴嬭瘯4: 涓婁紶鏂囨。 (247 tokens)
鉁?娴嬭瘯5: 鑾峰彇鏂囨。鍒楄〃
鉁?娴嬭瘯6: 鐭ヨ瘑搴撴绱?(鐩镐技搴?.4420)
鉁?娴嬭瘯7: 鍒犻櫎鏂囨。
鉁?娴嬭瘯8: 鍒犻櫎鐭ヨ瘑搴?
### 鎶€鏈寒鐐?
- 瀹屽杽鐨勯敊璇鐞嗘満鍒?(axios 鎷︽埅鍣?
- 鏅鸿兘杞绛夊緟鏂囨。澶勭悊瀹屾垚
- FormData 鏂囦欢涓婁紶鏀寔
- 鍗曚緥妯″紡瀵煎嚭
- 鏀寔鑷畾涔夐厤缃?
### 渚濊禆鏇存柊

- form-data: ^4.0.0
- @types/form-data: ^2.5.0

### 閰嶇疆鏇存柊

- DIFY_API_KEY 鏇存柊涓烘湇鍔PI瀵嗛挜
- DIFY_API_URL=http://localhost/v1

### 鏂囨。鏇存柊

- 鏂板: docs/05-姣忔棩杩涘害/Day19-Dify瀹㈡埛绔皝瑁呭畬鎴?md
- 鏇存柊: docs/04-寮€鍙戣鍒?寮€鍙戦噷绋嬬.md (Day 19 鏍囪涓哄畬鎴?

### 涓嬩竴姝?
Day 20-22: 鐭ヨ瘑搴撶鐞嗗姛鑳?- 鏁版嵁搴撹〃璁捐 (KnowledgeBase, Document)
- 鍚庣 CRUD API
- 鍓嶇鐭ヨ瘑搴撶鐞嗛〉闈?- 鏂囨。涓婁紶缁勪欢

---
Progress: 閲岀▼纰?1 (MVP) 90% -> 鐭ヨ瘑搴撶鐞嗗紑鍙戜腑
2025-10-11 10:25:30 +08:00

262 lines
7.4 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.
/**
* Dify客户端测试脚本
*
* 用于测试Dify API的连接和基本功能
*/
import { DifyClient } from '../clients/DifyClient.js';
// 创建客户端实例
const client = new DifyClient();
// 测试知识库ID测试时会创建
let testDatasetId: string;
let testDocumentId: string;
/**
* 测试1创建知识库
*/
async function testCreateDataset() {
console.log('\n========== 测试1创建知识库 ==========');
try {
const result = await client.createDataset({
name: '测试知识库 - ' + Date.now(),
description: '这是一个测试知识库用于验证API功能',
indexing_technique: 'high_quality',
});
testDatasetId = result.id;
console.log('✅ 创建成功');
console.log('知识库ID:', result.id);
console.log('知识库名称:', result.name);
console.log('创建时间:', new Date(result.created_at * 1000).toLocaleString());
} catch (error: any) {
console.error('❌ 创建失败:', error.message);
throw error;
}
}
/**
* 测试2获取知识库列表
*/
async function testGetDatasets() {
console.log('\n========== 测试2获取知识库列表 ==========');
try {
const result = await client.getDatasets(1, 10);
console.log('✅ 获取成功');
console.log(`找到 ${result.total} 个知识库`);
if (result.data.length > 0) {
console.log('前3个知识库:');
result.data.slice(0, 3).forEach((dataset, index) => {
console.log(` ${index + 1}. ${dataset.name} (ID: ${dataset.id})`);
console.log(` - 文档数量: ${dataset.document_count}`);
console.log(` - 创建时间: ${new Date(dataset.created_at * 1000).toLocaleString()}`);
});
}
} catch (error: any) {
console.error('❌ 获取失败:', error.message);
throw error;
}
}
/**
* 测试3获取知识库详情
*/
async function testGetDataset() {
console.log('\n========== 测试3获取知识库详情 ==========');
try {
const result = await client.getDataset(testDatasetId);
console.log('✅ 获取成功');
console.log('知识库名称:', result.name);
console.log('描述:', result.description);
console.log('文档数量:', result.document_count);
console.log('索引技术:', result.indexing_technique);
} catch (error: any) {
console.error('❌ 获取失败:', error.message);
throw error;
}
}
/**
* 测试4上传文件并创建文档
*/
async function testUploadDocument() {
console.log('\n========== 测试4上传文档 ==========');
try {
// 创建一个测试文本文件
const testContent = `
# 临床研究测试文档
## 研究背景
这是一个用于测试Dify API的示例文档。
## 研究目标
验证以下功能:
1. 文件上传功能
2. 文档索引功能
3. 知识库检索功能
## 研究方法
使用自动化测试脚本验证API的各项功能。
## 预期结果
所有测试应该通过,并返回正确的数据。
`.trim();
const testBuffer = Buffer.from(testContent, 'utf-8');
const filename = 'test-document.txt';
console.log('正在上传文档...');
const document = await client.uploadAndProcessDocument(
testDatasetId,
testBuffer,
filename
);
testDocumentId = document.id;
console.log('✅ 上传成功');
console.log('文档ID:', document.id);
console.log('文档名称:', document.name);
console.log('处理状态:', document.indexing_status);
console.log('字符数:', document.word_count);
console.log('Token数:', document.tokens);
} catch (error: any) {
console.error('❌ 上传失败:', error.message);
throw error;
}
}
/**
* 测试5获取文档列表
*/
async function testGetDocuments() {
console.log('\n========== 测试5获取文档列表 ==========');
try {
const result = await client.getDocuments(testDatasetId, 1, 10);
console.log('✅ 获取成功');
console.log(`找到 ${result.total} 个文档`);
if (result.data.length > 0) {
console.log('文档列表:');
result.data.forEach((doc, index) => {
console.log(` ${index + 1}. ${doc.name}`);
console.log(` - 状态: ${doc.indexing_status}`);
console.log(` - 字符数: ${doc.word_count}`);
console.log(` - Token数: ${doc.tokens}`);
});
}
} catch (error: any) {
console.error('❌ 获取失败:', error.message);
throw error;
}
}
/**
* 测试6知识库检索
*/
async function testRetrieveKnowledge() {
console.log('\n========== 测试6知识库检索 ==========');
try {
const result = await client.retrieveKnowledge(
testDatasetId,
'研究目标是什么?',
{
retrieval_model: {
search_method: 'semantic_search',
top_k: 3,
},
}
);
console.log('✅ 检索成功');
console.log('查询:', result.query.content);
console.log(`找到 ${result.records.length} 条结果`);
result.records.forEach((record, index) => {
console.log(`\n结果 ${index + 1}:`);
console.log(` 文档: ${record.document_name}`);
console.log(` 相似度得分: ${record.score.toFixed(4)}`);
console.log(` 内容片段: ${record.content.substring(0, 100)}...`);
});
} catch (error: any) {
console.error('❌ 检索失败:', error.message);
// 不抛出错误,因为可能是文档还未完全索引
}
}
/**
* 测试7删除文档
*/
async function testDeleteDocument() {
console.log('\n========== 测试7删除文档 ==========');
try {
await client.deleteDocument(testDatasetId, testDocumentId);
console.log('✅ 删除文档成功');
} catch (error: any) {
console.error('❌ 删除文档失败:', error.message);
// 不抛出错误,继续后续测试
}
}
/**
* 测试8删除知识库
*/
async function testDeleteDataset() {
console.log('\n========== 测试8删除知识库 ==========');
try {
await client.deleteDataset(testDatasetId);
console.log('✅ 删除知识库成功');
} catch (error: any) {
console.error('❌ 删除知识库失败:', error.message);
throw error;
}
}
/**
* 运行所有测试
*/
async function runAllTests() {
console.log('========================================');
console.log(' Dify API 客户端测试');
console.log('========================================');
console.log('开始时间:', new Date().toLocaleString());
try {
await testCreateDataset();
await testGetDatasets();
await testGetDataset();
await testUploadDocument();
await testGetDocuments();
// 等待5秒让文档完全索引
console.log('\n等待5秒让文档完全索引...');
await new Promise((resolve) => setTimeout(resolve, 5000));
await testRetrieveKnowledge();
await testDeleteDocument();
await testDeleteDataset();
console.log('\n========================================');
console.log('✅ 所有测试通过!');
console.log('========================================');
console.log('结束时间:', new Date().toLocaleString());
} catch (error: any) {
console.log('\n========================================');
console.log('❌ 测试失败!');
console.log('========================================');
console.error('错误信息:', error.message);
if (error.code) {
console.error('错误代码:', error.code);
}
if (error.status) {
console.error('HTTP状态码:', error.status);
}
process.exit(1);
}
}
// 执行测试
runAllTests();