refactor(asl): ASL frontend architecture refactoring with left navigation

- feat: Create ASLLayout component with 7-module left navigation
- feat: Implement Title Screening Settings page with optimized PICOS layout
- feat: Add placeholder pages for Workbench and Results
- fix: Fix nested routing structure for React Router v6
- fix: Resolve Spin component warning in MainLayout
- fix: Add QueryClientProvider to App.tsx
- style: Optimize PICOS form layout (P+I left, C+O+S right)
- style: Align Inclusion/Exclusion criteria side-by-side
- docs: Add architecture refactoring and routing fix reports

Ref: Week 2 Frontend Development
Scope: ASL module MVP - Title Abstract Screening
This commit is contained in:
2025-11-18 21:51:51 +08:00
parent e3e7e028e8
commit 3634933ece
213 changed files with 20054 additions and 442 deletions

View File

@@ -0,0 +1,99 @@
/**
* LLM模型验证脚本
* 用于验证实际接入的是哪个版本的模型
*/
import { LLMFactory } from '../src/common/llm/adapters/LLMFactory.js';
import { logger } from '../src/common/logging/index.js';
const TEST_PROMPT = "请用一句话简单介绍你自己,包括你的模型名称和版本。";
async function verifyModel(modelType: string, expectedModel: string) {
console.log(`\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`);
console.log(`🔍 验证模型: ${modelType}`);
console.log(`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`);
try {
const adapter = LLMFactory.getAdapter(modelType as any);
console.log(`✅ 适配器创建成功`);
console.log(` 模型名称: ${adapter.modelName}`);
console.log(` 期望模型: ${expectedModel}`);
console.log(` 匹配状态: ${adapter.modelName === expectedModel ? '✅ 正确' : '❌ 不匹配'}`);
console.log(`\n🚀 发送测试请求...`);
const startTime = Date.now();
const response = await adapter.chat([
{ role: 'user', content: TEST_PROMPT }
]);
const duration = Date.now() - startTime;
console.log(`\n📊 响应结果:`);
console.log(` 实际返回模型: ${response.model}`);
console.log(` 响应时间: ${duration}ms`);
console.log(` Token使用:`);
console.log(` - 输入: ${response.usage?.promptTokens || 0}`);
console.log(` - 输出: ${response.usage?.completionTokens || 0}`);
console.log(` - 总计: ${response.usage?.totalTokens || 0}`);
console.log(`\n💬 模型回复:`);
console.log(` "${response.content}"`);
// 验证是否匹配
if (response.model === expectedModel) {
console.log(`\n✅ 验证通过!实际调用的就是 ${expectedModel}`);
return true;
} else {
console.log(`\n⚠ 警告!期望 ${expectedModel},实际返回 ${response.model}`);
return false;
}
} catch (error) {
console.error(`\n❌ 验证失败:`, error);
return false;
}
}
async function main() {
console.log('\n🔬 ASL模块LLM模型验证工具');
console.log('=' .repeat(60));
console.log('用途: 验证实际接入的模型版本是否正确\n');
const models = [
{ type: 'deepseek-v3', expected: 'deepseek-chat', description: 'DeepSeek-V3' },
{ type: 'qwen3-72b', expected: 'qwen-max', description: 'Qwen最新最强模型' },
];
const results: { model: string; passed: boolean }[] = [];
for (const model of models) {
const passed = await verifyModel(model.type, model.expected);
results.push({ model: model.description, passed });
// 避免API限流
await new Promise(resolve => setTimeout(resolve, 2000));
}
// 总结
console.log('\n\n' + '='.repeat(60));
console.log('📊 验证总结');
console.log('='.repeat(60));
results.forEach(r => {
console.log(`${r.passed ? '✅' : '❌'} ${r.model}: ${r.passed ? '通过' : '未通过'}`);
});
const allPassed = results.every(r => r.passed);
if (allPassed) {
console.log('\n🎉 所有模型验证通过!');
} else {
console.log('\n⚠ 部分模型验证未通过,请检查配置!');
}
console.log('='.repeat(60) + '\n');
}
main().catch(console.error);