Major Changes: - Add StreamingService with OpenAI Compatible format - Upgrade Chat component V2 with Ant Design X integration - Implement AIA module with 12 intelligent agents - Update API routes to unified /api/v1 prefix - Update system documentation Backend (~1300 lines): - common/streaming: OpenAI Compatible adapter - modules/aia: 12 agents, conversation service, streaming integration - Update route versions (RVW, PKB to v1) Frontend (~3500 lines): - modules/aia: AgentHub + ChatWorkspace (100% prototype restoration) - shared/Chat: AIStreamChat, ThinkingBlock, useAIStream Hook - Update API endpoints to v1 Documentation: - AIA module status guide - Universal capabilities catalog - System overview updates - All module documentation sync Tested: Stream response verified, authentication working Status: AIA V2.0 core completed (85%)
31 KiB
AI<EFBFBD>箄<EFBFBD><EFBFBD><EFBFBD>讃璅∪<EFBFBD> - API霈曇恣閫<E681A3><E996AB>
*<EFBFBD><EFBFBD>﹝<EFBFBD><EFBFBD>𧋦嚗? v3.0
*<EFBFBD>𥕦遣<EFBFBD>交<EFBFBD>嚗? 2025-10-29
蝏湔擪<EFBFBD><EFBFBD><EFBFBD> AI<41>箄<EFBFBD><E7AE84><EFBFBD>讃撘<E8AE83><E69298>穃𣪧<E7A983>? <EFBFBD><EFBFBD><EFBFBD>擧凒<EFBFBD>堆<EFBFBD> 2025-11-23
*<EFBFBD>湔鰵霂湔<EFBFBD>嚗? <20>啣<EFBFBD><E595A3>冽<EFBFBD>憭滨<E686AD>API嚗?銝芣瓲敹<E793B2>𦻖<EFBFBD><F0A6BB96><EFBFBD>
<EFBFBD><EFBFBD> <20><>﹝霂湔<E99C82>
<EFBFBD>祆<EFBFBD>獢<EFBFBD><EFBFBD>餈蚊I<EFBFBD>箄<EFBFBD><EFBFBD><EFBFBD>讃璅∪<EFBFBD><EFBFBD><EFBFBD>PI霈曇恣閫<EFBFBD><EFBFBD>嚗<EFBFBD><EFBFBD><EFBFBD>祆𦻖<EFBFBD><EFBFBD><EFBFBD>銋剹<EFBFBD><EFBFBD>窈瘙<EFBFBD><EFBFBD>摨娍聢撘譌<EFBFBD><EFBFBD><EFBFBD>霂臬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>? API<EFBFBD>箇<EFBFBD>靽⊥<EFBFBD>:
- Base URL:
http://localhost:3001(撘<><E69298>𤑳㴓憓? - API<EFBFBD>滨<EFBFBD>:
/api/v1/asl - <EFBFBD>讛悅: HTTP/HTTPS
- <EFBFBD>唳旿<EFBFBD>澆<EFBFBD>: JSON
- 霈方<EFBFBD><EFBFBD>孵<EFBFBD>: JWT Token (瘚贝<E7989A><E8B49D>嗆挾<E59786>舀<EFBFBD>暺䁅恕<E48185>冽<EFBFBD>)
<EFBFBD><EFBFBD> API霈曇恣<E69B87>笔<EFBFBD>
- RESTful霈曇恣: <20>萄儐RESTful API霈曇恣閫<E681A3><E996AB>
- 蝏煺<EFBFBD><EFBFBD>滚<EFBFBD><EFBFBD>澆<EFBFBD>:
{ success: boolean, data?: any, error?: string } - <EFBFBD><EFBFBD>△<EFBFBD>舀<EFBFBD>: <20>𡑒”<F0A19192>亙藁<E4BA99>舀<EFBFBD><E88880><EFBFBD>△<EFBFBD><E296B3>㺭
- <EFBFBD><EFBFBD>𧋦<EFBFBD>批<EFBFBD>: API<50><49>𧋦<EFBFBD>𣇉恣<F0A38789>?(
/api/v1/...) - <EFBFBD>躰秤憭<EFBFBD><EFBFBD>: 蝏煺<E89D8F><E785BA><EFBFBD>TTP<54>嗆<EFBFBD><E59786><EFBFBD><EFBFBD>屸<EFBFBD>霂舀<E99C82><E88880>?6. **璅∪<E79285><E288AA>𤥁楝<F0A4A581>?*:
/api/v1/asl/...<20>祉<EFBFBD>頝舐眏蝛粹𡢿
<EFBFBD>摱 <20>詨<EFBFBD>API<50>亙藁
1. 憿寧𤌍蝞∠<E89D9E> (Projects)
1.1 <20>𥕦遣蝑偦<E89D91>厰★<E58EB0>?
<EFBFBD>亙藁: POST /api/v1/asl/projects
霈方<EFBFBD>: <20><>閬?(瘚贝<E7989A><E8B49D>嗆挾暺䁅恕<E48185>冽<EFBFBD>ID)
霂湔<EFBFBD>: <20>𥕦遣銝<E981A3>銝芣鰵<E88AA3><E9B0B5><EFBFBD><EFBFBD>桃<EFBFBD><E6A183>厰★<E58EB0>?
**霂瑟<E99C82>雿?*:
{
"projectName": "SGLT2<54>穃<EFBFBD><E7A983><EFBFBD>頂蝏毺遞餈?,
"picoCriteria": {
"P": "2<EFBFBD>讠<EFBFBD>撠輻<EFBFBD><EFBFBD>𣂷犖<EFBFBD><EFBFBD><EFBFBD>?,
"I": "SGLT2<54>穃<EFBFBD><E7A983><EFBFBD><EFBFBD>empagliflozin<69><6E>apagliflozin蝑㚁<E89D91>",
"C": "摰㗇<E691B0><E39787><EFBFBD><EFBFBD>撣貉<E692A3><E8B289>滨<EFBFBD><E6BBA8>埈<EFBFBD>",
"O": "敹<><E695B9>蝞∠<E89D9E>撅<EFBFBD>嚗㇈ACE<43><45><EFBFBD>銵唬<E98AB5><E594AC>U<EFBFBD><EFBCB5><EFBFBD>銵<EFBFBD>蝞⊥香鈭∴<E988AD>",
"S": "<22>𤩺㦤撖寧<E69296>霂閖<E99C82> (RCT)"
},
"inclusionCriteria": "<22>望<EFBFBD><E69C9B><EFBFBD>讃嚗朙CT<43>𠉛弦嚗?010撟游<E6929F><E6B8B8>𤏸”",
"exclusionCriteria": "<22><><EFBFBD><EFBFBD>亙<EFBFBD>嚗𣬚遞餈堆<E9A488><E5A086>函<EFBFBD>摰鮋<E691B0>",
"screeningConfig": {
"models": ["deepseek-chat", "qwen-max"],
"temperature": 0
}
}
<EFBFBD>滚<EFBFBD>蝷箔<EFBFBD>:
{
"success": true,
"data": {
"id": "d67f0b9a-b035-4804-aca1-0bd672c27d81",
"userId": "asl-test-user-001",
"projectName": "SGLT2<54>穃<EFBFBD><E7A983><EFBFBD>頂蝏毺遞餈?,
"picoCriteria": {
"population": "2<EFBFBD>讠<EFBFBD>撠輻<EFBFBD><EFBFBD>𣂷犖<EFBFBD><EFBFBD><EFBFBD>?,
"intervention": "SGLT2<54>穃<EFBFBD><E7A983>?,
"comparison": "摰㗇<EFBFBD><EFBFBD><EFBFBD><EFBFBD>撣貉<EFBFBD><EFBFBD>滨<EFBFBD><EFBFBD>埈<EFBFBD>",
"outcome": "敹<EFBFBD><EFBFBD>蝞∠<EFBFBD>撅<EFBFBD>",
"studyDesign": "<EFBFBD>𤩺㦤撖寧<EFBFBD>霂閖<EFBFBD> (RCT)"
},
"inclusionCriteria": "<EFBFBD>望<EFBFBD><EFBFBD><EFBFBD>讃嚗朙CT<EFBFBD>𠉛弦嚗?010撟游<EFBFBD><EFBFBD>𤏸”",
"exclusionCriteria": "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>亙<EFBFBD>嚗𣬚遞餈堆<EFBFBD><EFBFBD>函<EFBFBD>摰鮋<EFBFBD>",
"status": "draft",
"screeningConfig": {
"models": ["deepseek-chat", "qwen-max"],
"temperature": 0
},
"createdAt": "2025-11-18T07:30:00.000Z",
"updatedAt": "2025-11-18T07:30:00.000Z"
}
}
瘚贝<EFBFBD><EFBFBD>賭誘:
curl -X POST http://localhost:3001/api/v1/asl/projects \
-H "Content-Type: application/json" \
-d '{
"projectName": "瘚贝<E7989A>憿寧𤌍",
"picoCriteria": {
"population": "<22>𣂷犖<F0A382B7><E78A96><EFBFBD>?,
"intervention": "<22>舐<EFBFBD>A",
"comparison": "摰㗇<E691B0><E39787>?,
"outcome": "銝餉<E98A9D>蝏枏<E89D8F>",
"studyDesign": "RCT"
},
"inclusionCriteria": "<22>望<EFBFBD><E69C9B><EFBFBD>讃",
"exclusionCriteria": "蝏潸膩"
}'
1.2 <20>瑕<EFBFBD>憿寧𤌍<E5AFA7>𡑒”
<EFBFBD>亙藁: GET /api/v1/asl/projects
霈方<EFBFBD>: <20><>閬?
霂湔<EFBFBD>: <20>瑕<EFBFBD>敶枏<E695B6><E69E8F>冽<EFBFBD><E586BD><EFBFBD><EFBFBD><EFBFBD>厩<EFBFBD><E58EA9>厰★<E58EB0>?
<EFBFBD>亥砭<EFBFBD><EFBFBD>㺭: <20>?
<EFBFBD>滚<EFBFBD>蝷箔<EFBFBD>:
{
"success": true,
"data": [
{
"id": "d67f0b9a-b035-4804-aca1-0bd672c27d81",
"userId": "asl-test-user-001",
"projectName": "SGLT2<54>穃<EFBFBD><E7A983><EFBFBD>頂蝏毺遞餈?,
"picoCriteria": {...},
"status": "screening",
"createdAt": "2025-11-18T07:30:00.000Z",
"updatedAt": "2025-11-18T07:35:00.000Z",
"_count": {
"literatures": 3,
"screeningResults": 3
}
}
]
}
瘚贝<EFBFBD><EFBFBD>賭誘:
curl http://localhost:3001/api/v1/asl/projects
1.3 <20>瑕<EFBFBD>憿寧𤌍霂行<E99C82>
<EFBFBD>亙藁: GET /api/v1/asl/projects/:projectId
霈方<EFBFBD>: <20><>閬?
霂湔<EFBFBD>: <20>瑕<EFBFBD><E79195><EFBFBD><EFBFBD>憿寧𤌍<E5AFA7><F0A48C8D>祕蝏<E7A595>縑<EFBFBD>?
頝臬<EFBFBD><EFBFBD><EFBFBD>㺭:
projectId: 憿寧𤌍ID (UUID)
<EFBFBD>滚<EFBFBD>蝷箔<EFBFBD>:
{
"success": true,
"data": {
"id": "d67f0b9a-b035-4804-aca1-0bd672c27d81",
"userId": "asl-test-user-001",
"projectName": "SGLT2<54>穃<EFBFBD><E7A983><EFBFBD>頂蝏毺遞餈?,
"picoCriteria": {
"population": "2<EFBFBD>讠<EFBFBD>撠輻<EFBFBD><EFBFBD>𣂷犖<EFBFBD><EFBFBD><EFBFBD>?,
"intervention": "SGLT2<54>穃<EFBFBD><E7A983>?,
"comparison": "摰㗇<EFBFBD><EFBFBD><EFBFBD><EFBFBD>撣貉<EFBFBD><EFBFBD>滨<EFBFBD><EFBFBD>埈<EFBFBD>",
"outcome": "敹<EFBFBD><EFBFBD>蝞∠<EFBFBD>撅<EFBFBD>",
"studyDesign": "<EFBFBD>𤩺㦤撖寧<EFBFBD>霂閖<EFBFBD> (RCT)"
},
"inclusionCriteria": "<EFBFBD>望<EFBFBD><EFBFBD><EFBFBD>讃嚗朙CT<EFBFBD>𠉛弦嚗?010撟游<EFBFBD><EFBFBD>𤏸”",
"exclusionCriteria": "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>亙<EFBFBD>嚗𣬚遞餈堆<EFBFBD><EFBFBD>函<EFBFBD>摰鮋<EFBFBD>",
"status": "screening",
"screeningConfig": {
"models": ["deepseek-chat", "qwen-max"],
"temperature": 0
},
"createdAt": "2025-11-18T07:30:00.000Z",
"updatedAt": "2025-11-18T07:35:00.000Z",
"_count": {
"literatures": 3,
"screeningResults": 3,
"screeningTasks": 1
}
}
}
瘚贝<EFBFBD><EFBFBD>賭誘:
curl http://localhost:3001/api/v1/asl/projects/{projectId}
1.4 <20>湔鰵憿寧𤌍
<EFBFBD>亙藁: PUT /api/v1/asl/projects/:projectId
霈方<EFBFBD>: <20><>閬?
霂湔<EFBFBD>: <20>湔鰵憿寧𤌍靽⊥<E99DBD>
頝臬<EFBFBD><EFBFBD><EFBFBD>㺭:
projectId: 憿寧𤌍ID (UUID)
**霂瑟<E99C82>雿?*嚗<>𣈲<EFBFBD><F0A388B2><EFBFBD><EFBFBD><EFBFBD>凒<EFBFBD>堆<EFBFBD>:
{
"projectName": "<22>湔鰵<E6B994>𡒊<EFBFBD>憿寧𤌍<E5AFA7>滨妍",
"status": "screening",
"inclusionCriteria": "<22>湔鰵<E6B994>𡒊<EFBFBD>蝥喳<E89DA5><E596B3><EFBFBD><EFBFBD>"
}
<EFBFBD>滚<EFBFBD>蝷箔<EFBFBD>:
{
"success": true,
"data": {
"id": "d67f0b9a-b035-4804-aca1-0bd672c27d81",
"projectName": "<22>湔鰵<E6B994>𡒊<EFBFBD>憿寧𤌍<E5AFA7>滨妍",
"status": "screening",
...
}
}
瘚贝<EFBFBD><EFBFBD>賭誘:
curl -X PUT http://localhost:3001/api/v1/asl/projects/{projectId} \
-H "Content-Type: application/json" \
-d '{"status": "screening"}'
1.5 <20>𣳇膄憿寧𤌍
<EFBFBD>亙藁: DELETE /api/v1/asl/projects/:projectId
霈方<EFBFBD>: <20><>閬?
霂湔<EFBFBD>: <20>𣳇膄憿寧𤌍<E5AFA7>𦠜<EFBFBD><F0A6A09C>匧<EFBFBD><E58CA7>娍㺭<E5A88D>殷<EFBFBD>蝥扯<E89DA5><E689AF>𣳇膄嚗?
頝臬<EFBFBD><EFBFBD><EFBFBD>㺭:
projectId: 憿寧𤌍ID (UUID)
<EFBFBD>滚<EFBFBD>蝷箔<EFBFBD>:
{
"success": true,
"message": "Project deleted successfully"
}
瘚贝<EFBFBD><EFBFBD>賭誘:
curl -X DELETE http://localhost:3001/api/v1/asl/projects/{projectId}
2. <20><>讃蝞∠<E89D9E> (Literatures)
2.1 撖澆<E69296><E6BE86><EFBFBD>讃嚗㇇SON<4F>澆<EFBFBD>嚗?
<EFBFBD>亙藁: POST /api/v1/asl/literatures/import
霈方<EFBFBD>: <20><>閬?
霂湔<EFBFBD>: <20>寥<EFBFBD>撖澆<E69296><E6BE86><EFBFBD>讃嚗㇇SON<4F>澆<EFBFBD>嚗?
**霂瑟<E99C82>雿?*:
{
"projectId": "d67f0b9a-b035-4804-aca1-0bd672c27d81",
"literatures": [
{
"pmid": "12345678",
"title": "Efficacy of SGLT2 inhibitors in type 2 diabetes",
"abstract": "Background: SGLT2 inhibitors are a new class...",
"authors": "Smith J, Jones A, Brown B",
"journal": "New England Journal of Medicine",
"publicationYear": 2020,
"doi": "10.1056/NEJMoa1234567"
},
{
"title": "Another study on SGLT2 inhibitors",
"abstract": "Objective: To evaluate...",
"authors": "Johnson M",
"journal": "The Lancet",
"publicationYear": 2019
}
]
}
<EFBFBD>滚<EFBFBD>蝷箔<EFBFBD>:
{
"success": true,
"data": {
"importedCount": 2
}
}
摮埈挾霂湔<EFBFBD>:
pmid: PubMed ID (<28>舫<EFBFBD>?title: <20><>讃<EFBFBD><E8AE83><EFBFBD> (敹<>‵)abstract: <20>䁅<EFBFBD> (敹<>‵)authors: 雿𡏭<E99BBF>?(<28>舫<EFBFBD>?journal: <20>笔<EFBFBD> (<28>舫<EFBFBD>?publicationYear: <20>𤏸”撟港遢 (<28>舫<EFBFBD>?doi: DOI (<28>舫<EFBFBD>?
瘚贝<EFBFBD><EFBFBD>賭誘:
curl -X POST http://localhost:3001/api/v1/asl/literatures/import \
-H "Content-Type: application/json" \
-d '{
"projectId": "{projectId}",
"literatures": [
{
"title": "瘚贝<E7989A><E8B49D><EFBFBD>讃",
"abstract": "餈蹱糓瘚贝<E7989A><E8B49D>䁅<EFBFBD>"
}
]
}'
2.2 撖澆<E69296><E6BE86><EFBFBD>讃嚗𠄌xcel<65><6C>辣嚗?
<EFBFBD>亙藁: POST /api/v1/asl/literatures/import-excel
霈方<EFBFBD>: <20><>閬?
霂湔<EFBFBD>: 隞㙎xcel<65><6C>辣<EFBFBD>寥<EFBFBD>撖澆<E69296><E6BE86><EFBFBD>讃
霂瑟<EFBFBD>蝐餃<EFBFBD>: multipart/form-data
銵典<EFBFBD>摮埈挾:
file: Excel<65><6C>辣 (.xlsx)projectId: 憿寧𤌍ID
Excel<EFBFBD>澆<EFBFBD>閬<EFBFBD><EFBFBD>:
| <EFBFBD>堒<EFBFBD>嚗<EFBFBD>葉<EFBFBD>望<EFBFBD><EFBFBD><EFBFBD>虾嚗? | 敹<EFBFBD>‵ | 霂湔<EFBFBD> |
|---|---|---|
| PMID / pmid / PMID蝻硋噡 | <EFBFBD>? | PubMed ID |
| Title / title / <20><><EFBFBD> | <EFBFBD>? | <EFBFBD><EFBFBD>讃<EFBFBD><EFBFBD><EFBFBD> |
| Abstract / abstract / <20>䁅<EFBFBD> | <EFBFBD>? | <EFBFBD>䁅<EFBFBD> |
| Authors / authors / 雿𡏭<E99BBF>? | <EFBFBD>? | 雿𡏭<EFBFBD>? |
| Journal / journal / <20>笔<EFBFBD> | <EFBFBD>? | <EFBFBD>笔<EFBFBD><EFBFBD>滨妍 |
| Year / year / 撟港遢 | <EFBFBD>? | <EFBFBD>𤏸”撟港遢 |
| DOI / doi | <EFBFBD>? | DOI |
<EFBFBD>滚<EFBFBD>蝷箔<EFBFBD>:
{
"success": true,
"data": {
"importedCount": 15,
"totalRows": 15
}
}
瘚贝<EFBFBD><EFBFBD>賭誘:
curl -X POST http://localhost:3001/api/v1/asl/literatures/import-excel \
-F "file=@literatures.xlsx" \
-F "projectId={projectId}"
2.3 <20>瑕<EFBFBD><E79195><EFBFBD>讃<EFBFBD>𡑒”
<EFBFBD>亙藁: GET /api/v1/asl/projects/:projectId/literatures
霈方<EFBFBD>: <20><>閬?
霂湔<EFBFBD>: <20>瑕<EFBFBD>憿寧𤌍<E5AFA7><F0A48C8D><EFBFBD><EFBFBD>桀<EFBFBD>銵剁<E98AB5><E58981>舀<EFBFBD><E88880><EFBFBD>△嚗?
頝臬<EFBFBD><EFBFBD><EFBFBD>㺭:
projectId: 憿寧𤌍ID (UUID)
<EFBFBD>亥砭<EFBFBD><EFBFBD>㺭:
page: 憿萇<E686BF>嚗<EFBFBD><E59A97>霈? 1嚗?-limit: 瘥誯△<E8AAAF>圈<EFBFBD>嚗<EFBFBD><E59A97>霈? 50嚗峕<E59A97>憭? 100嚗? <EFBFBD>滚<EFBFBD>蝷箔<EFBFBD>:
{
"success": true,
"data": {
"literatures": [
{
"id": "lit-uuid-001",
"projectId": "d67f0b9a-b035-4804-aca1-0bd672c27d81",
"pmid": "12345678",
"title": "Efficacy of SGLT2 inhibitors...",
"abstract": "Background: SGLT2 inhibitors...",
"authors": "Smith J, Jones A",
"journal": "NEJM",
"publicationYear": 2020,
"doi": "10.1056/NEJMoa1234567",
"createdAt": "2025-11-18T07:32:00.000Z",
"screeningResults": [
{
"conflictStatus": "none",
"finalDecision": "include"
}
]
}
],
"pagination": {
"page": 1,
"limit": 50,
"total": 3,
"totalPages": 1
}
}
}
瘚贝<EFBFBD><EFBFBD>賭誘:
curl "http://localhost:3001/api/v1/asl/projects/{projectId}/literatures?page=1&limit=50"
2.4 <20>𣳇膄<F0A3B387><E88684>讃
<EFBFBD>亙藁: DELETE /api/v1/asl/literatures/:literatureId
霈方<EFBFBD>: <20><>閬?
霂湔<EFBFBD>: <20>𣳇膄<F0A3B387><E88684><EFBFBD><EFBFBD><EFBFBD>讃嚗<E8AE83>漣<EFBFBD>𥪜<EFBFBD><F0A5AA9C>斤<EFBFBD><E696A4>厩<EFBFBD><E58EA9>頣<EFBFBD>
頝臬<EFBFBD><EFBFBD><EFBFBD>㺭:
literatureId: <20><>讃ID (UUID)
<EFBFBD>滚<EFBFBD>蝷箔<EFBFBD>:
{
"success": true,
"message": "Literature deleted successfully"
}
瘚贝<EFBFBD><EFBFBD>賭誘:
curl -X DELETE http://localhost:3001/api/v1/asl/literatures/{literatureId}
3. 蝑偦<E89D91>劐遙<E58A90>∠恣<E288A0>?(Screening Tasks)
瘜冽<EFBFBD>: 隞乩<E99A9E><E4B9A9>亙藁銝箏<E98A9D>摰䂿緵<E482BF>蠘<EFBFBD>嚗Áeek 2霈∪<E99C88>嚗?
3.1 <20>臬𢆡蝑偦<E89D91>劐遙<E58A90>?
<EFBFBD>亙藁: POST /api/v1/asl/projects/:projectId/screening/start
霈方<EFBFBD>: <20><>閬?
霂湔<EFBFBD>: <20>臬𢆡AI蝑偦<E89D91>劐遙<E58A90>∴<EFBFBD>撘<EFBFBD>郊<EFBFBD>扯<EFBFBD>嚗?
**霂瑟<E99C82>雿?*:
{
"taskType": "title_abstract",
"models": ["deepseek-chat", "qwen-max"],
"concurrency": 3
}
<EFBFBD>滚<EFBFBD>蝷箔<EFBFBD>:
{
"success": true,
"data": {
"taskId": "task-uuid-001",
"status": "running",
"totalItems": 100,
"startedAt": "2025-11-18T08:00:00.000Z"
}
}
3.2 <20>瑕<EFBFBD>蝑偦<E89D91>㕑<EFBFBD>摨?
<EFBFBD>亙藁: GET /api/v1/asl/tasks/:taskId/progress
霈方<EFBFBD>: <20><>閬?
霂湔<EFBFBD>: <20>瑕<EFBFBD>蝑偦<E89D91>劐遙<E58A90>∟<EFBFBD>摨?
<EFBFBD>滚<EFBFBD>蝷箔<EFBFBD>:
{
"success": true,
"data": {
"taskId": "task-uuid-001",
"status": "running",
"totalItems": 100,
"processedItems": 45,
"successItems": 40,
"failedItems": 2,
"conflictItems": 3,
"progress": 45,
"estimatedEndAt": "2025-11-18T08:15:00.000Z"
}
}
3.3 <20>瑕<EFBFBD>蝑偦<E89D91>厩<EFBFBD><E58EA9>?
<EFBFBD>亙藁: GET /api/v1/asl/projects/:projectId/results
霈方<EFBFBD>: <20><>閬?
霂湔<EFBFBD>: <20>瑕<EFBFBD>蝑偦<E89D91>厩<EFBFBD><E58EA9>𨅯<EFBFBD>銵?
<EFBFBD>亥砭<EFBFBD><EFBFBD>㺭:
page: 憿萇<E686BF>嚗<EFBFBD><E59A97>霈? 1嚗?-limit: 瘥誯△<E8AAAF>圈<EFBFBD>嚗<EFBFBD><E59A97>霈? 50嚗?-conflictOnly: <20>芣遬蝷箏<E89DB7>蝒<EFBFBD>★嚗<E29885><E59A97>撠𥪜<E692A0>潘<EFBFBD>finalDecision: 蝑偦<E89D91>匧<EFBFBD>蝑吔<E89D91>include / exclude / pending嚗? <EFBFBD>滚<EFBFBD>蝷箔<EFBFBD>:
{
"success": true,
"data": {
"results": [
{
"id": "result-uuid-001",
"literatureId": "lit-uuid-001",
"literature": {
"title": "...",
"abstract": "..."
},
"dsConclusion": "include",
"qwenConclusion": "include",
"conflictStatus": "none",
"finalDecision": "include",
"createdAt": "2025-11-18T08:05:00.000Z"
}
],
"pagination": {
"page": 1,
"limit": 50,
"total": 100,
"totalPages": 2
}
}
}
3.4 摰⊥瓲<E28AA5>脩<EFBFBD><E884A9><EFBFBD>讃
<EFBFBD>亙藁: POST /api/v1/asl/results/review
霈方<EFBFBD>: <20><>閬?
霂湔<EFBFBD>: <20>寥<EFBFBD>摰⊥瓲<E28AA5>脩<EFBFBD><E884A9><EFBFBD>讃
**霂瑟<E99C82>雿?*:
{
"projectId": "d67f0b9a-b035-4804-aca1-0bd672c27d81",
"reviews": [
{
"resultId": "result-uuid-001",
"finalDecision": "include"
},
{
"resultId": "result-uuid-002",
"finalDecision": "exclude",
"exclusionReason": "銝滨泵<E6BBA8>㇊ICO<43><4F><EFBFBD>銝剔<E98A9D>撟脤<E6929F><E884A4>芣鴌"
}
]
}
<EFBFBD>滚<EFBFBD>蝷箔<EFBFBD>:
{
"success": true,
"data": {
"reviewedCount": 2
}
}
4. <20>冽<EFBFBD>憭滨<E686AD>蝞∠<E89D9E> (Fulltext Screening)
**<2A>嗆<EFBFBD>?*: <20>?Day 5摰䂿緵銝哨<E98A9D>2025-11-23嚗?
4.1 <20>𥕦遣<F0A595A6>冽<EFBFBD>憭滨<E686AD>隞餃𦛚
<EFBFBD>亙藁: POST /api/v1/asl/fulltext-screening/tasks
霈方<EFBFBD>: <20><>閬?
霂湔<EFBFBD>: <20>𥕦遣<F0A595A6>冽<EFBFBD>憭滨<E686AD>隞餃𦛚嚗<F0A69B9A>笆<EFBFBD><E7AC86><EFBFBD><EFBFBD>萘<EFBFBD><E89098>朞<EFBFBD><E69C9E><EFBFBD><EFBFBD><EFBFBD>株<EFBFBD>銵?2摮埈挾霂<E68CBE>摯
**霂瑟<E99C82>雿?*:
{
"projectId": "proj-123",
"literatureIds": ["lit-001", "lit-002", "lit-003"],
"modelA": "deepseek-v3",
"modelB": "qwen-max",
"promptVersion": "v1.0.0"
}
摮埈挾霂湔<EFBFBD>:
projectId: 憿寧𤌍ID嚗<44><E59A97>憛恬<E6869B>literatureIds: 敺<><E695BA><EFBFBD>㗇<EFBFBD><E39787>埋D<E59F8B>𡑒”嚗<E2809D><E59A97>憛恬<E6869B><E681AC><EFBFBD>閬<EFBFBD>糓<EFBFBD><E7B393><EFBFBD><EFBFBD>萘<EFBFBD><E89098>朞<EFBFBD><E69C9E><EFBFBD><EFBFBD><EFBFBD>殷<EFBFBD>modelA: 璅∪<E79285>A<EFBFBD>滨妍嚗<E5A68D>虾<EFBFBD>㚁<EFBFBD>暺䁅恕: deepseek-v3嚗?-modelB: 璅∪<E79285>B<EFBFBD>滨妍嚗<E5A68D>虾<EFBFBD>㚁<EFBFBD>暺䁅恕: qwen-max嚗?-promptVersion: Prompt<70><74>𧋦嚗<F0A78BA6>虾<EFBFBD>㚁<EFBFBD>暺䁅恕: v1.0.0嚗? <EFBFBD>滚<EFBFBD>蝷箔<EFBFBD>:
{
"success": true,
"data": {
"taskId": "fst-20251123-001",
"projectId": "proj-123",
"status": "pending",
"totalCount": 3,
"modelA": "deepseek-v3",
"modelB": "qwen-max",
"createdAt": "2025-11-23T10:00:00.000Z",
"message": "隞餃𦛚<E9A483>𥕦遣<F0A595A6>𣂼<EFBFBD>嚗峕迤<E5B395>典<EFBFBD><E585B8>啣<EFBFBD><E595A3>?
}
}
銝𡁜𦛚閫<EFBFBD><EFBFBD>:
- 撉諹<EFBFBD><EFBFBD><EFBFBD><EFBFBD>㗇<EFBFBD><EFBFBD>格糓<EFBFBD>血<EFBFBD>鈭舘砲憿寧𤌍
- 璉<EFBFBD><EFBFBD>交<EFBFBD><EFBFBD>格糓<EFBFBD>行<EFBFBD><EFBFBD>舐鍂<EFBFBD><EFBFBD>DF嚗ǑpdfStatus === 'ready'`嚗?3. 隞餃𦛚<E9A483>𥕦遣<F0A595A6>𡒊<EFBFBD><F0A1928A>唾<EFBFBD><E594BE>痹<EFBFBD><E797B9>𤾸蝱撘<E89DB1>郊憭<E9838A><E686AD>
- 憒<EFBFBD><EFBFBD><EFBFBD>典<EFBFBD><EFBFBD><EFBFBD>讃PDF<EFBFBD>芸停蝏迎<EFBFBD>隞<EFBFBD><EFBFBD><EFBFBD><EFBFBD>DF撠梁貌<EFBFBD><EFBFBD><EFBFBD><EFBFBD>? <EFBFBD>躰秤<EFBFBD>滚<EFBFBD>:
{
"success": false,
"error": "<22>典<EFBFBD><E585B8><EFBFBD>讃PDF<44>芸停蝏迎<E89D8F><E8BF8E>䭾<EFBFBD>撘<EFBFBD>憪见<E686AA><E8A781><EFBFBD><EFBFBD>蝑?
}
瘚贝<EFBFBD><EFBFBD>賭誘:
curl -X POST http://localhost:3001/api/v1/asl/fulltext-screening/tasks \
-H "Content-Type: application/json" \
-d '{
"projectId": "proj-123",
"literatureIds": ["lit-001", "lit-002"],
"modelA": "deepseek-v3",
"modelB": "qwen-max"
}'
4.2 <20>瑕<EFBFBD>隞餃𦛚餈𥕦漲
<EFBFBD>亙藁: GET /api/v1/asl/fulltext-screening/tasks/:taskId
霈方<EFBFBD>: <20><>閬?
霂湔<EFBFBD>: <20>瑕<EFBFBD><E79195>冽<EFBFBD>憭滨<E686AD>隞餃𦛚<E9A483><F0A69B9A>祕蝏<E7A595><E89D8F>摨虫縑<E899AB>?
頝臬<EFBFBD><EFBFBD><EFBFBD>㺭:
taskId: 隞餃𦛚ID
<EFBFBD>滚<EFBFBD>蝷箔<EFBFBD>:
{
"success": true,
"data": {
"taskId": "fst-20251123-001",
"projectId": "proj-123",
"status": "processing",
"progress": {
"totalCount": 30,
"processedCount": 15,
"successCount": 13,
"failedCount": 1,
"degradedCount": 1,
"pendingCount": 15,
"progressPercent": 50
},
"statistics": {
"totalTokens": 450000,
"totalCost": 2.25,
"avgTimePerLit": 18500
},
"time": {
"startedAt": "2025-11-23T10:00:00.000Z",
"estimatedEndAt": "2025-11-23T10:12:30.000Z",
"elapsedSeconds": 270
},
"models": {
"modelA": "deepseek-v3",
"modelB": "qwen-max"
},
"updatedAt": "2025-11-23T10:04:30.000Z"
}
}
摮埈挾霂湔<EFBFBD>:
status: 隞餃𦛚<E9A483>嗆<EFBFBD>? -pending: 敺<><E695BA><EFBFBD>? -processing: 憭<><E686AD>銝? -completed: 撌脣<E6928C><E884A3>? -failed: 憭梯揖cancelled: 撌脣<E6928C>瘨?-successCount: <20>峕芋<E5B395>钅<EFBFBD><E99285>𣂼<EFBFBD><F0A382BC><EFBFBD><EFBFBD><EFBFBD>格㺭
degradedCount: 隞<><E99A9E>銝芣芋<E88AA3>𧢲<EFBFBD><F0A7A2B2>毺<EFBFBD><E6AFBA><EFBFBD>讃<EFBFBD>堆<EFBFBD><E5A086>滨漣璅∪<E79285>嚗?-failedCount: <20>峕芋<E5B395>钅<EFBFBD>憭梯揖<E6A2AF><E68F96><EFBFBD><EFBFBD>格㺭totalCost: 蝝航恣<E888AA>鞉𧋦嚗<F0A78BA6><E59A97>雿㵪<E99BBF><E3B5AA><EFBFBD><EFBFBD>
瘚贝<EFBFBD><EFBFBD>賭誘:
curl http://localhost:3001/api/v1/asl/fulltext-screening/tasks/fst-20251123-001
4.3 <20>瑕<EFBFBD>隞餃𦛚蝏𤘪<E89D8F>
<EFBFBD>亙藁: GET /api/v1/asl/fulltext-screening/tasks/:taskId/results
霈方<EFBFBD>: <20><>閬?
霂湔<EFBFBD>: <20>瑕<EFBFBD><E79195>冽<EFBFBD>憭滨<E686AD>隞餃𦛚<E9A483><F0A69B9A>祕蝏<E7A595><E89D8F><EFBFBD>頣<EFBFBD><E9A0A3>舀<EFBFBD>蝑偦<E89D91>匧<EFBFBD><E58CA7><EFBFBD>△
頝臬<EFBFBD><EFBFBD><EFBFBD>㺭:
taskId: 隞餃𦛚ID
<EFBFBD>亥砭<EFBFBD><EFBFBD>㺭:
filter: 蝏𤘪<E89D8F>蝑偦<E89D91>㚁<EFBFBD><E39A81>舫<EFBFBD>㚁<EFBFBD>all: <20>券<EFBFBD>嚗<EFBFBD><E59A97>霈歹<E99C88>conflict: 隞<><E99A9E>蝒<EFBFBD>★pending: 敺<>恣<EFBFBD>? -reviewed: 撌脣恣<E884A3>?-page: 憿萇<E686BF>嚗<EFBFBD><E59A97>霈? 1嚗?-pageSize: 瘥誯△<E8AAAF>圈<EFBFBD>嚗<EFBFBD><E59A97>霈? 20嚗峕<E59A97>憭? 100嚗?-sortBy: <20>鍦<EFBFBD>摮埈挾嚗<E68CBE>虾<EFBFBD>?priority,createdAt嚗?-sortOrder: <20>鍦<EFBFBD><E98DA6>孵<EFBFBD>嚗Ǒasc|desc嚗屸<EFBFBD>霈?desc`嚗? <EFBFBD>滚<EFBFBD>蝷箔<EFBFBD>:
{
"success": true,
"data": {
"taskId": "fst-20251123-001",
"total": 30,
"filtered": 3,
"results": [
{
"resultId": "fsr-001",
"literatureId": "lit-001",
"literature": {
"pmid": "12345678",
"title": "Effect of SGLT2 inhibitors on cardiovascular outcomes",
"authors": "Smith JA, et al.",
"journal": "Lancet",
"year": 2023,
"doi": "10.1016/..."
},
"modelAResult": {
"modelName": "deepseek-v3",
"status": "success",
"fields": {
"field1_source": {
"assessment": "摰峕㟲",
"evidence": "蝚砌<E89D9A>雿𡏭<E99BBF><F0A18FAD>mith JA, Lancet 2023",
"location": "蝚?憿?,
"confidence": 0.98
},
"field2_studyType": {
"assessment": "摰峕㟲",
"evidence": "憭帋葉敹<EFBFBD><EFBFBD><EFBFBD>箏笆<EFBFBD>扯<EFBFBD>撉?,
"location": "Methods蝚?憿?,
"confidence": 0.95
},
"field5_population": {
"assessment": "摰峕㟲",
"evidence": "蝥喳<EFBFBD>500靘?<3F>讠<EFBFBD>撠輻<E692A0><E8BCBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>撟湧<E6929F>58簣12撗?,
"location": "Methods蝚?憿?,
"confidence": 0.92
},
"field9_outcomes": {
"assessment": "摰峕㟲",
"evidence": "銝餉<EFBFBD>蝏枏<EFBFBD>eGFR<EFBFBD>睃<EFBFBD>嚗?15.2簣3.5 ml/min vs -8.1簣2.9 ml/min",
"location": "Results蝚?憿菔”2",
"confidence": 0.96
}
},
"overall": {
"decision": "include",
"reason": "12摮埈挾摰峕㟲嚗<EFBFBD><EFBFBD><EFBFBD>格㺭<EFBFBD>桀虾<EFBFBD>𣂼<EFBFBD>",
"dataQuality": "high",
"confidence": 0.94
},
"tokens": 15000,
"cost": 0.015
},
"modelBResult": {
"modelName": "qwen-max",
"status": "success",
"fields": { /* <20>䔶<EFBFBD>蝏𤘪<E89D8F> */ },
"overall": {
"decision": "include",
"confidence": 0.92
},
"tokens": 15200,
"cost": 0.061
},
"validation": {
"medicalLogicIssues": [],
"evidenceChainIssues": []
},
"conflict": {
"isConflict": false,
"severity": "none",
"conflictFields": [],
"overallConflict": false
},
"review": {
"finalDecision": null,
"reviewedBy": null,
"reviewedAt": null,
"reviewNotes": null,
"priority": 50
},
"processing": {
"isDegraded": false,
"degradedModel": null,
"processedAt": "2025-11-23T10:02:15.000Z"
}
},
{
"resultId": "fsr-002",
"literatureId": "lit-005",
"literature": { /* ... */ },
"modelAResult": {
"modelName": "deepseek-v3",
"status": "success",
"fields": {
"field9_outcomes": {
"assessment": "蝻箏仃",
"evidence": "<EFBFBD>芣𥁒<EFBFBD>𠰴<EFBFBD>雿𤘪㺭<EFBFBD>潘<EFBFBD>隞<EFBFBD><EFBFBD>P<EFBFBD>?,
"location": "Results蝚?憿?,
"confidence": 0.88
}
},
"overall": {
"decision": "exclude",
"reason": "<EFBFBD>喲睸摮埈挾field9<EFBFBD>唳旿銝滚<EFBFBD><EFBFBD>湛<EFBFBD><EFBFBD>䭾<EFBFBD>Meta<EFBFBD><EFBFBD><EFBFBD>",
"confidence": 0.85
}
},
"modelBResult": {
"overall": {
"decision": "include",
"reason": "<EFBFBD>賜<EFBFBD>銝餉<EFBFBD>蝏枏<EFBFBD><EFBFBD>求iscussion<EFBFBD>亙<EFBFBD>嚗䔶<EFBFBD><EFBFBD>唳旿摰峕㟲"
}
},
"conflict": {
"isConflict": true,
"severity": "high",
"conflictFields": ["field9"],
"overallConflict": true,
"details": {
"field9": {
"modelA": "蝻箏仃",
"modelB": "摰峕㟲",
"importance": "critical"
}
}
},
"review": {
"finalDecision": null,
"priority": 95
}
}
],
"pagination": {
"page": 1,
"pageSize": 20,
"totalPages": 2
},
"summary": {
"totalResults": 30,
"conflictCount": 3,
"pendingReview": 3,
"reviewed": 27,
"avgPriority": 62
}
}
}
12摮埈挾霂湔<EFBFBD>:
field1_source: <20><>讃<EFBFBD>交<EFBFBD>嚗<EFBFBD><E59A97><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>𨳍<EFBFBD><F0A8B38D>僑隞賜<E99A9E>嚗?-field2_studyType: <20>𠉛弦蝐餃<E89D90>嚗㇌CT<43><54><EFBFBD><EFBFBD>㛖<EFBFBD>蝛嗥<E89D9B>嚗?-field3_studyDesign: <20>𠉛弦霈曇恣蝏<E681A3><E89D8F>field4_diagnosis: <20>曄<EFBFBD>霂𦠜鱏<F0A6A09C><E9B18F><EFBFBD>field5_population: 鈭箇黎<E7AE87>孵<EFBFBD>嚗<EFBFBD>甅<EFBFBD>祇<EFBFBD><E7A587><EFBFBD>抅蝥輻<E89DA5>嚗争<E59A97>field6_baseline: <20>箇瑪<E7AE87>唳旿潃?-field7_intervention: 撟脤<E6929F><E884A4>芣鴌潃?-field8_control: 撖寧<E69296><E5AFA7>芣鴌field9_outcomes: 蝏枏<E89D8F><E69E8F><EFBFBD><EFBFBD>潃鐥<E6BD83>潃?<3F><><EFBFBD>喲睸field10_statistics: 蝏蠘恣<E8A098>寞<EFBFBD>field11_quality: 韐券<E99F90>霂<EFBFBD>遠嚗<E981A0><E59A97><EFBFBD>箏<EFBFBD><E7AE8F><EFBFBD>𤩅瘜閧<E7989C>嚗争<E59A97>潃?-field12_other: <20>嗡<EFBFBD>靽⊥<E99DBD>
瘚贝<EFBFBD><EFBFBD>賭誘:
# <20>瑕<EFBFBD><E79195><EFBFBD><EFBFBD>厩<EFBFBD><E58EA9>?curl "http://localhost:3001/api/v1/asl/fulltext-screening/tasks/fst-20251123-001/results"
# 隞<>繮<EFBFBD>硋<EFBFBD>蝒<EFBFBD>★
curl "http://localhost:3001/api/v1/asl/fulltext-screening/tasks/fst-20251123-001/results?filter=conflict"
# <20><>△<EFBFBD>亥砭
curl "http://localhost:3001/api/v1/asl/fulltext-screening/tasks/fst-20251123-001/results?page=2&pageSize=10"
4.4 鈭箏極摰⊥瓲<E28AA5>喟<EFBFBD>
<EFBFBD>亙藁: PUT /api/v1/asl/fulltext-screening/results/:resultId/decision
霈方<EFBFBD>: <20><>閬?
霂湔<EFBFBD>: 撖孵<E69296>銝芸<E98A9D><E88AB8><EFBFBD><EFBFBD>蝑𤤿<E89D91><F0A4A4BF>𡏭<EFBFBD>銵䔶犖撌亙恣<E4BA99>詨<EFBFBD>蝑?
頝臬<EFBFBD><EFBFBD><EFBFBD>㺭:
resultId: 蝏𤘪<E89D8F>ID
**霂瑟<E99C82>雿?*:
{
"finalDecision": "exclude",
"exclusionReason": "<22>喲睸摮埈挾field9嚗<39><E59A97>撅<EFBFBD><E69285><EFBFBD><EFBFBD>嚗㗇㺭<E39787>桐<EFBFBD>摰峕㟲",
"reviewNotes": "<22>賜<EFBFBD><E8B39C>亙<EFBFBD>鈭<EFBFBD><0.05嚗䔶<EFBFBD>蝻箏<EFBFBD><EFBFBD><EFBFBD><EFBFBD>撢崆D嚗峕<EFBFBD>瘜閧鍂鈭穽eta<EFBFBD><EFBFBD><EFBFBD>"
}
摮埈挾霂湔<EFBFBD>:
finalDecision: <20><>蝏<EFBFBD><E89D8F>蝑吔<E89D91>敹<EFBFBD>‵嚗? -include: 蝥喳<E89DA5>exclude: <20>㘾膄
exclusionReason: <20>㘾膄<E398BE>笔<EFBFBD>嚗ǑfinalDecision === 'exclude'` <20>嗅<EFBFBD>憛恬<E6869B>reviewNotes: 摰⊥瓲憭<E793B2>釣嚗<E987A3>虾<EFBFBD>㚁<EFBFBD>
<EFBFBD>滚<EFBFBD>蝷箔<EFBFBD>:
{
"success": true,
"data": {
"resultId": "fsr-002",
"finalDecision": "exclude",
"exclusionReason": "<22>喲睸摮埈挾field9嚗<39><E59A97>撅<EFBFBD><E69285><EFBFBD><EFBFBD>嚗㗇㺭<E39787>桐<EFBFBD>摰峕㟲",
"reviewedBy": "user-001",
"reviewedAt": "2025-11-23T10:30:00.000Z"
}
}
瘚贝<EFBFBD><EFBFBD>賭誘:
curl -X PUT http://localhost:3001/api/v1/asl/fulltext-screening/results/fsr-002/decision \
-H "Content-Type: application/json" \
-d '{
"finalDecision": "exclude",
"exclusionReason": "蝏枏<E89D8F><E69E8F><EFBFBD><EFBFBD><EFBFBD>唳旿銝滚<E98A9D><E6BB9A>?,
"reviewNotes": "蝻箏<E89DBB><E7AE8F><EFBFBD><EFBFBD>澆<EFBFBD><E6BE86><EFBFBD><EFBFBD>撌?
}'
4.5 撖澆枂Excel
<EFBFBD>亙藁: GET /api/v1/asl/fulltext-screening/tasks/:taskId/export
霈方<EFBFBD>: <20><>閬?
霂湔<EFBFBD>: 撖澆枂<E6BE86>冽<EFBFBD>憭滨<E686AD>蝏𤘪<E89D8F>銝慟xcel<65><6C>辣嚗?銝杵heet嚗?
頝臬<EFBFBD><EFBFBD><EFBFBD>㺭:
taskId: 隞餃𦛚ID
<EFBFBD>滚<EFBFBD>:
- Content-Type:
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet - Content-Disposition:
attachment; filename="fulltext_screening_results_{taskId}.xlsx"
Excel蝏𤘪<EFBFBD>:
Sheet 1: 蝥喳<E89DA5><E596B3><EFBFBD>讃<EFBFBD>𡑒”
| <EFBFBD>堒<EFBFBD> | 霂湔<EFBFBD> |
|---|---|
| 摨誩噡 | 1, 2, 3... |
| PMID | PubMed ID |
| <EFBFBD><EFBFBD>讃<EFBFBD>交<EFBFBD> | 蝚砌<EFBFBD>雿𡏭<EFBFBD>?撟港遢 |
| <EFBFBD><EFBFBD><EFBFBD> | <EFBFBD><EFBFBD>讃<EFBFBD><EFBFBD><EFBFBD> |
| <EFBFBD>笔<EFBFBD> | <EFBFBD>笔<EFBFBD><EFBFBD>滨妍 |
| 撟港遢 | <EFBFBD>𤏸”撟港遢 |
| DOI | DOI蝻硋噡 |
| <EFBFBD><EFBFBD>蝏<EFBFBD><EFBFBD>蝑? | 蝥喳<EFBFBD> |
| <EFBFBD>唳旿韐券<EFBFBD> | 擃?銝?雿? |
| <EFBFBD>舀<EFBFBD><EFBFBD>𡝗<EFBFBD>? | <EFBFBD>舀<EFBFBD><EFBFBD>?<3F>典<EFBFBD><E585B8>舀<EFBFBD><E88880>?銝滚虾<E6BB9A>𣂼<EFBFBD> |
| 璅∪<EFBFBD>銝<EFBFBD><EFBFBD>湔<EFBFBD>? | 銝<EFBFBD><EFBFBD>?銝滢<E98A9D><E6BBA2>? |
| <EFBFBD>臬炏鈭箏極摰⊥瓲 | <EFBFBD>?<3F>? |
Sheet 2: <20>㘾膄<E398BE><E88684>讃<EFBFBD>𡑒”
| <EFBFBD>堒<EFBFBD> | 霂湔<EFBFBD> |
|---|---|
| 摨誩噡 | 1, 2, 3... |
| PMID | PubMed ID |
| <EFBFBD><EFBFBD>讃<EFBFBD>交<EFBFBD> | 蝚砌<EFBFBD>雿𡏭<EFBFBD>?撟港遢 |
| <EFBFBD><EFBFBD><EFBFBD> | <EFBFBD><EFBFBD>讃<EFBFBD><EFBFBD><EFBFBD> |
| <EFBFBD>㘾膄<EFBFBD>笔<EFBFBD> | 霂衣<EFBFBD><EFBFBD>㘾膄<EFBFBD>笔<EFBFBD> |
| <EFBFBD>㘾膄摮埈挾 | field5, field9蝑? |
| <EFBFBD>臬炏<EFBFBD>脩<EFBFBD> | <EFBFBD>?<3F>? |
| 摰⊥瓲鈭? | <EFBFBD>冽<EFBFBD>ID |
| 摰⊥瓲<EFBFBD>園𡢿 | 2025-11-23 10:30 |
Sheet 3: PRISMA蝏蠘恣
| 蝏蠘恣憿? | <EFBFBD>圈<EFBFBD> | <EFBFBD>曉<EFBFBD>瘥? |
|---|---|---|
| <EFBFBD>冽<EFBFBD>憭滨<EFBFBD><EFBFBD>餅㺭 | 30 | 100% |
| <EFBFBD><EFBFBD>蝏<EFBFBD>熙<EFBFBD>? | 18 | 60% |
| <EFBFBD><EFBFBD>蝏<EFBFBD><EFBFBD><EFBFBD>? | 12 | 40% |
| - 蝏枏<E89D8F><E69E8F><EFBFBD><EFBFBD>蝻箏仃/銝滚<E98A9D><E6BB9A>? | 5 | 16.7% |
| - 鈭箇黎<E7AE87>孵<EFBFBD>銝滨泵 | 3 | 10% |
| - 撟脤<E6929F><E884A4>芣鴌銝齿<E98A9D>蝖? | 2 | 6.7% |
| - <20>𠉛弦韐券<E99F90><E588B8>桅<EFBFBD> | 1 | 3.3% |
| - <20>嗡<EFBFBD><E597A1>笔<EFBFBD> | 1 | 3.3% |
| 璅∪<EFBFBD><EFBFBD>脩<EFBFBD><EFBFBD>? | 3 | 10% |
| 鈭箏極摰⊥瓲<EFBFBD>? | 3 | 10% |
**<2A>鞉𧋦蝏蠘恣嚗<E681A3><E59A97>憭𠼦heet嚗?*:
| 憿寧𤌍 | <EFBFBD>? |
|---|---|
| <EFBFBD>蓉oken<EFBFBD>? | 450,000 |
| <EFBFBD>餅<EFBFBD><EFBFBD>穿<EFBFBD><EFBFBD><EFBFBD><EFBFBD> | 瞼2.25 |
| 撟喳<EFBFBD><EFBFBD>鞉𧋦/蝭? | 瞼0.075 |
| 璅∪<EFBFBD>蝏<EFBFBD><EFBFBD> | DeepSeek-V3 + Qwen-Max |
| 憭<EFBFBD><EFBFBD><EFBFBD>園𡢿 | 8<EFBFBD>?0蝘? |
瘚贝<EFBFBD><EFBFBD>賭誘:
curl -O -J http://localhost:3001/api/v1/asl/fulltext-screening/tasks/fst-20251123-001/export
<EFBFBD><EFBFBD> <20>滚<EFBFBD><E6BB9A>澆<EFBFBD>閫<EFBFBD><E996AB>
1. <20>𣂼<EFBFBD><F0A382BC>滚<EFBFBD>
<EFBFBD>澆<EFBFBD>:
{
"success": true,
"data": {
// <20>滚<EFBFBD><E6BB9A>唳旿
}
}
HTTP<EFBFBD>嗆<EFBFBD><EFBFBD><EFBFBD>:
200- <20>𣂼<EFBFBD>嚗𠃑ET<45><54>UT嚗?-201- <20>𥕦遣<F0A595A6>𣂼<EFBFBD>嚗㇊OST嚗?
2. <20>躰秤<E8BAB0>滚<EFBFBD>
<EFBFBD>澆<EFBFBD>:
{
"success": false,
"error": "<22>躰秤<E8BAB0>讛膩"
}
<EFBFBD>吔<EFBFBD>霂衣<EFBFBD><EFBFBD>躰秤嚗?
{
"error": "Missing required fields"
}
撣貉<EFBFBD>HTTP<EFBFBD>嗆<EFBFBD><EFBFBD><EFBFBD>:
400- 霂瑟<E99C82><E7919F><EFBFBD>㺭<EFBFBD>躰秤401- <20>芣<EFBFBD><E88AA3>?-403- <20>䭾<EFBFBD><E4ADBE>?-404- 韏<><E99F8F>銝滚<E98A9D><E6BB9A>?-500- <20>滚𦛚<E6BB9A>典<EFBFBD><E585B8>券<EFBFBD>霂? <EFBFBD>躰秤蝷箔<EFBFBD>:
// 400 - <20><>㺭<EFBFBD>躰秤
{
"error": "Missing required fields"
}
// 404 - 韏<><E99F8F>銝滚<E98A9D><E6BB9A>?{
"error": "Project not found"
}
// 500 - <20>滚𦛚<E6BB9A>券<EFBFBD>霂?{
"error": "Failed to create project"
}
3. <20><>△<EFBFBD>滚<EFBFBD>
<EFBFBD>澆<EFBFBD>:
{
"success": true,
"data": {
"items": [...], // <20>?literatures<65><73>esults 蝑? "pagination": {
"page": 1,
"limit": 50,
"total": 150,
"totalPages": 3
}
}
}
<EFBFBD><EFBFBD>△<EFBFBD><EFBFBD>㺭:
page: 敶枏<E695B6>憿萇<E686BF>嚗<EFBFBD><E59A97>1撘<31>憪页<E686AA>limit: 瘥誯△<E8AAAF>圈<EFBFBD>total: <20>餉扇敶閙㺭totalPages: <20>駁△<E9A781>?
<EFBFBD><EFBFBD> 霈方<E99C88><E696B9><EFBFBD><EFBFBD>
敶枏<EFBFBD><EFBFBD>嗆<EFBFBD><EFBFBD><EFBFBD>瘚贝<EFBFBD>璅∪<EFBFBD>嚗?
瘚贝<EFBFBD><EFBFBD>冽<EFBFBD>:
- <EFBFBD>冽<EFBFBD>ID:
asl-test-user-001 - <EFBFBD>桃拳:
asl-test@example.com - <EFBFBD><EFBFBD><EFBFBD>: 摰<><E691B0>霈輸䔮
摰䂿緵<EFBFBD>孵<EFBFBD>:
- 隡睃<EFBFBD>隞𥣡WT銝剛繮<EFBFBD>飜userId`
- JWT銝滚<EFBFBD><EFBFBD>冽𧒄雿輻鍂暺䁅恕瘚贝<EFBFBD><EFBFBD>冽<EFBFBD>ID
<EFBFBD>煺漣<EFBFBD>臬<EFBFBD>嚗<EFBFBD><EFBFBD>摰䂿緵嚗?
霈方<EFBFBD>瘚<EFBFBD><EFBFBD>:
- <EFBFBD>冽<EFBFBD><EFBFBD>餃<EFBFBD><EFBFBD>瑕<EFBFBD>JWT Token
- 霂瑟<EFBFBD>憭湔𡉼撣吋oken:
Authorization: Bearer {token} - 銝剝𡢿隞園<EFBFBD>霂<EFBFBD>oken撟嗆<EFBFBD><EFBFBD>飜userId`
- <EFBFBD>批<EFBFBD><EFBFBD>其蝙<EFBFBD>灼userId`<60>亥砭<E4BAA5>冽<EFBFBD><E586BD>唳旿
**銝剝𡢿隞嗥內靘?*:
// 敺<><E695BA><EFBFBD>?fastify.addHook('preHandler', async (request, reply) => {
const token = request.headers.authorization?.replace('Bearer ', '');
if (!token) {
return reply.status(401).send({ error: 'Unauthorized' });
}
const userId = await verifyJWT(token);
(request as any).userId = userId;
});
<EFBFBD>妒 API瘚贝<E7989A>
敹恍<EFBFBD><EFBFBD><EFBFBD>霂閗<EFBFBD><EFBFBD>?
瘚贝<EFBFBD><EFBFBD><EFBFBD><EFBFBD>𡅅PI:
cd AIclinicalresearch/backend
npx tsx scripts/test-asl-api.ts
瘚贝<EFBFBD>蝏𤘪<EFBFBD>:
<EFBFBD><EFBFBD> 撘<>憪𧢲<E686AA>霂?ASL 璅∪<E79285> API...
<0A><> 瘚贝<E7989A> 1/7: <20>亙熒璉<E78692><E79289>? <20>?<3F><> 瘚贝<E7989A> 2/7: <20>𥕦遣蝑偦<E89D91>厰★<E58EB0>? <20>?<3F><> 瘚贝<E7989A> 3/7: <20>瑕<EFBFBD>憿寧𤌍<E5AFA7>𡑒” <20>?<3F><> 瘚贝<E7989A> 4/7: <20>瑕<EFBFBD>憿寧𤌍霂行<E99C82> <20>?<3F><> 瘚贝<E7989A> 5/7: 撖澆<E69296><E6BE86><EFBFBD>讃 <20>?<3F><> 瘚贝<E7989A> 6/7: <20>瑕<EFBFBD><E79195><EFBFBD>讃<EFBFBD>𡑒” <20>?<3F><> 瘚贝<E7989A> 7/7: <20>湔鰵憿寧𤌍 <20>?<3F>鐥<EFBFBD><E990A5>鐥<EFBFBD><E990A5>鐥<EFBFBD><E990A5>鐥<EFBFBD><E990A5>鐥<EFBFBD><E990A5>鐥<EFBFBD><E990A5>鐥<EFBFBD><E990A5>鐥<EFBFBD><E990A5>鐥<EFBFBD><E990A5>鐥<EFBFBD><E990A5>鐥<EFBFBD><E990A5>鐥<EFBFBD><E990A5>鐥<EFBFBD><E990A5>鐥<EFBFBD><E990A5>鐥<EFBFBD><E990A5>鐥<EFBFBD><E990A5>鐥<EFBFBD><E990A5>?<3F><> <20><><EFBFBD>㗇<EFBFBD>霂閖<E99C82>朞<EFBFBD>嚗?7/7 - 100%)
<0A>鐥<EFBFBD><E990A5>鐥<EFBFBD><E990A5>鐥<EFBFBD><E990A5>鐥<EFBFBD><E990A5>鐥<EFBFBD><E990A5>鐥<EFBFBD><E990A5>鐥<EFBFBD><E990A5>鐥<EFBFBD><E990A5>鐥<EFBFBD><E990A5>鐥<EFBFBD><E990A5>鐥<EFBFBD><E990A5>鐥<EFBFBD><E990A5>鐥<EFBFBD><E990A5>鐥<EFBFBD><E990A5>鐥<EFBFBD><E990A5>鐥<EFBFBD><E990A5>鐥<EFBFBD><E990A5>?```
### Postman<61><6E><EFBFBD>
**撖澆<E69296>霂湔<E99C82>**:
1. <20>𥕦遣<F0A595A6>啁<EFBFBD>Collection: `ASL API`
2. 霈曄蔭<E69B84>臬<EFBFBD><E887AC>㗛<EFBFBD>:
- `base_url`: `http://localhost:3001`
- `api_prefix`: `/api/v1/asl`
3. 撖澆<E69296>銝𧢲䲮<F0A7A2B2>亙藁
**蝷箔<E89DB7>霂瑟<E99C82>** (Postman):
POST {{base_url}}{{api_prefix}}/projects Headers: Content-Type: application/json Body (raw JSON): { "projectName": "瘚贝<E7989A>憿寧𤌍", "picoCriteria": {...}, "inclusionCriteria": "<22>望<EFBFBD><E69C9B><EFBFBD>讃", "exclusionCriteria": "蝏潸膩" }
---
## <20><> <20>扯<EFBFBD><E689AF><EFBFBD><EFBFBD>
### <20>滚<EFBFBD><E6BB9A>園𡢿<E59C92>格<EFBFBD>
| <20>亙藁蝐餃<E89D90> | <20>格<EFBFBD><E6A0BC>滚<EFBFBD><E6BB9A>園𡢿 | 霂湔<E99C82> |
|---------|-------------|------|
| <20>蓥葵<E893A5>亥砭 | < 100ms | 憿寧𤌍霂行<E99C82><E8A18C><EFBFBD><EFBFBD><EFBFBD>株祕<E6A0AA>?|
| <20>𡑒”<F0A19192>亥砭 | < 200ms | 憿寧𤌍<E5AFA7>𡑒”<F0A19192><E2809D><EFBFBD><EFBFBD>桀<EFBFBD>銵?|
| <20>𥕦遣/<2F>湔鰵 | < 300ms | <20>𥕦遣憿寧𤌍<E5AFA7><F0A48C8D>凒<EFBFBD>圈★<E59C88>?|
| <20>寥<EFBFBD>撖澆<E69296> | < 2s | 撖澆<E69296>100蝭<30><E89DAD><EFBFBD>?|
| LLM蝑偦<E89D91>?| 4-6s/蝭?| <20>峕芋<E5B395>见僎銵𣬚<E98AB5><F0A3AC9A>?|
### 撟嗅<E6929F><E59785>賢<EFBFBD>
- **API<50>滚𦛚<E6BB9A>?*: <20>舀<EFBFBD>100+撟嗅<E6929F>霂瑟<E99C82>
- **LLM蝑偦<E89D91>?*: 撟嗅<E6929F><E59785>唬蛹3嚗<33>虾<EFBFBD>滨蔭嚗?- **<2A>唳旿摨栞<E691A8><E6A09E>交<EFBFBD>**: 17銝芾<E98A9D><E88ABE>?
---
## <20><> <20><>𧋦<EFBFBD><F0A78BA6>蟮
### v3.0 (2025-11-23)
- <20>?<3F>啣<EFBFBD><E595A3>冽<EFBFBD>憭滨<E686AD>蝞∠<E89D9E>API嚗?銝芣𦻖<E88AA3><F0A6BB96><EFBFBD>
- <20>𥕦遣隞餃𦛚<E9A483><F0A69B9A>繮<EFBFBD>𤥁<EFBFBD>摨艾<E691A8><E889BE>繮<EFBFBD>𣇉<EFBFBD><F0A38789>栶<EFBFBD><E6A0B6>犖撌亙恣<E4BA99>詻<EFBFBD><E8A9BB>紡<EFBFBD>慟xcel
- <20>?<3F>舀<EFBFBD>12摮埈挾霂衣<E99C82>霂<EFBFBD>摯
- <20>?<3F>舀<EFBFBD><E88880>峕芋<E5B395>见笆瘥𥪜<E798A5><F0A5AA9C>脩<EFBFBD>璉<EFBFBD>瘚?- <20>?摰峕㟲<E5B395><E39FB2>xcel撖澆枂<E6BE86>蠘<EFBFBD>嚗? Sheets嚗?- <20>?靚<>㟲<EFBFBD><E39FB2>﹝蝏𤘪<E89D8F>嚗?憭扳芋<E689B3>梹<EFBFBD>
### v2.1 (2025-11-21)
- <20>?<3F>啣<EFBFBD>蝏蠘恣API<50>亙藁
- <20>?<3F>湔鰵PICOS<4F>澆<EFBFBD>霂湔<E99C82>
- <20>?瘛餃<E7989B>鈭穃<E988AD><E7A983><EFBFBD>沲<EFBFBD><E6B2B2><EFBFBD>瘜?
### v2.0 (2025-11-18)
- <20>?摰䂿緵10銝芣瓲敹<E793B2>PI蝡舐<E89DA1>
- <20>?摰峕<E691B0>憿寧𤌍蝞∠<E89D9E><E288A0>蠘<EFBFBD>
- <20>?摰峕<E691B0><E5B395><EFBFBD>讃蝞∠<E89D9E><E288A0>蠘<EFBFBD>
- <20>?瘛餃<E7989B>瘚贝<E7989A><E8B49D>𡁏𧋦<F0A1818F>峕<EFBFBD>獢?- <20>?<3F><><EFBFBD>㗇𦻖<E39787><F0A6BB96><EFBFBD>霂閖<E99C82>朞<EFBFBD>
### v1.0 (2025-10-29)
- <20>嘥<EFBFBD>API霈曇恣閫<E681A3><E996AB>
- 摰帋<E691B0><E5B88B>亙藁蝏𤘪<E89D8F>
---
## <20>?<3F>𡒊賒閫<E8B392><E996AB>
### Week 2
- [ ] 摰䂿緵蝑偦<E89D91>劐遙<E58A90>,PI (3銝芣𦻖<E88AA3>?
- [ ] 摰䂿緵<E482BF>脩<EFBFBD>摰⊥瓲API (2銝芣𦻖<E88AA3>?
- [ ] 瘛餃<E7989B>SSE餈𥕦漲<F0A595A6>券<EFBFBD>?- [ ] <20><><EFBFBD>撘<EFBFBD>郊隞餃𦛚<E9A483>笔<EFBFBD>
### Week 3-4
- [ ] 瘛餃<E7989B>JWT霈方<E99C88>銝剝𡢿隞?- [ ] 摰䂿緵<E482BF><E7B7B5><EFBFBD><EFBFBD>批<EFBFBD>
- [ ] 瘛餃<E7989B>API<50>鞉<EFBFBD>
- [ ] 摰<><E691B0><EFBFBD>躰秤憭<E7A7A4><E686AD>
---
---
### 5. 蝏蠘恣API (Statistics)
#### 5.1 <20>瑕<EFBFBD>憿寧𤌍蝏蠘恣<E8A098>唳旿嚗<E697BF><E59A97><EFBFBD>毺<EFBFBD>嚗𡁜<E59A97>蝡航<E89DA1><E888AA><EFBFBD><EFBFBD>
**<2A>亙藁**: `GET /api/v1/asl/projects/:projectId/statistics`
**霈方<E99C88>**: <20><>閬?
**霂湔<E99C82>**: <20>瑕<EFBFBD>憿寧𤌍<E5AFA7><F0A48C8D><EFBFBD><EFBFBD>厩<EFBFBD>霈⊥㺭<E28AA5>殷<EFBFBD><E6AEB7>餅㺭<E9A485><E3BAAD>熙<EFBFBD>亦<EFBFBD><E4BAA6><EFBFBD><EFBFBD><EFBFBD>斤<EFBFBD><E696A4><EFBFBD><EFBFBD><EFBFBD>文<EFBFBD><E69687>惩<EFBFBD><E683A9>鞟<EFBFBD>嚗?
**頝臬<E9A09D><E887AC><EFBFBD>㺭**:
- `projectId`: 憿寧𤌍ID
**<2A>滚<EFBFBD>蝷箔<E89DB7>**:
```json
{
"success": true,
"data": {
"total": 199,
"included": 85,
"excluded": 90,
"pending": 24,
"conflict": 24,
"reviewed": 175,
"exclusionReasons": {
"P銝滚龪<E6BB9A>㵪<EFBFBD>鈭箇黎嚗?: 40,
"I銝滚龪<E6BB9A>㵪<EFBFBD>撟脤<E6929F>嚗?: 25,
"S銝滚龪<E6BB9A>㵪<EFBFBD><E3B5AA>𠉛弦霈曇恣嚗?: 15,
"<22>嗡<EFBFBD><E597A1>笔<EFBFBD>": 10
},
"includedRate": "42.7",
"excludedRate": "45.2",
"pendingRate": "12.1"
}
}
**<2A>寧<EFBFBD>**嚗?- <20>?鈭穃<E988AD><E7A983><EFBFBD><EFBFBD><EFBFBD>𡒊垢Prisma<6D>𡁜<EFBFBD><F0A1819C>亥砭嚗?銝芸僎銵峕䰻霂g<E99C82>
- <EFBFBD>?<3F>扯<EFBFBD>嚗?500ms嚗?99蝭<39><E89DAD><EFBFBD>殷<EFBFBD>
- <EFBFBD>?<3F>誩<EFBFBD>蝵𤑳<E89DB5>隡㰘<E99AA1>嚗帋<E59A97>MB蝥折<E89DA5><E68A98>袁B蝥? 瘚贝<EFBFBD><EFBFBD>賭誘:
curl http://localhost:3001/api/v1/asl/projects/55941145-bba0-4b15-bda4-f0a398d78208/statistics
*<EFBFBD><EFBFBD>﹝<EFBFBD><EFBFBD>𧋦嚗? v3.0
<EFBFBD><EFBFBD><EFBFBD>擧凒<EFBFBD>堆<EFBFBD> 2025-11-23嚗㇄ay 5: <20>冽<EFBFBD>憭滨<E686AD>API嚗?
蝏湔擪<EFBFBD><EFBFBD><EFBFBD> AI<41>箄<EFBFBD><E7AE84><EFBFBD>讃撘<E8AE83><E69298>穃𣪧<E7A983>?
<EFBFBD>祆活<EFBFBD>湔鰵嚗?- <20>?<3F>啣<EFBFBD><E595A3>冽<EFBFBD>憭滨<E686AD>蝞∠<E89D9E>API嚗?銝芣瓲敹<E793B2>𦻖<EFBFBD><F0A6BB96><EFBFBD>
- <EFBFBD>?霂衣<E99C82><E8A1A3>?2摮埈挾霂<E68CBE>摯<EFBFBD><E691AF>﹝
- <EFBFBD>?<3F>峕芋<E5B395>见笆瘥𥪜<E798A5><F0A5AA9C>脩<EFBFBD>璉<EFBFBD>瘚贝秩<E8B49D>?- <20>?Excel撖澆枂<E6BE86>澆<EFBFBD>閫<EFBFBD><E996AB>
- <EFBFBD>?摰峕㟲<E5B395><E39FB2>窈瘙?<3F>滚<EFBFBD>蝷箔<E89DB7>
<EFBFBD><EFBFBD> <20>詨<EFBFBD><E8A9A8><EFBFBD>﹝
- [<5B>唳旿摨栞挽霈⊥<E99C88>獢β(./01-<2D>唳旿摨栞挽霈?md)
- API瘚贝<EFBFBD><EFBFBD>亙<EFBFBD>
- Week 1摰峕<E691B0><E5B395>亙<EFBFBD>